From e5d9aee00b0c775df1d8e2d8819aeb80dffa73c2 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Fri, 1 Mar 2019 17:28:19 +0100 Subject: Split abnf_to_pest and dhall into their own crates --- dhall/build.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dhall/build.rs (limited to 'dhall/build.rs') diff --git a/dhall/build.rs b/dhall/build.rs new file mode 100644 index 0000000..9d5d8f7 --- /dev/null +++ b/dhall/build.rs @@ -0,0 +1,39 @@ +use std::fs::File; +use std::io::{Read,Write,BufReader,BufRead}; +use std::collections::HashMap; + +use lalrpop; +use abnf_to_pest::{PestRuleSettings, abnf_to_pest}; + +fn main() -> std::io::Result<()> { + lalrpop::process_root().unwrap(); + println!("cargo:rerun-if-changed=src/grammar.lalrpop"); + + + 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(()) +} -- cgit v1.2.3