我正在用Menhir + Ocamllex编写一个小型解析器,我有两个似乎不能同时满足的要求
通过使用error令牌,我只能轻松地完成任务。我也只能很容易地使用为这个问题建议的方法。然而,我不知道实现这两种目标的简单方法。
我现在处理错误的方式如下:
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 *) }帮助我的一件事是访问词汇本身,这样我就可以直接得到令牌了。这意味着我传递的不是$startpos,而是类似于$lexbuf的东西,但据我所知,没有官方的方法来访问词汇。1中的解决方案只在调用方到解析器的级别工作,其中调用方本身正在传递语法分析器,而不是在语义操作中。
有人知道它是否真的可用吗?或者一个解决办法?
发布于 2015-01-18 10:37:28
由于Frédéric Bour和Fran ois Pottier的联合工作,出现了一种支持增量解析的新版本Menhir。见12月17日发送的公告电子邮件。
这个增量API的思想是反向控制:而不是解析器调用lexer来处理输入,而是有一个较低级别的API,您可以操作解析器状态,它在每个消耗的令牌之后返回一个更新的状态(因为您可以观察到不需要新令牌的内部缩减)。特别是,您可以观察得到的解析器状态是否是一个错误,并选择回溯并提供不同的输入(取决于您的错误恢复开始时间),以进一步推进您的输入。
总体思路是,这将允许在解析器-用户端实现良好的错误恢复和错误报告策略,并慢慢放弃相当不灵活的“错误标记”机制。
这已经是可用的,但是关于这些特性的工作仍在进行中,在接下来的几个月中,您应该期望在其他版本中对这些新特性提供更强大的支持。
https://stackoverflow.com/questions/27350899
复制相似问题