Реализация Parsec на Python?

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

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

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

Обновлено: все мои попытки контекстного анализа потерпели неудачу. По этой причине я не ожидаю, что ANTLR будет здесь полезен.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
13
0
5 351
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

В моем случае мне нужно больше, чем позволяет традиционный синтаксический анализ. Все мои попытки написать традиционный контекстно-свободный синтаксический анализатор провалились по теоретическим причинам. На данный момент я почти уверен, что мне нужно как минимум условное лексирование. Будет ли применяться ANTLR?

Jason Dagit 18.09.2008 22:03

У вас есть * предварительный просмотр с ANTLR, и при необходимости вы можете добавить синтаксис и предикаты в свою грамматику (также существуют предикаты семантики). используйте antlrwork, это действительно полезно для разработки / отладки грамматики (antlr.org/works/index.html). На сайте ANTLR есть и готовые грамматики.

PW. 19.09.2008 17:39

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

Сейчас я исследую PyParsing, он выглядит ближе всего к Parsec из всех, что я видел. Я пока принимаю ваш ответ. Будем надеяться, что PyParsing работает :) Спасибо!

Jason Dagit 18.09.2008 22:07

Я обеспокоен прочтением этого в документации PyParsing: производительность pyparsing может быть медленной для сложных грамматик и / или больших входных строк.

Jason Dagit 18.09.2008 22:13

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

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

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

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

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

Другие вопросы по теме