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;
S.next:=newlabel;
B.true:=newlabel;
B.false:=S.next;
S1.next:=S.begin;
S.code:=gen(S.begin, ‘:’ || B.code
||gen(S.true, ‘:’ ||
S1.code || gen(‘goto’,S.begin ||
gen(B.false, ‘:’
|| gen(‘goto Lnext’;
B -> E1 relop E2 B.place:=newlabel;
B.code:=E1.code || relop.code ||E2.code ||
gen(B.place ‘:=’ , E1.place , r elop.
place , E2.place;
relop -> < | =
relop.place:=newlabel;
| >
relop.code:=gen(‘<’||gen(‘=’||gen(‘>
’;
E -> (E1
F E.place:=newlabel;
E.code:=E1.code ||
F.code ||
gen(E.place ‘:=’ ,‘(’, E1.place , ‘’, F.place;
E -> i
F E.palce:=newlabel;
E.code:=i.code ||
F.code ||
gen(E.palce ‘:=’ ,i.place , F.place;
E -> n
F E.place:=newlabel;
E.code:=n.code ||
F.code ||
gen(E.place ‘:=’ , n.place , F.place;
F -> +EF1 F.place:=newlabel;
F.code:=E.code || F1.code ||
gen(F.place‘:= + ’, E.place , F1.place;
F -> -EF1 F.place:=newlabel;
F.code:=E.code || F1.code ||
gen(F.place‘:= - ’, E.place , F1.place;
F -> *EF1 F.place:=newlabel;
F.code:=E.code || F1.code ||
gen(F.place‘:= * ’, E.place , F1.place;
F -> /EF1 F.place:=newlabel;
F.code:=E.code || F1.code ||
gen(F.place‘:= / ’, E.place , F1.place;
F -> ε F.place:=newlabel;
F.code:=gen(F.code‘:= ε’;
图1 属性文法
3 语法分析方法描述
按照递归下降分析技术,递归下降识别程序是由一组子程序组成,每个子程序对应于一个非终结符号。该子程序处理相应句型中相对于此非终结符号的产生式。在定义文法时,是递归定义的,所以这些子程序也是递归的。当一个子程序调用另一个子程序时,总是先执行被调用的子程序,然后再执行后继的程序。
在本程序中,首先要做的就是将设计的文法根据递归下降分析技术对文法的要求改为非左递归的文法。程序中5个子程序,其中S 是开始符号,也是递归下降分析的入口,通过调用int Getsymbol(对输入的字符串进行单词分析,并返回当前所分析到的单词,然后在递归语法分析中根据这个单词分析下一步要执行的子程序。
4 中间代码形式的描述
4.1三地址代码
在本程序中用到了三地址语句的输出包括以下的种类:
赋值语句:x:= y op z
复制语句:x:= y
条件转移语句:if x relop y goto L
例如,本程序中语句while (B S ,可以输出三地址代码为:if B goto L else goto Lnext;
而E -> (EF可以输出三地址代码为:E1:= (E2 F。
4.2本程序中的三地址代码
L0:=if (B goto L1 else goto Lnext S -> while (B
S
S -> i=E L:= i=E
B -> E relop
B:= E1 relop E2
E
relop -> < relop:= <
relop -> = relop:= =
relop -> > relop:= >
E -> (E
F E1:= (E2 F
E -> i
F E:= I F
E -> n
F E:= n F
F -> +EF F1:= +E F2
F -> -EF F1:= -E F2
F -> *EF F1:= *E F2
F -> /EF F1:= /E F2
F ->εF:= ε
图2 三地址代码
5 概要设计
5.1简要分析
递归下降分析技术就是通过对每个非终结符编写一个子程序来实现它的操作,然后通过递归的调用来实现对输入字符串的分析,这其中还包括对输入字符串的词法分析。在词法分析的时,得到的字符单词要和关键字比较,看是否是关键字,根据比较结果进行返回相应的单词类型。单词类型主要包括变量,关键字,常量,各种符号等,每种符号都是一种类型。在语法分析程序中,根据词法得到的结果,进行判断是否是当前需要的单词类型,如果不是就说明输入字符串不能由该文法推导出来;如果是当前需要的类型,就相应得做该单词类型分支程序。
根据文法可以得到这个递归下降程序可以分析包含有while嵌套的语句,在文法的开始符号S中就嵌套了S 本身,因此这个文法的递归中就要考虑到while的自身嵌套。在递归子程序中,在嵌套调用其他子程序时都是有一定条件的,当满足这个条件的时候该程序可以按照满足的条件执行下去,当没有满足程序中的条件时就会报错。
5.2程序的概要设计
在本程序中,Getsymbol(子程序就是对当前输入的字符串进行词法分析,包括对变量,常量,关键字,各种符号的分析。主程序main(主要就是进行各种变量的初始化,调用递归分析程序的入口子程序。子程序间的嵌套关系如下:
void main(
{ S(; }
void Getsymbol({ … }
void ERROR({ … }
void S(
{ re=Getsymbol(;
if(re==‘while’(关键字 { B(; S(;}
else(re==i(变量
{re=Getsymbol(;
if(re== = E(;} }
void B(
{ E(; relop(; E(;}
void E(
{ re=Getsymbol(;
if(re== (
{ E(;re=Getsymbol(;if(re== F(;}
else if(re==i F(;
else if(re==n F(;}
void F(
{ re=Getsymbol(;
if(re==+{ E(; F(;}
else if(re==-{ E(; F(;}
else if(re==*{ E(; F(;}
else if(re==/{ E(; F(;}}
6 详细的算法描述(流程图或伪代码)
关闭文件
6.1main(主函数的算法描述
图3 mian(流程图
主程序执行时首先会测试input.txt文件是否存在,因为程序就是通过该文件得到需要进行递归下降分析方法分析的输入符号串;然后建立output.txt文件,问以后的输出结果做基础;接着调用递归下降分析法的入口程序S(来开始对文件中的输入字符串进行词法,语法和语义分析;最后关闭文件结束程序。
6.2Getsymbol(子程序的算法描述
Int Getsymbol(
{sym=fgetc(intput; //取当前文件指针指向的字符
While(sym不为空
{if(sym是a-z的字符
{将该字符保存在token1数组中;
继续取下一个是a-z的字符保存在数组中;
当sym不是字符时,则判断该数组中的符号串是不是关键字,是就返回16
(while的机内码);不是就返回13(变量的机内码);
}
Else if(sym是0-9之间的数字)
{将该数字保存在token2数组中;
继续取下一为0-9的数字,并保存到数组中去;
当sym不是数字是,就返回12(常数的机内码);
}
Else if(sym是+)
返回4;
Else if(sym是-)
返回3;
Else if(sym是*)
返回2;
Else if(sym是/)
返回1;
Else if(sym是<)
返回11;
Else if(sym是=)
返回10;
Else if(sym是>)
返回9;
Else if(sym是;)
返回20;
}
该程序就是对输入串进行分析,分析到不同的数据类型就相应返回它的机内码,这样方便在语法分析中进行分析。本程序还保存了变量和常量在结构数组中,方便在语义分析的时候使用。
6.3 S(子程序的算法描述
void S(
{re=Getsymbol(; //取下一个字符的机内码
if(re==关键字 //执行S->while (B S
{re=Getsymbol(; //取下一个字符的机内码
If(re==左括号
{调用B(;
re=Getsymbol(; //取下一个字符的机内码
if(re==右括号
调用S(;
}}
Else if(re==变量 //执行S->i = E
{ re=Getsymbol(; //取下一个字符的机内码
If(re==等号
调用E(;}
Else
ERROR(;
}
该程序就是对通过Getsymbol(词法分析程序得到的单词,进行不同的程序语句执行。当得到了while是就分析下一个是不是(,是的话就调用B(;否则就出错。取下一个单词,是就调用S(;否则也出错。当得到的是变量i时,去下一个单词,如果是=就调用E(。
6.4 B(和relop(子程序的算法描述
在B(子程序中,不用判断任何的单词,就依次调用E(,relop(,E(,执行B->E relop E
Void relop(
{ re=Getsymbol(; //取下一个字符的机内码
If(sym==大于号; //执行relop-><
Else if(sym==等于号;//执行relop->=
Else if(syn==小于号; //执行relop->>
Else
ERROR(;
}
在relop程序中就主要上判断当前取得的单词是不是条件运算符。
6.5 E(子程序的算法描述
Void E(
{ re=Getsymbol(; //取下一个字符的机内码
if(re==左括号 //执行E->(EF
{ E(;
re=Getsymbol(; //取下一个字符的机内码
if(re==右括号
F(;
}
Else if(re==变量 //执行E->iF
F(;
Else if(re==常量 //执行E->nF
F(;
}
6.6 F(子程序算法描述
Void F(
{ re=Getsymbol(; //取下一个字符的机内码If(re==加号 //执行F->+EF
{ E(; F(;}
Else if(re==减号 //执行F->-EF
{ E(; F(;}
Else if(re==乘号 //执行F->*EF
{ E(; F(;}
Else if(re==除号 //执行F->/EF
{ E(; F(;}
}
这个子程序和E(合起来就是一个完整的可递归的算术操作运算,但由于递归下降分析方法不能含有左递归文法,所以消去左递归后就成了两个子程序。
7 软件的测试方法和测试结果
由于该程序是用递归下降分析法来编写的,根据文法可以知道它可以对while 语句进行嵌套,条件判断,赋值语句等的语句进行分析。而且赋值语句也可以嵌套。根据这些,我们在选择测试用例的时候就要选择比较典型的,尽量找到文法中有但程序中没能很好实现的地方。下面就用到了几个典型的用例:
输入字符串:while (n<10 a=(b+c*d;
测试分析:这个输入字符串是正确的,是最简单的while 语句
测试结果:
图4 输出结果
输入字符串:whil (n<10 a=b+c;
测试分析:该字符串不符合本程序的文法,其中是while出错测试结果:
图5 输出结果
输入字符串:while (tomn<10 while (tomm<10
toma=(tomb+c23*d45;
测试分析:该字符串符合文法,它嵌套了while语句,而且变量名包含数字和字符
测试结果:
图6 测试结果
输入字符串:while (tomn<10 whil (tomm>10
toma=tomb+c23;
测试分析:在嵌套的语句中,第二个while书写错误
测试结果:
图7 测试结果
8 研制报告
这次的课程设计要求比较严格,但是题目给得比较早,我在做第一个课程设计的时候就开始了该次课程设计的分析工作。对递归下降分析方法的了解,递归分析方法的实现原理,三地址输出等都做了详细的了解。并且在编程之前就已经将程序的概要设计都做出来了,所以在编写程序的时候相对比较容易。词法分析,语法分析都是很容易的,只要你理解了分析方法的实现原理,编写程序判断输入字符串是否满足给定的文法是比较简
单的。比较麻烦的就是语义分析输出三地址代码,由于在递归下降分析技术中,是推导出输入字符串的,所以对变量的使用要保存好以待下次使用。例如E -> (E F 中,等E(执行完了才能执行F(,但是在执行E(的时候就已经嵌套的执行了好多次的F(,所以等回到这个产生式在执行F(时,就很容易和前面E(中调用的F(混淆。
在这个程序的输出三地址中,详细的描述了当输入字符串符合该文法时,是怎么样都开始符号推导出来的。当输入的字符串不满足该文法时,就相应的可以在输出结果中看到是在哪一步推倒时出现了错误。在该程序中实现了赋值语句中算术运算的嵌套,可以进行多步的算术运算。
本程序的不足之处就是对条件语句的判断不够详细,只进行了三个简单的条件判断,而条件的增加就可以修改文法,再在程序中添加相应的代码即可。由于递归下降分析方法完全是按照文法而写的,所以对文法的添加后,对程序做相应的添加就可以了。
对于以后的课程设计,我觉得不应该有这么多的相似之处,一半的都是程序是一样的,只是输出不一样,有些同学也做得很简单,那的确是没有错的,因为在任务书中没有明确说明要做哪些内容。所以在实现的功能上有一些区别,在文法的构造上也有区别,有的是太简单,但有的的确是太复杂了,把什么都考虑到了,到最后程序的确太庞大而编写不出来了。最后还是得感谢老师和同学在课程设计中对我的帮助。
9 参考文献
[1]陈火旺,刘春林等著,编译原理,北京:国防工业出版社,2002.6
[2]钱能著,C++程序设计教程,北京:清华大学出版社,2002.7
[3]张幸儿,计算机编译原理—编译程序构造实践:科学出版社,2005.7
【教学】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程序的运行方法及程序设计的根底知识,学习了顺序结构和分支结构的程序执行流程和编程。具备一定的算法根底和具有一定的比较、归纳能力。
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翻译过程
while循环
while 循环 语法形式: while(条件) { 需要循环执行的语句; } while 是“当”的意思。 请首先和if语句作一个比较: if(条件) { 条件成立时执行的语句; } 二者除了关键字不一样以外,结构完全一样。但一定要注意,在条件成立时,if语句仅仅执行一遍,而while语句则将反复执行,直到条件不再成立。 请看while循环的流程图: 程序从“前面的语句”开始执行,然后进行条件判断,如果条件成立,则执行一次“每次循环执行 的语句”,再后请特别注意红色部分,这是我们碰上的,第一次会往后走流程:红线就像汽车拐弯, 掉头到条件处(并不包括前面的语句),然后再进行下一次的条件判断……直到某一次判断时条件不 成立了,程序“继续后面的语句”。
我们用while的语法套用生活中的实际例子,可以直观地看出while的用法。 假设有一个爱哭的小娃娃,有一天她要求父母给买一条小红裙,可惜父母不同意,于是她就开始一个循环: while ( 父母不给买小红裙) { 我哭; } 这段“代码”的意思是:当“父母不给买小红裙”,那么,小女孩就一遍一遍地哭。 这就是我们和循环流程的第一个遭遇战。所举的例子看似直观:“小孩一遍遍地哭,直到父母给买裙”,但真正要用程序的语言来正确地表达出来,需要很多方面要考虑到,必竟,程序是严谨的。 首先,一个合适的判断是否继续的条件相当重要。小女孩要继续哭,仅仅“父母不给买小红裙”,这显示不符合事实,想想我们小时候,再会哭,最终也有累的时候,所以,要想继续哭,我们的条件有两个:“父母不给买小红裙”并且“我还没有哭累”。 while ( 父母不给买小红裙&& 我还没有哭累) { 我哭; } 其次,大多数情况下,条件需要被恰当地改变。小女孩在不停地哭,那么她如何知道父母是否买了红裙呢?所以,她不能只顾哭,还得在哭的间隙观察大人是否同意买裙。至于是否哭累,我们假设小女孩有一个疲劳度,每哭一次疲劳度加1,当疲劳度到达200时,可怜的小女孩累了…… while(父母不给买小红裙&& 疲劳度< 200) { 我哭; 我偷看爸妈是否同意买裙; 疲劳度++; } 例一:用while 语句实现求从1到100的累加和。 求1+2的和,我们可以写a = 1 + 2;求1加到100,我们当然可以这样写a = 1 + 2 + 3 + ... 100.不过这样写显然太累人了,要从1写到100啊!所以聪明如高斯的你,当然也知道这样写:a = (1+100) * 50;这确实是个在任何时候都值得称赞的,又快又简的方法,只是今天我们想让计算机累一点,老老实实地从1加到100。首先用我们先学的while式的循环。 请同学们打开CB,然后新建一空白的控制台程序,在main()函数体加入下面黑体部分代码。然后按F9运行。查看运行结果以加深印象。 //--------------------------------------------------------------------------- #include
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为假,
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日
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)选择“开始”/“所有程序”/“附件”/“记事本”命令,打开一个无标题的记事本文档。
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 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将