0

我正在使用 JLex 和 JCUP 为本科项目构建 LR(1) 解析器。我选择(可能是错误的)尽可能地模仿 C++ 语法和语义。我已经完成了词法分析和解析,但我在 CUP 中遇到了错误恢复。

您可以认为我的语言的语法是 C++ 的语法,因为我所做的更改在这里不起作用(我认为)。我知道使用以下产品进行错误恢复是很常见的:

Statement ::= error SEMICOLON

但是,使用此解析器无法从块末尾丢失的分号(大括号 { } 包围的代码片段)中恢复。事实上,我找不到解析器从中恢复的方法。由于我无法将最后一条指令视为错误,因此我尝试至少将整个块视为错误。我试过了:

Block ::= LEFTBRACE error RIGHTBRACE

但这给了我一个 Shift-Reduce 冲突。我也试过:

Block ::= error RIGHTBRACE

但错误没有解决。

你能帮助从这个错误中恢复吗?

4

0 回答 0