目錄
- 1. 自頂向下分析(Top-Down Parsing)
- 最左推導(Left-most Derivation)
- 最右推導(Right-most Derivation)
- 最左推導和最右推導的唯一性
- 自頂向下語法分析的通用形式
- 預測分析(Predictive Parsing)
- 2. 自底向上分析: 移入規約分析(Shift-Reduce Parsing)
1. 自頂向下分析(Top-Down Parsing)
-
從分析樹的頂部(根節點)向底部(葉節點)方向構造分析樹
-
可以看成是從文法開始符號S推導出詞串w的過程
-
每一步推導中,都需要做兩個選擇
- 替換當前句型中的哪個非終結符
- 用該非終結符的哪個候選式進行替換
最左推導(Left-most Derivation)
自頂向下的語法分析采用最左推導方式.
最右推導(Right-most Derivation)
最左推導和最右推導的唯一性
自頂向下語法分析的通用形式
預測分析(Predictive Parsing)
1.1. 文法轉換
問題1---回溯
問題2---左遞歸導致無限循環
消除直接左遞歸
消除直接左遞歸的一般形式
消除間接左遞歸
合並產生式, 將間接左遞歸變成直接左遞歸再消除
消除左遞歸算法
在每個終結符的循環內:
- 先將所有比該終結符小的(標號小)終結符替換為產生式
- 然后消除改終結符產生式之間的立即左遞歸
提取左公因子(Left Factoring)
推遲進入候選式的選擇, 減少回溯長度
提取左公因式算法
1.2. LL(1)文法
S_文法
如果S_文法包含ε產生式,那么它就成為了LL文法
非終結符的后繼符號集(FOLLOW)
串首終結符集(FIRST)
產生式的可選集(SELECT)
LL(1)文法概念
FIRST集計算
算法:
計算串X1X2…Xn的FIRST集合:
FOLLOW集計算
SELECT集計算
預測分析表
1.3. LL(1)文法的分析方法
遞歸的預測分析法
非遞歸的預測分析法(表驅動)
遞歸的預測分析法vs.非遞歸的預測分析法
預測分析法實現步驟
預測分析法中的錯誤檢測
預測分析法中的錯誤恢復
2. 自底向上分析: 移入規約分析(Shift-Reduce Parsing)
移入-歸約分析的工作過程
移入-歸約分析器可采取的4中動作
移入-歸約分析中存在的問題
選用哪個產生式?
句柄: 句型的最左直接短語
正確的應該是:
(句型的)短語
2.1. LR分析法
LR分析法的基本原理
LR分析器(自動機)的總體結構
LR分析表的結構 及 分析過程
LR分析器的工作過程
LR分析算法
如何構造給定文法的LR分析表
- LR(0)分析
- SLR分析
- LR(1)分析
- LALR分析
2.2. LR(0)分析
LR(0)項目
增廣文法(Augmented Grammar)
LR(0)分析表的構造算法
CLOSURE()函數
GOTO()函數
構造LR(0)自動機的狀態集
LR(0)分析表構造算法
LR(0)自動機的形式化定義
LR(0)分析過程中的沖突
可能存在:
-
移進 - 歸約 沖突
-
歸約 - 歸約 沖突
- 如果LR(0)分析表中沒有語法分析動作沖突,那么給定的文法就稱為LR(0)文法
- 不是所有CFG都能用LR(0)方法進行分析, 也就是說, CFG不總是LR(0)文法
2.3. SLR分析
S: simple
移入優先, 用FOLLOW集來判斷是用哪個產生式歸約
- 解決了一些 移入 - 歸約 沖突
- 解決了 歸約 - 歸約 沖突 (每個相同 產生式左部的FOLLOW集交集為∅)
LR分析的產生式滿足LL分析產生式的條件嗎??
SLR條件
SLR分析表構造算法
SLR分析中的沖突
2.4. LR(1)分析
LR(1)的提出
規范LR(1)項目
等價LR(1)項目
賦值語句文法的LR(1)分析表
LR(1)項目集閉包
GOTO函數
為文法 G' 構造LR(1)項集族
LR(1)自動機的形式化定義
LR分析表構造算法
2.5. LALR分析(lookahead-LR)
基本思想
合並同心項集
合並同心項集時產生 歸約-歸約沖突的例子
合並同心項集后, 雖然不產生沖突, 但可能會推遲錯誤的發現
LALR(1)的特點
2.6. 二義性文法的LR分析
二義性文法分析
二義性算術表達式文法的LR(0)分析器
二義性算術表達式文法的SLR分析表
二義性if語句文法的SLR分析表
**應該保守地使用二義性文法, 並且必須在嚴格控制之下使用, 英文稍有不慎就會導致語法分析器所識別的語言出現偏差. **