编译原理学习总结

        这一学期在老师的指导下,我们学习了编译原理这一门学科。编译原理是介绍的是对一个程序进行编译的过程,之前的时候我们只是学习了高级语言会用高级语言写相应的程序,并不知道程序是如何编译运行的,编译原理这门课就是解决这个问题的,,编译程序的工作,从输入源程序开始到输出目标程序为止的整个过程,是非常复杂的,虽然他和人们进行自然语言之间的翻译有很多的相似之处。编译原理这门课程的学习对于我来说还是有一定难度的,有很多地方理解的并不是很透彻,下面是我这学期学到的主要内容的总结,在学习过程中遇到的问题,和自己的一点感悟。

学习总结:

      首先,从总体上来看,一个编译程序主要分为五个部分:词法分析器,语法分析器,语义分析和中间代码的生成器,优化器,目标代码生成器。以上编译过程的五个阶段是编译程序工作时的动态特征。五个模块之间是紧密联系的,他与我们之前学习高级语言有所不同,是一个完整的过程。

      词法分析中的重点是有穷自动机DFA的生成以及DFA和正规式与正规文法的关系,以及NFA装还成DFA的方法和DFA的化简。词法分析的核心是构建DFA,最后建立一个状态转移表,通过转移的结构来识别词性。

      编译原理这门课主要讲述了两种分析方法,自上而下的分析和自下而上的分析方法。自上而下的分析是从文法符号开始,反复使用各种产生式,寻找匹配于输入符号串的推导。自下而上的分析方法是从输入符号串开始,逐步进行规约到文法符号。自上而下的分析主要就是ll(1)文法,首先要判断某个文法是否是ll(1)文法,如果是ll(1)文法就用其方法进行分析。自下而上的分析主要是算符优先分析和lr分析,两种方法各有优缺点,可根据题目要求进行选择。

      关于语义分析部分,比如书语法指导翻译类型检查部分,其实都是一种完善前面我们学到的抽象语法书的构成。程序的语义确定程序的运行,语义分析的任务就是分析这样的语义。语义分析的重点是其功能,中间代码的生成和语法制导翻译定义与方法。主要是对综合属性和继承属性的分析。

学习中遇到的问题:

确定有限自动机的化简:

将可区别的不同状态进行划分,最后在每个子集内选出代表,进行化简。

1.把s的终态与非终态首先区分。

2.对非终态的子集根据等价的概念进行划分,等价的元素分到一个子集当中(s和t等价的概念:从状态s出发能读出某个字w,并停于终态,同样从t出发也能读出某个字w,并停于终态,则s.t等价)。

3.划分结束,每组内选出一个状态,选出的这个状态将会把分组中其他状态的弧都导入到自己身上,完成最小化。

消除文法的左递归

1.观察文法的格式,构造出非终结符直接左递归的文法。

2.根据上文中提到的公式对文法进行左递归的消除。

3.当非终结符的顺寻不一样时,构造的文法会不同。

构造预测分析表:

1.找出非终结符的first和follow集。

 2.若该非终结符能够推出对应的终结符,就把该非终结符的表达式写到对应的终结符下边。

 3.若first集没有对应的终结符,而这个非终结符能够推出空字符,那么如果该非终结符的follow集含有该终结符,则写在表格上。

算符优先分析法:

1.      确定FIRSTVT和LASTVT集合。

2.      构造出算符优先关系表

3.      根据优先性进行规约。

LR(0)文法构造语法分析表:

1.写出给定文法的全部项目集。

2.通过转换函数构造DFA的一个状态集。

3.通过语法分析的规则构造出分析表。

中间代码的生成:

转换成三地址代码的过程需要了解代码的意义,知道循环,跳转,赋值语句等中间代码的翻译,把三地址代码转换成四元式表示。

学习感悟

       对于我而言,我觉得编译原理是一门理论性比较强的课程,其中的文法,语言等概念到LL(1)文法,算符优先文法,LR(0)文法以及SLR(1)文法等分析,基本上都是对具体问题的抽象,是需要更多的时间去理解和掌握的。通过这学期编译原理的学习,让我学会了编译程序是通过什么样的方法把程序员编写的源程序翻译成计算机能够执行的机器语言的,我觉得这大大加深了我对程序设计的理解,也对计算机的理论和软件编译有了深一步的了解,总之,感觉编译原理的学习与之前的高级语言的学习在很多方面是不同,通过这学期的学习我的收获还是很多的,相信在这门课中学习到的内容,一定会对我未来的学习有很大的帮助。

你可能感兴趣的:(编译原理学习总结)