LR技術——LR(0)自動機的構建 LR語法分析器 項 LR(0)自動機

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

  1. 先畫出I0,使用增廣文法,構造E'->E,然後求E的閉包得到E -> E + T、E -> T、T -> T * F、T -> F、F -> ( E )、F -> id,以上構成I0集合,然後在他們前面都加上一個點,得到

  2. 對 E 進行GOTO操作,就是把I0中所有包含有 ▪E 的項拿出來,變成 E▪,構建成爲I1

  3. 對 T 進行GOTO操作,得到I2

  4. 對F進行GOTO操作,得到I3

  5. 對( 進行GOTO操作,得到I4,由於此時▪後爲非終結符,故可以進行閉包操作,對F求閉包

  6. 對 id 進行GOTO操作,得到I5

此時對I0的操作全部結束,圖應爲這樣

  1. 對I1中的E'->E進行歸約操作,得到accept,注意只有開始符號纔可以進行這樣的操作。

  2. 對+進行GOTO操作,得到I6

  3. 之後,對I2、I3由於已經爲歸約項目,所以無操作)、I4、I5(由於已經爲歸約項目,所以無操作)都進行跟之前類似的操作,可以得到I7、I8


第二輪畫完後是這樣,爲了便於區分,這裏使用紅色標記第二輪,值得注意的是I4部分很容易出現漏畫的情況。

  1. 對新生成的I6、I7、I8進行處理,得到I9、I10、I11




    此時自動機的圖爲這樣:

  2. 最後對I9、I10、I11處理得到完整的自動機。

至此,LR(0)自動機構建完畢。

此時我們再對歸約式分析時就可以採用這樣的方法來進行分析

id * id =》 F * id =》 T * id =》 T * F =》 T =》 E

下一篇:LR技術——SLR語法分析表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章