美文网首页
消除左递归及提取左公因子

消除左递归及提取左公因子

作者: 安哥拉的赞礼 | 来源:发表于2020-03-05 22:50 被阅读0次

    转载
    https://blog.csdn.net/qq_40294512/article/details/89396595

    消除左递归

    什么是左递归?

    如果一个文法中有一个非终结符号A使得对某个串α存在一个推导A=》Aα,那么这个文法就是左递归的。递归分为立即左递归和非立即左递归。立即左递归单步即可看出来,非立即左递归
    举个例子:

    立即左递归:
    A ——> Aα | β
    
    非立即左递归:
     1)A→aB
     2)A→Bb
     3)B→Ac
     4)B→d
    
    

    消除左递归

    消除立即左递归只需要遵循以下规律进行转换就ok。

    立即左递归:

    将A ——> Aα | β 转换为
    
    A ——> β A' 
    A' ——> α A'
    
    

    非立即左递归:

    先将其变为立即左递归
     1)B→aBc
     2)B→Bbc 
     3)B→d
    可化简为:B→aBc | Bbc | d
    
    然后按照上面的规则进行转换即可
     1)B→aBcB' |dB'
     2)B'→bcB' |ε
    
    最后进行整合
     1)A→aB
     2)A→Bb
     3)B→(aBc|d)B'
     4)B'→bcB'|ε
    
    

    通用算法

    以某种顺序排列非终结符A1,A2,……,An;
    
    for(int i = n; i<=n; i++) {
        for(int j = n; j<=i-1; j++) {
            将每个形如 Ai → Ajγ 的产生式替换为产生式组 Ai → ξ1γ|ξ2γ|……|ξkγ ,
            其中,Aj→a1|a2|……|ak是所有的当前Aj产生式
        }
        消除关于Ai产生式中的直接左递归性
    }
    
    

    提取左公因子

    什么是左公因子?

    和数学中的公因子含义相同,就是公共的因子,而左公因子就是最左边的公因子。

    例如:

    S → aB1|aB2|aB3|aB4|...|aBn|y
    

    可以看出前n项拥有一个共同的左公因子:a,所以可以把他提取出来。

    提取规则

    so easy啦

    S → aS'|y
    S'→ B1|B2|B3|...|Bn
    

    S → aB1|aB2|aB3|aB4|...|aBn|y
    可以看出前n项拥有一个共同的左公因子:a,所以可以把他提取出来。

    提取规则
    so easy啦

    S → aS'|y
    S'→ B1|B2|B3|...|Bn

    相关文章

      网友评论

          本文标题:消除左递归及提取左公因子

          本文链接:https://www.haomeiwen.com/subject/ewtrrhtx.html