FOR循环语句的翻译程序设计
编译原理报告for循环语句的翻译程序

学号:0120810680326课程设计题目f or循环语句的翻译程序学院计算机学院专业软件工程班级0803姓名徐泽前指导教师何九周2011 年 6 月日目录1设计目的 (4)2设计环境与工具 (4)3设计任务要求与说明 (4)4设计时间 (4)5设计地点 (4)6系统描述 (4)7文法及属性文法的描述 (5)7.1文法描述 (5)7.1.1 FOR语句相关的产生式: (5)7.1.2 布尔表达式: (5)7.1.3 赋值表达式: (5)7.2属性文法的描述 (5)8 语法分析方法描述及语法分析表设计 (7)8.1语法分析方法描述 (7)8.2系统中使用的action和goto表(见附录1) (9)9 给出中间代码形式的描述及中间代码序列的结构设计 (9)10简要的分析与概要设计 (10)11 详细的算法描述 (11)11.1词法分析的数据结构设计与详细的流程图 (11)11.2词法分析流程图 (11)11.3语法制导翻译的数据结构与详细的设计图 (12)11.3.1数据结构的设计 (12)11.3.2算法描述 (13)11.3.3程序流程图 (13)12给出软件的测试方法和测试结果 (14)12.1 FOR循环语句的测试 (14)12.2词法分析出错处理 (15)12.3语法分析出错处理 (16)13收获与体会 (16)14 参考文献 (17)课程设计任务书学生姓名:徐泽前专业班级:软件0803班指导教师:何九周工作单位:计算机学院题目: for循环语句的翻译程序初始条件:程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。
算法:可以根据《编译原理》课程所讲授的算法进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求)1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
C语言程序设计_05循环结构程序设计

5.2 DO…WHILE循环结构 5.2.1 DO…WHILE语句的格式 DO…WHILE语句的一般格式为: DO 语句 WHILE(表达式); DO…WHILE语句中的表达式表示循环的条件,可 以是任何表达式,常用的是关系表达式和逻辑表达 式。表达式必须加圆括号。语句是重复执行的部分, 称作循环体。
由亍循环体在表达式2乊后表达式3乊前执行所以把循环体语句放在表达式3的开头循环体语句不原来的i构成逗号表达式作为循环语句新的表达式3从而也就没有循环体语句了
第5章 循环结构程序设计
5.1 WHILE循环结构 5.2 DO…WHILE循环结构 5.3 FOR循环结构 5.4 与循环有关的控制语句 5.5 3种循环语句的比较 5.6 循环的嵌套 5.7 循环结构程序举例 本章小结
图5-6 FOR语句执行过 程
FOR语句的执行过程如图5-6所示。具体由以下几步 完成: (1)求表达式1。 (2)求表达式2,并判定其值为0或非0。若值为非0, 转步骤(3);否则结束FOR语句。 (3)执行语句,然后求表达式3。 (4)转向步骤(2)。 由FOR语句的执行流程可知,表达式1的作用是为循 环控制的有关变量赋初值,表达式2是循环控制条件, 表达式3用于修正有关变量,语句是重复执行部分。
【例5.7】输入20个数,求出其中的最大值与最小值。
5.3.3 FOR语句的各种变形 1.在FOR语句中省略表达式 FOR语句中的3个表达式可以部分或全部省略,下面 给出语句的4种基本变形。 (1)表达式1移至FOR语句前,但它后面的分号必 须保留。这时FOR语句的形式为: 表达式1; FOR(; 表达式2; 表达式3) 语句
(2)表达式3移至循环体语句之后,但它前面的分 号必须保留。FOR语句的形式为: FOR(表达式1; 表达式2;) { 语句; 表达式3; } 对于求P=5!的程序段,省略表达式3,将其放在循环 体中,则程序段写成:
批处理命令——for

