zoukankan      html  css  js  c++  java
  • 【转】消除左递归

    转自:http://guanjy0129.blog.163.com/blog/static/111549445201061491810507/

    一个文法含有下列形式的产生式之一时:

    1)A→Aβ,A∈VN,β∈V*

    2)A→Bβ,B→Aα,A、B∈VN,α、β∈V*

    则称该文法是左递归的。

    然而,一个文法是左递归时,不能采取自顶向下分析法。

    消除左递归方法有:

    a)把直接左递归改写为右递归:

    设有文法产生式:A→Aβ|γ。其中β非空,γ不以A打头。

    可写为:A→γA'

    A'→βA'|ε

    一般情况下,假定关于A的产生式是:

    A→Aα1| Aα| |Aαm12 |n

    其中,αi(1≤i≤m)均不为空,βj(1≤j≤n)均不以A打头。

    则消除直接左递归后改写为:

    A→ β1A'| β2 A' || βnA'

    A'→ α1A' | α2A' || αmA' |ε

    例4.12:有文法G(E):

    E→E +T |T

    T→T*F | F

    F→id| (E)

    消除该文法的直接左递归。

    解:按转换规则,可得:

    E→TE'

    E'→+TE'|ε

    T→FT '

    T'→*FT'|ε

    F→id| (E)

    b)消除间接左递归:

    对于间接左递归的消除需要先将间接左递归变为直接左递归,然后再按a)清除左递归。

    例4.13:以文法G6为例消除左递归:

    (1)A→aB

    (2)A→Bb

    (3)B→Ac

    (4)B→d

    解:用产生式(1),(2)的右部代替产生式(3)中的非终结A得到左部为B的产生式:

    (1)B→aBc

    (2)B→Bbc

    (3)B→d

    即: B->Bbc|aBc|d   

    将 aBc|d 看成一个整体M, 即 B->Bbc|M
    之后  B->MB'    B'->bcB'|ε  
    然后 再把 M 替换为  aBc|d

    消除左递归后得到:

    B→aBcB' |dB'

    B'→bcB' |ε

    再把原来其余的产生式A→aB,A→Bb加入,最终得到等价文法为:

    (1) A→aB

    (2) A→Bb

    (3) B→(aBc|d)B'

    (4) B'→bcB'|ε

    c)消除文法中一切左递归的算法

    设非终结符按某种规则排序为A1,A2,An

    For i=1 to n do

    begin

    For j=1 to i-1 do

    begin

    Aj的所有产生式为:

    Aj δ1| δ2 | … | δn

    替换形如Ai  Aj γ的产生式为:

    Ai δ1γ 2γ | … |δnγ

    end

    消除Ai中的一切直接左递归

    end

    作者:Standby一生热爱名山大川、草原沙漠,还有妹子
    出处:http://www.cnblogs.com/standby/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    2017 北京商改住政策
    python3 进程和线程(二)
    python3 pymysql
    SQL基本操作
    python3 paramiko
    python3 classmethod
    python3 property
    LVS负载均衡
    flume介绍及应用
    关系型数据库和非关系型数据库介绍及优劣势比较
  • 原文地址:https://www.cnblogs.com/standby/p/6792772.html
Copyright © 2011-2022 走看看