课程设计编译原理实现对FOR语句处理的功能_第1页
课程设计编译原理实现对FOR语句处理的功能_第2页
课程设计编译原理实现对FOR语句处理的功能_第3页
课程设计编译原理实现对FOR语句处理的功能_第4页
课程设计编译原理实现对FOR语句处理的功能_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 课程设计说明书课程名称: 编译原理 实验名称:实现对for语句处理的功能 实验性质: 综合性实验 院 (部): 计算机科学与技术学院 班 级: 姓 名: 学 号: 指导教师: 完成日期: 2011/11/03 目录课程设计任务书3结构设计说明4一、对pl/0语言的相关描述4 1 plo所有子程序4 2 pl/0语言的语法图4 3 pl/0语言编译器5 4 代码执行6 5 错误诊断处理8二、对for语句的相关描述81 增加for语句8 设计思想 8 设计思路8 2 扩充代码93、 实验测试程序11 程序测试结果114、 课程设计实验心得12 5、 参考文献12 山东建筑大学计算机科学与技术学院

2、课程设计任务书 设计题目对pl/0语言及其编译器进行扩充和修改实现对for语句进行处理的功能已知技术参数和设计要求pl/0程序设计语言是一个较简单的语言,它以赋值语句为基础,构造概念有顺序、条件和重复(循环)三种。pl/0有子程序概念,包括过程定义(可以嵌套)与调用且有局部变量说明。pl/0中唯一的数据类型是整型,可以用来说明该类型的常量和变量。当然pl/0也具有通常的算术运算和关系运算。通过读懂源程序,全面掌握编译原理的基本实现过程。对现存的pl/0编译程序做一些修改或扩充。设计内容与步骤通过读懂源程序,全面掌握编译原理的基本实现过程。扩充pl/0实现对for语句进行处理的功能。语法参照pa

3、scal或c语言,for循环语句中一般为三个表达式,第一个代表初始值,第二个代表范围,第三个代表循环方式/修正的方式。设计工作计划与进度安排1-4:进行完整的编译程序全过程的理解5-12:根据源程序,理解整个编译器的编写中涉及到的全局变量及基本函数的意义。13-20:在读懂全程序的基础上,进行扩充修改,并测试。21-24:撰写课程设计报告书。设计考核要求设计考核方法:课程设计总成绩=算法实现(30%)+课程设计说明书(50%)+平时考勤(20%)。设计考核要求:(1) 规范的课程设计说明书(2) 所设计的算法源代码指导教师(签字): 教研室主任(签字):结构设计说明:一、对pl/0语言的相关描

4、述:1、plo所有子程序如下:过程或函数名简要功能说明main初始化编译环境,建立关键字表,调用分程序block对源文件进行编译,当编译正确时,自动调用解释执行程序,对目标代码进行解释执行。error出错处理,打印出错位置和错误性质编号。并在信息栏输出错误信息。getch过滤空格,读取一个字符getsym词法分析,读取一个单词gen生成目标代码(类pcode代码),并送入目标程序区。test测试当前单词是否是合法block分程序分析处理过程。enter登录过程说明对象包括变量、常量和过程名的属性信息到符号表。position查找标识符在符号表中的位置。constdeclaration常量定义处

5、理,收集常量信息并登录到符号表。vardeclaration变量定义处理,收集变量信息并登录到符号表。listcode列出目标代码清单。statement语法分析,语句部分处理。expression表达式分析处理。term项分析处理过程。factor因子分析处理。condition条件处理。interpret对目标代码进行解析执行。base通过静态链求数据区首地址。2、pl/0语言的语法图:程序程序体.程序体constidentnumber=var;identprocedure,ident;程序体;语句序列,语法分析词法分析语义分析代码生成代码执行源程序执行结果符号表管理错误诊断处理3.pl/

6、0语言编译器本书所提供的pl/0语言编译器的基本工作流程如下图所示:编译器又包括:词法分析,语法分析,语义分析和代码生成,这里不再详述。4. 代码执行为了简单起见,我们假设有一个pl/0处理机,它能够解释执行pl/0编译程序所生成的目标代码。这个pl/0处理机有两类存贮、一个指令寄存器和三个地址寄存器组成。程序(目标代码)存贮称为code,由编译程序装入,在目标代码执行过程中保持不变,因此它可被看成是“只读”存贮器。数据存贮s组织成为一个栈,所有的算术运算均对栈顶元和次栈顶元进行(一元运算仅作用于栈顶元),并用结果值代替原来的运算对象。栈顶元的地址(下标)记在栈顶寄存器t中,指令寄存器i包含着

