簡單優先分析法
1.基本概念
通過語法樹來理解這三個概念更加簡單:
文法G1[S]:
S→AB
A→bB
A→Aa
B→a
B→Sb
語法樹
-
短語:若S=*=>αAδ且A=+=>β,則稱β是相對於非終結符A的句型αβδ的短語。
即:語法樹中以非終結符的作為根的子樹的葉子所組成的字符串。
如:ba是相對於非終結符A的句型AB的短語。句型baSb的短語有ba,a,Sb,baSb。
-
直接短語:若S=*=>αAδ且A=>β,則稱β是相對於非終結符A的句型αβδ的直接短語。
即:語法樹中以非終結符的作為根的子樹,它的孩子都是葉子,沒有其他子樹。
如:Sb是相對於非終結符B的句型AB的短語。句型baSb的短語有a,Sb。
-
句柄:位於句型最左邊的直接短語稱為該句型的句柄。
即:位於語法樹中最左邊的直接短語。
如:句型baSb的句柄是a。
2.優先關系定義
-
X和Y優先級相等,表示為
X=·Y
,當且僅當G中存在產生式規則A=>···XY···。解讀:X、Y的優先級相同,當XY存在一個句柄之中,它們將同時被歸約。表現在語法樹中S=·b。
優先級相等在語法樹中
-
X優先級小於Y,表示為
X<·Y
,當且僅當G中存在產生式規則A=>···XB···,B=+=>Y···。解讀:X優先級小於Y,當XY存在一個句型中時,它們將不可能出現在同一個句柄中,Y一定比X先被規約。表現在語法樹中b<·a。
優先級小於語法樹中
-
X優先級大於Y,表示為
X>·Y
,當且僅當G中存在產生式規則A=>··BD···,B=+=>···X,D=*=>Y···。解讀:X優先級大於Y,當XY存在一個句型中時,它們將不可能出現在同一個句柄中,X一定比Y先被規約。表現在語法樹中a>·S。
優先級大於在語法樹中
- X和Y的優先級為空,表示在文法的任何句型中都不會出現該符號對相鄰出現的情況。
注意:以上優先關系之間不具有對成性。
3.簡單優先文法定義
一個文法是簡單優先文法,需要滿足以下兩個條件:
- 在文法符號集中V,任意兩個符號之間必須之后一種優先關系存在。(顯然滿足)
- 在文法中,兩個產生式不能有相同的右部。
4.簡單優先分析法的操作步驟
-
將輸入輸入串a1a2···an#依次壓棧,不斷比較棧頂符號ai和下一個待輸入符號aj的優先級,若ai>·aj則進行下一步,否則重復此步驟。
解讀:停止條件是ai>·aj表示前面輸入串一定比后面先歸約,所以只需要在前面找句柄就行了。
-
棧頂符號ai即為句柄尾,從此處向左尋找句柄頭ak,滿足ak-1<·ak。
解讀:從后向前找ak-1<·ak表示ak之前的輸入串一定比ai···ak后歸約,由此確定現在就是要歸約ai···ak。
-
由句柄ai···ak在文法中尋找右部為ai···ak的產生式;找到則將句柄替換為相應左部,找不到則說明該輸入串不是該文法的句子。
-
重復以上步驟直到歸約完成。
5.實例
由於還是以上面的例子不滿足簡單優先文法定義(b和b的優先關系不唯一),這里我們用另一個文法來舉例。
文法G2[S]:
S→bAb ①
A→(B ②
A→a ③
B→Aa) ④輸入串為b(aa)b#
- 首先我們做出文法符號的優先關系矩陣:
S | A | B | a | b | ( | ) | # | |
---|---|---|---|---|---|---|---|---|
S | ||||||||
A | = | = | ||||||
B | > | > | ||||||
a | > | > | = | |||||
b | = | < | < | |||||
( | < | = | < | < | ||||
) | > | > | ||||||
# |
這里#比其相鄰所有符號的優先性都要小。
- 然后按照簡單優先分析法進行歸約:
步驟 | 棧S | 當前輸入符 | 輸入串剩余部分 | 動作 |
---|---|---|---|---|
1 | # | b | (aa)b# | 移進 |
2 | #b | ( | aa)b# | 移進 |
3 | #b( | a | a)b# | 移進 |
4 | #b(a | a | )b# | 歸約③ |
5 | #b(A | a | )b# | 移進 |
6 | #b(Aa | ) | b# | 移進 |
7 | #b(Aa) | b | # | 歸約④ |
8 | #b(B | b | # | 歸約② |
9 | #bA | b | # | 移進 |
10 | #bAb | # | 歸約① | |
11 | #S | # | 接受 |
其語法樹如下:
語法樹