• 递归下降分析


    对于给定的文法G[E] :

    E→E+T|E-T|T
    T→T*F| T/F|F
    F→(E)|i

    消除左递归后的文法是:
    E→TE'

    E'→+TE'|-TE'|∑

    T→FT'

    T'→*FT'|/FT'|∑

    F→(E)|i

    是否是LL(1)文法?

    select(E→TE')=first(TE')={(,i}
    select(E'→+TE')=first(+TE')={+}
    select(E'→-TE')=first(-TE')={-}
    select(E'→∑)=follow(E')={),#}
    select(T→FT')=first(FT')={(,i}
    select(T'→*FT')=first(*FT')={*}
    select(T'→/FT')=first(/FT')={/}
    select(T'→∑)=follow(T')={+,-,),#)
    select(F→(E))=first((E))={(}
    select(F→i)=first(i)={i}

    由上分析,得知此文法满足LL(1)文法

    代码如下

     1 #include<stdio.h>
     2 #include<string>
     3 char str[10];   //记录要分析的字符串
     4 int x=0;        //记录第一个字符
     5  
     6 void E();           
     7 void X();           
     8 void T();           
     9 void Y(); 
    10 void F(); 
    11  
    12 int main()
    13 {
    14     int len;
    15     printf("请输入算数表达式:");
    16     scanf("%s",str);
    17     len=strlen(str);
    18     str[len]='#';
    19     str[len+1]='';
    20     E();
    21     printf("
    正确!
    ");
    22     strcpy(str,"");
    23     x=0;
    24     return 0;
    25 }
    26  
    27 void E()
    28 {
    29     T();
    30     X();
    31 }
    32  
    33 void X()
    34 {
    35     if(str[x]=='+'||str[x]=='-')
    36     {
    37         x++;
    38         T();
    39         X();
    40     } 
    41 }
    42  
    43 void T()
    44 {
    45     F();
    46     Y();
    47 }
    48  
    49 void Y()
    50 {
    51     if(str[x]=='*'||str[x]=='/')
    52     {
    53         x++;
    54         F();
    55         Y();
    56     }
    57 }
    58  
    59 void F()
    60 {
    61     if(str[x]>='a'&&str[x]<='z')
    62     {
    63         x++;
    64     }
    65     else if(str[x]>=0&&str[x]<=9)
    66     {
    67         x++;
    68     }
    69     else if (str[x]=='(')
    70     {     
    71         x++;
    72         E();
    73         if(str[x]==')')
    74         {
    75             x++; 
    76         }
    77         else
    78         {
    79             printf("
    错误!
    ");
    80             exit(0);
    81         }
    82     } 
    83     else
    84     {
    85         printf("
    错误r!
    "); 
    86 exit(0);
    87  }
    88  }
  • 相关阅读:
    SQL 多列合并一列
    jQuery Ajax post多个值传参
    jquery获取select选中的值
    js 事件对象
    有关cookie
    事件冒泡和事件捕获
    js事件监听
    阻止浏览器的默认行为
    鼠标拖拽效果
    自定义右键菜单
  • 原文地址:https://www.cnblogs.com/crx234/p/6188547.html
Copyright © 2020-2023  润新知