牛骨文教育服务平台(让学习变的简单)

概念简述

回溯:分析工作部分地或全部地退回到之前的一个阶段,在当前阶段采取与之前不同的决策重新推进工作 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

  • 经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集便成为两两不相交。我们为此要付出的代价是大量引进新的非终结符和ε产生式
  • 实现过于简单,故不再实现代码