编译原理(三)直接左递归与间接左递归的消除

  • 在进行语法分析的时候,如果采用自上而下的分析方法(从开始符开始,推句子),那么要求文法不是左递归的,进而如果是左递归的,则要求消除左递归,因此左递归只是在自上而下的那种文法里的。下面讲讲左递归的两种消除方法就没了。
  •  

  • 左递归的分类

  • 直接左递归:P → Pa 这里当然是后面有一个|b的
  • 简介左递归:P → Aa, A → …… → Pb 

 

  • 直接左递归的消除

这个公式是死记住的,怎么记住呢?理解着记忆。首先写出这个式子,然后b肯定打头,就是如此了。

P->Pa|b是原左递归式子,一定是有b的,不然就永远递归下去了

  • P  →  bP';
    P'  →  aP' | ε;
    
  • 更一般化的形如P → PX|Y(其中X和Y看作一个整体,比如:P → Pabc|ab|b,X就是abc,Y就是ab|b),可以归纳成如下形式:
P  →  YP';        比如:P  →  abP' | b P'
P'  →  XP' | ε;   比如: P'  →  abcP' | ε

间接左递归的消除

  • 对于P → Aa | x1, A → …… → Pb | x2的形式

什么意思呢,就是就是有左递归的那一部分,全部规约成一个式子,这样就成为直接递归,然后做就可以了,当然首先删除无用符号。采用自下而上往上消除,最后只剩下一个字母,然后就完成了

  • 存在如下文法,消除左递归
    1)S → Qc | c
    2)Q → Rb | b
    3)R → Sa | a
S  →  Sabc |abc | bc | c
∴  X = abc,Y = abc | bc | c
∴ 直接消除左递归的结果是:
S  →  abcS' | bcS' | cS'
S'  → abcS' | ε

5)删除其中不可达的非终结符,这里就是Q、R了

∴ 最终消除左递归的结果是

 

S  →  abcS' | bcS' | cS'
S'  → abcS' | ε

这是自上而下的LL文法才会出现的问题。根本不难的。

 

你可能感兴趣的:(编译原理)