#include<stdio.h> #include<string.h> int i,s=1; //判断是否数字 void number(char a[]) { char b[100]; int m,k=0,t; m=i; while(a[m]>='0' && a[m]<='9') { b[k]=a[m]; //用数组b存放数组a中的数字 k++; m++; } i=m-1; printf("(11,"); for(t=0;t<k;t++) printf("%c",b[t]); printf(")\n"); } //检索关键字表格 void keyword(char a[]) { int k=0,m,flag=0,t; char b[100]; char *key[6]={"begin","if","then","while","do","end"}; m=i; while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母 { b[k]=a[m]; k++; m++; b[k]='\0'; } i=m-1; for(t=0;t<6;t++) { if(strcmp(b,key[t])==0) //将数组b与关键字进行比较 { printf("(%d,%s)\n",t+1,key[t]); //输出关键字 flag=1; } } if(flag==0) { printf("(10,%s)\n",b); //输出标识符 } } //词法扫描函数 void Fenxi(char ch,char b) { switch(ch) { case '=': printf("(25,=)\n");break; case '+': printf("(13,+)\n");break; case '-': printf("(14,-)\n");break; case '*': printf("(15,*)\n");break; case '/': printf("(16,/)\n");break; case'(': printf("(27,()\n");break; case')': printf("(28,))\n");break; case ',': printf("(32,,)\n");break; case ';': printf("(34,;)\n");break; case ':': if(b=='=') { i++; printf("(18,:=)\n"); } else printf("(17,:)\n"); break; case '<': if(b=='>') { i++; printf("(21,<>)\n"); } else if(b=='=') { i++; printf("(22,<=)\n"); } else printf("(20,<)\n"); break; case '>': if(b=='=') { printf("(24,>=)\n"); i++; } else printf("(23,>)\n"); break; default: s=0; break; } } main() { char p; char a[100]; printf("请输入源程序(以#结束):\n"); for(i=0;i<100;i++) { scanf("%c",&p); a[i]=p; if(p=='#') break; } printf("\n分析结果为:\n"); i=0; while(i<100&&a[i]!='#') { if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122)) keyword(a); else if(a[i]>=48&&a[i]<=57) number(a); else Fenxi(a[i],a[i+1]); i++; } if(a[i]=='#') printf("(0,#)"); printf("\n"); }