在Java中导致NullPointerException的ANTLR错误恢复
我有一个ANTLR语法,其形式如下:在Java中导致NullPointerException的ANTLR错误恢复,java,parsing,error-handling,antlr,grammar,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跳过这些行(其中缺少-的任何一侧),继续处理其余的行 基本上是这样的
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,并在适当的解析器块之后提供了这个catch:
catch[RecognitionException re]{
reportError(re);
consumeUntil(input, NEWLINE);
input.consume();
}
编辑2-我尝试过这样做:
while (input.LA(1) != 6){
input.consume();
}
这一切如期而至。6是我的“新线”的令牌标识符。我不知道如何像输入那样进行比较。LA(1)!=“\n”或类似的内容。我知道这样做是不对的,我只是在试验。如果你知道正确的方法,请告诉我!:)
但这是可行的,与第一个循环不同。我怀疑Consumentil可能没有看到隐藏频道上的新线
Null指针似乎是由输入快速转发到EOF引起的,因此,树语法在执行input.LT(1)时遇到Null
但是,这样做会在我的树语法中得到一个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)
....
retval.start = input.LT(1);
我想要的行为是解析器跳过缺少组件的行,然后继续处理剩余的行。我想树解析器应该不是问题吧
ANTLR的书没有提到任何关于这个问题的内容
此外,我认为这些文章提到了一些类似的东西,但提供的解决方案相当复杂/丑陋,可以追溯到2004年。那么,在ANTLR中有没有更好的方法来做这个相对简单的事情呢
多谢各位
编辑如果这有帮助,则错误是由生成的树语法中的此行引起的:
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)
....
retval.start = input.LT(1);
也就是说,我猜,被打电话时什么都没有。也就是说,LT(1)返回Null,因为它跳过了。您能发布一个演示此异常的帖子吗?恐怕我不能这样做。代码相当长且嵌套。如果没有纠错代码,语法本身就可以正常工作,但我不希望它在这个简单错误的第一行中断。我只想让它跳过并继续。我发现了以下内容:。我来试一试,看看是否效果更好。上面的不起作用。我试过别的东西。请参见编辑#2。这在某种程度上是可行的。