您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 编译技术课程设计A实验报告(华北电力大学科技学院)
科技学院课程设计报告(2011--2012年度第1学期)名称:编译技术课程设计A院系:科技学院信息工程系班级:软件09k2学号:091909020227学生姓名:闫雪峰指导教师:郭丰娟设计周数:2成绩:日期:2011年12月6日《编译技术课程设计A》任务书一、目的与要求1.理解和掌握编译程序设计原理及常用的技术,建立编译程序的整体概念;2.理解和掌握编译程序词法分析、语法分析、语义分析、中间代码生成和目标代码生成等几个关键环节原理和实现算法;3.掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。二、主要内容定义一个简化的类C语言—L语言作为源语言,重点针对词法分析、语法分析、语义分析、中间代码生成和目标代码生成等几个关键环节进行编程和调试训练,最终设计实现L语言的编译程序。通过调试L编译程序,了解一般编译程序的总体框架,掌握编译各阶段程序的构造,理解和掌握错误处理方法及符号表的组织方式,理解和掌握语法制导翻译方法。还可以适当扩展L语言成分,并对相应的编译程序进行扩充。可使用C、VC++等语言编程实现。具体内容包括:1.由单词的语法规则出发、画出识别单词的状态转换图,然后用程序实现扫描器设计。2.设计、编写和调试算法优先分析程序,了解算法优先分析器的组成结构以及对文法的要求,掌握实现通用算法优先分析算法的方法。3.在算符优先分析文法的基础上进行翻译工作,生成四元式表;4.设计一个简单的代码生成器,该代码生成器以基本块为单位,依次将每条中间代码变换成相应的目标代码。5.综合以上实验的结果,并进行集成与设计,开发出一个小型编译程序。对于各项主要内容的实现细节描述和指导,请参考《计算机综合实践指导》编译技术的相关内容。三、进度计划序号设计(实验)内容完成时间备注1词法分析器设计2天2算符优先分析程序设计3天3语法制导翻译程序设计3天4简单代码生成器设计2天四、设计(实验)成果要求至少完成简单变量定义语句及包含算术运算符的赋值语句的整个编译过程,统一使用课程设计报告书,文字清楚、工整。五、考核方式实验结果(60%)+实验报告(30%)+实验过程表现(10%)学生姓名:指导教师:年月日一、课程设计(综合实验)的目的与要求实验整体思想:字符串表示的源程序词法分析器语法分析器字符单词符号取一下个单词符号a)词法分析总体概述:由单词的语法规则出发、画出识别单词的状态转换图,然后用程序实现扫描器设计。具体要求:设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次,就输出一个以内部形式表示的单词符号。(1)单词符号及其内部表示单词符号种别编码单词的属性值key0在变量表中的下标var1变量名字的字符串const2常量的整型值operate3运算符在运算符表中的下标//能识别单行注视并过滤注:其中关键字保留,不支持将关键字作为变量名。(2)输入预处理1.词法分析器工作的第一步就是输入源程序文本。2.预处理工作会剔除源程序中多余的空格(将多个空格换行符合并成一个)。3.能识别//***这样的单行注视将其过滤掉。4.将固定字长的过滤过字节放到循环扫缓冲区,并记录扫描位置,下次继续从上次扫描结尾继续扫描取固定字长。5.本程序设计为255个字节,最大单个标识符长度不能超过255个字节。(3)输入缓冲区设计扫描缓冲去一分为二。起点指示器搜索指示器每半个缓冲区可容纳256个字符,两个半区互补。如果搜索指示器从单词起点出发搜索到半区边缘尚未到达单词的终点,那么就调用预处理程序,另其把后序的256个字符装进另半区(4)缓冲区中字符的存放其中如下代码在缓冲区里的存放a=b+c;(5)识别单词符号的状态装换图空白数字=+*,()其他字母字母或数字数字非字母与数字非数字**b)语法分析总体概述:采用自下而上规约过程,根据算符优先文法。具体要求:设计、编写和调试算法优先分析程序,了解算法优先分析器的组成结构以及对文法的要求,掌握实现通用算法优先分析算法的方法。(1)算符优先文法定义算符优先文法是一种自下而上的分析方法,其文法的特点是文法的产生式中不含两个相邻的非终结符。自上而下的分析方法,通常要求文法的产生式不含左递归,如LL(I)文法就是一种可以自上而下分析的文法。假定G是不含ε-产生式的算符文法。对于任何一对终结符a、b,我们说:(1)a等于b当且仅当文法G中含有形如P→···ab···或P→···aQb···的产生式;(2)a小于b当且仅当G中含有形如P→···aR···的产生式,而R(+=)b···或R(+=)Qb···;(3)a大于b当且仅当G中含有形如P→···Rb···的产生式,而R(+=)···a或R(+=)···aQ;如果一个算符文法G中的任何终结符对(a,b)之多满足下述三个条件之一:a=b,ab,ab则称G是一个算符优先文法。(2)文法S-D;ED-TspeL;Aa==Bb++cc;;\\n2012345671089111213T-keyL-varE-Evar=F;|var=F;F-M+F|M|M-FM-M*T|M|M/T|TT-L|const(3)优先表程序采用递归方式求的优先关系表先求FIRSTVT集和LASTVT集=+-*/;kevaco=+-*/;kevacosp#(4)符号栈1.每次入站判断栈顶终结符和栈外终结符的有限关系,小于等于就入栈,大于规约2.每次规约比较靠近栈顶的第二个终结符和栈顶终结符的有限关系,若小于规约第二个终结符到栈顶。3.每次规约查找文发表进行规约。4.二、课程设计(综合实验)总结或结论1.1通过实验掌握了词法分析和语法分析的设计以及制导过程如何生成四元式。1.2了解了算符优先文法的原理及具体过程。1.3加深了c语言文件应用,加深了编程能力,深入掌握了库函数的用法。三、参考文献[1]陈火旺,刘春林编译原理.国防工业出版社,第三版.2009.6附录(设计流程图、程序、表格、数据等)头文件MyHead.h#pragmaonce#defineSBUFSIZE256//定义扫描缓冲区的大小#defineARROPELEN9//定义运算符数组的长度#defineARRKEYLEN2//定义关键字数组的长度structsBinaryRelation//返回值若为关键字或变量{intiId;//区分是什么intiSubScript;//存放操作符和关键字的偏移量,若是常量返回为常量的整型值characTempValName[SBUFSIZE];//存放变量的值};char*apcKeyWords[]={,int};charapcOperator[]={'','=','+','-','*','/','(',')',';','#'};char*apcWordList[]={key,var,const,operate,nonTerminalSymbol,special};词法分析器/*Lu语言词法分析器颜海镜11.12.30代码已通过编译,尚未优化没次调用正确返回一个符合词法规则的单词源文件保存在.lu文件支持形如变量定义(仅支持int类型),基本加减乘除法,不支持,支持单行注视支持()可扩展:支持N个关键字,单个标识符最大支持256个字符,支持运算符扩展,支持函数名扩展inta=b+c;inta=100;//颜海镜*/#includestdio.h#includestdlib.h#includectype.h#includestring.h#includeMyHeader.hstaticcharacScanBufL[SBUFSIZE]={0};//扫描缓冲区staticcharacScanBufR[SBUFSIZE]={0};staticlonglnOffset=0;//偏移量,记录当前文件指针距离开头的距离charCheckChar(FILE*pfSubSourceFile,char**ppcSubCurrent,charcSubTemp,charfcSubBlank)//检查字符功能,具有合并空格,去除回车{if(cSubTemp==EOF){return0x20;}//判断是否到文件末尾,结束返回空格if(cSubTemp!=10&&isspace(cSubTemp))//判断是否为空格,合并多个空格为一个{if(fcSubBlank=='N'){**ppcSubCurrent=0x20;(*ppcSubCurrent)++;fcSubBlank='Y';//修改空格标志位}cSubTemp=fgetc(pfSubSourceFile);//空格的话再读入一个字符cSubTemp=CheckChar(pfSubSourceFile,ppcSubCurrent,cSubTemp,fcSubBlank);//递归检查}if(cSubTemp=='/')//判断注视{charcTemp;//临时变量,用于检查下一个是否为'/'cTemp=fgetc(pfSubSourceFile);//再读入一个字符if(cTemp=='/')//若为注视一直读入知道换行符,否则退回刚才读入的字符{while(fgetc(pfSubSourceFile)!='\n');//遇到注视,在注视结尾返回空格cSubTemp='\n';}elseungetc(cTemp,pfSubSourceFile);//退回刚才读入的字符}returncSubTemp;//返回字符}intPreProcess(char*pcSubName)//预处理子程序,完成功能每次向ScanBuffer中装入固定字长的源程序代码{staticcharfcFlag='L';inti;//将源程序中读入剔除空格注视等放到bufferchar*pcCurrent=0;//只是当前要赋值的字节char**ppcCurrent=&pcCurrent;//指向指针的指针char*pcStart;//指向数组的开始,计算偏移量用char*pcTemp;//临时变量,初始化用FILE*pfSourceFile;//指向要打开的源程序文件//初始化pcCurrent确认当前要装入的缓冲区if(fcFlag=='L'){pcCurrent=acScanBufL;pcStart=acScanBufL;}else{pcCurrent=acScanBufR;pcStart=acScanBufR;}//初始化当前缓冲区为空字符pcTemp=pcCurrent;for(i=0;iSBUFSIZE;i++){*pcTemp=0;pcTemp++;}//打开文件pfSourceFile=fopen(test.txt,r);if(pfSourceFile==NULL){printf(Thefile%swasnotopened\n,pcSubName);//判断文件打开是否成功exit(0);//装入失败退出}else//打开成功读入{if(fseek(pfSourceFile,lnOffset,SEEK_SET))//移动文件指针到应该的位置{perror(Fseekfailed);exit(1);//移动光标失败退出}while((pcCurrent-pcStart)!=SBUFSIZE)//循环读入指定长度字符{charcTemp;//临时变量cTemp=fgetc(pfSourceFile);//读入一个字符cTemp=CheckChar(pfSourceFile,ppcCurrent,cTemp,'N');//获取一个合法的字符if(cTemp==0x20){*pcCurrent=cTemp;pcCurrent++;*pcCurrent='#';//程序结束break;//判断是否到文件末尾}*pcCurrent=cTemp;//若刚才输入的不为空格也没结束则输入到缓冲区pcCurrent++;}//修改偏移量为当前偏移量,为下次读入用lnOffse
本文标题:编译技术课程设计A实验报告(华北电力大学科技学院)
链接地址:https://www.777doc.com/doc-4334372 .html