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 }

  • 相关阅读:
    Android Studio遇到了“No USB devices or running emulators detected”
    (转)Android Studio启动AVD遇到的问题 ( HAXM安装失败)
    (转)秒懂,Java 注解 (Annotation)你可以这样学 ---- 重要 注解定义与反射解析
    DSL简介(转)
    有什么软件可以让手机使用卫星通信吗?
    Openfire调整成自己的IM部署到LInux系统上
    cpu和gpu的区别
    (转)OpenFire源码学习之二十七:Smack源码解析
    (转)OpenFire源码学习之十八:IOS离线推送
    (转)openfire插件开发(三)通过http方式向openfire客户端发信息
  • 原文地址:https://www.cnblogs.com/zqy1004/p/11847392.html
Copyright © 2011-2022 走看看