收藏 分享(赏)

《编译原理》课程论文.doc

上传人:精品资料 文档编号:8257235 上传时间:2019-06-17 格式:DOC 页数:5 大小:20KB
下载 相关 举报
《编译原理》课程论文.doc_第1页
第1页 / 共5页
《编译原理》课程论文.doc_第2页
第2页 / 共5页
《编译原理》课程论文.doc_第3页
第3页 / 共5页
《编译原理》课程论文.doc_第4页
第4页 / 共5页
《编译原理》课程论文.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、编译原理课程论文编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都配有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。从功能上讲,一个编译程序就是一个语言翻译程序。语言翻译程序把一种源语言书写的程序翻译成另一种目标语言的等价程序,所以总的说编译程序是一种翻译程序,其源程序是高级语言,目标语言程序是低级语言。编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。从概念上来讲,一个编译程序的整个工作过程是划分成几个阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。一般一个编译过程是词法

2、分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。编写编译器的原理和技术具有十分普遍的意义,以至于在每个计算机工作者的职业生涯中,本书中的原理和技术都会反复用到。在这本书中,向我们介绍了文法的概念,在讲词法分析的章节中讲述了构造一个有穷自动机的方法,以及如何将一个不确定的有穷自动机转化成确定的有穷自动机和有穷自动机的最小化等方法。词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样

3、的做法道理很明显,就是要让词法分析从程序上升到理论的地步。词法分析中的重点是有穷自动机 DFA 的生成以及 DFA 和正规式与正规文法的关系。还要熟练掌握 NFA 转换为 DFA 的方法及 DFA 的化简。词法分析的核心应该是构建 DFA,最后维护一个状态转移表。通过转态转移的结果来识别词性。DFA 的思想和字典树很像。NFA 通过求每个状态的闭包后构造出的自动机与 DFA 等价。正则表达式闭包,连接,或三种操作都有相应的NFA 与其等价。所以正则表达式=NFA=DFA。DFA 状态最小化算法化简DFA。LL(1)文法主要就是根据 FIRST 集 判断向哪条路径走,来避免回溯;LR(0)文法构

4、造项集闭包构成的自动机,通过有穷自动机的状态转换来判断该规约还是该移进来做出相应的操作并且更改堆栈和 Buffer 的状态,注意此时有可能发生移进规约冲突,并且如果不运用 FOLLOW 集的话有些出错状态无法识别,只能当规约处理。SLR(0)文法是再 LR(0)的基础上运用 FOLLOW 集来判断出错状态 SLR(0)文法的无法处理移近规约冲突。LR(1)文法是在 LR(0)文法的基础上构建 LR(0)的增广项集,其他与 LR(0)相似,通过增广项集可以解决移近规约冲突问题,但无法解决部分规约规约冲突问题。LALR 貌似只是将 LR 文法中的一些等价状态合并构成一个更小的自动机,有点像 DFA

5、 状态最小化方法。算符优先文法 构造语法树的结构找到相应的优先级构成一个优先级表,两个栈,一个用来存 OP 一个用来存操作数,当两个算符相遇时判断两个算符的优先级,做出相应的操作:进栈或计算。语法分析包括自上而下和自下而上分析。自上而下分析着重掌握 LL(1)文法,自下而上分析重点掌握算符优先文法和 LR(0)、SLR(1)文法。语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL 自顶向下算法和 LR 自底向上算法。LL 算法还好说,到了 LR 算法的时候,困难就来了。很多自学编译原理的都是遇到 LR 算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词

6、法分析那样非得自己写出来才算真正的会。像 LR 算法的语法分析器,一般都是用工具 Yacc 来生成,实践中完全没有比较自己来实现。对于 LL 算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL 算法的语法分析器,不过要是换在非 C 平台,比如 Java,Delphi,你不能运用YACC 工具了,那么你就只有自己来写语法分析器。等学到词法分析和语法分析时候,你可能会出现这样的疑问:“词法分析和语法分析到底有什么?”就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过

7、词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在 DOS,Unix,Linux 下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不“规则”的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成“树”这种数据结构呢?数据结构中有 Stack, Line,List这么多数据结构,各自都有各自的特点。但是 Tree 这种结构有

