消除文法的左递归和回溯

1.自上而下分析

(1)面临的问题

文法左递归问题

回溯问题

(2)构造不带回溯的自上而下分析算法

消除文法的左递归性

消除回溯

(3)识别左递归

消除左递归分为消除直接左递归和间接左递归,间接左递归有的时候还要转化为直接左递归进行运算,我们如何去辨别他们是否为直接左递归或者是间接左递归呢

直接左递归:P->Pα|β(β不以P开头)

间接左递归:例如S→Qc|c,Q→Rb|b,R→Sa|a


 

2.直接左递归的消除

消除文法的左递归和回溯_第1张图片

消除文法的左递归和回溯_第2张图片


 

3.直接左递归例题

消除文法的左递归和回溯_第3张图片

根据左递归定义可以判断出文法G存在直接左递归,将第一个推导式与公式进行一一对应,E为定义中的P,+T为定义中的α,T为定义中的β,引入中间量E',根据定义P->βP',P'=αP'|ε,我们可以得出E->TE'和E'->+TE'|F这两个推导式,后面关于T的推导同理。


 

4.间接左递归的消除

消除文法的左递归和回溯_第4张图片

消除文法的左递归和回溯_第5张图片


 

5.间接左递归例题

消除文法的左递归和回溯_第6张图片

我们先选择一个消除左递归的顺序,比如说我在这一题选用了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'|ε

 消除文法的左递归和回溯_第7张图片

注意,由于对非终结符排序的不同,最后所得的文法在形式上可能不一样。 但不难证明,它们都是等价的。例如,若对文法的非终结符排序选为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.消除回溯

消除回溯的方法是提取左公共因子

消除文法的左递归和回溯_第8张图片

若文法中存在形如:

A->ay|ab   两个产生式左部第一个符号相同,则不符合LL(1)文法,指代不明,则表示存在左公因子

解决方法:

转换成 A->aM1,aM2,aM3....的形式:

得:

A->aM

M->y|b

则成功提取左公因子;

你可能感兴趣的:(编译原理,编辑器,其他)