Анализатор Python для Python-подобного языка - PullRequest
13 голосов
/ 24 февраля 2012

Я хочу написать фильтр импорта или препроцессор 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.

Есть предложения?

Ответы [ 3 ]

9 голосов
/ 24 февраля 2012

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

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

2 голосов
/ 24 февраля 2012

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

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

1 голос
/ 05 апреля 2017

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

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

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

Фактически, уже есть пример грамматики Python и парсер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...