2008-09-18 3 views
11

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

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

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

ИЗМЕНИТЬ: все мои попытки контекстного анализа синтаксических ошибок провалились. По этой причине я не ожидаю, что ANTLR будет полезен здесь.

ответ

3

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

+1

В моем случае мне нужно больше, чем традиционный синтаксический анализ позволяет. Все мои попытки написать традиционный контекстный свободный парсер упали на их лице по теоретическим соображениям. Я довольно уверен в этом, что мне нужно условное лексирование как минимум. Будет ли применяться ANTLR? – 2008-09-18 18:03:13

+0

У вас есть * lookahead с ANTLR, и если вам нужно, вы можете добавить синтаксику и предикаты к вашей грамматике (существуют также предикаты семантики). Использование antlrwork, это действительно полезно для разработки/отладки грамматики (http://www.antlr.org/works/index.html). На сайте ANTLR есть готовые грамматики. – 2008-09-19 13:39:04

1

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

0

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

4

PySec еще один монадическая анализатор, я не знаю много о нем, но это стоит смотреть на here

7

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

1

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

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