批处理命令——for【1】for命令简介 先把for循环与for命令类⽐⼀下,这样学习理解快。
for 循环语句,⼀般格式如下:1for (表达式1;表达式2;表达式3)2 {3循环体;4 } 1. 表达式1 ⼀般为初始状态赋值表达式,给控制变量赋初值。
2. 表达式2 ⼀般为关系表达式或逻辑表达式,为循环控制条件。
3. 表达式3 ⼀般为每次执⾏循环体后向控制变量重新赋值的表达式(给控制变量增量或减量)。
4. 语句:循环体,⼀般为复合语句(即可能需要执⾏多条语句)。
举个实例:1for (int i=0; i < 100; ++i)2 {3 cout << i << endl;4 } for 命令,⼀般格式如下: 在cmd窗⼝中使⽤格式:FOR %variable IN (set) DO command [command-parameters] 在批处理脚本中使⽤格式:FOR %%variable IN (set) DO command [command-parameters] 1. 在cmd窗⼝中使⽤,变量名必须⽤单%引⽤(即:%variable);在批处理脚本中使⽤,变量名必须⽤双%引⽤(即:%%variable)。
2. for、in和do是for命令的三个关键字,缺⼀不可。
3. 关键字in之后,do之前的括号不能省略。
举个实例:新建⼀个⽂本⽂件,命名为fordemo,修改⽂件类型为bat,⽤Notepad++打开编辑内容为:1@echo off2for %%i in (1 2 3 4 5) do@echo %%i3pause>nul 执⾏结果: 嗯哼,原来for命令就这么简单?嗨,同学,不要浮躁,保持冷静,更要理智。
下⾯,且看对上例语句的分析: 从命令组成结构由左向右剖析,除过关键字,依次分别为: 1. 变量名为i,i太简单,作为变量名不具备见名知意的特点。
【计算机二级】Python类

【计算机⼆级】Python类1.程序设计语⾔的发展经历了从机器语⾔,汇编语⾔,到⾼级语⾔的发展历程2.程序设计语⾔是计算机能够理解和识别⽤户操作意图的⼀种交互体系,它按照特定规则组织计算机指令,使计算机能够⾃动进⾏各种运算处理,按照程序设计语⾔规则组织起来的⼀组计算机指令称为计算机程序3.⾼级编程语⾔根据执⾏机制不同可分为两类:静态语⾔和脚本语⾔,静态语⾔采⽤编译⽅式执⾏,脚本语⾔采⽤解释⽅式执⾏。
eg:C语⾔是静态语⾔,Python是脚本语⾔4.解释和编译编译是将源代码转换成⽬标代码的过程,通常源代码是⾼级语⾔代码,⽬标代码是机器语⾔代码,执⾏编译的计算机程序称为编译器解释是将源代码逐条转换成⽬标代码同时逐条运⾏⽬标代码的过程。
执⾏解释的计算机程序称为解释器编译是⼀次性地翻译,⼀旦程序被翻译,不再需要编译程序或者源代码。
对于相同源代码,编译所产⽣地⽬标代码执⾏速度更快,⽬标代码不需要编译器就可以运⾏,再同类型操作系统上使⽤灵活解释在每次程序运⾏时都需要解释器和源代码,解释执⾏需要保留源代码,程序纠错和维护⼗分⽅便。
只要存在解释器,源代码可以在任何操作系统上运⾏,可移植性好5.编译和解释的区别与计算机的交流⽅式不同解释程序不产⽣⽬标代码,它逐条地取出源程序中的语句,边解释,边执⾏;解释器把源代码⽂件边解释成机器语⾔边交给CPU执⾏编译时将源程序翻译成可执⾏的⽬标代码,执⾏可执⾏⽂件,翻译与执⾏时分开的运⾏环境不同解释程序可跨平台使⽤,因为解释器已经做好了对不同平台的交互处理,⽤户写的源代码不需要再考虑差异性,源代码所有平台都可以直接执⾏编译程序跨平台性不好,不同操作系统,调⽤底层的机器指令不同,需为不同平台⽣成不同的机器码⽂件开发便捷性解释程序可以随时修改,⽴刻⽣效,改完源代码后,直接运⾏看效果编译程序每次修改源代码,都要重新编译,⽣成机器码⽂件运⾏速度解释程序运⾏效率低,所有的代码均需要经过解释器边解释边执⾏,速度⽐编译型慢很多编译程序执⾏速度快,因为你的程序代码已经翻译成了时计算机可以理解的机器语⾔6.Python's historyPython语⾔创⽴者:Guido van Rossum2002 Python 2.x2008 Python 3.x7.python语⾔程序运⾏(--->.9.)交互式⽂件式编程⽅法输⼊(input)处理(process)输出(output)语⾔特点通⽤性Python语⾔可以⽤于⼏乎任何与程序设计相关应⽤的开发,不仅适合训练编程思维,更适合诸如数据分析,机器学习,⼈⼯智能,Web开发等具体的技术领域语法简洁Python语法主要⽤来精确表达问题逻辑,更接近⾃然语⾔,只有33个保留字,⼗分简洁1.and⽤于表达式运算,(逻辑)与操作2.as⽤于类型转换3.assert断⾔,⽤于判断变量或条件表达式的值是否为真4.break中断循环语句5.class⽤于定义类6.continue继续执⾏下⼀次循环7.def⽤于定义函数或⽅法8.del删除变量或者序列的值9.elif条件语句与if else结合使⽤10.else条件语句,与if,elif结合使⽤,也可以⽤于异常和循环使⽤11.except包括捕获异常后的操作代码,和try,finally结合使⽤12.finally⽤于异常语句,出现异常后,始终要执⾏finally包含的代码块,与try,except结合使⽤13.for循环语句14.from⽤于导⼊模块,与import结合使⽤15.global定义全局变量16.if条件语句,与else,elif结合使⽤17.import导⼊模块,与from结合使⽤18.in判断变量是否存在序列中19.is判断变量是否为某个类的实例mbda定义匿名函数21.nonlocal声明的变量不是局部变量,也不是全局变量,⽽是外部嵌套函数内的变量。
C语言程序设计教程第2版 课后答案_人民邮电出版社_宗大华_陈吉人_百度

