编译原理上机报告.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:26 大小:146KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

编译原理上机报告.pdf

编译原理上机报告.pdf

预览

免费试读已结束,剩余 16 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

编译原理上机报告学号:04070014姓名:李童指导教师:蒋宗礼完成时间:2007-6-21目录实验目的⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2实验内容⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2实验要求⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2总体设计⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2实验一词法分析程序⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3词法的正规式描述变换后的正规文法状态转移图词法分析中的数据结构词法分析中的算法程序测试与运行测试截图错误处理实验二/三语法制导的三地址代码生成程序⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13改写产生式编写语义规则程序中的数据结构递归子程序遇到的问题及解决方法测试截图错误处理心得体会⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯241实验目的通过实验巩固上课所学的词法分析方面的知识。通过理论与实践结合的过程强化编程能力。通过从词法分析->语法分析->语义分析(生成三地址码)的过程,进一步体会编译的原理,了解所有编译程序的最基本框架。利用书本上的原理,结合所用开发语言的特点设计出具有一定功能的词法分析器。实验内容1.编写词法分析程序,该程序需要能够识别给定的关键字,运算符,分隔符,标识符,十进制、八进制、十六进制的整数和小数。2.利用递归自程序法编写语法分析程序,并在此基础之上改造出能够对给定语句生成三地址代码的程序。实验要求1.根据所给的正规式,编制正规文法,画出状态图;2.根据状态图,设计词法分析函数intscan(),完成以下功能:1)从键盘读入数据,分析出一个单词。2)返回单词种别(用整数表示),3)返回单词属性(不同的属性可以放在不同的全局变量中)。3.编写测试程序,反复调用函数scan(),输出单词种别和属性。4.编写语法分析程序,能够分析给定的包括while,ifthenelse等文法的语法分析程序。5.在语法分析程序的基础上,编写能够对给定语句生成三地址码的程序。总体设计本实验的内容是一环紧扣一环,前面的成果将作为后面的基础,被反复用到。具体说来,首先,应当花足够的精力在词法分析上面:一方面要保证程序的正确性和健壮性,因为它将是后面的基础,如果词法分析有问题,那么后面的程序就不可能正确;另一方面,词法分析由于在后面将要被反复用到,所以该模块设计的是否合理,是否方便易用,对后面的程序也会有很大的影响。对此我的设计是词法分析每次分析一个词,准确分析之后返回该词的类型和内容。如果词在分析中出现错误,则打印该错误位置,之后跳过该词继续分析其他词。对于语法分析程序,我采用的是LL1自顶向下的分析方法。在使用该方法前,须对所给文法去除二义性,消除左递归,提取左因子。在实现中我使用的是递归子程序的方法。在为每个非终结符编写好递归自程序后,利用上面已经设计好的词法分析程序,每次读入词,之后根据递归子程序中的设计,转到相应的程序中执行相应的程序。对于三地址码的生成,有了第二部的语法分许程序,本程序更多的工作量将是在设计方面。在语法分析的框架中的合适位置填写生成适当的代码,就可以完成三地址码的生成,然而在什么位置生成什么代码是关键。由于对所给文法进行了除二义性,消除左递归,提取左因子等操作,所以指导书上所给的语义规则已经不再适用,需要自己根据三地址代码的含义,去自己进行构造,这部详细的设计将在后面详细说明。2实验一词法分析程序一、词法的正规式描述标识符:<字母>|(<字母>|<数字字符>)*(ε|_|.)(<字母>|<数字字符>)*十进制数:(0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)(ε|.)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*八进制数:0(0|(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*)(ε|.)(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制数:0x(0(|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*)(ε|.)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符:+-*/<>=();关键字:ifthenelsewhiledo二、