当前位置:   article > 正文

编译原理(三)直接左递归与间接左递归的消除_消除文法的左递归(包含直接左递归和间接左递归)

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

  • 左递归的分类

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

 

  • 直接左递归的消除

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

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

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

间接左递归的消除

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

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

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

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

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

 

  1. S → abcS' | bcS' | cS'
  2. S' → abcS' | ε

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/507929
推荐阅读
相关标签
  

闽ICP备14008679号