summaryrefslogtreecommitdiff
path: root/dhall_parser
diff options
context:
space:
mode:
Diffstat (limited to 'dhall_parser')
-rw-r--r--dhall_parser/.gitignore1
-rw-r--r--dhall_parser/Cargo.toml13
-rw-r--r--dhall_parser/build.rs34
-rw-r--r--dhall_parser/src/dhall.pest.visibility154
-rw-r--r--dhall_parser/src/lib.rs6
5 files changed, 208 insertions, 0 deletions
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 <nadrieril@users.noreply.github.com>"]
+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<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(())
+}
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;