LR語法分析器
特點:
1)由表格驅動
2)幾乎適用所有程序設計語言
3)無回溯的移入歸約技術
4)可以儘早檢測到錯誤
項
什麼是項?這裏所說的項是一種狀態,用來在LR語法分析中對集合進行描述。
例如產生式 A -> XYZ 會有四個項
A -> ▪XYZ
A -> X▪YZ
A -> XY▪Z
A -> XYZ▪
產生式 A -> ε 只有一個項 A -> ▪
一個規範的LR(0)項族集提供了構建確定有窮自動機的基礎。稱爲LR(0)自動機。
LR(0)項集中的項共分爲四大類:
1)歸約項目:歸約結束,原點在最右端。如:A -> a▪
2)接收項目:左端爲 S' 的歸約項目。如:S' -> a▪
3)待約項目:原點後爲非終結符的項目。如:A -> α▪Bβ
4)移進項目:原點後爲終結符的項目。如:A -> α▪aβ
LR(0)自動機
構建一個LR(0)自動機,會涉及到一個增廣文法和兩個函數(CLOSURE和GOTO)兩個函數之前都有了解了,分別用於求閉包和移進。增廣文法含義如下:如果 G 是一個以 S 爲開始符號的文法,那麼 G 的增廣文法 G' 就是在 G 中加上新開始符號 S‘ 和產生式 S'->S 而得到的文法。
這裏以示例文法來講解自動機的構成
E ——> E + T | T
T ——> T * F | F
F ——> ( E ) | id
-
先畫出I0,使用增廣文法,構造E'->E,然後求E的閉包得到E -> E + T、E -> T、T -> T * F、T -> F、F -> ( E )、F -> id,以上構成I0集合,然後在他們前面都加上一個點,得到
-
對 E 進行GOTO操作,就是把I0中所有包含有 ▪E 的項拿出來,變成 E▪,構建成爲I1
-
對 T 進行GOTO操作,得到I2
-
對F進行GOTO操作,得到I3
-
對( 進行GOTO操作,得到I4,由於此時▪後爲非終結符,故可以進行閉包操作,對F求閉包
-
對 id 進行GOTO操作,得到I5
此時對I0的操作全部結束,圖應爲這樣
-
對I1中的E'->E進行歸約操作,得到accept,注意只有開始符號纔可以進行這樣的操作。
-
對+進行GOTO操作,得到I6
-
之後,對I2、I3由於已經爲歸約項目,所以無操作)、I4、I5(由於已經爲歸約項目,所以無操作)都進行跟之前類似的操作,可以得到I7、I8
第二輪畫完後是這樣,爲了便於區分,這裏使用紅色標記第二輪,值得注意的是I4部分很容易出現漏畫的情況。
-
對新生成的I6、I7、I8進行處理,得到I9、I10、I11
此時自動機的圖爲這樣:
-
最後對I9、I10、I11處理得到完整的自動機。
至此,LR(0)自動機構建完畢。
此時我們再對歸約式分析時就可以採用這樣的方法來進行分析
id * id =》 F * id =》 T * id =》 T * F =》 T =》 E
下一篇:LR技術——SLR語法分析表