词法分析程序
词法分析程序
实验要求:
输入:源程序字符串
输出:二元组(字符,单词符号本身)
各种单词符号对应的种别码:
程序源代码:
1 #include<stdio.h> 2 #include<string.h> 3 #define N 100 4 void priint(char str[],int i,int semp[]); 5 void pristring(char str[],int i,int semp[]); 6 void prichar(char str[],int i,int semp[]); 7 void main() 8 { 9 int i; 10 int temp; 11 char str[N]; 12 int semp[N]={0}; /*此数组用来标记str字符串里每个成员是否已进行分析,已分析为1,否则为0*/ 13 printf("输入您需要进行词法分析的源程序:"); 14 gets(str); 15 temp=strlen(str); /*temp所储存的是输入的字符串的长度*/ 16 for(i=0;i<temp;i++) 17 { /*利用ASCII码对字符进行分类并进入各自对应的函数*/ 18 if((semp[i]==0)&&(str[i-1]<48||str[i-1]>57)&&(str[i]>=48&&str[i]<=57)){ 19 priint(str,i,semp);}/*数字*/ 20 if((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122))){ 21 pristring(str,i,semp);}/*字母*/ 22 if((semp[i]!=1)&&((str[i]>=32&&str[i]<=47)||(str[i]>=58&&str[i]<=64)||(str[i]>=91&&str[i]<=96)||(str[i]>=123&&str[i]<=126))){ 23 prichar(str,i,semp);}/*符号*/ 24 } 25 } 26 27 void priint(char str[],int i,int semp[]) 28 { 29 char strtemp[N]={'\0'}; 30 int j,k; 31 for(j=0;j<N;j++) 32 { 33 if(str[i]<48||str[i]>57) break; 34 strtemp[j]=str[i]; 35 semp[i]=1; 36 i++; 37 } 38 printf("<11,"); 39 k=0; 40 do{ 41 printf("%c",strtemp[k]); 42 k++; 43 }while(strtemp[k]!='\0'); 44 printf(">\n"); 45 strnset(strtemp,'\0',N);/*将字符串strtemp的前N个字符都设为指定字符'\0'*/ 46 } 47 48 void pristring(char str[],int i,int semp[]) 49 { 50 int j=0; 51 int k; 52 char gechar[N]; 53 char *tempp[10]={"begin","if","then","while","do","end"}; /*二维字符数组*/ 54 do{ 55 gechar[j]=str[i]; 56 semp[i]=1; 57 i++; 58 j++; 59 }while((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122))); 60 if(strcmp(gechar,tempp[0])==0) {printf("<1,begin>");} /*strcmp功能:对两字符进行比较,相同返回0,不同则为其他数*/ 61 else if(strcmp(gechar,tempp[1])==0) {printf("<2,if>");} 62 else if(strcmp(gechar,tempp[2])==0) {printf("<3,then>");} 63 else if(strcmp(gechar,tempp[3])==0) {printf("<4,while>");} 64 else if(strcmp(gechar,tempp[4])==0) {printf("<5,do>");} 65 else if(strcmp(gechar,tempp[5])==0) {printf("<6,end>");} 66 else { 67 printf("<10,"); 68 for(k=0;k<j;k++) 69 { 70 printf("%c",gechar[k]); 71 } 72 printf(">\n"); 73 } 74 strnset(gechar,'\0',N); 75 } 76 77 void prichar(char str[],int i,int semp[]) 78 { 79 char gchar=str[i]; 80 switch(gchar) 81 { 82 case '+':printf("<13,%c>\n",gchar);semp[i]=1;break; 83 case '-':printf("<14,%c>\n",gchar);semp[i]=1;break; 84 case '*':printf("<15,%c>\n",gchar);semp[i]=1;break; 85 case '/':printf("<16,%c>\n",gchar);semp[i]=1;break; 86 case ':': 87 if(str[i+1]!='='){ 88 printf("<17,%c>\n",gchar); 89 semp[i]=1; 90 } 91 else if(str[i+1]=='='){ 92 printf("<18,%c%c>\n",gchar,str[i+1]); 93 semp[i]=1; 94 semp[i+1]=1; 95 } 96 break; 97 case '<': 98 if((str[i+1]!='=')&&(str[i+1]!='>')){ 99 printf("<20,%c>\n",gchar); 100 semp[i]=1; 101 } 102 else if(str[i+1]=='='){ 103 printf("<21,%c%c>\n",gchar,str[i+1]); 104 semp[i]=1; 105 semp[i+1]=1; 106 } 107 else if(str[i+1]=='>'){ 108 printf("<22,%c%c>\n",gchar,str[i+1]); 109 semp[i]=1; 110 semp[i+1]=1; 111 } 112 break; 113 case '>': 114 if(str[i+1]!='='){ 115 printf("<23,%c>\n",gchar); 116 semp[i]=1; 117 } 118 else if(str[i+1]=='='){ 119 printf("<24,%c%c>\n",gchar,str[i+1]); 120 semp[i]=1; 121 semp[i+1]=1; 122 } 123 break; 124 case '=': 125 if((str[i-1]!='<')&&(str[i-1]!=':')&&(str[i-1]!='>')){ 126 printf("<25,%c>\n",gchar); 127 semp[i]=1; 128 } 129 break; 130 case ';':printf("<26,%c>\n",gchar);semp[i]=1;break; 131 case '(':printf("<27,%c>\n",gchar);semp[i]=1;break; 132 case ')':printf("<28,%c>\n",gchar);semp[i]=1;break; 133 case '#':printf("<0,%c>\n",gchar);semp[i]=1;break; 134 default:printf("<非法字符,%c>\n",gchar);semp[i]=1; break; /*对种码表里没有的符号都默认为非法字符*/ 135 } 136 }
运行输出: