Подтвердить что ты не робот

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

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

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

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

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

Любые предложения?

4b9b3361

Ответ 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