当前位置:文档之家› FOR循环语句的翻译程序设计(简单优先法、三地址码)JAVA资料

FOR循环语句的翻译程序设计(简单优先法、三地址码)JAVA资料

学号:0121210340527课内实践报告课程名称编译原理题目FOR循环语句的翻译程序设计(简单优先法、输出三地址码)学院计算机科学与技术专业计算机科学与技术班级1201姓名李潇颖指导教师林泓2014 年12 月9 日课内实践任务书学生姓名:李潇颖专业班级:计算机1201班指导教师:林泓工作单位:计算机科学与技术学院题目: FOR循环语句的翻译程序设计(简单优先法、输出三地址码)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课内实践工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址码的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课内实践报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课内实践报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名:年月日系主任(或责任教师)签名:目录1 系统描述(问题域描述) (3)1.1设计目的 (3)1.2设计内容描述 (3)2.文法的描述 (3)3 语法分析方法描述及语法分析表设计 (4)3.1语法分析方法描述 (4)3.2 分析法操作步骤 (4)3.3优先关系矩阵 (5)4 中间代码形式的描述 (6)5 编译系统的概要设计(主要函数) (6)6 详细的算法描述(流程图) (7)6.1词法分析过程 (7)6.2语法分析过程 06.3三地址码的输出 07 测试方法和测试结果 (1)8.心得体会 (4)9.代码(完整) (5)10.本科生课内实践成绩评定表 (14)FOR循环语句的翻译程序设计(简单优先法、输出三地址码)1 系统描述(问题域描述)1.1设计目的通过学习编译原理的相关内容,设计并编写FOR循环语句的翻译程序,使用简单优先法,按三地址码输出,能够实现词法分析,语法和语义的分析,加深对所学知识的理解,并且能够熟练运用到实际当中。

1.2设计内容描述FOR循环语句的基本格式如下:FOR(表达式1;表达式2;表达式3){赋值语句}根据所给题目要求,设计出符合FOR循环语句的文法及属性文法的描述,语法分析方法以及三地址码的输出方式,罗列出词法分析和语法分析的流程,根据语法规则设计输入输出方法,简单优先法中的优先关系表格。

设计好并且进行编译,设计若干输入输出用例(包括正确的输入和错误的输入,用来检查程序的完整性)。

2.文法的描述根据For语句的特点,制定的产生式规则及由产生式对应的语义动作如下:H->f(G;A;B){S;}G O T O H->f(G;C;D){S;}G O T O G->i1=i2i1.C O D E=i2.C O D E A->i1<i2 IFi1.CODE>=i2.CODE GOTO OVER B->i d i.C O D E=i.C O D E+1 C->i1>i2 IFi1.CODE<=i2.CODE GOTO OVER D->i a i.C O D E=i.C O D E-1 S->j=M j.C O D E=M.C O D E M->E M.C O D E=E.C O D E E->W E.C O D E=W.C O D EW->W+U W.CODE=W.CODE+U.CODE W->W-U W.CODE=W.CODE-U.CODE W->U W.C O D E=U.C O D E U->T U.C O D E=T.C O D E T->T*F T.CODE=T.CODE”F.CODE T->T/F T.CODE=T.CODE/F.CODE T->F T.C O D E=F.C O D E F->(E) F.CODE=(E.C ODE) F->j F.C O D E=j.C O D E (备注:其中d表示--,a表示++)3 语法分析方法描述及语法分析表设计3.1语法分析方法描述本次课内实践要求使用简单优先关系方法。

简单优先分析法的基本思想史对一个文法按照一定原则求出该文法所有符号即包括终结符和非终结符之间的优先关系确定归约过程中的句柄,它的归约实际上是一种规范归约。

