使用 Menhir 报告多个错误:哪个令牌



我正在使用Menhir + Ocamllex编写一个小解析器,我有两个要求,我似乎无法同时满足

    我想在错误
  • 后继续解析(报告更多错误(。
  • 我想打印发生错误的令牌。

我只能通过使用error令牌轻松完成 1( 操作。 我也只能做2(很容易,使用为这个问题建议的方法。 但是,我不知道有什么简单的方法可以实现两者。

我现在处理错误的方式是这样的:

pair:
| left = prodA SEPARATOR right = prodA { (* happy case *) }
| error SEPARATOR right = prodA { print_error_report $startpos;
(* would like to continue after the first error, just in case
   there is a second error, so I report both *) }

对我有帮助的一件事是访问 lexbuf 本身,所以我可以直接获取令牌。这意味着我传递的不是$startpos $lexbuf据我所知,没有官方方法可以访问 lexbuf。1 中的解决方案仅在解析器的调用方级别工作,其中调用方本身传递 lexbuf t othe 解析器,但不在语义操作中。

有谁知道它是否真的以某种方式可用? 或者也许是一种解决方法?

由于 Frédéric Bour 和 François Pottier 的联合工作,有一个新版本的 Menhir 支持增量解析。请参阅12月17日发送的公告电子邮件。

这个增量 API 的想法是反向控制:你有一个较低级别的 API,而不是解析器调用词法分析器来处理输入,您可以在其中操作解析器状态,该状态在每个使用令牌后返回更新的状态(这稍微更细粒度,因为您可以观察到不需要新令牌的内部缩减(。特别是,您可以观察生成的解析器状态是否为错误,并选择回溯并提供不同的输入(取决于您的错误恢复初始方法(,以便在输入中走得更远。

一般的想法是,这将允许在解析器用户端实现良好的错误恢复和错误报告策略,并慢慢弃用相当不灵活的"错误令牌"机制。

这已经可用,但这些功能的工作仍在进行中,在接下来的几个月中,您应该期望在其他版本中对这些新功能提供更强大的支持。

最新更新