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