Correct and/or/div/mod in path expressions 22/99122/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 19 Dec 2021 09:35:17 +0000 (10:35 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 20 Dec 2021 09:52:44 +0000 (10:52 +0100)
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 <robert.varga@pantheon.tech>
(cherry picked from commit 1a7e93a50d22944771fe2ea4fc18c24fcf3aae11)

yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/xpath.g4
yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java

index 4bf327cfe167085ddba680497d03ac6296d7436a..fd19d6735a1239499101983af1849a541470ce14 100644 (file)
@@ -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  :  '"' ~'"'* '"'
   |  '\'' ~'\''* '\''
index 2342cd28440f2c7d5aa83decf17cd7fdb630c0cd..ac4a5c10714adec28f3be5cc0610b7e15d5a43b2 100644 (file)
@@ -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();
     }