1. 程式人生 > >消除左遞迴和LL(1)文法造表

消除左遞迴和LL(1)文法造表

消除左遞迴和LL(1)文法造表

1.消除左遞迴

1.1定義

有A->Aa形式的產生式的文法為直接左遞迴文法。
類似,若是多步推導得到A->Aa形式的產生式的文法為間接左遞迴文法。

1.2直接左遞迴消除($表示空串)

原產生式:
A->Aa|b
消除後:
A->bA’
A’->aA’|

E−>TE′E′−>+TE′|" role="presentation" style="position: relative;">
E > E + T | T
E > T E E > + T E |

1.3間接左遞迴消除

原產生式:
S->Aa|b
A->Ac|Sd| S A A > A c | A a d | b d |
消除後:
A->bdA’|A’
A’->cA’|adA’|$

1.3聯想特殊正規式化簡

有些重點的正規式化簡需要特殊記憶,如下:
x=rx+t 化簡為 x=r*t
x=xr+t化簡為 x=tr*
其中,第二條正規式化簡公式很類似於左線性文法消除。

2.LL(1)文法

LL(1)是一種無回溯自頂向下分析方法,又叫預測分析法。

2.1 Select集合

Select(A->b)是指可以用該產生式進行推導的對應輸入符號的集合。

  1. 如果First(b)中不包含$(空串),則Select(A->b)=First(b)
  2. 如果First(b)中包含$(空串),則Select(A->b)=(First(b)-{$})+Follow(A)

2.1 舉例

已知文法G[E]:
E->TE’
E’->ATE’|$
T->FT’
T’->MFT’|$
F->(E)|i
A->+|-
M->*|/
計算First(b)和Follow(A)集合:

產生式 First Follow
E->TE’ {(,i} {),#}
E’->ATE’ {+,-} {),#}
E’->$ {$} {),#}
T->FT’ {(,i} {+,-,),#}
T’->MFT’ {*,/} {+,-,),#}
T’->$ {$} {+,-,),#}
F->(E) {(} {{+,-,*,/,),#}}
F->i {i} {{+,-,*,/,),#}}
A->+ {+} {(,i}
A->- {-} {(,i}
M->* {*} {(,i}
M->/ {/} {(,i}

按照Select的規則可以得出最終結果:
這裡寫圖片描述