你真的想恕我直言,什么是program transformation system,它允许您解析和使用源代码(甚至目标语言)的表面语法表达的方式直接表达的重写变换代码。
你会发现,即使你能够亲自使用Python树的XML表示,编写XSLT/XPath转换的努力也超出了你的期望;代表真实代码的树比你想象的要混乱,XSLT不是那种方便的符号,它不能直接表达你想检查的树的常见条件(例如,两棵子树是相同的)。与XML最后的复杂化:假设它已经被转换。你如何重新产生源代码的语法?你需要一些漂亮的打印机。
不管代码是如何表示的,一个普遍的问题是没有关于作用域和类型的信息(在哪里可以得到它),编写正确的转换是非常困难的。毕竟,如果您要将python转换为使用不同运算符进行字符串连接和算术运算的语言(不像Java对两者使用“+”),您需要能够决定要生成哪个运算符。所以你需要类型信息来决定。 Python可以说是无类型的,但实际上大多数表达式涉及的变量在整个生命周期中只有一种类型。所以你还需要流量分析来计算类型。
我们DMS Software Reengineering Toolkit具有所有这些能力(分析,流程分析,模式匹配/重写,以漂亮的方式),并robust parsers很多语言包括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)。 “...”是元语言,它们用于从DMS RSL语言中分离出Python语法(在这些引号中,DMS知道它是Python,因为域名符号声明)。元引用内部的\ n是指在规则参数列表中定义的指定非终结符类型的语法变量占位符。是的,(...)在metaquotes里面是Python()......就DMS而言,它们存在于语法树中,因为它们与语言的其他部分一样,只是的语法。
上面的规则看起来有点奇怪,因为我试图尽可能接近你的例子,而从表达式语言的角度来看,你的例子很奇怪,因为它确实有非同寻常的括号。
有了这个规则,DMS可以像
foobar(2+3,(x-y),(p),(baz()))
构建解析的Python(使用Python的解析器)的AST,对阵的是AST的(解析到AST)规则,它改写到另一个AST相应到:
foobar(p,(x-y),(baz()))
然后漂白打印表面语法(有效)python退出。
如果你打算你的例子是在LISP代码的转换,你 需要的DMS(并不难打造,但我们并没有太多 呼吁这)一个LISP语法,并写出相应的表面语法:
domain Lisp;
rule revise_form(A:form,B:form, C:form, D:form):form->form
= " (\A,(\B),(\C),(\D)) "
-> " (\C,(\B),(\D)) ";
通过查看Algebra as a DMS domain,您可以获得更好的感受。
如果你的目标是在Python中实现所有这些......我没有太多的帮助。 DMS是一个相当大的系统,它将是一个很大的努力复制。
喜艾拉。我想我已经看到过你这样做之前:)第三方添加新的语言前端有多容易?你的授权故事是什么?我认为它是封闭的源码。 – bukzor 2012-01-19 02:16:29
DMS旨在增加新的语言,支持构建任意软件分析和转换工具。它也被设计成被第三方使用*。世界是一个比我们能够解决的问题更大的地方。 DMS拥有完整的参考手册甚至培训课程,如果您需要的话。有关商业细节,请联系我的公司;您可以从网站轻松找到它。 – 2012-01-19 06:30:03
是的,DMS是封闭的来源,并获得商业许可。为了让您“惊讶”,许多人认为它很贵。每个人都有意见。我们认为它的功能很便宜,这是实际使用所需要的。如果您检查可用解决方案,您会发现供应量非常薄,因为它很难做到所有事情。铿锵有一些有趣的重叠,但不做Python。 Python有一个AST包,但不处理源到源重写。所以,你可以有一个免费的和一个非解决方案,或者你可以有最好的答案,几个博士可以包装15年线性年。 – 2013-07-01 20:06:29