6

我正在用 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 传递给解析器,但不在语义操作中。

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

4

1 回答 1

5

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

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

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

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

于 2015-01-18T10:37:28.693 回答