资源描述:
《编译原理词法分析器程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一.实验目的1.深入理解有限自动机及其应用2.掌握根据语言的词法规则构造识别其单词的有限自动机的方法3.基本掌握词法分析程序的开发。二.实验内容及要求1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。2、单词的BNF表示<标识符>-><字母><字母数字串><字母数字串>-><字母><字母数字串>
2、<数字><字母数字串>
3、<下划线><字母数字串>
4、ε<无符号整数>
5、-><数字><数字串><数字串>-><数字><数字串>
6、ε<加法运算符>->+<减法运算符>->-<大于关系运算符>->><大于等于关系运算符>->>=3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a>+”,当前字符为’>’,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符’+’,这时可知应将’>’解释为大于运算符。但此时,超前读了一个字符’+’,所以要回退一个字符,词法分析器才能正常
7、运行。在分析标识符,无符号整数等时也有类似情况。4、模块结构缓冲区扫描一个字符主函数main()N输入文件名,判断能否打开文件Y缓冲区中是否还有字符Y结束取单词扫描一个字符调用返回输出N5.程序思路这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个
8、表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。0.定义部分:定义常量、变量、数据结构。1.初始化:从文件将源程序全部输入到字符缓冲区中。2.取单词前:去掉多余空白。3.取单词后:去掉多余空白(可选,看着办)。4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)5.显示结果。6.实验程序的源代码如下:#include#include#include#
9、include#include#defineNULL0FILE*fp;charcbuffer;char*key[8]={"if","else","for","while","do","return","break","continue"};char*border[6]={",",";","{","}","(",")"};char*arithmetic[4]={"+","-","*","/"};char*relation[6]={"<","<=","=",">",
10、">=","<>"};char*consts[20]={"0","1","2","3","4","5","6","7","8","9"};char*label[20];intconstnum=0,labelnum=0;intsearch(charsearchchar[],intwordtype){inti=0;switch(wordtype){case1:for(i=0;i<=7;i++){if(strcmp(key[i],searchchar)==0){return(i+1);}}break;cas
11、e2:{for(i=0;i<=5;i++){if(strcmp(border[i],searchchar)==0)return(i+1);}return(0);}break;case3:{for(i=0;i<=3;i++){if(strcmp(arithmetic[i],searchchar)==0){return(i+1);}}return(0);}break;case4:{for(i=0;i<=5;i++){if(strcmp(relation[i],searchchar)==0){return(
12、i+1);}}return(0);}break;case5:{for(i=0;i<=constnum;i++){if(strcmp(consts[i],searchchar)==0){return(i+1);}}}break;case6:{for(i=0;i<=labelnum;i++){if(strcmp(label[i],searchchar)==0){return(i+1);}}label[i-1]=(char*)malloc(sizeof(sea