0916 编程实验一 词法分析程序
源程序:
1 #include<stdio.h> 2 #include<string.h> 3 void Fenxi(char c,char b); 4 void word(char a[]); 5 void number(char a[]); 6 int i; 7 int s=1; //用来记录是否存在非法字符 8 main(){ 9 char a[50]; 10 printf("请输入源程序:"); 11 gets(a); 12 printf("您要分析的源程序为:"); 13 printf("%s",a); 14 printf("\n"); 15 for(i=0;(a[i]!='\0')&&(i<50)&&s==1;i++) 16 { 17 if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z')) 18 word(a); 19 else if(a[i]>='0' && a[i]<='9') 20 number(a); 21 else 22 Fenxi(a[i],a[i+1]); 23 } 24 printf("\n"); 25 } 26 27 void number(char a[]) //对数字字符进行扫描分析 28 { 29 char b[50]; 30 int m,k=0,t; 31 m=i; 32 while(a[m]>='0' && a[m]<='9') 33 { 34 b[k]=a[m]; //用数组b存放数组a中的数字 35 k++; 36 m++; 37 } 38 i=m-1; 39 printf("(11,"); 40 for(t=0;t<k;t++) 41 printf("%c",b[t]); 42 printf(")"); 43 } 44 45 void word(char a[]) //对字母字符进行扫描分析,并识别保留字 46 { 47 int k=0,m,flag=0,t; 48 char b[50]; 49 char *key[6]={"begin","if","then","while","do","end"}; 50 m=i; 51 while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母 52 { 53 b[k]=a[m]; 54 k++; 55 b[k]='\0'; 56 m++; 57 } 58 i=m-1; 59 for(t=0;t<6;t++) 60 { 61 if(strcmp(b,key[t])==0) //将数组b与关键字进行比较 62 { 63 printf("(%d,%s)",t+1,key[t]); //输出关键字 64 flag=1; 65 } 66 } 67 if(flag==0) 68 { 69 printf("(10,%s)",b); //输出标识符 70 } 71 } 72 void Fenxi(char c,char b) //对特殊字符进行扫描分析 73 { 74 switch(c){ 75 case ' ': 76 break; 77 case '+': 78 printf("(13,+)"); 79 break; 80 case '-': 81 printf("(14,-)"); 82 break; 83 case '*': 84 printf("(15,*)"); 85 break; 86 case '/': 87 printf("(16,/)"); 88 break; 89 case ':': 90 if(b=='=') 91 { 92 i++; 93 printf("(18,:=)"); 94 } 95 else 96 printf("(17,:)"); 97 break; 98 case '<': 99 if(b=='>') 100 { 101 i++; 102 printf("(21,<>)"); 103 } 104 else if(b=='=') 105 { 106 i++; 107 printf("(22,<=)"); 108 } 109 else 110 printf("(20,<)"); 111 break; 112 case '>': 113 if(b=='=') 114 { 115 printf("(24,>=)"); 116 i++; 117 } 118 else 119 printf("(23,>)"); 120 break; 121 case '=': 122 printf("(25,=)"); 123 break; 124 case ';': 125 printf("(26,;)"); 126 break; 127 case '(': 128 printf("(27,()"); 129 break; 130 case ')': 131 printf("(28,))"); 132 break; 133 case '#': 134 printf("(20,#)"); 135 break; 136 default: 137 { 138 printf("\n存在字符 '%c',无法继续识别!\n",c); 139 s=0; //用s=0记录存在非法字符 140 break; 141 } 142 } 143 }
运行结果:
posted on 2015-09-20 09:41 ganxiaoxiao 阅读(187) 评论(0) 编辑 收藏 举报