zoukankan      html  css  js  c++  java
  • 11.13消除左递归

    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(ε) - {ε} U FOLLOW(E’) = FOLLOW(E’) = { ) , # }

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

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

           SELECT(T’ -> ε) = FIRST(ε) - {ε} U FOLLOW(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’ -> ABe | ε

           B -> dB’

           B’ -> bB’ | ε

     FIRST集:

      FIRST(A) = { a }

      FIRST(A’) = { a , ε }

      FIRST(B) = { d }

      FIRST(B’) = { 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(ε) - {ε} U FOLLOW(A’) = FOLLOW(A’) = { d , # }

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

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

           SELECT(B’ -> ε) = FIRST(ε) - {ε} U FOLLOW(B’) = FOLLOW(B’) = { e }

    (3)

    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(ε) - {ε} U FOLLOW(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 }

  • 相关阅读:
    AT2364 Colorful Balls
    SP5973 SELTEAM
    codeforces469B
    校内题目T2691 桶哥的问题——送桶
    关于一种6的倍数判定素数的方法
    P1903 奖学金题解
    说说关于洛谷P4779迪杰斯特拉的堆优化
    清北学堂北京大学文宏宇神仙讲课day7
    CF961F k-substrings
    CF985F Isomorphic Strings
  • 原文地址:https://www.cnblogs.com/Azan1999/p/11856472.html
Copyright © 2011-2022 走看看