编译原理课程设计报告-编译程序构造.doc
《编译原理课程设计报告-编译程序构造.doc》由会员分享,可在线阅读,更多相关《编译原理课程设计报告-编译程序构造.doc(37页珍藏版)》请在沃文网上搜索。
1、课程设计题目: 编译程序构造 内容摘要本次课程设计涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以及生成中间代码。通过词法分析识别单词和运算符,根据LR分析算法构造SLR(1)分析程序,并完成语法分析动作,语法分析调用词法分析,然后查找用SLR(1)构造的ACTION表和GOTO表进行移进或归约,归约时根据不同的产生式进行不同的语义分析,最终输出分析过程,并形成符号表、二元式、四元式文件。本次程序将本次课程所学的词法分析,语法分析和语义分析结合起来,使我们进一步理解正则表达式,自动机以及语法分析方法。同时加深掌握语法制导翻译和中间代码生成,在语法分析的同时进行语义加工并产生
2、出中间代码的方法。关键词:算数表达式和赋值语句,词法分析,语法分析,语义分析,SLR(1)目录内容摘要3目录4第1章 绪论51.1、课程设计目的51.2、课程设计意义51.3、课程设计要求51.4、课程设计内容51.4.1、题目51.4.2、内容51.4.3、具体要求61.4.4、程序设计提示61.4.5、测试数据61.4.6、程序扩展要求71.5、课程设计地点与环境7第2章 程序设计内容82.1、设计方案介绍82.1.1、模块划分及模块调用关系82.1.2、程序流程图82.2、SlR(1)分析表9第3章 程序详细设计与实现113.1、词法分析113.2、语法分析123.3、语义分析153.4
3、、程序实现结果图15第4章 总结18参考文献19附录20第1章 绪论1.1、课程设计目的编译原理课程设计是编译原理课程必不可少的一个环节,通过课程设计,加深对编译原理的教学内容的了解,以及实现编译原理各部分知识的融合。进而提高学生分析问题、解决问题,从而运用所学知识解决实际问题的能力。1.2、课程设计意义计算机语言之所以能由单一的机器语言发展到现今的数千种高级语言,就是因为有了编译技术,编译技术是计算机科学中发展最迅速,最成熟的技术,它集中了计算机发展的成果与精华,它具有很强的理论性和实践性,本次课设将理论应用到实践,增强学生学习的热情。1.3、课程设计要求1明确课设任务,复习与查阅有关资料2
4、按要求完成课设内容,课设报告要求文字和图工整、思路清楚、正确。3注意增强程序界面的友好性。凡用户输入时,给出足够的提示信息使用户感到方便使用。4注意提高程序的可读性和可理解性:程序中应有适当的注释,变量命名应符合实际含义,程序结构清晰,易于阅读和理解。1.4、课程设计内容1.4.1、题目编译程序构造1.4.2、内容涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以及生成中间代码。1.4.3、具体要求根据LR分析算法构造SLR(1)分析程序,并完成语法分析动作(当需要一个单词时,调用词法分析程序获取),同时完成语义分析生成四元式输出。要求程序具有通用性,改变文法时只需改变程序的
5、数据初值,无需改变程序主体;要求完成一条说明语句、一条算数表达式和赋值语句的翻译,生成中间代码。变量说明语句的文法及相应的语义子程序:.att表示数据类型属性,fill函数表示将单词id及其类别属性填写符号表。(0)SD; acc(1)Dint id fill(id,int);D.att=int; (2)Dfloat id fill(id,float); D.att=float; (3)DD(1),id fill(id,D(1).att);D.att=D(1).att; 算数表达式和赋值语句的文法及相应的语义子程序。(1)Aid=E; p=lookup(id.name); emit(E.PAL
6、CE, , p); (2)EE(1)+T E.PALCE=newtemp(); emit(+,E(1).PALCE,T.PALCE,E.PALCE)(3)ET E.PALCE=T.PALCE;(4)TT(1)*F T.PALCE=newtemp(); emit(+,T(1).PALCE,F.PALCE,T.PALCE)(5)TF T.PALCE=F.PALCE;(6)F(E) F.PALCE=E.PALCE;(7)Fid P=LOOKUP(id.name); F.PALCE=P;(8)Fnum P=LOOKUP(num.value)F.PALCE=P;构造其用于SLR(1)分析的识别活前缀的D
7、FA以及action表和goto表。然后编程实现。(关于词法分析部分只需识别出与此文法相关的单词即可(+,*,(,),id,=)。1.4.4、程序设计提示(1)分析栈设计时可以用一个栈完成,也可以设计三个栈:一个符号栈,一个状态栈,一个语义栈,则归约时,则需要在符号栈中退掉n个符号,在状态栈中退掉n个符号(n为产生式符号个数),语义栈中退掉n个符号对应的语义;(2)终结符表和非终结符表的组织和预测分析程序中相同(将符号对应到一个数字,表示在分析表中对应的下标)。(3)action表中的错误处理:简化的错误处理:当查找action表出现空白时,则当前单词无法移进和规约,可简单的认为当前单词为多余
8、的单词,则抛弃当前单词,读下一单词继续分析。1.4.5、测试数据源文件中数据:int area,r; r=1;area=r*r+r;程序要求输出二元式序列、符号表、语法分析过程、四元式序列。1.4.6、程序扩展要求有能力的同学可将编译程序扩展布尔表达式的分析和四元式生成,布尔表达式的翻译参见教材(胡元义编译原理教程)104105页。1.5、课程设计地点与环境课设地点:计算机系软件实验室课设环境:VC+ 6.0第2章 程序总体设计2.1、设计方案介绍2.1.1、模块划分及模块调用关系单词符号表语法分析器词法分析器字符字符串形式的源程序主函数取下一个单词词图2-1:模块关系图2.1.2、程序流程图
9、读一个字符开始合法字符字母读下一个字符字母或数字填写结构体报错语法分析函数结束NYYN图2-2:词法分析流程图查SLR(1)表开始调用词法分析器合法标识符查找标识符符号在终结符表中的下标判断其值0移进0归约接受=100结束NY图2-3:语法分析流程图2.2、SlR(1)分析表(1)说明语句的SLR(1)表 表2-1 说明语句表状态ACTIONGOTOintfloat;,id#D S0S3S41911002S5S63S74S8 5r16S97r2r28r3r3 9r4r4acc(2)表达式和赋值语句的SLR(1) 表2-2 表达式和赋值语句表状态ACTIONGOTO#id=num:+*()FAE
10、T0S211 acc2S33S9S8S76454S10S115r3r3S12r36r5r5r5r5 7S9S8S761358r8r8r8r89r7r7r7r710r111S9S8S761412S9S8S71513S11S1614r2r2S12r215r4r4r4r416r6r6r6r6第3章 程序详细设计与实现3.1、词法分析首先定义结构体typedef struct /状态栈 int datamax;int top;seqstack1;typedef struct /符号栈 string datamax; int top;seqstack2;struct reserveedword/保留字表
11、结构 string word;char value;reserveedword1maxsize;struct identifer/标识符表结构 char identiname15; char identitype15; int address;identifer1maxsize;struct constant/常量表结构string constantname; string value; int constantaddress;constant1maxsize;词法分析主要函数结构: void Initscanner() /该函数用于用C语言当中常见的关键字初始化保留表 void Isalph
12、a(char s) /用于判断读入的字符是不是字母 void Isnumber(char s) /用于判断读入的字符是不是数字 void Isother(char s) /判断除数字与字母之外的其他字符 void Lexscan() /用于循环从程序中读入字符并判断应调用那个判断函数字符 void Output(int i,int j,char ss15) /输出二元式 本模块程序的伪代码如下:打开文件infile.open(input.txt,ios:in); if(!infile) cerr读取的文件打开失败!=A)&(ch=a)&(ch=0)&(ch=9) Isnumber(ch) Ou
13、tput; else Isother(ch) Output; 关闭文件infile.close(); 词法分析器中从源文件读出一个单词,判断其类型是关键字、标识符还是普通符号,根据其类型为结构体各项赋值,并将其传给语法分析函数。3.2、语法分析由于说明语句与算术表达式和赋值语句所使用的是不同的文法,所以两者的ACTION表和GOTO表也不一样,本次课设采用二维数组存放ACTION表和GOTO表信息,其中移进用大于0的数表示,归约用小于0的数表示,成功用100表示(acc),其他处用0表示,查表时遇到相应的数进行相应的操作。其中,归约部分需要根据其产生式的信息进行,所以程序中有如下定义:stri
14、ng v18=int,float,;,id,#,D,S; /存放说明文法当中的字符string v213=#,id,=,num,;,+,*,(,),F,A,E,T;/存放算本文法当中的字符根据状态转换图(DFA)构造SLR(1)分析表:其中说明文法和算术文法分别构造,同时在每个表当中既有action表 又有goto表int analysis_table1108=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,9,0,0,0,0,
15、0,-2,-2,0,0,0,0,0,0,-3,-3,0,0,0,0,0,0,-4,-4,0,0,0,0;int analysis_table21713=0,2,0,0,0,0,0,0,0,0,1,0,0, 100,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,0,0,0,0,0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,4,5, 0,0,0,0,10,11,0,0,0,0,0,0,0, 0,0,0,0,-3,-3,12,0,-3,0,0,0,0, 0,0,0,0,-5,-5,-5,0,-5,0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,1
16、3,5, 0,0,0,0,-8,-8,-8,0,-8,0,0,0,0, 0,0,0,0,-7,-7,-7,0,-7,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,0,14, 0,9,0,8,0,0,0,7,0,15,0,0,0, 0,0,0,0,0,11,0,0,16,0,0,0,0, 0,0,0,0,-2,-2,12,0,-2,0,0,0,0, 0,0,0,0,-4,-4,-4,0,-4,0,0,0,0, 0,0,0,0,-6,-6,-6,0,-6,0,0,0,0;语法分析当中各个函数说明及伪代码:void action
17、1(int i,string s) /通过词法分析传过来的值判断移进动作三个栈(状态栈,符号栈,语义栈)应该读入哪些值。void action2(int i,string s) /同action1只是表示算术文法int address(string m,int i,string x) /获得在分析表中的列下标void goto1(int i,string s) /通过判断栈中的元素,来判断用那个产生式来进行规约void goto2(int i,string s) /同goto1void slr1() /对说明文法进行语法分析void slr1() /对算术文法进行语法分析 伪代码如下: 先判断
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 报告 编译程序 构造