orm*_*orm 5 ocaml ocamlyacc ocamllex 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 *) }
Run Code Online (Sandbox Code Playgroud)
有一件事可以帮助我访问lexbuf本身,所以我可以直接获得令牌.这将意味着,而不是$startpos我传的东西一样 $lexbuf,但据我所知,有访问lexbuf没有官方途径.1中的解决方案仅在解析器的调用者级别工作,其中调用者本身将lexbuf传递给解析器,但不在语义操作中.
有谁知道它是否真的以某种方式可用?或者可能是一种解决方法?
由于 Frédéric Bour 和 François Pottier 的联合工作,有一个新版本的 Menhir 可用,支持增量解析。请参阅12 月 17 日发送的公告电子邮件。
这个增量 API 的想法是反向控制:而不是解析器调用词法分析器来处理输入,您有一个较低级别的 API,您可以在其中操作解析器状态,该状态在每个消耗令牌后返回更新的状态(在这有点更细粒度,因为您可以观察到不需要新令牌的内部减少)。特别是,您可以观察结果解析器状态是否为错误,并选择回溯并提供不同的输入(取决于您的错误恢复策略)以在您的输入中走得更远。
总体思路是,这将允许在解析器用户端实现良好的错误恢复和错误报告策略,并逐渐弃用相当不灵活的“错误令牌”机制。
这已经可用,但这些功能的工作仍在进行中,在接下来的几个月中,您应该期待其他版本中对这些新功能的更强大的支持。