Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
通常如何添加错误产生?我遇到了我的错误产生太浅的问题:当解析器开始弹出语句中的错误状态时,它会弹出,直到它遇到它所在部分的错误产生,并打印出无效错误信息。
为每个非终端添加一些描述性错误产生是个好主意吗?
错误产生是关于从错误中恢复以尝试继续处理输入,而不是打印合理或有用的错误消息。因此,它们应该用在语法中可以正确识别和重新同步输入流的地方。例如,如果您的语言由一系列以;字符结尾的结构组成,那么好的错误生成类似于construct: error ';',它将construct通过向前跳到 a 的输入;并尝试从那里。
;
construct: error ';'
construct
放置许多错误恢复规则通常是一个坏主意,因为解析器只会恢复到最接近的那个,并且它通常是最有可能有用的顶层最全局的规则,并且尝试使用更精细的粒度只会导致到错误级联,因为错误恢复规则无法正确地与输入重新同步。