Генератор кода Python - PullRequest
       31

Генератор кода Python

24 голосов
/ 25 октября 2011

Я хочу иметь возможность выполнять генерацию кода на Python, используя описание AST.

Я провел статический анализ C и собрал посетителей AST на python, поэтому я чувствую себя относительно комфортно, манипулируя синтаксическим деревом, но я никогда раньше не пытался генерировать код и пытаюсь определить лучшие практики для генерации кода на python.

В частности, я хотел бы получить указатели о том, как обычно выполняется автоматическая генерация кода, или любые указатели на библиотеки, ориентированные на python, которые могут упростить эту задачу.

Моя конечная цель - попробовать что-то похожее на csmith или инструмент для приведения кода Python в соответствие с PEP8 .

Ответы [ 2 ]

17 голосов
/ 25 октября 2011

Возможно, вы захотите взглянуть на инструмент 2to3, разработанный разработчиками кода Python для автоматического преобразования кода Python 2 в код Python 3. Инструмент сначала анализирует код в дереве, а затем выплевывает «фиксированный» код Python 3 из этого дерева.

Это может быть хорошим началом, потому что это "официальный" инструмент Python, одобренный разработчиками ядра, и часть рекомендованного пути миграции Python 2 на 3.

В качестве альтернативы, посмотрите модуль codegen.py , который генерирует код Python обратно из ast.

Python.

См. Также этот ТАК вопрос , который может иметь отношение к вашему вопросу (я не отмечаю его как дубликат, поскольку не уверен, что рамки вопросов перекрываются на 100%)

4 голосов
/ 29 марта 2012

Автоматическая генерация кода обычно выполняется следующими способами:

  • Печать операторов, содержащих фрагменты кода
  • Текстовые шаблоны с заполнителями (например, макросы)

ИМХО, лучшая практика такова:

  • Построение AST для целевого фрагмента, а затем довольно распечатка

Вряд ли кто-нибудь сделает последнее, потому что инструменты в основном отсутствуют.

Инструмент Python 2to3 обеспечивает (я думаю) целевую AST и красивую печать.

Но вопрос, который вы не задавали, это «порождать из чего?»Каким-то образом вы должны указать абстрактно, что вы хотите сгенерировать (или это не победа).И ваш инструмент должен каким-то образом читать эту спецификацию.

Многие схемы генерации кода состоят из написания процедурного кода, который вызывает вышеуказанные механизмы генерации;процедурный код действует как неявная спецификация.Это «легко» читать спецификацию;это просто код на языке, используемом генератором кода.

Некоторые схемы генерации кода используют некую структуру графов, чтобы обеспечить фрейм, на котором висят фрагменты спецификации, которые управляют генерацией кода.Диаграммы классов UML являются классическим примером.Эти схемы не так просты;вам нужен «читатель спецификаций» (например, читатель диаграмм UML или XMI или что-то подобное, или если вы не используете UML, какой-то анализатор спецификаций), а затем вам нужно что-то пролезть через только что прочитанную спецификацию в некоторыхполезный порядок (UML - это график, есть много разных способов его посещения), который вызывает вызовы шагов генерации кода.

Инструмент Python 2to3 использует синтаксический анализатор Python2 для чтения «спецификации».Если вы хотите сгенерировать код из Python2, это будет хорошо.Я подозреваю, что вы не хотите этого делать.

Подход, основанный на передовом опыте, объединяет способность читать / анализировать / просматривать спецификации со способностью создавать AST для целевого языка.

Наш инструментарий реинжиниринга программного обеспечения DMS - это система анализа и преобразования программ общего назначения.Он разбирает «спецификации» (экземпляры грамматик, которые вы можете определить для него) в AST;это также позволит вам создавать произвольные AST для любой из этих грамматик, используя либо процедурный код [как показано выше], либо используя сопоставление / замену шаблона (в значительной степени уникальное для DMS).Часть интерфейса языка DMS - это симпатичный принтер, который может регенерировать текст из AST (они проверяются с помощью кода с циклической обработкой: анализ AST, prettyprint AST, лучше быть тем же текстом).

В случае, если ваша грамматика не известна DMS, она имеет очень хорошие генераторы синтаксического анализатора и prettyprinter, а также другие механизмы поддержки для анализа программ.Все это дополнительное оборудование обычно не доступно с классическими генераторами синтаксических анализаторов или с простым пакетом «AST».(Я не знаю, что в 2to3).

Актуальность этого для Python заключается в том, что DMS имеет внешний интерфейс Python , а также грамматики для многих других языков .

Таким образом, вы можете использовать DMS для анализа вашей спецификации и для генерации кода Python с использованием AST, после чего, наконец, следует prettyprinting.

...