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

合集下载

while的用法javawhile循环语句详解

while的用法javawhile循环语句详解

while 的用法javawhile 循环语句详解java 循环语句:while 的用法while 循环语法语法:123 4 5 6 7 89[init_statement]//初始化循环指标while(test_expression){statement;[iteration_statement]//迭代循环指标}eg :1234 5 6 7 8 9 1011int count = 10;// 循环5次while( count <15 ){......count++;}do while 循环语法:123 4 5 6 7do{statement;[iteration_statement]//迭代循环指标}while(test_expression);二、while 循环详解在英文中“while”这个词的意思是“当”,而在 Java 程序设计中,也可以将其理解为“当”,其语法结构是:while (条件){目的; //一段代码}当条件为真时,进入循环。

示例:计算1+2+3+4......+100的结果。

1 2 3 4 5 6 7 8 9 public class control5{public static void main(String[] args){int a=1,result=0;while(a<=100){result+=a++;}System.out.println(result);}}输出结果:1 5050三、do/while 语句在学习 do/while 语句之前,先清楚 while 语句是如何工作的。

while 语句是先进行条件判断,再执行大括号内的循环体。

do/while 语句与 while 语句不同的是,它先执行大括号内的循环体,再判断条件,如果条件不满足,下次不在执行循环体。

也就是说,在判断条件之前,就已经执行大括号内的循环体。

示例:计算1+2+3+4......+100的结果。

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循环语句的文法所描述的形式。

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

编译原理while语句的翻译

编译原理while语句的翻译

课程设计题目WHILE循环语句的翻译程序设计(简单优先法、输出四元式)学院计算机科学与技术学院专业计算机科学与技术专业班级1003班姓名刘颖指导教师李玉强2013 年 1 月11 日目录任务书 (2)1.系统描述 (3)2.文法及属性文法的描述 (3)3.语法分析方法的描述及分析表设计 (3)3.1.语法分析方法的描述 (3)3.2.优先关系表 (4)4.1.中间代码形式的描述 (4)4.2.中间代码序列的结构设计 (4)5.编译系统的概要设计 (4)6.详细的算法描述(流程图或伪代码) (5)6.1.主函数伪代码 (5)6.2.词法分析总控流程图 (5)6.3.语法分析 (5)7.源程序 (6)7.1.优先关系 (6)7.2.词法分析 (6)7.3.语法分析 (10)7.4.归约函数 (10)8.软件的测试方法和测试结果 (11)8.1.输入 (11)8.2.词法分析结果 (11)8.3.语法分析结果 (12)9.研制报告 (12)10.参考文献 (13)11.开发工具 (13)评分表 (14)课程设计任务书学生姓名:刘颖专业班级:计算机1003班指导教师:李玉强工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(简单优先法、输出四元式)初始条件:理论:学完编译原理课程,掌握一种计算机高级语言的使用。

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

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

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

(2)完成题目要求的中间代码四元式的描述。

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

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

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

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

编译原理课程设计——算术表达式、for、while语句转换为四元式

编译原理课程设计——算术表达式、for、while语句转换为四元式

计算机与信息学院《操作系统与编译原理联合课程设计报告》专题:编译原理部分学生姓名:学号:专业班级:指导教师:2014 年 7 月一、设计目标设计一个语法制导翻译器,将算术表达式、for语句、while语句翻译成四元式。

要求先确定一个定义算术表达式、for语句、while语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。

对用户输入的任意一个正确的表达式,程序将其转换成四元式输出。

二、设计思路开发平台:Visual C++ MFC解决这个问题的方案分为以下几个步骤:1.将算数表达式、for语句、while语句转换为四元式的第一步为对读入的表达式进行处理,即删除不必要的空格、回车、换行等,保证之后的步骤能够顺利进行。

2.分析算术表达式、for语句、while语句的文法。

3.通过词法分析判断语句中的每个字符的类型,如:数字、字母、符号等。

4.建立每种文法的LR(0)分析表,通过每个文法的LR(0)分析表对相应的表达式进行语法分析。

5.在语法分析正确的情况下,通过语法分析的中间过程的符号栈输出四元式,四元式的形式为:(op arg1 arg2 result)。

(一)算术表达式转换为四元式将算术表达式转换为四元式首先考虑了括号的问题,对于不同的算术表达式第一步进行词法分析,即确定各种符号的位置。

而括号中的式子是优先级最高的,应该最先进行处理。

我使用了一个数组记录算术表达式中括号的位置,并且定义了first_cc和first_jj函数对括号内的乘除法和加减法分别进行处理。

后将括号内的式子以四元式的形式输出。

通过以上转换,已将原算术表达式中的括号中的内容使用大写字母’A’、’B’……等代替(其中定义声明了change函数,用来将括号部分替换为大写字母)。

新的式子中,只含有加减乘除以及赋值这四种运算,后根据优先级的不同,逐步生成四元式。

其算法流程图如右图所示。

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 语法分析方法描述按照递归下降分析技术,递归下降识别程序是由一组子程序组成,每个子程序对应于一个非终结符号。

控制语句的翻译四元式例题及答案

控制语句的翻译四元式例题及答案

