赞
踩
对于计算机专业的学生来说,肯定听说过或者上过一门课,叫做——编译原理,被称为计算机专业的天书,反正不管是学习这门课的时候,还是现在,我都是没搞懂其中的技术和知识。但就期末考试而言,提前做了几道题目,得到了90+的分数,也算是可喜可贺。各位ITer如果想检验自己的智商的话,大可以去学习编译原理,你会收获很多的。现在我把大学时整理的编译原理最基本的概念分享出来。
第一章-绪论
1. 翻译,是指在计算机中放置一个能由计算机直接执行的翻译程序,它以某一种程序设计语言(源语言)所编写的程序(源程序)作为翻译或加工的对象,当计算机翻译程序时,就将它翻译为与之等价的另一种语言(目标语言)的程序(目标程序)。
2. 编译程序与运行系统合称为编译系统。
3. 源程序的编译(或汇编)和目标程序的执行不一定在同一种计算机上完成。当源程序由另一种计算机进行编译(或汇编)时,我们将此种编译(或汇编)称为交叉编译(或汇编)。
4. 解释程序也以源程序作为它的输入,它与编译程序的主要区别是在解释程序的执行过程中不产生目标程序,而是解释执行源程序本身。
5. 编译程序的主要功能是把用高级语言编写的源程序翻译为等价的目标程序。
6. 编译程序的8个组成部分:
(1) 词法分析程序(也称扫描器)
(2) 语法分析程序
(3) 语义分析程序
(4) 中间代码分析程序
(5) 代码优化程序
(6) 目标代码生成程序
(7) 错误检查和处理程序
(8) 信息表格的管理程序
7. 编译程序的逻辑结构:(八个组成部分间的控制流程和信息流程)
源程序->(1)词法分析程序->(2)语法分析程序->(3)语义分析程序->(4)中间代码生成->(5)代码优化程序->(6)目标代码生成->目标代码
和以上1 2 3 4 5 6 相关联的还有(7)错误检查和处理程序和(8)信息表管理程序。
8. 用形如(Class,Value)的序偶(二元式)作为一个单词的内部表示。Class表示单词的类别,Value是单词的值。
9. 语法分析程序以词法分析程序所输出的用内部编码格式表示的单词序列作为输入,其任务是分析源程序的结构,判别他是否为相应程序设计语言中的一个合法程序。
10. 前后文无关文法 CFG
11. 常见的中间代码形式:逆波兰表示、三元式、四元式、树形结构
12. 目标代码生成程序以语义分析(或优化处理)所产生的中间代码作为输入,其功能是根据前面各阶段对源程序进行分析和加工所得到的有关信息,将中间代码翻译为机器语言或汇编语言形式的目标程序。
13. 编译程序的前端:(1)(2)(3)(4) 分析部分
编译程序所完成的处理工作只依赖源程序,而与运行目标程序的计算机无关。
14. 编译程序的后端:(5)(6) 综合部分
只依赖于目标语言
15. 抽象语法树 AST
第二章-前后文无关文法和语言
1. 把用一组数学符号和规则来描述语言的方式称为形式描述,而把所用的数学符号和规则称为形式语言。
2. 字母表:由若干元素所组成的有限非空集合,其中每一元素称为符号,又称字母表为符号集。
3. 符号串:用字母表中的符号所组成的任何有限序列称为符号串。
4. 把符号串中所含符号的个数称为符号串的长度。不包含任何符号的符号串称为空符号串。
5. 符号串的前缀、后缀
设x是一个符号串,把从x的尾部删去若干个(≥0)符号之后所余下的部分称为x的前缀。
设x是一个符号串,把从x的头部删去若干个(≥0)符号之后所余下的部分称为x的后缀。
X=abc ,则ε、a、ab、abc都是x的前缀;
则ε、c、bc、abc都是x的后缀。
若x的前缀(后缀)不是x本身,则将其称为x的真前缀(真后缀)。
6. 符号串的子串
从一个符号串中删去它的一个前缀和一个后缀之后余下的部分称为该符号串的子串。x的任何前缀和后缀都是x的子串,但子串不一定是x的前缀或后缀。
ε既是前缀、又是后缀、也是子串。
7. 一个符号串x与其自身的n-1次连接称为此符号串的n次方幂。记作
定义
8. 字母表A的正闭包就是由A中字母所构成的一切符号串的集合,而自反传递闭包仅比多包含一个空符号串ε
9. 一个文法G[S]可表示成形如(,,P,S)的四元式,其中,,P,均为非空有限集,分别称为终结符号集,终结符号集和产生式集。S∈,是文法的开始符号。把出现在产生式左部和右部的一切符号组成的集合称为符号集,记做V。
10. 如果一个文法中至少含有一个递归的非终结符号,则将此文法称为递归文法。
11. 如果一个语言是无限的,则定义此语言的文法必然是递归的。
12. 前后文无关文法等价问题是不可判定的,即不存在一种算法,它能判别任意两个前后文无关文法是否等价。
13. 把左部变量为A的产生式称为A-产生式
14. 句型分析,是指构造一种算法,用以判断所给的符号串是否为某一文法的句型。
15. 句型分析的方法:自顶向下的分析 自底向上的分析
16. 对于一给定的文法来说,从其开始符号到某一句型,或从一个句型到另一句型的推导序列可能不唯一。
17. 把能由最左推导推出的句型称为左句型。
18. 把能由最右推导推出的句型称为右句型。
19. 最右推导称为规范推导,右句型称为规范句型。
20. 最右推导的逆过程是最左规约。
21. 最左推导的逆过程是最右规约。
22. 最左规约称为规范规约。
23. 对于一个给定的语法树而言,它仅对应于唯一的最左推导和最右推导。
24. 前后文无关文法是否具有二义性是不可判定的。
25. 前后文无关语言的先天二义性也是不可判定的。
26. 一个句型的最左直接短语(即规范分析中,最先被规约的子串)称之为此句型的句柄。
27. 对于无二义性的文法,它的任何句型都只有唯一的语法树,因而它的任何规范句型都只有唯一的句柄,而且对于某些无二义性的文法,由于其中不含有左部不同而右部相同的产生式,故能确保句柄规约的唯一性。
28. LL分析要求文法无左递归性。
29. 算符优先分析要求文法不含有ε-产生式。
30. LR分析要求文法无二义性。
31. 如果一个产生式的左部或右部含有无用符号,则此产生式称为无用产生式。
32. 形如A->A的产生式,即使A是一个有用的符号,此类产生式也是不必要的。因而一开始就可以将这样的产生式删去。
33. 将不含形如A->A的产生式和不含无用符号及无用产生式的文法称为已化简的文法。
34. ε-产生式,是指右部为一空符号串ε的产生式。
35. 0型文法又称短语结构文法(PSG)。由0型文法所描述或定义的语言称之为0型语言。
36. 1型文法又称前后文有关文法(CSG)。相应的语言称为1型语言或前后文有关语言。
37. 2型文法又称前后文无关文法(CFG)。由2型文法所定义的语言称之为2型语言或前后文无关语言。
38. 把左线型文法和右线性文法统称为3型文法或正规文法。由3型文法描述的语言称为3型语言或正规语言。
39. 四类文法在描述语法的能力上是从0型文法开始依次减弱的。
40. BNF表示法等价于前后文无关文法。凡是能用BNF定义的语言都是前后文无关语言。
第三章-词法分析及词法分析程序
1. 词法分析和语法分析两个阶段的划分,仅仅是对整个编译程序的逻辑功能而言,而不一定指的是编译程序的执行流程。
2. 词法分析主要任务:
(1) 读源程序,产生单词符号。
(2) 滤掉空格,跳过注释、换行符。
(3) 追踪换行标志,复制出错源程序。
(4) 宏展开。
3. 利用状态转换图对符号串进行识别的方法是一个自顶向下的分析算法。
4. 一个确定的有限自动机(DFA)实际上是相应的状态转换图的一种形式描述,或者说,是状态转移矩阵的另一种表示。
5. 非确定的有限自动机(NFA)
6. 正规文法和有限自动机在描述同一语言类的意义下是相互等价的。
7. 如果我们把每类单词均视为一种语言,那么每一类单词都可用一个正规式来描述,而每一类单词中的全体单词也就组成了相应的正规集。
第四章-语法分析和语法分析程序
1. 对于表达式,常采用算符优先分析法;对于语言的其他的部分,则采用递归下降分析法。
2. 语法分析的方法,就产生语法树的方向而言,可以分为自顶向下和自底向上。
3. 采用自顶向下的语法分析,必须首先消除文法的左递归性(包括一切直接左递归和一般的左递归)。
4. LL(1)文法:相应的语法分析将自左至右的顺序扫视输入符号串,并按最左推导的方式来进行。“1”表示分析过程中,每做一次推导,只要向前查看一个输入符号便能决定所选用的产生式,而且这种选择是准确无误的。
5. 递归下降法是指对文法的每一非终结符号,都根据相应产生式各候选式的结构,为其编写一个子程序,用来识别该非终结符号所表示的语法范畴。
6. 预测分析法是一种比递归子程序法更为有效的自顶向下语法分析方法。此种方法的分析器由一张预测分析表、一个控制程序和一个分析栈组成。
7. 能由某一LL(1)文法产生的语言称为LL(1)语言。
8. LL(1)文法的主要结论:
(1) 任何LL(1)文法都是无二义性的。
(2) 左递归文法必然不是LL(1)文法。
(3) 存在一种算法,它能判断任意的文法是否为LL(1)文法。
(4) 存在一种算法,它能判定任意两个LL(1)文法是否产生相同的语言。
(5) 不存在这样的算法,它能判定任意的前后文无关语言是否为LL(1)语言。
(6) 非LL(1)语言(即不能由任何LL(1)文法产生的前后文无关语言)是存在的。
9. 自顶向下的语法分析:
(1) LL(1)文法
(2) 递归下降分析法
(3) 预测分析法
10. 自底向上的语法分析:
(1) 简单优先分析法
(2) 算符优先分析法
(3) LR分析法 包括LR(0) SLR(1) LR(1) LALR(1)
11. 移进-规约分析过程采取的动作:
(1) 移进
(2) 规约
(3) 接收
(4) 报错
12. 如果G是一算符文法,则G的任何产生式的右部,都不会出现两非终结符相邻的情况。
13. 在算符优先分析中,每次规约的符号串,是当前句型的最左素短语。
14. 算符优先分析结论:
(1) 按算符优先关系所确定的应被规约的子串恰好是当前句型的最左素短语。
(2) 尽管算符优先分析也属于自底向上语法分析的范畴,但却不是严格从左至右的规范分析,每步所得的句型自然也不是一个规范句型。
(3) 由于算符优先分析法中每一句型的最左素短语是唯一的,因此,若不顾及用非终结符来标记的那些节点上的名字,那么每一句子的树架子是唯一的。
15. 不带回溯的自顶向下分析要求文法不存在左递归性,并且每一产生式的各候选式的终结首符集两两不相交。
16. 算符优先分析方法要求文法的各终结符号序偶间至多只有一种优先关系。
17. LR(k)文法的研究证明:
(1) 每一LR(k)文法都是无二义性文法。
(2) 一个由LR(k)文法所产生的语言也可由某一LR(1)文法产生。
18. LR(0) SLR(1) LR(1) LALR(1) 分析器的比较:
(1) LR(0)分析器的分析能力最低,但它是构造其余三种LR分析器的基础。
(2) SLR是“简单LR”分析的缩写,是为了解决构造LR(0)分析器所出现的问题而形成的一种方法。分析能力比LR(0)分析器稍强。
(3) LR(1)分析器的分析能力是四种LR分析器的最强的。LALR(1)分析器的能力介于SLR(1)和LR(1)之间。分析表的规模比LR(1)分析表要小得多。
19. LR(0)项目集中的相容指不出现这样的情况:
(1) 移进项目和规约项目并存
(2) 多个规约项目并存
第五章-语法制导翻译及中间代码生成
1. 从广义上讲,在一个多遍扫描的编译程序中,每扫描源程序一次,都将产生一种与之等价的中间代码,且越往后越接近目标代码。
2. 语法翻译制导模式 Syntax-Directed Translation Schema SDTS 这种模式实际上是对前后文无关文法的扩充。
3. 什么是语法制导翻译?
就是对文法中的每个产生式都附加一个语义动作或语义子程序,且在语法分析过程中,每当需要使用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作外,还要执行相应的语义动作或调用相应的语义子程序。每个语义子程序都指明了相应产生式进行分析时所应采取的语义动作
4. 一个文法符号X的语义信息称之为语义属性或简称为属性。
5. 语法制导翻译仅对每一产生式定义了相应的语义处理,而未对如何使用产生式做任何限制,所以这种模式既可用自顶向下的语法分析,也可用自底向上的分析。
6. 语法制导翻译方法的实质。
就是根据文法中每个产生式所蕴含的语义,为其配备若干个语句或子程序,对所要完成的语义处理功能进行描述。这些语句和子程序统称为语义子程序或语义动作。
7. 将语义以“属性”的形式附加到各个文法符号上,再根据产生式所蕴含的语义,给出每个文法符号的属性的求值规则,从而形成一种附带语义属性的前后文无关文法,即属性文法。
8. 文法符号的属性就是它的语义性质。
9. 终结符号至少有一种属性,即词文。
10. 非终结符号的属性之值从其它符号的属性计算而得,是由其它符号的属性定义的。
11. 如果在一棵语法树中将每个节点均视为由若干个域组成的记录,则可将其中的一些域用来存放相应文法符号诸属性之值。并可用属性来为这些域命名。
12. 将每个节点标注相应属性值的语法树称为加注语法树或染色树。
13. 一个文法符号X在相应节点的综合属性之值,由其子节点的属性和(或)X的其他属性,通过相关属性规则经计算而得。故综合属性的求值在语法树中是自下而上的方式进行的。
14. X的继承属性之值则由X的父节点和(或)其他兄弟节点来定义,故继承属性的求值是按自上而下的方式进行的。
15. 每个产生式中的任一文法符号的属性计算规则只能是唯一的。
16. 良定义的概念!
17. 一个属性文法是良定义的,当且仅当对于它的每棵语法树T,相应的依赖关系图是一个无回路有向图。
18. 在文法产生式右部适当的位置上插入语义动作而得到的新文法称为翻译文法或增广文法。在一翻译文法中,若每个产生式右部中的全部语义动作均出现在所有文法符号的右边,这样的翻译文法为波兰翻译文法。
19. 属性翻译文法 Attribute Translation Grammar
20. 终结符号的综合属性所具有的初始值,由编译系统的词法分析程序提供。对于产生式左部符号的继承属性,将继承上一层产生式该符号已有继承属性之值。对产生式右部非终结符号的综合属性之值,则当该非终结符号出现在某个产生式q的左部时,通过q中相关符号的某些属性经计算求得。动作符号的属性取决于该动作函数的参数(自变元)来源:当自变元来自其他符号的属性时,是继承属性;反之,是综合属性。
21. 从遍历属性化语法树的角度看,继承属性的计算是先序遍历的,而综合属性的计算是后序遍历的。对一个文法符号而言,总是先计算其继承属性,再计算综合属性。
22. S-属性文法一定是L-属性文法,而且要求每个非终结符号只具有综合属性。
23. 当变量出现在赋值号左侧时,代表的是为其分配的单元地址;而出现在赋值号右侧时,代表的是该单元内存放的具体内容。
24. 数组内情向量表包括:
(1) 数组类型
(2) 维数
(3) 各维的上下界
(4) 各维的界差
(5) 每维的长度
(6) 数组的首地址
25. 两种传递实参信息的代码结构:
(1) 在控制转入被调过程之前,将各实参信息送入相应形参单元。(先结合、后调用)
(2) 把实参信息依次排列在转子指令之前,在执行转子指令而进入过程后,被调过程将根据本次调用的返回地址,找到存放实参信息的单元位置,并把各实参信息送入相应形参的形式单元,其后再安排执行过程体的中间代码。(先调用、后结合)
第六章-符号表
1. 符号表的作用?
在编译程序过程中,收集、记录和使用源程序中语法符号的类型和特征等相关信息。
这些信息以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表等等。统称为符号表。符号表的每一登记项,将填入名字标识符以及与该名字相关联的信息。这些信息全面反映各个符号的属性和编译过程中的特征。符号表组织的好坏直接影响编译系统的运行效率。
2. 变量名包含的内容:(符号的属性有哪些?)
(1) 种属(简单变量、数组、记录结构)
(2) 类型(整型、实型、字符串等等)
(3) 所分配的数据区地址(相对地址)
(4) 如果是数组,填写内情向量,并指出内情向量首地址
(5) 如果是记录结构,把登记项与各分量按某种方式连接起来
(6) 如果是形参,记录其类型
(7) 对于fortran语言,设置COMMON链地址栏及EQUIVALENCE链地址栏,以便将相关的COMMON元或EQUIVALENCE元链接在一起
(8) 定义性出现或引用性出现标志
(9) 对该变量是否进行过赋值的标志
3. 在组织一个编译程序的符号表时,应考虑如下问题:
(1) 怎样确定符号表信息栏所应存放的内容?
在能充分反映名字具体属性的前提下,应使每一登记项信息栏的长度尽可能短,以节省表区所需的存储空间。
(2) 如何确定信息栏的格式,即如何组织信息栏的各个子栏?
这依赖于对符号表登记项检索或填入信息的方式,以及目标机器的字长和指令系统。一般应采用简单而有效的方式来检索或填入信息。
(3) 由于标识符种属的不同,描述属性的信息也就不同,怎样处理信息栏长度的不同?
使不同种属名字的登记项信息在格式上尽可能一致。
一种做法是为多数名字登记项确定一个基本长度,对于需要较多空间的标识符,以两个或更多个相连的基本长度项作为一个登记项。
另一种方式是用间接表的方式阻止符号表。
第七章-运行时的存储组织与分配
1. 运行时的内存划分:
(1) 目标程序区,用来存放所生成的目标程序。
(2) 静态数据区,用来存放编译程序本身可以确定所占用存储空间大小的数据。
(3) 运行栈区,在运行时才能分配存储空间的数据就分配在运行栈。
(4) 供用户动态申请存储空间的堆区。
2. 运行时的分配策略:
(1) 静态分配。
(2) 栈式分配,或称栈式动态分配。
(3) 堆式分配,或称堆式动态分配。
3. 活动记录包括几部分?
(1) 返回的值
(2) 实在参数
(3) 任选的控制链
(4) 任选的存取链
(5) 保存的机器状态
(6) 局部数据
(7) 临时变量
第八章-代码优化
1. 循环不变量外提的条件是什么?
对于循环中的不变运算 (s) A:=B OP C
条件1:(1)s所在的基本块是循环L的各出口节点的必经节点。
(2)s是循环L的唯一定值点。
(3)对于A在循环L中的全部引用点,只有A在(s)的定值才能到达。
条件2:在满足条件1(2)及1(3)的前提下,当控制从循环L的出口节点离开循环时,变量A不再活跃。
循环L中凡是满足条件1或条件2的不变运算即可为外提的不变运算。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。