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

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

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

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

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

24
задан Michael J. Barber 25 October 2011 в 09:39
поделиться

1 ответ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4
ответ дан 29 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: