我正在尝试为(简单)XPath 解析器编写 JavaCC 脚本,但在解析各个步骤时遇到了问题。
我对语法的想法是这样的:
Step ::= ( AxisName "::" )? NodeTest ( "[" Predicate "]" )*
我已将其转换为以下脚本片段:
Step Step() :
{
Token t;
Step step;
Axis axis;
NodeTest nodeTest;
Expression predicate;
}
{
{ axis = Axis.child; }
(
t = <IDENTIFIER>
{ axis = Axis.valueOf(t.image); }
<COLON>
<COLON>
)?
t = <IDENTIFIER>
{ nodeTest = new NodeNameTest(t.image); }
{ step = new Step(axis, nodeTest); }
(
<OPEN_PAR>
predicate = Expression()
{ step.addPredicate(predicate); }
<CLOSE_PAR>
)*
{ return step; }
}
然而,这不起作用。给定以下表达式:
p
它引发以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant cz.dusanrychnovsky.generator.expression.Axis.p
at java.lang.Enum.valueOf(Unknown Source)
at cz.dusanrychnovsky.generator.expression.Axis.valueOf(Axis.java:3)
at cz.dusanrychnovsky.generator.parser.XPathParser.Step(XPathParser.java:123)
at cz.dusanrychnovsky.generator.parser.XPathParser.RelativeLocationPath(XPathParser.java:83)
at cz.dusanrychnovsky.generator.parser.XPathParser.AbsoluteLocationPath(XPathParser.java:66)
at cz.dusanrychnovsky.generator.parser.XPathParser.Start(XPathParser.java:23)
at cz.dusanrychnovsky.generator.parser.XPathParser.parse(XPathParser.java:16)
at cz.dusanrychnovsky.generator.Main.main(Main.java:24)
我相信发生的事情是解析器在输入中看到一个标识符,因此即使后面没有冒号,它也会采用轴分支,而当时解析器无法知道。
解决此问题的最佳方法是什么?我是否应该以某种方式增加 Step 规则的前瞻值,如果是这种情况,那么我该怎么做呢?还是我需要以某种方式重写规则?