我的词法分析程序之实现
这次的实验是编制一个词法分析程序,要求输入一源程序的字符串,然后以二元组的形式输出种别,单词。在我看来就是将输入的所有字符串进行判断,根据字符串的不同性质分为不同的种别码,然后以单词符号的形式进行输出。
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 '$')\n"); 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)\n",syn,num); break;//如果是7,那么就是数字 37 case 0: printf("(%d,%c)\n",syn,compare[0]);break;//如果是0,那么是$ 结束 38 case -2: row=row++;break; 39 default: printf("(%d,%s)\n",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=='\n')//如果字符是空格或者回车,跳过 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]='\0'; 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'\n':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→{""".",","+".......}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步