Ocaml运行时解析器生成器

时间:2018-08-20 16:32:59

标签: parsing runtime ocaml

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

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

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

是否有任何方法可以将Menhir用作后端(将语法提供给它,以便在运行时生成解析器),或者在OCaml(或C,因为可以将其与OCaml链接)中可以使用该库吗?

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

1 个答案:

答案 0 :(得分:2)

这是一个广泛且非常有趣的跨学科研究领域,因此,我什至不尝试提供全面的答案,而是提供一些链接和指导原则(这与SO的精神相矛盾,但是我们可能应该以其他方式关闭这个问题太笼统了。

几个项目尝试并成功实现了交互式解析器。如果我们将重点放在用OCaml编写的项目上,那么首先想到以下几点:camlp5coqott。在我看来,最有趣和最容易理解的是后者,Ott。他们基于约简工作清单算法实现了GLR parser,该算法除其他技术外,还用Scott McPeak的thesis描述。

另一种方法是避免生成解析器并坚持使用Monadic解析器。由于单子语法分析器将上下文相关的语法定义为运行时值,因此可以指定运行时与定义的语法之间的任何交互。这实际上是一个福音,也可能是祸根,因为有可能定义完全不明智的带有冲突的语法。但是,一如既往,强大的力量伴随着巨大的责任。 OCaml有很多monadic解析器组合器库,想到的前两个是mparserangstrom