Ocaml 使用menhir报告多个错误:哪个令牌?

Ocaml 使用menhir报告多个错误:哪个令牌?,ocaml,ocamlyacc,ocamllex,menhir,Ocaml,Ocamlyacc,Ocamllex,Menhir,我正在用Menhir+ocamlex编写一个小型解析器,我有两个要求似乎无法同时满足 我希望在出现错误后继续解析(以报告更多错误) 我想打印出现错误的令牌 通过使用error标记,我只能轻松地完成1)项任务。我也只能做2) 很容易,使用建议的方法。然而,我不知道有什么简单的方法可以同时实现这两个目标 我现在处理错误的方式如下: pair: | left = prodA SEPARATOR right = prodA { (* happy case *) } | error SEPARATOR

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

  • 我希望在出现错误后继续解析(以报告更多错误)
  • 我想打印出现错误的令牌
通过使用
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本身,这样我就可以直接获得令牌。这意味着我将传递类似于
$lexbuf
的内容,而不是
$startpos
,但据我所知,没有正式的方式访问lexbuf。中的解决方案仅在解析器的调用方级别起作用,其中调用方本身正在向解析器传递lexbuf,但不在语义操作中


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

多亏了弗里德里克·布尔(Frédéric Bour)和弗朗索瓦·波蒂埃(François Pottier)的共同努力,Menhir有了一个支持增量解析的新版本。见12月17日发送的

这种增量API的思想是反向控制:与解析器调用lexer来处理输入不同,您有一个较低级别的API,在该API中,您可以操作解析器状态,该状态在每个使用的令牌之后返回一个更新的状态(在这种情况下,由于您可以观察到不需要新标记的内部缩减,因此更细粒度)。特别是,您可以观察生成的解析器状态是否为错误,并选择回溯并提供不同的输入(取决于错误恢复开始时间),以便在输入中进一步执行

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

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