7、当前正在解释执行的指令,程序地址寄存器p指向下一条将取出的指令。pl/0的每一个过程可能包含着局部变量,因为这些过程可以被递归地调用,故在实际调用前,无法为这些局部变量分配存贮地址。各个过程的数据区在存贮栈s内顺序叠起来,每个过程,除用户定义的变量外,还应当有它自己的内部信息,即调用它的程序段地址(返回地址)和它的调用者的数据区地址。在过程终止后,为了恢复原来程序的执行,这两个地址都是必须的。我们可将这两个内部值作为位于该过程数据区的内部式隐式局部变量。我们把它们分别称为返回地址(return address)ra和动态链(dynamic link)dl。动态链的头,即最新分配的数据区的地址,

8、保存在某地址寄存器b内。因为实际的存贮分配是运行(解释)时进行的,编译程序不能为其生成的代码提供绝对地址,它只能确定变量在数据区内的位置,因此它只能提供相对地址。为了正确地存取数据,解释程序需将某个修正量加到相应的数据区的基地址上去。若变量是局部于当前正在解释的过程,则此基地址由寄存器b给出,否则,就需要顺着数据区的链逐层上去找。然而遗憾的是,编译程序只能知道存取路线的表的长度,同时动态链保存的则是过程活动的动态历史,而这两条存取路线并不总是一样。aabbbcacb图2-1 过程说明嵌套图 过程调用图 表示a调用b例如,假定有过程a,b,c,其中过程c的说明局部于过程b,而过程b的说明局部于过

9、程a,程序运行时,过程a调用过程b,过程b则调用过程c,过程c又调用过程b,如下图所示:从静态的角度我们可以说a是在第一层说明的,b是在第二层说明的,c则是在第三层说明的。若在b中存取a中说明的变量a,由于编译程序只知道a,b间的静态层差为1,如果这时沿着动态链下降一步,将导致对c的局部变量的操作。为防止这种情况发生,有必要设置第二条链,它以编译程序能明了的方式将各个数据区连接起来。我们称之为静态链(static link)sl。这样,编译程序所生成的代码地址是一对数,指示着静态层差和数据区的相对修正量。下面我们给出的是过程a、b和c运行时刻的数据区图示: dl ra sla的变量b的变量c的

10、变量b的变量有了以上认识,我们就不难明白pl/0源程序的目标代码是如何被解释执行的。以语句x := y op z为例,(该语句的目标代码序列我们己在2.4节给出),pl/0处理机解释该指令的“步骤”如下:step 1, s+t sbase(level_diff_y) + addr_y;/ 将变量y的值放在栈顶step 2, s+t sbase(level_diff_z) + addr_z;/ 将变量z的值放在栈顶,此栈顶元为变量y的值step 3, t-;/ 栈顶指针指向次栈顶元,即存放结果的单元step 4, st st op st + 1;/ 变量y和变量z之间进行“op”操作step 5

11、, sbase(level_diff_x) + addr_x st;/ 将栈顶的值存放到变量x所在的单元step 6, t-;/ 栈顶指针减一相关过程:base(),interpret()。其中base()的功能是根据层次差并从当前数据区沿着静态链查找,以便获取变量实际所在的数据区基地址;interpret()则完成各种指令的执行工作。5. 错误诊断处理一个编译程序,在多数情况下,所接受的源程序正文都是有错误的。发现错误,并给出合适的诊断信息且继续编译下去从而发现更多的错误,对于编译程序而言是完全必要的。一个好的编译器,其特征在于:u 任何输入序列都不会引起编译程序的崩溃。u 一切按语言定义为

