编译原理(四) 消除回溯提取左因子法

概念简述

回溯:分析工作部分地或全部地退回到之前的一个阶段,在当前阶段采取与之前不同的决策重新推进工作
FIRST(α) :令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为:

  • FIRST(α)={a | α=>*a…, a∈VT}
  • 若α=>*ε,则规定ε∈FIRST(α)
  • FIRST(α)是α的所有可能推导的开头终结符或可能的ε

消除回溯

  • 回溯的问题
    回溯带来的问题就是低效率
  • 回溯的条件
    文法中,对于某个非终结符的规则其右部有多个选择,并根据所面临的输入字符不能准确的判断所要的选择,那么就需要搜索,就会导致回溯。
  • 避免回溯的要求
    FIRST(αi)FIRST(αj)=ϕ

    令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为:
    • FIRST(α)={a | α=>*a…, a∈VT}
      若α=>*ε,则规定ε∈FIRST(α)
      FIRST(α)是α的所有可能推导的开头终结符或可能的ε
    • 如果非终结符A的所有候选首符集两两不相交,即A的任何两个不同候选αi和αj
      FIRST(αi) ∩FIRST(αj)=Φ
    • 那么当要求A匹配输入串时,A就能根据它所面临的第一个输入符号a,准确的指派某一个候选前去执行任务。这个候选就是那个终结首符集含a的α。
  • 提取左因子法消除回溯
    • 假定A的规则是:
      A→δβ1 |δβ2 | … |δβn |γ1 |γ2 | … |γm(其中,每个γ不以δ开头)
      那么这些规则可以改写为:
      A→δA’ |γ1 |γ2 | … |γm
      A’→β1 |β2 | … |βn
    • 经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集便成为两两不相交。我们为此要付出的代价是大量引进新的非终结符和ε产生式
    • 实现过于简单,故不再实现代码
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值