0

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

有人可以帮忙吗?

4

1 回答 1

1

我的评论的增强摘要:

  • [@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 每周新闻

  • 更复杂地使用错误标记并因此需要遗留策略的语法不能由新的代码后端编译。作为一种解决方法,可以切换到表后端(使用 --table --strategy legacy)或古老的代码后端(使用 --code-ancient)。从长远来看,我们建议放弃使用错误令牌。将来某个时候可能会完全删除对错误令牌的支持。

这种做事方式很可能在不久的将来不会起作用,但它现在起作用了,而且它似乎是做 OP 要求的最简单的方法。

于 2022-02-12T23:56:29.417 回答