我一直感興趣的編譯器/解釋器設計/實施,只要我一直在編程(只有5年了),它總是看起來像「魔術師」在幕後,沒有人真正談論(我知道的至少2個操作系統開發論壇,但我不知道任何社區的編譯器/解釋器/語言開發)。無論如何,最近我決定開始自己的工作,希望能夠擴展我對整體編程的知識(嘿,這很有趣:)。所以,基於我有限的閱讀材料和維基百科,我已經爲編譯器/解釋器開發了這個組件概念:什麼是抽象語法樹/是否需要?
源代碼 - >詞法分析 - >抽象語法樹 - >句法分析 - >語義分析 - >代碼生成 - >可執行代碼。
(我知道有更多的代碼生成和可執行代碼,但我還沒有得到那麼遠,:)
有了這樣的認識,我創建了一個非常基本的詞法分析器(在Java中)取從源文件輸入,並將令牌輸出到另一個文件中。樣品輸入/輸出應該是這樣的:
輸入:
int a := 2
if(a = 3) then
print "Yay!"
endif
輸出(從詞法分析器):
INTEGER
A
ASSIGN
2
IF
L_PAR
A
COMP
3
R_PAR
THEN
PRINT
YAY!
ENDIF
個人而言,我認爲這將是很容易從那裏去語法/語義分析,甚至可能產生代碼,這引起了我的質疑:爲什麼使用AST,似乎我的詞法分析器的工作做得很好?然而,我用來研究這個主題的100%的資料似乎都堅信這是任何編譯器/解釋器的必要組成部分。我是否錯過了AST的真正意義(一個顯示程序邏輯流程的樹)?
TL; DR:目前在航線開發編譯器,完成了詞法分析,在我看來,像輸出將使容易句法分析/語義分析,而不是做一個AST。那爲什麼要用一個?我是否錯過了一點?
謝謝!
有許多編譯器和麪向語言的資源。從http://lambda-the-ultimate.org/開始 – 2012-08-16 12:40:17