一个文法是简单优先文法必须满足以下条件(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立;(2)在文法中任意两个产生式没有相同的右部。

三种优先关系及其判定方法如下所示:(1)X=Y 表示X和Y的优先关系相等,当且仅当G中存在产生式规则A→…XY…;(2)X<Y表示X的优先性比Y的优先性小,当且仅当G中存在产生式规则A→…XB…,且B Y…;(3)X>Y表示X的优先性比Y的优先性大,当且仅当G中存在产生式规则A→…BD…,且B…X和D Y…;(4)对任何X,若文法开始符号S→X…,则#<X,若S→…X则X>#。

3.2 分析法操作步骤由简单优先分析法的基本思想设计的如下算法,首先要构造优先关系矩阵(如3.3所示),并将文法产生式保存,设置符号数组S:(1)将输入符号串a1a2…an# 依次逐个保存符号数组S中,直到遇到数组中第一个符号ai 的优先性>下一个待输入符号aj为止。

(2)数组当前符号ai 为句柄尾,由此向左在数组中找句柄的头符号ak,即找到a k-1<ak为止。

(3)由句柄ak…ai在文法的产生式中查找右部为ak…ai的产生式,若找到则用相应左部代替句柄,找不到则为出错,这是可断定输入串不是该文法的句子。

(4)重复(1)(2)(3),直到归约完输入符号串,数组中只剩文法的开始符号为止。

3.3优先关系矩阵H G A B S C D M E W U T F f ( ; ) { } i = < ++ > --j + - * / #H > G =A =B =S =C =D =M >E > =W > > = =U > > > >T > > > > = =F > > > > > >f =( = = < < < < < < <; = = = = = <) > > = > > > > { = <} > i > = = = = == = < < < < < < = << =++>> =-->j > > = > > > > + = < < < <- = < < < <* = < </ = < <# < <空白表示,没有优先级关系4 中间代码形式的描述三地址码是由下面一般形式的语句构成的序列:x:=y op z其中,xyz为名字、常数或变量;op代表运算符。

对于本程序的具体三地址码输出,预计显示结果如下:给定输入程序for(i=0;i<10;i++){j=b+c;}三地址码输出为<1> i=0<2> goto <5><3> i++<4> if i<10 goto<5> else goto<7><5> j=b+c<6> goto<3><7> end5 编译系统的概要设计(主要函数)主要函数及对应实现的功能如下表所示:函数名称实现功能Main() 程序入口cifafenxi() 进行词法分析bijiao() 比较两个符号的优先级别sandizhima() 保存产生的三地址码序列readFileByChars()将文本中的数据入读Isguanjianzi() 判断是否为关键字Isjiefu() 判断是否为界符Isyunsuanfu() 判别是否为运算符6 详细的算法描述(流程图)6.1词法分析过程给定输入程序for(i=0;i<10;i++){j=b+c;} 词法分析结果为 关键字为:1; 标识符为:2; 常数为:3; 运算符为:4; 界符为:5 <for 1> <( 5> <i 2> <= 4> <0 3> <; 5> <i 2> << 4> <10 3> <; 5> <i 2> <++ 4> <) 5><{ 5><j 2> <= 4> <b 2> <+ 4> <c 2> <; 5> <} 5>6.2语法分析过程6.3三地址码的输出给定输入程序for(i=0;i<10;i++){j=b+c;} 三地址码输出为<1> i=0<2> goto <5><3> i++<4> if i<10 goto<5> else goto<7><5> j=b+c<6> goto<3><7> end武汉理工大学《编译原理》课内实践说明书7 测试方法和测试结果计算机系统:Windows 7编译调试环境:Eclipse程序语言:JAVA设计测试用例:(1)data.txt中保存如下程序段for(i=0;i<10;i++){j=b+c;} 输出如下结果(2)data.txt 中保存如下程序段for(i=5;i>0;i--){j=a*(h+c);}输出如下结果8.心得体会经过这次课内实践,使我更加扎实的掌握了有关编译原理方面的知识,在编写程序的过程中遇到了许多问题,但经过一遍遍的调试终于使得程序可以顺利运行。

相关主题