自上而下語法分析LL(1)

2021-06-05 14:34:50 字數 2295 閱讀 5291

1. 語法分析的地位 --- 是編譯程式的核心部分

2. 語法分析的任務

-- 識別由詞法分析得出的單詞序列是否是給定文法的句子

3. 語法分析的理論基礎

-- 上下文無關文法和下推自動機

4. 語法分析的方式

1) 自上而下語法分析

* 反覆使用不同產生式進行推導以謀求與輸入符號串相匹配

2) 自下而上語法分析

* 對輸入符號串尋找不同產生式進行規約知道文法開始符號

注: 上是指開始符號, 下是指句子本身.

5. 下推自動機(pda)

模型:輸入帶 --->  有限狀態控制器(下推棧) ---> 輸出帶(記錄產生式編號)

1) pda的動作由三個因素來決定: 當前狀態、讀頭、所指向符號、下推棧棧頂符號

2) 乙個輸入串能被pda所接受,僅當輸入串讀完,下推棧變空; 或者輸入串讀完,控制器到達某些終態

3) 正規文法和有限自動機僅適合於描述和識別高階語言的各類單詞,語句可用於上下文無關文法描述,而下推自動機又恰好能識別上下文無關文法所描述的語言,因此上下文無關文法及其對應的下推自動機就成為編譯技術中語法分析的理論基礎.

定義:pda是乙個七元組: ε

1) 所有狀態集

2) 輸入字母表集合

3) 下推棧內字母表集合

4) 對映函式

5) 開始狀態

6) 下推棧的棧初始符號

7) 終態集

棧頂出現非終結符時, 根據輸入字元使用產生式替換棧頂否則使用輸入字元抵消,並轉換當前的狀態.

演算法:1) 棧頂符號x是非終結符, 查詢語法表,找出乙個以x作為左部的產生式,x出棧,並將其右部反序入棧,且輸出帶記下產生式編號 --- 推導

2) 若棧頂符號x是終結符,且讀頭下的符號也是x, 則x出棧, 讀頭指向下乙個符號 -- 匹配

3) 若棧頂符號x是終結符,但讀頭下的符號不是x,則匹配失敗. 退回到上次推導現場(包括棧頂符號、讀頭的指標和輸出帶上的資訊) -- 回溯

4) 回溯後選取另一候選式進行推導,若沒有候選式可選,則進一步回溯。若回溯到開始符號又無候選式可選,則識別失敗

5) 若棧頂空,讀頭也空,則識別成功

問題: 文法不能左遞迴, 無啟發式候選式選取, 無法指出錯誤的確切位置

消除左遞迴:

1、消除直接左遞迴

原文法: e --> e a1 | e a2 | ... | e an | b1 | b2 | ... | bn

消除後: e --> b1 e' | b2 e' | ... | bn e'

e'--> a1 e' | a2 e' | ... | an e' | ε

2、消除間接左遞迴

a)  把所有非終結符號按一定序列排序為e1, e2, ... en;

b) for i=1 to n do /*依次處理每個非終結符號*/

for j=1 to i-1 do /*處理第1個到i-1個*/

若ei --> ej r

則改為ei --> s1 r | s2 r | ... | sk r

其中ej --> s1 | s2 | ... | sk

c) 對ei消除直接左遞迴。

注:非終結符的排列順序不同,結果可能不同。

3、去掉無用符號和無用產生式

1)  p->px|b === p->bp', p'->xp'|ε (替換的只是第乙個產生左遞迴的p)

例: 文法g: e->e+t|t,  t->t*f|f,  f->(e)|i

e->te', e'->+te'|ε

t->ft', t'->*ft'|ε

f->(e)|i

**:1. 求候選式的終結首符集first(p) -- 隨符集

2. 預讀符號. 如果pda中候選式的首符集兩兩不相交,那麼根據預讀符號可以準確的指派產生式

3. 提取公共左因子.  通過反覆提取首符集使其兩兩不相交,但是會引入大量的產生式和ε因子

ll(1) 文法 : **分析表(2維陣列中, 行: 非終結符, 列: 終結符), 使用哪個候選式來進行替換. 必須是無二義性的文法,只是乙個上下文無關文法的子集

判斷是不是ll1文法:

1)消除左遞迴

2)提取公共左因子

3)求first集和follow集

4)a->x|b,  first(x)交first(b) = 空集

遞迴下降分析法

1) 先轉成ll(1)文法

2) 為每個非終結符寫乙個遞迴函式

缺點: 對文法要求高,必須滿足ll(1)文法; 高深度遞迴會影響語法分析效率,速度慢,佔空間多

由於ll文法要求較高,所以編譯一般使用規約(自下而上的分析法)

LL(1)語法分析

ll 1 分析法的功能是利用ll 1 控制程式根據顯示棧棧頂內容 向前看符號以及ll 1 分析表,對輸入符號串自上而下的分析過程。可通過消除左遞迴 提取左因子把非ll 1 文法改造成ll 1 文法。在 ll 1 分析程式設計過程中,最重要的兩個問題是 分析表的構造和相關資料結構的設計。而 分析表的構...

LL 1 語法分析

ll 1 文法分析是自頂向下的分析方法,也可以被看作是輸入串的最左推導過程,ll 1 中1的意思就是可以根據可以根據當前輸入串中的乙個字元來判斷是由哪乙個產生式產生。下面給出文法 e te e ate 代表空集 t ft t mft f i e i 0 1 2 9 a m 首先要構造first集合與...

編譯原理 LL 1 語法分析

直接輸入根據已知文法構造的分析表m,對於輸入的文法和符號串,所編制的語法分析程式應能正確判斷此串是否為文法的句子,並要求輸出分析過程。c 實現如下 includeusing namespace std const int l num 100000 const int max 100 分析表容量 co...