西工大编译原理实验报告_第1页
西工大编译原理实验报告_第2页
西工大编译原理实验报告_第3页
西工大编译原理实验报告_第4页
西工大编译原理实验报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、成绩编译原理实验报告学院: 计算机学院 班级: 姓名: 学号: 日期: 目 录1 实验情况概述12 主要功能23 软件总体结构34 详细设计45 实验总结55.1 调试和bug修改总结55.2 测试和结果55.3 实验小结51 实验情况概述本实验的主要任务是编写一个小型类Pascal语言的编译器。该编译器应当能够将输入的源程序文本翻译为相应的四元式,并输出符号表。实验环境:词法分析器采用flex;语法分析器采用bison;软件开发使用Visual C+ 6.0。功能:1. 能够处理整型、实型两种类型的变量定义;2. 能够识别注释;3. 能够处理程序结构的定义;4. 能够识别算术、关系和逻辑表达

2、式;5. 能够识别常量定义;6. 能够识别顺序、赋值、循环、选择、复合语句等基本的语句类型。输出结果:1. 将输入的文本输出为四元式序列;2. 输出符号表。2 主要功能1.基本功能:根据词法分析处理说明文件(.l)和语法分析处理说明文件(.y)来识别输入的测试文件是否符合MiniPascal所规定的语法要求;若测试文件符合其语法要求,则输出程序正确运行步骤的四元式表示以及程序运行过程中所用到的的符号表;若不符合,则发生错误,程序无法运行,并提示错误信息。四元式基本形式:(op,arg1,arg2,result),其中op为一个二元(也可以是一元或零元)运算符;arg1,arg2分别为它的两个运

3、算(或操作)对象,它们可以是变量、常数或系统定义的临时变量名;运算结果将放入result中。2.扩展功能:定义了如下两类四元式:(jrop,A1,A2,p)当关系A1rop A2成立时,转向第p四元式;(j,0,0,p)无条件转向第p四元式。3. 程序运行结果如下所示:4.3 软件总体结构3.1 软件包括的程序文件: ast.c ast.hast_lex.c ast_yacc.c ast_lex.l ast_yacc.y3.2 程序模块如下图所示:3.3 各程序块之间的传递词法分析模块与语法分析模块通过单词的内部码来传递信息;字符数组str1存储当前正在识别的单词。语法分析产生的四元式和符号表

4、均存储在结构体中。4 详细设计4.1 数据结构四元式数据结构:struct QUATERLIST char op6;char arg16,arg26,result6;QuaterListMAXMEMBER;符号表数据结构:struct VARLISTchar name20;int type;/*1为real 0 为 int*/int addr; VarListMAXMEMBER;表达式数据结构:struct Eexprint type,place;unionint Iv;float Rv;Value;其中type为2表示变量,1表示整数,Iv中存储该整数的值,0表示小数,Rv中存储该小数的值。

5、4.2 主要的算法和辅助函数void BackPatch(int p,int t);/*用四元式序号t回填以p为首的链,将链中每个四元式的result域改写为t的*/int Merge(int p1,int p2);/*将p1和p2的两条链合并为一条,并返回新链的序号*/void Gen(char jop,char arg1,char arg2,char result);/*根据所给参数产生一个新的四元式*/int LookUp(char * Name);/*在符号表中查找Name,若查到返回序号*/int Enter(char * Name);/*以Name为名字查符号表,若未查到,则调用E

6、nter函数添加该项*/int Entry(char * Name); /*在符号表中添加Name新项,返回值为序号*/int NewTemp();/*产生临时变量,每次调用都定义一个新的临时变量,返回值为该变量的编*/void ChangeToString(char *dest,struct Eexpr ex);/*若所给ex为常数,则将其值变为字符串,存入dest中,若所给ex为变量,则将其变量名变为字符串,存入dest中*/void OutputQ(void);/*用于输出四元式的函数*/int yyparse();/*主语法分析函数*/void OutputIList(void);/*

7、输出符号表函数*/int yyerror(char*);/*错误处理函数*/4.3 规则说明采用语法制导翻译方法,即根据文法中每个产生式所蕴含的语义,为其后续准备若干语义子程序,对所要完成的语义处理功能进行分析描述,在语法分析过程中,当分析器使用该产生式进行语法分析时,除完成语法分析动作外,还将调用为其配备的语法分析子程序,进行相应的语义处理,完成语法翻译工作。例如这个规则:ISE:IBT Statement Elseint q = NXQ;Gen(j,0,0,-1);BackPatch($1,NXQ);$ = Merge($2,q);此时,编译系统已明确当前正在处理的是if-then-els

8、e结构,then后所跟的表达式已处理完毕,且else后所跟的表达式的第一个四元式位置已可确定。在准备翻译else后所跟的表达式之前,首先应紧接then后所跟表达式的四元式序列之后产生一个无条件转四元式,并将此四元式与then后所跟表达式的出口链合二为一,作为整个if-then-else结构的出口,这一信息将作为ISE的综合属性Chain传递上去;另外,IBT的综合属性此时即可回填。5 实验总结5.1 测试和结果5.1.1 测试程序:Program a;Var i,j:integer;k:real;Begin while j=2 do if i=6 then k:=7.1 else k:= 8+

9、4 else k:=9;End. 5.1.2 输出的四元式序列和符号表如下:5.2 实验小结本次实验做得还算顺利,最终完成了实验要求的基本功能,一开始拿到题目的时候觉得非常难,因为以前没有接触过编译器的设计,而且对于实验中所用的工具,在之前的实验中都没接触过,有点难以想象。自习研读完老师给的lex和yacc的资料以及所给示例之后,才明白实验的大致流程,一切都弄明白明白之后用代码实现也很快。我在做实验的过程中编写代码占了一小部分时间,调bug花了大部分时间,最开始调试过程中我是在一个文件夹下利用win_flex.exe和win_bison.exe工具生成.c文件,然后将.c文件复制到VC工程里去,然后发现太麻烦了,就将win_flex.exe和win_bison.exe工具拷到了VC工程里,每次就直接在VC工程下生成.c文件,不需要再复制了。本次实验我是根据老师给的test_ast的例子来写的,在测试布尔表达式时,我发现test_ast规则中关于布尔表达式的部分是有问题的,改成课

温馨提示

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

评论

0/150

提交评论