您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理实验报告——实验一-词法分析
1编译原理实验报告实验名称:编写词法分析程序实验类型:验证型实验指导教师:庄燕滨专业班级:10软件卓越姓名:黄子轩学号:10030416电子邮件:15251909800@139.com实验地点:秋白楼B705实验成绩:日期:2013年4月18日2一、实验目的通过设计,调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上机调试编出的词法分析程序。二、实验过程逐个读入源程序字符并按照构词规则切分成一系列单词。单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。词法分析是编译过程中的一个阶段,在语法分析前进行。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。要求:通过词法分析器能够实现以下五种类型如单词等的识别。要求:通过词法分析器能够实现以下五种类型如单词等的识别。(1)关键字begin,end,if,then,else,while,write,read等,do,call,const,char,until,procedure,repeat等(2)运算符:+,-,*,/,=等(3)界符:{,},[,],;,,,.,(,),:等(4)标识符(5)常量程序设计:(1)主程序设计考虑(参考后面给出的程序框架)主程序的说明部分为各种表格和变量安排空间。数组K为关键字表,每一个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。P数组存放分界符,为了简单起见,分界符,算术运算符和系运算符都放在p表中合并成一类。Id和ci数组分别存放标识符和常数。Instring数组为输入源程序的单词缓存。Outtoken记录为输出内部表示缓存。还有一些为造表填表设置的变量。主程序开始后,先以人工方式输入关键字,建k表;再输入分界符等造p表。主程序的工作部分设计成便于调试的的循环结构。每一个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析程序,输出每个单词的内部码。3(2)词法分析过程考虑将词法分析程序设计成独(入口)立一遍扫描源程序的结构。其流程图如下。该过程取名为lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号;以字符k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(学生编程时类号分别是1、2、3、4、5)。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数变为二进制形式存入数组ci中,并记录其在表中的位置。Lexical过程中嵌套有两个过程;一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加一;另一个名为error,当出现错误时,调用此过程,输出错误编号。入口开工操作读源程序字符是数字?常数分析程序其他单词分析程序关键字和标识符分析程序输出单词的内部表示是有字符?出口是字母?YNYNYN三、实验结果测试数据:4voidmain(){inta=5,b=3,c=4;intmax;if(a=b)max=b;elsemax=a;if(c=max)max=c;printf(Thebiggestnumberis:%d\n,max);}实验结果:四、讨论与分析根据词法分析,正规文法的规则来实现本程序的过程。所有识别出的单词都用两个字节的等长表示,称为内部码。第一个字节为t,第二个字节为i。t为单词的种类。关键字的t=1;分界符的t=4;运算符的t=5;无符号数的t=3;标识符的t=2。i为该单词在各自表中的指针或内部码值。程序测试所得结果与报告中所给的顺序一致。编译的最终目的是将程序设计语言的高层指令翻译成物理机器或虚拟机可以执行的指令。词法分析器的工作是分析量化那些本来毫无意义的字符流,将他们翻译成离散的字符组,包括关键字,标识符、数字、运算符供语法分析器使用。五、附录:关键代码(给出适当注释,可读性高)5#includestdio.h#includestdlib.h#includestring.hvoidkeyword(FILE*fp,chark[][20]){charch,instring[128];intn=0;do{ch=fgetc(fp);instring[n++]=ch;}while((ch='a'&&ch='z')||(ch='A'&&ch='Z'));fseek(fp,-1L,1);instring[--n]=0;strupr(instring);for(inti=0;i8;i++)if(strcmp(k[i],instring)==0)break;strlwr(instring);if(i8)printf(--1、关键字%s\n,instring);elseprintf(--2、标识符%s\n,instring);}voidnumber(FILE*fp){charch,instring[128];intn=0;do{ch=fgetc(fp);instring[n++]=ch;}while(ch='0'&&ch='9');fseek(fp,-1L,1);instring[--n]='\0';printf(--3、常数%s\n,instring);}voidother(FILE*fp,charp[][3]){charch=fgetc(fp);if(ch==''||ch=='\n'||ch=='\t')return;chars[3];s[0]=ch,s[1]=0;if(ch=='{'||ch=='}')printf(--4、分界符%s\n,s);6if(ch==':'){ch=fgetc(fp);if(ch=='='){s[1]='=',s[2]=0,printf(--4、分界符%s\n,s);return;}elsefseek(fp,-1L,1);}if(ch==''){ch=fgetc(fp);if(ch=='='){s[1]='=',s[2]=0,printf(--5、运算符%s\n,s);return;}elseif(ch==''){s[1]='',s[2]=0,printf(--5、运算符%s\n,s);return;}elsefseek(fp,-1L,1);}if(ch==''){ch=fgetc(fp);if(ch=='='){s[1]='=',s[2]=0,printf(--5、运算符%s\n,s);return;}elsefseek(fp,-1L,1);}for(inti=0;i16;i++)7if((strcmp(s,p[i]))==0)break;if(i=0&&i=5)printf(--4、分界符%s\n,s);if(i=6&&i=15)printf(--5、运算符%s\n,s);}voidmain(){chark[8][20]={BEGIN,DO,ELSE,END,IF,THEN,VAR,WHILE};//建立关键字表charp[16][3]={,,;,.,:=,(,),+,-,*,/,,=,=,,=,};//建立分界符、算术运算符、关系运算符表FILE*fp;if((fp=fopen(readme.txt,r))==NULL){printf(cannotopenthefile!\n);exit(0);}charch;while(!feof(fp)){ch=fgetc(fp);if(feof(fp))break;fseek(fp,-1L,1);if((ch='a'&&ch='z')||(ch='A'&&ch='Z'))keyword(fp,k);elseif(ch='0'&&ch='9')number(fp);elseother(fp,p);}}六、实验者自评(主要从实验态度、方法、效果上给一个客观公正的自我评价)通过这次实验,我更加深刻地理解了关于词法分析程序的含义,用编程的线性思维考量语句进行分析的识别。编程时选用了适合底层应用编程的C语言,正式我所擅长的。重新接触起C,感到略有生疏,但时间不久又能够恢复了记忆。在实验中,我掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法,并且掌握了词法分析的实现方法,能够用过程化思维编写词法分析程序。
本文标题:编译原理实验报告——实验一-词法分析
链接地址:https://www.777doc.com/doc-5130733 .html