编译原理 消除左递归,直接左递归、间接左递归

消除左递归

左递归的定义

如果存在非终结符 P P P经过一步或一步以上推导出 P α P\alpha Pα,即
P ⟹ + P α P\stackrel{+}{\Longrightarrow}P\alpha P+Pα则称 P P P含有左递归。

  • 含有左递归的文法将使自上而下的分析过程1陷入无限循环。

左递归的消除

消除直接左递归

假定关于非终结符 P P P的规则为 P → P α ∣ β P\to P\alpha|\beta PPαβ其中, β \beta β不以 P P P开头。即, P P P所能确定的是以 β \beta β开头、以若干个 α \alpha α结尾的语言。
那么,可以把 P P P的规则改写为下面的非直接左递归形式:
P → β P ′ P\to \beta P' PβP P ′ → α P ′ ∣ ε P'\to \alpha P'|\varepsilon PαPε

  • 举个例子:文法

E → E + T ∣ T E\to E+T|T EE+TT T → T ∗ F ∣ F T\to T*F|F TTFF F → ( E ) ∣ i F\to (E)|i F(E)i 经过消去直接左递归后变成 E → T E ′ E\to TE' ETE E ′ → + T E ′ ∣ ε E'\to +TE'|\varepsilon E+TEε T → F T ′ T\to FT' TFT T ′ → ∗ F T ′ ∣ ε T'\to *FT'|\varepsilon TFTε F → ( E ) ∣ i F\to (E)|i F(E)i

消除间接左递归

先将间接左递归变为直接左递归,再按消除直接左递归的方法进行。

  • 举个例子,文法G[A]

A → B c ∣ d A\to Bc|d ABcd B → a A ∣ A b B\to aA|Ab BaAAb 转换为直接左递归(代入) A → a A c ∣ A b c ∣ d A\to aAc|Abc|d AaAcAbcd 消除直接左递归 A → a A c A ′ ∣ d A ′ A\to aAcA'|dA' AaAcAdA A ′ → b c A ′ ∣ ε A'\to bcA'|\varepsilon AbcAε 简化为 A → ( a A c ∣ d ) A ′ A\to (aAc|d)A' A(aAcd)A A ′ → b c A ′ ∣ ε A'\to bcA'|\varepsilon AbcAε

消除全部左递归

前提:该文法不含回路2

  1. 把文法中所有非终结符按任意一种顺序排列成 P 1 , P 2 , P 3 ⋯   , P n P_{1},P_{2},P_{3}\cdots,P_{n} P1,P2,P3,Pn

  2. 对每个非终结符号,用排在它前面的其他非终结符号的产生式表示出来(代入),并消除产生式中的直接左递归。

  3. 化简上一步所得文法,即去掉重复、多余的产生式。

  • 举个例子,文法G[S]

S → Q c ∣ c S\to Qc|c SQcc Q → R b ∣ b Q\to Rb|b QRbb R → S a ∣ a R\to Sa|a RSaa 1. 对非终结符排序:R,Q,S
2. 逐个消除直接左递归: R : R → S a ∣ a R:R\to Sa|a R:RSaa 无直接左递归,将 R R R代入 Q Q Q Q → S a b ∣ a b ∣ b Q\to Sab|ab|b QSababb 无直接左递归,将 R R R Q Q Q代入 S S S S → S a b c ∣ a b c ∣ b c ∣ c S\to Sabc|abc|bc|c SSabcabcbcc 消除 S S S的直接左递归: S → ( a b c ∣ b c ∣ c ) S ′ S\to(abc|bc|c)S' S(abcbcc)S S ′ → a b c S ′ ∣ ε S'\to abcS'|\varepsilon SabcSε 现文法为: S → ( a b c ∣ b c ∣ c ) S ′ S\to (abc|bc|c)S' S(abcbcc)S S ′ → a b c S ′ ∣ ε S'\to abcS'|\varepsilon SabcSε Q → S a b ∣ a b ∣ b Q\to Sab|ab|b QSababb R → S a ∣ a R\to Sa|a RSaa 3. 去掉多余产生式 S → ( a b c ∣ b c ∣ c ) S ′ S\to (abc|bc|c)S' S(abcbcc)S S ′ → a b c S ′ ∣ ε S'\to abcS'|\varepsilon SabcSε

注意:对非终结符的排序是任意的(但要保证其识别的符号不变),不同的排序最后所得文法的形式可能不同,但他们是等价的。


  1. 自上而下就是从文法的开始符号出发,向下推导,推出句子。 ↩︎

  2. 形如 P → P P\to P PP的推导,也不含有以 ε \varepsilon ε为右部的产生式。 ↩︎

  • 33
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值