本文由airalex1982贡献 pdf文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
《C 语言程序设计教程(第 2 版) 》习题解答 第 1 章习题解答 一、填空 1.机器语言即是指计算机本身自带的 指令系统 。
完成这个翻译工作 2. 将汇编语言编写的程序翻译成机器语言程序的过程称为 汇编 , 的程序称为 汇编程序 。
3.在C语言程序中,写“\110”和写“\x68” ,分别代表字母 H 和字母 h 。
4.在用New命令创建新的C源程序时,文件名默认为是 NOMANE.C 。
5.C语言程序都是从名为 main 的函数它开始执行的。
二、选择 1.下面给出的命令中, (C)不能保存源程序对应的“.OBJ”文件。
A.Make EXE File B.Run C.Save D.Compile to OBJ 分析:Compile to OBJ 是文件的编译命令;Make EXE File 是一次完成编译和连接的命 令;在没有编译、连接的前提下,直接使用 Run 命令,就会先完成编译,再进行连接,最 后运行。
所以,这三个命令都会保存由源程序产生出的“.OBJ”文件。
而 Save 命令用于编 辑完源程序后,对源程序的保存,即保存“.C”文件。
因此,本题的答案应该是选择 C。
2.下面给出的编辑命令中, (B)是用来定义块首标记的。
A.Ctrl-KK B.Ctrl-KB C.Ctrl-KV D.Ctrl-KH 3.下面给出的编辑命令中, (A)是用来定义块尾标记的。
A.Ctrl-KK B.Ctrl-KB C.Ctrl-KV D.Ctrl-KH 4.以下的(C)是不正确的转义字符。
A.’\\’ B.’\’’ C.’\81’ D.’\0’ 5.转义字符\x65 对应的字母是(C) 。
A.A B.a C.e D.E 三、是非判断(√,×) 1.Turbo C 中,只有命令 New 才能创建新的源程序文件。
计算机基础与程序设计知识点

1.电脑内部储存、处理、加工和传输汉字时使用的是汉字机内码。
2.Cache是为了解决CPU与储存器速度不匹配的问题。
3.蠕虫病毒是对电脑软件系统造成极大危害,他是一段特制的程序。
4.在C#中可以标识不同控件的属性是Name.5.在C#中不能作为变量名的是long.6.关于变量的声明和初始化,语句正确的选项是double x=137.不属于C#循环的中断语句的是jump语句。
8.设数组定义为:int[,]a=new int[5,6];,则以下数组元素的引用正确的选项是a[0,0]9.在C#中,不会显示在窗体上的控件是ImageList10.如果每隔15S产生一个定时器事件,则Timer的Interval属性应设置为1500011.在C#中,如果不希望类被继承,则定义类时要使用关键字sealed12.如果某个类程序员属于整个类而不属于类的某一个具体实例,则该程序员前需用修饰符static13.在C#中,对文本文件进行读取通常使用StreamReader类14.SQL Server 2008实一个关系模型数据库。
15.在中,用于对数数据源执行SQL命令语句的对象是Command对象。
16.以下软件工具中,不属于软件开发工具的是版本控制工具。
17.主要用于面向对象的开发过程的模型是喷泉模型。
18.在数据流图中,用圆或圆角矩形表示加工。
19.为了提高模块的独立性,模块之间最好是数据耦合。
20.在微型电脑中,西文字符一般采用ASCII 码进行编码。
21.文件型病毒通常寄生在可执行文件中。
22.C#程序的入口函数是Main 函数。
23.在C#中。
注释有两种方法,其中/* */可以进行多行注释。
24.已知数组mun的定义为:int[]num=new int[5]{5,4,3,2,1};,则num.Length=525.已知某类的类名Studend,则该类的析构函数名为~Student绘图时,默认的坐标原点在窗体和控件的左上角。
武汉理工大学编译原理课设

