我正在嘗試學習構建一個簡單的編譯器作爲愛好。我的目標是Java虛擬機。將抽象語法樹轉換爲字節代碼
我已經用Eclipse的ANTLR插件編寫了一個簡單的語法。
有人告訴我,Antlr生成的AST上有一些方法節點,必須調用它。 我打算使用ASM來生成字節碼。 那麼什麼是方法節點以及如何從ASM中調用它並使其訪問方法指令?
那麼編譯器的語義分析器呢。應該手動寫入還是有任何生成器?
我正在嘗試學習構建一個簡單的編譯器作爲愛好。我的目標是Java虛擬機。將抽象語法樹轉換爲字節代碼
我已經用Eclipse的ANTLR插件編寫了一個簡單的語法。
有人告訴我,Antlr生成的AST上有一些方法節點,必須調用它。 我打算使用ASM來生成字節碼。 那麼什麼是方法節點以及如何從ASM中調用它並使其訪問方法指令?
那麼編譯器的語義分析器呢。應該手動寫入還是有任何生成器?
你在這裏問很多無關的問題。根據您定義的語言,您的語言中可能會有一個方法節點,或者如果您的語言無條件編譯爲main(String[])
方法,則不會有任何方法節點。
有多種方法可將AST轉換爲目標語言。大多數情況下,您不會直接生成代碼,而是爲您的目標平臺生成AST,並使用樹行程器使用漂亮的打印機生成代碼。
語義分析是編譯器的編程。在語法層次上閱讀和理解輸入是解析。你將需要自己編寫語義分析器,否則你根本就沒有編寫過編譯器。 ;-)
我推測你用Jasmin來編譯彙編代碼?一個很好的開始是爲你的輸入語言和目標語言(Jasmin)編寫語法,並考慮哪些輸入結構會呈現什麼輸出。如何在Jasmin中編寫一個for i := 1 to 10
循環?根據需要解決小問題並擴展編譯器,但慢慢地,儘早徹底地測試新實施的轉換。
一個非常良好的閱讀:Let's Build a Compiler, by Jack Crenshaw。
最近,我得到了[stephen chin](http://steveonjava.com/)的幾乎相同的答案,Jack Crenshaw的Let's Build a Compiler,看起來非常好,我將開始閱讀它。 – Gautam