• 1217递归下降语法分析程序设计


      1 #include <stdio.h>
      2 #include <string.h> 
      3 char prog[80], token[8]; 
      4 char ch; 
      5 int syn, p, m, n, sum, k=0; 
      6 char *rwtab[6]={"begin", "if", "then", "while", "do", "end"}; 
      7 void scaner(); 
      8 void E(); 
      9 void Y(); 
     10 void T(); 
     11 void B(); 
     12 void C(); 
     13 void A(); 
     14 void main() 
     15 { 
     16 
     17 
     18     p=0;  
     19     printf("请输入表达式:");
     20     do 
     21     { 
     22         scanf("%c", &ch); 
     23         prog[p++]=ch; 
     24     }while(ch!='#'); 
     25     p=0; 
     26     scaner(); 
     27     E(); 
     28 } 
     29 void scaner() 
     30 { 
     31     for(n=0; n<8; n++) 
     32         token[n]=NULL; 
     33     ch=prog[p++]; 
     34     while(ch==' '||ch=='
    ') ch=prog[p++]; 
     35     m=0; 
     36     if((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')) 
     37     { 
     38         while((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'))
     39         { 
     40             token[m++]=ch; 
     41             ch=prog[p++];    //    将prog数组的字母复制到ch数组中
     42         } 
     43         token[m++]='';    //把token的末尾设置结束符 
     44         p--;//标记到当前token数组中不是字母的当前位置
     45         syn=10;//标记字母的对应码
     46         for(n=0; n<6; n++) 
     47         { 
     48             if(strcmp(token, rwtab[n])==0)//判断token对应rwtab中的哪一个,并进行对应赋对应码
     49             { 
     50                 syn=n+1; 
     51                 break;    
     52             } 
     53         } 
     54     } 
     55     else if(ch>='0'&&ch<='9')
     56     {
     57         sum=0; 
     58         while(ch>='0'&&ch<='9') 
     59         { 
     60             sum=sum*10+ch-'0';//number用来记录所对应的数字
     61             ch=prog[p++]; 
     62         } 
     63         p--;
     64         syn=11;//标记数字的对应码
     65     } 
     66     else 
     67     { 
     68         switch(ch) 
     69         { 
     70         case '<': 
     71             m=0; 
     72             token[m++]=ch; 
     73             ch=prog[p++]; 
     74             if(ch=='>') 
     75             { 
     76                 syn=21;//标记”<>”的对应码
     77                 token[m++]=ch; 
     78             } 
     79             else if(ch=='=') 
     80             { 
     81                 syn=22; //标记”<=”的对应码
     82                 token[m++]=ch; 
     83             }
     84             else 
     85             {
     86                 syn=20;//标记”<”的对应码
     87                 p--; 
     88             } 
     89             break; 
     90         case '>': 
     91             token[m++]=ch; 
     92             ch=prog[p++]; 
     93             if(ch=='=')
     94             { 
     95                 syn=24; //标记”>=”的对应码
     96                 token[m++]=ch; 
     97             } 
     98             else 
     99             { 
    100                 syn=23;//标记”>”的对应码
    101                 p--; 
    102             } 
    103             break; 
    104         case ':': 
    105             token[m++]=ch; 
    106             ch=prog[p++]; 
    107             if(ch=='=')
    108             { 
    109                 syn=18;//标记”:=”的对应码
    110                 token[m++]=ch; 
    111             } 
    112             else
    113             { 
    114                 syn=17;//标记”:”的对应码
    115                 p--; 
    116             } 
    117             break;
    118         case '+': 
    119             syn=13;//标记”+”的对应码
    120             token[m++]=ch; 
    121             break; 
    122         case '-': 
    123             syn=14;//标记”-”的对应码
    124             token[m++]=ch; 
    125             break; 
    126         case '*':
    127             syn=15;//标记”*”的对应码
    128             token[m++]=ch; 
    129             break; 
    130         case '/': 
    131             syn=16;//标记”/”的对应码
    132             token[m++]=ch; 
    133             break;
    134         case '=': 
    135             syn=25;//标记”=”的对应码
    136             token[m++]=ch; 
    137             break; 
    138         case ';': 
    139             syn=26;//标记”;”的对应码
    140             token[m++]=ch; 
    141             break; 
    142         case '(': 
    143             syn=27;//标记”(”的对应码
    144             token[m++]=ch; 
    145             break; 
    146         case ')': 
    147             syn=28;//标记”)”的对应码
    148             token[m++]=ch; 
    149             break; 
    150         case '#': 
    151             syn=0;//标记”#”的对应码
    152             token[m++]=ch; 
    153             break; 
    154         default: 
    155             syn=-1;//当不是上述字母,数字,符号时,设置
    156             syn=-1;
    157         } 
    158         token[m++]=''; 
    159     } 
    160 
    161 } 
    162 
    163 void A()
    164 { 
    165     if(syn==10 || syn==11)
    166     { 
    167         scaner(); 
    168     } 
    169     else if(syn==27)
    170     { 
    171         scaner(); 
    172         B(); 
    173         if(syn==28)
    174             scaner(); 
    175         else 
    176         { 
    177             k=1; 
    178             printf("Error: )错误
    ");
    179         } 
    180     } 
    181     else 
    182     { 
    183         k=1; 
    184         printf("Error: 表达式错误
    ");
    185     } 
    186 } 
    187 void C()
    188 { 
    189     A(); 
    190     while(syn==15 || syn==16)
    191     { 
    192         scaner(); 
    193         A(); 
    194     } 
    195 
    196 } 
    197 void B()
    198 { 
    199     C(); 
    200     while(syn==13 || syn==14)
    201     { 
    202         scaner(); 
    203         C(); 
    204     } 
    205 
    206 } 
    207 void T()
    208 { 
    209     if(syn==10)
    210     { 
    211         scaner(); 
    212         if(syn==18)
    213         { 
    214             scaner(); 
    215             B(); 
    216         } 
    217         else
    218         { 
    219             k=1; 
    220             printf("Error: 赋值号错误
    ");
    221         } 
    222     } 
    223     else
    224     { 
    225         k=1; 
    226         printf("Error: 表达式错误
    "); 
    227     } 
    228 } 
    229 void Y()
    230 { 
    231     B();  
    232     while(syn==26)
    233     {
    234         scaner();
    235         B(); 
    236 
    237     } 
    238 
    239 } 
    240 void E()//程序
    241 { 
    242     if(syn==1)
    243     { 
    244         scaner(); 
    245         Y(); 
    246         if(syn==6) 
    247         { 
    248             scaner(); 
    249             if(syn==0 && k==0)
    250                 printf("是正确的表达式
    "); 
    251             else if(syn!=0 && k==0) 
    252             { 
    253                 k=1; 
    254                 printf("Error: end后未正常结束
    ");
    255             } 
    256         } 
    257         else
    258         { 
    259             if(k!=1) 
    260             { 
    261                 k=1; 
    262                 printf("Error: end错误
    ");
    263             } 
    264         }
    265     } 
    266     else 
    267     { 
    268         k=1; 
    269         printf("Error: begin错误
    ");
    270     } 
    271 
    272 } 

    运行结果:

  • 相关阅读:
    C# 操作XML
    js把字符串(yyyymmdd)格式转换成日期格式(yyyy-mm-dd)
    解析GZIP压缩的网页
    访问修饰符
    c# 多态中 Virtual与override的作用
    C# 中 ref 和out 的区别
    C# .net 中文手册地址
    js获取URL参数
    几种Css前端框架资料
    android 检查能否上网
  • 原文地址:https://www.cnblogs.com/sr1zsq/p/5091881.html
Copyright © 2020-2023  润新知