【问题标题】:JavaCC - parse a step of an XPATH expressionJavaCC - 解析 XPATH 表达式的一个步骤
【发布时间】:2013-06-05 07:51:57
【问题描述】:

我正在尝试为(简单)XPath 解析器编写 JavaCC 脚本,但在解析各个步骤时遇到了问题。

我对语法的想法是这样的:

Step ::= ( AxisName "::" )? NodeTest ( "[" Predicate "]" )*

我已经把它转换成下面的脚本sn-p:

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 规则的前瞻值,如果是这种情况,那么我该怎么做呢?还是我需要以某种方式重写规则?

【问题讨论】:

    标签: xpath javacc


    【解决方案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>
    )?
    

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多