From a6f47a61f80eac99d5bb2c5a9bfdea6dfc1b3f6f Mon Sep 17 00:00:00 2001 From: thehiddenwaffle Date: Wed, 14 May 2025 10:42:49 -0400 Subject: [PATCH 1/3] Fix comparison operators in JSON Path grammar. Removed function names from `comp_op` operators rule("in", "nin", "size", "noneOf", "anyOf", "subsetOf") to align with the intended grammar restrictions. --- src/parser/grammar/json_path_9535.pest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/grammar/json_path_9535.pest b/src/parser/grammar/json_path_9535.pest index a40754e..77dcd0a 100644 --- a/src/parser/grammar/json_path_9535.pest +++ b/src/parser/grammar/json_path_9535.pest @@ -40,7 +40,7 @@ abs_singular_query = { root ~ singular_query_segments } singular_query_segments = { (S ~ (name_segment | index_segment))* } name_segment = { ("[" ~ name_selector ~ "]") | ("." ~ member_name_shorthand) } index_segment = { "[" ~ index_selector ~ "]" } -comp_op = { "==" | "!=" | "<=" | ">=" | "<" | ">" | "in" | "nin" | "size" | "noneOf" | "anyOf" | "subsetOf"} +comp_op = { "==" | "!=" | "<=" | ">=" | "<" | ">" } LCALPHA = { 'a'..'z' } From 4433fb6e79c233923c61d7709b8ca75b626353de Mon Sep 17 00:00:00 2001 From: thehiddenwaffle Date: Wed, 14 May 2025 10:48:10 -0400 Subject: [PATCH 2/3] rustfmt parser.rs --- src/parser.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/parser.rs b/src/parser.rs index 12add67..7f5adbb 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -310,7 +310,9 @@ pub fn literal(rule: Pair) -> Parsed { if num.contains('.') || num.contains('e') || num.contains('E') { Ok(Literal::Float(num.parse::().map_err(|e| (e, num))?)) } else { - Ok(Literal::Int(num.trim().parse::().map_err(|e| (e, num))?)) + Ok(Literal::Int( + num.trim().parse::().map_err(|e| (e, num))?, + )) } } From ca57610c9ff5d42f0d09622dbcbfafb9933a3386 Mon Sep 17 00:00:00 2001 From: thehiddenwaffle Date: Mon, 19 May 2025 15:11:44 -0400 Subject: [PATCH 3/3] Eliminate whitespace validation via compound-atomic($) and not-atomics(!) in pest --- rfc9535/test_suite/results.csv | 3 +-- src/parser.rs | 18 ++++++------------ src/parser/grammar/json_path_9535.pest | 4 ++-- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/rfc9535/test_suite/results.csv b/rfc9535/test_suite/results.csv index 661ecd2..dafa7b7 100644 --- a/rfc9535/test_suite/results.csv +++ b/rfc9535/test_suite/results.csv @@ -1,6 +1,4 @@ Total; Passed; Failed; Date -687; 652; 10; 2025-03-18 22:29:42 -687; 652; 5; 2025-03-18 22:34:48 687; 652; 4; 2025-03-18 22:40:55 687; 652; 2; 2025-03-18 22:41:43 687; 652; 1; 2025-03-18 22:41:53 @@ -9,3 +7,4 @@ Total; Passed; Failed; Date 687; 652; 0; 2025-03-18 22:56:39 687; 652; 0; 2025-03-18 22:57:01 687; 652; 0; 2025-05-13 21:21:59 +687; 652; 0; 2025-05-19 15:05:31 diff --git a/src/parser.rs b/src/parser.rs index 7f5adbb..6b8fa32 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -27,18 +27,12 @@ pub type Parsed = Result; /// /// Returns a variant of [crate::JsonPathParserError] if the parsing operation failed. pub fn parse_json_path(jp_str: &str) -> Parsed { - if jp_str != jp_str.trim() { - Err(JsonPathError::InvalidJsonPath( - "Leading or trailing whitespaces".to_string(), - )) - } else { - JSPathParser::parse(Rule::main, jp_str) - .map_err(Box::new)? - .next() - .ok_or(JsonPathError::UnexpectedPestOutput) - .and_then(next_down) - .and_then(jp_query) - } + JSPathParser::parse(Rule::main, jp_str) + .map_err(Box::new)? + .next() + .ok_or(JsonPathError::UnexpectedPestOutput) + .and_then(next_down) + .and_then(jp_query) } pub fn jp_query(rule: Pair) -> Parsed { diff --git a/src/parser/grammar/json_path_9535.pest b/src/parser/grammar/json_path_9535.pest index 77dcd0a..380fb59 100644 --- a/src/parser/grammar/json_path_9535.pest +++ b/src/parser/grammar/json_path_9535.pest @@ -1,6 +1,6 @@ -main = { SOI ~ jp_query ~ EOI } +main = ${ SOI ~ jp_query ~ EOI } jp_query = {root ~ segments} -segments = {(S ~ segment)*} +segments = !{(S ~ segment)*} segment = { child_segment | descendant_segment } child_segment = { bracketed_selection | ("." ~ (wildcard_selector | member_name_shorthand)) } bracketed_selection = { "[" ~ S ~ selector ~ (S ~ "," ~ S ~ selector)* ~ S ~ "]" }