我正在使用Antlr 4.2.2和Java 1.7进行一些文本处理。我已经扩展了BaseErrorListener并重写了syntaxError()来报告语法错误,这很有效。但我希望它将不匹配的文本视为一个标记并将其返回,而不是完全丢弃它。
在我的词法分析器中,我有这个规则:
TEXT : ~[<{|]+ ;
当我尝试解析“foo {{”我得到了预期的语法错误:令牌识别错误:'{{'。但我希望将'{{'报告为令牌,以便它不会从输入流中删除。
答案 0 :(得分:1)
你可以在文件的最后添加一个像这个的catchall lexer规则:
Error : . ;
这将生成Error
令牌,在解析过程中很可能会报告为extra "Error" token
。
你也可以这样做:
SilentError : . -> channel(LexingErrorChannel); // you need to set the constant for this channel
哪个会默默地忽略lexing错误(如果你想自己处理/报告)。
但我如果可以规避的话,就不会真的这样做。
注意:这将为每个字符生成一个Error
标记。如果您“知道”可能的错误,可以添加其他规则:
Error : [<{|]'+
| .
;
小心不要太贪心。