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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Кроме того, проверьте модуль codegen.py, который возвращает код Python из Python ast.

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

Ответ 2

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

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

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

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

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

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

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

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

В некоторых схемах генерации кода используется некоторая структура графика, чтобы обеспечить фрейм, на котором висят фрагменты спецификации, которые приводят к генерации кода. Классы классов UML являются классическим примером. Эти схемы не так просты; вам нужен "читатель спецификаций" (например, читатель UML-диаграммы или XMI или некоторые такие, или если вы не используете UML, какой-то спецификатор парсера).

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

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

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

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

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

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