对Error Bison不执行语义操作

时间:2014-11-09 17:59:12

标签: c++ bison semantics error-recovery

我必须在野牛中构建一个编译器。我希望我的编译器能够像大多数编译器一样工作,如果有任何语法错误,请列出所有编译器然后挽救。问题是我对每个规则都有语义操作,我的编译器报告所有语法错误但仍然执行所有语义操作。如果存在语法错误,是否有办法告诉bison忽略语义操作,但是要继续寻找所有语法错误?

谢谢!

1 个答案:

答案 0 :(得分:1)

不清楚你在问什么。如果程序中的任何地方出现语法错误,您是否希望bison解析器根本不执行任何操作?这很困难,因为野牛会在减少规则时立即执行操作,所以没有好办法知道将来某个地方是否会出现错误。对于之后语法错误的操作(假设您有错误恢复规则 - 如果您没有,则会在第一次语法错误后退出),您可以拥有全局标记并简单地执行所有操作在他们做任何事之前测试那个旗帜。

如果你想在第一个错误之前禁用动作,我唯一能想到的就是让两个具有相同语法的解析器 - 一个不执行任何操作,一个执行它们。使用第一个解析器确定是否存在任何错误,然后回滚输入并仅在没有错误时使用第二个解析器。