圖 8. 3 編譯器的六大階段 高階語言 sum = sum + i 掃描器 (Lexer) 剖析器 (Parser) 詞彙串列 sum = sum + i id = id + id STMT 語法樹 sum: id: int 語意分析 (Semantic Analysis) = EXP: int ITEM: int 語意樹 + i: id: int sum: id: int 中間碼產生 (P-code Generator) 中間碼 最佳化 (Optimization) 組合語言產生 (ASM generator) 組合語言 ITEM: int + = sum T 0 i ADD R 1, R 2, R 1 T 0 sum
圖 8. 10 <範例 8. 1> 剖析到 sum=0 時 的語法樹與堆疊結構 堆疊 (Stack) PROG Base. List BASE STMT EXP STMT sum: id ITEM = EXP ITEM 0: number 成 長 方 向
語意分析的範例 STMT sum: id = ITEM EXP + sum: id STMT 語意分析 sum: id: int ITEM i: id (a) 語法樹 圖 8. 11 語意分析:將語法樹標註上節點型態 = ITEM: int EXP: int + sum: id: int (b) 語意樹 ITEM: int i: id: int
圖 8. 15 GNU 編譯器的流程 C C++ GENERIC (剖析樹) … Parsing Generic converter Gimplify GIMPLE (中間碼) Tree SSA optimizer RTL generator RTL (中間碼) RTL optimizer ASM generator 組合語言
Gimple
圖 8. 3 編譯器的三大階段 – 掃描、剖析、程式碼產生 高階語言程式 (Source code) sum = sum + i * i 掃描器 (Lexer) sum = sum + i * i id = id + id * id 一連串的詞彙 stmt (A sequence of tokens) 剖析器 (Parser) sum: id = Exp Term + Term * 剖析樹 (Parsing tree) Factor Item 程式產生 (Code Generation) sum: id i: id 目的程式碼 (Target code) * + = i sum t 2 i t 1 t 2 sum Factor