2

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

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

4

1 回答 1

3

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

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

于 2011-05-04T23:12:36.243 回答