12、非法的结构,都能被发现和标志出来。u 经常出现的错误,程序员的粗心或误解造成的错误能被正确地诊断出来,而不致引起进一步的株连错误。根据这样的要求,我们为pl/0编译程序制定了以下两条规则:(1) 关键字规则;程序员在写程序时,可能会因为粗心而漏掉语句的分隔符“;”,但他决不会漏掉算术运算符“+”,对于编译程序而言,不论是分隔符号类的符号还是关键字符号类的符号,它们都具有同等重要的地位。基于这样的特点,我们可以采用不易出错的部分来作为恢复正常步调的标记。每当遇到错误时,分析程序跳过后面的某些部分,直到出现所期望的符号为止。对于程序设计语言来说,这种符号(称为同步符号)的最好选择就是关键字。pl/

13、0的每一种构造语句以begin、if或while开头;每种说明则以var、const或procedure开头。每遇到错误时,编译程序便可跳过一段程序,直到遇到这类符号为止,而继续编译。(2) 镇定规则;自顶向下分析的特点在于目标被分成一些子目标,分程序则用别的分析程序来处理其子目标。镇定规则是说一个分析程序发现了错误,它不应该消极地停止前进,仅仅向调用它的程序报告发生的错误;而应该自己继续向前扫描,找到似乎可以使正常的分析得以恢复的地方。这一规则在程序设计上的含义就是任一分析程序除了正常终止外,没有其它出口。二、对for语句的相关描述: 1.增加for语句设计思想:for语句的语法分析:<

14、;for语句>:=for(赋值语句;关系表达式) do <语句>do;:=条件表达式identfor语句 设计思路:主要分为两部分模块:一,for和;之间的赋值语句处理;二,条件语句处理和最后的语句处理。首先获取赋值号左边的标识符,从符号表中找到它的信息,并确认这个标识符确为变量名。然后通过调用表达式处理过程算得赋值号右部的表达式的值并生成相应的指令保证这个值放在运行期的数据栈顶。最后通过前面查到的左部变量的位置信息,生成相应的sto指令,把栈顶值存入指定的变量的空间,实现了赋值操作。返回函数值也是用赋值语句进行返回值的储存。首先调用condition函数处理条件语句,并且把

15、当前condition处理生成的判断条件操作代码的的地址cx保存到cx1。每个循环体中,在循环体结束前,设置跳回判断操作判断当前条件是否跳出循环。都把本循环体结束的下一个位置保存到cx2生成跳转,并在循环结束时用cx2更新为目前循环结束跳转地址。难点分析:本模块,主要难点是处理循环体的跳转,解决方法参照上点。不过可以参照if语句和while语句。2 .扩充代码: 1)在头文件pl0.h中增加所要求增加的符号:enum symtype中加入sym_for/实现for循环;char* word中加入"for"关键字。 2)源代码:else if (sym = sym_for)/

16、for 语句的实现/cx1 = cx; getsym();i=position(id);/词法分析中读取的字符串名字 iif(i=0) error(29);else/变量不能为常数或过程 如 for i=5 if(tablei.kind=sym_const|tablei.kind=sym_procedure)error(30);if(tablei.kind=sym_var)/如果是变量的话,把变量入栈mask* mk; mk = (mask*) &tablei; gen(lod, level - mk->level, mk->address);getsym();if(sym

17、=sym_equ)/如果下一个读入“=”号,则为变量初始附值getsym();/第一个表达式set1 = createset(sym_to,sym_do, sym_null); set = uniteset(set1, fsys); expression(set); destroyset(set1); destroyset(set);if(sym=sym_to)/输入第二个表达式为数字cx1=cx;/cx1记录当前代码段作为开始循环位置/将数存进变量中mask* mk; mk = (mask*) &tablei; gen(sto, level - mk->level, mk-&g

18、t;address);/栈顶的内容给变量 如i=1,刚才的数存在栈顶,现在要附给变量,通过偏移地址gen(lod,level - mk->level, mk->address);/将此变量放入栈顶,以便与第二个表达式进行比较运算getsym();set1 = createset(sym_do, sym_null); set = uniteset(set1, fsys); expression(set);/读取第二个表达式 destroyset(set1); destroyset(set);gen(opr,0,9);/栈顶与次栈顶的内容进行运算,结果放次栈顶,如i<10cx2=cx; /cx2记录当前代码段,用于jpc的跳转地址回填gen(jpc,0,0);if(sym=sym_do)getsym();elseerror(18);statement(fsys);mask* mk;mk = (mask*) &tablei; gen(lod, level - mk->level, mk->address);/读取变量,放入栈顶,将与1相加gen(lit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论