我是靠谱客的博主 无情书包,最近开发中收集的这篇文章主要介绍消除文法的左递归和回溯1.自上而下分析2.直接左递归的消除3.直接左递归例题4.间接左递归的消除5.间接左递归例题6.消除回溯,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

则成功提取左公因子;

最后

以上就是无情书包为你收集整理的消除文法的左递归和回溯1.自上而下分析2.直接左递归的消除3.直接左递归例题4.间接左递归的消除5.间接左递归例题6.消除回溯的全部内容,希望文章能够帮你解决消除文法的左递归和回溯1.自上而下分析2.直接左递归的消除3.直接左递归例题4.间接左递归的消除5.间接左递归例题6.消除回溯所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部