您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 将词法、语法、代码生成等实验组合成一个大的编译程序
郑州轻工业学院课程设计说明书题目:将词法、语法、代码生成等实验组合成一个大实验姓名:院(系):计算机与通信工程学院专业班级:计算机科学与技术10-01学号:指导教师:马吉明成绩:时间:2013年6月17日至2013年6月21日21郑州轻工业学院课程设计任务书题目将词法、语法、代码生成等实验组合成一个大实验专业、班级计算机科学与技术10-01学号姓名主要内容自选一种常见高级语言为背景,对其进行简化.例如只包括整型常数和其四则运算以及相应的赋值语句,转移语句,条件语句和最简单的输入输出语句等.编制一个包括必要处理阶段(词法分析、语法分析、语义分析、代码生成)简化又完整的编译程序。基本要求(1)写出符合给定的语法分析方法的文法及属性文法。(2)完成题目要求的中间代码四元式的描述。(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。主要参考资料《程序设计语言编译原理》陈火旺编著国防工业出版社《编译原理》吕映芝张素琴蒋维杜编著清华大学出版社完成期限:2013年6月21日指导教师签名:课程负责人签名:年月日编译原理1目录1绪论..........................................................................................................21.1设计目的........................................................................................21.2设计要求........................................................................................21.2.1算法过程..............................................................................21.2.2主流程图...............................................................................21.3设计内容........................................................................................31.3.1题目.......................................................................................31.3.2内容.......................................................................................32总体设计.................................................................................................32.1算法描述........................................................................................42.2函数说明和数据结构....................................................................43详细设计与实现.....................................................................................53.1词法分析........................................................................................53.2语法分析........................................................................................73.3代码生成器....................................................................................93.4结果................................................................................................94参考文献...............................................................................................115心得体会...............................................................................................116附录代码...............................................................................................11编译原理21绪论1.1设计目的《编译原理》是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。1.2设计要求1.2.1算法过程词法分析程序语法分析程序语义分析程序编译器。不断完善,不断改进。渐变的过程。1.2.2主流程图编译原理31.3设计内容1.3.1题目将词法、语法、代码生成等实验组合成一个大实验1.3.2内容涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以及生成中间代码。2总体设计编译原理42.1算法描述语法分析阶段的基本任务是将词法分析阶段产生的二元组作为输入,根据语言的语法规则,识别出各种语法成分,并判断该单词符号序列是否是该语言的一个句子。在语法分析阶段,采用自上而下的递归下降分析法,根据递归下降分析函数编写规则来编写相应的函数,在各个函数的分析过程中调用词法分析程序中的扫描程序,发出“取下一个单词符号”的命令,以取得下一个单词符号的语法分析。词法分析和语法分析的整体设计思想可由以下图示表示:字符串表示的源程序词法分析器语法分析器字符单词符号取一下个单词符号语法分析是在词法分析的基础上加上判断是否符合语法规则的语句。语法分析的基本任务是使用词法分析的结果,使用递归下降算法分析是否符合语法规则,如果符合,则输出“分析成功”,若果不符合,则输出“分析失败”。2.2函数说明和数据结构在main函数调用e()函数,如果调用之后返回时,如果((flags[temp]==0)&&is_right)为真,就输出“分析成功”,否则输出“分析失败”。其中is_right为设定的标志,初值为1,如果在调用子函数的过程中如果有错误,则置is_right为0。e函数:调用t函数,调用f函数,调用p函数,返回后看是否是’+’或’-’,如果是,则调用e1函数,再调用e2函数,如果不是,进行出错处理,置is_right为0。e1函数:判断是不是”+”或者“-”如果是,调用f函数,如果不是,进行出错处理,置is_right为0。t函数:调用f函数,调用p函数,返回后看是否是’*’或’/’,如果是,编译原理5则调用t1函数,再调用t2函数,如果不是,进行出错处理,置is_right为0。t1函数:判断是不是”*”或者“/”如果是,调用f函数,如果不是,进行出错处理,置is_right为0。f函数:调用p函数,f1函数。f1函数:判断是不是”^”,如果是,调用f函数,如果不是,进行出错处理,置is_right为0。p函数:检查是否标识符,如果是,调用f1函数,如果不是,检查是否是数值,如果是,调用f1函数,如果不是,检查是否是’(’,如果不是,进行出错处理,置is_right为0。如果是,调用e函数,返回后检查是否是’)’,如果不是,进行出错处理,置is_right为0。如果是,调用f1函数,返回。3详细设计与实现3.1词法分析首先定义结构体typedefstruct//状态栈{intdata[max];inttop;}seqstack1;typedefstruct//符号栈{stringdata[max];inttop;}seqstack2;structreserveedword//保留字表结构{编译原理6stringword;charvalue;}reserveedword1[maxsize];structidentifer//标识符表结构{charidentiname[15];charidentitype[15];intaddress;}identifer1[maxsize];structconstant//常量表结构{stringconstantname;stringvalue;intconstantaddress;}constant1[maxsize];词法分析主要函数结构:voidInitscanner()//该函数用于用C语言当中常见的关键字初始化保留表voidIsalpha(chars)//用于判断读入的字符是不是字母voidIsnumber(chars)//用于判断读入的字符是不是数字voidIsother(chars)//判断除数字与字母之外的其他字符voidLexscan()//用于循环从程序中读入字符并判断应调用那个判断函数字符voidOutput(inti,intj,charss[15])//输出二元式本模块程序的伪代码如下:打开文件infile.open(input.txt,ios::in);if(!infile){编译原理7cerr读取的文件打开失败!endl;exit(1);}初始化保留字表Initscanner();循环读入从文件当中Scanner(){while(ch!='#'){在该函数中判断应该调用的判断函数Lexscan(){infile.get(ch);if(((ch='A')&&(ch='Z'))||((ch='a')&&(ch='z')))Isalpha(ch){Output};elseif((ch='0')&&(ch='9'))Isnumber(ch){Output};elseIsother(ch){Output};}}}关闭文件infile.close();词法分析器中从源文件读出一个单词,判断其类型是关键字、标识符还是普通符号,根据其类型为结构体各项赋值,并将其传给语法分析函数。3.2语法分析编译原理8由于说明语句与算术表达式和赋值语句所使用的是不同的文法,所以两者的ACTION表和GOTO表也不一样,本次课设采用二维数组存放ACTION表和GOTO表信息,其中移进用大于0的数表示,归约用小于0的数表示,成功用100表示(acc),其他处用0表示,查表时遇到相应的数进行相应的操作。根据状态转换图(DFA)构造SLR(1)分析表:其中说明文法和算术文法分别构造,同时在每个表当中既有action表又有goto表intanalysis_table1[10][8]={3,4,0,0,0,0,2,1,0,0,0,0,0,100,0,0,0,0,5,6,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0
本文标题:将词法、语法、代码生成等实验组合成一个大的编译程序
链接地址:https://www.777doc.com/doc-6236340 .html