编译原理复习二:Top-Down分析LL(1)文法的判断与LL(1)分析表的构造(附题目与答案 超详细)

文章介绍了LL(1)文法的定义,包括消除左递归和提左因子的方法,以及如何判断和构造LL(1)分析表。通过示例详细阐述了如何计算FIRST集和FOLLOW集,并指出给定文法不是LL(1)文法的原因。
摘要由CSDN通过智能技术生成

需要原卷和答案请点赞关注收藏后评论区留言私信~~~

有问题可以在评论区讨论~~~

一、LL(1)文法的定义

LL(1)文法:从文法的开始符,向下推导,推出句子。

对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的

产生式A—>α|β 满足下列条件:

(1)如果α、β均不能推导出ε,则 FIRST(α) ∩ FIRST(β) = ∅。

(2)α 和 β 至多有一个能推导出 ε。

(3)如果 β *═> ε,则 FIRST(α) ∩ FOLLOW(A) = ∅。

将满足上述条件的文法称为LL(1)文法。

因为自顶向下的语法处理不了左递归与左公因子,因此要先消除

1:消除左递归

由于自上而下的分析方法不允许文法含有左递归。

因此对于包含直接左递归和间接左递归的文法都要消除左递归。

直接消除左递归比较容易。

例如:

  P->Pa | b

直接消除左递归

  P->bP'

  P'->aP' | ε

2:提左因子

如果不提左因子,当面临两个相同的前缀,不知道选择哪条,必然会产生回溯。为了消除回溯,我们需要提左因子。

二、LL(1)文法判断实战

Consider the following grammar G[S]:

 

S→(L)|aS’

S’→S|ε

L→SL’

L’→SL’|ε

首先我们要求出各个非终结符的first集和follow集,这个也不复杂,规则如下

计算单个文法符号X的FIRST(X)时,不断应用以下规则,直到没有新的终结符或者是ε加入。
(1)如果X是终结符号,那么FIRST(X)={X}
(2)如果X是非终结符号,且X->ε是一个产生式,那么ε在FIRST(X)中。
(3)如果X是非终结符号,且X->Y1Y2…Yk是产生式
—如果ε在FIRST(Y1), FIRST(Y2),…, FIRST(Y i-1)中,那么FIRST(Yi)中的非ε元素,也在FIRST(X)中。
—如果ε在FIRST(Y1), FIRST(Y2),…, FIRST(Yk)中,那么ε在FIRST(X)中。(PS:注意这里是k,也就是说要所有都能推出 ε 才能说明 ε 在FIRST(X)

 follow集求解规则如下

将右端结束标记 $ 放到FOLLOW(S)中,S是开始符号。
按下面的两个规则不断迭代,直到没有新的终结符或者是ε加入。
①如果存在产生式A->αBβ,那么FIRST(β)-{ε}【表示除了ε之外的符号】的符号都在FOLLOW(B)中。
②如果存在产生式A->αB,或者A->αBβ且FIRST(β)包含ε,那么FOLLOW(A)中所有符号都加入到FOLLOW(B)中。

上述文法求解如下

 

接下来判断是不是LL(1)文法要求出select集,当然求出first和follow集之后求select集就简单多了 

select(X->Y),先求first(Y),如果first(Y)存在#∈first(Y)的情况,则再求follow(X),最后求两者的并集即可即可 

LL(1)判断方法:如果相同产生式左部的Select集有交集,则该文法不为LL(1)文法

上述文法判断结果如下:S’→S|ε : ε in First(S’), and First(S’) ∩ Follow(S’)≠Φ, So the grammar is not LL(1)

三、LL(1)分析表构造

有了上面求出的first,follow,select集之后构造分析表就简单许多了,可以理解为根据select集构造分析表,结果如下

 创作不易 觉得有帮助请点赞关注收藏~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

showswoller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值