编译原理:FOR循环语句的翻译程序设计LL(1)法、输出四元式(附源代码)

编译原理:FOR循环语句的翻译程序设计LL(1)法、输出四元式(附源代码)
编译原理: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);

【教学】For循环语句

【关键字】教学 《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程序的运行方法及程序设计的根底知识,学习了顺序结构和分支结构的程序执行流程和编程。具备一定的算法根底和具有一定的比较、归纳能力。

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)

课程设计任务书 学生姓名:赵旭林专业班级:计算机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日

FOR循环语句的翻译程序设计

目录 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条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2

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++; }

c语言for循环的嵌套题(含解析和答案)

第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循环语句的翻译程序设计

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: 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 属性文法的描述

JavaScript流程控制语句

第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;

for循环语句的翻译

课程设计任务书 学生姓名:辛波专业班级:计算机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 《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

for循环语句

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循环语句的翻译程序设计(简单优先法、输出四元式)

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 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将

文法的产生式保存,设置符号栈S,步骤如下: (1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。 (2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1

WHILE循环语句的翻译程序设计.

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示) 1 系统描述 按照课程设计的要求,写一个能识别while循环语句的文法,通过一定的变换使它符合递归下降法的要求,然后按照这个文法编写一个程序,该程序能识别输入的语句是否符合while语句的文法,或者能不能通过文法的开始符号推导出该语句。 该程序应该包括词法分析器,能对输入的语句进行词法分析,然后再对结果进行语法分析。词法分析器应能识别关键字,标示 符,常量,操作符等。 该程序的语法分析器能对输入的语法进行分析,判断输入语句能否满足while循环语句的文法。通过递归下降的方法对语句进行分析,看能否通过开始符号推导出来。 该程序的语义分析器就是对分析结果进行输出,要求输出结果是 三地址形式的。 2 文法及属性文法的描述 2.1文法描述 语句 > ::= while (< 条件表达式 > (< 赋值语句 > | 语句 > <条件表达式> ::= (<标识符>|<无符号整数>)<条件运算符> (<标识符>|<无符号整数> <标识符> ::= <字母> (<字母>|<数字> <条件运算符> ::= > | < | = <无符号整数> ::= <数字>(<数字>

<赋值语句> ::= <标识符>=(<标识符> | <数字> <算术运算符> (<标识符> | <数字> <算术运算符> ::= + | - | * | / <赋值语句> ::= <标识符>=<标识符> | <数字> 2.2递归文法 while语句文法: S -> while (B S | i=E B -> E relop E relop -> < | = | > E -> E+E | E-E | E*E | E/E | (E | i | n 在编写程序的时候用到的是递归下降法,而递归下降法对文法的要求是不能包含左递归,对上述的文法进行消除左递归之后,得 到如下的递归文法: S -> while (B S | i=E B -> E relop E relop -> < | = | > E -> (E F | iF | nF F -> +EF | -EF | *EF | /EF | ε 2.3属性文法的描述 产生式属性文法 S -> while (B S1S.begin:=newlabel;

流程控制结构

流程控制结构 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

(单元教案首页) 单元标题第3章流程控制结构 教学时数:()学时,其中理论()学时、实验()学时、上机()其它()学时,其它是指: 教学目的与要求: 1.理解程序的的三大控制结构。 2.掌握选择结构实现语句的用法编程应用 3.掌握循环结构实现语句的用法及其编程应用。 4.理解并掌握各种跳转语句的使用方法。 主要教学内容: 1.程序的控制结构:顺序、选择、循环。 2.选择结构语句:if语句(两种格式)和switch语句、程序举例。 3.循环结构语句:for语句、while、语句、do-while语句、三种循环语句的互相转化、程序举例。 4.控制结构跳转语句:break语句、continue语句、return语句 教学重点与难点: 重点:if语句、switch语句、for语句、while语句、do-while语句 难点: switch语句、选择结构编程应用、循环结构编程应用、跳转语句的编程应用课后作业: 1.课本P66 综合练习三:第一题~第四题 2.上机实习:实习3:Java流程控制 课后体会:

兰州资源环境职业技术学院教师授课教案

—————————————————————— 第3章流程控制结构 一、本章主要内容: 本章主要讲述Java程序的基本控制结构和控制语句,使得学生能利用这三种结构来解决一些比较复杂的问题。 Java程序的基本控制结构有三种:顺序结构、选择结构、循环结构。 二、具体授课内容: 概述 选择结构 循环结构 跳转语句 三、本章授课思路: 1. 回顾C语言中结构化程序设计方法所所用的程序三大控制结构(顺序结构、选择结构、循环结构)语法知识,以复习回顾的方式引入讲解Java语言的程序控制结构知识(和 C语言用法一致),学生易于理解记忆。 2.具体讲解选择结构(if、switch)和循环结构语法(while、for、do-while)及其编程用法的典型程序编写举例,使学生理解掌握Java语言中控制结构的使用特点及编程技巧。 将两种输入数据的编程方法融入到控制结构用法的编程举例的程序中,使学生对输入数据方法的能够有一定的理解掌握和编程使用,结合在后续第4章面向对象的程序设计的方法的具体学习中再加强理解和掌握。 4.课堂上通过练习和讲解第3章课后习题,加强和巩固学生对所学知识的理解和掌握使用。

WHILE循环语句的翻译程序设计课设报告

1.题目:将WHILE语句转换成四元式的程序实现 设计内容及要求:设计一个语法制导翻译器,将WHILE语句翻译成四元式。要求:先确定一个定义WHILE语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的WHILE语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。 1、系统描述 通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法 及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。用语法 制导完成语义分析,并将形成的中间代码以四元式的形式输出。 2 、文法及属性文法的描述 。 2.1 文法的描述 该文法的产生式如下所示: (1)S->while(B){E} (2)E->AE (3)E->A (4)A->iPA (5)A->i (6)B->iTi & (7)B->i 其中while、( 、) 、{ 、} 、P、T 、;和i均为终结符,而S、A、B、E这些大写字母均为非终结符。T表示比较运算符,P表示算术运算符,i表示合法标识符。 2.2 属性文法的描述 对该文法的属性文法描述如下: (1) S->while(B){E} prinf(if B goto E else goto next) (2) E->AE print = · (3) E->A print =

(4) A->i P A print(A= P (5) A->i; = i; (6) B->i T i print(B = T (7) B->i = i 3 、语法分析方法描述及语法分析表设计 | 3.1 语法分析表设计 3.1.1 文法的DFA

程序设计语言编译原理第3课后答案

第二章 P36-6 (1) L G ()1是0~9组成的数字串 (2) 最左推导: N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ??????????????????0010120127334 556568 最右推导: N ND N ND N ND N D N ND N D N ND N ND N D ??????????????????77272712712701274434 886868568 P36-7 G(S) O N O D N S O AO A AD N →→→→→1357924680||||||||||| P36-8 文法: E T E T E T T F T F T F F E i →+-→→|||*|/()| 最左推导: E E T T T F T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ?+?+?+?+?+?+?+?+??????+?+?+?+?+?+********()*()*()*()*()*()*() 最右推导: E E T E T F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ?+?+?+?+?+?+?+?+?????+?+?+?+?+?+?+**********()*()*()*()*()*()*()*() 语法树:/********************************

第六课for循环语句

第六课for循环语句 在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所介绍的循环结构程序设计。在Pascal语言中,循环结构程序通常由三种的循环语句来实现。它们分别为FOR循环、当循环和直到循环。通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。因此,重复语句是由循环体及重复终止条件两部分组成。 一、for语句的一般格式 for <控制变量>:=<表达式1> to <表达式2> do <语句>; for <控制变量>:=<表达式1> downto <表达式2> do <语句>; 其中for、to、downto和do是Pascal保留字。表达式1 与表达式2的值也称为初值和终值。 二、For语句执行过程 ①先将初值赋给左边的变量(称为循环控制变量); ②判断循环控制变量的值是否已"超过"终值,如已超过,则跳到步骤⑥; ③如果末超过终值,则执行do后面的那个语句(称为循环体); ④循环变量递增(对to)或递减(对downt o)1; ⑤返回步骤②; ⑥循环结束,执行for循环下面的一个语句。 三、说明 ①循环控制变量必须是顺序类型。例如,可以是整型、字符型等,但不能为实型。 ②循环控制变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。 ③所谓循环控制变量的值"超过"终值,对递增型循环,"超过"指大于,对递减型循环,"超过"指小于。 ④循环体可以是一个基本语句,也可以是一个复合语句。 ⑤循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。建议不要在循环体中随意修改控制变量的值。 ⑥for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。 四、应用举例

编译原理报告for循环语句的翻译程序

学号: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日

编译原理课程设计 C语言编译器的实现

编译原理课程设计报告 设计题目编译代码生成器设计 学生姓名 班级 学号 指导老师 成绩

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、写出完整的算法框架。 4、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块 主程序 词法分析程序语法分析 程序 中间代码 生成程序

2. 表2.1 各种单词符号对应的种别码 单词符号种别码单词符号种别码bgin 1 :17 If 2 := 18 Then 3 < 20 wile 4 <> 21 do 5 <= 22 end 6 > 23 lettet(letter|digit)* 10 >= 24 dight dight* 11 = 25 + 13 ;26 —14 ( 27 * 15 ) 28 / 16 # 0 详细设计: 4.1界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 图一

For循环语句

五、For循环语句 有时候需要处理的是反复进行的工作,这时候使用循环语句是很好的方法,下面我们通过一个练习来学习; 2、输入程序代码 1)输入下列代码,单引号后面是注释,双引号后面是分号; cls'xun huan for i= 1 to 10 print i; next print for i= 1 to 10 s= s+ i next print " s="; s end 2)for循环包括三行,第一行是循环条件,i=1 to 10表示从1到10,这样就会循环10次; 中间一行是执行的语句,每循环一次,就执行一下这一句, 第三行next表示继续,这时候i会自动加1,然后回到第一行去判断是否超过了循环条件; 3)第二个循环中的s=s+i是累加运算,就像盖楼房一样,一层一层往上加,这样s就会存上每次相加的和; 以 xunhuan 为文件名,保存一下文件,按F5运行一下程序,看一下程序运行的结果,如果有错误,就检查一下是否是拼写和标点错误;

六、Do循环 我们继续来看另一中循环,它跟前面的For循环区别在于,For循环一般知道循环次数,在第一行里头就指明了,而Do循环一般不知道循环次数,下面我们通过一个练习来学习; 2、输入程序代码 1)输入下列代码,单引号后面是注释,双引号后面是分号; cls'do xun huan do input "chengji"; chj s= s+ chj loop while chj> 0 print "zongfen="; s end 2)input是输入一个成绩,然后把成绩加起来,放到变量s当中 在loop一行里头,检查一下chj的大小,如果大于0,就继续循环,等于0或小于0,就退出循环;

相关文档
最新文档