diff options
author | Nadrieril | 2019-08-15 15:33:53 +0200 |
---|---|---|
committer | Nadrieril | 2019-08-15 15:41:19 +0200 |
commit | e4bdadabeda8ff8dbae0376f9d1c25478b8c8821 (patch) | |
tree | f6f788553dde3db1def383bf495f38c2e39dc476 /dhall_generated_parser | |
parent | a9804009f405be7e8a89e301f280ee9d51b57e5e (diff) |
Use precedence climbing to parse expressions with operators
This speeds up parsing around 30%
Diffstat (limited to 'dhall_generated_parser')
-rw-r--r-- | dhall_generated_parser/build.rs | 31 | ||||
-rw-r--r-- | dhall_generated_parser/src/dhall.pest.visibility | 10 |
2 files changed, 36 insertions, 5 deletions
diff --git a/dhall_generated_parser/build.rs b/dhall_generated_parser/build.rs index 070aa9c..c562fad 100644 --- a/dhall_generated_parser/build.rs +++ b/dhall_generated_parser/build.rs @@ -51,6 +51,37 @@ fn main() -> std::io::Result<()> { }}" )?; + // 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 }}" diff --git a/dhall_generated_parser/src/dhall.pest.visibility b/dhall_generated_parser/src/dhall.pest.visibility index 6b4c974..6fa5e01 100644 --- a/dhall_generated_parser/src/dhall.pest.visibility +++ b/dhall_generated_parser/src/dhall.pest.visibility @@ -84,10 +84,10 @@ Location # Optional_fold # Optional_build # Text_show -# combine -# combine_types -# equivalent -# prefer +combine +combine_types +equivalent +prefer lambda forall arrow @@ -144,7 +144,7 @@ expression annotated_expression let_binding empty_list_literal -# operator_expression +operator_expression import_alt_expression or_expression plus_expression |