编译 DO-WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)

合集下载

编译原理课程设计LL(1)文法 do while 三地址输出 报告加代码

编译原理课程设计LL(1)文法 do while 三地址输出  报告加代码

学号:课程设计题目编译原理学院计算机科学与技术专业计算机科学与技术班级姓名指导教师2 年月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 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年 12月 23日系主任(或责任教师)签名: 2011年 12月 23日DO-WHILE语句的翻译程序设计(LL(1)文法输出3地址表达式)1课设的描述1.1课设要求首先按照课程设计的要求,写一个能识别do-while循环语句的文法,并使它符合LL(1)法的要求,按照这个文法编写一个程序,该程序能识别输入的语句是否符合do-while语句的文法,或者通过文法的开始符号能判断是否能推导出该语句。

DO-WHILE循环语句翻译程序设计

DO-WHILE循环语句翻译程序设计

DO-WHILE循环语句翻译程序的设计目录第一章概述 (1)1.1 课程设计背景 (1)1.2 课程设计目的 (1)1.3 实验环境与开发工具 (1)1.4 C++语言简单介绍 (2)第二章设计内容 (3)2.1 设计需求陈述 (3)2.1.1词法分析的原理 (4)2.1.2 语法分析器的原理 (5)2.1.3 语义分析中间代码生成器的原理.......................................... 错误!未定义书签。

2.2 需要完成的功能................................................................................. 错误!未定义书签。

2.2.1 判定输入的文法词法分析是否正确 (8)2.2.2 判定输入的文法语法分析是否正确 (9)2.2.3中间代码(四元式)的生成与输出 (10)2.3 分析器的构造 (11)第三章逻辑设计 (12)3.1系统的组织与基本工作流程 (12)3.2 总体结构逻辑结构图 (13)第四章详细设计.............................................................................................. 错误!未定义书签。

4.1 软件功能分析................................................................................... 错误!未定义书签。

4.1.1 判定输入文法词法分析是否正确 (14)4.1.2 判定输入的文法的语法分析是否正确.................................. 错误!未定义书签。

4.1.3 语义分析和中间代码生成...................................................... 错误!未定义书签。

WHILE循环语句的翻译程序设计(简单优先法,三地址输出)

WHILE循环语句的翻译程序设计(简单优先法,三地址输出)

目录1 问题域描述 (3)2 文法及属性文法的描述 (3)2.1 WHILE循环语句的文法 (3)2.2 WHILE循环语句的属性文法 (4)3 语法分析方法及中间代码形式的描述 (4)3.1语法分析方法 (4)3.2中间代码形式描述 (6)4 编译系统的概要设计 (7)4.1词法分析 (7)4.2语法制导翻译 (8)5 详细的算法描述 (8)5.1 文法设计 (8)5.2 算法描述 (8)5.3 源程序代码 (9)6 软件的调试过程和结果测试 (19)6.1调试过程 (19)6.2结果测试 (19)7 使用说明 (20)8 课设总结 (20)9 参考文献 (22)WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)1 问题域描述while循环语句的翻译程序设计(简单优先法,输出单地址表示),要求完成:(1)用C++语言正确编写程序,完成WHILE循环语句的翻译程序设计。

(2)求能正确进行词法分析,语法分析,并能正确的输出预期结果。

(3)根据指定的文法,判定程序的正确性。

本次课程设计中要求设计一个WHILE循环语句的词法﹑语法及语义分析程序,语法分析选择简单优先法,采用语法制导翻译输出中间代码三元式。

通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现功能。

while循环语句的格式为:while(P){do A},其中A为循环体,可为一个或多个赋值语句;P为循环控制条件。

while循环语句首先根据循环控制条件P进行判断,若满足条件则执行循环体A,否则执行下面的程序段;本次课程设计中系统首先要进行词法分析,即从左到右把源文件的字符序列逐个进行扫描,产生一个个的单词序列,作为语法分析的输入从而继续编译过程。

该程序的语法分析读入词法分析的结果,并判断输入语句是否满足while循环语句的文法所描述的形式。

通过简单优先法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。

dowhile循环语句格式讲解

dowhile循环语句格式讲解

dowhile循环语句格式讲解
嘿,朋友!你知道什么是dowhile 循环语句吗?这玩意儿可有趣啦!
比如说,你想要一直做一件事,直到某个条件不满足为止,这时候dowhile 循环就派上用场啦!想象一下,你在沙漠里找水源,只要还没
找到水,你就一直不停地找,这就有点像 dowhile 循环。

