1.自上而下分析
(1)面临的问题
文法左递归问题
回溯问题
(2)构造不带回溯的自上而下分析算法
消除文法的左递归性
消除回溯
(3)识别左递归
消除左递归分为消除直接左递归和间接左递归,间接左递归有的时候还要转化为直接左递归进行运算,我们如何去辨别他们是否为直接左递归或者是间接左递归呢
直接左递归:P->Pα|β(β不以P开头)
间接左递归:例如S→Qc|c,Q→Rb|b,R→Sa|a
2.直接左递归的消除
3.直接左递归例题
根据左递归定义可以判断出文法G存在直接左递归,将第一个推导式与公式进行一一对应,E为定义中的P,+T为定义中的α,T为定义中的β,引入中间量E',根据定义P->βP',P'=αP'|ε,我们可以得出E->TE'和E'->+TE'|F这两个推导式,后面关于T的推导同理。
4.间接左递归的消除
5.间接左递归例题
我们先选择一个消除左递归的顺序,比如说我在这一题选用了R,Q,S的顺序,我们开始消除R的左递归,我们可以看出Q是可以推导出R的,故将R->Sa|a代入到Q->Rb|b中,Q->Sab|ab|b,我们还可以看出S可以推导出Q,将Q的推导式代入到S,S->Sabc|abc|bc|c,这时候我们可以发现此时的S的推导式变为了间接左递归,利用公式,我们可以得出S->abcS'|bcS'|cS',S'->abcS'|ε
注意,由于对非终结符排序的不同,最后所得的文法在形式上可能不一样。 但不难证明,它们都是等价的。例如,若对文法的非终结符排序选为S、Q、R,那么,最后所得的无左递归文法是∶
S→Qc l c
Q→Rb'| b
R→bcaR'l caR' |aR'
R'→bcaR'|ε
s—> abcS' l bcs' |cs'
S'→ abcS' | c
上述两个文法是等价的。
6.消除回溯
消除回溯的方法是提取左公共因子
若文法中存在形如:
A->ay|ab 两个产生式左部第一个符号相同,则不符合LL(1)文法,指代不明,则表示存在左公因子
解决方法:
转换成 A->aM1,aM2,aM3....的形式:
得:
A->aM
M->y|b
则成功提取左公因子;