编译原理课程报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理课程报告

学 院: 信息工程学院

专 业: 软件工程

姓 名: 赖杰

学 号: 09927212

指导老师: 朱文华

完成时间: 2012.5.19

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法,在计算机本科教学中占有十分重要的地位。

编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都配有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。从功能上讲,一个编译程序就是一个语言翻译程序。语言翻译程序把一种源语言书写的程序翻译成另一种目标语言的等价程序,所以总的说编译程序是一种翻译程序,其源程序是高级语言,目标语言程序是低级语言。

编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。从概念上来讲,一个编译程序的整个工作过程是划分成几个阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。一般一个编译过程是词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。

编写编译器的原理和技术具有十分普遍的意义,以至于在每个计算机工作者的职业生涯中,本书中的原理和技术都会反复用到。在这本书中,向我们介绍了文法的概念,在讲词法分析的章节中讲述了构造一个

有穷自动机的方法,以及如何将一个不确定的有穷自动机转化成确定的有穷自动机和有穷自动机的最小化等方法。

该门课中主要讲述的是两种分析方法,即自上而下分析的方法和自下而上分析的方法。自上而下分析法是从文法的开始符号出发,反复使用各种产生式,寻找“匹配”于输入符号串的推导。自下而上的分析方法是从输入符号串开始,逐步进行“归约”到文法的开始符号。

1. 自上而下的分析法主要的就是LL(1)文法,首先要判断某个

文法是否是LL(1)文法,如果是就可以按照LL(1)文法分析

的方法去判断某一个输入串是否为该文法的句子。LL(1)f

分析方法是,首先根据判断是否为LL(1)文法求出每一个非

终结符的SELECTE集合来构造该文法的预测分析表,然后根

据预测分析表去分析输入串得出结果;如果不是LL(1)文

法,比如说文法产生式中含有左递归和相同的因子,就要

消去左递归或公共因子,再根据每一个非终结符的SELECT

集合来判断是否为LL(1)文法。利用LL(1)文法分析一个输

入串是不是某一个文法的句子,根据预测分析表是比较直

观的,而且分析的效率也是比较高的。

2. 自下而上的分析方法主要是算符优先分析方法。算符优先

分析的基本思想是只规定算符之间的优先关系,也就是只

考虑终结符之间的优先关系,由于算符优先分析不考虑非

终结符之间的优先关系,在归约的过程中只要找到可归约

串就归约,没有考虑非终结符之间的优先关系,所以说算

符优先归约不是规范规约。算符优先分析首先是要构造算

符优先关系矩阵;然后就是分析输入串,根据关系矩阵进

行移进或归约操作;最后分析得出判断的结果。

3. 算符优先分析是有缺点的,由于算符优先分析方法在分析

的过程中不知道如何确定句柄。下面要说的就是LR(0)文

法,这种方法能够根据当前分析栈中的符号串就可以惟一

的确定分析器的动作是移进还是归约,并且是用哪一个产

生式。根据规则写出LR(0)的分析的项目集,再由项目集构

造LR(0)的分析表,其次根据分析栈的元素和状态,查看分

析表,找出相关的句柄,是归约还是移进,最后就是分析

得出结果了。SLR(0)文法是以LR(0)文法为基础的文法,是

为了解决程序设计语言的文法不能够满足LR(0)文法条件的

另一种文法分析的方法,大致的与LR(0)的分析过程相似,

只是在项目集的组合上有些区别。

该课程理论性与实践性都很强,我在学习时普遍感到内容非常抽象,不易理解,内容多且繁琐,难以完整、全面地掌握编译原理的有关知识,更不用说灵活运用编译原理知识从事相关设计或应用于其他领域。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对我提供了系统而有效的训练,有利于提高软件人员的素质和能力。

在我学习编译原理以前,都认为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高。而在后来的学习中,我逐渐认识到计算机专业的学生,除了要会编写程序语言之外,还应该了解它是如何被计算机所识别,这才是真正并且透彻地学习软件。另外,编译器中每一个模块的编写,都能对我的编程能力的提高有很大帮助。在今后若从事软件工程,这门课程也能够对编写程序有所帮助。

为了能够系统掌握这门专业课,我把编译原理分为以下几个模块:①语言和文法;②词法分析;③语法分析;④语义分析和中间代码生成;⑤代码优化和目标代码生成。

在学习的开始,我需要掌握什么是编译,编译分为哪些阶段,编译程序和解释程序的区别等等。在做好了这些方面的准备后,开始了系统的学习。

语言和文法部分的知识包括文法基本概念及文法的二义性。基本概念有文法定义、推导、句型、句子等等。二义性文法是通过画语法树的方法来证明。

词法分析中的重点是有穷自动机DFA的生成以及DFA和正规式与正规文法的关系。还要熟练掌握NFA转换为DFA的方法及DFA的化简。

语法分析包括自上而下和自下而上分析。自上而下分析着重掌握LL(1)文法,自下而上分析重点掌握算符优先文法和LR(0)、SLR(1)文法。

语义分析重点是其功能,中间代码生成和语法制导翻译定义与方法。

最后,优化分为局部优化和循环优化,重点理解一些关键词,如基本块、流图等,要学会自己画出程序流图。用DAG图进行局部优化是重点。

在学习文法时,对文法的组成,用法都较为明了,而在真正做题时却感到十分吃力。例如给出了一个语言,要求写出它的上下文无关文法,就感到十分棘手,所以今后在这方面要加大练习量,以熟练掌握。

而在之后的词法分析和语法分析中,我感到在看基本原理时十分困难,通常要长时间钻研才能够有所了解,而一旦掌握了基本原理,做题时就感到十分顺畅了。例如,在刚接触到LR(0)文法时,我用了大量

相关文档
最新文档