资源描述:
《编译原理实验1扫描器的设计与实现.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验1:扫描器的设计与实现1.1.目的和要求1.加深对词法分析理论的理解,培养动手实践的能力。2.学会从以字符串表示的源程序中识别出具有独立意义的基本语法单位,同时指出它们的属性的方法和技术。1.2.实验环境WindowsXP+WinTC1911.3.实验准备1、先将课本3.5节词法分析程序的生成认真的学习一遍,理解词法分析程序的构成过程。2、写出C语言测试程序,分析可能得到的结果。测试程序:#definepi3.14voidmain(){doubler=2.5;doubles=0.0;s=pi*r*r;printf("%
2、f",s);}预测结果:(513,#)(14,define)(100,pi)(200,3)(514,.)(200,14)(1,void)(2,main)(502,()(503,))(506,{)(15,double)(100,r)(402,=)(200,2)(514,.)(200,5)(501,;)(15,double)(100,s)(402,=)(200,0)(514,.)(200,0)(501,;)(100,s)(402,=)(100,pi)(416,*)(100,r)(416,*)(100,r)(501,;)(12,
3、printf)(502,()(509,")(511,%)(100,f)(509,")(512,,)(100,s)(503,))(501,;)(507,})1.4.实验内容及步骤1、输入已给的文本格式的扫描程序Lexical.c文件,然后编译运行,检查修改错误。2、编译成功后,提示输入C语言测试程序,用回车键查看输出的单词流,即单词符号及其属性。3、比较自己分析的结果和屏幕上的输出结果。1.5.实验小结1、得到的经验。通过本次实验,我了解了如何设计、编制并调试词法分析程序,加深了对词法分析原理的理解。同时,在编制和调试程序时
4、要全面考虑,避免漏掉或者错误定义定界符等,造成不必要的错误。2、遇到的主要问题。忘记对空格、回车符等定界符进行设置等。3、改进方案。(1)char*keywords[15]={"void","main","if","then","break","int","char","float","include","for","while","printf","scanf","define","double"};(2)case13:{flag=14;status=1;break;}case14:{flag=15;status=1;b
5、reak;}(3)case'.':{words[j]=ch;words[j+1]=' ';flag=514;break;}case'':{words[j]='';flag=250;break;}case'':{flag=251;break;}(4)elseif(flag==250
6、
7、flag==251){}修改前源代码:#include"stdio.h"#include"stdlib.h"#include"string.h"inti,j,k,flag,number,status;/*statuswhichisuset
8、ojudgethestringiskeywordsornot!*/charch;charwords[10]={""};charprogram[500];intScan(charprogram[]){char*keywords[13]={"void","main","if","then","break","int","char","float","include","for","while","printf","scanf"};number=0;status=0;j=0;ch=program[i++];/*Tohandlet
9、helettlespaceandstab*//*handleletters*/if((ch>='a')&&(ch<='z')){while((ch>='a')&&(ch<='z')){words[j++]=ch;ch=program[i++];}i--;words[j++]=' ';for(k=0;k<13;k++)if(strcmp(words,keywords[k])==0)switch(k){case0:{flag=1;status=1;break;}case1:{flag=2;status=1;break;}ca
10、se2:{flag=3;status=1;break;}case3:{flag=4;status=1;break;}case4:{flag=5;status=1;break;}case5:{flag=6;status=1;break;}case6:{flag=7;status=1;break;}case