將AST編譯回源代碼我目前正在構(gòu)建用PHP編寫的PHP解析器,因?yàn)樵谖乙郧暗膯栴}..這個解析器本身效果相當(dāng)好。顯然,解析器本身并沒有什么好處(除了靜態(tài)分析)。我想將轉(zhuǎn)換應(yīng)用到AST,然后將其編譯回源代碼。應(yīng)用這些轉(zhuǎn)換并不是什么大問題,正常的訪問者模式應(yīng)該能做到這一點(diǎn)。我目前的問題是,如何將AST編譯回源代碼。我認(rèn)為基本上有兩種可能性:使用一些預(yù)定義的方案編譯代碼保留原始代碼的格式,并僅在已更改的節(jié)點(diǎn)上應(yīng)用1。現(xiàn)在,我想集中精力于1,因?yàn)榈?條似乎很難完成(但是如果你有關(guān)于這方面的提示,我想聽聽它們)。但我不太確定哪種設(shè)計模式可以用來編譯代碼。實(shí)現(xiàn)此功能的最簡單方法是添加->compile方法對所有節(jié)點(diǎn)執(zhí)行。我在這里看到的缺點(diǎn)是,很難更改生成的輸出的格式。要做到這一點(diǎn),需要更改節(jié)點(diǎn)本身。因此,我正在尋找一個不同的解決方案。我聽說訪問者模式也可以用于這個,但我真的無法想象這應(yīng)該如何工作。正如我所理解的訪客模式,你有一些NodeTraverser在所有節(jié)點(diǎn)上遞歸迭代并調(diào)用->visita的方法Visitor..這聽起來非常適合節(jié)點(diǎn)操作,其中Visitor->visit方法可以簡單地更改它所傳遞的節(jié)點(diǎn),但我不知道如何使用它進(jìn)行編譯。一個顯而易見的想法是將節(jié)點(diǎn)樹從葉子迭代到根,并用源代碼替換訪問的節(jié)點(diǎn)。但這似乎不是一個很干凈的解決方案?
3 回答

慕森卡
TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個贊
如果你不喜歡我的定義。我使用prettyprint一詞來包含任何AST到文本轉(zhuǎn)換,無論是強(qiáng)制執(zhí)行標(biāo)準(zhǔn)布局,保留原始布局,還是將兩者混合在同一語言的不同部分,還是混合兩者,因?yàn)闃涫且环N包含一種語言的子樹和另一種語言的任意子樹的混合樹(是的,我有機(jī)器可以無縫地完成所有這些操作)。我對“未解析”并不滿意;雖然它所做的在邏輯上與解析相反,但它實(shí)際上根本不進(jìn)行任何解析,因此這個術(shù)語混淆了
- 3 回答
- 0 關(guān)注
- 879 瀏覽
添加回答
舉報
0/150
提交
取消