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)
axisSpecifier
: AxisName '::'
axisSpecifier
: AxisName '::'
: primaryExpr predicate*
;
: primaryExpr predicate*
;
-orExpr : andExpr ('or' andExpr)*
+orExpr : andExpr (OR andExpr)*
-andExpr : equalityExpr ('and' equalityExpr)*
+andExpr : equalityExpr (AND equalityExpr)*
- : unaryExprNoRoot (('*'|'div'|'mod') multiplicativeExpr)?
- | '/' (('div'|'mod') multiplicativeExpr)?
+ : unaryExprNoRoot (('*'|DIV|MOD) multiplicativeExpr)?
+ | '/' ((DIV|MOD) multiplicativeExpr)?
: nCName ':' nCName
| NCName
| AxisName
: nCName ':' nCName
| NCName
| AxisName
+ | AND
+ | OR
+ | DIV
+ | MOD
nCName : NCName
| AxisName
| NodeType
nCName : NCName
| AxisName
| NodeType
+ | AND
+ | OR
+ | DIV
+ | MOD
+ AND
+ : 'and';
+ OR
+ : 'or';
+ DIV
+ : 'div';
+ MOD
+ : 'mod';
+
Literal : '"' ~'"'* '"'
| '\'' ~'\''* '\''
Literal : '"' ~'"'* '"'
| '\'' ~'\''* '\''
import com.google.common.collect.ImmutableBiMap;
import java.net.URI;
import com.google.common.collect.ImmutableBiMap;
import java.net.URI;
import javax.xml.xpath.XPathExpressionException;
import org.eclipse.jdt.annotation.Nullable;
import org.junit.Before;
import javax.xml.xpath.XPathExpressionException;
import org.eclipse.jdt.annotation.Nullable;
import org.junit.Before;
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.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;
import org.opendaylight.yangtools.yang.xpath.api.YangXPathAxis;
import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode;
YangXPathAxis.CHILD.asStep(QName.create(DEFNS, "lower-port"))), binary.getRightExpr());
}
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();
}
private YangExpr parseExpr(final String xpath) throws XPathExpressionException {
return parser.parseExpression(xpath).getRootExpr();
}