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

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

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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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