算符優先文法的構造
- 算符優先文法屬於自底向上的文法分析,需要不斷的進行移進-規約操作,讓一個輸入的句子通過不斷的移進-規約,最終變成文法的開始符號。
- 在移進-規約的過程中我們需要知道先對什么進行規約,得有個先后關系,故需要構造文法的算符優先表,來幫助規約分析時的規約對象。
構造FirstVT集和LastVT集
FirstVT和LastVT分別代表某個非終結符所產生的句型中第一個和最后一個終結符的集合。具體產生規則如下:
Firstvt
找Firstvt的三條規則:如果要找A的Firstvt,A的候選式中出現:
A->a.......,即以終結符開頭,該終結符入Firstvt
A->B.......,即以非終結符開頭,該非終結符的Firstvt入A的Firstvt
A->Ba.....,即先以非終結符開頭,緊跟終結符,則終結符入Firstvt
Lastvt
找Lastvt的三條規則:如果要找A的Lastvt,A的候選式中出現:
A->.......a,即以終結符結尾,該終結符入Lastvt
A->.......B,即以非終結符結尾,該非終結符的Lastvt入A的Lastvt
A->.....aB,即先以非終結符結尾,前面是終結符,則終結符入Firstvt
構造算符優先表
算符優先關系表即確定各個終結符的優先關系,以便之后尋找最左素短語。
算符優先表分以下幾種情況:
E->...aBc...
和E->...ac...
,在產生式中存在類似關系的終結符優先級相等,即a和c的優先級相等。E->Ab
,在產生式中存在一個非終結符在前一個終結符在后的情況,則A的LastVT集合中的終結符優先級都高於終結符b的優先級E->aB
,在產生式中存在一個終結符在前和一個非終結符在后的情況,則B的FirstVT集合中的終結符優先級都高於終結符a的優先級
其實大白話說起來就遵循一種就行:就是產生式中哪些終結符一起能規約成左部非終結符,則兩者優先級相等,而終結符和非終結符在同一個產生式中,非終結符的終結符集合需要先規約成非終結符,所以那些非終結符的終結符的優先級要高於與非終結符在同一產生式中的終結符
尋找待規約串
尋找規約串即尋找最左素短語。
在分析過程中,需要用到分析棧和符號串,通過比較棧頂終結符和符號串的首字符,若是小於或者等於則把符號串的首字符加入符號棧,若是大於則從符號棧頂向下尋找,直到找到優先級更小的終結符停止。
即需要找到一個字符串,它的優先級比前后的優先級都要高。
找到之后把規約串進行規約即可。
重復上述的操作,直至字符串為#
例子
文法:
S->aAcBe
A->b|Ab
B->d
輸入的測試用例:
abbcde#
經過計算得出優先關系表:
-------------------------------------------
| | a | c | e | b | d | # |
-------------------------------------------
| a | | = | | < | | |
-------------------------------------------
| c | | | = | | < | |
-------------------------------------------
| e | | | | | | > |
-------------------------------------------
| b | | > | | > | | |
-------------------------------------------
| d | | | > | | | |
-------------------------------------------
| # | < | | | | | = |
-------------------------------------------
結果
----------------------------------------------------------------------
|Step | SymbolStack | InputString | usedproduc |
----------------------------------------------------------------------
| 1 | # | abbcde# | Start |
| 2 | #a | bbcde# | Move in |
| 3 | #ab | bcde# | Move in |
| 4 | #aA | bcde# | Statute, A->b |
| 5 | #aAb | cde# | Move in |
| 6 | #aA | cde# | Statute, A->Ab |
| 7 | #aAc | de# | Move in |
| 8 | #aAcd | e# | Move in |
| 9 | #aAcB | e# | Statute, B->d |
| 10 | #aAcBe | # | Move in |
| 11 | #S | # | Statute, S->aAcBe |
| 12 | #S# | | Accept |
----------------------------------------------------------------------
分析:
step1:比較#和a,# < a,故把a入棧
step2:比較a和b,a < b,故把b入棧
step3:比較b和b,b > b,故從棧頂去尋找比其優先級更低的終結符,即a,故規約串即b自己,將b規約成A
step4:比較a和b,a < b,故把b入棧
step5:比較b和c,b > c,故從棧頂開始尋找優先級更低的終結符,即a,故規約串為Ab,將其規約成A
step6:比較a和c,a = c,故把c入棧
step7:比較c和d,c < d,故把d入棧
step8:比較d和e,d > e,故尋找規約串,因為 d > c 故規約串為d,規約成B
step9:比較c和e,c = e,故把e入棧
step10:比較e和#,c > #,從棧頂開始尋找規約串,# < e = c = a > #,故規約串為aAcBe,規約成S