申优论文 北航本科编译原理大作业

申优论文 北航本科编译原理大作业

ID:41123206

大小:54.50 KB

页数:6页

时间:2019-08-17

申优论文 北航本科编译原理大作业_第1页
申优论文 北航本科编译原理大作业_第2页
申优论文 北航本科编译原理大作业_第3页
申优论文 北航本科编译原理大作业_第4页
申优论文 北航本科编译原理大作业_第5页
资源描述:

《申优论文 北航本科编译原理大作业》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、HowtoDesignaC++Object-orientedCompiler罗杨37230118AbstractThissystemisaC++object-orientedcompilerusingaextendedC0grammarastheinputlanguage.ItcangeneratetheassemblycodeaccordingtotheIntel386instructionsset.YoucanusetheMasm32v10softwaretoassembleandlinkthesourcecodetogetyour32-bitapplications.

2、摘要本系统实现了一个以扩充C0文法为输入语言的采用C++及面向对象思想设计的编译器,可以生成符合386指令集规范的汇编代码,用Masm32v10汇编可生成32位应用程序。本系统考虑到不同版本的Masm的功能和使用方法的差异,以及用户手工键入汇编,连接命令多有不便,本系统自带了汇编器Ml.exe和连接器link.exe。正文由于是目标是Windows平台下32位应用程序,有些文法中的功能如输入和输出无法再像16位汇编时调用DOS中断解决,因此对于这些问题我使用Microsoft提供的类似高级语言的设计方法——调用DLL函数来解决。其实32位汇编语言在函数调用方面已与高级语言相

3、差无异,可以调用系统API,CRunTime甚至是用户DLL中的函数。本系统是一遍扫描编译程序,采用面向对象的方法进行构建,各个主要部分均抽象成类。主要的类有:分析器类Parser,符号表管理器类SymbolTableMgr,四元式管理器类QuadrupleMgr,代码生成器类CodeGenerator,错误处理器类ErrorHandler,全局数据流分析器类GDAOptimizer,全局寄存器分配器类GRDOptimizer,局部公共子表达式删除器类CSDOptimizer,以上属于具有明显功能划分和界限区别的“高级类”,他们的对象在全局main函数中分别构造和删除;系统

4、中还有其它一些既具有数据结构意义又具有功能操作的“中级类”,它们一般是“高级类”或“中级类”的成员,如基本块集合管理器BBSetMgr,由全局数据流分析器类GDAOptimizer构建,并为其它多个优化器类共享;还有一些相对意义上的“低级类”,它们具有复杂的数据结构,却几乎没有功能操作,通常由“中级类”或“高级类”得数组成员进行管理,如项类Item,四元式类Quadruple,其中项类Item代表符号表中的每一项,四元式类Quadruple顾名思义代表一个四元式,并且四元式的三个操作数是指向项Item的指针。由于这些“低级类”对象通常代表基本数据,数量众多而又经常在各个高级

5、对象之间传递,为了减少时间空间的开销,本系统对所有的类均采用指针构造,这样需要传递的就不是对象而只是一个指针了,有效地提高了程序的运行效率。本系统的一个特点是词法分析和语法分析结合,其功能集成在词法与语法分析类Parser里,虽然本系统整体式面向对象的,但由于词法分析和语法分析本身的特性,Parser类却具有明显的面向过程的特征:各个代表文法子程序的层次关系,中间不断嵌入的词法程序和语义程序(动作符号子程序),这样的体系几乎体现不出面向对象抽象封装的优势,因此我在这部分虽然代码写的很快,调试却花了比写还要长的时间,这的确说明了我前期的程序框架没有设计好,没有一个好的结构的程

6、序,代码量不大时并不会体现出它的缺陷,但是随着规模的扩大,功能的复杂化,程序最后会达到难以维护的程度。因此我觉得在词法与语法分析方面能构造出一个简便适用的面向对象的模型非常必要。另外在语法分析方面,考虑到题目中的C0文法并无左递归问题,只有回溯问题。根据课本,为了消除回溯可以用改写文法或是预读字符的方法。当时课堂上老师着重讲了改写文法的方法,预读字符的方法只是介绍了一下。但是我考虑到若改写成等价文法,使规则右部多个候选式首符号集不相交的话,虽然语法分析变得简单了,但改写后的规则中的符号含义变得不明确,本来是语义连贯的动作符号语义子程序,可能因为文法的改写被分到不同的语法递归

7、子程序中,参数传递复杂而繁琐,而且模糊了语义编写时容易出错。反而给语义分析带来更大的麻烦。因此我采用预读字符的方法处理回溯问题,由于在预读字符时只是进行语法分析,并没有语义处理,因此不会出现课本上所说的“相关的语义分析工作在回溯时也要推倒重来”的情况,不难验证,这两种方法在运行速度上并无本质差别。我认为本系统一个比较突出的亮点是中间代码——四元式的操作数均为指向符号表某一项的指针,也就是说中间代码其实是四元式表加上符号表。这样做不仅节省空间,而且由于符号表存储了几乎所有的数据结构信息,在代码生成或优化中都非常方便调

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。