它的格式大概是这样:
do {
// 要执行的代码
} while (条件);
就好比你每天早上起床,先穿衣服(这是要执行的代码),然后看
看是不是周末(这就是条件),如果不是周末,那就乖乖去上班。

再比如,你想让计算机一直输出数字,直到数字大于 100 为止。

do {
System.out.println(数字);
数字++;
} while (数字 <= 100);
这不就像你一直吃蛋糕,直到吃撑了才停下嘛!
怎么样,是不是对 dowhile 循环语句有点感觉啦?
我的观点是,dowhile 循环语句虽然不像 for 循环那么常用,但在某些特定场景下,它可是能发挥大作用的,能让我们的程序更加灵活和强大!。

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

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

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)1 系统描述按照课程设计的要求,写一个能识别while循环语句的文法,通过一定的变换使它符合递归下降法的要求,然后按照这个文法编写一个程序,该程序能识别输入的语句是否符合while语句的文法,或者能不能通过文法的开始符号推导出该语句。

该程序应该包括词法分析器,能对输入的语句进行词法分析,然后再对结果进行语法分析。

词法分析器应能识别关键字,标示符,常量,操作符等。

该程序的语法分析器能对输入的语法进行分析,判断输入语句能否满足while循环语句的文法。

通过递归下降的方法对语句进行分析,看能否通过开始符号推导出来。

该程序的语义分析器就是对分析结果进行输出,要求输出结果是三地址形式的。

