zoukankan      html  css  js  c++  java
  • 作业十----消除左递归


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

       并分别求FIRST集、FOLLOW集,和SELECT集

         E -> E+T | T

         T -> T*F | F

         F -> (E) | i

    FIRST集

    FIRST(TE')={(,i }

    FIRST(+TE')={ + }

    FIRST(ε)={ ε }

    FIRST(FT')={(,i }

    FIRST(*FT')={ * } 

    FIRST((E))={( }

    FIRST((E)|i)={ i }

    FOLLOW集

    FOLLOW(E)={#,)}

    FOLLOW(E')={ )}

    FOLLOW(T)={ + }

    FOLLOW(T')={ + }

    FOLLOW(F)={ * }

    SELECT集

    SELECT(E->TE')={(,i }

    SELECT(E'->+TE')={ + }

    SELECT(E'->ε)={ )}

    SELECT(T->FT')={(,i }

    SELECT(T'->*FT')={ * } 

    SELECT(T'->ε)={ + }

    SELECT(F->(E))={(  }

    SELECT(F->i)={ i }

    分析符号串 i*i+i

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

     (2) A->aABe|a

          B->Bb|d

    提取左公因子:A->aA'      A'->ABe|ε

    消除左递归:B->dB'          B'->bB'|ε

    1、 FIRST集:

    First(aA') = {a}

    First(ABe) = {A}

    First(ε) = {ε}

    First(dB') = {d}

    First(bB') = {b}

    First(ε) = {ε}

    2、 FOLLOW集:

    Follow(A) = {Be}

    Follow(A') = {#}

    Follow(B) = {e}

    Follow(B') = {#}

    3、 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

    将A->SB代入S->Aa|b可得:S->SBa|b

    消除左递归:S->bS'      S'->BaS'|ε     B->ab

    2、 FIRST集:

    First(SBa) = {S}

    First(b) = {b}

    First(bS') = {b}

    First(BaS') = {B}

    First(ε) = {ε}

    First(ab) = {a}

    2、 FOLLOW集:

    Follow(S) = {B}

    Follow(S') = {#}

    Follow(B) = {a}

    3、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集。

    (1)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(S)→{#}

    FOLLOW(A)→{p}

    SELECT集:

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

    SELECT(A→a)={a}

    SELECT(A→ε)={p}

    SELECT(A→cA)={c}

    SELECT(A→aA)={a}

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

    (2)S->Ap
    S->Bq
    A->a
    A->cA
    B->b
    B->dB

    FIRST集:

    FIRST(a)→{a}

    FIRST(b)→{b}

    FIRST(cA)→{c}

    FIRST(dB)→{d}

    FIRST(Bq)→{b,d}

    FIRST(Ap)→{a,c}

    FOLLOW集:

    FOLLOW(S)→{#}

    FOLLOW(A)→{p}

    FOLLOW(B)→{q}

    SELECT集:

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

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

    SELECT(A->a)={a}

    SELECT(A->cA)={c}

    SELECT(B->b)={b}

    SELECT(B->dB)={d}

  • 相关阅读:
    循环获取数据
    implode
    获取二维数组中的值
    根据id获取某一类的最大最小值
    array_column的作用
    用curl模拟夹带cookie的http请求
    phpunit——执行测试文件和测试文件中的某一个函数
    call_user_func
    9 [面向对象]-内置方法
    8 [面向对象]-反射
  • 原文地址:https://www.cnblogs.com/sgczw/p/11840832.html
Copyright © 2011-2022 走看看