我的词法分析程序之实现

     这次的实验是编制一个词法分析程序,要求输入一源程序的字符串,然后以二元组的形式输出种别,单词。在我看来就是将输入的所有字符串进行判断,根据字符串的不同性质分为不同的种别码,然后以单词符号的形式进行输出。

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 char compare[10];//分开进行比较
  5 char ch;
  6 /*char rwtab[6]={"begin","if","then","while","do","end"};*/
  7 char r1[]={"begin"};
  8 char r2[]={"if"};
  9 char r3[]={"then"};
 10 char r4[]={"while"};
 11 char r5[]={"do"};
 12 char r6[]={"end"};
 13 
 14 char All[10000];//输入的所有值
 15 int syn,row;//syn是种别码
 16 int n,m,p,num,j;
 17 static int i = 0;
 18 void scaner();
 19 int main()
 20 {  
 21     row = 0 ;
 22     p   = 0 ;
 23     printf("Please input something:(end of '$')
");
 24     do
 25     {
 26         scanf("%c",&ch);
 27         All[p]=ch;
 28         p++;
 29     }//输入值到数组A【】中,以$结束
 30     while(ch!='$');
 31     do
 32     {
 33         scaner();//进入函数进行判定
 34         switch(syn)
 35         {
 36         case 7: printf("(%d,%d)
",syn,num); break;//如果是7,那么就是数字  
 37         case 0:  printf("(%d,%c)
",syn,compare[0]);break;//如果是0,那么是$ 结束
 38         case -2: row=row++;break;
 39         default: printf("(%d,%s)
",syn,compare);break;//否则,就是变量名、关键词
 40         }
 41     }
 42     while (syn!=29);
 43 }
 44 void scaner()
 45 {
 46     /*
 47         共分为三大块,分别是标示符、数字、符号,对应下面的 if   else if  和 else
 48        
 49    
 50     */  
 51     for(n=0;n<7;n++)
 52           compare[n]=0;//每次循环完就清零
 53     ch=All[i];
 54     while(ch==' '||ch=='
')//如果字符是空格或者回车,跳过
 55     {
 56         i++;
 57         ch=All[i];
 58     }
 59     if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))  //可能是标示符或者变量名
 60     {
 61         m=0;
 62         while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//找到一个变量名或者关键字,直到遇到空格为止
 63         {
 64             compare[m]=ch;m++;
 65             i++;ch=All[i];
 66         }
 67         compare[m]='';
 68               //将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2......
 69               if(strcmp(compare,r1)==0){syn=1;}
 70               else if(strcmp(compare,r2)==0){syn=2; }
 71               else if(strcmp(compare,r3)==0){syn=3;}                             
 72               else if(strcmp(compare,r4)==0){syn=4;}
 73               else if(strcmp(compare,r5)==0){syn=5;}
 74               else if(strcmp(compare,r6)==0){syn=6;}
 75               else{syn=100;}    //变量名
 76     }
 77     else if((ch>='0'&&ch<='9'))  //数字
 78     {
 79         num=0;
 80         while((ch>='0'&&ch<='9'))
 81         {
 82             num=num*10+ch-'0';//显示其数字sum
 83             i++;
 84             ch=All[i];
 85         }
 86         syn=7;//数字是7
 87     }
 88     else switch(ch)   //其他字符
 89     {
 90         case'<':m=0;compare[m]=ch;m++;
 91             i++;ch=All[i];
 92             if(ch=='=')//<=为21
 93             {
 94                 syn=21;
 95                 compare[m]=ch;m++;i++;
 96             }
 97             else
 98             {
 99                 syn=20;//<为20
100             }
101             break;
102         case'>':m=0;compare[m]=ch;m++;
103             i++;ch=All[i];
104             if(ch=='=')
105             {
106                 syn=24;
107                 compare[m]=ch;m++;i++;
108             }
109             else
110             {
111                 syn=23;
112             }
113             break;
114         case':':m=0;compare[m]=ch;m++;
115             i++;ch=All[i];
116             if(ch=='=')
117             {
118                 syn=18;
119                 compare[m]=ch;m++;i++;
120             }
121             else
122             {
123                 syn=17;
124             }
125             break;
126         case'"':syn=10;compare[0]=ch;i++;break;  
127         case',':syn=11;compare[0]=ch;i++;break;    
128         case'.':syn=12;compare[0]=ch;i++;break;        
129         case'+':syn=13;compare[0]=ch;i++;break;
130         case'-':syn=14;compare[0]=ch;i++;break;
131         case'*':syn=15;compare[0]=ch;i++;break;
132         case'/':syn=16;compare[0]=ch;i++;break;
133         case'=':syn=25;compare[0]=ch;i++;break;
134         case';':syn=26;compare[0]=ch;i++;break;
135         case'(':syn=27;compare[0]=ch;i++;break;
136         case')':syn=28;compare[0]=ch;i++;break;
137         case'#':syn=0;compare[0]=ch;i++;break;
138         case'$':syn=29;compare[0]=ch;i++;break;
139         case'{':syn=30;compare[0]=ch;i++;break;
140         case'}':syn=31;compare[0]=ch;i++;break;
141         case'
':syn=-2;break;
142         default: syn=-1;break;
143     }
144 }

      以上便是我的源代码,这个是源代码编译的结果

我编写的种别码如下

词法规则分析

字母 A→{a....z&A...Z} S→A|AA

数字 B→{1,2,3,4,5,6,7,8,9} S→B|BB|B0

关键字 C→{begin,if,end,do,while,then}

符号 D→{""".",","+".......}

原文地址:https://www.cnblogs.com/wxf2/p/5925333.html