zoukankan      html  css  js  c++  java
  • 编译原理第十次作业

    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

     

    分析符号串i*i+i:

     

     

     first集:

       FIRST(E)={ (, i }

      FIRST(E')={+, ε}

      FIRST(T)={ (, i }

      FIRST(T')={ *, ε }

      FIRST(F)={(,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'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }

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

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

      SELECT(T'->ε)=FIRST(ε)-{ε}UFOLLOW(T')=FOLLOW(T')={ +,),# }

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

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

     

    2A->aABe | a

    B->Bb | ε

    消除左递归

    A->aA’

    A’->ABw | ε

    B->dB’

    B’->bB’ | ε

    first集:

      FIRST(A)={a}

      FIRST(A’)={a, ε}

      FIRST(B)={d}

      FIRST(dB')={b, ε}

    follow集:

      FOLLOW(A)={d,#}

      FOLLOW(A')={d,#}

      FOLLOW(B)={e}

      FOLLOW(B')={e}

    select集:

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

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

      SELECT(A'->ε)=FIRST(ε)-{ε}UFOLLOW(A')=FOLLOW(A')={d,#}

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

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

      SELECT(B'->ε)=FIRST(ε)-{ε}UFOLLOW(B')=FOLLOW(B')={e}

     

    (3)S->Aa | b

    A->SB

    B->ab

    消除左递归:

    S->SBa | b

    B->ab

    即:

    S->bS’

    S’->BaS’ | ε

    B->ab

     first集:

      FIRST(S)={b}

    FIRST(S’)={a, ε}

    FIRST(B)={a}

    follow集:

    FOLLOW(S)={#}

    FOLLOW(S')={#}

    FOLLOW(B)={a}

    select集:

    SELECT(S->bS')=FIRST(bS')={b}

    SELECT(S'->BaS')=FIRST(BaS')={a}

    SELECT(S'->ε)=FIRST(ε)-{ε}UFOLLOW(S')=FOLLOW(S')={#}

    SELECT(B->ab)=FIRST(ab)={a}

     

    课堂练习:

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

    (1)S->Ap

    A->a | ε

    A->cA

    A->aA

     答:

    first集:

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

    FIRST(A) = { a , c , ε }

    follow集:

    FOLLOW(S) = { # }

    FOLLOW(A) = { p }

    select集:

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

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

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

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

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

     

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

    答:

    first集:

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

    FIRST(S2) = FIRST(Bq) = { b , d }

    FIRST(A) = { a , c}

    FIRST(B) = { b ,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 }

     

  • 相关阅读:
    分别使用vue和react创建一个可伸缩的树
    渲染一颗树(分别使用vue和react创建)
    n皇后问题JS实现(N-Queens)
    中序遍历二叉树(js)
    LeetCode 258 Add Digits
    js二维数组去重
    js 数组中sort方法存在的问题
    原生js实现一个简单轮播效果
    原生js实现一个连连看小游戏(三)-----------点击列表获取索引
    js生成随机不重复数字的几种方法
  • 原文地址:https://www.cnblogs.com/renshenbenzuig/p/11861702.html
Copyright © 2011-2022 走看看