• 编译原理随堂作业十-------消除左递归


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

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

         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')={ ( ( , i ) | T-->F-->{,T-->F-->i}

    FIRST(+TE')={+}

    FIRST(FT')={( ( , i ) | F-->{ , F-->I}

    FIRST(*FT")={*}

    FIRST(ε)={ε}

    FIRST((E))={ ( }

    FIRST(i)={i}

    FOLLOW集

    FOLLOW(E)={ ) }

    FOLLOW(E')={#}

    FOLLOW(T)={+}

    FOLLOW(T')={#}

    FOLLOW(F)={*}

    SELECT集

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

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

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

    SELECT(T-->FT' )=FIRST(FT')={( ( , i ) | F-->{ , F-->I}

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

    SELECT(T'-->ε)=FOLLOW(T')={#}

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

    SELECT(F-->i)=FIRST(i)={i}

    分析i*i+i

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

      A → aABe|a

      B → Bb|d

    提取公因子

    A-->aA'

    A'-->ABe | ε

    消除左递归

    B-->bB' | d

    B'-->*b | ε

    FIRST集

    FIRST(aA')={a}

    FIRST(ABe)={a | A-->a}

    FIRST(ε)={ε}

    FIRST(bB')={b}

    FIRST(d)={d}

    FIRST(*b)={*}

    FOLLOW集

    FOLLOW(A)=FIRST(B)={b}

    FOLLOW(A')={#}

    FOLLOW(B)={e}

    FOLLOW(B')={#}

    SELECT集

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

    SELECT(A'-->ABe)=FIRST(ABe)={a | A-->a}

    SELECT(A'-->ε)=FOLLOW(A')={#}

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

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

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

    SELECT(B'-->ε)=FOLLOW(B')={#}

      S → Aa|b

      A → SB

      B → ab

    带入S得

    S-->SBa | b

    B-->ab

    消除左递归

    S-->BaS' | b

    S'-->*B | e

    B-->ab

    (待修改)

    课堂练习:

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

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

    A->aA

     FIRST集

    FIRST(Ap)={(a,c,ε) | A-->a,A-->c,A-->ε}

    FIRST(a)={a}

    FIRST(ε)={ε}

    FIRST(cA)={c}

    FIRST(aA)={a}

    FOLLOW集

    FOLLOW(S)={#}

    FOLLOW(A)={p}

    SELECT集

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

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

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

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

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

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

    FIRST集

    FIRST(Ap)={a}

    FIRST(Bq)={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}

    SELECT(S->Bq)=FIRST(b)={b} U FIRST(dB)={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}

  • 相关阅读:
    switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
    int和Integer有什么区别?
    访问修饰符public,private,protected,以及不写(默认)时的区别?
    Hashmap如何同步?
    Iterator和ListIterator的区别?
    Java的HashMap是如何工作的?
    MyBatis与Hibernate有哪些不同?
    Spring框架中有哪些不同类型的事件?
    Spring的自动装配?
    Spring如何处理线程并发问题?
  • 原文地址:https://www.cnblogs.com/xiaoAP/p/11862833.html
Copyright © 2020-2023  润新知