From 17fd0dd6d7ab9ef9529be0b0d70fcea683c08603 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sat, 2 Mar 2019 17:12:41 +0100 Subject: Move part of parser into its own crate to limit recompilation times --- dhall_parser/.gitignore | 1 + dhall_parser/Cargo.toml | 13 +++ dhall_parser/build.rs | 34 ++++++++ dhall_parser/src/dhall.pest.visibility | 154 +++++++++++++++++++++++++++++++++ dhall_parser/src/lib.rs | 6 ++ 5 files changed, 208 insertions(+) create mode 100644 dhall_parser/.gitignore create mode 100644 dhall_parser/Cargo.toml create mode 100644 dhall_parser/build.rs create mode 100644 dhall_parser/src/dhall.pest.visibility create mode 100644 dhall_parser/src/lib.rs (limited to 'dhall_parser') diff --git a/dhall_parser/.gitignore b/dhall_parser/.gitignore new file mode 100644 index 0000000..8a0bac6 --- /dev/null +++ b/dhall_parser/.gitignore @@ -0,0 +1 @@ +src/dhall.pest 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 "] +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 = 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_parser/src/lib.rs b/dhall_parser/src/lib.rs new file mode 100644 index 0000000..452b4cd --- /dev/null +++ b/dhall_parser/src/lib.rs @@ -0,0 +1,6 @@ +#[allow(unused_imports)] +use pest_derive::*; + +#[derive(Parser)] +#[grammar = "dhall.pest"] +pub struct DhallParser; -- cgit v1.2.3