ANTLR错误恢复导致Java中出现NullPointerException

时间:2012-08-15 00:48:01

标签: java parsing error-handling antlr grammar

我有一个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,因为它跳过了。

0 个答案:

没有答案