zoukankan      html  css  js  c++  java
  • 作业11 LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S):

    (1)S -> AB

    (2)A ->Da|ε

    (3)B -> cC

    (4)C -> aADC |ε

    (5)D -> b|ε

    验证文法 G(S)是不是 LL(1)文法?

    SELECT(A->Da) = {b,a}
    SELECT(A->ε) = {c,b,a,#}

    SELECT(C->aADC) = {a}

    SELECT(C->ε) = {#}

    SELECT(D->b) = {a,#}

    SELECT(D->ε) = {a,#}

    因为:

    SELECT(A->Da) ∩ SELECT(A->ε) ≠ Φ

    SELECT(C->aADC) ∩ SELECT(C->ε) = Φ

    SELECT(D->b) ∩ SELECT(D->ε) = Φ

    所以G(S)不是LL(1)文法。

    2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?

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

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

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

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

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

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

    因为:
    SELECT(E-> +TE') ∩ SELECT(E' -> ɛ) = Φ

    SELECT(T-> *FT' ) ∩ SELECT(T -> ɛ) = Φ

    SELECT(F -> (E) ) ∩ SELECT(F -> i ) = Φ

    所以消除左递归后的文法是 LL(1)文法

    3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。

    E()

        {T();

           E'();

         }

    E'()

    T()

    T'()

    F()

    代码如下:

    void ParseE(){
    
      switch(lookahead){
    
        case ‘(‘,‘i‘, ‘*‘:
    
          ParseT();
    
          ParseEP();
    
          break;
    
        default:
    
          print("syntx error!
    ");
    
          exit(0);
    
      }
    
    }
    void ParseEP(){   switch(lookahead){     case ‘+‘:       MatchToken(‘+‘);       ParseT();       ParseEP();       break;     case ‘#‘, ‘)‘:       break;     default:       print("syntx error! ");       exit(0);   } } void ParseT(){    switch(lookahead){     case ‘(‘,‘i‘:       ParseF();       ParseTP();       break;     default:       print("syntx error! ");       exit(0);   } } void ParseTP(){   switch(lookahead){     case ‘*‘:       MatchToken(‘*‘);       ParseF();       ParseTP();       break;     case ‘#‘, ‘)‘, ‘+‘:       break;     default:       print("syntx error! ");       exit(0);     }   } void ParseF(){   switch(lookahead){     case ‘(‘:       MatchToken(‘(‘);       ParseE();       MatchToken(‘)‘);       break;     case ‘i‘:       MatchToken(‘i‘);       break;     default:       print("syntx error! ");       exit(0);     }   }

     4.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

  • 相关阅读:
    [Swift]LeetCode806. 写字符串需要的行数 | Number of Lines To Write String
    [Swift]LeetCode805. 数组的均值分割 | Split Array With Same Average
    [Swift]LeetCode804. 唯一摩尔斯密码词 | Unique Morse Code Words
    [Swift]LeetCode803. 打砖块 | Bricks Falling When Hit
    [Swift]LeetCode802. 找到最终的安全状态 | Find Eventual Safe States
    [Swift]LeetCode801. 使序列递增的最小交换次数 | Minimum Swaps To Make Sequences Increasing
    [Swift]LeetCode799. 香槟塔 | Champagne Tower
    [Swift]LeetCode798. 得分最高的最小轮调 | Smallest Rotation with Highest Score
    [Swift]LeetCode797. 所有可能的路径 | All Paths From Source to Target
    转:12C PDB 配置不同的PDB监听端口
  • 原文地址:https://www.cnblogs.com/carmen-/p/11895584.html
Copyright © 2011-2022 走看看