From daab64a496b958334cfbaaedd0f1f537df7bb938 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 19 Dec 2021 10:35:17 +0100 Subject: [PATCH] Correct and/or/div/mod in path expressions The grammar is creating implicit lexer tokens for and/or/div/mod, which take precedence overt NCName. Make sure we define these tokens explicitly and allow them to be an alternative wherever NCName is valid. JIRA: YANGTOOLS-1387 Change-Id: I4f4f26fe0f8bc27614b769b465a76696a49ad7c2 Signed-off-by: Robert Varga (cherry picked from commit 1a7e93a50d22944771fe2ea4fc18c24fcf3aae11) --- .../yangtools/yang/xpath/antlr/xpath.g4 | 27 +++++++++++++++---- .../yang/xpath/impl/XPathParserTest.java | 17 ++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/xpath.g4 b/yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/xpath.g4 index 4bf327cfe1..fd19d6735a 100644 --- a/yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/xpath.g4 +++ b/yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/xpath.g4 @@ -44,7 +44,7 @@ step : axisSpecifier nodeTest predicate* axisSpecifier : AxisName '::' - | '@'? + | AT? ; nodeTest: nameTest @@ -90,10 +90,10 @@ filterExpr : primaryExpr predicate* ; -orExpr : andExpr ('or' andExpr)* +orExpr : andExpr (OR andExpr)* ; -andExpr : equalityExpr ('and' equalityExpr)* +andExpr : equalityExpr (AND equalityExpr)* ; equalityExpr @@ -109,8 +109,8 @@ additiveExpr ; multiplicativeExpr - : unaryExprNoRoot (('*'|'div'|'mod') multiplicativeExpr)? - | '/' (('div'|'mod') multiplicativeExpr)? + : unaryExprNoRoot (('*'|DIV|MOD) multiplicativeExpr)? + | '/' ((DIV|MOD) multiplicativeExpr)? ; unaryExprNoRoot @@ -125,6 +125,10 @@ functionName : nCName ':' nCName | NCName | AxisName + | AND + | OR + | DIV + | MOD ; variableReference @@ -139,6 +143,10 @@ nameTest: '*' nCName : NCName | AxisName | NodeType + | AND + | OR + | DIV + | MOD ; NodeType: 'comment' @@ -215,6 +223,15 @@ AxisName: 'ancestor' : '\''; QUOT : '"'; + AND + : 'and'; + OR + : 'or'; + DIV + : 'div'; + MOD + : 'mod'; + Literal : '"' ~'"'* '"' | '\'' ~'\''* '\'' diff --git a/yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java b/yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java index 2342cd2844..ac4a5c1071 100644 --- a/yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java +++ b/yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java @@ -13,6 +13,7 @@ import static org.junit.Assert.assertEquals; import com.google.common.collect.ImmutableBiMap; import java.net.URI; +import java.util.List; import javax.xml.xpath.XPathExpressionException; import org.eclipse.jdt.annotation.Nullable; import org.junit.Before; @@ -26,6 +27,7 @@ import org.opendaylight.yangtools.yang.xpath.api.YangBinaryOperator; import org.opendaylight.yangtools.yang.xpath.api.YangBooleanConstantExpr; import org.opendaylight.yangtools.yang.xpath.api.YangExpr; import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath; +import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath.Relative; import org.opendaylight.yangtools.yang.xpath.api.YangXPathAxis; import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode; @@ -121,6 +123,21 @@ public class XPathParserTest { YangXPathAxis.CHILD.asStep(QName.create(DEFNS, "lower-port"))), binary.getRightExpr()); } + @Test + public void testAnd() throws XPathExpressionException { + assertRelative("and"); + assertRelative("or"); + assertRelative("div"); + assertRelative("mod"); + assertRelative("andor"); + } + + private void assertRelative(final String str) throws XPathExpressionException { + final YangExpr expr = parseExpr(str); + assertThat(expr, isA(Relative.class)); + assertEquals(List.of(YangXPathAxis.CHILD.asStep(QName.create(DEFNS, str))), ((Relative) expr).getSteps()); + } + private YangExpr parseExpr(final String xpath) throws XPathExpressionException { return parser.parseExpression(xpath).getRootExpr(); } -- 2.36.6