我使用Antlr 4.2.2和Java 1.7进行一些文本处理。我扩展了BaseErrorListener并覆盖了syntaxError()以报告语法错误,这工作得很好。但是,我希望它将不匹配的文本视为一个标记并返回它,而不是完全丢弃它。
在我的lexer中,我有这样的规则:
TEXT : ~[<{|]+ ;
当我尝试解析"foo{{"时,我得到了一个语法错误,如预期的那样:标记识别错误:'{{'。但是我希望'{{'也被报告为一个令牌,这样它就不会从输入流中丢失。
您可以在文件的末尾添加一个类似的通用词法分析器规则:
Error : . ;
这将产生Error
令牌,它很可能在解析期间报告为extra "Error" token
。
你也可以这样做:
SilentError : . -> channel(LexingErrorChannel); // you need to set the constant for this channel
它将静默地忽略词法错误(如果您想自己处理/报告它们)。
但是I如果可以规避的话就不会这样做了。
注意:这将为每个字符生成一个Error
令牌。如果你"知道"可能的错误,你可以像这样添加其他规则:
Error : [<{|]'+
| .
;
注意不要太贪心