实验一、词法分析实验
专业:商业软件工程三班 姓名:郑锦诚 学号:201506110198
一、实验目的
词法分析是编译的第一阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。
二、实验内容和要求
让用户输入一段程序段,然后逐个读取字符,将它们拼在一起,获取一个有意义的单词或符号,识别出单词或符号种别以及自身的值,并输出。
各种单词符号对应的种别码:
单词符号 | 种别码 | 单词符号 | 种别码 |
begin | 1 | : | 17 |
if | 2 | := | 18 |
then | 3 | < | 20 |
while | 4 | <= | 21 |
do | 5 | <> | 22 |
end | 6 | > | 23 |
l(l|d)* | 10 | >= | 24 |
dd* | 11 | = | 25 |
+ | 13 | ; | 26 |
- | 14 | ( | 27 |
* | 15 | ) | 28 |
/ | 16 | # | 0 |
三、实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中源程序名词法分析.c
可执行程序名:词法分析.exe
- 2. 原理分析及流程图
主要总体设计问题:本次实验程序是用顺序存储结构,关键函数为mor,没有参数,也没有返回值,全用全局变量来实现运行代码,多次使用循环语句while、do whlie以及for,也使用了判断语句if、else判断是否为符号时使用了switch语句进行执行判断。
- 3. 主要程序段及其解释:
void mor()//主要函数的调用 { sum=0; //先把sum赋值为0 ch=a[p++]; //把有程序段数组a的字符赋给ch,p再加一 m=0; //把m赋值为0 while((ch==' ')||(ch=='\n')||(ch=='\t')) ch=a[p++]; //判断ch是否为空格,若是则进行判断下一个字符,p再加一 if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) {//判断字符ch是否是字母,若是则赋值给数组b,ch指向判断下一个字符是否是字母或是数字,并且p加一 while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) { b[m++]=ch; ch=a[p++]; } p--; //循环结束后,p减一,为了防止漏掉字符 syn=10; //先把syn赋值为10,再进行判断是否是保留字或是关键字 b[m++]='\0';//并把数组b的下一位赋值为\0,这样防止系统出现混乱 for(n=0;n<6;n++) //循环6次进行判断是否为保留字 if(strcmp(b,word[n])==0) //关键字数组比较,相同则表示为关键字,种别码即为下标值加一 { syn=n+1; return; } } else if((ch>='0')&&(ch<='9')) //或者字符ch是数字的 { while((ch>='0')&&(ch<='9')) //再次判断下一个字符是否为数字 { sum=sum*10+ch-'0'; //将字符型转化为整形sum ch=a[p++]; //字符ch指向下一个程序段数组a的字符 } p--; //循环结束后,p减一,为了防止漏掉字符 syn=11; //数字的种别码是11 } else //else语句内识别除关键字、标识符、数字以外的其他字符 { switch(ch) { case '+': //字符ch是+的,syn赋值为13 syn=13; b[m++]=ch; //字符ch指向程序段数组a的下一个字符,p加一 break; case '-': /字符ch是-的,syn赋值为14 syn=14; b[m++]=ch;//字符ch指向程序段数组a的下一个字符,p加一 break; case '*': syn=15; b[m++]=ch;//字符ch指向程序段数组a的下一个字符,p加一 break; case '/': syn=16; b[m++]=ch; /字符ch指向程序段数组a的下一个字符,p加一 break; case ':': b[m++]=ch; ch=a[p++];//字符ch指向程序段数组a的下一个字符,p加一 if(ch=='=') //判断字符ch是否为=,若是则赋值到数组b中 { syn=18; b[m++]=ch; } else //否则赋值为18,再p减一 { syn=18; p--; } break; case '!': //为!则结束程序 syn=-2; break; default: //输入一个错误的字符的时候 syn=-1; break; } } b[m++]='\0'; //把数组b的下一位赋值为\0 } 运行结果及分析
四、实验运行结果
结果符合预期,词法分析程序先识别字母if进行判断,符合字符数组Word的保留字进行输出种别码以及自身的值,遇到空格就指向下一位,从而执行i,以此类推,当识别到!时程序结束。
五、 实验总结
难点问题:1.编译时出现死循环或不循环。
2.输入保留字或关键字时,输出的结果没有符合预期,有时保留字变成关键字,关键字变成保留字。
解决方法:1.循环嵌套出错以及循环条件&&,||的不规范使用导致的,已修改好。
2.在数组b的下一位等于\0,就可以解决了。
心得体会:经过这次的实践,我认识到自己的不足以及粗心,在今后的学习道路上相信会更加的出彩,多找到自己的不足,才能更好的加强自己的能力。