Python реализация Parsec? - PullRequest
       34

Python реализация Parsec?

12 голосов
/ 18 сентября 2008

Я недавно написал парсер на Python, используя Ply (это повторная реализация Python для yacc). Когда я почти закончил с синтаксическим анализатором, я обнаружил, что грамматика, которую мне нужно проанализировать, требует от меня некоторого поиска во время синтаксического анализа для информирования лексера. Без поиска информации у лексера я не могу правильно разобрать строки в языке.

Учитывая, что я могу управлять состоянием лексера из правил грамматики, я думаю, что я решу свой вариант использования, используя справочную таблицу в модуле синтаксического анализатора, но это может стать слишком сложным для обслуживания / тестирования. Поэтому я хочу знать о некоторых других вариантах.

В Haskell я бы использовал Parsec, библиотеку функций синтаксического анализа (известных как комбинаторы). Есть ли в Python реализация Parsec? Или, может быть, какая-то другая библиотека производственного качества, полная функциональности синтаксического анализа, чтобы я мог создать контекстно-зависимый парсер в Python?

РЕДАКТИРОВАТЬ: Все мои попытки анализа без контекста потерпели неудачу. По этой причине я не ожидаю, что ANTLR будет здесь полезен.

Ответы [ 6 ]

7 голосов
/ 18 сентября 2008

Я считаю, что pyparsing основан на тех же принципах, что и parsec.

4 голосов
/ 18 сентября 2008

PySec - еще один монадный парсер, я не знаю много об этом, но стоит посмотреть здесь

4 голосов
/ 18 сентября 2008

Вариант, который вы можете рассмотреть, если парсер LL вам подходит, - это попробовать ANTLR , он также может генерировать python (на самом деле это LL (*), как они его называют, * обозначает количество упреждений, с которыми оно может справиться).

1 голос
/ 19 сентября 2008

Ничто не мешает вам отвлечь ваш парсер от пути "без контекста" с помощью PLY. Вы можете передавать информацию лексеру во время синтаксического анализа и таким образом достичь полной гибкости. Я почти уверен, что таким способом вы сможете разобрать все, что захотите, с помощью PLY.

Для практического примера, рассмотрим - это синтаксический анализатор для ANSI C, написанный на Python с PLY. Он решает классическую проблему определения идентификатора типа C (что делает грамматику C неконтекстно-зависимой), заполняя таблицу символов в синтаксическом анализаторе, который используется в лексере для разрешения имен символов как типов или нет.

1 голос
/ 18 сентября 2008

Есть ANTLR, который является LL (*), есть PyParsing, который более дружественен к объектам и похож на DSL, а затем есть Парсинг , который похож на Менгир OCaml.

0 голосов
/ 18 сентября 2008

ANTLR великолепен и имеет дополнительное преимущество работы на нескольких языках.

...