summaryrefslogtreecommitdiff
path: root/dhall_parser/build.rs
diff options
context:
space:
mode:
authorNadrieril2019-03-02 17:12:41 +0100
committerNadrieril2019-03-02 17:13:01 +0100
commit17fd0dd6d7ab9ef9529be0b0d70fcea683c08603 (patch)
tree3d08f31e012e6399b503717028eb593abd651989 /dhall_parser/build.rs
parent92b2aa7b84ec8211a1078c75c39806d1e79cf78c (diff)
Move part of parser into its own crate to limit recompilation times
Diffstat (limited to 'dhall_parser/build.rs')
-rw-r--r--dhall_parser/build.rs34
1 files changed, 34 insertions, 0 deletions
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(())
+}