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.普通声明语句的翻译下面就是声明语句的文法:p→progid(input,output)d;sd→d;d|list:t|procidd;slist→list1,id|idt→integer|real|arraycoft1|?t1|recorddc→[num]c|ε声明语句的翻译模式:p→progid(input,output){offset:=0}d;sd→d;dd→id:t{enter(,t.type,offset);offset:=offset+t.width}t→integer{t.type: =integer;t.width:=4}t→real{t.type:=real;t.width:=8}t→array[num]oft1{t.type:=array(num.val,t1.type);t.width:=num.val×t1.width}t →↑t1{t.type:=pointer(t1.type);t.width:=4}2.嵌套过程中声明语句的翻译嵌套过程声明语句的产生式。
p→progid(input,output)d;sd→d;d|id:t|procid;d;s(7.1)嵌套过程声明语句的译者模式:p→progid(input,output)md;s{addwidth(top(tblptr),top(offset));pop(tblptr);pop(offset)}m→ε{t:=mktable(nil);push(t,tblptr);push(0,offset)}d→d1;d2d→procid;nd1;s{t:=top(tblptr);addwidth(t,top(offset));pop(tblptr);pop(offset);enterproc(top(tblptr),,t)}d→id:t{enter(top(tblptr),,t.type,top(offset));top(offset):=top(offset)+t.width}n→ε{t:=mktable(top(tblptr));push(t,tblptr);push(0,offset)}3.记录的翻译下面就是分解成记录类型的产生式:t→recorddend生成记录类型的翻译模式:t→recordldend{t.type:=record(top(tblptr));t.width:=top(offset);pop(tblptr);pop(offset)}l→ε{t:=mktable(nil);push(t,tblptr);push(0,offset)}4.赋值语句的翻译下面就是典型的赋值语句文法:s→left:=ee→e1+e2|e1*e2|-e1|(e1)|leftleft→elist]|idelist→elist,e|id[e(7.2)赋值语句的译者模式:⑴s→left:=e{ifleft.offset=nullthen/*left是简单变量id*/gencode(left.addr':='e.addr);1elsegencode(left.addr'['left.offset']'':='e.addr)}/*left是数组元素*/⑵e→e1+e2{e.addr:=newtemp;gencode(e.addr':='e1.addr'+'e2.addr)}⑶e→(e1){e.ad dr:=e1.addr}⑷e→left{ifleft.offset=nullthen/*left是简单id*/e.addr:=left.addrelsebegin/*left是数组元素*/e.addr:=newtemp;gencode(e.addr':='left.addr'['left.offset']')end}⑸left→elist]{left.addr:=newtemp;/*left就是数组元素,因此放置基址和加速度*/left.offset:=newtemp;gencode(left.addr':='c(elist.array));gencode(left.offset':='elist.addr'*'width(elist.array))}⑹left→id{left.addr:=id.addr;left.offset:=null}⑺elist→elist1,e{t:=newtemp;m :=elist1.ndim+1;gencode(t':='elist1.addr'*'limit(elist1.array,m));/*计算em-1×nm*/gencode(t':='t'+'e.addr);/*计算+im*/elist.array:=elist1.array;elist.addr:=t;elist.ndim:=m}⑻elist→id[e{elist.array:=id.addr;elist.addr:=e.addr;elist.ndim:=1}5.各种控制结构的翻译5.1布尔表达式的翻译布尔表达式的文法为:⑴b→b1ormb2⑵b→b1andmb2⑶b→notb1⑷b→(b1)⑸b→e1relope2⑹b→true⑺b→false ⑻m→ε布尔表达式的翻译模式如下所示:⑴b→b1ormb2{backpatch(b1.falselist,m.quad);b.truelist:=me rge(b1.truelist,b2.t ruelist);b.falselist:=b2.falselist}⑵b→b1andmb2{backpatch(b1.truelist,m.quad) ;b.truelist:=b2.truelist;b.falselist:=merge(b1.falselist,b2.falselist)}⑶b→no tb1{b.truelist:=b1.falselist;b.falselist:=b1.truelist}⑷b→(b1){b.truelist:=b1 .truelis t;b.falselist:=b1.falselist}⑸b→e1relope2{b.truelist:=makelist(nextqu ad);b.falselist:=makelist(nextquad+1);2gencode('if'e1.addrrelop.ope1.addr'gotoc');gencode('gotoc')}⑹b→true{b.trueli st:=makelist(nextquad);gencode('gotoc')}⑺b→false{b.falselist:=m akelist(nextq uad);gencode('gotoc')}⑻m→ε{m.quad:=nextquad}5.2常用控制流语句的译者控制流语句if-then,if-then-else和while-do的文法为:⑴s→ifbthens1⑵s→ifbthens1elses2⑶s→whilebdos1⑷s→beginlend⑸s→a⑹l→l1;s ⑺l→s(7.9)if-then,if-then-else和while-do语句的翻译模式:⑴s→ifbthenm1s1nelsem2s2{b ackpatch(b.truelist,m1.quad);backpatch(b.falselist,m2.quad);s.nextlist:=merge(s1.nextlist,merge(n.nextlist,s2.nextlist))}⑵n→ε{n.nextlist:=makelist(nextquad);gencode('gotoc')}⑶m→ε{m.quad:=nextqu ad}⑷s→ifbthenms1{backpatch(b.truelist,m.quad);s.nextlist:=merge(b.falselist, s1.nextlist)}⑸s→whilem1bdom2s1{backpatch(s1.nextlist,m1.quad);backpatch(b.truelist,m2.quad);s.nextlist:=b.falselist;gencode('goto'm1.quad)}⑹s→beginlend{s.nextlist:=l.nextlist}⑺s→a{s.nextlist:=nil}⑻l→l1;ms{backpa tch(l1.nextlist,m.quad);l.nextlist:=s.nextlist}⑼l→s{l.nextlist:=s.nextlist}5.3for循环语句的译者for循环语句的文法如下所示:s→forid:=e1toe2stepe3dos1for循环语句的翻译模式如下所示:s→forid:=e1toe2stepe3doms1{backpatch(s1.nextlist,m.again,);gencode(‘goto’,-,-,m.again);s.nextlist:=m.again;}m→ε{m.addr:=entry(id);gencode(‘:=’,e1.addr,-,m.addr);t1:=newtemp;gencode(‘:=’,e2.addr,-,t1);t2:=newtemp;gen code(‘:=’,e3.addr,-,t2);q:=nextquad;gencode(‘goto’,-,-,q+2);m.again:=q+1;gencode(‘+’,m.addr,t2,m.addr);m.nextlist:=nextquad;gencod e(‘if’m.addr‘>’t1‘gotoc’);}5.4repeat语句的译者repeat语句的文法如下所示:s→repeats1untilbrepeat语句的翻译模式如下所示:s→repeatms1untilnb{backpatch(b.falselist,m.quad);s.nextlist:=b.truelist}3m→ε{m.quad:=nextquad}n→ε{backpatch(s1.nextlist,nextquad)}6.switch语句的语法制导翻译switch语句的文法为:s→switch(e)clistclist→casev:sclist|default:sswitch语句的翻译模式如下所示:⑴s→s witch(e){i:=0;si.nextlist:=0;pushsi.nextlist;pushe.addr;pushi;q:=0;pushq}clist{popq;popi;pope.addr;popsi.nextlist;s.nextlist:=merge(si.nextlist,q);push s.nextlist}⑵clist→casev:{popq;popi;i:=i+1;pope.addr;ifnextquad≠0thenbackpatch(q,nextquad);q:=ne xtquad;gencode(‘if’e.addr‘≠’vi‘goto’li);pushe.addr;pushi;pushq}s{popq;popi;pope.addr;popsi-1.nextlist;p:=nextquad;gencode(‘goto-’);gencode(li‘:’);si.nextlist:=merge(si.nextlist,p);si.nextlist:=merge(si.nextlist,si-1.nextlist);pushsi.nextlist;pushe.addr;pushi;pushq}clist⑶clist→default:{popq;popi;i:=i+1;pope.addr;ifnextquad≠0thenbackpatch(q,nextquad);q:=nextquad;gencode(‘if’e.addr‘≠’vi‘goto’vi+1);pushe.addr;pushi;pushq}s{popq;popi;pope.addr;popsi-1.nextlist;p:=nextquad;gencode(‘goto-’);gencode(li‘:’);si.nextlist:=merge(si.nextlist,p);si.nextlist:=merge(si.nextlist,si-1.nextlist);pushsi.nextlist;pushe.addr;pushi;pushq}7.过程调用和回到语句的译者过程调用和返回语句的文法如下所示:s→callid(elist)elist→elist,e|es→returne过程调用语句的译者模式如下右图:⑴s→callid(elist){n:=0;repeatn:=n+1;从queue的队首取出一个实参地址p;gencode('param',-,-,p);untilqueue为空;gencode('call',id.addr,n,-)}4⑵elist→elist,e{将e.addr嵌入至queue的队尾}⑶elist→e{初始化queue,然后将e.addr加入到queue的队尾。
编译原理课程设计_算术表达式、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函数,用来将括号部分替换为大写字母)。
新的式子中,只含有加减乘除以及赋值这四种运算,后根据优先级的不同,逐步生成四元式。
其算法流程图如右图所示。
编译原理课后习题答案
第一章1.典型的编译程序在逻辑功能上由哪几部分组成?答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。
2. 实现编译程序的主要方法有哪些?答:主要有:转换法、移植法、自展法、自动生成法。
3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式?答:编译法、解释法。
4. 编译方式和解释方式的根本区别是什么?答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快;解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。
第二章1.乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关系如何?答:1)0型文法、1型文法、2型文法、3型文法。
2)2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。
答:Z→SME | BS→1|2|3|4|5|6|7|8|9M→ε | D | MDD→0|SB→2|4|6|8E→0|B3. 设文法G为:N→ D|NDD→ 0|1|2|3|4|5|6|7|8|9请给出句子123、301和75431的最右推导和最左推导。
答:N⇒ND⇒N3⇒ND3⇒N23⇒D23⇒123N⇒ND⇒NDD⇒DDD⇒1DD⇒12D⇒123N⇒ND⇒N1⇒ND1⇒N01⇒D01⇒301N⇒ND⇒NDD⇒DDD⇒3DD⇒30D⇒301N⇒ND⇒N1⇒ND1⇒N31⇒ND31⇒N431⇒ND431⇒N5431⇒D5431⇒75431N⇒ND⇒NDD⇒NDDD⇒NDDDD⇒DDDDD⇒7DDDD⇒75DDD⇒754DD⇒7543D⇒75431 4. 证明文法S→iSeS|iS| i是二义性文法。
答:对于句型iiSeS存在两个不同的最左推导:S⇒iSeS⇒iiSesS⇒iS⇒iiSeS所以该文法是二义性文法。
2014-2015第一学期 《c语言程序设计》问题答疑材料
《C语言程序设计》问题答疑材料一、常见问题总结1.判断字符串a是否大于b,应当使用?库函数strcmp(),或者自己编写相应的函数比较,主要是字符串从左往右依次比较相应位置的字符大小。
2.一个C程序的执行是从什么开始?什么结束?从main函数的第一行开始,到main函数最后一行结束。
因为一个程序有且只有一个main函数,其他函数都是在main函数里面调用执行的。
3.C语言中用于结构化程序设计的三种基本结构是什么?顺序结构、选择结构、循环结构4.指向函数的指针是什么意思?指向函数的指针叫“函数指针”,是一个是指针变量。
C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。
5.循环语句中的break和continue有何区别?break 用于跳出循环,执行循环体的下一条语句,而continue 只是结束本次循环,然后还要判断条件,看看能不能继续下一次循环!6.C语言有哪些数据类型以及这些数据类型进行混合运算时遵循什么原则?数据类型包括:int,double,float,bool,char,struct,enum和union;混合运算时要保持类型一致,因而往往需要转换变量的数据类型,低级的数据类型要向高级类型转换!7.函数的嵌套调用和递归调用有什么不同?嵌套调用的函数不能是本身,递归调用的函数是本身。
8.传递地址和传递变量的区别?C语言中没有“变量传递”的概念,应该是“形参变量向实参变量的值传递”。
(1)、在C语言中,所有非数组形式的数据实参都是以值传递的形式调用,在值传递的过程中,被调用函数的形式参数被视为该函数的局部变量,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。
所以被调用函数不能修改作为实参的实际变量的值,而只能修改传递给他的那份备份。
(完整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循环的执行流程。
《Web程序设计》课后习题附答案
第一章1.填空题(1).NET Framework 主要包括公共语言运行库 CLR 和类库。
(2) 网站在编译时,首先将语言代码编译成微软中间语言 MSIL 。
(3)一台 IIS Web 服务器 IP 地址为 210.78.60.19,网站端口号为 8000,则要访问虚拟目录 xxxy 中default.aspx 的URL 为http://210.78.60.19.8000/xxxy/default.aspx 。
(4)可以通过复制网站同步网站上的一个文件。
2.是非题(1)托管代码是以CLR 为基础运行的代码。
(√)(2)若某页面上包含动画内容,则该页面肯定是动态页面。
(×)(3)一个网站中可以同时包含静态页面和动态页面。
(√)(4) 4.5 页面是边解释边执行的。
(×)(5)在VSEW2012 中开发网站必须安装独立的IIS。
(×)(6)IIS EXPRESS 具有与IIS 类似的功能,但主要用于VSEW2012 中的页面。
(×) (7)IIS 中的网站与VSEW2012 中的网站是相同的概念。
(×)3.简答题(1)一个学校有多个分院,每个分院有各自的网站,如果提供一台 WEB 服务器,如何设置?每个分院设置各自的虚拟目录。
虚拟目录是服务器硬盘上通常不再主目录下的文件夹的一个好记名称(别名),使用别名可以发布多个文件夹下的内容以供所有用户访问,并能单独控制每个虚拟目录的读写权限。
(2)如何设置在访问网站时只需输入域名就可访问网页主页?将“i ndex.aspx”设置为默认文档,只要将其添加为默认文档即可,右击桌面“我的电脑”,选择“管理”项打开“计算机管理”窗口,选择“Internet 信息服务→网站→默认网站”并右击之,选择弹出菜单中的“属性”项,在打开的窗口中选择“文档”标签,单击“添加”将“index.aspx”添加进来,最后“应用→确定”即可(3)文件系统、本地 IIS、FTP 站点和远程站点的区别是什么?文件系统:就是发布到硬盘的文件本地 IIS:是发布到 IIS 根目录下的文件FTP 站点:是用过 ftp 上传到指定服务器的文件远程站点:就是可以发布到远程服务器的文件(4)说明什么是虚拟主机,Internet 上提的虚拟主机是如何运行的?所谓虚拟主机,就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的 Internet 服务器(支持 WWW、FTP、E-mail 等)功能。
编译原理报告for循环语句的翻译程序
编译原理报告for循环语句的翻译程序编译原理报告:for循环语句的翻译程序引言:编译器是将高级语言源代码转换为机器语言的关键工具。
在编译原理中,翻译程序的设计和实现是一个重要的研究领域。
本文将讨论编译器中一个常见的语法结构——for循环语句的翻译程序。
一、for循环语句的基本结构for循环是一种重复执行某段代码的控制结构,它由循环变量初始化、循环条件判断、循环体执行和循环变量更新四个部份组成。
通常的形式为:```for (初始化; 条件; 更新) {// 循环体}```其中,初始化部份用于初始化循环变量,条件部份用于判断是否继续循环,更新部份用于更新循环变量的值。
二、for循环语句的翻译策略在编译器中,将高级语言源代码转换为机器语言的过程主要分为词法分析、语法分析、语义分析和代码生成等阶段。
针对for循环语句的翻译,我们可以采取以下策略:1. 初始化部份的翻译:在初始化部份,我们需要将循环变量初始化为一个初始值。
通常情况下,这个初始值是由用户在高级语言源代码中指定的。
因此,在翻译过程中,我们需要将这个初始值存储到一个暂时变量中,并将其赋值给循环变量。
2. 条件部份的翻译:条件部份是判断是否继续循环的关键。
在翻译过程中,我们需要将条件表达式转换为对应的机器语言指令。
通常情况下,条件部份是一个关系表达式,比如小于、大于等等。
我们可以通过将关系表达式转换为对应的机器语言指令来实现条件的判断。
3. 循环体的翻译:循环体是for循环语句中需要重复执行的代码段。
在翻译过程中,我们需要将循环体内的高级语言代码转换为对应的机器语言指令序列。
这个过程通常需要进行语法分析和语义分析,以确保转换后的指令序列能正确地实现循环体的功能。
4. 更新部份的翻译:更新部份用于更新循环变量的值。
在翻译过程中,我们需要将更新部份转换为对应的机器语言指令。
通常情况下,更新部份是一个赋值表达式,我们可以通过将赋值表达式转换为对应的机器语言指令来实现循环变量的更新。
编译原理分知识点习题-语法制导和翻译
1.一般情况下,为什么语义分析部分仅产生中间代码解答:一般情况下,语义分析部分仅产生中间代码,其原因是:可使难点分解,分别解决。
可对语义分析产生的中间代码进行优化,以产生高效率的目标代码。
语义分析通常与机器无关,目标代码往往与机器有关。
把语义分析与目标代码生成分开,可让一个语义分析程序适用于多个目标代码生成程序。
2.(湖北省高等教育自学考试)什么是语法制导翻译为什么把这种方法叫语法制导翻译解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输入符号串的翻译。
由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或规约的同时又使用这些语义规则来知道翻译与最终产生目标代码,所以称为语法制导翻译。
3.'4.5.给出将附值语句翻译成四元式的语法制导定义,允许右部表达式含有加法、乘法、取负、括号运算。
生成赋值语句X:=B*(C+D)+A的四元式。
解答:赋值语句的自下而上的语法制导翻译过程描述为:规则语义动作(1)A::=i:=E {GEN (:=,,__,ENTRY(i) ) }(2)E::=E1+E2{:=NEWTEMP;GEN(+,, ,}(3)E::= E1*E2{ :=NEWTEMP;'GEN(*,, ,}(4)E::=-E1{ :=NEWTEMP;GEN(@,,__,}(5)E::=(E1) {:= }(6)E::=i {:= ENTRY(i) }生成的赋值语句X:=B*(C+D)+A的四元式为:(+,C,D,T1)((*,B,T1,T2)(+,T2,A,T3)(:=,T3,_,X)6.给出将布尔表达式翻译成四元式的语法制导定义。
解答:布尔表达式的语义子程序为:规则语义动作(1) E::=I {:=null;:=NXQ;【GEN (Jez , ENTRY(i), __,0) }(2) E::= i1 rop i2 { :=null;:=NXQ;GEN (Jnrop,ENTRY(i1), ENTRY(i2),0)}(3) E::= (E1) {:=, :=; }(4) E::= ¬ E1 { :=NXQ;GEN ( J, __, __, 0); BP , NXQ);}(5) E A::=E1∧{ if =null】then begin::=NXQ;GEN ( J, __, __, 0)End;BP ( , NXQ );:=null; := }(6) E ::= E A E2 {if ≠null,then beginBP , NXQ);:=nullEnd:=; }(7) E0::=E1∨{ if :=nullthen begin>:=NXQ;GEN ( J, __, __, 0)End;:=;BP ,NXG);}(8) E::=E0E2 { if ≠nullthen::=MERG,Else beginBP ,NXQ);:=End;:=}其中:~NXQ指示器指向下一个将要形成但尚未形成的四元式的地址(编号),初值为1,每当执行GEN一次,NXQ自动加1。
编译原理题库
第一章▪什么是编译器?▪编译程序的结构分为几个阶段,各阶段的任务是什么?▪遍、编译前端及编译后端的含义?▪编译程序的生成方式有哪些?第二章▪ 1. 写一文法,使其语言是偶正整数的集合。
▪要求:(1)允许0打头(2)不允许0打头解:(1)允许0开头的偶正整数集合的文法E→NT|DT→NT|DN→D|1|3|5|7|9D→0|2|4|6|8(2)不允许0开头的偶正整数集合的文法E→NT|DT→FT|GN→D|1|3|5|7|9D→2|4|6|8F→N|0G→D|02.证明下述文法G[〈表达式〉]是二义的。
〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/解:可为句子a+a*a构造两个不同的最右推导:最右推导1 〈表达式〉⇒〈表达式〉〈运算符〉〈表达式〉⇒〈表达式〉〈运算符〉a⇒〈表达式〉* a⇒〈表达式〉〈运算符〉〈表达式〉* a⇒〈表达式〉〈运算符〉a * a⇒〈表达式〉+ a * a⇒ a + a * a最右推导2 〈表达式〉⇒〈表达式〉〈运算符〉〈表达式〉⇒〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉⇒〈表达式〉〈运算符〉〈表达式〉〈运算符〉 a⇒〈表达式〉〈运算符〉〈表达式〉 * a⇒〈表达式〉〈运算符〉a * a⇒〈表达式〉+ a * a⇒ a + a * a3. 给出生成下述语言的上下文无关文法:(1){ anbnambm| n,m>=0}(2){ 1n0m1m0n| n,m>=0}解:(1){ anbnambm| n,m>=0}S→AAA→aAb|ε(2) { 1n0m1m0n| n ,m>=0}S →1S0|A A →0A1|ε第三章1、构造一个DFA ,它接收∑={a, b}上所有满足下述条件的字符串:字符串中的每个a 都有至少一个b 直接跟在其右边。
解:已知∑={a, b},根据题意得出相应的的正规式为: (b*abb*)* 根据正规式画出相应的DFA M ,如下图所示 用子集法将其确定化由DFA 得状态图 用最小化方法化简得:{0},{1},{2},{3,4},按顺序重新命名DFA M ’第四章练习1:文法G[V]:V →N|N[E] E →V|V+E N →i是否为LL(1)文法,如不是,如何将其改造成LL(1)文法。
用VBA制作Excel翻译程序
用VBA制作Excel翻译程序。
目的:由于经常进行日文Excel文档的翻译,所以希望用编写VBA程序能让机器自动翻译一部分,并且有中日对译表可以自己编辑和修改。
Lib是中日对译表名。
UserForm是用户界面,以下有选择要翻译表名的选项,“日翻中”、“中翻日”、“中日对译表维护”等三个按键。
功能一览:1 程序的调用。
2 应用界面。
3 对译表的建立。
4 每一个单词的替换(可用宏录制)5 更换下一个单词,直到所有单词都替换完成,需要循环语句。
(难点)5.1 更换关键字。
(不知怎么会出错,说下标越界,不能排错。
卡在这里了)5.2 换成下一个关键字,用循环语句。
(还没做到这一步,有一定难度,不过应该能解决吧)6 问题出现:单词替换时,不能Ctrl+Z返回上一步状态。
防止替换错误,需要提前备份。
(现在先不管这一步了,先把程序做出来再说)编程设计:我写了一下VBA,但是试运行时出现下标越界的报错,但不知怎么纠错。
请各位大侠帮忙!!!Private Sub UserForm1_tran()MsgBox "程序测试开始!"Sheets("Temp").Cells(1, 1).Value = 1'Temp是要处理的文档,可改名。
'Lib是字典库。
'DoDim MyRange As RangeMyRange = Sheets(lib).Range("A1")Sheets(temp).Cells("A2") = Sheets(lib).Range(MyRange).Value'If ActiveSheet.Cells(1, 6).V alue = "" Then'Quit'End If'变量的使用:错误方式:n=单元格的值;另一个值等于=n。
'正确方式:n=单元格的位置,另一个单元格的值=n位置的值。
FOR循环语句的翻译程序设计(简单优先法、输出四元式)
学号:0120810340631课程设计题目FOR循环语句的翻译程序设计(简单优先法、输出四元式)学院计算机科学与技术专业计算机科学与技术班级0806姓名张军指导教师郭羽成2011 年 1 月7 日课程设计任务书学生姓名:张军专业班级:计算机0806班指导教师:郭羽成工作单位:计算机科学与技术学院题目: FOR循环语句的翻译程序设计(简单优先法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。
时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2011年 1月 7日系主任(或责任教师)签名: 2011年 1月 7日FOR循环语句的翻译程序设计(简单优先法、输出四元式)1 系统描述(问题域描述)1.1设计目的通过学习编译原理的相关内容,设计并编写FOR循环语句的翻译程序,使用简单优先法,按四元式输出,能够实现词法分析,语法和语义的分析,加深对所学知识的理解,并且能够熟练运用到实际当中。
- 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则保存该标识符的值。