Menhir的部分解析和恢复



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。此开关选择一种错误处理策略,供代码后端、表后端和引用解释器使用。可用的策略有legacysimplified

来自OCaml每周新闻:

  • Grammars更复杂地使用了错误标记,因此需要遗留策略,无法通过新的后端代码进行编译。作为一种变通方法,可以切换到表后端(使用--表-策略遗留(或到古代代码后端(使用--古代代码(。从长远来看,我们建议放弃使用错误标记。可能会删除对错误标记的支持完全在未来的某个时刻。

这种方式在不久的将来很可能不会奏效,但目前确实有效,而且它似乎是执行OP要求的最简单的方式。

相关内容

  • 没有找到相关文章

最新更新