diff options
author | Nadrieril | 2019-03-02 17:12:41 +0100 |
---|---|---|
committer | Nadrieril | 2019-03-02 17:13:01 +0100 |
commit | 17fd0dd6d7ab9ef9529be0b0d70fcea683c08603 (patch) | |
tree | 3d08f31e012e6399b503717028eb593abd651989 /dhall_parser | |
parent | 92b2aa7b84ec8211a1078c75c39806d1e79cf78c (diff) |
Move part of parser into its own crate to limit recompilation times
Diffstat (limited to '')
-rw-r--r-- | dhall_parser/.gitignore (renamed from dhall/.gitignore) | 0 | ||||
-rw-r--r-- | dhall_parser/Cargo.toml | 13 | ||||
-rw-r--r-- | dhall_parser/build.rs | 34 | ||||
-rw-r--r-- | dhall_parser/src/dhall.pest.visibility | 154 | ||||
-rw-r--r-- | dhall_parser/src/lib.rs (renamed from dhall/src/generated_parser.rs) | 0 |
5 files changed, 201 insertions, 0 deletions
diff --git a/dhall/.gitignore b/dhall_parser/.gitignore index 8a0bac6..8a0bac6 100644 --- a/dhall/.gitignore +++ b/dhall_parser/.gitignore diff --git a/dhall_parser/Cargo.toml b/dhall_parser/Cargo.toml new file mode 100644 index 0000000..9993dce --- /dev/null +++ b/dhall_parser/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "dhall_parser" +version = "0.1.0" +authors = ["Nadrieril <nadrieril@users.noreply.github.com>"] +edition = "2018" +build = "build.rs" + +[build-dependencies] +abnf_to_pest = { path = "../abnf_to_pest" } + +[dependencies] +pest = { git = "https://github.com/pest-parser/pest" } +pest_derive = { version = "2.1", path = "../../pest/derive" } diff --git a/dhall_parser/build.rs b/dhall_parser/build.rs new file mode 100644 index 0000000..6001efe --- /dev/null +++ b/dhall_parser/build.rs @@ -0,0 +1,34 @@ +use std::fs::File; +use std::io::{Read,Write,BufReader,BufRead}; +use std::collections::HashMap; + +use abnf_to_pest::{PestRuleSettings, abnf_to_pest}; + +fn main() -> std::io::Result<()> { + let abnf_path = "../dhall-lang/standard/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 rule_settings: HashMap<String, PestRuleSettings> = HashMap::new(); + for line in BufReader::new(File::open(visibility_path)?).lines() { + let line = line?; + if line.len() >= 2 && &line[0..2] == "# " { + rule_settings.insert(line[2..].into(), PestRuleSettings { visible: false, ..Default::default() }); + } else { + rule_settings.insert(line, PestRuleSettings { visible: true, ..Default::default() }); + } + } + + let mut file = File::create(pest_path)?; + writeln!(&mut file, "{}", abnf_to_pest(&data, &rule_settings)?)?; + writeln!(&mut file, "final_expression = _{{ SOI ~ complete_expression ~ EOI }}")?; + + Ok(()) +} diff --git a/dhall_parser/src/dhall.pest.visibility b/dhall_parser/src/dhall.pest.visibility new file mode 100644 index 0000000..3e6ba45 --- /dev/null +++ b/dhall_parser/src/dhall.pest.visibility @@ -0,0 +1,154 @@ +end_of_line +tab +block_comment +block_comment_chunk +block_comment_continue +not_end_of_line +line_comment +whitespace_chunk +whitespace +nonempty_whitespace +ALPHA +DIGIT +HEXDIG +simple_label_first_char +simple_label_next_other_char +simple_label_next_char +simple_label_start +simple_label +quoted_label +label_raw +label +double_quote_chunk +double_quote_literal +single_quote_continue +single_quote_literal +text_literal_raw +if_raw +then_raw +else_raw +let_raw +in_raw +as_raw +using_raw +merge_raw +missing_raw +Optional_raw +Text_raw +List_raw +Infinity_raw +if_ +then +else_ +let_ +in_ +as_ +using +merge +Optional +Text +List +equal +or +plus +text_append +list_append +and +times +double_equal +not_equal +dot +bar +comma +at +colon +import_alt +open_parens +close_parens_raw +close_parens +open_brace +close_brace_raw +close_brace +open_bracket +close_bracket_raw +close_bracket +open_angle +close_angle_raw +close_angle +combine +combine_types +prefer +lambda +forall +arrow +exponent +double_literal_raw +natural_literal_raw +integer_literal_raw +identifier_raw +identifier +path_character +quoted_path_character +path_component +path +local_raw +scheme +http_raw +authority +userinfo +host +port +IP_literal +IPvFuture +IPv6address +h16 +ls32 +IPv4address +dec_octet +reg_name +pchar +query +fragment +pct_encoded +unreserved +sub_delims +http +env_raw +bash_environment_variable +posix_environment_variable +posix_environment_variable_character +import_type_raw +hash_raw +import_hashed_raw +import_raw +expression +annotated_expression +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_raw +import_expression +selector_expression_raw +primitive_expression_raw +labels_raw +record_type_or_literal +non_empty_record_type_or_literal +non_empty_record_type +non_empty_record_literal +union_type_or_literal +non_empty_union_type_or_literal +non_empty_list_literal +complete_expression diff --git a/dhall/src/generated_parser.rs b/dhall_parser/src/lib.rs index 452b4cd..452b4cd 100644 --- a/dhall/src/generated_parser.rs +++ b/dhall_parser/src/lib.rs |