我的脚本语言包含一系列宏,规则定义如下
program
: macrodeclaration* EOF
;
macrodeclaration
: (STATIC)? 'MACRO' STRING declareparameter
statement*
'ENDMACRO'
;
有时我将endmacro错误地键入为endmacro,解析器会吞噬标记"endmacro"并忽略下一个宏定义,继续搜索下一个endmacro。它吐出了太多不可行的替代错误。
我想知道如何调整错误恢复,将键入错误的endmacro视为endmacro,从而只报告一个错误并正确解析下一个宏。
请帮忙。
错误恢复是一个棘手的问题。您总是可以添加一个新的令牌ENDMACROS
,并在最后允许它,但如果用户写入ENDMCRO
、endmacro
或仅写入END
,会发生什么?或者如果他们在其他地方使用ENDMACROS
作为标识符会发生什么。
今天的结果如下:
- ANTLR 4为正确的输入返回正确的答案(实际上还有一些已知的剩余错误,但目标始终是达到这一点)
- 没有人实施并提交了一个更好的通用错误恢复策略,作为对项目的拉动请求,该策略不会对正确输入的性能产生负面影响
除非您计划设计和实现一个通用的错误恢复策略,否则最好的选择可能只是为解析阶段完成之前发生的错误添加某种过滤器。对于在语义分析过程中发生的错误(使用访问者/步行者等),您可以在停止之前报告更多的错误。