Реализация Parsec на Python?
-
01-07-2019 - |
Вопрос
Недавно я написал синтаксический анализатор на 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 это здорово и имеет дополнительное преимущество при работе на нескольких языках.