编译原理-提取左公因子---消除左递归(自己看)

参考:
https://blog.csdn.net/liyun123gx/article/details/19924993
https://blog.csdn.net/hxfghgh/article/details/80152517

简介

在判断LL(1)文法是否符合的时候,需要判断LL(1)文法是否存在左公因子和左递归的情况,若有,则需要提取左公因子和消除左递归。

提取左公因子

若文法中存在形如:

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

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

得:

A -> aM
M -> y|b

成功提取左公因子;

消除左递归

  • 左递归分为两种:
    • 直接左递归:经过一次推导(直接看出来)的左递归式子,例如
    • (1)A→Aβ

    • 间接左递归:经过若干次推导得到左递归式子
    • 1)A→Bβ,B→Aα

消除左递归

  • 1、消除直接左递归
  • a)  把直接左递归改写为右递归:
           设有文法产生式:A→Aβ|γ。其中β非空,γ不以A打头。
           可写为:A → γA'
                         A' → βA'|ε
    一般情况下,假定关于A的产生式是:
           A → Aα1| Aα2 |… |Aαm|β1|β2 |…|βn
           其中,αi( 1 ≤ i ≤ m)均不为空,βj(1 ≤ j ≤ n)均不以A打头。
           则消除直接左递归后改写为:
           A→ β1A'| β2 A' |…| βnA'
           A'→ α1A' | α2A' |…| αmA' |ε

案例

E → E + T | T
T → T * F | F
F → (E) | i

转换后:(记得多个ε

E → TE'
E' → +TE'| ε
T → FT'
T' → *FT' | ε
F → (E) | i

  • 2、消除间接左递归
  • 方法:对于间接左递归的消除需要先将间接左递归变为直接左递归,然后再按a)清除左递归。

案例

(1)A → aB

(2)A → Bb

(3)B → Ac

(4)B → d
  • 若干次推导得到:
(1)B → aBc

(2)B → Bbc

(3)B → d
  • a)方法消除左递归:
B → aBcB' | dB'

B' → bcB' | ε
  • 再把原来其余的产生式A→aB,A→Bb加入,最终得到等价文法为:
(1) A → aB

(2) A → Bb

(3) B → (aBc|d)B'

(4) B' → bcB'| ε

还有一个万能方法,懒得看了
参考:https://blog.csdn.net/liyun123gx/article/details/19924993

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CodeEggs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值