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

    FIRST集:

       FIRST(TE')={ (, i }

       FIRST(+TE')={+}

     FIRST(ε)={ε}

     FIRST(FT')={ (, i }

     FIRST(*FT')={*}

     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'->ε)=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}

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

     (2) A -> aABe | a

          B -> Bb | d

    改后:

        A -> aA'

        A' -> A'Be | ε

        B -> dB'

        B' -> B'b | ε

    FIRST集:

     FIRST(aA')={a}

     FIRST(A'Be)={a}

     FIRST(ε)={ε}

     FIRST(dB')={d}

     FIRST(bB')={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 -> Aa | b

     A -> SB

     B -> ab

    FIRST集:

     FIRST(bS')={b}

     FIRST(BaS')={a}

     FIRST(ε)={ε}

     FIRST(ab)={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(Ap)={a,c,p}

     FIRST(a)={a}

     FIRST(ε)={ε}

     FIRST(cA)={c}

     FIRST(aA)={a}

    FOLLOW集:

     FOLLOW(S)={#}

     FOLLOW(A)={p}

    SELECT集: 

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

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

     SELECT(A->ε)=FIRST(ε)-{ε}UFOLLOW(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(Ap)={a,c}

     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,c}

     SELECT(S->Bp)=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}

  • 相关阅读:
    这个星期一好像有点无聊
    SQL、LINQ、Lambda三种方式比较
    [C#基础知识]Class和Struct的区别
    C#判断大批量的路径是否存在时,如何缩短判断时间
    批处理 for参数之token详解
    批处理Delims的基本知识
    读取txt文本中每一条路径(一行)并判断,路径不存在的保存在另一txt文本中
    批处理获取一些系统参数
    Cannot read configuration file due to insufficient permissions
    my97datepicker日期选择插件的用法
  • 原文地址:https://www.cnblogs.com/zxf001/p/11847578.html
Copyright © 2011-2022 走看看