Sedlex和Menhir中有一个非常小的计算器。现在,我想让计算器能够解析像1+
这样的表达式。所以我将parser.mly
修改为
... ...
main:
expr EOL { $1 }
;
expr [@recovery (E_int 0)]:
INT { E_int $1 }
| BOOL { E_bool $1 }
... ...
但是评估1+
仍然返回错误Fatal error: exception Parser.MenhirBasics.Error
。
有人能帮忙吗?
我的评论的扩充摘要:
[@recovery ...]
是Merlin特有的构建体- 截至目前(2022年2月13日(,仍然可以使用特殊的
error
令牌定义自己的错误恢复,如下所示:
main:
expr EOL { $1 }
;
expr [@recovery (E_int 0)]:
INT { E_int $1 }
| BOOL { E_bool $1 }
| error { E_int 0 }
来自menhir的手册:
如果使用错误标记来度过错误并继续解析,则应选择遗留策略。
--strategy strategy
。此开关选择一种错误处理策略,供代码后端、表后端和引用解释器使用。可用的策略有legacy
和simplified
。
来自OCaml每周新闻:
Grammars更复杂地使用了错误标记,因此需要遗留策略,无法通过新的后端代码进行编译。作为一种变通方法,可以切换到表后端(使用--表-策略遗留(或到古代代码后端(使用--古代代码(。从长远来看,我们建议放弃使用错误标记。可能会删除对错误标记的支持完全在未来的某个时刻。
这种方式在不久的将来很可能不会奏效,但目前确实有效,而且它似乎是执行OP要求的最简单的方式。