版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Greepex/article/details/80785518
消除左递归和LL(1)文法造表
1.消除左递归
1.1定义
有A->Aa形式的产生式的文法为直接左递归文法。
类似,若是多步推导得到A->Aa形式的产生式的文法为间接左递归文法。
1.2直接左递归消除($表示空串)
原产生式:
A->Aa|b
消除后:
A->bA’
A’->aA’|
1.3间接左递归消除
原产生式:
S->Aa|b
A->Ac|Sd|
消除后:
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)是指可以用该产生式进行推导的对应输入符号的集合。
- 如果First(b)中不包含$(空串),则Select(A->b)=First(b)
- 如果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的规则可以得出最终结果: