最近在復習編譯原理,考試之前以為自己懂了,眼高手低就沒去實踐。結果一考試出問題了。。。。
學習就要腳踏實地,容不得半點模糊。憑着僥幸心理很危險的。以后要引以為戒啊。
特別寫出這篇文章 :一來總結一下這幾天的收獲。二來與君共勉。
一、概念
1.概念解釋
1、活前綴:不包含句柄右側任一符號的規范句型的前綴稱為該句型的活前綴。
例如:Bab是下面那個文法的一個句型,其中b是句柄。
那么針對這個句型的活前綴有:ε、B、Ba 和Bab
(其實,LR分析器的工作過程實際上就是逐步產生規范句型的活前綴。
如果能構造出一個識別文法所有規范句型活前綴的確定有窮自動機即DFA,就能很方便的構造出LR分析表)
2、LR(0)項目:右部某位置上標有圓點的產生式稱為相應文法的一個LR(0)項目
注意:A --> ε 只對應一個項目 A -->
.
(LR(0)項目描述了活前綴和句柄的不同識別狀態)
3、ε-可達:從 S' --> .S 出發,不必再識別任何符號就可以到達 S --> .BB,就稱 S --> .BB是從
S' --> .S 出發 ε-可達的。
4、項目集閉包:用Item0表示DFA的初始狀態,對應分析的開始,並期待着逐步將輸入符號串
歸約為開始符號S‘。因此將S' --> .S 放到 Item0 中,意即等待歸約出S,且目前尚未
得到S的任何符號。
Item0 = CLOSURE({S' --> .S}) = {S' --> .S,S --> .BB,B --> .aB,B --> .b}
該項目集合中所有的項目都是從S' --> .S 出發 ε-可達的,稱為{S' --> .S}的項目集閉包
(每個項目集閉包對應着分析器的一個狀態)
5、后繼項目:項目 A --> αX.β 稱為 A --> α.Xβ 的后繼項目
6、后繼項目集:假定Item0是文法G的一個LR(0)項目集,
則稱 GO(Item0,X) = CLOSURE({A --> αX.β}) 為 Item0 關於X的后繼項目集。
GO為項目集的轉移函數。
7、項目集規范族:項目集的全體
2.例子
文法:
S --> BB
B --> aB
B --> b
二、實現步驟
1.擴展文法
S' --> S
S --> BB
B --> aB
B --> b
2.求出項目集規范族
Item0 = CLOSURE({S' --> .S}) = {S' --> .S,S --> .BB,B --> .aB,B --> .b}
Item1 =GO(Item0,S) = CLOSURE({S' --> S.}) = {S' --> S.}
Item2 = GO(Item0,B) = CLOSURE({S --> B.B}) = {S --> B.B,B --> .aB,B --> .b}
Item3 = GO(Item0,a) = CLOSURE({B --> a.B}) = {B --> a.B,B --> .aB,B --> .b}
Item4 = GO(Item0,b) = CLOSURE({B --> b.}) = {B --> b.}
至此Item0已經遍歷完,開始遍歷下一個,由於Item1圓點已經到達末尾,所以跳過Item1。
Item5 = GO({Item2,B) = CLOSURE({S --> BB.}) = {S --> BB.}
由於 GO(Item2,a) 和 GO(Item2,b) 重復,所以去掉。
Item6 = GO(Item3,B) = CLOSURE({B --> aB.}) = {B --> aB.}
由於 GO(Item3,a) 和 GO(Item3,b) 重復,所以去掉。
至此,項目集閉包不再增加,所以項目集規范族構造完畢!
3.構造DFA
方法很簡單,看一下結果就懂了,在這里就不贅述了。
需要注意的是:要找到每個集合和其他集合所有的轉移路徑,容易遺漏!

4.構造LR(0)分析表(根據自己畫出的DFA圖,將分析表填充)
輸入:文法G的擴展文法G'
輸出:G'的LR(0)分析表(即 Action表和Goto表)
步驟:
1、本例中Item2 --B--> Item5,則在 狀態號為2的行,列名為B的格中填入狀態5
(轉移條件為非終結符,填充Goto表,填入狀態號, 轉移條件為終結符,填充Action表,
填入Sn,Sn表示移進,移進符號並且移進狀態號n)
Item2 --a--> Item3 ,則在狀態號為2的行,列名為a的格填入S3。
2、對於圓點在右部最右邊:
if A --> α. ∈ Itemk (0<k<n) & A --> α 為G的第 j 個產生式,
then for 任意 a ∈ T U {#} do
Action[k,a] = Rj
(Rn表示歸約,不移進符號,用第n個產生式的右部替換符號棧的X)
3、if S' --> S. ∈Itemk (0<k<n) then Action[k,#] = acc.
