Antlr 4错误恢复

时间:2014-08-27 18:31:06

标签: antlr antlr4

我的脚本语言包含一系列宏,规则定义如下

program
:   macrodeclaration* EOF
;

macrodeclaration
:   (STATIC)? 'MACRO' STRING declareparameter
    statement*
    'ENDMACRO'
;

有时候我把endmacro错误地当作endmacros,解析器吞噬了令牌' endmacros'并忽略下一个宏定义,继续搜索到下一个endmacro。它吐出了许多没有可行的替代错误。

我想知道如何调整错误恢复,将错误输入的endmacros视为endmacro,因此只报告一个错误并且可以正确解析下一个宏。

请帮忙。

1 个答案:

答案 0 :(得分:0)

错误恢复是一个棘手的主题。你总是可以添加一个新的令牌ENDMACROS并在最后允许它,但是如果用户写ENDMCROendmacro或只是END会发生什么?或者如果他们在其他地方使用ENDMACROS作为标识符会发生什么。

目前的结果如下:

  1. ANTLR 4返回正确输入的正确答案(实际上有一些已知的剩余错误,但目标始终是达到此目的。)
  2. 没有人实施并提交更好的广义错误恢复策略作为对项目的拉取请求,这不会对正确输入的性能产生负面影响。
  3. 除非您计划设计和实现通用错误恢复策略,否则最好的办法可能就是在解析阶段完成之前为错误添加某种过滤器。对于语义分析期间发生的错误(使用访问者/步行者/等),您可以在停止之前报告更多错误。