語法分析:分析程式的短語結構
文法描述一種語言。文法是如下產生式(production)的集合:
symbol
àsymbol,…,symbol
出現在左部的符號是非終結符(nonterminate),出現在右部的排除掉非終結符就是終結符(terminate)。
計算first,follow,nullable集合,演算法見書中描述。
文法有很多中。大致分為無二義性文法和二義性文法。如過語句通過文法只有一種解釋,該文法就是無二義性文法,否則是二義性文法。
無二義性文法有分為ll文法,lr文法,lalr文法等。大部分編譯器採用lalr文法,本程式採用lr文法。
對tiger中的語法做了如下一些修改,有了為了文法寫起來簡單,有的在lr文法(見書中解釋)上實現困難:
(1)條件語句必須是if-then-else語句的配對。
(2)順序執行的語句必須帶有』;』。即exp;,…,exp;。
(3)不支援負數。如-4,要用函式實現,如neg(4).
具體的文法如下
program :let_exp $
// decs
decs : null
| dec
| dec decs
dec : type_dec
| var_dec
| func_dec
// var_dec
var_dec : var id := exp
| var id : typeid := exp
// type_dec
// after this id becomes type_id
type_dec : type id = ty
| type typeid = ty
ty : typeid
| array of typeid|
tyfields : null
| id : typeid
| id : typeid , tyfields
// func_dec
func_dec : function id ( tyfields ) = exp
| function id ( tyfields ) : typeid = exp
// exp
exp : op_exp
| let_exp
| ( exps )
| var_exp := exp
| typeid
| typeid [ op_exp ] of exp
| string
| while exp do exp
| for id := op_exp to op_exp do exp
| break
| if exp then exp else exp
// let exp
let_exp : let decs in exps end
// var exp
var_exp : id
| var_exp . id
| var_exp [ exp ]
// 0 or more exp
exps : null
| exp ;
| exp ; exps
// op exp
op_exp : op_exp & log_exp
| op_exp | log_exp
| log_exp
log_exp : alg_exp
| log_exp = alg_exp
| log_exp <= alg_exp
| log_exp >= alg_exp
| log_exp <> alg_exp
| log_exp < alg_exp
| log_exp > alg_exp
alg_exp : alg_exp + term
| alg_exp - term
| term
term : term * factor
| term / factor
| factor
factor : ( op_exp )
| var_exp
| int
| call_exp
| nil
// record_exp
id_exps: null
| id = exp
| id = exp , id_exps
// call_exp
call_exp : id ( params )
params : null
| exp
| exp , params
手工打造編譯器之詞法分析器3
逆波蘭表示式,可以去除括號 建立適合計算機處理的表示式,該表示式有正確的運算優先順序。正常的表示式 逆波蘭表示式 a b a,b,a b c a,b,c,a b c d a,b,c,d,a d b c a,d,b,c,a 1 3 a 1,3 運算的時候,遇到可以歸併的就歸併計算。如 5 4 3 2 ...
手工打造編譯器之語義分析1
語義分析階段的任務是 將變數的定義與它們的各個使用聯絡起來,檢查每乙個表示式是否有正確的型別,並將抽象語法變為更簡單的更適合生成機器 的表示。符號表是繫結的集合。這些繫結是識別符號與其含義的一種對映關係。因為作用域的改變,符號表也隨之改變。如下面的c語言 struct m 上面 的符號表可能為 t1...
編譯原理語法分析器
採用至少一種句法分析技術 ll 1 slr 1 lr 1 或lalr 1 對類高階語言中的基本語句進行句法分析。闡述句法分析系統所要完成的功能。1 能識別以下幾類語句 宣告語句 包括變數宣告 陣列宣告 記錄宣告和過程宣告 表示式及賦值語句 包括陣列元素的引用和賦值 分支語句 if then else...