摆脱令牌识别错误

Hak*_*kan 7 antlr4

如何摆脱默认的ANTLR识别错误?

我想用我自己的错误类而不是ANTLR的错误编写另一条消息.

我的意思是有可能扩展一些ANTLR错误类以显示我自己的消息吗?

更清楚的是,我不希望在我的控制台中看到以下错误消息:

令牌识别错误:

Sam*_*ell 10

如果您只想抑制消息,可以拨打电话lexer.removeErrorListeners().但是,更好的方法是编写词法分析器规则,以便对所有可能的输入进行标记化,并在词法分析器末尾使用以下规则.这将导致所有错误报告通过解析器而不是解析器和词法分析器.

// handle characters which failed to match any other token
ErrorCharacter : . ;
Run Code Online (Sandbox Code Playgroud)


Sca*_*dge 5

为了创建自定义错误处理程序,您可以扩展BaseErrorListener该类并覆盖该syntaxError方法,例如:

public class MyErrorListener extends BaseErrorListener {
  @Override
  public void syntaxError( Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine,
                           String msg, RecognitionException e ) {
    // method arguments should be used for more detailed report
    throw new RuntimeException("syntax error occurred");
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,当您创建词法分析器和解析器时,您应该删除默认错误侦听器并附加您的自定义侦听器:

MyErrorListener errorListener = new MyErrorListener();

Lexer lexer = new MyLexer( ... );
lexer.removeErrorListeners();
lexer.addErrorListener( errorListener );

CommonTokenStream tokens = new CommonTokenStream( lexer );

Parser parser = new MyParser( tokens );
parser.removeErrorListeners();
parser.addErrorListener( errorListener );
Run Code Online (Sandbox Code Playgroud)

默认消息“行 x:x 令牌识别错误:'xxx'”来自默认ConsoleErrorListener类。如果您不使用删除它lexer/parser.removeErrorListeners()而只添加您的自定义一个,它仍然会被触发。

错误处理策略在The Definitive ANTLR4 Reference book(在ANTLR4 文档页面上提到)的专门章节中有详尽的描述。我目前无法访问这本书本身,所以如果有人用这本书的具体页码编辑这个答案,我将不胜感激。另外,我在 ANTLR4 文档页面上找不到相关指南,因此如果它存在 - 链接也会有所帮助。