我正在尝试为(简单的)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规则的前瞻值,如果是这样的话,那我该怎么做呢?或者我是否需要以某种方式重写规则?
答案 0 :(得分:1)
两种选择:
( LOOKAHEAD(3)
t = <IDENTIFIER>
{ axis = Axis.valueOf(t.image); }
<COLON>
<COLON>
)?
或
( LOOKAHEAD( <IDENTIFIER> <COLON> <COLON> )
t = <IDENTIFIER>
{ axis = Axis.valueOf(t.image); }
<COLON>
<COLON>
)?