我正在使用 JLex 和 JCUP 为本科项目构建 LR(1) 解析器。我选择(可能是错误的)尽可能地模仿 C++ 语法和语义。我已经完成了词法分析和解析,但我在 CUP 中遇到了错误恢复。
您可以认为我的语言的语法是 C++ 的语法,因为我所做的更改在这里不起作用(我认为)。我知道使用以下产品进行错误恢复是很常见的:
Statement ::= error SEMICOLON
但是,使用此解析器无法从块末尾丢失的分号(大括号 { } 包围的代码片段)中恢复。事实上,我找不到解析器从中恢复的方法。由于我无法将最后一条指令视为错误,因此我尝试至少将整个块视为错误。我试过了:
Block ::= LEFTBRACE error RIGHTBRACE
但这给了我一个 Shift-Reduce 冲突。我也试过:
Block ::= error RIGHTBRACE
但错误没有解决。
你能帮助从这个错误中恢复吗?