消除文法的左递归和回溯

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

则成功提取左公因子;

  • 21
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值