实验报告一 词法分析程序
实验一、词法分析程序实验
一、 实验目的
编制一个词法分析程序。
二、 实验内容和要求
1.输入:源程序字符串。
2.输出:二元组(种别,单词本身)
3.待分析语言的词法规则
主要是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c
可执行程序名:cifafenxi.exe
2. 原理分析及流程图
3. 主要程序段及其解释:
1 #include<stdio.h> 2 3 #include<string.h> 4 5 char one[9][10]={"begin","if","then","while","do","end","main","int","char"}; 6 7 int number; 8 9 10 11 int fenxi(char a[],int p) 12 13 { 14 15 char b[10]; 16 17 int i=0,j=1,q; 18 19 b[0]=a[0]; 20 21 printf("\n"); 22 23 if((b[0]>='a'&&b[0]<='z')||(b[0]>='A'&&b[0]<='Z')) 24 25 { 26 27 for(j=1;j<10;j++) 28 29 { 30 31 b[j]=a[j]; 32 33 if(b[j]==' ') 34 35 { 36 37 b[j]='\0'; 38 39 p=j; 40 41 break; 42 43 } 44 45 } 46 47 for(j=0;j<9;j++) 48 49 if(strcmp(b,one[j])==0) 50 51 { 52 53 printf("(%d,%s)",j+1,b); 54 55 q=0; 56 57 return p; 58 59 } 60 61 else 62 63 q=1; 64 65 if(q==1) 66 67 { 68 69 printf("(10,%s)",b); 70 71 return p; 72 73 } 74 75 76 77 } 78 79 if((b[0]>=48)&&(b[0]<=57)) 80 81 { 82 83 for(j=1;j<10;j++) 84 85 { 86 87 b[j]=a[j]; 88 89 if(b[j]==' ') 90 91 { 92 93 b[j]='\0'; 94 95 p=j; 96 97 printf("(11,%s)",b); 98 99 return p; 100 101 } 102 103 } 104 105 } 106 107 if((b[0]=='+')||(b[0]=='-')||(b[0]=='*')||(b[0]=='/')||(b[0]=='=')||(b[0]=='(')||(b[0]==')')||(b[0]=='#')) 108 109 { 110 111 b[1]=a[1]; 112 113 if(b[1]==' ') 114 115 { 116 117 p=1; 118 119 b[1]='\0'; 120 121 } 122 123 switch(b[0]) 124 125 { 126 127 case '+':j=13;break; 128 129 case '-':j=14;break; 130 131 case '*':j=15;break; 132 133 case '/':j=16;break; 134 135 case '=':j=25;break; 136 137 case ';':j=26;break; 138 139 case '(':j=27;break; 140 141 case ')':j=28;break; 142 143 case '#':j=0;break; 144 145 } 146 147 printf("(%d,%s)",j,b); 148 149 return p; 150 151 } 152 153 if((b[0]==':')||(b[0]=='>')||(b[0]=='<')) 154 155 { 156 157 b[1]=a[1]; 158 159 if((b[1]!='=')&&(b[1]!='>')&&(b[1]!='<')&&(b[1]==' ')) 160 161 { 162 163 164 165 p=1; 166 167 b[1]='\0'; 168 169 switch(b[0]) 170 171 { 172 173 case ':':j=17;break; 174 175 case '<':j=20;break; 176 177 case '>':j=23;break; 178 179 } 180 181 printf("(%d,%s)",j,b); 182 183 return p; 184 185 } 186 187 else 188 189 { 190 191 b[1]=a[1]; 192 193 b[2]='\0'; 194 195 p=2; 196 197 if((b[0]==':')&&(b[1]=='='))j=18; 198 199 else if((b[0]=='<')&&(b[1]=='='))j=21; 200 201 else if((b[0]=='>')&&(b[1]=='='))j=24; 202 203 else if((b[0]=='<')&&(b[1]=='>'))j=22; 204 205 printf("(%d,%s)",j,b); 206 207 return p; 208 209 } 210 211 } 212 213 214 215 } 216 217 218 219 void maopao(char a[],int p) 220 221 { 222 223 int i; 224 225 for(i=0;a[i]!='\0';i++) 226 227 a[i]=a[p+i+1]; 228 229 } 230 231 232 233 main() 234 235 { 236 237 char a[100]; 238 239 int p; 240 241 printf("请输入一段程序(空格后回车结尾):"); 242 243 244 245 gets(a); 246 247 do 248 249 { 250 251 p=fenxi(a,p); 252 253 maopao(a,p); 254 255 }while(a[0]!='\0'); 256 257 }
4. 运行结果及分析
四、 实验总结
这是编译原理这门课的开始程序,讲真看这门课真的跟天书一样,很多东西都是很难理解的,很抽象,像这个词法编译器,是老师讲了很久才懂得原理,很多功能还不是很完善,有许多要改进的地方,也有很多的BUG,想了很久也很难解决问题,不过最后还是完成了这个程序,学到了很多知识,也复习了大一所学的c语言许多语法。
实验问题:
1.不知道该如何判断每一个单元的词法。
2.如何不断地进行词法分析,如何结束。
解决方案:
1.定义一个新的数组,并将原字符串读到空格后赋值给这个新的数组,然后对这个新数组中存储的字符串进行判断。
2.利用循环,每判断一次,就将之前判断的单元删除,另后面的字符串浮到上面来继续进行判断,直到原字符串剩下‘\0’,退出循环。