Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中导致NullPointerException的ANTLR错误恢复_Java_Parsing_Error Handling_Antlr_Grammar - Fatal编程技术网

在Java中导致NullPointerException的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跳过这些行(其中缺少-的任何一侧),继续处理其余的行 基本上是这样的

我有一个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。这在某种程度上是可行的。