《编译原理》实验报告编写编译程序实现多行表达式的表达式序列的文法语言的编译执行

上传人:桔**** 文档编号:431268755 上传时间:2023-02-15 格式:DOC 页数:15 大小:280KB
返回 下载 相关 举报
《编译原理》实验报告编写编译程序实现多行表达式的表达式序列的文法语言的编译执行_第1页
第1页 / 共15页
《编译原理》实验报告编写编译程序实现多行表达式的表达式序列的文法语言的编译执行_第2页
第2页 / 共15页
《编译原理》实验报告编写编译程序实现多行表达式的表达式序列的文法语言的编译执行_第3页
第3页 / 共15页
《编译原理》实验报告编写编译程序实现多行表达式的表达式序列的文法语言的编译执行_第4页
第4页 / 共15页
《编译原理》实验报告编写编译程序实现多行表达式的表达式序列的文法语言的编译执行_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《《编译原理》实验报告编写编译程序实现多行表达式的表达式序列的文法语言的编译执行》由会员分享,可在线阅读,更多相关《《编译原理》实验报告编写编译程序实现多行表达式的表达式序列的文法语言的编译执行(15页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验报告 编写编译程序实现多行表达式的的文法语言的编译执行组长:组员: 一、实验项目名称:有表示多行表达式的文法如下:- - = +-(+-) - (* | /) - () ( ) - sin | cos | tan | exp其中的变量无需定义且其作用域为第一次赋值处至最后。试按递归下降方式设计其编译程序,生成PL/0栈式指令代码,然后解释执行。二、实验要求:将编译和解释执行分成完全独立的两个阶段;对栈式指令进行适当扩充,使之能处理标准函数的调用;剔除本题目不需要的PL/0栈式指令,并说明理由;简化PL/0运行栈,使之满足本题目要求既可;注意定义中的可选项变量=引起的歧义性:如 a=

2、1+2与a+2,前一个a属于,而后一个a属于,思考如何解决;以“表达式目标码序列结果”方式输出运行结果;设计一个测试,使之能充分测试你的实现;对正确列出的目标码、执行并按适当方式演示运行栈的变化,计算出值;对错误的指出其出错位置和错误性质三、设计概述:实现平台:VC+6.0 运行平台:xindows xp 四、结构设计说明:结构图:编译系统总体流程图五、具体实现过程:1、词法分析(斯琴)词法分析子程序名为getsym,功能是从源程序中读出一个单词符号,把它的信息放入全局变量sym,值放入id中,语法分析需要单词时,直接从变量中获得。getsym过程通过反复调用getch从源程序中获取字符,并把

3、它们拼成单词。getch过程中使用了行缓存区技术。(每次读入一行,存入line缓存区,line被getsym取空后再读一行。)提高了程序运行效率。词法分析器的分析过程:调用getsym时,它通过getch从源程序中获得一个字符。如果这个字符开头是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名,常量名),把sym置为ident,把这个单词存入id变量。查保留字表时使用了二次法查找以提高效率。如果getch获取的字符是数字,则继续用个getch获取数字,并把它们拼

4、成一个整数,然后把sym置为number,并把拼成的数值放入num变量。取字符过程:2、 语法分析(宗华):表达式序列文法为:语法分析子程序分析:语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语意生成相应的代码,并提供了出错处理的机制。语法分析主要由表达式处理过程(expression)、项处理过程(term)、因子处理过程(factor)构成。这些过程在结构上构成一个嵌套的层次结构。除此之外,还有出错报告过程(error)、代码生成过程(gen)、登录名字表过程(enter)、查询名字表函数(position)以及列出类PCODE代码过程(listcode)作过语法分析

5、的辅助过程。表达式、项、因子处理:根据PL/0语法可知,表达式应该是由正负号或无符号开头、由若干个项以加减号连接而成。而项是由若干个因子以乘除号连接而成,因子则可能是一个标识符或一个数字,或是一个以括号括起来的子表达式。根据这样的结构,构造出相应的过程,递归调用就完成了表达式的处理。把项和因子独立开处理解决了加减号与乘除号的优先级问题。在这几个过程的反复调用中,始终传递fsys变量的值,保证可以在出错的情况下跳过出错的符号,使分析过程得以进行下去。以下是我们给出对表达式序列文法的理解,则:(1).表达式序列为多个表达式的集合.(2).表达式由项组成,或者可以有多个项作加法运算构成(3).项是由

