Парсер Python для языка, подобного Python
Я хочу написать фильтр импорта Python или препроцессор для исходных файлов, которые по сути являются Python с дополнительными языковыми элементами. Цель состоит в том, чтобы прочитать исходный файл, проанализировать его на абстрактное синтаксическое дерево, применить некоторые преобразования для реализации новых частей языка и написать действительный источник Python, который затем может быть использован CPython. Я хочу написать эту вещь в Python и ищу лучший парсер для задачи.
Парсер, встроенный в Python, не подходит, потому что он требует, чтобы исходные файлы были реальными Python, которых они не будут. Существует множество парсеров (или генераторов синтаксического анализатора), которые будут работать с Python, но трудно сказать, что является лучшим для моих потребностей без целой серии исследований.
Итак, мои требования:
- Parser написан на Python или имеет привязки Python.
- Поставляется с грамматикой Python, которую я могу настроить, или вы можете легко использовать грамотную грамматику Python, доступную в другом месте (например, http://docs.python.org/reference/grammar.html).
- Может преобразовать АСТ после его преобразования.
- Не должно быть слишком ужасающим для работы с API-интерфейсом.
Любые предложения?
Ответы
Ответ 1
Первое, что приходит в голову, - lib2to3
. Это полная реализация Python на основе чистого Python-анализатора. Он читает файл грамматики Python и анализирует исходные файлы Python в соответствии с этой грамматикой. Он предлагает отличную инфраструктуру для выполнения манекенов AST и записи красиво отформатированного кода Python - ведь цель состоит в том, чтобы преобразовать между двумя языками Python с немного разными грамматиками.
К сожалению, ему не хватает документации и не гарантирует стабильный интерфейс. Тем не менее проекты, которые строятся поверх lib2to3
, и исходный код, вполне читабельны. Если стабильность API является проблемой, вы можете просто ее разветкить.
Ответ 2
Мне нравится SimpleParse, но я никогда не пытался его кормить Python gramma (BTW, это детерминированная грамматика?). Если он задыхается, PLY выполнит эту работу.
См. эту компиляцию о инструментах синтаксического анализа Python.
Ответ 3
Я бы порекомендовал вам проверить мою библиотеку: https://github.com/erezsh/lark
Он может анализировать ВСЕ контекстно-свободные грамматики, автоматически создает AST (с номерами строк и столбцов) и принимает грамматику в формате EBNF, который считается стандартным.
Он легко анализирует язык, такой как Python, и может делать это быстрее, чем любая другая библиотека синтаксического анализа, написанная на Python.
На самом деле уже существует пример грамматики питона и parser