控制语句的翻译四元式例题及答案
1. 例题:if语句
高级语言代码:
python
if x > 5:
y = x + 10
else:
y = x - 10
翻译四元式:
1: if x > 5 goto 4
2: y = x + 10
3: goto 5
4: y = x - 10
5: (end if)
答案解析:
- 第1行表示条件判断,如果x大于5,则跳转到第4行执行。

- 第2行为if语句为真时的语句,将x加10赋值给y。

- 第3行为跳转到if语句结束位置的标记。

- 第4行为if语句为假时的语句,将x减10赋值给y。

- 第5行为if语句结束位置的标记。

2. 例题:while循环语句
高级语言代码:
python
while x > 0:
y = y + x
x = x - 1
翻译四元式:
1: (start while)
2: if x > 0 goto 4
3: goto 5
4: y = y + x
5: x = x - 1
6: goto 2
7: (end while)
答案解析:
- 第1行为while循环的起始位置。

- 第2行为条件判断,如果x大于0,则跳转到第4行执行循环体内的语句。

- 第3行为否则跳转到while循环结束位置的标记。

- 第4行为循环体内的语句,将y加上x的值。

- 第5行为循环体内的语句,将x减1。

- 第6行为跳转回while循环起始位置的标记。

- 第7行为while循环结束位置的标记。

while循环的解释

while循环的解释

while循环的解释
嘿,朋友!你知道什么是 while 循环吗?这玩意儿就像是一场永不
停歇的冒险!比如说,你想象一下,你在一个超级大的迷宫里,只要
你还没找到出口,你就得一直走啊走(这就好比 while 循环的条件没满足,就一直执行里面的代码)。

咱就拿一个简单的例子来说吧。

假设你想让电脑一直给你报数,直
到报到10 为止。

那你就可以用while 循环来实现呀!代码就像是这样:int i = 1; while (i <= 10) { System.out.println(i); i++; } 看到没,只要 i 还
小于等于 10,它就会不停地执行里面的输出 i 和让 i 加 1 的操作,这不就跟在迷宫里一直找路一样嘛!
哎呀呀,while 循环可太有用啦!它能让电脑像个不知疲倦的小机
器人一样,按照我们设定的规则一直工作下去。

你想想看,如果没有while 循环,那我们得写多少重复的代码呀!
再给你举个例子,比如说你要做一个游戏,游戏里的怪物要一直出现,直到玩家打败它为止。

这时候,while 循环不就派上用场了嘛!只
要怪物还活着,就一直让它出现,多方便呀!
你说 while 循环是不是超级厉害?它就像是我们编程世界里的一把
神奇钥匙,能打开好多好多有趣的大门!所以呀,一定要好好掌握它哦,朋友!我觉得吧,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循环语句的翻译程序,使用递归下降法进行语法分析,输出三地址码表示。

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循环语句的翻译程序,使用递归下降法进行语法分析,输出三地址码表示。

编译原理E课内实践报告:WHILE循环语句的翻译程序设计与实现,递归下降法,输出四元式

编译原理E课内实践报告:WHILE循环语句的翻译程序设计与实现,递归下降法,输出四元式

文法及属性文法的描述 ............................................................................................... 2 2.1 2.2 文法描述 ............................................................................................................. 2 属性文法描述 ..................................................................................................... 3
2.2 属性文法描述
形式上讲,属性文法是一个三元组 :A=(G,V,F), 其中: ➢ G:是一个上下文无关文法; ➢ V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连 ,这些属性代表与 文法符号相关信息; ➢ F:关于属性的属性断言或一组属性的计算规则(称为语义规则) 。 断言或语义规则 与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。 属性文法中的属性分成两类:继承属性和综合属性。 ➢ 综合属性(synthesized attribute) :如果 b 是 A 的属性,c1 , c2 , …, ck 是产生式右 部文法符号的属性或 A 的其它属性,则称 b 是文法符号 A 的综合属性。 ➢ 继承属性(inherited attribute):如果 b 是产生式右部某个文法符号 X 的属性,并且 c1,c2,…,ck 是 A 或产生式右部文法符号的属性, 则称 b 是文法符号 X 的继承属性。
3

FOR循环语句的翻译程序设计(递归下降法、输出四元式表示)

FOR循环语句的翻译程序设计(递归下降法、输出四元式表示)

1、系统描述 (2)1.1、实验思想 (2)1.2、设计内容 (2)1.3、翻译过程 (2)1.3.1、词法分析: (2)1.3.2、语法分析: (3)1.3.3、中间代码生成: (4)1.3.4、属性文法: (4)2、递归下降法 (4)2.1、递归下降法的主要思想: (4)2.2、用程序表示递归子程序的内部结构: (4)2.3、递归下降法对文法的限制: (5)3、语法制导翻译 (5)3.1、翻译任务的处理过程 (5)3.2、语法制导翻译: (5)3.3、基于属性文法的处理方法 (6)4、中间代码形式的描述及中间代码序列的结构设计 (6)5、简要的分析与概要设计 (6)5.1、词法分析: (6)5.2源代码 (8)5.3 运行结果 (9)6、测试方法和测试结果 (15)6.1测试过程 (15)6.2测试结论 (17)7、课程设计总结 (18)8、参考文献 (19)1、系统描述1.1、实验思想通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。

1.2、设计内容本设计按照要求设计出for语句的简单文法,并使用递归下降分析法对用户输入的程序进行分析和翻译。

