学号:0120810680326课程设计题目f or循环语句的翻译程序学院计算机学院专业软件工程班级0803姓名徐泽前指导教师何九周2011 年 6 月日目录1设计目的 (4)2设计环境与工具 (4)3设计任务要求与说明 (4)4设计时间 (4)5设计地点 (4)6系统描述 (4)7文法及属性文法的描述 (5)7.1文法描述 (5)7.1.1 FOR语句相关的产生式: (5)7.1.2 布尔表达式: (5)7.1.3 赋值表达式: (5)7.2属性文法的描述 (5)8 语法分析方法描述及语法分析表设计 (7)8.1语法分析方法描述 (7)8.2系统中使用的action和goto表(见附录1) (9)9 给出中间代码形式的描述及中间代码序列的结构设计 (9)10简要的分析与概要设计 (10)11 详细的算法描述 (11)11.1词法分析的数据结构设计与详细的流程图 (11)11.2词法分析流程图 (11)11.3语法制导翻译的数据结构与详细的设计图 (12)11.3.1数据结构的设计 (12)11.3.2算法描述 (13)11.3.3程序流程图 (13)12给出软件的测试方法和测试结果 (14)12.1 FOR循环语句的测试 (14)12.2词法分析出错处理 (15)12.3语法分析出错处理 (16)13收获与体会 (16)14 参考文献 (17)课程设计任务书学生姓名:徐泽前专业班级:软件0803班指导教师:何九周工作单位:计算机学院题目: for循环语句的翻译程序初始条件:程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。
算法:可以根据《编译原理》课程所讲授的算法进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求)1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
严格要求自己,要独立思考,按时、独立完成课程设计任务。
2.主要功能包括:利用算符优先分析方法和思想对某些语句进行语法分析与语义分析,生成相应的中间代码。
正确运用语法规则,并能应用所学的方法解决存在的问题。
语法分析方法及中间代码形式的描述、文法和属性文法的设计。
2.进行总体设计,详细设计:包括算法的设计和数据结构设计。
系统实施、调试,合理使用出错处理程序。
3.设计报告:要求层次清楚、整洁规范、不得相互抄袭。
正文字数不少于0.3万字。
包含内容:①课程设计的题目。
②目录。
③正文:包括引言、需求分析、总体设计及开发工具的选择,设计原则(给出语法分析方法及中间代码形式的描述、文法和属性文法的设计),数据结构与模块说明(功能与流程图)、详细的算法设计、软件调试、软件的测试方法和结果、有关技术的讨论、收获与体会等。
④结束语。
⑤参考文献。
⑥附录:软件清单(或者附盘)。
时间安排:消化资料、系统调查、形式描述1天系统分析、总体设计、实施计划3天撰写课程设计报告书1天指导教师签名: 2010年 6月 11日系主任(或责任教师)签名: 2010年 6月 11日1设计目的课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,设计题中的问题比平时的练习题要复杂,也更接近实际。
编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。
2设计环境与工具(1)D OS环境下使用Turbo C;(2)W indows环境下使用Visual C++ ;(3)其它熟悉语言。
3设计任务要求与说明明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
严格要求自己,要独立思考,按时、独立完成课程设计任务。
深入理解所学的《编译原理》相关知识,按照软件工程的设计方法进行简要的分析与概要设计,进行总体设计,详细设计、系统实施、调试。
运用程序设计语言实现算法,编写相关程序。
学会正确运用语法规则,并能应用优先关系和结合性解决二义性和冲突问题,有效而正确的利用各种分析方法和思想,合理使用出错处理程序,上机调试通过。
最后撰写课程设计报告。
通过编程实践逐步提高分析问题,解决问题的能力。
4设计时间第17周一周5设计地点鉴主10楼软件实验室6系统描述本系统完成FOR循环语句的翻译程序设计,FOR循环语句的格式为:for(A;B;C)Sx,其中A,B,C均为表达式,分别表示初始化,循环控制条件(这里为布尔表达式)以及使控制条件发生变化,Sx为循环体,可为一个或多个赋值语句。
本系统首先要进行词法分析,即从左到右逐个字符地对源程序进行扫描,产生一个个的单词序列,输出到一个中间文件上,作为语法分析的输入而继续编译过程。
该程序的语法分析能对输入的语法进行分析,判断输入语句是否满足for循环语句的文法。
通过LR分析方法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。
一个LR分析器主要由总控程序,分析栈(状态栈和符号栈),输入队列和分析表组成。
在语法分析的同时进行语义分析,最后输出四元式的代码。
7文法及属性文法的描述7.1文法描述本系统中所使用FOR循环语句的文法包括FOR语句本身,赋值表达式和布尔表达式。
具体文法产生式如下:7.1.1 FOR语句相关的产生式:1) S->for(W)Sx 2) W->A;W13) W1->B;W2 4) W2->A5) Sx->Ax 6) Sx->{Am}7)Am->AmAx 8) Am->Ax7.1.2 布尔表达式:9)B->B||L 10) B->L11) L->L&&M 12) L->M13) M->!M 14) M->K15) K->(B) 16) K->false17) K->true 18) K->id19) K->idScid 20) Sc-> !=21) Sc-> == 22) Sc-> <=23) Sc-> >= 24) Sc-> <25) Sc-> >7.1.3 赋值表达式:26) Ax->A; 27) A->id=E28) E->E+T 29) E->E-T30) E->T 31) T->T*F32) T->T/F 33) T->F34) F->id 35) F->(E)36) F->num7.2属性文法的描述在本程序中用了三个变量来传递各种属性,TrueOrchain表示判断条件为真时的链号或者为句子的chain,FalseOrend表达判断条件为假时的链号,codeBegin表达代码的开始地址。
neststat指向下一四元式的地址,emit即为对四元式代码的打印,还需要下面三个函数:1.chainMerge( p1 , p2),把p1和p2为链首的两条链合并为一条。
返回合并后的链首值。
即将p2的链尾第4区段改为p1,合并后的链首为p2,除非p2是空链。
2.backpatch(p , t),把p所链接的每个四元式的第4区段都填为t。
其中使用语义值codeBegin与非终结符E相连,表示表达式E的第1个四元式语句的序列。
3.objectCode.insert(objcode),把中间代码存到objectCode中并把nextatat加1。
具体的需要传递属性的产生式的属性文法如下表所示:产生式属性文法S->for(W)Sx emit(1);//生成最后一个jumpbackpatch(nextstat,LastGotoAddress);//回填最后一个jump; backpatch(W.FalseOrEnd ,nextstat);//B为假则跳到最后四元式W1->B;W2 backpatch(B.TrueOrChain,W2.TrueOrChain); backpatch(W2.FalseOrEnd , B.codeBegin );W2->A emit(4);//输出跳转W2.TrueOrChain = nextstat; W2.FalseOrEnd = nextstat-1;Sx->{Am} 去掉{}B->B1||L backpatch(B1.FalseOrEnd, L.codeBegin );//回填B.codeBegin =B1.codeBegin ;B.TrueOrChain=chainMerge(B1.TrueOrChain,L.TrueOrChain);B.FalseOrEnd = L.FalseOrEnd ; LastGotoAddress=nextstat;//记录最后jump回填地址B->L LastGotoAddress=nextstat;//记录最后jump回填地址L->L1&&M backpatch(L1.TrueOrChain , M.codeBegin );//回填L.codeBegin =L 1.codeBegin ;L.TrueOrChain =M.TrueOrChain ;L.FalseOrEnd=chainMerge(L 1.FalseOrEnd,M.FalseOrEnd );M->!M 1 M.TrueOrChain =M 1.FalseOrEnd;M. FalseOrEnd =M 1。
TrueOrChainM.codeBegin =M 1.codeBegin ;K->idScid K.TrueOrChain =nextstat;K.codeBegin =nextstat;K.FalseOrEnd = nextstat+1;emit(J+Sc,id,id, );//输出跳转语句emit(jump,-,-, );A->id=Eemit(E,- ,- ,id);//输出赋值语句 E->EoperT(oper 为+-*/) emit(oper , E , T , temp);//输出表达式8 语法分析方法描述及语法分析表设计8.1语法分析方法描述本程序采用SLR (1)分析方法,简单的LR(1),即只在动作不唯一的地方向前查看一个符号,在动作唯一时不向前查看输入符号。