论文摘要
本文主要介绍了如何在CML语言中实现带指针类型的编译器。指针类型在编译器中的实现主要涉及到语法分析、语义分析、中间代码生成以及存储空间的管理。语法分析器有三类。一类是通用的语法分析方法,如Corcke-Younger-Kasami算法和Earley算法,这些分析方法能分析任何文法1。然而这些方法在生成编译器时效率太低。另外两种是编译器常用的是自顶向下的方法和自底向上的方法。不论哪种方法,语法分析程序都是自左向右的扫描输入字符串,每次读一个符号。本文采用的是自顶向下的方法的一种:递归下降法。在编译器的语法分析阶段对指针类型进行分析只能完成指针类型的定义和使用是否在语法上正确,而不能做进一步的分析,进一步的分析需要在语义分析和类型检查阶段才能完成。因此,针对指针类型在语法分析阶段主要工作:指针类型的定义在语法是否正确;指针变量的使用在语法上是否正确。指针类型定义的分析是建立在普通类型定义分析的基础之上,处理的规则很简易,如果在类型定义时是指针类型,向前看TOKEN必须是标识符。指针变量的使用的分析很简单,对于指针变量的使用,前面必定是一个标识符,不管它是变量标识符还是域名标识符,变量标识符和域名标识符只是决定了该指针类型是一个普通的指针类型,还是一个记录类型中的一项。在词法分析和语法分析之后,编译器要进行的工作就是语义上的分析。在语义分析时要结合各种符号表技术以进行查找。要判断指针类型在语义上是否正确,主要要解决以下问题:指针类型的定义在语义上是否正确。指针变量的使用在语义上是否正确。指针变量语义上的检查主要工作在于首先检查该变量是否是指针类型,如果是指针类型,它的用法在语义上正确吗?对于第一个问题,该变量是指针类型吗?这个问题很好解决,只要在符号表中进行查找,如果找到且是指针类型,表明正确,其余均为错误。指针变量的使用在语义上是否正确要进行迭代,即每次循环在变量后面如果有’^’就把该符号消耗掉,同时在符号表中检查它是否是指针类型。另外在这个阶段,还需要涉及超前声明和回填。指针类型主要用在赋值语句和作为过程的参数时使用。它和一般类型检查类似。首先判断是否是指针类型,然后把它们所指向的目标类型的指针进行比较,如果相同,就表明是等价的,否则报错。存储空间的管理主要由栈式分配和堆式分配两种方法。本文主要对堆式分配进行了介绍。堆区空间主要用于存放动态申请空间变量的值。凡是动态申请的空间都分配到堆区中,对于我们的CML语言来讲就是指针类型的分配。动态存储管理的基本问题是系统如何应用户提出的“请求”分配内存?又如何回收那些用户不再使用而“释放”的内存,以备于新的“请求”产生时重新进行分配?对于响应用户提出的分配内存的请求,只需要在堆区中查找满足要求的空间即可,对于释放,在释放空间时要进行相邻空闲空间的合并,以减少碎片。这就要求在进行释放时,要进行相邻空间的检查,看是否是自由空间,如果是,就进行合并,如果不是,则简单的释放。具体有4种情况:1、释放块的左、右邻区均为占用块,此时只要作简单的释放即可。2、释放的左邻区为空闲块,而右邻区为占用块:由于释放块的头部和左邻空闲块的底毗邻,因此只要改变左邻空闲块的结点;增加结点的size域的值且重新设置结点。3、释放的右邻区为空闲块,而左邻区为占用块。由于释放块的底部和右邻空闲块的头部毗邻,因此,当表中结点由原来的右邻空闲块变成合并后的大空闲块时,结点的底部位置不变,但头部要变,由此,链表中的指针也要变。4、释放块的左、右块均为空闲块:为使三个空闲块成为一个大的结点留在可利用空间表中,只要增加左邻空闲块的space容量,同时在链表中删除右邻空闲块的结点即可。在本文中没有涉及垃圾回收的问题。垃圾回收是更现代的语言如JAVA、C#的一个重要特征。垃圾收集中大量的工作都由垃圾算法来完成。任何一种垃圾收集算法都必须做两件基本的工作:首先,它必须检测到垃圾对象的存在;其次,它必须回收垃圾对象所占据的堆空间,并将堆空间归还给系统,让应用程序能够继续使用。一般来说,实现垃圾检测的方式是:定义一组根结点,并从根结点出发检查其他结点的可到达性。如果存在一条引用路径,使得执行中的程序能够从根结点出发访问到被检查的对象,则该对象就是“可到达”的。所有从根结点可到达的对象都被认为是“活”对象,而不可到达的对象则认为是垃圾,因为它们不会再对程序未来的执行造成任何影响。将活对象和垃圾区分开来有两种算法:引用计数和遍历。引用计数型垃圾收集器会在堆上的每个对象中保存一个计数器,用这个计数器来记录指向该对象的引用个数,并以此来区分活对象和垃圾对象。另一方面遍历型垃圾收集器则是从根结点开始切实地遍历整个引用图。在遍历过程中遇到的对象就做上某种标记。遍历结束后,未被标记的对象就是不可到达的,因此被作为垃圾回收。
论文目录
相关论文文献
- [1].C语言中关于指针的教学优化研究[J]. 计算机产品与流通 2020(03)
- [2].垂悬指针检测与防御方法[J]. 软件学报 2020(06)
- [3].C语言指针学习必要性分析[J]. 科技风 2020(18)
- [4].C语言指针的教学改革探索[J]. 电子元器件与信息技术 2020(05)
- [5].C++语言中悬挂指针的研究与应用[J]. 电脑知识与技术 2016(23)
- [6].开门见山与循序渐进:一种C语言指针教学方法[J]. 计算机教育 2017(04)
- [7].C语言教学中指针与数组的运用分析[J]. 通讯世界 2017(09)
- [8].浅析C指针和一维、二维数组之间的关系[J]. 电脑知识与技术 2017(28)
- [9].读懂你的表盘——指针的设计学问(上)[J]. 钟表 2015(05)
- [10].中风偏瘫患者家属对朱琏指针点按疗法认知程度的调查分析[J]. 护理实践与研究 2016(10)
- [11].深入解析C++指针类型[J]. 齐齐哈尔大学学报(自然科学版) 2016(05)
- [12].C指针在嵌入式系统开发中的方法研究[J]. 大众科技 2014(10)
- [13].C语言中指针教学的研究与探讨[J]. 电脑知识与技术 2014(31)
- [14].浅析C语言中指针的应用[J]. 科技经济市场 2014(08)
- [15].C语言中指针用法解析[J]. 中国新通信 2014(22)
- [16].日美新防卫指针指向何方[J]. 中国经贸导刊 2014(36)
- [17].试析C++中的悬挂指针问题[J]. 电脑编程技巧与维护 2014(24)
- [18].基于C语言指针教学的研究分析[J]. 才智 2015(07)
- [19].浅析新版《日美防卫合作指针》[J]. 商 2015(21)
- [20].动态认时,让指针在孩子心中转起来——“认识钟表”教学实践与思考[J]. 中小学数学(小学版) 2019(12)
- [21].C语言指针与自增自减运算解析[J]. 数码世界 2020(03)
- [22].C语言的多级指针案例教学探讨[J]. 人才培养与教学改革-浙江工商大学教学改革论文集 2013(00)
- [23].指针的奥秘人人能解[J]. 芭莎珠宝 2015(02)
- [24].指针(节选)[J]. 天涯 2015(04)
- [25].C语言指针应用[J]. 考试周刊 2014(24)
- [26].C语言中的指针[J]. 福建电脑 2013(12)
- [27].C语言中指针与数组的恩怨浅析[J]. 电脑知识与技术 2013(34)
- [28].浅谈C语言的指针[J]. 神州 2012(32)
- [29].C语言教学中指针教学问题的研究[J]. 魅力中国 2010(05)
- [30].C语言中指针应用的常见问题[J]. 考试周刊 2010(42)