我有一个ANTLR语法,形式如下:
A - B: more,things
但有时,A或B可能会丢失,例如:
- B: more, things //Skip
A - : some, other, things //Skip
C - D: yet, more, things //Read this one and following
E - F: things
我希望ANTLR跳过这些行(缺少任何一侧 - 缺少)并继续处理其余行。
基本上就是这样的东西
- B: more, things {if (!hasBothParts()) { continueAtNextLine();} };
从书中我提供了一个@rulecatch,并在我适当的Parser块之后提供了这个问题:
catch[RecognitionException re]{
reportError(re);
consumeUntil(input, NEWLINE);
input.consume();
}
编辑2 - 我尝试这样做:
while (input.LA(1) != 6){
input.consume();
}
这按预期工作。 6是我的“NEWLINE”的令牌标识符。我不知道如何进行比较,如input.LA(1)!=“\ n”或类似的东西。我知道这样做是不正确的,我只是在尝试。如果你知道正确的方法,请告诉我! :)
但这与第一个循环不同。我怀疑consumeUntil可能没有在隐藏的频道上看到NEWLINE。
NullPointer似乎是由输入快速转发到EOF引起的,因此,树语法在进行输入时命中Null .LT(1)。
然而,在这样做时,我的树语法中出现了NullPointerException:
Exception in thread "main" java.lang.NullPointerException
at org.antlr.runtime.tree.BaseTreeAdaptor.isNil(BaseTreeAdaptor.java:70)
at org.antlr.runtime.tree.CommonTreeNodeStream.nextElement(CommonTreeNodeStream.java:93)
at org.antlr.runtime.misc.LookaheadStream.fill(LookaheadStream.java:94)
at org.antlr.runtime.misc.LookaheadStream.sync(LookaheadStream.java:88)
at org.antlr.runtime.misc.LookaheadStream.LT(LookaheadStream.java:119)
....
我想要的行为是解析器跳过缺少组件的行并继续其余的行。树解析器应该不是问题,我假设?
ANTLR一书没有提及有关此问题的任何内容。
另外,我认为ANTLR Error Recovery提到了这些问题,但提供的解决方案相当复杂/丑陋,可以追溯到2004年。那么,在ANTLR中有更好的方法来做这个相对简单的事情吗? / p>
谢谢。
编辑如果这有帮助,错误是由生成的树语法中的这一行引起的:
retval.start = input.LT(1);
我认为,没有任何东西被召唤。即LT(1)返回Null,因为它跳过了。