From d078c263b0fc003c24ba2d08355fb1a87af6b65f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 20 Dec 2018 13:35:13 -0800 Subject: [PATCH] Fix bugs in grammar JSON parsing --- Cargo.lock | 7 +++++++ Cargo.toml | 5 ++++- src/parse_grammar.rs | 23 +++++++++++++++++++---- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 410580fa..538517f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -229,6 +229,11 @@ dependencies = [ "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "indexmap" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" version = "0.4.3" @@ -539,6 +544,7 @@ name = "serde_json" version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -748,6 +754,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4743617a7464bbda3c8aec8558ff2f9429047e025771037df561d383337ff865" "checksum ignore 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "36ecfc5ad80f0b1226df948c562e2cddd446096be3f644c95106400eae8a5e01" +"checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" "checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311" diff --git a/Cargo.toml b/Cargo.toml index f3880a1c..b29bc85e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,9 @@ libloading = "0.5" rusqlite = "0.14.0" serde = "1.0" serde_derive = "1.0" -serde_json = "1.0" tree-sitter = "0.3.1" regex-syntax = "0.6.4" + +[dependencies.serde_json] +version = "1.0" +features = ["preserve_order"] diff --git a/src/parse_grammar.rs b/src/parse_grammar.rs index 27dc8b05..07396329 100644 --- a/src/parse_grammar.rs +++ b/src/parse_grammar.rs @@ -7,6 +7,11 @@ use crate::rules::Rule; #[serde(tag = "type")] #[allow(non_camel_case_types)] enum RuleJSON { + ALIAS { + content: Box, + named: bool, + value: String, + }, BLANK, STRING { value: String, @@ -26,6 +31,13 @@ enum RuleJSON { REPEAT { content: Box, }, + REPEAT1 { + content: Box, + }, + PREC_DYNAMIC { + value: i32, + content: Box, + }, PREC_LEFT { value: i32, content: Box, @@ -41,7 +53,7 @@ enum RuleJSON { TOKEN { content: Box, }, - TOKEN_IMMEDIATE { + IMMEDIATE_TOKEN { content: Box, }, } @@ -97,18 +109,21 @@ pub(crate) fn parse_grammar(input: &str) -> Result { fn parse_rule(json: RuleJSON) -> Rule { match json { + RuleJSON::ALIAS { content, value, named } => Rule::alias(parse_rule(*content), value, named), RuleJSON::BLANK => Rule::Blank, RuleJSON::STRING { value } => Rule::String(value), RuleJSON::PATTERN { value } => Rule::Pattern(value), RuleJSON::SYMBOL { name } => Rule::NamedSymbol(name), RuleJSON::CHOICE { members } => Rule::choice(members.into_iter().map(parse_rule).collect()), RuleJSON::SEQ { members } => Rule::seq(members.into_iter().map(parse_rule).collect()), - RuleJSON::REPEAT { content } => Rule::repeat(parse_rule(*content)), + RuleJSON::REPEAT1 { content } => Rule::repeat(parse_rule(*content)), + RuleJSON::REPEAT { content } => Rule::choice(vec![Rule::repeat(parse_rule(*content)), Rule::Blank]), RuleJSON::PREC { value, content } => Rule::prec(value, parse_rule(*content)), RuleJSON::PREC_LEFT { value, content } => Rule::prec_left(value, parse_rule(*content)), RuleJSON::PREC_RIGHT { value, content } => Rule::prec_right(value, parse_rule(*content)), + RuleJSON::PREC_DYNAMIC { value, content } => Rule::prec_dynamic(value, parse_rule(*content)), RuleJSON::TOKEN { content } => Rule::token(parse_rule(*content)), - RuleJSON::TOKEN_IMMEDIATE { content } => Rule::immediate_token(parse_rule(*content)), + RuleJSON::IMMEDIATE_TOKEN { content } => Rule::immediate_token(parse_rule(*content)), } } @@ -122,7 +137,7 @@ mod tests { "name": "my_lang", "rules": { "file": { - "type": "REPEAT", + "type": "REPEAT1", "content": { "type": "SYMBOL", "name": "statement"