Ради интереса я хочу написать парсер для нетипизированного лямбда-исчисления.Самый простой подход - написать рукописный парсер, но мне интересно, есть ли более питонский способ?В частности, я хочу использовать библиотеку 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'))))
В последней строке указано, каким может быть созданное абстрактное синтаксическое дерево.Абс обозначает абстракцию (лямбда), приложение для приложения и идентификатор для идентификатора.Я думаю, что генератор синтаксического анализатора PEG Packrat будет хорошо работать здесь.