对下列正确的程序输入:for i=1 step 1 until 10 do k=j #结果程序要对该输入进行词法分析,然后利用递归下降的分析法对词法分析得到的单词序列进行语法分析,经过语法制导翻译显示出等价的三地址表示的中间代码。

对于错误的程序输入,如:For i=1 step 1 until 10 k=j#结果程序要指出程序出错。

1.3、翻译过程1.3.1、词法分析:词法分析是计算机科学中将字符序列转换为单词(Token)序列的过程。

进行语法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。

(完整word版)IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)

(完整word版)IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)

目录1 系统描述(问题域描述) (2)2 文法及属性文法的描述 (2)2.1文法 (2)2.2 属性文法 (2)3 语法分析方法描述及语法分析表设计 (3)3.1语法分析方法描述 (3)3.1.1 LR方法的基本思想 (3)3.1.2 LR分析器模型 (4)3.2语法分析表设计 (5)4中间代码形式的描述及中间代码序列的结构设计 (6)4.1中间代码形式的描述 (6)4.2中间代码序列的结构设计 (6)5 编译系统的概要设计 (6)6 详细的算法描述 (7)6.1系统流程图 (7)6.2算法描述 (7)7 软件的测试方法和测试结果 (18)7.1软件的测试方法 (18)7.2测试结果 (18)8设计的特点、不足、收获与体会 (21)8.1特点与不足 (21)8.2收获与体会 (21)9 参考文献 (21)10本科生课程设计成绩评定表 (22)IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)1 系统描述(问题域描述)对条件语句: if 〈布尔表达式〉then〈赋值语句〉 else 〈赋值语句〉,进行词法,LR(1)语法分析,并根据语法制导翻译方法将条件语句翻译成四元式中间代码形式,最后输出翻译后的四元式代码。

2 文法及属性文法的描述2.1文法G[S]: S->CSS->TSS->AC->if E thenT->CS elseT->else其中,E代表布尔表达式,可由界符()括起来,A代表赋值表达式。

在这里E、A都代表终结符,具体的表达式在程序会判断其类型。

2.2 属性文法S->C S{S.clain:=merge(C.clain,S.clain)}S->T S{S.clain:=merge(T.clain,S.clain)}S->A{S.clain:0/* 空链*/}C->if E then{backpatch(E.true,nextstat) C.clain:=E.false}T->C S else{ q:=nextstatEmit(‘GOTO’—)Backpatch(C.clain,nextstat)T.clain:=merge(S.clain,q)}3 语法分析方法描述及语法分析表设计3.1语法分析方法描述3.1.1 LR方法的基本思想一个LR分析器实质上是一个带先进后出存储器的确定有限状态自动机。

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

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

(二)DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)一、1.简单优先法的基本思想根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。

PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。

直到最后栈内只剩下开始符号,输入串读到“#”为止。

此时识别正确。

