diff options
author | Nadrieril | 2019-03-01 17:28:19 +0100 |
---|---|---|
committer | Nadrieril | 2019-03-01 17:28:19 +0100 |
commit | e5d9aee00b0c775df1d8e2d8819aeb80dffa73c2 (patch) | |
tree | e763a24a0d635048232e72e167ca37eafec69369 /dhall/build.rs | |
parent | 8a2b7536902831079eddd7b00291b718f5dd7186 (diff) |
Split abnf_to_pest and dhall into their own crates
Diffstat (limited to 'dhall/build.rs')
-rw-r--r-- | dhall/build.rs | 39 |
1 files changed, 39 insertions, 0 deletions
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<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(()) +} |