CML指针类型编译程序的设计与实现

来源 :东北师范大学 | 被引量 : 0次 | 上传用户:wuzx5858
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
本文主要介绍了如何在CML语言中实现带指针类型的编译器。指针类型在编译器中的实现主要涉及到语法分析、语义分析、中间代码生成以及存储空间的管理。语法分析器有三类。一类是通用的语法分析方法,如Corcke-Younger-Kasami算法和Earley算法,这些分析方法能分析任何文法1。然而这些方法在生成编译器时效率太低。另外两种是编译器常用的是自顶向下的方法和自底向上的方法。不论哪种方法,语法分析程序都是自左向右的扫描输入字符串,每次读一个符号。本文采用的是自顶向下的方法的一种:递归下降法。在编译器的语法分析阶段对指针类型进行分析只能完成指针类型的定义和使用是否在语法上正确,而不能做进一步的分析,进一步的分析需要在语义分析和类型检查阶段才能完成。因此,针对指针类型在语法分析阶段主要工作:指针类型的定义在语法是否正确;指针变量的使用在语法上是否正确。指针类型定义的分析是建立在普通类型定义分析的基础之上,处理的规则很简易,如果在类型定义时是指针类型,向前看TOKEN必须是标识符。指针变量的使用的分析很简单,对于指针变量的使用,前面必定是一个标识符,不管它是变量标识符还是域名标识符,变量标识符和域名标识符只是决定了该指针类型是一个普通的指针类型,还是一个记录类型中的一项。在词法分析和语法分析之后,编译器要进行的工作就是语义上的分析。在语义分析时要结合各种符号表技术以进行查找。要判断指针类型在语义上是否正确,主要要解决以下问题:指针类型的定义在语义上是否正确。指针变量的使用在语义上是否正确。指针变量语义上的检查主要工作在于首先检查该变量是否是指针类型,如果是指针类型,它的用法在语义上正确吗?对于第一个问题,该变量是指针类型吗?这个问题很好解决,只要在符号表中进行查找,如果找到且是指针类型,表明正确,其余均为错误。指针变量的使用在语义上是否正确要进行迭代,即每次循环在变量后面如果有’^’就把该符号消耗掉,同时在符号表中检查它是否是指针类型。另外在这个阶段,还需要涉及超前声明和回填。指针类型主要用在赋值语句和作为过程的参数时使用。它和一般类型检查类似。首先判断是否是指针类型,然后把它们所指向的目标类型的指针进行比较,如果相同,就表明是等价的,否则报错。存储空间的管理主要由栈式分配和堆式分配两种方法。本文主要对堆式分配进行了介绍。堆区空间主要用于存放动态申请空间变量的值。凡是动态申请的空间都分配到堆区中,对于我们的CML语言来讲就是指针类型的分配。动态存储管理的基本问题是系统如何应用户提出的“请求”分配内存?又如何回收那些用户不再使用而“释放”的内存,以备于新的“请求”产生时重新进行分配?对于响应用户提出的分配内存的请求,只需要在堆区中查找满足要求的空间即可,对于释放,在释放空间时要进行相邻空闲空间的合并,以减少碎片。这就要求在进行释放时,要进行相邻空间的检查,看是否是自由空间,如果是,就进行合并,如果不是,则简单的释放。具体有4种情况:1、释放块的左、右邻区均为占用块,此时只要作简单的释放即可。2、释放的左邻区为空闲块,而右邻区为占用块:由于释放块的头部和左邻空闲块的底毗邻,因此只要改变左邻空闲块的结点;增加结点的size域的值且重新设置结点。3、释放的右邻区为空闲块,而左邻区为占用块。由于释放块的底部和右邻空闲块的头部毗邻,因此,当表中结点由原来的右邻空闲块变成合并后的大空闲块时,结点的底部位置不变,但头部要变,由此,链表中的指针也要变。4、释放块的左、右块均为空闲块:为使三个空闲块成为一个大的结点留在可利用空间表中,只要增加左邻空闲块的space容量,同时在链表中删除右邻空闲块的结点即可。在本文中没有涉及垃圾回收的问题。垃圾回收是更现代的语言如JAVA、C#的一个重要特征。垃圾收集中大量的工作都由垃圾算法来完成。任何一种垃圾收集算法都必须做两件基本的工作:首先,它必须检测到垃圾对象的存在;其次,它必须回收垃圾对象所占据的堆空间,并将堆空间归还给系统,让应用程序能够继续使用。一般来说,实现垃圾检测的方式是:定义一组根结点,并从根结点出发检查其他结点的可到达性。如果存在一条引用路径,使得执行中的程序能够从根结点出发访问到被检查的对象,则该对象就是“可到达”的。所有从根结点可到达的对象都被认为是“活”对象,而不可到达的对象则认为是垃圾,因为它们不会再对程序未来的执行造成任何影响。将活对象和垃圾区分开来有两种算法:引用计数和遍历。引用计数型垃圾收集器会在堆上的每个对象中保存一个计数器,用这个计数器来记录指向该对象的引用个数,并以此来区分活对象和垃圾对象。另一方面遍历型垃圾收集器则是从根结点开始切实地遍历整个引用图。在遍历过程中遇到的对象就做上某种标记。遍历结束后,未被标记的对象就是不可到达的,因此被作为垃圾回收。
其他文献
认知无线网络是目前无线通信领域研究的重点之一。本文借鉴市场化的思想,采用经济学中的拍卖理论并且借鉴博弈论优势,提出了对动态频谱分配这一问题的具体解决方案并且设计了算
组播是因特网的新型网络应用,利用组播传输多媒体数据可以节约大量的带宽,而分层组播是异构网络环境下组播通信的有效手段。传统的分层组播对数据的分层都是累积型的,即要求接收
本文以蛋白蛋白相互作用为主要研究对象,提出了一个新的预测蛋白蛋白相互作用的算法,新的基于功能关联度的利用蛋白相互作用预测蛋白功能的算法,以及3字符LCWIS问题的时间复杂度
数字水印技术是近年来的一个研究热点,主要应用于对多媒体数据的完整性和内容真实性进行认证、隐秘通信、解决版权争议、设置用户标识和保护数字产品的知识产权等。数字水印
电子商务是信息化社会的商务模式,是商务的未来,它不仅使传统商业变得更加快速、便捷,还将从根本上改变传统商业结构和运作模式。现在阻碍电子商务发展的一个重要因素就是安
ATEM传输室广泛应用于电磁兼容试验、电磁场生物效应和计算机辐射泄露的研究以及场探头的校准试验中,由于ATEM传输室结构较复杂,计算ATEM传输室电气特性时所使用的方法繁琐,给AT
移动设备与定位技术的快速发展在给人们的日常生活带来极大便利的同时,也产生了大量关于移动对象的轨迹数据。轨迹数据中蕴含丰富的时空信息,对这种时空信息的挖掘和分析可有力
随着数字技术和因特网的发展,各种形式的多媒体数字作品(图像、视频、音频等)纷纷以网络形式发表,其版权保护成为一个迫切需要解决的问题。近年来迅速发展起来的数字水印(digit
伴随着计算机应用技术与信息技术的不断发展,计算机及其智能芯片系统的应用在日常生活中已是随处可见。合理、高效地开发嵌入式系统,使其更加优质地服务于人们的生活,已成为计算
图形用户界面系统(GUI)是系统级的支撑软件,它可以和文件系统、操作系统内核等一起构成一个完整的操作系统,GUI为用户提供与应用系统交互的可视化通道,同时也为程序员提供了一种