7

我正在嘗試學習構建一個簡單的編譯器作爲愛好。我的目標是Java虛擬機。將抽象語法樹轉換爲字節代碼

我已經用Eclipse的ANTLR插件編寫了一個簡單的語法。

有人告訴我,Antlr生成的AST上有一些方法節點,必須調用它。 我打算使用ASM來生成字節碼。 那麼什麼是方法節點以及如何從ASM中調用它並使其訪問方法指令?

那麼編譯器的語義分析器呢。應該手動寫入還是有任何生成器?

回答

3

你在這裏問很多無關的問題。根據您定義的語言,您的語言中可能會有一個方法節點,或者如果您的語言無條件編譯爲main(String[])方法,則不會有任何方法節點。

有多種方法可將AST轉換爲目標語言。大多數情況下,您不會直接生成代碼,而是爲您的目標平臺生成AST,並使用樹行程器使用漂亮的打印機生成代碼。

語義分析編譯器的編程。在語法層次上閱讀和理解輸入是解析。你將需要自己編寫語義分析器,否則你根本就沒有編寫過編譯器。 ;-)

我推測你用Jasmin來編譯彙編代碼?一個很好的開始是爲你的輸入語言和目標語言(Jasmin)編寫語法,並考慮哪些輸入結構會呈現什麼輸出。如何在Jasmin中編寫一個for i := 1 to 10循環?根據需要解決小問題並擴展編譯器,但慢慢地,儘早徹底地測試新實施的轉換。

一個非常良好的閱讀:Let's Build a Compiler, by Jack Crenshaw

+1

最近,我得到了[stephen chin](http://steveonjava.com/)的幾乎相同的答案,Jack Crenshaw的Let's Build a Compiler,看起來非常好,我將開始閱讀它。 – Gautam