让Antlr lexer将语法错误处理为令牌

时间:2014-06-17 19:05:12

标签: java antlr4 lexer

我正在使用Antlr 4.2.2和Java 1.7进行一些文本处理。我已经扩展了BaseErrorListener并重写了syntaxError()来报告语法错误,这很有效。但我希望它将不匹配的文本视为一个标记并将其返回,而不是完全丢弃它。

在我的词法分析器中,我有这个规则:

TEXT : ~[<{|]+ ;

当我尝试解析“foo {{”我得到了预期的语法错误:令牌识别错误:'{{'。但我希望将'{{'报告为令牌,以便它不会从输入流中删除。

1 个答案:

答案 0 :(得分:1)

你可以在文件的最后添加一个像这个的catchall lexer规则:

Error : . ;

这将生成Error令牌,在解析过程中很可能会报告为extra "Error" token

你也可以这样做:

 SilentError : . -> channel(LexingErrorChannel); // you need to set the constant for this channel

哪个会默默地忽略lexing错误(如果你想自己处理/报告)。

如果可以规避的话,就不会真的这样做。

注意:这将为每个字符生成一个Error标记。如果您“知道”可能的错误,可以添加其他规则:

Error : [<{|]'+
      | .
      ;

小心不要太贪心。