手工打造編譯器之語法分析器1

2021-05-23 17:14:56 字數 2308 閱讀 6625

語法分析:分析程式的短語結構

文法描述一種語言。文法是如下產生式(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...