实验一词法分析一、实验目的:通过本实验理解词法分析的整个过程,处理对象和处理的结果,了解词法分析在整个编译过程中的作用。二、实验学时:2学时。三、实验内容根据给出的简单语言的词法构成规则和单词集合,编制词法分析程序,要求能用给定的简单语言书写的源程序进行词法分析,同时建立相应的符号表文件存放正确的单词。输出分析结果于文件中,包括:(1)正确的单词符号及其单词种类的序对二元组。具体输出形式为:二元组:(单词种类,单词内码值)单词种类见五。四、实验方法构造识别单词集的自动机,编写程序实现。五、实验的处理单词集(注:单词种类统一分类如下:)单词符号单词种类任意变量名(以字母开头由字母和数字组成的符号串)0(1)2{3}4;5=6+7*8910,11‘12整型常数(由数字组成的符号串)30main26int21if22then23else24return25其它100七、实验报告要求给出单词识别的状态转换图;带有注释(简单说明)的源程序。程序运行截图,要求运行结果内有输出自己的名字和学号.状态转换图源程序#includeiostream#includestringusingnamespacestd;//单词结构定义structWordType{intcode;stringpro;};//关键字表和对应的编码stringcodestring[6]={main,int,if,then,else,return};intcodebook[6]={26,21,22,23,24,25};//全局变量charch;intflag=0;//函数声明WordTypeget_w();voidgetch();voidgetBC();boolisLetter();boolisDigit();voidretract();intReserve(stringstr);stringconcat(stringstr);//主函数intmain(){WordTypeword;cout请输入源程序列:;word=get_w();while(word.pro!=#)//为自己设置的结束标志{coutword.code'\t'word.proendl;word=get_w();};return0;}WordTypeget_w(){stringstr=;intcode;WordTypewordtmp;getch();//读一个字符getBC();//去掉空白符if(isLetter()){//以字母开头while(isLetter()||isDigit()){str=concat(str);getch();}retract();code=Reserve(str);if(code==-1){wordtmp.code=0;wordtmp.pro=str;}//不是关键字else{wordtmp.code=code;wordtmp.pro=str;}//是关键字}elseif(isDigit()){//以数字开头while(isDigit()){str=concat(str);getch();}retract();wordtmp.code=30;wordtmp.pro=str;}elseif(ch=='('){wordtmp.code=1;wordtmp.pro=(;}elseif(ch==')'){wordtmp.code=2;wordtmp.pro=);}elseif(ch=='{'){wordtmp.code=3;wordtmp.pro={;}elseif(ch=='}'){wordtmp.code=4;wordtmp.pro=};}elseif(ch==';'){wordtmp.code=5;wordtmp.pro=;;}elseif(ch=='='){wordtmp.code=6;wordtmp.pro==;}elseif(ch=='+'){wordtmp.code=7;wordtmp.pro=+;}elseif(ch=='*'){wordtmp.code=8;wordtmp.pro=*;}elseif(ch==''){wordtmp.code=9;wordtmp.pro=;}elseif(ch==''){wordtmp.code=10;wordtmp.pro=;}elseif(ch==','){wordtmp.code=11;wordtmp.pro=,;}elseif(ch=='\''){wordtmp.code=12;wordtmp.pro=\';}else{wordtmp.code=100;wordtmp.pro=ch;}returnwordtmp;}voidgetch(){if(flag==0)//没有回退的字符ch=getchar();else//有回退字符,用回退字符,并重置标志flag=0;}voidgetBC(){while(ch==''||ch=='\t'||ch=='\n')ch=getchar();}boolisLetter(){if(ch='a'&&ch='z'||(ch='A'&&ch='Z'))returntrue;elsereturnfalse;}boolisDigit(){if(ch='0'&&ch='9')returntrue;elsereturnfalse;}stringconcat(stringstr){returnstr+ch;}voidretract(){flag=1;}intReserve(stringstr){inti;for(i=0;i=5;i++){if(codestring[i]==str)//是某个关键字,返回对应的编码returncodebook[i];}if(i==6)//不是关键字return-1;}截图实验心得此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理