2 文法及属性文法的描述2.1文法描述语句 > ::= while (< 条件表达式 > (< 赋值语句 > | 语句 ><条件表达式> ::= (<标识符>|<无符号整数>)<条件运算符> (<标识符>|<无符号整数><标识符> ::= <字母> (<字母>|<数字><条件运算符> ::= > | < | =<无符号整数> ::= <数字>(<数字><赋值语句> ::= <标识符>=(<标识符> | <数字> <算术运算符> (<标识符> | <数字><算术运算符> ::= + | - | * | /<赋值语句> ::= <标识符>=<标识符> | <数字>2.2递归文法while语句文法:S -> while (B S | i=EB -> E relop Erelop -> < | = | >E -> E+E | E-E | E*E | E/E | (E | i | n在编写程序的时候用到的是递归下降法,而递归下降法对文法的要求是不能包含左递归,对上述的文法进行消除左递归之后,得到如下的递归文法:S -> while (B S | i=EB -> E relop Erelop -> < | = | >E -> (EF | iF | nFF -> +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 -> (E1F E.place:=newlabel;E.code:=E1.code ||F.code ||gen(E.place ‘:=’ ,‘(’, E1.place , ‘’, F.place;E -> iF E.palce:=newlabel;E.code:=i.code ||F.code ||gen(E.palce ‘:=’ ,i.place , F.place;E -> nF 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 语法分析方法描述按照递归下降分析技术,递归下降识别程序是由一组子程序组成,每个子程序对应于一个非终结符号。

DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)

DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)

附件1:学号:0120910340525课程设计题目DO-WHILE(简单优先法、输出三地址表示)学院计算机科学与技术专业计算机科学与技术班级0905姓名明正超指导教师杨克俭2012 年 1 月 3 日课程设计任务书学生姓名:明正超专业班级:计算机0905班指导教师:杨克俭工作单位:计算机科学与技术学院题目: DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名: 2011年 11月23日系主任(或责任教师)签名: 2011年 11月 23日(一)系统描述根据所学编译原理有关词法分析,语法分析,语义分析有关规则,对DO_WHILE循环语句的翻译程序进行设计,使用高级语言或者伪代码形式,进行编写,其中要求使用简单优先法法并在程序的最终结果中显示出表达式的三地址形式。

while语句的翻译—递归子程序法—三地址表示——编译原理课程设计报告.

while语句的翻译—递归子程序法—三地址表示——编译原理课程设计报告.

课程设计题目WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)学院计算机科学与技术学院专业计算机科学与技术班级0806姓名张方纪指导教师郭羽成2010 年 1 月7 日课程设计任务书学生姓名:张方纪专业班级:计算机0806班指导教师:郭羽成工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名: 2010年 11月 23日系主任(或责任教师)签名: 2010年 11月 23日WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)1任务使用C++语言编写一个while循环语句的翻译程序,使用递归下降法进行语法分析,输出三地址码表示。

C语言程序设计基础教程 4.11、do-while循环的应用

C语言程序设计基础教程 4.11、do-while循环的应用

do-while循环的应用
C语言
本次任务
使用do-while循环 求1-100的和
01
任务分析 相关知识
内容
CONTENT S
02
03
任务实现
do-while循环的应用
C语言
任务分析
起始 条件
循环的主要框架
1、寻找初始条件;
2、构造结束条件
循环 体
循环
结束 条件
变化 条件
3、总结变化规律
4、完成循环体
for循环 while循环
while(i<=100) //循环控制累加次数 { sum+=i++;//实现累加 }
printf("1到100的和为:%d",sum);
}
do-while循环的应用
C语言
循环
满足一定条件的重复。
循环体
(核心逻辑)
do-while循环的应用
C语言
C语言中的三种循环
需要多次重复执行一个或多个操作的问题考虑使用 循环来解决
expr 循环体
假(0)
真(非0)
While循环的应用
C语言
任务扩展
猜数游戏
int number=5,guess; 请输入您猜测的数:3 问题描述: printf ("猜一个介于 1 与 10 之间的数\n"); 太小 do 猜数游戏。要求猜一个介于 1~10之间的数字,根 请输入您猜测的数: 5 { printf("请输入您猜测的数:"); 您猜中了! 答案为 5 据用户猜测的数与标准值进行对比,并给出提示, scanf("%d",&guess); 输入数字 5 后, 以便下次猜测能接近标准值,直到猜中为止。 if (guess > number) do…while 循环中的条 printf("太大\n"); 件为假, 输出结果消 else if (guess < number) 息后,程序终止。 printf("太小\n"); } while (guess != number); printf("您猜中了! 答案为 %d\n",number);

DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)

DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)

附件1:学号:0120910340525课程设计题目DO-WHILE(简单优先法、输出三地址表示)学院计算机科学与技术专业计算机科学与技术班级0905姓名明正超指导教师杨克俭2012 年 1 月 3 日课程设计任务书学生姓名:明正超专业班级:计算机0905班指导教师:杨克俭工作单位:计算机科学与技术学院题目: DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名: 2011年 11月23日系主任(或责任教师)签名: 2011年 11月 23日(一)系统描述根据所学编译原理有关词法分析,语法分析,语义分析有关规则,对DO_WHILE循环语句的翻译程序进行设计,使用高级语言或者伪代码形式,进行编写,其中要求使用简单优先法法并在程序的最终结果中显示出表达式的三地址形式。

do while 循环语句 实例 c语言

do while 循环语句 实例 c语言

C语言中的do while循环语句是一种常用的循环结构,它与while循环和for循环一样,能够让程序根据条件多次执行特定的代码块。

本文将介绍do while循环语句的基本语法和工作原理,并通过实例演示其在C语言中的应用,帮助读者更好地理解和掌握这一重要的编程概念。

一、基本语法在C语言中,do while循环语句的基本语法如下:1. do2. {3. // 待执行的代码块4. // 可能包括一些需要循环执行的操作5. }6. while (条件表达式);其中,关键字do和while分别表示循环的开始和结束,大括号内的代码是需要执行的循环体,条件表达式则决定了循环何时结束。

do while循环与while循环的不同之处在于,它先执行一次循环体,再判断条件是否成立,即使条件不成立也至少会执行一次。

二、工作原理do while循环的工作原理如下:1. 首先执行循环体内的代码;2. 然后判断条件表达式的值,如果为真,则继续执行循环体内的代码,否则结束循环。

无论条件表达式的值如何,do while循环至少会执行一次循环体内的代码。

这一特性使得do while循环在某些情况下比while循环更加适用,特别是当需要至少执行一次循环体内的代码时。

三、实例演示接下来,我们通过一个实例演示do while循环在C语言中的应用。

假设我们需要编写一个程序,计算1到10的整数之和,并将结果输出到屏幕上。

以下是相应的C语言代码:```c#include <stdio.h>int m本人n(){int num = 1;int sum = 0;do{sum += num;num++;} while (num <= 10);printf("1到10的整数之和为:d\n", sum);return 0;}```在这个示例中,我们首先定义了两个变量num和sum,分别用于存储当前的整数和整数之和。

(完整版)DO-While--Loop循环语句

(完整版)DO-While--Loop循环语句

代码: Dim Age As Integer ,Tree As Integer Age = 17 Tree = 3 Do while Tree < 100
Age = Age + 1 Tree = Tree +Age -14 Loop Print “年龄为:”; Age
Do …Loop循环语句
Do语句的格式有多种,常用的Do语句格式如下:
三、举一反三
变1:计算1+3+…+99的值。
变2:编写一个程序,输入正整数n,计算它的 阶乘n!(n!=n*(n-1)*…*3*2*1)。
思考:编写计算机程序来计算12+32+…+992 的值。
分析: 初值为17,步长为1,终值?
这个问题中的循环次数是未知的,所以用For 循环语句无法解决。要解决这类问题,就要 用到循环语句的另一种语句do循环语句。

具体问题具体求解:
1.将问题转化为:当Tree>=100时,求 Age的值
2.设计算法 (1) 循环体内容:Age = Age + 1 Tree = Tree +Age -14 (2) 退出循环体条件:Tree >= 100
Do While <条件表达式>
语句块(循环体) 注意:先判断后执行,有
Loop
可能一次也不执行
说明: 当条件为真, 执行循环体, 否则结束循环
执行过程为:先计算条件表达式的值,并进行判断,当表 达式的值为True(非0)时(条件成立),执行语句(循 环体)一次,遇到loop语句后,再次计算表达式,若仍为 True,重复执行循环体… …如此一直循环到表达式的值为 False(是0)时,结束循环do语句,转去执行后续语句。

(完整word版)FOR循环语句的翻译程序设计(LL(1)法、输出三地址)

(完整word版)FOR循环语句的翻译程序设计(LL(1)法、输出三地址)

课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: FOR循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名:年月日系主任(或责任教师)签名:年月日FOR循环语句的翻译程序设计——LL(1)法、输出三地址1.系统描述1.1问题描述用LL(1)法设计、编制、调试一个FOR(表达式1;表达式2;表达式3)〈赋值语句〉的语法及语义分析程序,输出三地址代码。

1.2功能描述(1)能对for循环语句做词法分析,并将其中的某些语句做预处理,如i++转换为i=i+1等。

(2)能依据给定的LL(1)文法判断输入串是否符合LL(1)文法(3)给出输入串的LL(1)分析过程(4)完成对语句中控制变量赋值语句,控制条件语句以及控制变量变换语句的翻译(5)完成对赋值语句包括复杂语句的翻译(6)能够对三个表达式缺少一个或多个的情况下进行翻译(7)用翻译后的语句以三地址代码的中间代码形式正确的表达for循环的执行流程。

039Java编程do-while循环语句的用法

039Java编程do-while循环语句的用法

Java编程do-while循环语句的用法do-while循环语句也称为后测试循环语句,它的循环重复执行方式也是利用一个条件来控制是否要继续重复执行这个语句。

与while循环不同的是它要先执行一次循环语句,然后再去判断是否继续执行循环体。

前面实现的计算1~100之间所有整数的和的操作也可以使用do-while循环语句来实现,具体代码如下。

int sum=0;int i=0;do{sum+=i;i++;}while (i<=100);System.out.println("1到100之间所有整数的和是:"+sum);在对do-while循环语句有一个初步的认识后,下面给出do-while循环语句的语法格式。

do-while循环语句的语法格式如下。

do{语句序列}while (条件表达式); //注意!语句结尾的分号“;”一定不能少□语句序列:也就是循环体,循环开始时首先被执行一次,然后在条件表达式的结果为true 时,重复执行。

□条件表达式:决定是否进行循环的表达式,其结果为boolean类型,也就是说结果只能是true或false。

说明do-while循环语句执行的过程是先执行一次循环体,然后再判断条件表达式,如果条件表达式的值为true,则继续执行,否则跳出循环。

也就是说,do-while循环语句中的循环体至少被执行一次。

do-while循环语句的执行过程如图4.9所示。

图4.9 do-while循环语句的执行流程图一般情况下,使用do-while语句和while语句处理同一问题时,若两者的循环体部分是一样的,那么它们的执行结果也是一样的,例如,本节介绍的使用do-while语句计算1~100之间所有整数的和与前面的章节使用while语句计算1~100之间所有整数的和所得到的结果是一样的。

但是,如果while后面的表达式一开始就为false,那么这两种循环产生的结果就不一样了,下面将举例说明。

WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

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 -> CC -> CAC -> AA -> iPAA -> i;P -> +|-|*|/B -> iTiB-> iT -> >|<|>=|<=|==}2.2 语法分析方法描述及语法分析表设计2.2.1 语法分析方法描述:简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。

基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将文法的产生式保存,设置符号栈S,步骤如下:(1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。

(2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1<a k为止。

(3)由句柄a k...a i在文法的产生式中查找右部为a k…a i的产生式,若找到则用相应左部代替句柄,若找不到则为出错,这时可断定输入串不是该文法的句子。

(4)重复上述(1)、(2)、(3)步骤直到规约完输入符号串,栈中只剩文法的开始符号为止。

c语言do while的用法

c语言do while的用法

C语言中的do-while循环是一种后测试循环,这意味着在执行循环体之前会先检查条件。

在do-while循环中,循环体至少会被执行一次,即使条件在第一次检查时就不满足。

下面是do-while循环的基本语法:
```c
do {
// 代码块
} while (condition);
```
在这里,“condition”是一个布尔表达式,当其为真时,循环体会继续执行。

让我们看一个简单的例子,打印数字1到5:
```c
#include <stdio.h>
int main() {
int i = 1;
do {
printf("%d\n", i);
i++;
} while (i <= 5);
return 0;
}
```
在这个例子中,首先设置一个变量i为1,然后进入do-while循环。

在循环体内,先打印i的值,然后将i递增。

接着检查循环条件(i <= 5),如果为真,再次执行循环体。

当i的值大于5时,循环停止。

注意:如果do-while循环的条件一开始就不满足,那么循环体将不会被执行。

在上面的例子中,如果i的值一开始就大于5,那么循环体将不会被执行。

pythondowhile语句

pythondowhile语句

pythondowhile语句
【实用版】
目录
1.Pythondowhile 语句概述
2.Pythondowhile 语句的基本语法
3.Pythondowhile 语句的应用示例
正文
【1.Pythondowhile 语句概述】
Pythondowhile 语句是 Python 编程语言中一种循环控制语句,用于在指定条件下重复执行一段代码。

这种语句可以让程序员更方便地编写循环逻辑,特别是在需要根据特定条件进行多次迭代的情况下。

【2.Pythondowhile 语句的基本语法】
Pythondowhile 语句的基本语法如下:
```python
while 条件:
循环体
```
其中,“条件”可以是一个布尔表达式,也可以是一个整数或者浮点数。

只要条件为 True,循环体就会一直重复执行。

【3.Pythondowhile 语句的应用示例】
下面是一个使用 Pythondowhile 语句的简单示例,该示例用于计算一个数字序列的和:
```python
sum = 0
i = 1
while i <= 10:
sum += i
i += 1
print("数字序列的和为:", sum)
```
在这个示例中,我们使用 Pythondowhile 语句计算 1 到 10 之间所有整数的和。

当变量 i 的值小于等于 10 时,循环体会重复执行,每次将 i 加 1,并将 i 的值加到变量 sum 中。

循环结束后,我们打印出计算得到的和。

do while死循环写法

do while死循环写法

do while死循环写法
在很多编程语言中,`do-while` 循环是一种在循环体执行之前先执行一次循环条件检查的循环结构。

`do-while` 循环确保循环体至少执行一次,即使循环条件一开始就不满足。

以下是`do-while` 循环的一般写法:
```语言
do {
// 循环体
} while (循环条件);
```
如果你想要创建一个死循环,即循环条件永远为真,可以使用如下的写法:
```语言
do {
// 循环体
} while (true);
```
在这个例子中,`true` 是一个永远为真的条件,因此循环会一直执行下去,形成一个死循环。

你可以根据需要修改条件,例如使用其他始终为真的条件,或者直接使用`true` 来创建死循环。

请注意,在编写死循环时,确保你有一种方法来终止程序的执行,以免导致程序无法正常退出。

在开发中,死循环通常是不建议使用的,因为它可能导致程序无法响应,需要特别小心。

《编译原理》课程设计说明书-DO-WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)

《编译原理》课程设计说明书-DO-WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)

DO-WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

对循环语句:DO〈赋值语句〉WHILE 〈表达式〉按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。

(1)按给定的题目给出语法分析方法的思想及分析表设计。

(2)按给定的题目给出中间代码序列的结构设计。

(3)完成相应的词法分析、语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

2文法的描述本程序所用的文法如下:G[S]:(1)S->do{E;}while(B) {if B.true goto B.true else goto B.false;}(2)B->I1 rop I2 {B.type=bool;B.val=I1.val rop I2.val;}(3)E->I1=I2 op I3 {I1.val=I2.val op I3.val;}(4)I->id {I.val=id.val;}注意:rop is < or >,op is +,-,*,/, id is any number or identifier由上可知,非终结符B表示布尔表达式,E表示赋值表达式本实验采用LR分析方法对DO-WHILE语句进行语法分析。

LR分析法是一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K个(K>=0)符号就能惟一的确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一的确定句柄。

LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范过程。

一个LR分析器由3个部分组成:总控程序,也可以称为驱动程序。

对所有的LR分析器,总控程序是相同的。

分析表或分析函数。

不同的方法分析表将不同,同一个方法采用的LR分析器不同时,分析表也不同,分析表表又可以分为动作(ACTION)表和状态转换(GOTO)表两个部分,它们都可以用二维数组表示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DO-WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)1.系统描述1.1设计目的通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

1.2设计内容及步骤对循环语句:DO〈赋值语句〉WHILE 〈表达式〉按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。

(1)按给定的题目给出语法分析方法的思想及分析表设计。

(2)按给定的题目给出中间代码序列的结构设计。

(3)完成相应的词法分析、语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

2文法的描述本程序所用的文法如下:G[S]:(1)S->do{E;}while(B) {if B.true goto B.true else goto B.false;}(2)B->I1 rop I2 {B.type=bool;B.val=I1.val rop I2.val;}(3)E->I1=I2 op I3 {I1.val=I2.val op I3.val;}(4)I->id {I.val=id.val;}注意:rop is < or >,op is +,-,*,/, id is any number or identifier由上可知,非终结符B表示布尔表达式,E表示赋值表达式3.语法分析方法描述及语法分析表设计3.1语法分析方法描述本实验采用LR分析方法对DO-WHILE语句进行语法分析。

LR分析法是一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K个(K>=0)符号就能惟一的确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一的确定句柄。

LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范过程。

一个LR分析器由3个部分组成:总控程序,也可以称为驱动程序。

对所有的LR分析器,总控程序是相同的。

分析表或分析函数。

不同的方法分析表将不同,同一个方法采用的LR分析器不同时,分析表也不同,分析表表又可以分为动作(ACTION)表和状态转换(GOTO)表两个部分,它们都可以用二维数组表示。

分析栈,包括文法符号栈和相应的状态栈。

它们均是先进后出栈。

分析器的动作由栈顶状态和当前输入符号所决定。

LR分析器工作过程示意图如图所示:其中SP为栈顶指针,S[i]为状态栈,X[i]为文法符号栈。

状态转换表内容按关系GOTO[Si,X]=Sj确定,改关系式是指当前栈顶状态为Si遇到当前文法符号为X 时应转向状态Sj。

X为终结符或非终结符。

ACTION[Si,a]规定了栈顶状态为Sj时遇到输入符号c[i]应该执行的动作。

动作有以下四种可能:移进:当Sj=GOTO[Si,a]成立,则把Sj移入到文法符号栈。

其中i,j表示状态号。

规约:当在栈顶形成句柄为b时,则用b归约为相应的非终结符A,即当文法中有A->b的产生式,而b的长度为r,则从状态栈和文法符号栈中自栈顶向下去掉r个符号。

并把A移入文法符号栈内,再把满足Sj=GOTO[Si,A]的状态移进状态栈,其中Si为修改指针后的栈顶状态。

接受acc:当归约到文法符号栈中只剩下文法的开始符号S时,并且输入符号串已结束即当前输入符是‘#’,则为分析成功。

报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该分发能接受的句子。

3.2语法分析表设计3.2.1构造文法的DFAI0:S’->.SS->.do{E;}while(B)I1:S’->S.I2:S->do.{E;}while(B)I3:S->do{.E;}while(B)E->.I= I op II->.idI4:S->do{E.;}while(B)I5:E->I . =I op II6:I->id.I7:S->do{E;.}while(B)I8:E->I=.I op II->.idI9:S->do{E;}.while(B)I10:E->I = I. op II11:S->do{E;}while.(B)I12:E->I=I op .II=.idI13:S->do{E;}while(.B)B->.I rop II->.idI14:E->I=I op I.I15:S->do{E;}while(B.)I16:B->I .rop II17:S->do{E;}while(B).I18:B->I rop .II19:B->IropI.3.2.2然后写出LR分析表:4.中间代码形式的描述及中间代码序列的结构设计4.1中间代码形式的描述在本程序中作用三地址码表示中间代码赋值语句t1 := a op b,a:= b条件转移if true goto Label无条件转移goto Label4.2中间代码序列的结构设计本程序用标号来表示程序的跳转过程,示例如下100 赋值语句101赋值语句102 条件跳转语句103 无条件转移语句…5.编译系统的概要设计本编译程序的结构图如下:说明:源程序(do-while语句)通过控制台输入。

然后通过Lex函数对输入的源程序进行分析后,将分析结果以二元组的方式输出到控制台。

接下来通过调用语法语义分析函数来完成对分析得到的单词进行文法句子的识别,并用进行语法制导翻译,完成属性文法定义规定的相关语义动作。

本编译程序最后完成的三地址码输出是通过中间文件间接输出到控制台上的。

在执行Analyze函数的过程中,同时运用ofstream文件流将三地址码输出到一个ASCII码的txt类型文件中,最后从该文件中读出最终处理的三地址码输出至控制台。

6.详细的算法描述(流程图或伪代码)6.1词法分析词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。

词法分析检查的错误主要是挑出源程序中出现的非法符号。

下面为本程序中所用来进行词法分析的伪代码:输入字符;If(字符是字母){查找关键词表;If(是关键字do或者while)识别关键词;Else 判断为标识符;}Else if(字符是数字)获取整个数;Else if(运算符){If(是算术运算符)识别算术运算符;Else 识别为关系运算符;}Else 标识为其他类型以下附部分源码:int Lex(char InStr[20][8],int InStrLen){//0关键字,1标识符2数字3界符4算符5其他char strsrc[BUFFURSIZE],strdst[8],ch;int strcount=0,strLength,i=0;cout<<"Please input the do-while statement:"<<endl;gets(strsrc);strLength=strlen(strsrc);cout<<endl<<" Lexical Analyse:"<<endl;while(strcount<strLength){while(strsrc[strcount]==' ') strcount++;ch=strsrc[strcount];if(Alpha(ch)){i=0;do strdst[i++]=strsrc[strcount++];while((Alpha(strsrc[strcount])||Digit(strsrc[strcount]))&&(strcount<strLength));strdst[i]='\0';if(!strcmp(strdst,"while"))cout<<setw(10)<<"(0,"<<strdst<<")"<<endl;elsecout<<setw(10)<<"(1,"<<strdst<<")"<<endl;for(int k=0;strdst[k]!='\0';k++){InStr[InStrLen][k]=strdst[k];}InStr[InStrLen++][k]='\0';}else if(Digit(ch)){i=0;do strdst[i++]=strsrc[strcount++];while(Digit(strsrc[strcount])&&(strcount<strLength));strdst[i]='\0';cout<<setw(10)<<"(2,"<<strdst<<")"<<endl;for(int k=0;strdst[k]!='\0';k++){InStr[InStrLen][k]=strdst[k];}InStr[InStrLen++][k]='\0';}else if(Oper(ch)){i=0;strdst[i]=ch;strdst[i+1]='\0';if(!strcmp(strdst,";")||!strcmp(strdst,"(")||!strcmp(strdst,")")||!strcmp(strdst,"{")||!st rcmp(strdst,"}"))cout<<setw(10)<<"(3,"<<ch<<")"<<endl;elsecout<<setw(10)<<"(4,"<<ch<<")"<<endl;for(int k=0;strdst[k]!='\0';k++){InStr[InStrLen][k]=strdst[k];}InStr[InStrLen++][k]='\0';strcount++;}else{cout<<setw(10)<<"(5,"<<ch<<")"<<endl;isillegal=1; cout<<"isillegal="<<isillegal<<endl;cout<<"not while statement "<<endl;break;strcount++;}}InStr[InStrLen++][0]='#';cout<<"inputed string"<<endl;for(int j=0;j<InStrLen;j++)cout<<" "<<InStr[j];cout<<"grammer analysis"<<'\n';return InStrLen;}6.2语法分析流程图如下,具本处理过程,请参见本文档3.1小节此处附上语法语义分析函数void Analyze(State state){int row=0,col=0,numchange=0;cout<<" Procedure"<<endl;cout.setf(ios::left);cout<<"step"<<""<<setw(20)<<"STATESTACK"<<setw(20)<<"SYMBOLSTACK"<<setw(20)<<"IN PUT"<<setw(8)<<"ACTION"<<setw(6)<<"GOTO"<<endl;strcpy(next,state.InStr[state.CurInstr]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];ofstream outfile("do_while.txt");while(strcmp(state.stkSymbol[state.CurSymbol],"S")!=0&&numchange!=20) {if(numchange==0){isillegal=1;break;}numchange=Action(state,numchange,outfile);}if(isillegal==0){cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<"acc"<<endl;}cout<<"processing semantic analysis"<<endl;system("PAUSE");}关键的状态转移函数ACTION和GOTOint Action(State &state,int actionnum,ofstream &outfile){int row=0,col=0,numchange=0;int choice=0;int ct=100;int m=0;if(actionnum>=1&&actionnum<=18)choice=1;else choice =actionnum;switch(choice){case 0:{isillegal=1;cout<<"isillegal="<<isillegal<<endl;break;}case 1://移进项目{cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<actionnum<<endl;state.CurState++;state.stkState[state.CurState]=actionnum;state.CurSymbol++;strcpy(state.stkSymbol[state.CurSymbol],state.InStr[state.CurInstr]);strcpy(next,state.InStr[state.CurInstr]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];break;}case 20://接收{cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<"acc"<<endl;break;}case 21://r1 S-->while(B){E;}{cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<actionnum;for(int i=9;i>0;i--){state.stkState[state.CurState--]=0;}for(i=9-1;i>=0;i--){strcpy(B[i],state.stkSymbol[state.CurSymbol]);strcpy(state.stkSymbol[state.CurSymbol--],"");}outfile<<"B.false: "<<'\n';state.CurSymbol++;strcpy(state.stkSymbol[state.CurSymbol],"S"); //B-->IropI strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];numchange=Goto(state,numchange);break;}case 22://r2 B-->IropI{cnt=0;cout<<setw(4)<<step++<<" ";cout<<setw(8)<<actionnum;for(int i=3;i>0;i--){state.stkState[state.CurState--]=0;}for(i=3-1;i>=0;i--){strcpy(B[i],state.stkSymbol[state.CurSymbol]);strcpy(state.stkSymbol[state.CurSymbol--],"");}outfile<<"102 t1:="<<I[0]<<B[1]<<I[1]<<endl;outfile<<"103 if t1.val=true"<<" goto 100"<<endl;outfile<<"104 goto 105"<<endl;state.CurSymbol++;strcpy(state.stkSymbol[state.CurSymbol],"B"); //归约B-->IropI strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];numchange=Goto(state,numchange);break;}case 23://r3 E-->I=IopI{cnt=0;cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<actionnum;for(int i=5;i>0;i--){state.stkState[state.CurState--]=0;}for(i=5-1;i>=0;i--){strcpy(E[i],state.stkSymbol[state.CurSymbol]);strcpy(state.stkSymbol[state.CurSymbol--],"");}outfile<<"100 "<<"t1:="<<I[1]<<E[3]<<I[2]<<endl;outfile<<"101 "<<I[0]<<":=t1"<<endl;state.CurSymbol++;strcpy(state.stkSymbol[state.CurSymbol],"E");strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];numchange=Goto(state,numchange);break;}case 24://r4归约I-->id{cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<actionnum;state.stkState[state.CurState--]=0;strcpy(I[cnt++],state.stkSymbol[state.CurSymbol]);//{I.value=id.value}strcpy(state.stkSymbol[state.CurSymbol],"I"); //归约I-->idstrcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];numchange=Goto(state,numchange);break;}}return numchange;}int Goto(State &state,int gotonum){int row=0,col=0,numchange=0;cout<<setw(6)<<gotonum<<endl;state.CurState++;state.stkState[state.CurState]=gotonum;strcpy(next,state.InStr[state.CurInstr]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);return table[row][col];}7.软件的测试方法和测试结果(1)运行程序,显示如下程序界面(2)按照提示输入合法的do-while语句Do{a=b+c;}while(a<b)(3)按enter确定输入完毕,得到词法分析结果,显示如下:并且最后一行提示了经过词法分析后合法的待输入串在栈中的存储情况。

相关文档
最新文档