1 FIRST&FOLLOW
1.1 FIRST集合
First(α) 是可從 α 推導得到的句型的首終結符號的集合

計算FIRST(X)集合算法:
- 計算每個符號X的First(X)集合

-
計算每個符號串 α 的 First(α) 集合
1.2 FOLLOW集合
Follow(A) 是可能在某些句型中緊跟在 A 右邊的終結符的集合

計算FOLLOW(X)集合算法:
-
為每個非終結符 X 計算 Follow(X) 集合
2 LL(1)
如果文法 G 的預測分析表是無沖突的, 則 G 是 LL(1) 文法
對於當前選擇的非終結符, 僅根據輸入中當前的詞法單元即可確定需要使用哪條產生式
預測分析表指明了每個非終結符在面對不同的詞法單元或文件結束符時, 該選擇哪個產生式 (按編號進行索引) 或者報錯
- L : 從左向右 (left-to-right) 掃描輸入
- L : 構建最左 (leftmost) 推導
- 1 : 只需向前看一個輸入符號便可確定使用哪條產生式
2.1 構建預測分析表
先計算FIRST、FOLLOW集合

注:或者關系,兩者都要檢查!
例子:

2.2 改造為LL(1)
2.2.1 提取左公因子

2.2.2 消除左遞歸
-
直接左遞歸的消除方法:
例如:
E → E + T | T
消除后為:
E → T E′
E ′ → + T E′ | ϵ
-
非直接左遞歸
思想:無環圖
例子:
2.3 LL(1)語法分析器偽代碼

3 LR
3.1 什么是LR
L : 從左向右 (Left-to-right) 掃描輸入
R : 構建反向 (Reverse) 最右推導

兩大操作: 移入輸入符號 與 按產生式歸約
主要問題:
- 何時規約?
- 按哪條產生式規約?
3.2 LR分析表


-
例子:棧上的移入與規約
-
問題:在當前狀態 (編號)下, 面對當前文法符號時, 該采取什么動作
思路:可以用自動機跟蹤狀態變化 (自動機中的路徑 ⇔ 棧中符號/狀態編號)
-
何時規約?
必要條件: 當前狀態中, 已觀察到某個產生式的完整右部,也就是句柄
Definition (句柄 (Handle))
在輸入串的 (唯一) 反向最右推導中, 如果下一步是逆用產生式 A → α 將 α 歸約為 A, 則稱 α 是當前句型的句柄。
-
Theorem 存在一種 LR 語法分析方法, 保證句柄總是出現在棧頂
4 LR(0)
4.1 LR(0)文法
如果文法G的LR(0)分析表是無沖突的,則G是LR(0)文法
無沖突:ACTION表中每個單元格最多只有一種操作
-
L : 從左向右 (Left-to-right) 掃描輸入
-
R : 構建反向 (Reverse) 最右推導
-
0 : 歸約時無需向前看
4.2 LR(0)自動機
Definition (LR(0) 項 (Item))
文法 G 的一個 LR(0) 項是 G 的某個產生式加上一個位於體部的點
項指明了語法分析器已經觀察到了某個產生式的某個前綴

Definition (項集)
項集就是若干項構成的集合
句柄識別自動機的一個狀態可以表示為一個項集
Definition (項集族)
項集族就是若干項集構成的集合
句柄識別自動機的狀態集可以表示為一個項集族
Definition (增廣文法 (Augmented Grammar))
文法 G 的增廣文法 G′ 是在 G 中加入產生式 S ′ → S 得到的文法
目的: 告訴語法分析器何時停止分析並接受輸入符號串
當語法分析器面對 $且要使用 S ′ → S 進行歸約時, 輸入符號串被接受
Example:LR(0) 句柄識別自動機(紅圈表示接受狀態)
4.3 構造LR(0)自動機
需要知道的:閉包的計算

-
init
-
演化
-
接受狀態
-
accept狀態
下,遇見$的轉移
千萬不要漏掉accept!
4.4 構造LR(0)分析表
-
先構造出LR(0)自動機,每個自動機的狀態對應LR(0)分析表中的一個狀態
-
根據以下規則,構造LR(0)分析表
-
如果文法 G 的LR(0) 分析表是無沖突的, 則 G 是 LR(0) 文法
5 SLR(1)
Simple LR(1)
5.1 LR(0)存在的問題
LR(0) 分析表每一行 (狀態) 所選用的歸約產生式是相同的
5.2 改進
對LR(0)的規約規則進行改進

6 LR(1)
6.1 LR(0)與SLR(1)存在的問題
-
LR0
-
SLR1
6.2 LR(1)項
Definition (LR(1) 項 (Item))
[A → α · β, a] (a ∈ T ∪ {$}) 此處, a 是向前看符號, 數量為 1
思想: α 在棧頂, 且剩余輸入中開頭的是可以從 βa 推導出的符號串
也就是說,[A → α·, a]只有下一個輸入符號為 a 時, 才可以按照 A → α 進行歸約
6.3 LR(1)自動機
-
LR1閉包計算
-
LR1初始化
-
LR1的GOTO計算
-
LR1自動機構造
6.4 LR(1)分析表

7 LALR(1)
7.1 LR(1)的問題
LR(1) 雖然強大, 但是生成的 LR(1) 分析表可能過大, 狀態過多
LALR(1) : 合並具有相同核心 LR(0)項的狀態 (忽略不同的向前看符號)
7.2 合並核心項

例如,合並圖中的(4,7),(3,6),(8,9)
7.3 引入沖突?
對於 LR(1) 文法, 合並得到的 LALR(1) 分析表是否會引入沖突?
-
不會引入移入/歸約沖突
假設合並后出現沖突,[A → α·, a] 與 [B → β · aγ, b]
則在 LR(1) 自動機中, 存在某狀態同時包含 [A → α·, a] 與 [B → β · aγ, c] (c隨便是什么)
-
可能會引入歸約/歸約沖突