【发布时间】:2019-04-10 16:24:36
【问题描述】:
为了好玩,我想为无类型的 Lambda 演算编写一个解析器。这 最简单的方法可能是编写一个手写解析器,但我想知道 如果有更 Pythonic 的方式?具体来说,我想使用 翻译语言语法描述的 Python 库 进入解析器。这是该语言的 BNF 定义:
<term> ::= <var>
| <term> <term>
| λ <var> <term>
为简单起见,我省略了括号规则。申请伙伴
到左边,这样x y z 就是(x y) z。
什么Python库可以取上面的语法描述,或者一些 从它派生的语法(正如书面的那样,我相信,语法是 模棱两可和左递归,因此实现起来并不简单),并且 生成解析器?我想看看它是如何使用代码完成的,所以请 不要只回答“pyparsing 可以做到”。请写代码 以下几行:
>>> G = """syntax description here..."""
>>> parser = build.the_parser(G)
>>> parser.parse("λ x. (y z)")
Abs('x', App(Id('x', Id('y'))))
最后一行是生成的抽象语法树可能是什么。绝对值 代表抽象 (lambda),App 代表应用程序,Id 代表 标识符。我认为 PEG Packrat 解析器生成器在这里可以很好地工作。
【问题讨论】:
标签: python parsing lambda-calculus peg