summaryrefslogtreecommitdiff
path: root/dhall_generated_parser
diff options
context:
space:
mode:
Diffstat (limited to 'dhall_generated_parser')
-rw-r--r--dhall_generated_parser/.gitignore1
-rw-r--r--dhall_generated_parser/Cargo.toml19
-rw-r--r--dhall_generated_parser/build.rs64
l---------dhall_generated_parser/src/dhall.abnf1
-rw-r--r--dhall_generated_parser/src/dhall.pest.visibility141
-rw-r--r--dhall_generated_parser/src/lib.rs10
6 files changed, 236 insertions, 0 deletions
diff --git a/dhall_generated_parser/.gitignore b/dhall_generated_parser/.gitignore
new file mode 100644
index 0000000..8a0bac6
--- /dev/null
+++ b/dhall_generated_parser/.gitignore
@@ -0,0 +1 @@
+src/dhall.pest
diff --git a/dhall_generated_parser/Cargo.toml b/dhall_generated_parser/Cargo.toml
new file mode 100644
index 0000000..9e4ae49
--- /dev/null
+++ b/dhall_generated_parser/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "dhall_generated_parser"
+version = "0.1.0"
+authors = ["Nadrieril <nadrieril@users.noreply.github.com>"]
+license = "BSD-2-Clause"
+edition = "2018"
+build = "build.rs"
+
+[lib]
+test = false
+doctest = false
+
+[build-dependencies]
+abnf_to_pest = { path = "../abnf_to_pest" }
+pest_generator = "2.1"
+quote = "0.6.11"
+
+[dependencies]
+pest = { git = "https://github.com/pest-parser/pest" }
diff --git a/dhall_generated_parser/build.rs b/dhall_generated_parser/build.rs
new file mode 100644
index 0000000..615a55c
--- /dev/null
+++ b/dhall_generated_parser/build.rs
@@ -0,0 +1,64 @@
+use std::env;
+use std::fs::File;
+use std::io::{BufRead, BufReader, Read, Write};
+use std::path::Path;
+
+use abnf_to_pest::render_rules_to_pest;
+
+fn main() -> std::io::Result<()> {
+ // TODO: upstream changes to grammar
+ // let abnf_path = "../dhall-lang/standard/dhall.abnf";
+ 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);
+ }
+ }
+ rules.remove("simple_label");
+
+ let mut file = File::create(pest_path)?;
+ writeln!(&mut file, "// AUTO-GENERATED FILE. See build.rs.")?;
+ writeln!(&mut file, "{}", render_rules_to_pest(rules).pretty(80))?;
+
+ writeln!(&mut file)?;
+ writeln!(
+ &mut file,
+ "simple_label = {{
+ keyword ~ simple_label_next_char+
+ | !keyword ~ simple_label_first_char ~ simple_label_next_char*
+ }}"
+ )?;
+ writeln!(
+ &mut file,
+ "final_expression = ${{ SOI ~ complete_expression ~ EOI }}"
+ )?;
+
+ // Generate pest parser manually to avoid spurious recompilations
+ let derived = {
+ let pest_path = "dhall.pest";
+ let pest = quote::quote! {
+ #[grammar = #pest_path]
+ pub struct DhallParser;
+ };
+ pest_generator::derive_parser(pest, false)
+ };
+
+ let out_dir = env::var("OUT_DIR").unwrap();
+ let grammar_path = Path::new(&out_dir).join("grammar.rs");
+ let mut file = File::create(grammar_path)?;
+ writeln!(file, "pub struct DhallParser;\n{}", derived,)?;
+
+ Ok(())
+}
diff --git a/dhall_generated_parser/src/dhall.abnf b/dhall_generated_parser/src/dhall.abnf
new file mode 120000
index 0000000..ce13b8e
--- /dev/null
+++ b/dhall_generated_parser/src/dhall.abnf
@@ -0,0 +1 @@
+../../dhall-lang/standard/dhall.abnf \ No newline at end of file
diff --git a/dhall_generated_parser/src/dhall.pest.visibility b/dhall_generated_parser/src/dhall.pest.visibility
new file mode 100644
index 0000000..f881a50
--- /dev/null
+++ b/dhall_generated_parser/src/dhall.pest.visibility
@@ -0,0 +1,141 @@
+# end_of_line
+# tab
+# block_comment
+# block_comment_chunk
+# block_comment_continue
+# not_end_of_line
+# line_comment
+# whitespace_chunk
+# whsp
+# whsp1
+# ALPHA
+# DIGIT
+# 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
+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
+# keyword
+Optional
+Text
+List
+# combine
+# combine_types
+# prefer
+lambda
+forall
+arrow
+# exponent
+numeric_double_literal
+minus_infinity_literal
+plus_infinity_literal
+double_literal
+natural_literal
+integer_literal
+identifier
+# 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
+# reg_name
+# 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_collection
+non_empty_optional
+# 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
+application_expression
+# import_expression
+selector_expression
+selector
+labels
+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_or_literal
+empty_union_type
+non_empty_union_type_or_literal
+union_literal_variant_value
+union_type_entry
+union_type_or_literal_variant_type
+non_empty_list_literal
+# complete_expression
diff --git a/dhall_generated_parser/src/lib.rs b/dhall_generated_parser/src/lib.rs
new file mode 100644
index 0000000..97a0d54
--- /dev/null
+++ b/dhall_generated_parser/src/lib.rs
@@ -0,0 +1,10 @@
+// This crate only contains the grammar-generated parser. The rest of the
+// parser is in dhall_core. This separation is because compiling the
+// grammar-generated parser is extremely slow.
+// See the https://pest.rs documentation for details on what this crate contains.
+// The pest file is auto-generated and is located at ./dhall.pest.
+// It is generated from grammar.abnf in a rather straightforward manner. Some
+// additional overrides are done in ../build.rs.
+// The lines that are commented out in ./dhall.pest.visibility are marked as
+// silent (see pest docs for what that means) in the generated pest file.
+include!(concat!(env!("OUT_DIR"), "/grammar.rs"));