使用menhir进行多次错误报告:哪个令牌?

时间:2014-12-08 03:19:57

标签: ocaml ocamlyacc ocamllex menhir

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

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

我只能使用error令牌轻松完成1)。我也可以只做2) 很容易,使用this question建议的方法。但是,我不知道实现这两者的简单方法。

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

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

有人知道它是否真的以某种方式可用吗?或者可能是一种解决方法?

1 个答案:

答案 0 :(得分:4)

感谢FrédéricBour和FrançoisPottier的共同工作,有一个新版本的Menhir支持增量解析。请参阅12月17日发送的announcement email

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

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

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