編譯原理 第四章

語法分析分爲:自頂向下分析法 和 自底向上分析法。自頂向下分析法分爲:非確定的自頂向下的語法分析 和 確定的自頂向下的語法分析。

非確定的自頂向下語法分析將產生兩個問題:左遞歸性 和 回溯。

左遞歸性:對規則 A->Aα|β,使用自頂向下語法分析,始終替換當前舉行中的最左非終結符,即A->Aα->Aα->...造成無窮循環。

消除左遞歸性:引入一個新的非終結符,把含左遞歸的規則改寫爲右遞歸。

若A->Aα|β,則改寫爲A->βA',A'->αA'|ε; //原來的規則除非遇到β纔會停下,也就是βαααα...,改寫後生成的依然是βαααα...

回溯:自頂向下分析中試探匹配失敗則需要回溯重新試探,降低了語法分析器效率,因此需要消除回溯。

引起回溯的兩種情況:

(1)相同左部的規則,其右部左端第一個符號相同而引起回溯。

     //A->de|d;匹配上d後,若後面不爲e則引起回溯

(2)相同左部的規則,其中某一右部能退出ε串。

     //G:A->Bx;B->x|ε;分析符號串W=x,x與A->Bx->xx匹配,成功後,結束符與x匹配不上,產生回溯,B->ε後匹配成功。

LL(1)文法:避免回溯要求描述語言的文法爲LL(1)文法,L自上而下的分析是從左到右掃描輸入串,L使用最左推導,1每一步向前看一個符號決定所用的規則。

LL(1)文法判斷條件的三個相關集:FIRST集、FOLLOW集和SELECT集:

FIRST集:消除回溯用“預測”法,即求第一個非終結符來判斷是否和目標匹配。

FOLLOW集:文法G[S]:S→aA;S→d;A→bAS;A→ε;分析W=abd.推導過程爲S⇒aA⇒abAS⇒abS⇒abd;

aA⇒abAS此時匹配d,但最左非終結符A的產生式右部的開始符號集都不包含d,但有ε,因此對於d的匹配自然認爲只能依賴於在可能的推導過程中A的後面的符號,所以這時候選用產生式A→ε向下推導。而當前A後面的符號爲S,S產生式右部的開始符號集包含了d,所以例子中可用S→d推導得到匹配。

當某一非終結符的產生式中含有空產生式時,它的非空產生式右部的開始符號集兩兩不相交,並與在推導過程中緊跟該非終結符右部可能出現的終結符集也不相交,則仍可構造確定的自頂向下分析。因此,引入了一個文法符號的後跟符號集合。因此對於每一文法符號 AVN,實際上求FOLLOW(A)
就是考察A在產生式右端的出現情況,哪些終結符號可以跟隨在A後面?

求SELECT集方法:若A->α

(1)α≠ε 且 不可空:Select

求FIRST集方法:

(1)X→ε,則ε∈FIRST(X)

(2)X→a⋅⋅⋅,則a∈FIRST(X)

(3)X→Y⋅⋅⋅,且Y∈VN,則FIRST(Y)–{ε}⊆FIRST(X)

特例: X→Y1Y2⋅⋅⋅Yi−1Yi⋅⋅⋅Yk,Y1,Y2,⋅⋅⋅Yi−1∈VN
Y1,Y2,⋅⋅⋅Yi−1⟹∗ε,則FIRST(Yj)–{ε}⊆FIRST(X)(1≤j≤i−1),FIRST(Yi)⊆FIRST(X)特別地,當Y1Y2⋅⋅⋅Yi−1Yi⋅⋅⋅Yk⟹∗ε則 ε∈FIRST(X)

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