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

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文法要求較高,所以編譯一般使用規約(自下而上的分析法)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章