zoukankan      html  css  js  c++  java
  • 十、消除左递归

    1.将以下文法消除左递归,分析符号串 i*i+i 。

         E -> E+T | T

         T -> T*F | F

         F -> (E) | i

    消除左递归:

    E->TE'

    E'->+TE'|ε

    T->FT'

    T'->*FT'|ε

    F->(E)|i

    FIRST集:

    FIRST(TE')={T}

    FIRST(+TE')={+}

    FIRST(ε)={ε}

    FIRST(FT')={F}

    FIRST(*FT')={*}

    FIRST((E))={(}

    FIRST(i)={i}

    FOLLOW集:

    FOLLOW(E)={)}

    FOLLOW(E')={#}

    FOLLOW(T)={E'}

    FOLLOW(T')={#}

    FOLLOW(F)={#}

    SELECT集:

    SELECT(E→TE')=FIRST(TE')={T}

    SELECT(E'→+TE')=FIRST(+TE')={+}

    SELECT(E'→ε)=(FIRST(ε)-{ε})∪FOLLOW(E')={)}

    SELECT(T→FT')=FIRST(FT')={F}

    SELECT(T'→*FT')=FIRST(*FT')={*}

    SELECT(T'→ε)=(FIRST(ε)-{ε})∪FOLLOW(T')={#}

    SELECT(F→(E))=FIRST((E))={(}

    SELECT(F→i)=FIRST(i)={i}

    分析符号串i*i+i:

    2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集

    (2)A→aABe|a

     B→Bb|d

    消除左递归:

    A→aC'

    A'→ABe| ε

    B→dB'

    B'→bB' | ε

    FIRST集:

    FIRST(aA')={a}

    FIRST(ABe)={A}

    FIRST(ε)={ε}

    FIRST(dB')={d}

    FIRST(bB')={b}

    FOLLOW集:

    FOLLOW(A)={Be}

    FOLLOW(A')={#}

    FOLLOW(B)={e}

    FOLLOW(B')={#}

    SELECT集:

    SELECT(A→aA')=FIRST(aA')={a}

    SELECT(A'→ABe)=FIRST(ABe)={A}

    SELECT(A'→ε)=(FIRST(ε)-{ε})∪FOLLOW(A')={#}

    SELECT(B→dB')=FIRST(dB')={d}

    SELECT(B'→bB')=FIRST(bB')={b}

    SELECT(B'→ε)=(FIRST(ε)-{ε})∪FOLLOW(B')={#}

    (3)S→Aa|b

     A→SB

     B→ab

    消除左递归:

    S→bS'

    S'→BaS' | ε

    B→ab

    FIRST集:

    FIRST(SBa)={S}

    FIRST(b)={b}

    FIRST(bS')={b}

    FIRST(BaS)={B}

    FIRST(ε)={ε}

    FIRST(ab)={ab}

    FOLLOW集:

    FOLLOW(S)={B}

    FOLLOW(S')={#}

    FOLLOW(B)={a}

    SELECT集:

    SELECT(S→SBa)=FIRST(SBa)={S}

    SELECT(S→b)=FIRST(b)={b}

    SELECT(S→bS')=FIRST(bS')={b}

    SELECT(S'→BaS')=FIRST(BaS')={B}

    SELECT(S'→ε)=(FIRST(ε)-{ε})∪FOLLOW(S')={#}

    SELECT(B→ab)=FIRST(ab)={a}

    课堂练习:

    求以下文法的FIRST集、FOLLOW集和SELECT集。

    S->Ap
    A->a |ε
    A->cA

    A->aA

    FIRST集:

     FIRST(Ap) = { a , c , p }

     FIRST(a) = { a }

     FIRST(ε) = { ε }

     FIRST(cA) = { c }

     FIRST(aA) = { a }

    FOLLOW集:

     FOLLOW(A) = { p }

     FOLLOW(S) = { # }

    SELECT集:

     SELECT(S→Ap) = FIRST(Ap) = { a , c , p }

     SELECT(a) = FIRST(a) = { a }

     SELECT(ε) = FOLLOW(A) = { p }

     SELECT(cA) =  FIRST(cA) = { c }

     SELECT(aA) = FIRST(aA) = { a }

    S->Ap
    S->Bq
    A->a
    A->cA
    B->b
    B->dB

    FIRST集:

    FIRST(Ap) = { a , c }

    FIRST(Bp) = { b , d }

    FIRST(a) = { a }

    FIRST(cA) = { c}

    FIRST(b) = { b }

    FIRST(dB) = { d }

    FOLLOW集:

    FOLLOW(S) = { # }

    FOLLOW(A) = { p }

    FOLLOW(B) = { q }

    SELECT集:

    SELECT(S->Ap) = FIRST(Ap) = { a , c }

    SELECT(S->Bq) = FIRST(Bq) = { b , d }

    SELECT(A->a) = FIRST(a) = { a }

    SELECT(A->cA) = FIRST(cA) = { c }

    SELECT(B->b) = FIRST(b) = { b }

    SELECT(B->dB) = FIRST(dB) = { d }

  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/zqy1004/p/11847392.html
Copyright © 2011-2022 走看看