编译原理:FOR循环语句的翻译程序设计LL(1)法、输出四元式(附源代码)
学号:
FOR循环语句的翻译程序设计
题目
(LL(1)法、输出四元式)
学院计算机科学与技术
专业计算机科学与技术
班级计算机0901班
姓名
指导教师
2012 年01 月03 日
课程设计任务书
学生姓名:专业班级:计算机0901班
指导教师:工作单位:计算机科学与技术学院
题目: FOR循环语句的翻译程序设计(LL(1)法、输出四元式)
初始条件:
理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:
1 系统描述(问题域描述);
2 文法及属性文法的描述;
3 语法分析方法描述及语法分析表设计;
4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5 编译系统的概要设计;
6 详细的算法描述(流程图或伪代码);
7 软件的测试方法和测试结果;
8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);
9 参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2011年11月18日
系主任(或责任教师)签名: 2011年11月18日
FOR循环语句的翻译程序设计
——LL(1)法、输出四元式
1.系统描述
1.1问题描述
用LL(1)法设计、编制、调试一个FOR(表达式1;表达式2;表达式3)〈赋值语句〉的语法及语义分析程序,输出四元式。
1.2功能描述
(1)能够识别出单词、单词类型、单词位置
(2)能够用LL(1)方法识别单词序列是否符合FOR循环文法
(3)能够完成对FOR循环中3个表达式的翻译
(4)能够完成对FOR循环中赋值语句(含复杂表达式)的翻译
(5)能够对FOR循环3个表达式中有表达式1或3缺少时翻译
(6)能够用标准化的四元式进行翻译结果输出
(7)能够用四元式清晰、正确地反映FOR循环的执行流程
(8)能够用文本输入FOR语句循环,再用txt文本输出分析结果
2 文法及属性文法的描述
2.1文法的语言描述
A->for(条件){赋值语句}
条件->语句1 语句2 语句3
语句1->i = 表达式; //i表示标识符
语句1->;
语句2->i > 表达式;
语句2->i < 表达式;
语句3->i = 表达式;
语句3->
赋值语句->
表达式->表达式+表达式
表达式->表达式-表达式
表达式->表达式*表达式
表达式->表达式/表达式
表达式->(表达式)
表达式->i //i 表示标识符、常数、字符、或字符串
2.2属性文法描述
2.2.1 FOR 语句
FOR(C D G)
n C
n+1 if D==true goto Y.start
n+2 goto Y.end+3
Y.start ...................//赋值语句的开始
...... ...................
Y.end ...................//赋值语句结束
Y.end+1 G
Y.end+2 goto n+1
Y.end+3 //跳出循环体后第一条语句
2.2.2 赋值语句
Y->m=E; { m.value=E.Value }
E->E1 op E2 (op: +,-,*,/,>或<)
{
E.place = newtemp; //生成新的变量
E.value =E1.value op E2.value
}
N->(E) { N.value=E.value }
N->i { N.value=i.value }
3.语法分析方法描述及语法分析表设计
3.1 对LL(1)分析的描述
LL(1):第1个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将用最左推导,1表明只需向右看一个符号便可决定如何推导即选择哪个产生式(规则)进行推导。从文法的开始符号出发企图推导出与输入的单词串完全相匹配的句子,若输入串是文法给定的句子,则必能推出,反之必然出错。
LL(1)优点:实现方法简单、直观,便于手工构造或自动生成语法分析器。文法很容易写出。
LL(1)缺点:对文法有一定得限制,要求推导过程中紧跟在飞终结符右边可能出现的终结符集不相交。另外在做语法制导翻译时中间代码的输出方案相对于LR法比较复杂。LR 分析法的句柄即体现了算符的优先级,出现句柄即做相应的归约动作,中间代码很容易写出,实现很简单。LL(1)是做自顶向下推导,因此设计LL(1)的语法制导翻译输出中间代码很需要技巧,涉及到了判断符号的优先级。
3.2 语法分析表设计
文法(消除了左递归)及相应的选择符集
NO. 文法SELECT集
0 A->f(B){Y} { f }
1 B->CDG { ;,i }
2 Y-> { } }
3 Y->m=E { m }
4 C->; { ; }
5 C->i=E { i }
6 D->iF; { i }
7 F-> 8 F->>E { > } 9 G->ε{ ) } 10 G->i=E { i } 11 E->LM { (,i } 12 M->+LM { +} 13 M->-LM { - } 14 M->ε{ ),; } 15 L->NP { (,i } 16 P->*NP { * } 17 P->/NP { / } 18 P->ε{ +,-,),;} 19 N->i { i } 20 N->(E) { ( } 3.3 预测分析表设计 表达式文法的预测分析表 f i m ; < > + - * / ( ) { } = A 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 B -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 C -1 5 -1 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 D -1 6 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 E -1 11 -1 -1 -1 -1 -1 -1 -1 -1 11 -1 -1 -1 -1 F -1 -1 -1 -1 7 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 G -1 10 -1 -1 -1 -1 -1 -1 -1 -1 -1 9 -1 -1 -1 L -1 15 -1 -1 -1 -1 -1 -1 -1 -1 15 -1 -1 -1 -1 M -1 -1 -1 14 -1 -1 12 13 -1 -1 -1 14 -1 -1 -1 N -1 19 -1 -1 -1 -1 -1 -1 -1 -1 20 -1 -1 -1 -1 P -1 -1 -1 18 -1 -1 18 18 16 17 -1 18 -1 -1 -1 Y -1 -1 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 -1 说明: 1. 第1列为终结符,第1行为非终结符 2. 非终结符与终结符的交点出表示将要选择哪个产生式做预测分析进行推导 3. -1表示出错,其余数字为产生式的序号NO,表示选择相应的产生式 4.间代码形式的描述及中间代码序列的结构设计 4.1 四元式描述 四元式是一种比较普遍采用的中间代码形式。四元式的四个组成部分是:算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT,运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。 例如a=b*c+b*d的四元式表示如下: (1)(* ,b,c,t1) (2)(* ,b,d,t2) (3)(+ ,t1,t2,t3) (4)(= ,t3,-, a) 四元式表示很类似于三地址指令,有时把这类中间表示称为“三地址代码”,因为这种表示可以看成一种虚拟三地址机的通用汇编码,即这种虚拟机的每条“指令”包含操作符 有时为了更直观,也把四元式写成简单赋值形式。(1)t1=b*c (2)t2=b*d (3)t3=t1+t2 (4)a=t3 把(jump,—,—,L)写成goto L 把(jrop,B,C,L)写成if B rop C goto L 我采用的是更直观的形式。 4.2 中间代码序列的结构设计 以for(i=0;i 中间代码序列的结构应如下: 1. i=0 2. if i 3. goto 11 4. t1=n-1 5. t2=t1/5 6. t3=3*2 7. t4=t2-t3 8. m=t4 9. i=i+1 10. goto 2 11. 我的中间代码结构是这样设计的: 第1条语句输出表达式1,表达式为空时输出空行; 第2条输出条件判断; 第3条输出goto temp+7; 第4条至第4+temp条输出赋值语句的四元式; 第5+temp条输出条件表达式3; 第6+temp条输出"goto 2" 第7+temp条输出空 说明:其中temp表示最终生成的中间变量个数,例如上例中,生成了t1,t2,t3,t4共4个中间变量,所以temp=4. 由于临时变量的产生个数是未知的,在语法制导翻译中要先对语句进行保存,等临时变量temp产生完后在对相应中间代码语句进行回填,最后输出。以便达到输出的中间代码跳转出入口及顺序是正确的。 5.编译系统的概要设计 5.1 问题分析 在该阶段严格按照设计指导书,分析要完成什么功能。词法分析提取单词,写出正确的文法,语法分析检查输入单词串是否符合文法,语义分析完成中间代码的输出,使用LL (1)法语法分析。 5.2 LL(1)分析 根据平时课程对LL(1)分析方法的学习,把握好分析方法的实质。即从左向右扫描输入串,自顶向下最左推导。推导时非终结符面临剩余输入串串头采用相应的推导产生式,产生式右边进分析栈,栈顶为首符。若首符为非终结符,则继续推导; 若首符为终结符,则匹配,匹配不成功报错,匹配成功栈顶下移,剩余串串头右移。重复该过程,直至结束。 5.3 符合for循环的文法 过程非常重要,文法写不好,就会产生推导时面临相同选择符的推导冲突,并且文法往往决定了你能够分析的语句有哪些格式,哪些能够处理,哪些不能够处理。对于for循环语句,要考虑到表达1可以为空,表达式3也可以为空,这样根据是否有表达式1,3有4种情况。对于赋值语句,赋值语句,应该考虑到赋值语句为空的特殊情况,因为在采用for循环延时的时候,赋值语句就是空的。对于赋值语句,不能是简简单单的m=b;还应该有m=b+c*d(e-f)/n这样的复杂的赋值语句。 5.4 语义动作 语义分析,其实关键还是在于赋值语句上。因为赋值语句是有优先级的,而语法分析时LL(1)只是自左向右扫描,推导,匹配,并没涉及到优先级。因此在写出文法后要给 出恰当的语义动作。我在设计时使用了算符栈和操作数栈。当输入串串头为算符时,用算符栈栈顶算符与输入串串头算符进行比较。若大于,栈顶算符退栈,操作数栈退出两个操作数,执行运算,产生中间变量,再中间变量进栈;若小于,则串头算符进算符栈;若等于,表明是(和)匹配,将(退栈。 6.详细的算法描述 6.1伪代码概述 (1)扫描输入的字符char_input[],将字符根据构词规则截取出一个个单词word_input[]。根据不同类型的单词有不同的构词规则进行单词类型分类word_tyep[],并记录其出现的位置word_position[]。 (2)#进分析栈,开始符A进分析栈 (3)取符号栈顶元素a和剩余输入串队头元素b, 若a为非终结符,那么以(a,b)在预测分析表找到对应的数字i,根据i找到产生式。若i为-1则出错,报出错误。找到产生式后,a退栈,产生式入栈,按照产生式从右向左对应分析栈从底向顶的对应顺序入栈。重复(3) 若a为终结符,则根据(a==b),匹配成功,则a出栈,串头后移。若a不为"#",重复(3)。a为"#",执行(4)。匹配失败则报错。 (4)输出“匹配成功!” 6.2语义动作方案 6.2.1赋值语句动作 while(c_get!=";"||GetTop(OPTR,OPTR_i)!=';') { if(!In(c_get,OP)) { PushND(OPND,c_get,OPND_i);l++;c_get=a[l]; } else switch(Precede(GetTop(OPTR,OPTR_i),c_get)) //运算优先级的比较 { case '<': PushTR(OPTR,c_get,OPTR_i); l++; c_get=a[l]; break; case '=': x=PopTR(OPTR,OPTR_i); l++; c_get=a[l]; break; case '>': optr=PopTR(OPTR,OPTR_i); opnd2=PopND(OPND,OPND_i); opnd1=PopND(OPND,OPND_i); PushND(OPND,Operate(opnd1,optr,opnd2,temp_i),OPND_i); break; } } (1)如果c_get为是标识符,PushND(OPND,c_get,OPND_i);将C_get入操作数栈OPND (2)如果c_get是算符,Precede(GetTop(OPTR,OPTR_i),c_get),将OPTR这个运算符栈的栈顶运算符与c_get比较,出现>,<,或= (3)若<,则PushTR(OPTR,c_get,OPTR_i),将c_get算符入栈OPTR 若=,则c_get为),栈顶算符为(,x=PopTR(OPTR,OPTR_i),将(退栈。 若>,则可以运算了: optr=PopTR(OPTR,OPTR_i) 运算符出栈 opnd2=PopND(OPND,OPND_i) 先出操作数栈的是第2操作数 opnd1=PopND(OPND,OPND_i) 后出操作数栈的是第1操作数 PushND(OPND,Operate(opnd1,optr,opnd2,temp_i),OPND_i)计算结果作为临时变量压入操作数栈。temp_i记录临时变量的个数 执行Operated()时,将运算四元式保存到expression[]中,作为将来输出标准的四 元式使用。expression[temp_i]=temp[temp_i]+"="+opnd1+optr+opnd2;temp_i++ 6.2.2 FOR句动作 以FOR语句中的2个;和1个)为界,在语法分析时截取表达式: Quaternion[1]中存储语法分析截取的第1个表达式 Quaternion[2]中存储语义分析截取的第2个表达式 Quaternion[3]中存储语义分析截取的第3个表达式 cout<<1<<". "< cout<<2<<". "<<"if "< cout<<3<<". "<<"goto "<<3+4+temp_i < temp_i记录在语法分析制导中赋值表达式产生中间变量的个数,因此goto语句的地址入口要等赋值语句做完产生所有的临时变量后才能知道。 ...........赋值语句动作............... cout<<5+temp_i<<". "< cout<<6+temp_i<<". "<<"goto 2"< cout<<7+temp_i< 7. 软件的测试方法和测试结果 7.1测试方法 根据自己当初的设计思想,设计了测试用例。包括没有for中第1个表达式的情况,没有第3个表达式的情况,没有赋值语句的情况,赋值语句比较复杂等情况。用文本输入for循环语句,用txt文本输出分析出的四元式。 7.2测试用例 在文本文件中输入源程序: for(i=0;i 输入测试文件: 词法分析结果: 其中第一列为位置序号;第二列为截取的单词;第三列为类型 类型1:关键字类型2:标识符类型3:常数类型4: 运算符类型5:界符语法分析结果: 语义分析结果: 输出四元式,txt文档记录: 8 研制报告 8.1研制过程 8.1.1分析过程 本次课程设计在思考阶段花费了两天多的时间,开始时做过赋值语句的词法分析、语法分析和语义分析,不过使用LR方法做的。感觉LR方法比较简单一些。但是实验题目要求我要用LL(1)方法来做,开始时不知如何下手,有一些担心自己做不出来的情绪。后来就从LL(1)的思想着手,从代表性的例题看起,按部就班的来。感觉LL(1)方法做语法分析比LR法要简单。但是LL(1)方法做语法制导翻译比LR法要复杂一些。我的观点是:LL(1)方法单纯的做语法分析很简单,从左向右,自顶向下,没有优先级可言,语法分析匹配了则成功,不匹配则失败,但是对于语义动作要通过优先级来考虑,例如如a-b*c+d,a匹配,-匹配,b匹配,总不能做a-b,而是要a入操作数栈,-入算符栈,b 入操作数栈,-优先级小于*,所以不做a-b,而*优先级大于+,可以做b*c,在比较-和+优先级;LR法在做语法分析时,要画识别文法活前缀的DFA,这点比较繁琐,但它把优先级的思想通过句柄来体现,句柄出现则进行归约,在把含*短语归约之前,绝不会把含-短语先归约,这样就很容易通过非常简单语义动作产生后缀式。虽然用LL(1)做语义动作困难一些,我想不妨先易后难,先把语法分析作出来,在做语义动作的时候因为是用语法制导,可以在写程序时加入语义动作。因为以前做LR法分析赋值语句的时候我就是这么做的。 8.1.2写文法的过程 写文法的时候,因为要考虑到for循环的3个表达式,一般来说第2个表达式条件控制是必须的,而第1个和第3个可以为空的。对于赋值语句,可以有,也可以是空的。因此在考虑时要有推出为空的情况。同时要保证所写文法不能含有左递归,相同非终结符所用产生式的select集不能有交集。我的思想是尽量让右边的产生式以终结符作为开头。这样会减少交集情况,减少左递归。但是事实最后证明,这种方法有缺陷,进一步限制了文法。由于开始没有考虑循环嵌套,所以没有实现for循环的嵌套的语法语义分析。 8.2本设计的评价特点、不足 本设计的优点在于能够将词法分析结果、语法分析结果清晰的展现出来,词法分析输出了单词、类型,位置,语法分析过程的每一步都输出了分析栈和剩余串,可以对照文法 验证推导的正确性。能够输出正确的四元式,找到正确的出口和入口。能够对for循环中缺少表达式1或表达式3的情况进行相应处理,能够处理赋值语句为空的情况,能够处理复杂的赋值语句。 不足之处是,没有考虑到循环的嵌套,不能对嵌套的for循环进行语义分析,没有进行赋值时的类型分析,如不同类型变量之间的赋值。 8.3收获体会 本次编译课程设计收获到很多东西,最大的收获在于认识到了自己的不足,对编译原理的基本方法有了初步了解。结合相关书籍以及互联网上的资料,实现了本次程序的研制。 在确定了所要设计的for语句属性文法之后,对程序整体划分了几个部分进行分析。在这几天的课程设计里,暴露出了个人能力需要很大提高这个缺陷,在txt文档输出中,有时候会出现文件名弄错导致不能文档输出的现象,进过改进和不断地测试,最终完成了该课程设计,达到了基本的课设要求。 在今后的学习中,我会多多向他人学习,多借鉴他人优秀的编程方法和思想,并且多做练习,达到学以致用,有时间的话我会把这个程序做的更加完美。 9.参考文献 [1] 殷人昆.数据结构(用面向对象方法与C++语言).清华大学出版社.2003.02 [2] 闵联营,何克右.C++程序设计教程(第二版).武汉理工大学出版社.2005.07 [3] 张素琴,吕映芝,蒋维杜,戴桂兰.编译原理(第2版).清华大学出版社.2002.06 [4] 李文生.编译程序设计原理与技术.北京邮电大学出版社.2006.05 本科生课程设计成绩评定表 班级:姓名:学号: 序号评分项目满分实得分 1 学习态度认真、遵守纪律10 2 设计分析合理性10 3 设计方案正确性、可行性、创造性20 4 设计结果正确性40 5 设计报告的规范性10 6 设计验收10 总得分/等级 评语: 注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格 指导教师签名: 200 年月日 源程序: /////////////////////////////////处理空格问题如int a;int b;处理数值问题,整数,小数等;处理读入读出问题,文件 // ;处理报错、纠错问题;处理格式类问题; #include #include #include #include #include using namespace std; int predictor[12][15]= { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //f i m ; < > + - * / ( ) { } = /*00 A*/ { 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*01 B*/ {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*02 C*/ {-1, 5, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*03 D*/ {-1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*04 E*/ {-1, 11, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, -1, -1}, /*05 F*/ {-1, -1, -1, -1, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*06 G*/ {-1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1}, /*07 L*/ {-1, 15, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1}, /*08 M*/ {-1, -1, -1, 14, -1, -1, 12, 13, -1, -1, -1, 14, -1, -1, -1}, /*09 N*/ {-1, 19, -1, -1, -1, -1, -1, -1, -1, -1, 20, -1, -1, -1, -1}, /*10 P*/ {-1, -1, -1, 18, -1, -1, 18, 18, 16, 17, -1, 18, -1, -1, -1}, /*11 Y*/ {-1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1} }; string grammar[21]= //文法 { /*00 A*/ "}Y{)B(f", //A->f(B){Y} /*01 B*/ "GDC", //B->CDG /*02 Y*/ "", //Y->0 /*03 Y*/ ";E=m", //Y->m=E; /*04 C*/ ";", //C->; /*05 C*/ ";E=i", //C->i=E; /*06 D*/ ";Fi", //D->iF; /*07 F*/ "E<", //F-> /*08 F*/ "E>", //F->>E /*09 G*/ "", //G->0 /*10 G*/ "E=i", //G->i=E /*11 E*/ "ML", //E->LM /*12 M*/ "ML+", //M->+LM /*13 M*/ "ML-", //M->-LM /*14 M*/ "", //M->0 /*15 L*/ "PN", //L->NP /*16 P*/ "PN*", //P->*NP /*17 P*/ "PN/", //P->/NP /*18 P*/ "", //P->0 /*19 N*/ "i", //N->i /*20 N*/ ")E(" //N->(E) }; int grammar_length[21]= { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 7, 3, 0, 4, 1, 4, 3, 2, 2, 0, 3, 2, 3, 3, 0, 2, 3, 3, 0, 1, 3 }; string temp[10]={"t1","t2","t3","t4","t5","t6","t7","t8","t9","t10"}; string *expression=new string [10]; bool In_compute(char a); bool In_limit(char a); bool In_number(char a); bool In_ID(char a); bool In_keywords(string a); 【关键字】教学 《F o r循环语句》教学设计 池州市第八中学杜亦麟 课题 For循环语句 教学内容 粤教版信息技术(选修1)《算法与程序设计》第二章《程序设计根底》第四节《程序的循环结构》第一小节《For循环语句》 教学目标 知识与能力: 1.理解循环结构的基本思想及For语句的执行过程。 2.培养和提高学生逻辑思维能力,使其可以独立完成简单循环结构算法的设计。 3.能够利用For循环语句实现循环结构,解决实际问题。 过程与方法: 1.通过简单的数学问题的分析、讲解,让学生掌握For循环语句语法知识,及其执行原理。 2.以任务驱动,学生分组合作探究的方式,进一步让学生理解For循环语句的基本思想,同时培养学生自主探究和合作学习的能力。 3.通过自评和互评活动,培养学生语言表达能力和归纳总结能力。 情感态度与价值观: 1.提高学生学习兴趣,培养学习的主动性和探究性。 2.培养学生团结协作精神,体验成功的快乐。 教学重点 1.掌握For循环语句的格式和功能; 2.理解For循环语句的执行过程。 教学难点 控制循环的条件、确定循环体的内容 教材分析 第二章是程序设计根底,也是全书的根底。它沿着分析问题、设计算法、编写程序等运用计算机解决问题之路,开始学习如何使用VB程序设计编写程序解决问题。本节课的主要内容For语句的基本格式、执行过程及语句的实际应用。又是本章的重点和难点内容。而循环结构是程序设计的三种基本结构之一,其作用是使一段程序反复执行。For循环语句在程序设计中频繁出现,也是三种结构中较难的一种,因此,学好本节课非常重要,本节课的学习会使学生对算法有一个更深刻的理解,为以后的程序设计打下一个良好的根底,也可以培养学生的创新能力、分析问题和解决问题的能力以及探究精神。 学生分析 1、知识储备根底 在前面的学习中,同学们已经初步掌握了VB编程环境和VB程序的运行方法及程序设计的根底知识,学习了顺序结构和分支结构的程序执行流程和编程。具备一定的算法根底和具有一定的比较、归纳能力。 课程设计任务书 学生姓名:赵旭林专业班级:计算机0801班 指导教师:陈天煌工作单位:计算机科学与技术学院 题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 11月 13日 系主任(或责任教师)签名: 2010年 11月 13日 目录 1 系统描述 (2) 1.1目的 (2) 1.2设计内容: (2) 1.3翻译过程 (2) 1.4初始条件: (3) 1.5 开发平台 (3) 2文法及属性文法的描述 (3) 3 语法分析表设计 (4) 3.1 LR分析概述 (4) 3.2 LR(0)分析表 (5) 3.3 LR语法分析过程的设计思想及算法 (7) 3.4 翻译方法 (8) 4 中间代码形式的描述及中间代码序列的结构设计 (8) 5简要的分析与概要设计 (9) 6详细的算法描述 (9) 6.1 main函数 (10) 6.2词法分析 (10) 6.3 语法分析 (12) 7 测试方法和测试结果 (13) 7.1测试过程 (13) 7.2 测试结论 (14) 8 研制报告 (14) 8.1研制过程 (14) 8.2本设计的评价 (15) 8.3个人心得体会 (15) 9 参考文献 (16) 本科生课程设计成绩评定表 (17) FOR循环语句的翻译程序设计 ——LR方法、输出四元式 1 系统描述 1.1目的 通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。 1.2设计内容: 本设计按照要求设计出for语句的简单文法,并使用LR分析法对用户输入的程序进行分析和翻译。 对下列正确的程序输入: for(i=0;i<10;i++) { m=m+i; } 结果程序要对该输入进行词法分析,然后利用LR分析法对词法分析后得到的单词序列进行语法分析,经过语法制导翻译显示出等价的四元式表示的中间代码。 对于错误的程序输入,如: for(i=0;i<10) { m=m+i; } 结果程序要指出程序出错。 1.3翻译过程 IF-ELSE条件语句的翻译程序设计 1 问题描述 要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。 2 问题分析及编译系统的概要设计 编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。 这次实验涉及到词法分析、语法分析、语义分析及表格管理和出错管理。其中,词法分析至少要能识别关键字“if”、“then”和“else”,标识符(即自定义变量),数字,和运算符等等;语法分析要分析程序结构的合法性,即是否为文法的句子;语义分析要能够语法制导翻译出中间代码(三地址)并将其输出;表格管理是指符号表;出错处理是指在语法分析时,所有非文法句子的错误类型处理. 3 文法及属性文法的定义 3.1 文法: 文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序. IF-ELSE条件语句的文法如下所示: 0.A->EB 1.B->+EB|-EB|ε 2.E->FT 3.T->*FT|/FT|ε 4.F->i|(E) 或者能够更简洁一点: 0.S->if A THEN B ELSE C 1.A->m rop n 3.C->x=n arop m 4.rop->=|<|> 5.arop->+|-|*|/ 3.2 属性文法: 属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。 在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规 则的形式为:b:=f(c 1,c 2 ,…,c k )其中f是一个函数,而且或者①b是A的一个综合属性 并且c 1,c 2 ,…,c k 是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有 继属性,文法开始符号的所有继承属性作为属性计算前的初始值。 属性文法为: if(VT[opr]=='=') //{"="判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='='; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='>') //{">"判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='>'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } 第33、34课时for循环的嵌套 实验题一: 1、下面有关for循环的正确描述是: D A) for循环只能用于循环次数已经确定的情况 B) for循环是先执行循环体语句,后判断表达式 C) 在for循环中,不能用break语句跳出循环体 D) for循环的循环体语句中, 可以包含多条语句,但必须用花括号括起来 2、对for(表达式1;;表达式3)可理解为:B A) for(表达式1; 0;表达式3) B) for(表达式1;1;表达式3) C) for(表达式1;表达式1;表达式3) D) for(表达式1;表达式3;表达式3) 3、若i为整型变量,则以下循环执行次数是:B for (i=2;2==0;) printf("%d",i-- ); A)无限次B) 0次 C) 1 次 D) 2次 4、以下for循环的执行次数是:C for (x=0,y=0; (y=123)&&(x<4); x++) ; A)是无限循环 B)循环次数不定C)执行4次 D)执行3次 成立,x++x=2 第三次:(y=123)&&(2<4)成立,x++x=3 第四次:(y=123)&&(3<4)成立,x++x=4 第五次:(y=123)&&(4<4)不成立,退出循环。 5、以下不是无限循环的语句为:A A) for (y=0,x=1;x > ++y;x =i++) i=x ; B) for (;1; x++=i); C) while (1) {x ++;} D) for(i=10;1 ;i--) sum+=i; 6、下面程序段的运行结果是:C for (y=1;y<10;) y=((x=3* y,x+1),x-1); printf ("x=%d,y=%d",x,y); A)x=27,y=27 B)x=12,y=13 C)x=15,y=14 D)x=y=27 第一次:1<10为真,x=3,x+1=3+1=4, y=(4,x-1) y=(4,2)=2 第二次: 2<10为真, x=3*2=6,7 y=(7,x-1)=(7,5) y=5 第三次:5<10为真,x=3*5=15 16 y=(16,x-1)=(16,14) y=14 第四次: 14<10为假, 课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2011年月日 系主任(或责任教师)签名: 2011年月日 DO-WHILE循环语句的翻译程序设计 (LL(1)法、输出三地址表示) 1. 系统描述 1.1 设计目的 通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 1.2 设计内容及步骤 对循环语句: DO〈赋值语句〉WHILE 〈表达式〉 (1)按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。 (2)按给定的题目给出语法分析方法的思想及分析表设计。 (3)按给定的题目给出中间代码序列的结构设计。 (4)完成相应的词法分析、语法分析和语义分析程序设计。 (5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 2. 文法及属性文法的描述 2.1 文法描述 K -> do L while S L -> SP P -> ;SP | ε S -> iQE E -> TG G -> +TG | -TG | εT -> FR R -> *FR | /FR | εF -> (E) | i Q -> = | < | > 2.2 属性文法的描述 第5章流程控制语句 JavaScript程序是由若干个语句组成的,每一个语句以分号作为结束符。语句可以很简单,也可以很复杂。其中,改变程序正常流程的语句称为控制语句。流程控制语句是用来控制程序中各语句执行顺序的语句,是程序中基本却又非常关键的部分。流程控制语句可以把单个语句组合成有意义的、能完成一定功能的小逻辑模块。本章内容包括: ?顺序控制语句; ?选择控制语句; ?循环控制语句; ?其他流程控制语句。 通过本章学习,读者应该对几种流程控制语句有很深的理解,并可以利用这几种流程控制语句编写简单的程序。 5.1 顺序控制语句 JavaScript语言中,顺序控制语句是最简单的语句。其有如下特点:所有语句按照一定的顺序执行,每一条语句只执行一遍,不重复执行,也没有语句不执行。JavaScript语言中的顺序控制语句包括表达式语句,函数调用语句,空语句和复合语句等。 5.1.1 表达式语句 表达式后面跟一个分号就构成了一个表达式语句。最常见的表达式语句为赋值语句。赋值语句是在一个赋值表达式后跟一个分号形成的,程序中很多计算都由赋值语句完成。 【示例5-1】演示几个表达式语句。其代码如下所示。 var m=4; //把4赋给变量m var n=”hello world”; //把字符串hello world赋值给n i=m+n; //把变量m和n的和赋值给变量i 实际上,任何表达式都可以加上分号而成为语句。 【示例5-2】变量i自增1。 i++; //变量i的值加1 注意:有些语句写法虽然是合法的,但是由于其没有保留计算结果,因而并没有实际意义。如以下代码: a-b; i++-1; 课程设计任务书 学生姓名:辛波专业班级:计算机0707班 指导教师:彭德巍工作单位:计算机科学与技术学院 题目: FOR循环语句的翻译程序设计(递归下降法、输出四元式) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码四元式的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 01月 08日 系主任(或责任教师)签名: 2010年 01月 08日 实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表 for循环语句 for循环语句也称为计次循环语句,一般用于循环次数已知的情况。例如,要计算1到100之间所有整数的和,就可以使用for循环语句。具体代码如下: int sum=0; for(int i=1;i<=100;i++){ sum+=i; } System.out.println("1到100之间所有整数的和是: "+sum); 在对for循环语句有一个初步的认识后,下面给出for循环语句的语法格式。for循环语句的语法格式如下: for(初始化语句;循环条件;迭代语句){ 语句序列 } 初始化语句:为循环变量赋初始值的语句,该语句在整个循环语句中只执行一次。 循环条件:决定是否进行循环的表达式,其结果为boolean类型,也就是其结果只能是true或false。 迭代语句:用于改变循环变量的值的语句。 语句序列:也就是循环体,在循环条件的结果为true时,重复执行。 说明: for循环语句执行的过程是:先执行为循环变量赋初始值的语句~然后判断循环条件~如果循环条件的结果为true~则执行一次循环体~否则直接退出循环~最 后执行迭代语句~改变循环变量的值~至此完成一次循环,接下来将进行下一次循环~直到循环条件的结果为false~才结束循环。 for循环语句的执行过程如图1所示。 初始化语句 N循环条件 Yfor(初始化语句;循环条件;迭代语句) 语句序列(循环体) 语句序列(循环体) 执行迭代语句 改变循环变量的值 N-S结构化流程图 传统流程图 图1 for循环语句的执行流程图 注意: 在使用for语句时~一定要保证循环可以正常结束~也就是必须保证循环条件的结果存在为false的情况~否则循环体将无休止的执行下去~从而形成死循环。例如~下面的循环语句就会造成死循环~原因是i永远大于等于1。 for(int i=1;i>=1;i++){ System.out.println(i); } 为了使读者更好的理解for语句,下面将以一个具体的实例介绍for语句的应用。本实例主要实现计算100以内所有奇数的和。具体步骤如下。 (1)选择“开始”/“所有程序”/“附件”/“记事本”命令,打开一个无标题的记事本文档。 程序流程控制语句:选择语句 https://www.360docs.net/doc/f06273308.html,网站制作 2011年9月1日 Java语言中的程序流程控制语句有三种:顺序结构、选择结构和循环结构。其中顺序结构最简单,程序依次执行各条语句。Java的每条语句一般以分号(“;”)作为结束标志。所以本章重点讲解选择结构和循环结构。 1、选择语句 在程序设计时,经常需要使用选择结构在程序中完成逻辑判断和选择功能,这就需要使用到选择语句。Java中的选择语句包括if语句、if-else语句和switch语句。选择语句用来控制选择结构,对选择条件进行判断,并根据判断结果选择要执行的程序语句,改变程序执行流程。 2、if选择语句 在实际生活中,经常会需要做一些逻辑判断,并根据逻辑判断结果做出选择。例如,当一个男孩子向一个非常理智的女孩子求婚时,这个女孩子思考的逻辑可能是这样的: 如果你有100万 那么,我就嫁给你! 在这里,女孩子嫁给男孩子这个过程的实施,必须以“你有一百万”为前提。只有逻辑判断“你有一百万”这一前提条件为真时,“那么,我就嫁给你!”这个行为才能得到执行。在生活当中,类似这样的情形是很常见的。 相应地,在Java程序设计语言中,也有相应的条件语句来完成类似的逻辑判断和有选择地执行这样的功能,这就是if语句。if语句的语法格式如下: if(条件表达式) 语句 或者 if(条件表达式){ 一条或多条语句 } if语句执行的过程如下: 1.对if后面括号里的条件表达式进行判断。 2.如果条件表达式的值为true,就执行表达式后面的语 句或后面大括号里的多条语句。 3.如果条件表达式的值为false,则跳过if语句,执行 下一条语句。 WHILE循环语句的翻译程序设计(简单优先法、输出四元式) 1 需求说明或问题描述 1.1 问题描述 对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。 1.2 需求说明 1 写出符合给定的语法分析方法的文法及属性文法 2 完成题目要求的中间代码四元式的描述 3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计 4 设计若干用例,上机通过测试 2 文法及语法设计 2.1文法及属性文法: 文法G=(V N ,V T ,P ,S) 其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;} P={ S -> w(B){E} E -> C C -> CA C -> A A -> iPA A -> i; P -> +|-|*|/ B -> iTi B-> i T -> >|<|>=|<=|== } 2.2 语法分析方法描述及语法分析表设计 2.2.1 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将【教学】For循环语句
WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)
FOR循环语句的翻译程序设计
IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2
c语言for循环的嵌套题(含解析和答案)
DO-WHILE循环语句的翻译程序设计
JavaScript流程控制语句
for循环语句的翻译
实验1-3 《编译原理》词法分析程序设计方案
for循环语句
程序流程控制语句
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)