Spring入門學習---03
阿新 • • 發佈:2021-11-03
目錄
- 1. 自頂向下分析(Top-Down 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)
產生式的可選集(SELECT)
串首終結符集(FIRST)
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分析中的衝突
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分析表
**應該保守地使用二義性文法, 並且必須在嚴格控制之下使用, 英文稍有不慎就會導致語法分析器所識別的語言出現偏差. **