编译原理(语法分析之消除左递归、消除回溯)

引言:语法分析–自上而下分析部分内容

顾名思义,自上而下就是从文法的开始符号出发,向下推导,推出句子。
其中,自上而下分析方法不允许文法含有任何左递归。 为构造不带回溯的自上而下分析算法,首先要消除文法的坐递归性,并找出克服回溯的充分必要条件。下面讨论消除左递归和克服回溯。

左递归的消除

直接消除产生式中的左递归是比较容易的。假定关于非终结符P的规则为
P→Pα | β
其中,β不以P开头。那么,我们可以把P的规则改写为如下的非直接左递归形式:
P→βP′
P′→αP′ | ε (ε为空字) (4.2)
这种形式和原来的形式等价的,也就是说,从P推出的符号串是相同的。
举个例子
例4.2有文法:
E→E+T | T
T→T * F | F
F→(E ) | i
经消去直接左递归后变成:
E→T E′
E′→+ T E′ | ε
T→F T′
T′→* F T′ | ε
F→(E ) | i

消除回溯、提左因子

构造有效的自上而下分析器,必须消除回溯。为了消除回溯就必须保证:对文法的任何非终结符,当它要去匹配输入串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任务,并且此候选的工作结果应是确信无疑的。也就是说,若此候选获得成功匹配,那么,这种匹配绝不会是虚假的;若此候选无法完成匹配任务,则任何其它候选也肯定无法完成。
如何把一个文法改造成任何非终结符的所有候选首符集亮亮不相交呢?其办法是提取公共左因子
例如,假定关于A的规则是
A → δβ₁ | δβ₂ | …|δβn | ε | γ₁ | γ₂ | … γm (其中,每个γ不以δ开头)
那么,可以把这些规则写成
A → δ( β₁ | β₂ | …| βn | ε) | γ₁ | γ₂ | … γm
A → δA′ | γ₁ | γ₂ | … γm
A′ → β₁ | β₂ | βn | ε (4.3)
经过反复提取左因子,就能够把每个非终结符的所有候选首符集变成为两两不相交。

例题
有下列文法:
A → ad
A → aAC
A → Bd
B → AC
B → d
消除左递归(间接左递归)、消除回溯。
解:
①合并
A → ad | aAC | Bd
B → AC | d
②消除左递归
A → A Cd | dd ………………….参照4.2: Cd为α dd为β
A → ddA′

A′ → CdA′ | ε ……………………………………解题须得出的结果1

③消除回溯
A → a d | a AC | ddA′ …………………….参照4.3: d为β₁ AC 为β₂ ddA′为γ₁
A →a(d | aAC) | ddA′

A → aF | ddA′ …………………………………解题须得出的结果2
F → d | AC ……………………………………..解题须得出的结果3

其他章节:

  • 一、引论
  • 二、高级语言及其语法描述
  • 语法分析之消除左递归、消除回溯
  • 三、词法分析
  • 四、语法分析
  • 算符优先分析
  • 你可能感兴趣的:(编译原理)