summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--dhall/.gitignore (renamed from dhall_syntax/.gitignore)0
-rw-r--r--dhall/Cargo.toml2
-rw-r--r--dhall/build.rs98
l---------dhall/src/dhall.abnf (renamed from dhall_syntax/src/dhall.abnf)0
-rw-r--r--dhall/src/dhall.pest.visibility (renamed from dhall_syntax/src/dhall.pest.visibility)0
-rw-r--r--dhall/src/syntax/parser.rs2
-rw-r--r--dhall_syntax/Cargo.toml1
-rw-r--r--dhall_syntax/build.rs90
-rw-r--r--dhall_syntax/src/lib.rs1
10 files changed, 101 insertions, 94 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 204d914..555577a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -73,6 +73,7 @@ dependencies = [
name = "dhall"
version = "0.1.0"
dependencies = [
+ "abnf_to_pest 0.1.1",
"bytecount 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
"hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/dhall_syntax/.gitignore b/dhall/.gitignore
index 8a0bac6..8a0bac6 100644
--- a/dhall_syntax/.gitignore
+++ b/dhall/.gitignore
diff --git a/dhall/Cargo.toml b/dhall/Cargo.toml
index 2a2a3fe..962b466 100644
--- a/dhall/Cargo.toml
+++ b/dhall/Cargo.toml
@@ -27,4 +27,6 @@ pretty_assertions = "0.6.1"
[build-dependencies]
walkdir = "2"
+abnf_to_pest = { version = "0.1.1", path = "../abnf_to_pest" }
+
diff --git a/dhall/build.rs b/dhall/build.rs
index a0106de..50f423e 100644
--- a/dhall/build.rs
+++ b/dhall/build.rs
@@ -1,10 +1,12 @@
use std::env;
use std::ffi::OsString;
use std::fs::File;
-use std::io::Write;
+use std::io::{BufRead, BufReader, Read, Write};
use std::path::{Path, PathBuf};
use walkdir::WalkDir;
+use abnf_to_pest::render_rules_to_pest;
+
#[derive(Debug, Clone, Copy)]
enum FileType {
Text,
@@ -100,7 +102,7 @@ fn make_test_module(
Ok(())
}
-fn main() -> std::io::Result<()> {
+fn generate_tests() -> std::io::Result<()> {
// Tries to detect when the submodule gets updated.
// To force regeneration of the test list, just `touch dhall-lang/.git`
println!("cargo:rerun-if-changed=../dhall-lang/.git");
@@ -404,3 +406,95 @@ fn main() -> std::io::Result<()> {
Ok(())
}
+
+fn convert_abnf_to_pest() -> std::io::Result<()> {
+ let abnf_path = "src/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 rules = abnf_to_pest::parse_abnf(&data)?;
+ for line in BufReader::new(File::open(visibility_path)?).lines() {
+ let line = line?;
+ if line.len() >= 2 && &line[0..2] == "# " {
+ rules.get_mut(&line[2..]).map(|x| x.silent = true);
+ }
+ }
+
+ let mut file = File::create(pest_path)?;
+ writeln!(&mut file, "// AUTO-GENERATED FILE. See build.rs.")?;
+
+ // TODO: this is a cheat; properly support RFC3986 URLs instead
+ rules.remove("url_path");
+ writeln!(&mut file, "url_path = _{{ path }}")?;
+
+ rules.remove("simple_label");
+ writeln!(
+ &mut file,
+ "simple_label = {{
+ keyword ~ simple_label_next_char+
+ | !keyword ~ simple_label_first_char ~ simple_label_next_char*
+ }}"
+ )?;
+
+ rules.remove("nonreserved_label");
+ writeln!(
+ &mut file,
+ "nonreserved_label = _{{
+ !(builtin ~ !simple_label_next_char) ~ label
+ }}"
+ )?;
+
+ // Setup grammar for precedence climbing
+ rules.remove("operator_expression");
+ writeln!(&mut file, r##"
+ import_alt = {{ "?" ~ whsp1 }}
+ bool_or = {{ "||" }}
+ natural_plus = {{ "+" ~ whsp1 }}
+ text_append = {{ "++" }}
+ list_append = {{ "#" }}
+ bool_and = {{ "&&" }}
+ natural_times = {{ "*" }}
+ bool_eq = {{ "==" }}
+ bool_ne = {{ "!=" }}
+
+ operator = _{{
+ equivalent |
+ bool_ne |
+ bool_eq |
+ natural_times |
+ combine_types |
+ prefer |
+ combine |
+ bool_and |
+ list_append |
+ text_append |
+ natural_plus |
+ bool_or |
+ import_alt
+ }}
+ operator_expression = {{ application_expression ~ (whsp ~ operator ~ whsp ~ application_expression)* }}
+ "##)?;
+
+ writeln!(
+ &mut file,
+ "final_expression = ${{ SOI ~ complete_expression ~ EOI }}"
+ )?;
+
+ writeln!(&mut file)?;
+ writeln!(&mut file, "{}", render_rules_to_pest(rules).pretty(80))?;
+
+ Ok(())
+}
+
+fn main() -> std::io::Result<()> {
+ convert_abnf_to_pest()?;
+ generate_tests()?;
+ Ok(())
+}
diff --git a/dhall_syntax/src/dhall.abnf b/dhall/src/dhall.abnf
index ce13b8e..ce13b8e 120000
--- a/dhall_syntax/src/dhall.abnf
+++ b/dhall/src/dhall.abnf
diff --git a/dhall_syntax/src/dhall.pest.visibility b/dhall/src/dhall.pest.visibility
index 17c1edc..17c1edc 100644
--- a/dhall_syntax/src/dhall.pest.visibility
+++ b/dhall/src/dhall.pest.visibility
diff --git a/dhall/src/syntax/parser.rs b/dhall/src/syntax/parser.rs
index 2f589fe..9aa9403 100644
--- a/dhall/src/syntax/parser.rs
+++ b/dhall/src/syntax/parser.rs
@@ -146,7 +146,7 @@ lazy_static::lazy_static! {
}
#[derive(Parser)]
-#[grammar = "../../dhall_syntax/src/dhall.pest"]
+#[grammar = "dhall.pest"]
struct DhallParser;
#[pest_consume::parser(parser = DhallParser, rule = Rule)]
diff --git a/dhall_syntax/Cargo.toml b/dhall_syntax/Cargo.toml
index 7708954..e4dd533 100644
--- a/dhall_syntax/Cargo.toml
+++ b/dhall_syntax/Cargo.toml
@@ -4,7 +4,6 @@ version = "0.1.0"
authors = ["NanoTech <nanotech@nanotechcorp.net>", "Nadrieril <nadrieril@users.noreply.github.com>"]
license = "BSD-2-Clause"
edition = "2018"
-build = "build.rs"
[lib]
doctest = false
diff --git a/dhall_syntax/build.rs b/dhall_syntax/build.rs
deleted file mode 100644
index d846f92..0000000
--- a/dhall_syntax/build.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-use std::fs::File;
-use std::io::{BufRead, BufReader, Read, Write};
-
-use abnf_to_pest::render_rules_to_pest;
-
-fn main() -> std::io::Result<()> {
- let abnf_path = "src/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 rules = abnf_to_pest::parse_abnf(&data)?;
- for line in BufReader::new(File::open(visibility_path)?).lines() {
- let line = line?;
- if line.len() >= 2 && &line[0..2] == "# " {
- rules.get_mut(&line[2..]).map(|x| x.silent = true);
- }
- }
-
- let mut file = File::create(pest_path)?;
- writeln!(&mut file, "// AUTO-GENERATED FILE. See build.rs.")?;
-
- // TODO: this is a cheat; properly support RFC3986 URLs instead
- rules.remove("url_path");
- writeln!(&mut file, "url_path = _{{ path }}")?;
-
- rules.remove("simple_label");
- writeln!(
- &mut file,
- "simple_label = {{
- keyword ~ simple_label_next_char+
- | !keyword ~ simple_label_first_char ~ simple_label_next_char*
- }}"
- )?;
-
- rules.remove("nonreserved_label");
- writeln!(
- &mut file,
- "nonreserved_label = _{{
- !(builtin ~ !simple_label_next_char) ~ label
- }}"
- )?;
-
- // Setup grammar for precedence climbing
- rules.remove("operator_expression");
- writeln!(&mut file, r##"
- import_alt = {{ "?" ~ whsp1 }}
- bool_or = {{ "||" }}
- natural_plus = {{ "+" ~ whsp1 }}
- text_append = {{ "++" }}
- list_append = {{ "#" }}
- bool_and = {{ "&&" }}
- natural_times = {{ "*" }}
- bool_eq = {{ "==" }}
- bool_ne = {{ "!=" }}
-
- operator = _{{
- equivalent |
- bool_ne |
- bool_eq |
- natural_times |
- combine_types |
- prefer |
- combine |
- bool_and |
- list_append |
- text_append |
- natural_plus |
- bool_or |
- import_alt
- }}
- operator_expression = {{ application_expression ~ (whsp ~ operator ~ whsp ~ application_expression)* }}
- "##)?;
-
- writeln!(
- &mut file,
- "final_expression = ${{ SOI ~ complete_expression ~ EOI }}"
- )?;
-
- writeln!(&mut file)?;
- writeln!(&mut file, "{}", render_rules_to_pest(rules).pretty(80))?;
-
- Ok(())
-}
diff --git a/dhall_syntax/src/lib.rs b/dhall_syntax/src/lib.rs
index e69de29..8b13789 100644
--- a/dhall_syntax/src/lib.rs
+++ b/dhall_syntax/src/lib.rs
@@ -0,0 +1 @@
+