【问题标题】:Ocaml runtime parser generatorOcaml 运行时解析器生成器
【发布时间】:2018-08-20 16:32:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你的问题有点笼统。您要完成的是元语法(描述语法的语法),但它仍然是语法。
  • 你能利用menhir --interpret吗?
  • menhir --interpret 可能是最后一个问题的解决方案,如果我从用户给出的语法中以我的自定义格式输出 menhir 语法。

标签: parsing runtime ocaml


【解决方案1】:

这是一个广泛且非常有趣的跨学科研究领域,因此我什至不会尝试提供全面的答案,而是提供一些链接和指南(这有点违背 SO 的精神,但也许我们应该关闭这个问题太宽泛了)。

多个项目尝试并成功实现了交互式解析器。如果我们将专注于用 OCaml 编写的项目,那么首先会想到以下内容:camlp5、coq、ott。其中,在我看来,最有趣和最容易理解的是后者,奥特。他们实现了一个GLR parser,基于简化工作列表算法,除其他技术外,Scott McPeak 的thesis 中描述了该算法。

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

【讨论】:

  • 谢谢,它完美地回答了我最后一个可能过于宽泛的问题。我的第一个目标是为解析器生成 OCaml 代码(LR1 足以满足我的需求),而不是我可以在运行时使用的解析器。我认为仅使用一个库就可以做到这一点。
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多