6、因子或者因子作乘法运算构成(4). 因子是无符号实数,变量,标准函数,亦或递归表达式的定义3、语义分析(宗华):表达式文法的语义分析主要是:其中的变量无需定义且其作用域为第一次赋值处至最后。 4、目标代码结构和代码生成(辛敏):表达式序列编译程序不仅完成通常的词法分析、语法分析,而且还产生中间代码和“目标”代码。目标代码放在一个固定的存贮数组code中。目标代码结构lit num: 将常数值取到栈顶 opr 1 : 栈顶元素取反 opr 2 : 次栈顶与栈顶相加,退两个栈元素,结果值进栈 opr 3 : 次栈顶减去栈顶,退两个栈元素,结果值进栈 opr 4 : 次栈顶乘以栈顶,退两个栈元素,结

7、果值进栈 opr 5 : 次栈顶除以栈顶,退两个栈元素,结果值进栈 sto i : 将栈顶内容送入某变量单元中 sin_ : 将栈顶计算sincos_ : 将栈顶计算costan_ : 将栈顶计算tanexp_ : 将栈顶计算explod i : 将变量值取到栈顶 上述指令的格式由两部分组成:FA其中,f, a的含义见下表: FaINT常 量LIT常 量LOD数据地址STO数据地址OPR运算类别表2-1 表达式序列 处理机指令上表中,程序地址为目标数组code的下标,数据地址为变量在局部存贮中的相对地址。表达式序列的编译程序为每一条表达式序列源程序的可执行语句生成后缀式目标代码。如赋值语句X

8、= Y op Z(op为某个运算符),将被翻译成下面的目标代码序列:(设指令计数从第0号开始)No.fa0LODAddr_Y1LODAddr_Z2OPRop3STOAddr_X相关过程(函数)有:gen(),其任务是把三个参数f、a组装成一条目标指令并存放于code数组中,增加CX的值,CX表示下一条即将生成的目标指令的地址。5、解释执行(刘中文)S是由解释程序定义的一位实型数组,目标程序是一种假象的栈式计算机的汇编语言。解释执行时的数据空间S为栈式计算机的存储空间,遵循后进先出规则。解释执行过程如下:相关过程: interpret()。interpret()则完成各种指令的执行工作。6、错误

9、处理(张俊):编写完代码之后,首先检查一下有没有简单的语法错误,然后编译连接运行,输入源程序,判断源文件的语法错误,返回错误原因及编号n,全局变量LINE记录出错的位置。部分代码:n值的意义:1 无法打开文件2 数字长度太长3 没有检测到赋值符号4 表达式没有正常结束5 表达式序列没有正常结束6 没有定义该变量7 数越界8 缺右括号9 程序太长10 缺左括号六、测试1一个例子1.1表达式序列语言源程序下面我们给出一个表达式序列语言写的一段程序:b=3+100;a=1+1+sin(3*5+cos(45/30);c=3.14*tan(a);d=c*b;#七说明:1、关于对剔除本程序不需要的PL/0

10、栈式指令的相关说明剔除的PL/0栈式指令为:CAL,JMP,JPC。CAL:调用过程的指令。 本程序只是关于编译表达式的程序,没有过程,按顺序执行,不需要调用过程的指令。JPC: 条件转移指令JMP: 无条件转移指令 表达式文法是按顺序执行的,不需用到转移指令。2、简化PL/0运行栈在PL/0程序中在栈顶分配三个联系单元,存贮静态链,动态链,和返回地址。这些用于过程调用,但是因为在本程序中没有过程调用,所以没有这三个单元。八、遗留问题遗留问题:类似这样的表达式不能解决a=(a=3)九、各自的贡献:讨论程序结构的设计,进行词法分析,写相关的代码。:讨论程序结构的设计,进行语法分析,写相关的代码,测试程序:讨论程序结构的设计,设计关于生成代码、执行的程序,测试程序,撰写实验报告。:讨论程序结构的设计, 编写解释执行部分代码。:讨论程序结构的设计,进行错误判断,写相关的处理代码,对程序进行测试。十、实验总结:实验初,组内对程序功能模块进行了明确的划分,但未对接口进行详细具体的设计;编写期间,对于各部分的衔接进行多次讨论,对功能进行增删完善,但是由于接口的不理导致程序汇总运行出现较多错误,反复修改花费较多时间;后期进行统一测试调试。在此次实验中由于是第一次组内合作,分歧较多,想法不一致,没有能很好的合作,希望在以后的试验中进一步改善。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号