JavaCC - 解析XPATH表达式的一个步骤

时间:2013-06-04 09:14:24

标签: xpath javacc

我正在尝试为(简单的)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规则的前瞻值,如果是这样的话,那我该怎么做呢?或者我是否需要以某种方式重写规则?

1 个答案:

答案 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>
)?