《构造词法分析器实习报告.doc》由会员分享,可在线阅读,更多相关《构造词法分析器实习报告.doc(8页珍藏版)》请在三一办公上搜索。
1、班级:06级计算机1班学号:姓名:成绩: 教学实习题目:构造词法分析器一、教学实习目的 编译原理课程设计是计算机应用专业的主要实践性教学环节,在学习了编译原理及专业基础课的基础上,设计一个实际的程序语言编译系统,可以加深对程序语言结构和机器处理方式的理解,初步掌握高级语言到机器指令的基本转换方法,提高进行工程设计的基本技能及分析解决实际问题的能力,为毕业设计和以后的工程实践打下良好的基础。二、教学实习要求 根据课本p43页的图3.3构造词法分析器。要求输入源数据文件,能够得出词法分析的结果,并显示出来,包括显示分离出来的单词符号、它们的助记符和内码值以及种类(如常数、字母、保留字及运算符、界符
2、等)。三、教学实习步骤3.1程序设计说明 3.1.1需求分析词法分析是编译过程的第一个阶段,他的任务是输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词符号,如基本字(begin、end、if、for、while等),标识符、常数、算符和界符(标点符号、左右括号等等)。单词符号是语言的基本组成成分,是人们理解和编写程序的基本要素。对于词法分析器,它的功能是输入源程序,输出单词符号。程序语言的单词符号一般有以下几种:(1)保留字,是程序语言定义的具有固定意义的标识符。(2)标识符,是用来表示各种名字,如变量名,数组名,过程名等等。(3)常数,一般有整型,实型,布尔型,文字型等等。
3、(4)运算符,如+、*、/等等。(5)界符,如逗号,分号,括号等等。在词法分析器中要求输出的单词符号以二元式的形式给出:(单词种别,单词符号的属性值),单词种别常常用助记符来表示,单词符号的属性值则用内码来表示。3.1.2详细设计首先给出词法分析器的结构图。从图中可以看出:词法分析器工作的第一步是输入源程序文本。输入串一般是放在一个缓冲区中,在很多情况下,把输入串处理一下,对单词符号的识别工作是比较方便的。预处理可以剔除一些无意义的符号,如注释、多个空白符等等。词法分析器调用预处理子程序后,处理出一串确定长度的输入字符,并将其装进词法分析器所指定的缓冲区中,即扫描缓冲区,之后词法分析器就在这个
4、缓冲区中直接进行单词符号的识别。当缓冲区里的字符串被处理完之后,它又调用预处理子程序装入新串。分析器对扫描缓冲区进行扫描时一般用两个指示器,一个指向当前正在识别的单词的开始位置,另一个用于向前搜索以寻找单词的终点,而单词符号识别采用的方法是超前搜索。超前搜索技术即在单词识别的过程中,通过向前多读几个符号的形式,准确的进行单词的识别,一旦确定识别到的单词之后,需要进行扫描指针的回退,保证单词识别工作的顺利进行。对于标识符,常数,算符及界符等都需要通过超前搜索进行识别。通过上述的对词法分析器原理的阐述,可以得出词法分析器是这样工作的:先构造预处理器,删除非执行代码(如注释语句,多余的分隔符等等),
5、之后构造扫描器,对预处理结果进行扫描包括对常数、标识符、关键字、运算符的识别都采用超前搜索技术进行扫描,最后指针要及时地回退到适当的位置。3.1.3流程图(词法分析部分) 3.2、源程序代码 #include#include#includeconst int MAX=120;/规定字符串的最大长度不超过120个字符char strTokenMAX;/存放当前字符串char *Key_Word5=dim,if,do,stop,end;/存放保留字FILE *fp;int Isletter(char ch)/是否为字母if(ch=a&ch=A&ch=0&ch=9)return 1;return 0
6、;int Reserve()/是否为保留字int i;for(i=0;i5;i+)if(strcmp(strToken,Key_Wordi)=0)return (i+1);return 0;void Retract(int &i,char &ch)/将搜索指示器回调一个位置,并将ch置为空白字符i=i-1;ch= ;void GetChar(int &i,char BufferMAX,char &ch)/将下一输入字符读到ch中,搜索指示器前移一个字符位置 i=i+1;ch=Bufferi;void Concat(char &ch,char strTokenMAX,int &k)/将ch中的字
7、符连接到strToken之后strTokenk=ch; k=k+1;void InsertId(char valueMAX,char strTokenMAX)/将strToken中的字符加到value中for(int i=0;iMAX;i+)valuei=strTokeni;void analysis()int i,k,code;char BufferMAX,ch,valueMAX;/缓冲区存放文件中每一行的内容,每行最多MAX=120个字符while(!feof(fp) /检测文件是否结束 strcpy(Buffer,);/清空缓冲区fgets(Buffer,MAX,fp);/从文件中读入字
8、符串i=0;while(iMAX&ch!=0)ch=Bufferi;if(Isletter(ch)k=0;while(Isletter(ch)|Isdigit(ch)&iMAX)/是标识符 Concat(ch,strToken,k); GetChar(i,Buffer,ch);strTokenk=0;Retract(i,ch);coutstrToken;code=Reserve();/匹配保留字,并返回其编码值if(code=0)InsertId(value,strToken);cout$ID,valuet标识符endl;/标识符elsecoutcodet保留字endl;/保留字strcpy(
9、strToken,);else if(Isdigit(ch)k=0;while(Isdigit(ch)&iMAX)/常数Concat(ch,strToken,k); GetChar(i,Buffer,ch);strTokenk=0;Retract(i,ch);coutstrToken;cout$INT,;coutstrTokent常数endl;strcpy(strToken,);else if(ch=*)coutch; GetChar(i,Buffer,ch);if(ch=*)coutch endl;/*elsecoutendl;-i;/*else if(ch=+)coutch endl;/+
10、else if(ch=()coutch endl;/(else if(ch=)coutch endl;/)else if(ch=;)coutch endl;/;else if(ch=)coutchendl;/ else if(ch=)coutchendl;/i+;/while(iMAX)ch= ;/while(!feof(fp)fclose(fp);int main(void)char filename20;coutINPUT THE FILE NAME:filename;if(fp=fopen(filename,r)=NULL)coutCant open the file,or the file is not exist!endl;return 1;cout词法分析开始endl;analysis();/调用词法分析器,并输出各单词符号cout词法分析结束endl;return 0;/正常,结束3、程序的运行结果 用下图数据进行测试: 测试结果如下: