将错误产生添加到语法的策略是什么?

时间:2011-05-04 17:32:48

标签: parsing yacc bison compiler-theory

如何添加错误产品?我遇到的问题是我的错误产生太浅:当解析器开始在语句中的错误上弹出状态时,它会弹出,直到它遇到它所在的部分的错误生成,并打印出无效的错误信息。

仅为每个非终端添加一些描述性错误生成是一个好主意吗?

1 个答案:

答案 0 :(得分:3)

错误产生是关于从错误中恢复以尝试继续处理输入,而不是打印合理或有用的错误消息。因此,它们应该在语法中的某些点使用,您可以正确地识别和重新同步输入流。例如,如果您的语言由一系列以;个字符结尾的结构组成,则良好的错误生成类似于construct: error ';',它将从construct中的错误中恢复(无论是什么) )通过在输入中向前跳过;并尝试从那里继续。

放置许多错误恢复规则通常是一个坏主意,因为解析器只会恢复到最接近的错误,并且它通常是顶级最全局的,最有可能有用并尝试使用更精细的粒度只会导致错误级联,因为错误恢复规则无法正确地与输入重新同步。