1、河南工业大学实验报告课程名称 编译原理 _ 实验项目 实验一 词法分 计_姓 名_ 学 号_ 指导老师 日 期 2012.4.22 批改日期 成 绩 一.实验目的1 深入理解有限自动机及其应用2 掌握根据语言的词法规则构造识别其单词的有限自动机的方法3基本掌握词法分析程序的开发。二.实验内容及要求编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 (遇到错误时可显示“Error”,然后跳过错误部分继续显示) (具体参照实验指导中的要求)三.实验过程对于这个实验,总共用了五个函数,即
2、主函数、分三种情况取单词、对取到的单词进行分类。主要完成的功能是从缓冲区中识别出一个个单词,并能够区分所取的单词是什么类型。1)首先定义一系列数组来保存不同类的单词:char *key8=“if“,“else“,“for“,“while“,“do“,“return“,“break“,“continue“; /保留字char *border6=“,“,“;“,“,“,“(“,“)“; /分隔符char *arithmetic4=“+“,“-“,“*“,“/“; /算术运算符char *relation6=“,“=“,“; /关系运算符char *consts20; /常数char *label2
3、0; /标识符2)取词分类模块:int search(char searchchar,int wordtype) /对取的单词进行分类 int i=0;switch (wordtype) case 1:for (i=0;i=7;i+) /如果是保留字 if (strcmp(keyi,searchchar)=0)return(i+1);return(0);case 2:for (i=0;i=5;i+) /如果是分隔符 if (strcmp(borderi,searchchar)=0)return(i+1); return(0);case 3:for (i=0;i=3;i+) /如果是算术运算符
4、if (strcmp(arithmetici,searchchar)=0) return(i+1);return(0);case 4:for (i=0;i=5;i+) /如果是关系运算符 if (strcmp(relationi,searchchar)=0) return(i+1);return(0);case 5:for (i=0;iconstnum;i+) /如果是常数 if (strcmp(constsi,searchchar)=0)return(i+1);i+; /现有的常数数组没有取到的常数constsi-1=(char *)malloc(sizeof(searchchar);str
5、cpy(constsi-1,searchchar); /添加新的常数到常数数组constnum+;return(i);case 6:for (i=0;ilabelnum;i+) /如果是标识符 if (strcmp(labeli,searchchar)=0)return(i+1);i+; /现有的标识符数组没有取到的标识符labeli-1=(char *)malloc(sizeof(searchchar); strcpy(labeli-1,searchchar); /添加新的标识符到标识符数组labelnum+;return(i);3)取得字符不同进行不同的处理,这里以取得非字母数字字符模块为
6、例,该模块比较复杂有一定的代表性:char otherprocess(char buffer) /取到其他字符时,要进行的处理 int i=-1;char othertp20;int otype,otypetp;othertp0=buffer;othertp1=0;if (otype=search(othertp,3) /判断是否为算术运算符 printf(“%s (3,%d)n“,othertp,otype-1);buffer=fgetc(fp); /取下个字符goto out;if (otype=search(othertp,4) /判断是否为关系运算符 buffer=fgetc(fp);
7、othertp1=buffer;othertp2=0;if (otypetp=search(othertp,4) /判断结合下个字符是否为关系运算符 printf(“%s (4,%d)n“,othertp,otypetp-1);buffer=fgetc(fp); /修改部分goto out;elseothertp1=0;printf(“%s (4,%d)n“,othertp,otype-1);goto out;else if (otype=search(othertp,2) /判断是否为分隔符 printf(“%s (2,%d)n“,othertp,otype-1);buffer=fgetc(
8、fp);goto out;if (buffer!=n)buffer=fgetc(fp);out: return(buffer); /返回下个字符4)主函数,测试模块:void main() /主函数,测试程序int i;for (i=0;i=20;i+)labeli=NULL;constsi=NULL;if (fp=fopen(“example.c“,“r“)=NULL)printf(“error“);elsecbuffer = fgetc(fp);while (cbuffer!=EOF) /进入循环,取字符if (isalpha(cbuffer) /如果是字母cbuffer=alphapro
9、cess(cbuffer);else if (isdigit(cbuffer) /如果是数字cbuffer=digitprocess(cbuffer);else cbuffer=otherprocess(cbuffer); /其他字符printf(“overn“);/ getchar();5)读取程序截图:读取的程序代码如下:main()int a,b;a = 10;b = a + 20;四.实验总结(心得)通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用 c 语言直接编写词法分析程序。加深了我对词法分析的理解,以前是理论,每天都在听老师讲,感觉还可以,但是自己在做实验时还是有许多不懂的地方,通过看书和问其他同学,还是成功的完成了本次试验,加深了我对理论的巩固,并复习了 c 语言的基本知识,受益匪浅