目录
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、while、begin…;标识符:常量名、变量名…;常数:34、56.78、true、‘a’、…;运算符:+、-、*、/、〈、and、or、….、;界限符:,;(){ } /*…。
②语法分析:语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。此次设计中语法分析中主要通过LR分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。
③中间代码生成:为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。常用的几种中间语言有: 逆波兰式、四元式、三元式、树表示。本课程设计主要实现四元式的生成。
1.4初始条件:
理论:掌握一种计算机高级语言的使用。学完编译课程,掌握词法分析程序设计方法,LR语法分析方法,以及语法制导的翻译和中间代码生成技术。实践工具和环境:计算机实验室提供计算机及软件环境。
1.5 开发平台
所使用的系统:Windows XP
程序开发工具:Visual C++ 6.0
程序设计语言:C++。
。
2文法及属性文法的描述
按照设计要求,设计出的For语句的符合简单优先定义的文法规则及相关的语义规则如下:
产生式语义规则
S→ f ( E ; F ; G ){ H ;} goto
S→ f ( E ; X ; Y ){ H ;} goto
E→ id = c id.value=c.value;
F→id < c If id.value>=c.value goto over ; G→ id + + id.value=id.value+1 ;
X→ id > c If id.value<=c.value goto over ;
Y→ id ––id.value=id.value-1;
H→id 1 = id 2 + id 3id 1.value= id 2 .value + id 3.value
H→ id 1 = id 2 + c id 1.value= id 2 .value + c.value
H→ id 1 = c+ id 2id 1 .value= c.value + id 2 .value
其中产生式规则中的符号: c 表示常数const ,f表示关键字for ,i表示一般标识符id
3语法分析表设计
3.1 LR分析概述
一个LR分析器由3个部分组成:
⑴总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。
⑵分析表或分析函数。不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表也不同,分析表又可分为动作(ACTION)表和状态转换(GOTO)表两个部分,他们都可用二维数组表示。
⑶分析栈,包括文法符号栈和相应的状态栈。它们均是先进后出栈。
分析器的动作由栈顶状态和相应的状态栈所决定(LR(0)分析器不需向前查看输入符号)。
LR分析器工作过程示意图如下图所示:
其中SP为栈指针,S[i]为状态栈,X[i]为文法符号栈。状态转换表内容按关系GOTO[Si,X]=Sj确定,该关系式是指当栈顶状态为Si遇到当前文法符号为X时应转向状态Sj。X为终结符或非终结符。
ACTION[Si,a]规定了栈顶状态为Si时遇到输入符号a应执行的动作。动作有4种可能:
⑴移进:
档Sj=GOTO[Si,a]成立,则把Sj移入到状态栈,把a移入到文法符号栈。其中i,j表示状态号。
⑵归约:
档在栈顶形成句柄为β时,则用β归约为相应的非终结符A,即当文法中有A→β的产生式,而β的长度为r(即|β|=r),则从状态栈和文法符号栈中自栈顶向下去掉r个符号,即栈指针SP减去r。并把A一如文法符号栈内,再把满足Sj=GOTO[Si,A]的状态移进状态栈,其中Si为修改指针后的栈顶状态。
⑶接受acc:
当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是‘#’,则为分析成功。
⑷报错:
当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该文法能接受的句子
3.2 LR(0)分析表
根据上述文法构造的有穷自动机和根据有穷自动机构造的LR(0)分析表
①有穷自动机:
②LR(0)分析表:
其中,S表示移进且下一状态为S的下标;R表示归约,归约所用的产生式为R的下标相对应的产生式;空白表示没有相应的关系即出错。
3.3 LR语法分析过程的设计思想及算法
3.4 翻译方法
设计中,使用语法制导翻译方法。所谓语法制导的翻译方法是指:按照给定的语法,对单词符号串进行语法分析,并构造出语法分析树,语法分析过程中根据需要构造属性依赖图,然后遍历语法树并在语法树的各个节点处,按语义规则进行计算,并生成中间代码。
所谓属性依赖图是一个有向图,用于描述分析树中的属性和属性间的相互依赖关系。
4中间代码形式的描述及中间代码序列的结构设计本次设计,使用的中间代码为四元式(即三地址码)。四元式的四个组成成分:算符op,第一和第二运算对象ARG1和ARG2,及运算结果RESULT。
例如对语句:
for(i=0;i<10;i++)
{
emp=temp+i;
}
等价的四元式表示如下:
(1)(=,0,—,i)
(2)if i>=10 goto over
(3)(+,temp,i,t)
(4)(=,t,—,temp)
(5)(+,i,1,i)
(6)goto (2)
(7)over
设计并生成的结果程序,最终需要将用户输入的程序经过词法分析和语法分析,生成如上所述的四元式表示的中间代码形式。
5简要的分析与概要设计
程序由词法分析和语法分析两部分构成:
词法分析程序,以用户输入的字符串为输入,判断输入是否包含非法字符,若字符完全合法,分析结果是,将标识符、常量、其他合法单词的类别和值保存在输入流中,做为语法分析的输入。为了有效地编写词法分析程序,首先应构造出程序流程图,然后根据流程图编写程序。
语法分析,以词法分析结果作为输入,验证,输入流中各种符号是否符合语法规则。若不符合,显示出错信息,否则,在分析过后显示与输入程序等价的中间代码。同样需要构造语法分析的程序流程图。
6详细的算法描述
程序包括三个文件:词法分析.cpp和for循环翻译.cpp。其中for循环语句翻译.cpp中含有main函数,作为程序的入口,在main函数中接受用户输入的程序流,并保存在一个string对象中,然后调用词法分析.cpp中的void getSym(string &s,int &i)对程序流进行词法分析分离出单词符号,再调用语法分析.cpp文件中的void gramCheck()函数对单词符号输入流进行语法分析和语义分析,并生成四元式形式的中间代码。
函数void getSym(string &s,int &i)调用getchar函数获得输入流中的符号进行分析,如得到的是标识符,则调用outsym函数分别普通标识符和关键字。
函数gramCheck()调用函数priCmp比较符号栈和输入流中的两个符号的优先级关系。
程序中的函数调用关系如,图1:
图1 for循环语句翻译程序函数调用关系图
6.1 main函数
Main()函数主要代码和相关解释如下:
int main()
{
Int r;
string s; //用于保存输入程序的字符串
cout<<"输入for循环语句:"< getline(cin,s); //接受用户输入并保存在s中 getSym(s,i); //调用词法分析程序 r=nodeSize; for(i=0;i { st[i]=node[i].type; //将此法分析的结果保存到数组中 } 语法分析; 中间代码生成; } 6.2词法分析 在文件“词法分析.cpp”中编写词法分析程序,文件中主要包含一个结构体struct symNode,一个结构体数组symNode node[100],取字符函数void getChar(string &s,int &i){ch=s[i];i++;},取单词函数void getSym(string &s,int &i), 程序中数据结构和各函数具体功能如下: (1)定义结构体: struct symNode { int type; string sValue; int eValue; }; 此结构体用来保存词法分析后,各种单词的信息。Type表示单词的类别,各符号对应的类别值见表1,如果单词是常量,eValue 则保存该常量的值,如果单词是标识符,sValue则保存该标识符的值。 (2)数组symNode node[100],用来保存单词输入流作为语法分析的输入流; int position=0; position保存数组node中将要输入的单词的位置,初值为0。 (3)函数void getSym(string &s,int &i);用来作词法分析,s存储用户的输入程序,i 用来保存当前应该取字符的位置。 (4)函数 void getChar(string &s,int &i) {ch=s[i];i++;} 用来取字符串s 中第i个字符。 (5)函数void outSym(string s); 区分s是关键字还是普通标识符。 词法分析程序的具体算法描述:getChar()函数从串s里面取字符,直到遇到非空字符,如果已到达串尾,词法分析结束。getSym()判断所取的字符是字母开头,还是以数字开头,还是其他合法字符;如果以字母开头,则开始保存为标识符,继续取字符直到遇到非字母非数字字符;如果以数字开头则保存为整数常量,继续取字符直到遇到非数字字符;其他字符则保存为相应类别。所有的单词分离后保存到数组symNode node[100]中。 词法分析程序所输出的单词符号常常采用以下二元式表示:(单词种别,单词自身的值)。单词的种别是语法分析需要的信息,而单词自身的值则是编译 其他阶段所需要的信息。 词法分析的流程图,如图2: 图2词法分析流程图 6.3 语法分析 在文件“for循环翻译.cpp”中编写语法分析程序。程序中各函数具体功能解释如下: int Initstack(stack &s):初始化栈; int push(stack &s,char e) :将要入栈的元素压入栈中; char pop(stack &s,char *e) :将要出栈的元素弹出栈; int action(int m,int n,char a) :对照LR分析表,判断输入的字符需要移进还是归约; int go(int m,int n,char a) :对照LR分析表,判断需要归约的字符串所对应的产生式; 在main函数中利用switch()语句来实现归约。 7 测试方法和测试结果 7.1测试过程 针对所设计的关于 for循环语句的翻译程序,分别用正确的程序和有错误的程序进行测试,测试出结果程序的可用性和健壮性。测试中分别使用了两个合法程序和两个非法程序,对结果程序进行测试,具体的测试程序、测试过程和测试结果如下: ①for循环语句语法分析过程: 合法程序1: for(i=0;i<10;i++){ m=m+i;} 合法程序2: for(j=1000;j >100;j --){t=t+j;} 非法程序: for(i=0;i<20){ m=m+i;} 7.2 测试结论 经过测试,可以得知,结果程序能达到预计的要求:对合法程序进行词法分析和简单优先的语法分析,并生成四元式表示的中间代码;对于错误的程序输入,结果程序能够判断其出错。] 存在问题:对于错误的程序输入,结果程序不能给出错误的位置。对于含有非法输入符号的程序,结果程序没有很好地处理,程序健壮性不强。 8 研制报告 8.1研制过程 在课程设计期间,通过阅读大量相关书籍,利用网络查找各种资料,根据相关知识,写出了符合简单优先语法规则的关于for语句的属性文法。 获得语法规则的属性文法后,对程序进行了概要设计,将程序大致分为词法分析和语法分析两个模块,并且设计出文法对应的符号优先关系表。词法分析负责对输入串进行单词识别,并保存单词各信息,作为语法分析和翻译的输入。语法分析负责对输入流中的单词进行分析,检验是否符合所写的语法规则,并对其进行初步翻译。 概要设计后,对两个模块分别进行了详细设计,并利用词法分析流程图和语法分析流程图,设计程序的大致流程,并具体到各函数的设计。 通过对程序进行了详细设计,得到了程序大致流程,并根据流程进行编码, 编码过程中,出现了一些语法和语义上错误,通过调试和修改,使得程序成功运行。 设计测试方法和测试用程序,并对程序进行了测试。 8.2本设计的评价 此次设计对for语句进行了全面词法分析和语法分析,并得到了用于分析for 语句的结果程序。结果程序能对用户输入的程序代码进行分析,判断是否存在词法错误和语法错误,如果出现错误,向用户给出提示,如果没有错误,则生成于输入程序等价的中间代码,方便后续编译过程工作。 但是结果程序也存在很多不足:对于非法的输入,无法给出错误的位置。对非法输入考虑不全面,对某些非法输入无法给出错误信息,另外属性文法不完善,程序中的使用的某些判断方法,只适合于本次设计使用的文法,实用性不强。 8.3个人心得体会 本课程设计是for循环语句的翻译程序,包括词法分析部分、语法分析部分和中间代码生成部分。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。语法分析部分采用LR分析方法进行语法分析,判断给出的符号串是否为该文法识别的句子。中间代码生成器部分主要实现四元式的生成,将用中缀式表示的算术表达式转换为用四元式表示的算术表达式。 在整个编译器设计过程中,遇到了很多意想不到的困难,其主要原因是对各个部分要实现的功能考虑不够周全,典型的如在词法分析的设计中,当前待分析字符串为“a>+”,当前字符为’>’,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢?又比如,‘+’分析为正号还是加法符号,以及对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。这些在程序设计初期实现都比较困难,经过努力,在后期这些问题都得到了比较有效的解决。 在语法分析的设计过程中,程序相当复杂,需要利用到大量的编译原理,其中在分析表的构造时遇到了非常大的困难,对输入字符串的移进和归约冲突 得不到很好的处理,造成了调试的困难。通过多次调试,最终构造出来分析表并调试成功。 通过本次课程设计,将编译的理论知识应用于实践,加深了对课本理论知识的理解,更好的掌握了编译技术的基本方法,了解了编译程序的一般分析过程,并且通过对for语句编译程序的设计和实现,对for语句也加深了认识和理解。另外,编译程序的实现方法也适合于一般程序的编写,因此,此次课程设计对自己的编程能力的提升有很大帮助。 9 参考文献 [1]张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第二版).清华大学出版社.2005年2月 [2]何炎祥.编译原理(第二版).武汉:华中科技大学出版社.2005年8月[3]陈火旺等.程序设计语言编译原理(第3版).国防工业出版社.2003年2月 [4]胡伦骏.编译原理(第2版).电子工业出版社.2005年2月 [5]陈意云.编译原理与技术(第二版).中国科学技术大学出版社.2002年1月 [6]胡元义等.编译原理实践教程.西安电子科技大学出版社.2002年1月[7]王雷等.编译原理课程设计.机械工业出版社.2005年3月 本科生课程设计成绩评定表 班级:计算机0908班姓名:叶敏学号:0120910340833 及格(60-69分)、60分以下为不及格 指导教师签名: 201 年月日 【关键字】教学 《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程序的运行方法及程序设计的根底知识,学习了顺序结构和分支结构的程序执行流程和编程。具备一定的算法根底和具有一定的比较、归纳能力。 目录 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翻译过程 第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为假, 课程设计任务书 学生姓名:辛波专业班级:计算机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循环结构程序设计教案 课程名称:C语言程序设计 本课内容:循环结构程序设计——for 语句 一、教学目标 1、领会程序设计中构成循环的方法 2 、掌握for 语句的用法 二、教学重点 1、for 语句的一般格式 2、for语句的执行过程 三、教学难点 for 语句的综合利用 四、教学方法 1、课堂讲授,给出主要内容。 2、讲解其基本格式。 3、应用示例,结合相应的知识讲解。 4、执行过程用流程图和例题用(演示法和讲解法)进行详细说明。 五、教学过程 (一)导入 1、复习前两节课我们学习的两种循环语句——while语句和do~while 语句的基本格式和执行过程和特征。 2、给出例子如下: main( ) {int x=1; (表达式1) s=0; while(x<=100) (表达式2) {s=s+x; x=x+1; (表达式3) } printf(“%d”,s); } 分析用while语句来完成的程序,主要完成1到100的累加和,对一个循环程序来说最关键的三个部分:循环变量的赋初值、控制循环条件、循环控制变量的更新。 (二)教学过程 1、写出本节课要介绍的for语句的一般格式 for(表达式1;表达式2;表达式3) 循环体; 2、掌握:基本格式和各个表达式的功能和特征 强调:for语句中的所有表达式和while语句中的表达式所完成的功能是相同的。 表达式1:循环变量的初始化(初始值) 表达式2:循环条件(终止值) 表达式3:循环变量自增 3、for语句的执行过程 for ( int i = 0 ; i < 10 ; i++) { printf("我最棒"); } 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循环语句的翻译程序设计(简单优先法、输出四元式) 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循环语句
FOR循环语句的翻译程序设计
c语言for循环的嵌套题(含解析和答案)
for循环语句的翻译
C语言for循环语句教案
for循环语句
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)