2016-07-07 197 views
2

如果我有AST並對其進行修改,我可以使用StringTemplates生成修改的AST的源代碼嗎?使用Antlr4和StringTemplates從AST生成源代碼

我已成功實施Antlr4的語法。它生成源代碼的AST,並使用Visitor Class來執行所需的操作。然後,我修改了AST中的某些內容,並且希望爲該修改後的AST生成源代碼。 (我相信它被稱爲漂亮打印?)。

建立在StringTemplates中的Antlr是否具有完成此功能的所有功能?應該從哪裏開始(實用建議非常受歡迎)?

回答

0

你可以走樹並使用字符串模板(或者甚至是平淡的字符串打印)來吐出相當於文本的文本,以在一定程度上再現源文本。

但是您會發現以比現實更難的方式再現源文本。如果您想要原始程序員不會拒絕的代碼,您需要:

  • 保留註釋。我不認爲ANTLR AST會這樣做。
  • 生成保留原始縮進的佈局。
  • 保留基數,前導零計數和文字值的其他的「格式」屬性
  • Renerate字符串以合理的越獄

做這一切也都是棘手。看到我的回答How to compile an AST back to source code瞭解更多詳情。 (古怪,the ANTLR guy suggests not using an AST at all;我猜這是因爲字符串模板只對ANTLR 工作分析樹,其結構ANTLR瞭解到,與AST的這是什麼你回家軋)

如果你得到這一切的權利,你可能會發現修改parse tree/AST比看起來更難。對於複雜語言中幾乎任何有趣的任務,您需要從樹中提取的不重要的信息(例如,這個標識符的含義是什麼?,這個變量在哪裏使用?,...)我打電話給這個問題Life After Parsing。我的主要觀點是,需要很多機器來修改AST並重新生成代碼;瞭解你的項目的規模。

+0

感謝您的回答。我知道這不是一件容易的事。鄒還有一些關於如何開始的實用建議? – 50k4

+0

如果你堅持自己做,那麼考慮到你已經有了一個解析器,我爲鏈接打印的頁面非常好。如果你不想自己完成所有這些工作,你應該得到一個程序轉換系統(PTS),其中所有的基本工作已經完成,讓你專注於你的變更任務,而不是建立所有的基礎設施。有關可能的選擇,請參閱http://en.wikipedia.org/wiki/Program_transformation。 –