本文系 Creating JVM language 翻譯的第二篇。
總的來說,我需要實現如下三個模組:
模組 | 輸入 | 輸出 |
---|---|---|
Lexer(詞法分析器) | 程式碼(文字格式) | Token 序列 |
Parse(語法分析器) | Token 序列 | AST(抽象語法書) |
Compiler(編譯器) | AST | JVM 位元組碼 |
Lexer
詞法分析器的職責是把簡單的文字輸入,識別為 Token
(可以理解為一種記號),程式碼,即文字檔案在詞法分析之前,僅僅是無意義的位元組流而已,但 Token
不同,Token
記錄的型別資訊對接下來的步驟很重要。
Parser
語法分析器的職責是把 Token
序列輸入,組織成具有層次結構的抽象語法樹(AST
), AST
決定了程式碼是被如何執行的。
Compiler
編譯器的職責是遍歷 AST
,並且翻譯成合法的 Java 位元組碼。
例子
假設有表示式 int x=a*5+2
,處理流程如下圖所示:
AST
建立完畢後,就可以用 Compiler
生成位元組碼了。