你真的想恕我直言,什麼是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