summaryrefslogtreecommitdiff
path: root/dhall_syntax
diff options
context:
space:
mode:
Diffstat (limited to 'dhall_syntax')
-rw-r--r--dhall_syntax/.gitignore1
-rw-r--r--dhall_syntax/Cargo.toml4
-rw-r--r--dhall_syntax/build.rs90
l---------dhall_syntax/src/dhall.abnf1
-rw-r--r--dhall_syntax/src/dhall.pest.visibility182
-rw-r--r--dhall_syntax/src/parser.rs2
6 files changed, 279 insertions, 1 deletions
diff --git a/dhall_syntax/.gitignore b/dhall_syntax/.gitignore
new file mode 100644
index 0000000..8a0bac6
--- /dev/null
+++ b/dhall_syntax/.gitignore
@@ -0,0 +1 @@
+src/dhall.pest
diff --git a/dhall_syntax/Cargo.toml b/dhall_syntax/Cargo.toml
index d732bff..7708954 100644
--- a/dhall_syntax/Cargo.toml
+++ b/dhall_syntax/Cargo.toml
@@ -4,10 +4,14 @@ version = "0.1.0"
authors = ["NanoTech <nanotech@nanotechcorp.net>", "Nadrieril <nadrieril@users.noreply.github.com>"]
license = "BSD-2-Clause"
edition = "2018"
+build = "build.rs"
[lib]
doctest = false
+[build-dependencies]
+abnf_to_pest = { version = "0.1.1", path = "../abnf_to_pest" }
+
[dependencies]
itertools = "0.8.0"
percent-encoding = "2.1.0"
diff --git a/dhall_syntax/build.rs b/dhall_syntax/build.rs
new file mode 100644
index 0000000..d846f92
--- /dev/null
+++ b/dhall_syntax/build.rs
@@ -0,0 +1,90 @@
+use std::fs::File;
+use std::io::{BufRead, BufReader, Read, Write};
+
+use abnf_to_pest::render_rules_to_pest;
+
+fn main() -> std::io::Result<()> {
+ let abnf_path = "src/dhall.abnf";
+ let visibility_path = "src/dhall.pest.visibility";
+ let pest_path = "src/dhall.pest";
+ println!("cargo:rerun-if-changed={}", abnf_path);
+ println!("cargo:rerun-if-changed={}", visibility_path);
+
+ let mut file = File::open(abnf_path)?;
+ let mut data = Vec::new();
+ file.read_to_end(&mut data)?;
+ data.push('\n' as u8);
+
+ let mut rules = abnf_to_pest::parse_abnf(&data)?;
+ for line in BufReader::new(File::open(visibility_path)?).lines() {
+ let line = line?;
+ if line.len() >= 2 && &line[0..2] == "# " {
+ rules.get_mut(&line[2..]).map(|x| x.silent = true);
+ }
+ }
+
+ let mut file = File::create(pest_path)?;
+ writeln!(&mut file, "// AUTO-GENERATED FILE. See build.rs.")?;
+
+ // TODO: this is a cheat; properly support RFC3986 URLs instead
+ rules.remove("url_path");
+ writeln!(&mut file, "url_path = _{{ path }}")?;
+
+ rules.remove("simple_label");
+ writeln!(
+ &mut file,
+ "simple_label = {{
+ keyword ~ simple_label_next_char+
+ | !keyword ~ simple_label_first_char ~ simple_label_next_char*
+ }}"
+ )?;
+
+ rules.remove("nonreserved_label");
+ writeln!(
+ &mut file,
+ "nonreserved_label = _{{
+ !(builtin ~ !simple_label_next_char) ~ label
+ }}"
+ )?;
+
+ // Setup grammar for precedence climbing
+ rules.remove("operator_expression");
+ writeln!(&mut file, r##"
+ import_alt = {{ "?" ~ whsp1 }}
+ bool_or = {{ "||" }}
+ natural_plus = {{ "+" ~ whsp1 }}
+ text_append = {{ "++" }}
+ list_append = {{ "#" }}
+ bool_and = {{ "&&" }}
+ natural_times = {{ "*" }}
+ bool_eq = {{ "==" }}
+ bool_ne = {{ "!=" }}
+
+ operator = _{{
+ equivalent |
+ bool_ne |
+ bool_eq |
+ natural_times |
+ combine_types |
+ prefer |
+ combine |
+ bool_and |
+ list_append |
+ text_append |
+ natural_plus |
+ bool_or |
+ import_alt
+ }}
+ operator_expression = {{ application_expression ~ (whsp ~ operator ~ whsp ~ application_expression)* }}
+ "##)?;
+
+ writeln!(
+ &mut file,
+ "final_expression = ${{ SOI ~ complete_expression ~ EOI }}"
+ )?;
+
+ writeln!(&mut file)?;
+ writeln!(&mut file, "{}", render_rules_to_pest(rules).pretty(80))?;
+
+ Ok(())
+}
diff --git a/dhall_syntax/src/dhall.abnf b/dhall_syntax/src/dhall.abnf
new file mode 120000
index 0000000..ce13b8e
--- /dev/null
+++ b/dhall_syntax/src/dhall.abnf
@@ -0,0 +1 @@
+../../dhall-lang/standard/dhall.abnf \ No newline at end of file
diff --git a/dhall_syntax/src/dhall.pest.visibility b/dhall_syntax/src/dhall.pest.visibility
new file mode 100644
index 0000000..17c1edc
--- /dev/null
+++ b/dhall_syntax/src/dhall.pest.visibility
@@ -0,0 +1,182 @@
+# end_of_line
+# valid_non_ascii
+# tab
+# block_comment
+# block_comment_char
+# block_comment_continue
+# not_end_of_line
+# line_comment
+# whitespace_chunk
+# whsp
+# whsp1
+# ALPHA
+# DIGIT
+# ALPHANUM
+# HEXDIG
+# simple_label_first_char
+# simple_label_next_char
+simple_label
+# quoted_label_char
+quoted_label
+# label
+# nonreserved_label
+# any_label
+double_quote_chunk
+double_quote_escaped
+# unicode_escape
+double_quote_char
+double_quote_literal
+single_quote_continue
+escaped_quote_pair
+escaped_interpolation
+single_quote_char
+single_quote_literal
+# interpolation
+# text_literal
+if_
+# then
+# else_
+# let_
+# in_
+# as_
+# using
+merge
+missing
+# Infinity
+NaN
+Some_
+toMap
+assert
+# keyword
+builtin
+# Optional
+Text
+# List
+Location
+# Bool
+# True
+# False
+# None_
+# Natural
+# Integer
+# Double
+# Type
+# Kind
+# Sort
+# Natural_fold
+# Natural_build
+# Natural_isZero
+# Natural_even
+# Natural_odd
+# Natural_toInteger
+# Natural_show
+# Integer_toDouble
+# Integer_show
+# Natural_subtract
+# Double_show
+# List_build
+# List_fold
+# List_length
+# List_head
+# List_last
+# List_indexed
+# List_reverse
+# Optional_fold
+# Optional_build
+# Text_show
+combine
+combine_types
+equivalent
+prefer
+lambda
+forall
+arrow
+# exponent
+numeric_double_literal
+minus_infinity_literal
+plus_infinity_literal
+# double_literal
+natural_literal
+integer_literal
+identifier
+variable
+# path_character
+# quoted_path_character
+unquoted_path_component
+quoted_path_component
+# path_component
+path
+local
+parent_path
+here_path
+home_path
+absolute_path
+scheme
+http_raw
+authority
+# userinfo
+# host
+# port
+# IP_literal
+# IPvFuture
+# IPv6address
+# h16
+# ls32
+# IPv4address
+# dec_octet
+# domain
+# domainlabel
+# pchar
+query
+# pct_encoded
+# unreserved
+# sub_delims
+http
+env
+bash_environment_variable
+posix_environment_variable
+posix_environment_variable_character
+# import_type
+hash
+import_hashed
+import
+expression
+# annotated_expression
+let_binding
+empty_list_literal
+operator_expression
+import_alt_expression
+or_expression
+plus_expression
+text_append_expression
+list_append_expression
+and_expression
+combine_expression
+prefer_expression
+combine_types_expression
+times_expression
+equal_expression
+not_equal_expression
+equivalent_expression
+application_expression
+first_application_expression
+# import_expression
+selector_expression
+selector
+labels
+# type_selector
+primitive_expression
+# record_type_or_literal
+empty_record_literal
+empty_record_type
+non_empty_record_type_or_literal
+non_empty_record_type
+record_type_entry
+non_empty_record_literal
+record_literal_entry
+union_type
+empty_union_type
+# non_empty_union_type
+union_type_entry
+non_empty_list_literal
+# complete_expression
diff --git a/dhall_syntax/src/parser.rs b/dhall_syntax/src/parser.rs
index 3ea766f..044d3f1 100644
--- a/dhall_syntax/src/parser.rs
+++ b/dhall_syntax/src/parser.rs
@@ -146,7 +146,7 @@ lazy_static::lazy_static! {
}
#[derive(Parser)]
-#[grammar = "../../dhall_generated_parser/src/dhall.pest"]
+#[grammar = "dhall.pest"]
struct DhallParser;
#[pest_consume::parser(parser = DhallParser, rule = Rule)]