编译原理-学习框架(精品)

来源:互联网 发布:godaddy 域名续费优惠 编辑:程序博客网 时间:2024/05/29 04:05

本文章参考教材张素琴版编译原理(清华大学出版社)编写,希望对大家的复习和学习有更好的整体上的把握。


何为编译原理?


我们可以想象,相信大家都有过一定的编程经历,我们可以类比我们最熟知的C++编程的过程。

即最初的代码(文法),代码进行初步编译(语法分析),若程序无语法问题,程序是可以直接运行的,编译器不会报错,

但这是初步的学习,我们进入更高层编程的层次就要求我们要对代码进行进一步的修改(中间代码的生成),最后我们将所得到的代码进行最终的优化(代码的优化)过程。

所以在学习这门课程的时候我们首先要树立这样的一个思维框架,才能在学习的过程中学而不乱,有条不紊。


下面说一下具体的核心知识:


对于第一章和第三章即是一些概念性的知识点,但是大家也要格外注意一些基本的概念上的细节,考试的选择和填空题目一般以这两章的知识为主。


(下面一些基本概念性的东西大家在书上找一下即可,概念很重要!!!千万不要忽视这一点)


第一章引论:主要讲述了编译程序的结构工具一类,这个大家阅读一下即可,作为基本的了解。


第三章文法和语言:这一章介绍了编译原理这门课最基础也是最核心的知识点,一定要牢牢把握文法,句子,句型,语言,短语,句柄(最左的直接短语,句柄这里要格外理解),直接短语等这些基本的概念以及相互之间的关联,一定要搞清楚。


前三章的内容即是代码的初步编写的过程,接下来我们的工作是要对代码进行相应的分析。


第四章 词法分析:


第四章,我们要区分好DFA M(确定性的)和NFA M(不确定性的)这两个自动机。


重点的考点在NFA的构造,DFA的构造,以及NFA和DFA之间的转化,正规文法,正规式的概念,DFA的化简(需要说明的是一定是DFA进行化简,确定性的事物才值得我们去做接下来的工作,所以书上没有说NFA的化简,这里大家注意一下即可)。


我相信大家看到这里肯定有同学会有这样的疑问:1.学完了之后不知道这两个自动机是做什么的?2.为什么要进行相互之间的转化?3.难道不可以将DFA转化成NFA吗,为什么一定是反过来?


下面的解释希望对大家有一些启发:我们想象在我们一开始编写程序的时候一定是一段不确定的代码程序,因为我们不能预料其结果。所以现在程序状态一定是不确定的,不能是确定性的,要是确定的话就直接为DFA(我们暂且可以顾名思义)。所以我们要进行进一步的优化,让程序可执行即确定化的过程(NFA->DFA)。不知道这样的解释大家有没有一些领悟。


考试的常考点:①NFA的构造②NFA如何转化为DFA③DFA的最小化(子集法)见教科书P61,适当做一下课后的练习1,7,8三道题以巩固知识点。

课后练习:1,3。


第四章结束。


第五章 词法分析:

