Java antlr错误(发生识别异常时无限循环)

Java antlr错误(发生识别异常时无限循环),java,antlr,Java,Antlr,我正在使用antlr为一种语言编写词法分析器。 定义语法后,antlr为lexer类生成了java代码,其中包含nextToken函数。每次我使用此函数时,它都会为我返回一个已识别的令牌,但如果它看到一个未定义的令牌,它会抛出一个RecognitionException异常,当它捕获它时,它会抛出另一个异常: catch (RecognitionException e) {throw new TokenStreamRecognitionException(e);} 我已经编写了一个cat

我正在使用antlr为一种语言编写词法分析器。
定义语法后,antlr为lexer类生成了java代码,其中包含nextToken函数。每次我使用此函数时,它都会为我返回一个已识别的令牌,但如果它看到一个未定义的令牌,它会抛出一个
RecognitionException
异常,当它捕获它时,它会抛出另一个异常:

catch (RecognitionException e) {throw new TokenStreamRecognitionException(e);}   
我已经编写了一个catch块来捕获此异常并在输出中打印一些内容,但问题是在这之后,它似乎不再只是打印错误并转到下一个标记,而是在这之前返回到标记,再次测试它并再次返回到这个未定义的标记,这将导致一个无休止的循环,如:

ID      a_1
error occured at:   rowNum:1    colNum:8
line 1:8: unexpected char: '&'
ID      a_1
error occured at:   rowNum:1    colNum:8
line 1:8: unexpected char: '&'
ID      a_1
error occured at:   rowNum:1    colNum:8
line 1:8: unexpected char: '&'
...
我应该如何修复
nextToken
以仅打印错误并继续输入程序的其余部分


我搜索了整个网站,但我无法解决问题,我想可能您以前遇到过这个错误。

您可以在lexer规则的末尾定义一个
其他
规则,并让该规则匹配任何字符。如果前面的lexer规则不匹配,那么它将始终匹配任何内容。然后重写
nextToken()
,并检查它是否为
其他类型:

lexer语法T;
@成员{
@凌驾
公共令牌nextToken(){
令牌t=super.nextToken();
if(t.getType()==其他){
//做点什么
}
返回t;
}
}
//其他lexer规则
其他
: .
;
请注意,如果您使用的是组合语法,
grammar T,那么您应该明确定义lexer成员块,如下所示:

语法T;
@lexer::成员{
@凌驾
公共令牌nextToken(){
令牌t=super.nextToken();
if(t.getType()==其他){
//做点什么
}
返回t;
}
}
...

谢谢Bart,是的,我需要定义“其他”规则,但我的主要问题是我在Eclipse中使用了“AntlEclipse”插件来生成我语法的java代码,它生成的“nextToken”函数似乎是我的主要问题,当它出现不匹配错误时,而不是声明错误并转到嵌套令牌,它返回到输入文件并再次尝试检查这个未定义的令牌,因此它导致了一个无休止的循环,因此我认为我必须使用Antlr的“nextToken”函数,并按照您所说的覆盖它。