Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top