您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 华科编译原理实验报告
课程实验报告课程名称:编译原理专业班级:CS1209学号:姓名:指导教师:周时阳报告日期:2015.6.28计算机科学与技术学院目录1课程实验概述.........................................................................................12实验一词法分析器的实现..................................................................22.1问题描述.......................................................................................22.1.1实验内容..............................................................................22.1.2实验原理...............................................................................22.2系统设计.......................................................................................32.2.1实验前准备.........................................................................32.2.2实验流程图.........................................................................52.3系统实现.....................................................................................112.4效率分析.....................................................................................112.4.1程序的执行结果...............................................................122.4.2实验程序的优点和缺陷...................................................133实验总结与评价...................................................................................1311课程实验概述词法分析(LexicalAnalysis)是编译的第一阶段。词法分析器的主要任是读入源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素。这个词法单元序列被输出到语法分析器进行语法分析。词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等(1)关键字是由程序语言定义的具有固定意义的标识符。例如,Pascal中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。(2)标识符用来表示各种名字,如变量名,数组名,过程名等等。(3)常数常数的类型一般有整型、实型、布尔型、文字型等。(4)运算符如+、-、*、/等等。(5)界符如逗号、分号、括号、等等。词法分析器所输出单词符号常常表示成如下的二元式:(单词种别,单词符号的属性值)单词种别通常用整数编码。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种。运算符可采用一符一种的方法。界符一般用一符一种的方法。对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息。单词符号的属性是指单词符号的特性或特征。22实验一词法分析器的实现2.1问题描述2.1.1实验内容1.要完成一个完整的编译器,需要实现的功能如下:(1)组织源程序的输入(2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件(3)删除注释、空格和无用符号(4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。(5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。常量表结构:常量名,常量值2.能对任何S语言源程序进行分析在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。2.1.2实验原理词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。32.2系统设计2.2.1实验前准备(1)在扫描程序的过程中,注释被忽略。(2)各种单词符号对应的编号(如下):表2-1:编号对照表单词符号编号单词符号编号auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27volatile28do29while30static31if32\a33\b34\f35\n36\t37\v38\\39\?40\’41\”42\043\ddd44\xhh45数字46标识符47#48(49)50[51]52{53}54‘55*56:57~58%59^60+61?62=63|64&65!6646768=69==7071!=7273&&74=75||76++77?=78-79--80-81“82%A(A可为d’s’c)83;84_85/868788899091其他类别99(2)实验的状态转换图如图2-2示:图2-2:实验状态转换图52.2.2实验流程图(3)系统流程图如下图2-3所示:YNNYYNYNYNYN图2-3:系统流程图输入需要扫描的文件名开始输入存放结果文件名文件是否为空预读一位ch返回,退出跳转扫描数字行数加1跳转扫描注释跳转扫面文件单词及保留字跳转扫描引号跳转扫描其他符号P处ch是否为引号ch是否为‘/’ch是否为数字或‘—’ch是否为字母或下划线ch是否为空格6(4)扫描注释模块流程图如下所示:Ch为‘/’时预读下一位chch是否为回车行计数器自加1判断文件是否结束Ch是否为‘/’Ch是否为‘*’退出程序预读一位ch是否否是是否判断ch是否为回车否预读一位ch是Ch是否为‘*’ch是否为回车行计数器自加1是否否预读一位ch是ch是否为回车是Ch是否为‘/’否返回到p处是是图2-4:注释分析模块7(5)扫描数字模块流程图如图2-5所示:Ch为数字或‘-’Ch是否为‘-’预读ch是Ch是否为‘-’判别为自减符是Ch是否为数字Ch是否为‘’否判别为”-”是回退3否预读chCh是否为数字判别为减号是判别为负号预读ch预读chCh是否为数字或‘.’Ch1[i++]=ch是认为数字结束否以%s的形式输出ch1回退1位返回到p处否图2-5:数字分析模块流程图8(6)扫描引号模块流程图如图2-6所示:图2-6:引号分析模块流程图9(7)扫描单词模块流程图如图2-7所示:图2-7:单词分析模块流程图10(8)扫描其他字符模块流程图如图2-8所示:图2-8:其他符号分析模块流程图112.3系统实现(1)确定关键字,一共有32个,把32个字符保存在定义的数组中,其下标就是每个关键字的编码,这样设计的原因是方便分析。其他字符根据自定义的编号,扫描到后直接返回它们的编号。(2)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。(3)注释被忽略。(4)确定设计的词法分析程序的功能:输入:建立单独的txt文件保存所给文法的源程序字符串,我的是test.txt文件。输出:由行号、字符串和编号构成,分析的结果打印在显示在屏幕上,同时保存在另一个txt文件中,我命名的文件是a.txt。2.4效率分析测试语句为:Programexample;varintj,m,n;Begin/*thereis*a/comment*/i:=2;j:=6;m:=3;//thereisacommentn:=j+m;Ifn=3andn5thenj:=j-1;end.122.4.1程序的执行结果结果截图如图2-9所示:图2-9:结果截图打开a.txt文件,如图2-10所示,结果与屏幕上的结果一致。图2-10:a.txt文件内容132.4.2实验程序的优点和缺陷优点:该程序可以出来多种情况,并且运行效率高。缺陷:程序中没有出错处理能力,并且在分析长代码时,不能全部分析完成,由于时间关系没有来得及修改这个bug。3实验总结与评价我在这次词法分析器的设计过程中学到了很多东西,其中最大的收获是对于编译原理中的词法分析这一过程理解的更加清楚明了。没做实验之前根本就不理解其中的原理,其次,是在使用C编程的能力有所提高,因为在程序分析时,要分析特别细,稍有疏忽,就可能出错。另外,在该词法分析器设计中也有一些不足的地方,比如没有出错处理功能。分析结果输出方式为:用一个存放结果的字符串数组,并用指针指向它,输出结果正确,总的来说,这次实验达到了其初衷,实现了规定的功能。源代码:#includestdio.h#includestdlib.h#includectype.h#includestring.hintguanjz(charch1[])//关键字和标识符判断{inti;charch2[32][9]={auto,double,int,struct,break,else,long,switch,case,enum,register,typedef,char,extern,return,union,const,float,short,unsigned,continue,for,signed,void,default,goto,sizeof,14volatile,do,while,static,if};//定义关键字集,共32个for(i=0;i32;i++){//逐个比对如果为关键字则返回类别i+1if(!strcmp(ch1,ch2[i]))returni+1;}return47;//否则返回一般标识符类}voidmain(){FILE*fp,*fp1;intk=0;inti=0;intj=0;inthanjsq=1;//行计数器,保存行号intguanjz(charch1[]);//关键字和标识符判断charch,infile[15],outfile[15];//定义输入和输出文件名printf(Entertheinfilename:);scanf(%s,infile);printf(Entertheoutfilename:);scanf(%s,outfile);if((fp=fopen(infile,r))==NULL)//打开需要扫描的文件{printf(cannotopenfile\n);exit(0);}if((fp1=fopen(outfile,w))==NULL)//
本文标题:华科编译原理实验报告
链接地址:https://www.777doc.com/doc-2592255 .html