Парсер Python для языка, подобного Python

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

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

Таким образом, мои требования:

  1. Parser написан на Python или имеет привязки Python.
  2. Поставляется с грамматикой Python, которую я могу настроить, или вы можете легко использовать грамматику Python, доступную в другом месте (например, http://docs.python.org/reference/grammar.html ).
  3. Может пересортировать AST после его преобразования.
  4. Не должно быть слишком ужасающим для работы с API-интерфейсом.

Какие-либо предложения?

Первое, что приходит на ум, – lib2to3 . Это полная реализация Python на основе чистого Python-анализатора. Он читает файл грамматики Python и анализирует исходные файлы Python в соответствии с этой грамматикой. Он предлагает отличную инфраструктуру для выполнения операций с АСТ и написания хорошо отформатированного кода Python – ведь цель состоит в том, чтобы преобразовать между двумя языками, подобными Python, с немного разными грамматиками.

К сожалению, у него отсутствует документация и не гарантирует стабильный интерфейс. lib2to3 не менее существуют проекты, которые строятся поверх lib2to3 , а исходный код вполне читабельен. Если стабильность API является проблемой, вы можете просто ее разветвить.

Мне нравится SimpleParse много, но я никогда не пытался его кормить грамматикой Python (BTW, это детерминированная грамматика?). Если он задохнется, PLY выполнит эту работу.

См. Эту компиляцию о инструментах синтаксического анализа Python.

Я бы порекомендовал вам проверить мою библиотеку: https://github.com/erezsh/lark

Он может анализировать ВСЕ контекстно-свободные грамматики, автоматически создает AST (с номерами строк и столбцов) и принимает грамматику в формате EBNF, который считается стандартом.

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

На самом деле, уже есть пример грамматики и парсера python