我的脚本语言包含一系列宏,规则定义如下
program
: macrodeclaration* EOF
;
macrodeclaration
: (STATIC)? 'MACRO' STRING declareparameter
statement*
'ENDMACRO'
;
有时候我把endmacro错误地当作endmacros,解析器吞噬了令牌' endmacros'并忽略下一个宏定义,继续搜索到下一个endmacro。它吐出了许多没有可行的替代错误。
我想知道如何调整错误恢复,将错误输入的endmacros视为endmacro,因此只报告一个错误并且可以正确解析下一个宏。
请帮忙。
答案 0 :(得分:0)
错误恢复是一个棘手的主题。你总是可以添加一个新的令牌ENDMACROS
并在最后允许它,但是如果用户写ENDMCRO
,endmacro
或只是END
会发生什么?或者如果他们在其他地方使用ENDMACROS
作为标识符会发生什么。
目前的结果如下:
除非您计划设计和实现通用错误恢复策略,否则最好的办法可能就是在解析阶段完成之前为错误添加某种过滤器。对于语义分析期间发生的错误(使用访问者/步行者/等),您可以在停止之前报告更多错误。