我正在用 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 传递给解析器,但不在语义操作中。
有谁知道它是否真的以某种方式可用?或者也许是一种解决方法?