1 #include<stdio.h> 2 #include<string.h> 3 int i,s=1; 4 5 //判断是否数字 6 void number(char a[]) 7 { 8 char b[100]; 9 int m,k=0,t; 10 m=i; 11 while(a[m]>='0' && a[m]<='9') 12 { 13 b[k]=a[m]; //用数组b存放数组a中的数字 14 k++; 15 m++; 16 } 17 i=m-1; 18 printf("(11,"); 19 for(t=0;t<k;t++) 20 printf("%c",b[t]); 21 printf(")\n"); 22 } 23 24 //检索关键字表格 25 void keyword(char a[]) 26 { 27 int k=0,m,flag=0,t; 28 char b[100]; 29 char *key[6]={"begin","if","then","while","do","end"}; 30 m=i; 31 while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母 32 { 33 b[k]=a[m]; 34 k++; 35 m++; 36 b[k]='\0'; 37 } 38 i=m-1; 39 for(t=0;t<6;t++) 40 { 41 if(strcmp(b,key[t])==0) //将数组b与关键字进行比较 42 { 43 printf("(%d,%s)\n",t+1,key[t]); //输出关键字 44 flag=1; 45 } 46 } 47 if(flag==0) 48 { 49 printf("(?,%s)\n",b); //输出标识符 50 } 51 } 52 53 //词法扫描函数 54 void Fenxi(char ch,char b) 55 { 56 switch(ch) 57 { 58 case '=': 59 if(b==':') 60 printf("(18,:=)\n"); 61 else if(b=='<') 62 printf("(21,<=)\n"); 63 else if(b=='>') 64 printf("(24,>=)\n"); 65 else 66 printf("(25,=)\n"); 67 i++; 68 break; 69 case '+': 70 printf("(13,+)\n");break; 71 case '-': 72 printf("(14,-)\n");break; 73 case '*': 74 printf("(15,*)\n");break; 75 case '/': 76 printf("(16,/)\n");break; 77 case'(': 78 printf("(27,()\n");break; 79 case')': 80 printf("(28,))\n");break; 81 case ',': 82 printf("(32,,)\n");break; 83 case ':': 84 if(b=='=') 85 printf("(18,:=)\n"); 86 else 87 printf("(17,:)\n"); 88 i++; 89 break; 90 case ';': 91 printf("(34,;)\n");break; 92 case '>': 93 if(b=='=') 94 printf("(24,>=)\n"); 95 else 96 { 97 i=i-2; 98 if(b=='<') 99 printf("(22,<>)\n"); 100 else 101 printf("(23,>)\n"); 102 } 103 i++; 104 break; 105 case '<': 106 if(b=='=') 107 printf("(21,<=)\n"); 108 else if(b=='>') 109 printf("(22,<>)\n"); 110 else 111 printf("(20,<)\n"); 112 i++; 113 break; 114 default: 115 s=0; 116 break; 117 } 118 } 119 120 main() 121 { 122 char a[100]; 123 printf("请输入源程序(以#结束):\n"); 124 scanf("%[^#]s",&a); 125 printf("\n输入要分析的源程序为:\n"); 126 printf("%s",a); 127 printf("\n"); 128 printf("\n分析结果为:\n"); 129 i=0; 130 while(i<100&&a[i]!='#') 131 { 132 if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122)) 133 keyword(a); 134 else if(a[i]>=48&&a[i]<=57) 135 number(a); 136 else 137 Fenxi(a[i],a[i+1]); 138 i++; 139 } 140 printf("\n"); 141 }
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)