实验一词法分析一、实验目的:通过本实验理解词法分析的整个过程,处理对象和处理的结果,了解词法分析在整个编译过程中的作用。二、实验学时:2学时。三、实验内容根据给出的简单语言的词法构成规则和单词集合,编制词法分析程序,要求能用给定的简单语言书写的源程序进行词法分析,同时建立相应的符号表文件存放正确的单词。输出分析结果于文件中,包括:(1)正确的单词符号及其单词种类的序对二元组。具体输出形式为:二元组:(单词种类,单词内码值)单词种类见五。四、实验方法构造识别单词集的自动机,编写程序实现。五、实验的处理单词集(注:单词种类统一分类如下:)单词符号单词种类任意变量名(以字母开头由字母和数字组成的符号串)0(1)2{3}4;5=6+7*8910,11‘12整型常数(由数字组成的符号串)30main26int21if22then23else24return25其它100六、处理程序例和处理结果例例1:源程序:main(){y=x-1;}处理结果:(26,main)(1,()(2,))(3,{)(0,y)(6,=)(0,x)(100,-)(20,1)(5,;)(4,))例2:源程序main(){inta,b;b!=a-1;}处理结果:(26,main)(1,()(2,))(3,{})(21,”int”)(0,a)(11,,)(0,b)(5,”;”)(0,b)(100,!)(6,=)(0,a)(100,-)(30,1)(5,”;”)(4,”}”)七、实验报告要求给出单词识别的状态转换图;带有注释(简单说明)的源程序。程序运行截图,要求运行结果内有输出自己的名字和学号.源程序:#includeiostream#includestring.h//strcmp函数所需usingnamespacestd;chartoken[8];//关键字比较临时存储空间charch;//每次输入字符存储charprog[100]={0};//所有的输入存入intp=0;//计数变量intsyn;//关键字或其他代码的数字标号intn,i;char*keyword[6]={int,if,then,else,return,main};voidscaner();voidmain(){intselect=-1;//选择变量p=0;printf(输入需要分析的语句,以'#'结尾!\n);do//将所有字符存入prog数组中{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;while(select!=2){printf(请输入1或2\n1.开始词法分析\n2.退出\n);scanf(%d,&select);if(select==1){do{scaner();switch(syn){case-1:printf(词法分析出错\n);break;default:{if(syn==-2){printf(语句结束!\n);break;}printf(%d,%s\n,syn,token);break;}}}while(syn!=-2);printf(词法分析成功\n);}elsecontinue;}}voidscaner(){for(n=0;n10;n++)token[n]='\0';n=0;ch=prog[p++];while((ch=='')||(ch==int(13))||(ch==int(10)))//排除空格和回车ch=prog[p++];if((ch='a'&&ch='z')||(ch='A'&&ch='Z')){do{token[n++]=ch;ch=prog[p++];}while((ch='a'&&ch='z')||(ch='A'&&ch='Z')||(ch='0'&&ch='9'));syn=0;for(n=0;n6;n++){if(strcmp(token,keyword[n])==0)//对输入字符和关键字进行比较{syn=n+21;//对关键字标号进行输出}}p--;}elseif(ch='0'&&ch='9'){p--;do{token[n++]=prog[p++];ch=prog[p];}while(ch='0'&&ch='9');syn=20;}else{//ch=prog[p++];switch(ch){case'(':syn=1;token[0]=ch;break;case')':syn=2;token[0]=ch;break;case'{':syn=3;token[0]=ch;break;case'}':syn=4;token[0]=ch;break;case';':syn=5;token[0]=ch;break;case'=':syn=6;token[0]=ch;break;case'+':syn=7;token[0]=ch;break;case'-':syn=100;token[0]=ch;break;case'*':syn=8;token[0]=ch;break;case'':syn=9;token[0]=ch;ch=prog[p];//退格操作break;case'':syn=10;token[0]=ch;ch=prog[p];break;case',':syn=11;token[0]=ch;break;case'‘':syn=12;token[0]=ch;break;case'#':syn=-2;token[0]=ch;break;default:printf(词法分析出错!请检查是否输入非法字符\n);syn=-1;break;}}}截图:状态转换图0213756891011417空白字母或数字字母非字母与数字字数字非数字字数字(){};=+*13161415,‘12其他八、实验小结通过本实验理解词法分析的整个过程,处理对象和处理的结果,了解词法分析在整个编译过程中的作用。这个实验的大体思路根据状态转换图,根据词法分析原理,编写程序,主要用的是switch语句,凡是不符合语法的就报错,经过不断地改错,以及思路加深了课堂知识的了解。