From 17fd0dd6d7ab9ef9529be0b0d70fcea683c08603 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sat, 2 Mar 2019 17:12:41 +0100 Subject: Move part of parser into its own crate to limit recompilation times --- Cargo.lock | 30 +++--- Cargo.toml | 3 +- dhall/.gitignore | 1 - dhall/Cargo.toml | 3 +- dhall/build.rs | 35 +----- dhall/src/dhall.pest.visibility | 188 --------------------------------- dhall/src/generated_parser.rs | 6 -- dhall/src/lib.rs | 3 +- dhall_parser/.gitignore | 1 + dhall_parser/Cargo.toml | 13 +++ dhall_parser/build.rs | 34 ++++++ dhall_parser/src/dhall.pest.visibility | 154 +++++++++++++++++++++++++++ dhall_parser/src/lib.rs | 6 ++ 13 files changed, 228 insertions(+), 249 deletions(-) delete mode 100644 dhall/.gitignore delete mode 100644 dhall/src/dhall.pest.visibility delete mode 100644 dhall/src/generated_parser.rs create mode 100644 dhall_parser/.gitignore create mode 100644 dhall_parser/Cargo.toml create mode 100644 dhall_parser/build.rs create mode 100644 dhall_parser/src/dhall.pest.visibility create mode 100644 dhall_parser/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 2ccf37d..c2e4b55 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -134,16 +134,24 @@ dependencies = [ name = "dhall" version = "0.1.0" dependencies = [ - "abnf_to_pest 0.1.0", "bytecount 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "dhall_parser 0.1.0", "lalrpop 0.16.3 (registry+https://github.com/rust-lang/crates.io-index)", "lalrpop-util 0.16.3 (registry+https://github.com/rust-lang/crates.io-index)", "nom 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "pest 2.1.0 (git+https://github.com/pest-parser/pest)", - "pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "term-painter 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "dhall_parser" +version = "0.1.0" +dependencies = [ + "abnf_to_pest 0.1.0", + "pest 2.1.0 (git+https://github.com/pest-parser/pest)", + "pest_derive 2.1.0", +] + [[package]] name = "diff" version = "0.1.11" @@ -346,7 +354,6 @@ dependencies = [ [[package]] name = "pest" version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-trie 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -354,19 +361,17 @@ dependencies = [ [[package]] name = "pest_derive" version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "pest 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pest_generator 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pest 2.1.0", + "pest_generator 2.1.0", ] [[package]] name = "pest_generator" version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "pest 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pest_meta 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pest 2.1.0", + "pest_meta 2.1.0", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -375,10 +380,9 @@ dependencies = [ [[package]] name = "pest_meta" version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pest 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pest 2.1.0", "sha-1 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -807,10 +811,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" "checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" "checksum pest 2.1.0 (git+https://github.com/pest-parser/pest)" = "" -"checksum pest 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "54f0c72a98d8ab3c99560bfd16df8059cc10e1f9a8e83e6e3b97718dd766e9c3" -"checksum pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -"checksum pest_generator 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "63120576c4efd69615b5537d3d052257328a4ca82876771d6944424ccfd9f646" -"checksum pest_meta 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5a3492a4ed208ffc247adcdcc7ba2a95be3104f58877d0d02f0df39bf3efb5e" "checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" "checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" "checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" diff --git a/Cargo.toml b/Cargo.toml index 9aff88d..38d54f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] members = [ + "abnf_to_pest", "dhall", - "abnf_to_pest" + "dhall_parser", ] diff --git a/dhall/.gitignore b/dhall/.gitignore deleted file mode 100644 index 8a0bac6..0000000 --- a/dhall/.gitignore +++ /dev/null @@ -1 +0,0 @@ -src/dhall.pest diff --git a/dhall/Cargo.toml b/dhall/Cargo.toml index d55d04e..4c6be34 100644 --- a/dhall/Cargo.toml +++ b/dhall/Cargo.toml @@ -7,7 +7,6 @@ build = "build.rs" [build-dependencies] lalrpop = "0.16.3" -abnf_to_pest = { path = "../abnf_to_pest" } [dependencies] bytecount = "0.5.1" @@ -15,4 +14,4 @@ lalrpop-util = "0.16.3" nom = "3.0.0" term-painter = "0.2.3" pest = { git = "https://github.com/pest-parser/pest" } -pest_derive = "2.0" +dhall_parser = { path = "../dhall_parser" } diff --git a/dhall/build.rs b/dhall/build.rs index 9d5d8f7..946841a 100644 --- a/dhall/build.rs +++ b/dhall/build.rs @@ -1,39 +1,6 @@ -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<()> { +fn main() { 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(()) } diff --git a/dhall/src/dhall.pest.visibility b/dhall/src/dhall.pest.visibility deleted file mode 100644 index c09fccf..0000000 --- a/dhall/src/dhall.pest.visibility +++ /dev/null @@ -1,188 +0,0 @@ -# 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 -# quoted_label -# label -# double_quote_chunk -# double_quote_literal -# single_quote_continue -# single_quote_literal -# text_literal -# if_raw -# then_raw -# else_raw -# let_raw -# in_raw -# as_raw -# using_raw -# merge_raw -# missing_raw -# Some_raw -# constructors_raw -# Natural_fold_raw -# Natural_build_raw -# Natural_isZero_raw -# Natural_even_raw -# Natural_odd_raw -# Natural_toInteger_raw -# Natural_show_raw -# Integer_toDouble_raw -# Integer_show_raw -# Double_show_raw -# List_build_raw -# List_fold_raw -# List_length_raw -# List_head_raw -# List_last_raw -# List_indexed_raw -# List_reverse_raw -# Optional_fold_raw -# Optional_build_raw -# Text_show_raw -# Bool_raw -# Optional_raw -# None_raw -# Natural_raw -# Integer_raw -# Double_raw -# Text_raw -# List_raw -# True_raw -# False_raw -# NaN_raw -# Infinity_raw -# Type_raw -# Kind_raw -# Sort_raw -# reserved_raw -# reserved_namespaced_raw -# reserved -# reserved_namespaced -# if_ -# then_ -# else_ -# let_ -# in_ -# as_ -# using -# merge -# constructors -# Some -# Optional -# Text -# List -# equal -# or -# plus -# text_append -# list_append -# and -# times -# double_equal -# not_equal -# dot -# open_brace -# close_brace -# open_bracket -# close_bracket -# open_angle -# close_angle -# bar -# comma -# open_parens -# close_parens -# at -# colon -# import_alt -# combine -# combine_types -# prefer -# lambda -# forall -# arrow -# exponent -# double_literal -# natural_literal_raw -integer_literal -natural_literal -# identifier -# identifier_reserved_prefix -# identifier_reserved_namespaced_prefix -# missing -# path_character -# quoted_path_character -# path_component -# directory -# file -# local_raw -# local -# 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 -# bash_environment_variable -# posix_environment_variable -# posix_environment_variable_character -# import_type -# hash -# import_hashed -# import -# 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 -# selector_expression -# primitive_expression -# labels -# 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/src/generated_parser.rs b/dhall/src/generated_parser.rs deleted file mode 100644 index 452b4cd..0000000 --- a/dhall/src/generated_parser.rs +++ /dev/null @@ -1,6 +0,0 @@ -#[allow(unused_imports)] -use pest_derive::*; - -#[derive(Parser)] -#[grammar = "dhall.pest"] -pub struct DhallParser; diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs index e07071d..9dbd3a6 100644 --- a/dhall/src/lib.rs +++ b/dhall/src/lib.rs @@ -4,9 +4,8 @@ pub mod context; mod core; pub use crate::core::*; use lalrpop_util::lalrpop_mod; -lalrpop_mod!(pub grammar); // synthesized by LALRPOP +lalrpop_mod!(pub grammar); mod grammar_util; -mod generated_parser; pub mod lexer; pub mod parser; pub mod typecheck; 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 "] +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 = 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; -- cgit v1.2.3