2014-05-06 86 views
0

有誰知道我可以用來從AST生成Python代碼的工具嗎?從定製設計的抽象語法樹生成Python代碼

我已經成功地編寫了一個標記器和一個解析器,但是我正在尋找更多的Pythonic方法來從中生成Python代碼。 我之前使用過LLVMPY,我想知道是否有類似的東西可以用來生成Python代碼而不是LLVM IR

您的建議將不勝感激:-)

編輯

這是 Python的AST。這是來自我自己的語言,所以我知道沒有一種工具可以神奇地理解它。我只是在尋找能夠在產生Source Code的途中遇到我的東西。

例如:

而是連接字符串產生a = 1 + 2的,碰到這樣的a = builder.add(1,2)。基本上任何可以節省我手動生成字符串和處理縮進的痛苦的東西。有這樣的嗎?

我已經消耗了AST的一類,但我發現自己不得不做這樣的事情比比皆是:

... 
elif node.type == "Assign": 
    _buffer = self.descend(node.args[0]) 
    _buffer += self.descend(node.args[1]) 
    _buffer += self.descend(node.args[2]) 
    return _buffer 

elif node.type == "BinOp": 
    _buffer = self.descend(node.args[1]) 
    _buffer += node.args[0] 
    _buffer += self.descend(node.args[2]) 
    return _buffer 
... 

當我要實現像FunctionsClasses大對象這會變得更加tideous。我只是想知道是否沒有更好的方法來做到這一點。

+1

如果有幫助,標準python libraray中有模塊ast。你檢查過了嗎? –

+0

我試圖從我爲實驗寫的玩具編程語言生成Python代碼。我看了看那個模塊,但我看不出有什麼幫助。 – Sthe

+2

當你說「Python代碼」時,你是指文本源代碼還是字節碼?當你說「AST」時,你的意思是Python的AST(如'ast'模塊中實現的)或你自己的語言的AST? – Blckknght

回答

2

有python模塊ast,使這個。如果你正在做自己的tokaniser,你可能只需要評估ast和compile()評估ast。還有一個unparser,它可以從ast生成python代碼,並且可以在python source回購中找到。 unparse.py

+1

答案中肯定有一些指向正確方向的指針,但對於@Sthe提到的玩具語言,Python AST和AST之間沒有任何區別。 –

+2

注意'unparse'模塊的更新(Python 3兼容)版本是[here](http://hg.python.org/cpython/file/default/Tools/parser/unparse.py)。 – Blckknght

+0

我想unparse.py其實就是我在找人。感謝您的幫助 :-) – Sthe