• 11.LL(1)文法的判断


     

     

    文法G(S):

    S->AB

    A->Da|ε

    B->cC

    C->aADC|ε

    D->b|ε

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

    FIRST(Da)={b,a}

    FIRST(aADC)={a}

    FIRST(b)={b}

    FIRST(ε)={ε}

    FOLLOW(A)={c,b,a,#}

    FOLLOW(C)={#}

    FOLLOW(D)={a,#}

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

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

    SELECT(C->aADC)={a}

    SELECT(C->ε)={#}

    SELECT(D->b)={b}

    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)文法?

    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((E)|i)={ i }

    FOLLOW集

    FOLLOW(E)={#,)}

    FOLLOW(E')={ ),#}

    FOLLOW(T)={ + ,),#}

    FOLLOW(T')={ +,),# }

    FOLLOW(F)={ *,+,),# }

    SELECT集

    SELECT(E->TE')={(,i }

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

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

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

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

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

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

    SELECT(F->i)={ i }

    SELECT(E'->+TE') ∩ SELECT(E'->ε) = ∅

    SELECT(T'->*FT') ∩ SELECT(T'->ε) = ∅

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

    综上可知文法是LL(1)文法。

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

     1 void ParseE()
     2 {
     3     switch(lookahead)
     4     {
     5         case (,i:
     6             ParseT();
     7             ParseE'();
     8             break;
     9         default:
    10             printf("error
    ");
    11             exit(0);
    12     }
    13 }
    14 void ParseT()
    15 {
    16     switch(lookahead)
    17     {
    18         case (,i:
    19             ParseF();
    20             ParseT'();
    21             break;
    22         default:
    23             printf("error
    ");
    24             exit(0);  
    25     }
    26 }
    27 void ParseE'()
    28 {
    29     switch(lookahead)
    30     {
    31         case +:
    32             MarchToken(+);
    33             ParseT()
    34             ParseE'()
    35             break;
    36         case ),#:
    37             break;
    38         default:
    39             printf("error
    ");
    40             exit(0);
    41     }
    42 }
    43 void ParseT'()
    44 {
    45     switch(lookahead)
    46     {
    47         case *:
    48             MarchToken(*);
    49             ParseF()
    50             ParseT'()
    51             break;
    52         case +,),#:
    53             break;
    54         default:
    55             printf("error
    ");
    56             exit(0);
    57     }
    58 }
    59 void ParseF()
    60 {
    61     switch(lookahead)
    62     {
    63         case (:
    64             MarchToken(();
    65             ParseE();
    66             break;
    67         case i:
    68             MarchToken(i);
    69             break;
    70         default:
    71             printf("error
    ");
    72             exit(0);
    73     }
    74 }

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

  • 相关阅读:
    JAVA常见面试题之Forward和Redirect的区别
    springMVC学习笔记(二)-----注解和非注解入门小程序
    springMVC学习笔记(一)-----springMVC原理
    C语言关键字
    JAVA HASHMAP 如何用
    java中HashMap详解
    java中dao层和service层的区别是什么?
    到底DAO是什么?为什么要有它的存在?
    Ubuntu命令基础
    使用VMWare12.0安装Ubuntu系统
  • 原文地址:https://www.cnblogs.com/linyanli/p/11887034.html
Copyright © 2020-2023  润新知