diff options
Diffstat (limited to 'dhall_generated_parser')
-rw-r--r-- | dhall_generated_parser/.gitignore | 1 | ||||
-rw-r--r-- | dhall_generated_parser/Cargo.toml | 19 | ||||
-rw-r--r-- | dhall_generated_parser/build.rs | 64 | ||||
l--------- | dhall_generated_parser/src/dhall.abnf | 1 | ||||
-rw-r--r-- | dhall_generated_parser/src/dhall.pest.visibility | 141 | ||||
-rw-r--r-- | dhall_generated_parser/src/lib.rs | 10 |
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")); |