可分点描述如下:(1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄;(2)、规定句柄内各相邻符号之间具有相同的优先级;(3)、规定句柄两端符号优先级要比位于句柄之外而又和句柄相邻的符号的优先级高,以先归约句柄;(4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.2.简单优先矩阵用于表示文法符号之间的简单优先关系的矩阵。

3.简单优先法的优缺点优点:技术简单,当做简单优先矩阵是要求较短。

缺点:适用范围小,分析表尺寸太大。

二、源代码实现:#include<iostream>#define MAX 35#include<list>#include<string>#include<fstream>using namespace std;#define TABLE_LEN 8#define STR_LEN 256int zhlen;char sTable[TABLE_LEN+1] = {"+-*/()i#"};//顺序索引int ShipTable[TABLE_LEN][TABLE_LEN] = //优先表{{ 1, 1,-1,-1,-1, 1,-1, 1},{ 1, 1,-1,-1,-1, 1,-1, 1},{ 1, 1, 1, 1,-1, 1,-1, 1},{ 1, 1, 1, 1,-1, 1,-1, 1},{-1,-1,-1,-1,-1, 0,-1,-2},{ 1, 1, 1, 1,-2, 1,-2, 1},{ 1, 1, 1, 1,-2, 1,-2, 1},{-1,-1,-1,-1,-1,-2,-1, 0}};char X,a;char VN[11]={'K','L','P','S','E','G','T','R','F','Q','\0'};char VT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\0'};charp[18][6]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-TG\0","\0","FR\0","*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};char stack[MAX];char queue[MAX];int sp,front;intM[10][14]={ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1},{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8, 8},{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},};int f=0; int count=0;int c=0;char arr_i[MAX];char var[MAX]; //表格管理int td[MAX]; int t=0;int opd=-1;int opr=-1;int id=0;int d=0;char arr[MAX][4];//存放待输出的四元式//char keyword[2][7]={"do\0","while\0"};bool IsCharInStr(char c,char s[]){for(int i=0;s[i]!='\0';i++){if(s[i]==c)return true;}return false;}int GetIndex(char s[],char c){for(int i=0;s[i]!='\0';i++){if(c==s[i])return i;}return -1;}//string GetSubString(char s[],int from,int to){string st;for(int i=from;i<to;i++){st+=s[i];}return st;}/*******************************************翻译赋值表达式********************************************/void translatefuzhi(char *sInput){//栈结构的初始化char Stack[STR_LEN]={0};int index = 0;int top = 1;Stack[0] = '#';list<char> rPolish;list<string> Num;int begin=0;while(sInput[begin]!='='){if(IsCharInStr(sInput[begin],sTable)){cout<<"Equal expression is illegal!"<<endl;return ;}begin++;}Num.push_back(GetSubString(sInput,0,begin));int now = begin+1;int before = begin;rPolish.push_back('i');while(sInput[now]!='\0'){if(IsCharInStr(sInput[now],sTable)){char temp[3]={0};if(now-before>1){temp[0] = 'i';temp[1] = sInput[now];Num.push_back(GetSubString(sInput,before+1,now));}else{temp[0] = sInput[now];}int i=0;while(temp[i]!=0){int left = GetIndex(sTable,Stack[index]);int right = GetIndex(sTable,temp[i]);switch(ShipTable[left][right]){case -1://移入Stack[top++] = temp[i];index = top-1;i++;break;case 0://脱括号if(Stack[index]=='('){Stack[top++] = ')';Stack[index] = 'E';top = index+1;index--;}else//规约{if(top!=2){return;}rPolish.push_back('=');list<char>::iterator iter;list<string>::iterator siter=Num.begin();string fuzhi[256];int d=0,m;for(iter=rPolish.begin();iter!=rPolish.end();iter++){if(*iter=='i'){fuzhi[d++]=*siter;siter++;}else{fuzhi[d++]=*iter;}}m=d;string op1,op2;int flag,xiabiao=0;for(d=0;d<m;d++)cout<<"("<<fuzhi[d]<<","<<op1<<","<<op2<<","<<"T"<<xiabiao<<")"<<endl;fuzhi[d] = "T";fuzhi[d]+=(xiabiao+'0');xiabiao++;}//cout<<fuzhi[d];}return;}i++;break;case 1://归约if(Stack[index]=='i'){rPolish.push_back('i');Stack[index] = 'E';index--;}else{rPolish.push_back(Stack[index]);Stack[index-1] = 'E';top = index;index-=2;}break;default:return;}}before=now;}now++;}}int len(char str[]){int i=0;while(str[i]!='\0')i++;return i;}int index(char ch,char str[]){int i=0;while(str[i]!='\0'){if(ch!=str[i])i++;else break;}if(str[i]=='\0')return -1;return i;}void err(int n){if(n==1)cout<<"字符不匹配"<<endl;else if(n==2)cout<<"字符没有出现在产生式中"<<endl;else if(n==3)cout<<"没有找到合适的¨选产式"<<endl;else cout<<"该句子是文法语言的句子"<<endl;}void print(){cout<<"(";if(count<10)cout<<'0';cout<<count<<")";int i;for(i=0;i<=sp;i++)cout<<stack[i];for(;i<=20;i++)cout<<" ";for(i=0;i<front;i++)cout<<" ";for(;queue[i]!='#';i++)cout<<queue[i];cout<<queue[i];for(;i<=20;i++)cout<<" ";}void semantic(){if(VT[opr]=='='){arr[d][0]='=';arr[d][1]=arr_i[opd];arr[d][2]=id;arr[d][3] ='--';id++;}elseif(opr==-2){arr[d][0]='=';arr[d][1]=id-1;arr[d][2]=arr_i[opd];arr[d][3]='--';} else {arr[d][0]=VT[opr];arr[d][1]=arr_i[opd];arr[d][2]=id;if(VT[opr]!='<'&&VT[opr]!='>')arr[d][3]=id-1;else arr[d][3]=id+1;id++;} d++;}void syntax(){//语法分析int n;count++;print();X=stack[sp];a=queue[front];if(X=='#'&&a=='#')f=4;if(X<'A'||X>'Z'){if(X==a){sp--;front++;if(a!='i'){if(a!='d'&&a!='w'&&a!=';'&&a!='#'){opr=index(a,VT);semantic();}else if(a==';'||a=='w'||a=='#'){opr=-2;semantic();}cout<<'\t'<<'\''<<a<<"'匹配"<<endl;}else {opd=c;cout<<'\t'<<'\''<<arr_i[c++]<<"'匹配"<<endl;}}else f=1;}else {int tx=index(X,VN);int ta=index(a,VT);n=M[tx][ta];td[t++]=M[tx][ta];if(ta==-1){f=2;cout<<a<<endl;}else if(n==-1)f=3;else {sp--;cout<<'\t'<<X<<"->";if(len(p[n])!=0){for(inti=len(p[n])-1;i>=0;i--){stack[++sp]=p[n][i];cout<<p[n][len(p[n])-1-i];} cout<<endl;}else cout<<"空串"<<endl;}}if(f==0)syntax();else {td[t]='-1';err(f);}}void lexical(){ //词法分析int i,j,d;char ch;j=d=0;for(i=0;var[i]!='#';i++){ch=var[i];if(ch=='d'&&var[i+1]=='o'){cout<<"do"<<'\t'<<"keword"<<endl;queue[j++]='d' ;i+=1;}else if(ch=='w'){ch=var[i+1];if(ch=='h'){ch=var[i+2];if(ch=='i'){ch=var[i+3];if(ch=='l'){ch=var[i+4];if(ch=='e'){ch=var[i+5];}}}}cout<<"while"<<'\t'<<"keyword"<<endl;queue[j++]='w';i+=4;}else if(index(ch,VT)<=0){if(ch!='{'&&ch!='}'&&ch!='('&&ch!=')'){cout<<ch<<'\t'<<"variable:i["<<d++< <"]"<<endl;arr_i[d-1]=ch;queue[j++]='i';}else cout<<ch<<'\t'<<"bound"<<endl;}elseif(index(ch,VT)>0){cout<<ch<<'\t'<<"operator"<<endl;queue[j++]=ch;} }queue[j]='#';for(i=0;queue[i]!='#';i++)cout<<queue[i];cout<<endl;}int main(){int i=0,j=0;int len,length;char temp;char S='K';sp=front=0;stack[0]='#';sp++;stack[1]='K';cout<<" ****************************"<<endl;cout<<" * DO-WHILE循环语句 *"<<endl;cout<<" * (简单优先法输出四元式) *"<<endl;cout<<" ****************************"<<endl;ifstream table;table.open("dowhile.txt");if(!table){cout<<"error!";}table.seekg(0,ios::end);length = table.tellg();table.seekg(0,ios::beg);while(length!=table.tellg()){table.read((char*)&temp,1);var[i]=temp;i++;if(var[i]==' ')i--;if(var[i]=='#')break;}table.close();len=i;var[i]='\0';cout<<"词法分析"<<endl;lexical();char fuzhi[20];int flag1,fuzhilen;int s=0; for(i=0;i<len;i++){if(var[i]==';'){flag1=i;}}fuzhilen=flag1-2;for(i=3;i<flag1;i++){fuzhi[s++]=var[i];}fuzhi[s]='#';char shuru;char zh[100];int kaishi=0;zh[0]='d';for(kaishi=1;kaishi<s+1;kaishi++){zh[kaishi]=fuzhi[kaishi-1];}zh[kaishi++]=';';zh[kaishi++]='W';for(i=flag1+8;i<len;i++){if(var[i]=='}')break;else{zh[kaishi++]=var[i];}}zh[kaishi++]='#';zhlen=kaishi;cout<<"输出四元式"<<endl;cout<<"do"<<endl;translatefuzhi(fuzhi);cout<<"("<<var[flag1+9]<<","<<var[flag1+8]<<","<<var[flag1+10]<<","<<"T2"< <")"<<endl;cout<<"if T2=true goto T0"<<endl;return 0;}三、测试结果:词法分析部分:输出四元式:四、课程小结:这次编译原理课程设计的题目是用简单优先分析法进行DO-WHILE循环语句的语法分析,并输出四元式.设计的特点是利用定义每个终极符和非终极符之间优先关系,来进行符号的移进与规约,如果栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。

翻译while生成四元式--2例

翻译while生成四元式--2例

例1:语法制导翻译下列语句为四元式形式:while x < y doif a > b then x:= x + 1 else x := y语法制导翻译生成四元式栈内容输入串语义规则(生成四元式)#whileM1x<y do if a>b then x:=x+1 else y:=x#M1.quad=100P195产生式(3)#whileM1x<y do if a>b then x:=x+1 else y:=x##whileM1E1doif a>b then x:=x+1 else y:=x#100(j<,x,y,0)(E1.t_l=100;E1.f_l=101;)101(j,_,_,0)#whileM1E1doM2if a>b then x:=x+1 else y:=x#M2.quad=102 P195产生式(3)#whileM1 E1doM2 if a>b then x:=x+1 else y:=x##whileM1E1doM2if E2then x:=x+1 else y:=x#102(j>,a,b,0)(E2.t_l=102;E2.f_l=103;)103(j,_,_,0)#whileM1E1doM2if E2thenM3x:=x+1 else y:=x# M3.quad=104P195产生式(3)#whileM1E1doM2if E2thenM3x:=x+1 else y:=x# 104(+,x,1,T)105(:=,T,_,x)#whileM1E1doM2if E2thenM3S1else y:=x# S1.nextlist=’∧’#whileM1E1doM2if E2thenM3S1N else y:=x# N.nextlist=106106(j,_,_,0)#whileM1E1doM2if E2thenM3S1Nelse y:=x# P195 产生式(2)#whileM1E1doM2if E2thenM3S1Nelse M4y:=x# M4.quad=107P195产生式(3)#whileM1E1doM2if E2thenM3S1Nelse M4y:=x ##whileM1E1doM2if E2thenM3S1Nelse M4S2# 107(:=,x,_,y)S2.nextlist=’∧’#whileM1E1doM2S3# P195产生式(1)backpatch(E2.t_l,M3.quad)使102(j>, a, b, 104)backpatch(E2.f_l,M4.quad)使103(j, _, _, 107)S3.nextlist=( S1.nextlist,N.nextlist,S2.nextlist ) 使S3.nextlist=106#S #P195产生式(5)backpatch(S3.nextlist,M1.quad)使106(j, _, _, 100)backpatch(E1.t_l,M2.quad)使100(j<, x, y, 102)S.nextlist:= E1.f_l=101使101(j, _, _, 109)108(j,_,_,M1.quad)使108(j, _, _, 100)j<,x,y,102j,_,_,109j>,a,b,j,_,_,107+,x,1,T):=,T,_,xj,_,_,100:=,x,_,y)j,_,_,100例2:语法制导翻译下列语句为四元式形式:while a < b doif c < 5 then while x > y do z := x + 1 else x := y语法制导翻译生成四元式栈内容输入串语义规则(生成四元式)#whileM1a<b do if c<5 then while x>y do z:=x+1 …# M1.quad=100P195产生式(3)#whileM1a<b do if c<5 then while x>y do z:=x+1 else…##whileM1E1do if c<5 then while x>y do z:=x+1 else…# 100(j<, a, b, 0)(E1.t_l=100;E1.f_l=101;)101(j, _, _, 0)#whileM1E1doM2if c<5 then while x>y do z:=x+1 else…# M2.quad=102 P195产生式(3)#whileM1 E1doM2 if c<5 then while x>y do z:=x+1 else…##whileM1E1doM2if E2then while x>y do z:=x+1 else x:=y# 102(j<, c, 5, 0)(E2.t_l=102;E2.f_l=103;)103(j, _, _, 0)#whileM1E1doM2if E2thenM3while x>y do z:=x+1 else x:=y# M3.quad=104P195产生式(3)#whileM1E1doM2if E2thenM3whileM4do z:=x+1else x:=y# M4.quad=104P195产生式(3)#whileM1E1doM2if E2thenM3whileM4x>y do z:=x+1elsex:=y# 104(j>, x, y, 0)105(j, _, _, 0)#whileM1E1doM2if E2thenM3whileM4E3do z:=x+1else x:=y# (E3.t_l=104;E3.f_l=105;)#whileM1E1doM2if E2thenM3whileM4E3do M5 z:=x+1else x:=y# M5.quad=106P195产生式(3)#whileM1E1doM2if E2thenM3whileM4E3doM5z:=x+1 elsex:=y# 106(+, x, 1, T)107(:=, T, _, z)#whileM1E1doM2if E2thenM3whileM4E3doM5S1else x:=y# S1.nextlist=’∧’#whileM1E1doM2if E2thenM3S2else x:=y# 108(j, _, _, 104)因M4.quad=104S1.nextlist为空,不需回填。

while循环语句的文法

while循环语句的文法

while循环语句的文法1. 语法格式while (expression) {statement(s);}其中:expression 是一个布尔表达式,用于决定是否执行循环体内的语句。

statement(s) 是循环体内的语句,当 expression 为 true 时,这些语句将被反复执行。

2. 执行过程当 while 循环语句执行时,首先会计算 expression 的值。

如果expression 的值为 true,则执行循环体内的语句。

随后,expression 的值再次被计算,如果仍然为 true,则再次执行循环体内的语句。

这个过程一直持续到 expression 的值为 false。

3. 注意事项在使用 while 循环语句时,需要注意以下几点:expression 必须是一个布尔表达式,否则编译器会报错。

statement(s) 可以是任何有效的 Java 语句,包括其他循环语句、条件语句等。

在使用 while 循环语句时,应该确保循环体内的语句能够最终使expression 的值为 false,否则循环将无限执行下去。

4. 应用示例以下是一个使用 while 循环语句的示例,该循环将从控制台读取用户输入的数字,并计算这些数字的和,直到用户输入一个负数为止:javaimport java.util.Scanner;public class WhileLoopExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 初始化变量int sum = 0;int number;// 循环读取用户输入的数字while (true) {System.out.print("Enter a number (or a negative number to quit): ");number = scanner.nextInt();// 如果用户输入了一个负数,则退出循环if (number < 0) {break;}// 将用户输入的数字添加到 sum 中sum += number;}// 打印计算结果System.out.println("The sum of the numbers you entered is: " + sum);}}5. 常见错误在使用 while 循环语句时,常见的错误包括:忘记在 expression 中使用布尔运算符,导致编译器报错。

WHILE循环语句的翻译程序设计(LR方法、输出四元式)资料

WHILE循环语句的翻译程序设计(LR方法、输出四元式)资料

目录课程设计任务书 (1)1系统描述 (2)2文法及属性文法描述 (2)2.1文法的描述 (2)2.2属性文法的描述 (2)3语法分析方法描述及语法分析表设计 (2)3.1语法分析表设计 (2)3.1.1文法的DFA (3)3.1.2LR(0)分析表 (4)3.1.3LR(0)分析方法描述说明 (4)4中间代码形式的描述及中间代码序列的结构设计 (4)5编译系统的概要设计 (5)5.1词法分析 (5)5.2语法分析 (6)5.3语法制导翻译 (7)6详细的算法描述 (8)7 软件的测试方法和测试结果 (14)8小结与体会 (18)9参考文献 (18)本科生课程设计成绩评定表 (20)课程设计任务书学生姓名:王世创专业班级:计算机0909班指导教师:高曙工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(LR方法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

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

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

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

(2)完成题目要求的中间代码四元式的描述。

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

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

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

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

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

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

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

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

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

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

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

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

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

2 文法及属性文法的描述2.1文法描述<while语句> ::= while (<条件表达式>) (<赋值语句> | <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 -> (E)F | iF | nFF -> +EF | -EF | *EF | /EF | ε2.3属性文法的描述产生式属性文法S -> while (B) S1 S.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 , relop. 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 -> 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 语法分析方法描述按照递归下降分析技术,递归下降识别程序是由一组子程序组成,每个子程序对应于一个非终结符号。

if和while语句的翻译

if和while语句的翻译
&& ||进行短路运算见“简单C编译器.ppt”
(3)混用布尔与算术表达式,如(a&&b)+c
见“简单C编译器.ppt”
Expression分为算术和布尔表达式,
算术表达式:+ - * /构成
布尔表达式: && || & |构成
(可以像Java一样分开处理,也可以像C语言一样合在一起处理
Java在这方面的处理更安全些,可避免以下错误
inta = 3;
if(a = 4){//本意是判断a是否等于4,结果写成了a=4
}

//翻译完statement,要产生一条Jmp跳回while的开始位置,重新进行判断
//同时,可知statement中出口未知的四元式也应跳往while的开始位置
//回填出口的功能由myc中的backpatch来完成
(2)布尔表达式置于if和while中
& |非短路运算把&看成*把|看成+,类似于算术表达式的翻译
翻译需要用到的四元式代码形如:
29:Jtrue 3 0 31//若3号内存单元为真,跳往31号四元式
30:Jmp 0 0 35//跳往35号四元式
(1)先考虑把算术表达式当布尔值用C语言支持,Java不支持
int a = 1;
int b = 2;
// if问题:if为假跳往何处?
if(a){
a =f(a){
a = 30;//问题:此处如何处理?要跳往何处?
}else{
a =40;
}
// while问题:while为假跳往何处?
while(a){
a = a-1;
}

程序设计的基本知识while

程序设计的基本知识while

程序设计的基本知识while程序设计的基本知识while在计算机程序设计中,while循环是一种非常基本而重要的结构,它是用于重复执行一段代码直到某个条件不成立的循环结构。

在实际编程中,while循环经常被用于遍历数组、读取文件、等待输入、处理大量数据等等。

本文将详细介绍while循环的语法、使用方法及常见问题。

1. 语法结构while循环有一个简单的语法结构,如下所示:while (condition) { // 待重复执行的代码 }其中,condition是一个逻辑条件表达式,只有当这个表达式的值为真时,循环体中的代码才会被执行。

循环体是由{}包围的一系列语句,它们会被不断地执行直到condition的值变为假。

当condition的值为假时,程序会跳出循环并继续执行循环外的代码。

2. 范例代码下面是一个简单的while循环的范例代码:int i = 0; while (i < 5) { cout << i << endl; i++; }该代码段中,定义了一个变量i并初始化为0,然后通过while循环输出了5个数字。

在每次循环时,首先检查i是否小于5,如果是,则输出i的值并将i加1,然后进入下一轮循环;如果不是,则程序跳出循环并继续执行之后的代码。

3. 常见问题3.1 while循环中的坑虽然while循环的语法结构非常简单,但在实际编程中却有一些潜在的问题需要注意。

其中,最常见的就是无限循环问题。

在编写while循环时,必须特别注意循环条件表达式的正确性,否则很容易导致无限循环的情况出现。

例如,下面这个经典的错误代码段:int i = 0; while (i < 5) { // ... }在这个代码中,变量i的值一开始为0,然后在每次循环结束之后都没有更新,因此循环条件i < 5永远不会变为假,程序将一直循环下去,直到程序崩溃或者系统死机。

要避免这种问题,必须在循环体中及时更新循环变量的值,确保循环条件能够在合适的时候退出循环。

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

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)步骤直到规约完输入符号串,栈中只剩文法的开始符号为止。

2.2.2 优先关系矩阵:3 中间代码3.1中间代码形式的描述中间代码通过四元式给出。

四元式的四个组成成分是:算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT。

运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。

3.2 中间代码序列的结构设计通过词法分析及语法分析之后,取出其中的运算表达式。

对表达式进行分析。

其中,先乘除后加减,先运算括号内的。

如a=b*c+b*d 的四元式表示如下:1) (*,b, c, t1)2) (*, b, d, t2)3) (+, t2, t3, t3)4) (=, t3, -, a)4 编译系统的概要设计及部分流程图1 通过程序,在1.txt文本中输入while语句。

对文本进行扫描,通过词法分析函数cifa()对输入的while语句进行词法分析。

2 将已算好的优先关系矩阵放至程序中,通过函数Guanxi()输出优先关系矩阵到guanxi.txt文件中。

3 对已进行词法分析的while语句进行语法分析,分析函数为JanDan()。

其中包含对错误语句的报错处理。

同时,对可以进行四元式输出的运算表达式进行输出。

4 通过四元式输出函数Siyuan()将运算表达式表示为四元式的形式,输出到siyuan.txt文件中。

整体框图:词法分析程序框图5 源程序与执行结果(含测试方法和测试结果)5.1 源程序5.1.1 词法分析函数void cifa()//词法分析程序{char a[100];char ch;ifstream infile("1.txt",ios::in);for(int i=0;i<100;i++){infile.get(ch);if(ch!='#')a[i]=ch;else {a[i]=ch;break;}}i=0;int m;cout<<"词法分析结果见cifa.txt文件内!"<<endl;while(i<100){m=Judge(a[i]);//第一个字符的形式if(m==1) i=Keyword(i,a);//关键字else if (m==2) i=Numb(i,a);//数字else if (m==3) i=YunSuan(i,a);//运算符else if (m==4) i=JieFu(i,a);//界符else if (m==5) i++;//空格else if (m==6) i++;//回车else if (m==7) return;//“#”号else break;}}5.1.2 简单优先法void JanDan(int Q){cout<<"简单优先法部分步骤输出到jiandan.txt文件中!"<<endl;coutj<<"简单优先法,部分步骤:"<<endl;S1="w(B){E}";//产生式E1="C";C1="CA";C2="A";A1="iPA";A2="i;";B1="iTi";B2="i";string str2;for(t=0;t<Q;t++){if(JD[t]=="while")R[t]='w';else if(JD[t]=="(")R[t]='(';else if(JD[t]==")")R[t]=')';else if(JD[t]=="{")R[t]='{';else if(JD[t]=="}")R[t]='}';else if(JD[t]==";")R[t]=';';elseif(JD[t]=="+"||JD[t]=="-"||JD[t]=="*"||J D[t]=="/"||JD[t]=="=")R[t]='P';elseif(JD[t]==">"||JD[t]=="<"||JD[t]==">="|| JD[t]=="<="||JD[t]=="==")R[t]='T';else R[t]='i';}R[t]='#';// cout<<"R="<<R<<endl;int a1=1,m,z,x;int n;t=1;char a[50]="\0";a[0]=R[0];loop4:while(t<=Q){z= Panduan(a[a1-1],R[t]);if(z==0||z==-1){coutj<<setw(20)<<a;x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<endl;a[a1]=R[t];a1++;t++;}else if(z==1){m=0;a1--;t--;coutj<<setw(20)<<a;goto loop5;}else if(z==2){coutj<<"a["<<a1-1<<"]="<<a[a1-1] <<" "<<"R["<<t<<"]"<<R[t]<<endl;coutj<<"1错误,这不是文法的句子!"<<endl;return;}}loop5:if((a1-m-1)>=0){z=Panduan(a[a1-m-1],a[a1-m]);}else z=-1;if(z==2){coutj<<"2错误,这不是文法的句子"<<endl;return;}else if(z==0||z==1){m++;goto loop5;}else if(z==-1){n=a1-m;str="\0";for(;m>=0;m--){str2="\0";str2=a[a1-m];str=str+str2;a[a1-m]='\0';}if(str==S1){a[n]='S';x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要归约的是:"<<str<<endl;coutj<<setw(20)<<a;coutj<<setw(20)<<"归约结束!"<<endl;return;}else if(str==E1){a[n]='E';a1=n;a1++;t++;x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要规约的是:"<<str<<endl;}else if(str==C1||str==C2){a[n]='C';a1=n;a1++;t++;x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要规约的是:"<<str<<endl;}else if(str==A1||str==A2){a[n]='A';a1=n;a1++;t++;Siyuan(str);x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要规约的是:"<<str<<endl;}else if(str==B1||str==B2){a[n]='B';a1=n;a1++;t++;Siyuan(str);x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要规约的是:"<<str<<endl;}else{coutj<<" "<<"3错误,归约失败!"<<endl;return;}goto loop4;}}5.1.3 四元式输出void Siyuan(string str){//cout<<"str="<<str<<endl;int m=0,n=0;while(str[m])m++;if(str[m-1]==';')//对A{if(S[t-u-2]==0){couts<<"T"<<j<<":(";couts<<"=,"<<"T"<<j<<","<<JD[t-u-2]<<",T"<<j<<")"<<endl;j++;}else{couts<<"T"<<j<<":(";couts<<"=,"<<"T"<<j<<","<<S[t-u-2]<<",T"<<j<<")"<<endl;j++;}u=u+3;}else if(str[m-1]=='i')//对B{if(S[t-3]==0&&S[t-1]!=0){couts<<"B"<<j<<":(";couts<<JD[t-2]<<",";couts<<JD[t-3]<<",";couts<<S[t-1]<<",B"<<j<<")"<<en dl;j++;}else if(S[t-3]!=0&&S[t-1]!=0){couts<<"B"<<j<<":(";couts<<JD[t-2]<<",";couts<<S[t-3]<<",";couts<<S[t-1]<<",B"<<j<<")"<<en dl;j++;}else if(S[t-3]==0&&S[t-1]==0){couts<<"B"<<j<<":(";couts<<JD[t-2]<<",";couts<<JD[t-3]<<",";couts<<JD[t-1]<<",B"<<j<<")"<<e ndl;j++;}else if(S[t-3]!=0&&S[t-1]==0){couts<<"B"<<j<<":(";couts<<JD[t-2]<<",";couts<<S[t-3]<<",";couts<<JD[t-1]<<",B"<<j<<")"<<e ndl;j++;}}else if(str[m-1]=='A')//对A{if(S[t-u-4]==0){couts<<"T"<<j<<":(";couts<<JD[t-u-3]<<",";couts<<JD[t-u-4]<<",T"<<j-1<<",T "<<j<<")"<<endl;j++;}else{couts<<"T"<<j<<":(";couts<<JD[t-u-3]<<",";couts<<S[t-u-4]<<",T"<<j-1<<",T" <<j<<")"<<endl;j++;}u=u+3;}}5.2 执行结果5.2.1 执行方法:编译,链接,运行。

相关文档
最新文档