8、很强的递归性,也就是说我们可以把 Tree 的任何结点 Node 提取出来后,它依旧是一颗完整的 Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在 Tree 这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,.NET,其底层的字节码 bytecode,可以说就

9、是这中基于堆栈的指令代码的。在学习文法时,对文法的组成,用法都较为明了,而在真正做题时却感到十分吃力。例如给出了一个语言,要求写出它的上下文无关文法,就感到十分棘手,所以今后在这方面要加大练习量,以熟练掌握。而在之后的词法分析和语法分析中,我感到在看基本原理时十分困难,通常要长时间钻研才能够有所了解,而一旦掌握了基本原理,做题时就感到十分顺畅了。例如,在刚接触到 LR(0)文法时,我用了大量的时间去学习它的原理,掌握之后,在列 LR(0)分析表和写分析过程时,只要思路清晰,就会比较顺畅,而且不会犯错。该门课中主要讲述的是两种分析方法,即自上而下分析的方法和自下而上分析的方法。自上而下分析法是从

10、文法的开始符号出发,反复使用各种产生式,寻找“匹配”于输入符号串的推导。自下而上的分析方法是从输入符号串开始,逐步进行“归约”到文法的开始符号。自上而下的分析法主要的就是 LL(1)文法,首先要判断某个文法是否是LL(1)文法,如果是就可以按照 LL(1)文法分析的方法去判断某一个输入串是否为该文法的句子。LL(1)f 分析方法是,首先根据判断是否为 LL(1)文法求出每一个非终结符的 SELECTE 集合来构造该文法的预测分析表,然后根据预测分析表去分析输入串得出结果;如果不是 LL(1)文法,比如说文法产生式中含有左递归和相同的因子,就要消去左递归或公共因子,再根据每一个非终结符的SELE

11、CT 集合来判断是否为 LL(1)文法。利用 LL(1)文法分析一个输入串是不是某一个文法的句子,根据预测分析表是比较直观的,而且分析的效率也是比较高的。自下而上的分析方法主要是算符优先分析方法。算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系,由于算符优先分析不考虑非终结符之间的优先关系,在归约的过程中只要找到可归约串就归约,没有考虑非终结符之间的优先关系,所以说算符优先归约不是规范规约。算符优先分析首先是要构造算符优先关系矩阵;然后就是分析输入串,根据关系矩阵进行移进或归约操作;最后分析得出判断的结果。算符优先分析是有缺点的,由于算符优先分析方法在分析的过

12、程中不知道如何确定句柄。下面要说的就是 LR(0)文法,这种方法能够根据当前分析栈中的符号串就可以惟一的确定分析器的动作是移进还是归约,并且是用哪一个产生式。根据规则写出 LR(0)的分析的项目集,再由项目集构造 LR(0)的分析表,其次根据分析栈的元素和状态,查看分析表,找出相关的句柄,是归约还是移进,最后就是分析得出结果了。SLR(0)文法是以 LR(0)文法为基础的文法,是为了解决程序设计语言的文法不能够满足 LR(0)文法条件的另一种文法分析的方法,大致的与 LR(0)的分析过程相似,只是在项目集的组合上有些区别。编译原理这门课程主要是向我们讲述是如何将一些语言编写的源程序翻译成计算机

13、能够识别的机器语言的原理。编译原理课程是一门理论性比较强的课程,其中的文法,语言等概念到 LL(1)文法、算符优先文法、LR(0 文法)以及 SLR(1)文法等的分析,基本上都是对具体问题的抽象,是需要更多的时间去理解和掌握的。通过这学期的对编译原理课程的学习,这么课程让我学会了如何去编译程序的一个理论知识,知道编译程序是通过怎样的方法把程序员编写的源程序翻译成计算机能够执行的机器语言的,我觉得主要的是大大加深了我对程序设计的理解,也对计算机的理论和软件编译有了深一步的理解。这学期的编译原理的实验使我知道了编译程序的工作的基本过程及其各阶段的基本任务,了解了 编译程序流程框图,编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,可以说这是将书本上的理论知识的应用,是对理论知识的更深一步的理解和掌握。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报