From 439f0775c814aa87fb22f92875595120a70f51d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustavo=20Gir=C3=A1ldez?= Date: Mon, 8 Jul 2024 13:30:02 -0400 Subject: [PATCH] Parse ellipsis operator and emit a customized error message --- crates/metaslang/cst/src/query/parser.rs | 29 ++++++++++++++++++- .../cargo/tests/src/query/parser_tests.rs | 5 +++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/crates/metaslang/cst/src/query/parser.rs b/crates/metaslang/cst/src/query/parser.rs index 59e312513..e87908edc 100644 --- a/crates/metaslang/cst/src/query/parser.rs +++ b/crates/metaslang/cst/src/query/parser.rs @@ -112,7 +112,7 @@ pub(super) fn parse_matcher_alt_sequence( pub(super) fn parse_sequence_item( i: &str, ) -> IResult<&str, ASTNode, VerboseError<&str>> { - alt((anchor::, parse_quantified_matcher::)).parse(i) + alt((ellipsis_token, anchor::, parse_quantified_matcher::)).parse(i) } pub(super) fn parse_quantified_matcher( @@ -335,3 +335,30 @@ fn anchor(i: &str) -> IResult<&str, ASTNode, VerboseError<&str> .map(|_| ASTNode::Anchor) .parse(i) } + +fn recognize_as_failure, F>( + mut parser: F, +) -> impl FnMut(I) -> IResult +where + F: nom::Parser, +{ + use nom::error::{make_error, ErrorKind}; + use nom::Err::Failure; + move |input: I| { + let i = input.clone(); + match parser.parse(i) { + Ok((_, _)) => Err(Failure(make_error(input, ErrorKind::Fail))), + Err(e) => Err(e), + } + } +} + +fn ellipsis_token(i: &str) -> IResult<&str, O, VerboseError<&str>> { + use nom::bytes::complete::tag; + use nom::error::context; + context( + "deprecated ellipsis operator", + recognize_as_failure(terminated(tag("..."), multispace0)), + ) + .parse(i) +} diff --git a/crates/testlang/outputs/cargo/tests/src/query/parser_tests.rs b/crates/testlang/outputs/cargo/tests/src/query/parser_tests.rs index 520d253d6..4d755d076 100644 --- a/crates/testlang/outputs/cargo/tests/src/query/parser_tests.rs +++ b/crates/testlang/outputs/cargo/tests/src/query/parser_tests.rs @@ -64,7 +64,10 @@ fn test_fails_parsing_ellipsis() { let result = Query::parse(r#"[_ ...]"#); match result { Ok(_) => panic!("Expected parse failure"), - Err(e) => assert_eq!(e.message, "Parse error:\nNoneOf at: ..]\n"), + Err(e) => assert_eq!( + e.message, + "Parse error:\nFail at: ...]\nin section 'deprecated ellipsis operator', at: ...]\n" + ), } }