编译原理课程设计-For语句的翻译程序设计(简单优 先法、输出三地址码)
课程设计
课程编译原理
题目For语句的翻译程序设计(简单优
先法、输出三地址码)
学院计算机科学与技术学院
专业计算机科学与技术
班级计算机1404
姓名王承禹
指导教师林泓
2016 年12 月27 日
目录
1 系统描述 (2)
1.1设计目的 (2)
1.2设计内容描述 (2)
2 文法及属性文法的描述 (2)
3 语法分析方法描述及语法分析表设计 (3)
3.1语法分析方法描述 (3)
3.2分析法操作步骤 (4)
3.3优先关系矩阵 (5)
4 中间代码形式的描述及中间代码序列的结构设计 (5)
4.1中间代码形式 (5)
5 编译系统的概要设计 (6)
5.1数据结构 (6)
5.2模块设计 (6)
5.2.1词法分析模块 (7)
5.2.2语法、语义分析模块 (7)
5.2.3主控模块 (11)
6 详细的算法描述 (11)
6.1词法分析算法 (11)
6.2语法分析算法 (12)
6.3语义分析算法 (12)
7 软件的测试方法和测试结果 (13)
8 本设计的评价、特点、 (14)
9 收获与体会 (14)
10 核心代码 (16)
成绩评定表 (27)
For语句的翻译程序设计
(简单优先法、输出三地址码)
1 系统描述
1.1设计目的
通过学习编译原理的相关内容,设计并编写FOR循环语句的翻译程序,使用简单优先法,按三地址码输出,能够实现词法分析,语法和语义的分析,加深对所学知识的理解,并且能够熟练运用到实际当中。
1.2设计内容描述
FOR循环语句的基本格式如下:
FOR i=E step E until E do Stmt
根据所给题目要求,设计出符合FOR循环语句的文法及属性文法的描述,语法分析方法以及三地址码的输出方式,罗列出词法分析和语法分析的流程,根据语法规则设计输入输出方法,简单优先法中的优先关系表格。设计好并且进行编译,设计若干输入输出用例(包括正确的输入和错误的输入,用来检查程序的完整性)。
2 文法及属性文法的描述
根据For语句的特点,制定的产生式规则及由产生式对应的语义动作如下:
F1 -> for i = E1
{emit(entry(i) , ' = ' , E1.place);
F1.place = entry(i);/*保存控制变量在符号表中的位置*/
F1.chain = nextstat;
emit('goto'--);/*goto OVER*/
F1.codebegin = nextstat;/*保存AGAIN的地址*/}
F2 -> F1 step E2
{F2.codebegin = F1.codebegin;
F2.place = F1.place;
emit(F1.place '=' E2.place '+' F1.place);
backatch(F1.chain,nextstat);}
F3 -> F2 until E3
{F3.codebegin = F2.codebegin;
q = nextstat;
emit('if' F2.place, '<=' E3.place, 'goto' q+2);
/*若i<=E3 转去执行循环体的第一个三地址码*/
F3.chain = nextstat;
emit('goto'--)/*转离循环*/}
S -> F3 do Stmt
{emit ('goto' F3.codebegin)/*goto AGAIN*/
backpatch(Stmt.chain,F3.codebegin);
Stmt.chain = F3.chain/*转离循环的转移目标留待外层S时再回填*/}
3 语法分析方法描述及语法分析表设计
3.1语法分析方法描述
本次课内实践要求使用简单优先关系方法。
简单优先分析法的基本思想史对一个文法按照一定原则求出该文法所有符号即包括终结符和非终结符之间的优先关系确定归约过程中的句柄,它的归约实际上是一种规范归约。一个文法是简单优先文法必须满足以下条件
(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立;
(2)在文法中任意两个产生式没有相同的右部。
三种优先关系及其判定方法如下所示:
(1)X=Y 表示X和Y的优先关系相等,当且仅当G中存在产生式规则A→…XY…;
(2)X A→…XB…,且B Y…; (3)X>Y表示X的优先性比Y的优先性大,当且仅当G中存在产生式规则 A→…BD…,且B…X和D Y…; (4)对任何X,若文法开始符号S→X…,则# 3.2分析法操作步骤 (1)由简单优先分析法的基本思想设计的如下算法,首先要构造优先关系矩阵(如3.3所示),并将文法产生式保存,设置符号数组S: (2)将输入符号串a1a2…an # 依次逐个保存符号数组S中,直到遇到数组中第一个符号ai的优先性>下一个待输入符号aj为止。 (3)数组当前符号ai为句柄尾,由此向左在数组中找句柄的头符号ak,即找到ak-1 由句柄ak…ai在文法的产生式中查找右部为ak…ai的产生式,若找到则用相应左部代替句柄,找不到则为出错,这是可断定输入串不是该文法的句子。 重复(1)(2)(3),直到归约完输入符号串,数组中只剩文法的开始符号为止。 3.3优先关系矩阵 4 中间代码形式的描述及中间代码序列的结构设计4.1中间代码形式 三地址码是由下面一般形式的语句构成的序列: x:=y op z 其中,xyz为名字、常数或变量;op代表运算符。 对于本程序的具体三地址码输出,预计显示结果如下:给定输入程序for i=0 step 1 until 10 do {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 5 编译系统的概要设计 5.1数据结构 单词种别: struct Token { //单词种别 int num; //词素(单词的值) string lexeme; }; 产生式结构: struct Term { //1为状态,2为产生式 int kind; //如果是状态保存格子里的内容 string action; }; 5.2模块设计 本系统分为四大模块:词法分析模块、语法分析模块、语义分析模块以及主控模块,其中主控模块负责协调前三个模块。词法分析模块为语法分析模块以及语义分析模块提供单词序列。 5.2.1词法分析模块 void LexicalScanner() { //词法分析 FILE *fp; char ch; errno_t _err2 = fopen_s(&fp, "d:\\123.txt", "rb"); if (fp == NULL) //取当前目录下的tk.txt文件的第一个字符 { fprintf(stderr, "error opening!\n"); //格式化输出到流 //错误打印到屏幕上 exit(1); } do{ ch = fgetc(fp); if (ch == '$') break; //作为文件结尾 else if (ch == ' ') scanner(fp); //空格略过 else { fseek(fp, -1, 1); scanner(fp); } //扫描 } while (ch != '$'); strings[arrTop] ="(1,$)"; } 5.2.2语法、语义分析模块 void Semantic() { Token t1; t1.lexeme ="#"; t1.num = 100; tokens[tokenTop] = t1; for (int i = 0;i < 20;i++) { cout << tokens[i].lexeme <<" "; } cout << endl; string product1 = "fori=E1"; string product2 = "F1stepE2"; string product3 = "F2untilE3"; string product4 = "F3doS1"; stack for (int i = 0;i < 15;i++) { for (int j = 0;j < 15;j++) { priorityTable[i][j] = 2; } } tokenStack.push("#"); map_.insert(map priorityTable[map_["for"]][map_["i"]] = 0; priorityTable[map_["i"]][map_["="]] = 0; priorityTable[map_["="]][map_["E1"]] = 0; priorityTable[map_["F1"]][map_["step"]] = 0; priorityTable[map_["step"]][map_["E2"]] = 0; priorityTable[map_["F2"]][map_["until"]] = 0; priorityTable[map_["until"]][map_["E3"]] = 0; priorityTable[map_["F3"]][map_["do"]] = 0; priorityTable[map_["do"]][map_["S1"]] = 0; priorityTable[map_["do"]][map_["F3"]] = -1; priorityTable[map_["do"]][map_["F2"]] = -1; priorityTable[map_["do"]][map_["F1"]] = -1; priorityTable[map_["do"]][map_["for"]] = -1; priorityTable[map_["#"]][map_["S"]] = -1; priorityTable[map_["#"]][map_["F1"]] = -1; priorityTable[map_["#"]][map_["F2"]] = -1; priorityTable[map_["#"]][map_["F3"]] = -1; priorityTable[map_["#"]][map_["for"]] = -1; priorityTable[map_["E1"]][map_["step"]] = 1; priorityTable[map_["E2"]][map_["until"]] = 1; priorityTable[map_["E3"]][map_["do"]] = 1; priorityTable[map_["S"]][map_["#"]] = 1; for (int i = 0;i < 15;i++) { for (int j = 0;j < 15;j++) { cout << priorityTable[i][j]<<" "; } cout << endl; } int i = 0; while (strcmp("#",tokens[i].lexeme.c_str())!=0) { while (priorityTable[map_[tokenStack.top()]][map_[tokens[i].lexeme.c_str()]]<1) { tokenStack.push(tokens[i].lexeme); //cout << tokenStack.top() << endl; i++; } if (priorityTable[map_[tokenStack.top()]][map_[tokens[i].lexeme.c_str()]]==2&&!strcmp(tokens[i].lexem e.c_str()," ")) { cout <<"error"<< endl; system("pause"); //error } else { //cout << "enter" << endl; string tempStr = ""; string top = tokenStack.top(); tempStr = tokenStack.top() + tempStr; tokenStack.pop(); while (priorityTable[map_[tokenStack.top()]][map_[top]]==0) { top = tokenStack.top(); tempStr = top + tempStr; tokenStack.pop(); //cout << tempStr << endl; } if (priorityTable[map_[tokenStack.top()]][map_[top]] == 2) { //error cout <<"error2"<< endl; system("pause"); } else { if (!strcmp(tempStr.c_str(), product1.c_str())) { tokenStack.push("F1"); cout <<"i=E1"<< endl; cout <<"goto OVER"<< endl; } if (!strcmp(tempStr.c_str(), product2.c_str())) { tokenStack.push("F2"); cout <<"AGAIN:i=i+E2"<< endl; } if (!strcmp(tempStr.c_str(), product3.c_str())) { tokenStack.push("F3"); cout <<"OVER: if i } if (!strcmp(tempStr.c_str(), product4.c_str())) { tokenStack.push("S"); cout <<"begin S1;"<< endl <<"goto AGAIN end;"<< endl; } } //cout << tempStr << endl; } //tokenStack.push(tokens[i].lexeme); //i++; } } 5.2.3主控模块 int main() { File.open("d:\\1233.txt", ios::out); //词法分析 LexicalScanner(); //词法分析完成后会将Token序列输出到中间文件 //语法分析 SyntaxScanner(); //语义分析 Semantic(); File.close(); cout << translation << endl; return 0; } 6 详细的算法描述 6.1词法分析算法 6.2语法分析算法 6.3语义分析算法 语法分析与语义分析同步完成,在规约的过程中,每使用一个产生式则调用其对应的动作 7 软件的测试方法和测试结果 编译调试环境:Visual Studio 2015 Community 程序语言:C++ 测试用例: 采用如下形式双重循环作为测试用例之一 首先输出的是词法分析结果: 然后是语法以及语义分析结果: 8 本设计的评价、特点、 本系统可以完成Fortran语言的For语句的语法制导翻译,在词法分析的基础上先后进行语法分析和语义分析。 在完成这些功能的基础上,我认为此系统仍然不能算一个合格的产品,还有很多需要改进之处。例如,词法分析可以进一步改进成为词法分析器的自动生成器。语法分析和语义分析也应改为自动生成简单优先文法生成器。 特点:本系统可以完成Fortran语言的子集(For语句)的制导翻译,但是没有优化过程,符号表的控制也很简单,很多代码采用了硬编的方法,改变文法将导致巨大的工作量。因此本系统的一大特点是不易扩展和变更。 9 收获与体会 经过这次课内实践,使我更加扎实的掌握了有关编译原理方面的知识,在编写程序的过程中遇到了许多问题,但经过一遍遍的调试终于使得程序可以顺利运行。但是程序中存在着很大的不足:程序可扩展性差。 过而能改,善莫大焉。在课内过程中,我不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课内实践终于顺利完成了,在设计中遇到了很多问题,最后终于游逆而解。在今后发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上 【关键字】教学 《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日 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/ff5563579.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循环语句的翻译
for循环语句
程序流程控制语句
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)