二---十进制的语法分析及语义分析程序设计----算符优先分析法1.系统描述1.1目的通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。
1.2算符优先分析方法原理:算符优先分析方法是根据算符之间的优先关系而设计的一种自下而上的分析方法。
算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。
算符优先分析过程是自下而上的归约过程,所谓的算符优先分析就是定义算符之间(确切地说,终结符之间)的某种优先关系,借助于这种优先关系寻找“可归约串”和进行归约。
该文法必须满足以下条件:文法它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下产生式右部:…QR…;首先求出该文法的优先关系表,在程序中用2维数组表示,-1表示小于或者等于,大于为1,其它为0表示错误。
在输入一串字符串以后进行按照文法一步一步的进行规约,我所进行的是直接规约到文法的符号而不是规约到N。
数据结构使用的是链表,用一个STRUCT来表示一个元素,其中包含符号和下一个符号的指针。
2.翻译方法概述2.1语法分析采用递归下降方法,为对应文法中的每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串。
若输入串是给定文法的句子,则从文法的开始符号出发一定能推导出与输入的单词串完全相同的句子。
语法分析是编译过程的一个逻辑阶段。
语法分析的任务是在的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。
语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。
语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。
语法分析的主要工作:是识别由词法分析给出的单词序列是否是给定的正确句子(程序)。
C语言程序设计知识点—第5章 循环控制

4. 比较 while 和 do-while
while 循环和 do-while 循环的区别 语法不同 while ( 循环条件 ) { 循环操作 } 先判断,再执行 do { 循环操作 } while( 循环条件 ); 先执行,再判断
初始情况不满足循环条件时 1. while 循环一次都不会执行 2. do-while 循环不管任何情况都至少执行一次 [注]通常情况 while,do—while 可互换,但以下情况例外 #include “stdio.h” int main() { n=101; while(n<100) { printf(“n=%d\n”,n); } return 0; } 代码填空: 实现整数反转 #include<stdio.h> void main( ) { ~4~ #include “stdio.h” int main() { n=101; do { printf(“n=%d\n”,n); }while(n<100); return 0; }
C 语言程序设计知识点
主讲教师:杨剑
int i = 0; while (i < 4 ){ printf(“欢迎同学"); i ++ ; } } 问:循环一直执行,不会退出,哪里出错了? 注:永远都不会退出的循环称为死循环 循环的次数原则上应该是有穷的,也就是说,循环要有出口,否则成为死循环 /* 打印 4 次“欢迎同学” */ void main(){ int i= 1; while ( i <4 ){ printf ( “欢迎同学学员"); i ++; } } 问:只打印了三次 ,哪里出错了? 注:注意检查循环次数是否满足需求 /* 打印 4 次“欢迎同学” */ void main(){ int i = 0; while ( i > 5 ){ printf("欢迎欢迎同学"); i ++; } } 问:一次都没有打印,哪里出错了? 注意:如果一开始条件就不满足,while 循环一次都不执行 [课堂练习]找出 100 以内的奇数。 #include <stdio.h> int main() { int sum=0,i=1; while(i<=100) { sum=sum+i; i=i+2; } return 0; } [练习] 2006 年在校学生 1 万人,每年增长 25%,请问按此增长速度,到哪一年在校 学生人数将达到 10 万人? 提示: ~2~
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录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 ;} gotoS→ f ( E ; X ; Y ){ H ;} gotoE→ 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.valueH→ id 1 = id 2 + c id 1.value= id 2 .value + c.valueH→ id 1 = c+ id 2id 1 .value= c.value + id 2 .value其中产生式规则中的符号: c 表示常数const ,f表示关键字for ,i表示一般标识符id3语法分析表设计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循环语句:"<<endl; //提示用户输入程序getline(cin,s); //接受用户输入并保存在s中getSym(s,i); //调用词法分析程序r=nodeSize;for(i=0;i<r;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则保存该标识符的值。