学到这里想必大家已经对语法有了更加深刻的认识,下面书上介绍两种语法分析方法(自顶向下和自底向上)(ps:我一开始学习的时候总是和OSI的自顶向下的七层模型搞到一起╮( ̄▽ ̄")╭,不知道大家有木有这样的体验)


引用书上的一句话,语法分析是编译程序的核心部分(鄙人认为是最核心的,因为考试涉及最多,你说捏~)


简单来说:

自顶向下的分析即给出产生式从树根(一般是S开头)向下发展子女,形成一颗生成树,最终可以得到输入串,从而进行判别。

自底向上的分析则是移近-规约的过程是自顶向下最右推到的逆过程,这里应该不难理解(大家具体看书体会一下,先把这些概念搞清楚,有一个大体的把握)。


我们先说自顶向上的分析:说明一下,大家会想到是不是像自动机一样,这里也会有确定的和不确定的呢,答案是肯定的,通过看书大家会发现,书上大部分的章节是讲述的是确定的文法分析。不确定的情况大家作为了解。

在这里有一个很重要的文法类型就是LL(1)型文法,要重点掌握LL(1)型文法的判别规则,First集,Follow集,Select集的具体求法(注意有空产生式和非空产生式求发上是不同的),非LL(1)文法和LL(1)文法之间的相互转换的过程。


这里为什么会存在非LL(1)文法,是因为如果产生式中存在有直接和间接左递归,含有左公共因子的情况都是不满足LL(1)文法的条件,所以我们需要将其转化为LL(1)文法近一步分析。大体的知识点就这么多,大家要对这一章要重视,因为后面的会在这个基础上逐渐加深难度。


第六章 自底向上的优先分析:


这一章和下面的一章第七章的内容是考试最为热门的考点,大题集中在这两章,希望大家注意上课的时候一定一定一定不能走神!(丑话说在前面,如果不,到时候你的复习会十分难过)。


第六章介绍了两种自底向上的分析方法:①简单优先分析法②算符优先分析法


大家的学习和复习的重点放第二种分析法,第一种到后来你会发现,其实了解概念就可以了。


算符优先文法学习和复习时一定要格外留意:①算符的优先关系的求解(.>,<.,=)②优先关系表的绘制(这都是很关键的前提,直接关系到后面的结果,马虎不得)。

优先函数的确定(这里是比较难懂的地方,当初学习的时候在这里溜号,回去花了一天的时间没搞懂,也可能是智商的问题。)


优先函数的确定有两种方法一般建议用第二种(优先函数关系图):虽然略麻烦,但比较直观,容易上手。大家对这里的学习要格外注意哦!


第六章结束。

第七章 LR分析:


第七章的内容相比第六章的内容,内容更加丰富,知识面更广,覆盖面更多。所以大家要不断巩固这里的知识。

本章介绍了四种LR分析的方法:LR(0),SLR(1),LALR(1),LR(1)(注,这是按照文法的限制程度,从左到右适用性即限制性依次降低)。


何为LR分析法


LR分析法是一种自下而上进行规范归约的语法分析法,L指从左到右扫描输入符号串,R是指构造最右推导的逆过程。LR(1)中的1是每次搜索符号需要向前参考一步,即参考下一个符号确定当前构造。(说的直白一点,就是自底向上的分析方法,对输入串进行移进规约的操作,这个大家到后期学习会领悟到~)


LR分析的核心是构造项目集规范族(书P130开始)。


LR(0)是四种分析中最为简单的一种,因为简单,所以对文法的要求很高,限制性很强,若产生移近-规约,规约-规约冲突的情况,用此分析方法是无法进行解决的。

所以此时我们引入了SLR(1)文法来进行解决,这个方法可以解决大部分的冲突,但有些冲突仍然是无法解决的,这时我们需要掌握适用性最强的LR(1)文法(这里的LALR(1)文法其实就是简化了的LR(1)文法,也就是引入了一个同心集的概念)。无论是上述的哪种分析方法,项目集规范族的正确书写是解决问题的关键所在,所以大家在这里要多下功夫,多做一些课后习题。


第七章结束。


第八章 语法制导翻译和中间代码生成:


这一章说实在是最让人头疼的一章,因为很多老师在这一章会卡住,他们也讲得很含糊。但是我们还是要理解并掌握。

概念性的知识:①属性文法②语义规则③S型和L型属性文法的区别(大家一定要结合书上的例题来看,光看概念收效甚微)

④中间代码的表示:

1.逆波兰式(考试重点)

2.三元式和树形表示

3.四元式

(以上的三种表示形式也有可能在填空题里出现哈,大家留意一下)


(ps:后面的章节由于时间关系老师就没有讲,如果有学到的同学记得分享一下哈,在这里我就不过多讲解了)


第八章结束。


第十一章 代码的优化:


重点是在第二小结,局部优化,包括对基本块的理解,DAG图的应用,都是考试的必考点。(其他的话大家自己看一下就好。PS:强行解释)


第十一章结束。


不知看到这里的你是否对这门课程有了一点清楚的认知呢,学习的道路还很漫长,你我共同努力~。



0 0