#include<stdio.h> #include<string.h> void Fenxi(char c,char b); void word(char a[]); void number(char a[]); int i; //定義全域性變數i int s=1; //用來記錄是否存在非法字元 main(){ char a[50]; printf("請輸入源程式:"); gets(a); printf("您要分析的源程式為:"); printf("%s",a); printf("\n"); for(i=0;(a[i]!='\0')&&(i<50)&&s==1;i++) { if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z')) word(a); else if(a[i]>='0' && a[i]<='9') number(a); else Fenxi(a[i],a[i+1]); } printf("\n"); } void number(char a[]) //對數字字元進行掃描分析 { char b[50]; 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(")"); } void word(char a[]) //對字母字元進行掃描分析,並識別保留字 { int k=0,m,flag=0,t; char b[50]; 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++; b[k]='\0'; } i=m-1; for(t=0;t<6;t++) { if(strcmp(b,key[t])==0) //將陣列b與關鍵字進行比較 { printf("(%d,%s)",t+1,key[t]); //輸出關鍵字 flag=1; } } if(flag==0) { printf("(10,%s)",b); //輸出識別符號 } } void Fenxi(char c,char b) //對特殊字元進行掃描分析 { switch(c){ case ' ': break; case '+': printf("(13,+)"); break; case '-': printf("(14,-)"); break; case '*': printf("(15,*)"); break; case '/': printf("(16,/)"); break; case ':': if(b=='=') { i++; printf("(18,:=)"); } else printf("(17,:)"); break; case '<': if(b=='>') { i++; printf("(21,<>)"); } else if(b=='=') { i++; printf("(22,<=)"); } else printf("(20,<)"); break; case '>': if(b=='=') { printf("(24,>=)"); i++; } else printf("(23,>)"); break; case '=': printf("(25,=)"); break; case ';': printf("(26,;)"); break; case '(': printf("(27,()"); break; case ')': printf("(28,))"); break; case '#': printf("(20,#)"); break; default: { printf("\n存在字元 '%c',無法繼續識別!\n",c); s=0; //用s=0記錄存在非法字元 break; } } }
執行結果: