Что вам действительно нужно? IMHO - это система преобразования программ , которая позволяет вам анализировать и преобразовывать код, используя шаблоны, выраженные в поверхностном синтаксисе исходного кода (и даже вцелевой язык), чтобы выразить переписанные тексты напрямую.
Вы обнаружите, что даже если вы сможете получить XML-представление дерева Python, усилия по написанию преобразования XSLT / XPath будут больше, чем вы ожидаете;деревья, представляющие реальный код, сложнее, чем вы ожидаете, XSLT - не такая удобная нотация, и она не может напрямую выражать общие условия для деревьев, которые вы хотите проверить (например, два поддерева одинаковы).Последнее осложнение с XML: предположим, что он был преобразован.Как вы восстанавливаете синтаксис исходного кода, с которого пришли?Вам нужен какой-то симпатичный принтер.
Общая проблема, независимо от того, как представлен код, состоит в том, что без информации о областях и типах (где вы можете ее получить) написать правильные преобразования довольно сложно.В конце концов, если вы собираетесь преобразовать python в язык, который использует разные операторы для строки concat и арифметики (в отличие от Java, который использует «+» для обоих), вам необходимо решить, какой оператор генерировать.Так что вам нужна информация о типе, чтобы решить.В Python, возможно, нет типов, но на практике большинство выражений включают в себя переменные, которые имеют только один тип в течение всей их жизни.Поэтому вам также понадобится анализ потока для вычисления типов.
Наш набор инструментов для реинжиниринга программного обеспечения DMS обладает всеми этими возможностями (синтаксический анализ, анализ потока, сопоставление / перезапись шаблонов, prettyprint) и Надежные парсеры для многих языков, включая Python.(Хотя он имеет возможность анализа потока, созданного для C, COBOL, Java, он не создан для Python. Но затем вы сказали, что хотите выполнить преобразование независимо от контекста).
Чтобы выразить свое переписывание в DMSв синтаксисе Python, близком к вашему примеру (что не является Python?)
domain Python;
rule revise_arguments(f:IDENTIFIER,A:expression,B:expression,
C:expression,D:expression):primary->primary
= " \f(\A,(\B),(\C),(\D)) "
-> " \f(\C,(\B),(\D)) ";
Обозначение выше - это язык перезаписи правил DMS (RSL).«...» - это мета-кавычки, которые отделяют синтаксис Python (внутри этих кавычек DMS знает, что это Python из-за объявления нотации домена) от языка DMS RSL.\ N внутри мета-кавычки относится к заполнителям синтаксической переменной именованного нетерминального типа, определенного в списке параметров правила.Да, (...) внутри мета-кавычек есть Python () ... они существуют в синтаксических деревьях, что касается DMS, потому что они, как и остальная часть языка, являются просто синтаксисом.
Приведенное выше правило выглядит немного странным, потому что я пытаюсь следовать вашему примеру как можно ближе, а с точки зрения языка выражений, ваш пример странен именно потому, что в нем есть необычные скобки.
С этим правилом DMS может анализировать Python (используя его синтаксический анализатор Python), например,
foobar(2+3,(x-y),(p),(baz()))
построить AST, сопоставить правило (анализируемое с AST) с этим AST, переписать его в другоеAST соответствует:
foobar(p,(x-y),(baz()))
, а затем довольно распечатывает синтаксис поверхности (действительный) Python обратно.
Если вы хотите, чтобы ваш пример был преобразованием кода LISP, вам понадобитсяГрамматика LISP для DMS (не сложно построить, но у нас нет особых требований к этому), и написать соответствующий синтаксис поверхности:
domain Lisp;
rule revise_form(A:form,B:form, C:form, D:form):form->form
= " (\A,(\B),(\C),(\D)) "
-> " (\C,(\B),(\D)) ";
Вы можете почувствовать это лучше, посмотрев на Алгебра какдомен DMS .
Если ваша цель состоит в том, чтобы реализовать все это в Python ... У меня нет особой помощи.DMS - довольно большая система, и для ее репликации потребуется много усилий.