我希望能夠在給定AST描述的情況下執行python的代碼生成。Python代碼生成器
我已經完成了對C的靜態分析,並且在python中構建了AST訪問者,所以我覺得操作語法樹比較舒服,但是我從來沒有嘗試過代碼生成,並且試圖確定生成Python代碼的最佳實踐。
具體來說,我很喜歡關於如何自動生成代碼的指針,或者任何指向Python的指向Python的指針,這可以使此任務變得更簡單。
我的最終目標是嘗試類似於csmith或使用Python代碼符合PEP8的工具。
我希望能夠在給定AST描述的情況下執行python的代碼生成。Python代碼生成器
我已經完成了對C的靜態分析,並且在python中構建了AST訪問者,所以我覺得操作語法樹比較舒服,但是我從來沒有嘗試過代碼生成,並且試圖確定生成Python代碼的最佳實踐。
具體來說,我很喜歡關於如何自動生成代碼的指針,或者任何指向Python的指向Python的指針,這可以使此任務變得更簡單。
我的最終目標是嘗試類似於csmith或使用Python代碼符合PEP8的工具。
您可能想看看2to3
工具,由Python代碼開發人員自行將Python 2代碼轉換爲Python 3代碼。該工具首先將代碼解析爲樹,然後從該樹中吐出「固定」的Python 3代碼。
這可能是一個很好的開始,因爲這是核心開發人員認可的「官方」Python工具,也是推薦的Python 2至3遷移路徑的一部分。
備選地,檢查出codegen.py module,其產生Python代碼從Python的ast
回來。
也是這個SO question見,這可能與你(我不是將其標記爲一個重複的,因爲我不知道的問題的範圍重疊的100%)
自動代碼生成常用於做以下幾種方式:包含代碼片段,片段佔位
恕我直言,更好的做法是:
幾乎沒有人做後者,因爲這些工具大多是不存在的。
Python的2to3工具提供(我認爲)目標AST和漂亮的打印。
但你沒有問的問題是「從什麼產生?」不知何故,你必須抽象地指定 你想要什麼(或它不是一個勝利)。你的工具必須能夠以某種方式讀取該規範。
許多代碼生成方案包括編寫調用上述生成機制的過程代碼;程序代碼充當隱式規範。閱讀規範是「容易的」;它只是代碼生成器使用的語言中的代碼。
某些代碼生成方案使用某種圖形結構來提供一個框架,在該框架上掛上規範片段,以驅動代碼生成。 UML類圖是一個典型的例子。這些計劃並不容易,您需要一個「規格閱讀器」(例如,UML圖表閱讀器又名XMI等等,或者如果你不使用UML,某種規範解析器)。
Python 2to3工具使用Python2分析器來讀取「spec」。如果你想從Python2生成代碼,那很好。我懷疑你不想這樣做。
最佳實踐方法是將讀/分析/遍歷規範的能力與針對目標語言生成AST的能力統一起來。
我們的DMS Software Reengineering Toolkit是一個通用的程序分析和轉換系統。它將「規範」(您可以定義的語法實例)解析爲AST;它還可以讓你使用程序代碼(如上面所示)或使用模式匹配/替換(對DMS非常獨特)爲任何這些語法構建任意AST。 DMS語言前端的一部分是一個漂亮的打印機,可以從AST重新生成文本(這些通過往返代碼進行測試:解析到AST,相同的AST,最好是相同的文本)。
如果您的語法不知道DMS,它具有非常好的解析器和prettyprinter生成器,以及其他分析程序的支持機制。所有這些額外的機器通常不適用於傳統的解析器生成器,或者僅包含簡單的「AST」包。 (我不知道2to3是什麼)。
這與Python的相關性是DMS有Python front end以及grammars for many other languages。
所以,你可以解析你的規範,並使用AST生成Python代碼,然後使用prettyprinting。
您是使用自定義AST還是創建Python AST(使用例如'ast'模塊)? –
最有可能是Python AST,使用'ast'模塊。我注意到ANTLR已經迎合了python的一點點,這似乎是一種可行的方式,但似乎更堅持使用Python內部結構。 – mvanveen