Ocaml 运行时解析器生成器



我正在编写一个程序,它基本上以自定义格式(和其他一些规则(将语法作为输入,并生成一个OCaml程序(检查器(,一旦编译就可以根据语法和规则检查表达式是否被接受。

我使用 OCaml 作为生成器,使用 Menhir 来解析语法和规则。现在,我必须为我想生成检查器的所有语法手动编写一个解析器。我想像 Menhir 一样自动生成解析器的代码。

我可以输出 Menhir 语法并从我的 OCaml 程序中调用 Menhir,但进行适当的错误处理会很乏味。

有没有办法使用 Menhir 作为后端(为它提供语法以在运行时生成解析器(,或者是否有任何库可以在 OCaml 中做到这一点(或 C,因为它可以与 OCaml 链接(?

如果可能的话,我也希望能够以语法描述的格式表达规则,有没有可以在运行时生成解释器的库?

这是一个广泛且非常有趣的跨学科研究领域,所以我甚至不会试图提供一个全面的答案,而是提供一些链接和指南(这有点与SO的精神相矛盾,但也许我们应该关闭这个问题,因为太宽泛了(。

几个项目尝试并成功实现了交互式解析器。如果我们专注于用OCaml编写的项目,那么首先想到以下内容:camlp5,coq,ott。在我看来,其中最有趣和最容易理解的是后者,奥特。他们基于归约工作清单算法实现了GLR解析器,该算法在Scott McPeak的论文中描述了其他技术。

另一种方法是避免解析器生成并坚持使用一元解析器。由于 monadic 解析器将上下文相关的语法定义为运行时值,因此可以指定运行时和定义的语法之间的任何交互。这实际上是一个福音和一个祸根,因为可以用冲突来定义完全不合理的语法。但与往常一样,权力越大,责任越大。OCaml 有很多 monadic 解析器组合器库,首先想到的两个是 mparser 和 Angstrom。

最新更新