目录
知识点
第一章
第二章
第三章
第四章
第五章
第六~十一章
计算题
第三章(P49-图3.6、P65-15、P64-12(b))
第四章(P75-例4.5、P81-1、P81-4)
第五章(P105-例5.8、P111-例5.11、P134-5)
描述规则
设计应用题2道,共15分
单选题10道(每题2分)
考核:各章节知识点
编译前端:
1. 词法分析:将代码分解为单个的单词(token)。
2. 语法分析:根据语法规则确定代码结构,建立抽象语法树(AST)。
3. 语义分析:验证代码是否符合语言语义,如类型检查等。
4. 中间代码生成:将AST转换成中间表示形式,如三地址码等。
5. 优化:对中间表示形式进行优化,优化目标可以是时间或空间。
编译后端:
1. 目标代码生成:将中间代码转换成目标机器汇编代码。
2. 代码优化:对目标机器汇编代码进行优化,如指令重排序、寄存器分配等。
3. 汇编:将汇编代码转换成机器码二进制文件。
4. 链接:将目标文件和库文件链接成可执行文件或库文件。
1. 语言词法和语法分析:需要了解如何设计和实现一个词法分析器和语法分析器,以将源代码转换成抽象语法树(AST)。
2. 语义分析:需要了解如何进行类型检查、作用域分析、符号表管理等,以确保源代码的正确性和一致性。
3. 中间代码生成:需要了解中间表示形式,例如三地址码、LLVM IR等,并能够将AST转换为中间代码。
4. 优化技术:需要了解编译器优化技术,如控制流优化、数据流分析、指令选择、寄存器分配等,以提高程序的性能。
5. 目标代码生成:需要了解目标机器的体系结构、指令集、寄存器等,并能够将中间代码转换为目标机器汇编代码。
6. 链接和装载:需要了解可执行文件的格式、链接器的作用、共享库的管理等。
7. 调试和错误处理:需要了解调试工具的使用方法,以及如何定位和修复编译器本身或被编译程序出现的错误。
8. 操作系统和计算机体系结构:需要了解操作系统和计算机体系结构的基本原理,以了解编译器运行环境的工作方式和限制。
假设我们有一个字母表Σ,以及两个子集U和V,其形式化定义如下:
1. 子集 U 与 V 的连接:U 和 V 的连接可以表示为 U·V,表示由一个属于 U 中元素作为前缀,后面跟着一个属于 V 中元素的字符串所组成的集合。即:
```
U·V = { uv | u∈U, v∈V }
```
2. V 的 n 次自身积:V 的 n 次自身积可以表示为 V^n,表示由 V 中所有字符串按照重复 n 次的方式所组成的集合。即:
```
V^n = { v1v2...vn | vi∈V, 1<=i<=n }
```
3. V 的闭包:V 的闭包可以表示为 V*,表示由 V 中所有字符串重复任意次并连接所组成的集合。即:
```
V* = { ε } ∪ V ∪ (V·V) ∪ (V·V·V) ∪ ... = ⋃(n>=0) V^n
```
4. V 的正则闭包:V 的正则闭包可以表示为 V+,表示由 V 中所有字符串重复至少一次并连接所组成的集合。即:
```
V+ = V ∪ (V·V) ∪ (V·V·V) ∪ ... = ⋃(n>=1) V^n
```
其中,ε 表示空字符串。
乔姆斯基提出了四种类型的文法,分别为0型文法、1型文法、2型文法和3型文法。
其中,0型文法又称为无限制文法,它没有任何限制,可以产生任何形式的句子和语言。1型文法又称为上下文有关文法,它的产生式规则的左部和右部都可以包含终结符和非终结符,并且右部可以包含上下文相关的内容。2型文法又称为上下文无关文法,它的产生式规则的左部只能是一个非终结符,右部可以是任意长度的终结符和非终结符的组合。3型文法又称为正则文法,它的产生式规则的左部只能是一个非终结符,右部只能包含一个终结符或者一个非终结符加上一个终结符。
因此,与上下文无关文法对应的是2型文法,而与正则文法对应的则是3型文法。
正规文法、左线性文法和右线性文法都是形式化语言的文法类型,它们之间存在一定的关系。
1. 正规文法
正规文法是指只包含以下三种产生式形式的文法:
- A → aB,其中A和B是非终结符号,a是终结符。
- A → a,其中A是非终结符号,a是终结符。
- A → ε,其中A是非终结符号,ε表示空串。
换句话说,正规文法只包含右线性产生式和ε产生式。正规文法可以用来生成正则语言,且正则语言也可以通过正规文法描述和定义。
2. 左线性文法
左线性文法是指只包含以下两种产生式形式的文法:
- A → Ba,其中A和B是非终结符号,a是终结符。
- A → ε,其中A是非终结符号,ε表示空串。
换句话说,左线性文法只包含左线性产生式和ε产生式。左线性文法可以用来描述左正则语言,即只包含左正则表达式的语言。
3. 右线性文法
右线性文法与左线性文法相似,不同之处在于右线性文法只包含右线性产生式,即产生式的右侧都由终结符或一个非终结符和一个终结符构成。右线性文法可以用来描述右正则语言,即只包含右正则表达式的语言。
这三种文法之间的关系在一定条件下是等价的,比如对于任何正则语言L,都可以找到一个等价的左线性或右线性文法描述它,反之亦然。同时,可以通过某些算法将不同类型的文法相互转换,如可以通过构造D
DFA和NFA都是有限状态自动机(finite state automaton)的形式化模型,用于描述识别和处理正则语言的能力。
DFA(Deterministic Finite Automaton)是指一个五元组(Q, Σ, δ, q0, F),其中:
- Q:表示状态的有限集合;
- Σ:表示输入的有限字母表;
- δ:表示从一个状态转移到下一个状态的转移函数,它的形式为:δ: Q × Σ → Q;
- q0:表示初始状态;
- F:表示接受状态的集合,F ⊆ Q。
换句话说,DFA是一种有确定性的有限状态机,每次从当前状态通过一个输入符号转移到下一个状态,直到达到某个接受状态或无法继续转移为止。
NFA(Nondeterministic Finite Automaton)是指一个五元组(Q, Σ, δ, q0, F),其中:
- Q:表示状态的有限集合;
- Σ:表示输入的有限字母表;
- δ:表示从一个状态转移到下一个状态的转移函数,它的形式为:δ: Q × Σε → P(Q)。其中,P(Q) 表示状态的幂集;
- q0:表示初始状态;
- F:表示接受状态的集合,F ⊆ Q。
与DFA相比,NFA允许其在同一时刻同时处于多种状态,即具有非确定性。在转移时,它可以选择多种路径中的一条,也可以同时进行多个状态的转移。
需要注意的是,虽然NFA具有非确定性,但最终仍需要由DFA或其他模型实现自动机的实际识别过程。
1. DFA与正规文法/正规式的转换
对于任意一个DFA,都可以构造出一个等价的正规文法或正规式,反之亦然。具体地,可以通过迭代地消除非终结符号来从DFA中构造正规文法或正规式;而从正规文法或正规式中构造DFA,则可以使用Thompson构造法或子集构造法。
2. NFA与正规文法/正规式的转换
类似于DFA,对于任意一个NFA,也可以构造出一个等价的正规文法或正规式。但是,由于NFA具有非确定性,因此需要先将其转化为DFA,再进行后续的构造。
3. 左线性文法与右线性文法的转换
左线性文法和右线性文法之间可以相互转换,方法是将产生式中所有的左侧变量转化为右侧变量或者将所有的右侧变量转化为左侧变量。即对于左线性文法的每个产生式A→aB和B→bC,可以将其分别转换为A→Ba'和B→Cb',得到等价的右线性文法;反之,对于右线性文法的每个产生式A→Bb和B→Ca,可以将其分别转换为A→a'B和B→b'C,得到等价的左线性文法。
总结起来,这些形式化模型之间之间存在相互转换的关系,可以互相补充、验证和转化,这在语言处理和编译器设计中有着重要的应用。
推导和归约是逻辑学中两个重要的概念,它们之间有着密切的关系。
推导是指在给定的前提条件下,通过逻辑推理得出结论的过程,通常用符号表示为“前提1、前提2、……前提n,推出结论”。推导是一种基于逻辑规则的演绎推理方法,通过对已知事实和规则进行严密的推理,来得出新的结论或证实现有结论的正确性。
归约是一种从复杂对象或问题中提取出简单元素或关系的方法。归约可以将一个复杂问题分解成若干个单独的部分,使得每个部分都能够独立地解决。例如,在数学中,归约指把一个问题转化为更简单的形式,从而能够更容易地解决问题。
推导和归约有密切的联系,因为推导可以看作是一系列归约操作的组合。具体来说,推导过程中需要不断地对已知的前提进行归约,从而将问题简化,最终得出结论。在推导的过程中,经常会运用到各种归约方法,如化简、替换、变形等。
总之,推导是通过逻辑规则得出结论的过程,归约是对复杂问题进行简化的方法,推导过程中需要不断地运用归约方法。
最左归约=规范归约 最右推导=规范推导
最左推导和最右归约、最右推导和最左归约、规范推导和规范归约是相互对应的概念,它们之间有如下关系:
1. 最左推导和最右归约:最左推导是指在推导过程中总是选取产生式中最左边的非终结符进行替换,而最右归约则是指在规约过程中总是将最靠右的句柄替换为相应的非终结符。它们之间是相互对应的。
2. 最右推导和最左归约:最右推导是指在推导过程中总是选取产生式中最右边的非终结符进行替换,而最左归约则是指在规约过程中总是将最靠左的句柄替换为相应的非终结符。它们之间也是相互对应的。
3. 规范推导和规范归约:规范推导是指在推导过程中总是选择最左边的非终结符进行替换,直到无法进行下去为止;规范归约则是指在规约过程中总是选择最右边的句柄进行替换,直到句柄完全归约为起始符号为止。规范推导和规范归约也是相互对应的。
总的来说,最左推导和最右归约、最右推导和最左归约、规范推导和规范归约都是描述文法推导过程和规约过程的方式,它们之间是相互对应的关系。
属性文法分为两类:自下而上传递信息的继承属性文法和自上而下传递信息的综合属性文法。
继承属性文法是自下而上传递信息的,即从父节点向子节点传递属性值的过程。每个节点定义一个或多个属性,这些属性的值来自于其父节点的属性值,即每个节点的属性值都是由其祖先节点的属性值计算得出的。因此,在一棵树形结构中,继承属性可以通过自下而上的顺序来计算。
综合属性文法是自上而下传递信息的,即从根节点向叶节点传递属性值的过程。每个节点定义一个或多个属性,这些属性的值需要从该节点的子节点的属性值和其他相关信息中综合计算得出。因此,在一棵树形结构中,综合属性可以通过自上而下的顺序来计算。
1. 不要过早优化:先让代码跑起来,再考虑优化。在开发初期,过早地优化可能会导致代码变得复杂、难以维护而不一定带来明显的性能提升。
2. 避免重复计算:如果某个计算结果被反复调用,可以将其缓存起来,避免重复计算。
3. 减少访问次数:访问内存和输入输出设备是比较慢的操作,应该尽量减少访问的次数。比如可以在循环中使用局部变量代替全局变量。
4. 选择高效的算法和数据结构:合理选择算法和数据结构可以极大地提高程序的效率。
5. 并行化处理:多线程或分布式计算可以利用多核心优势,加快程序的执行速度。
6. 代码可读性:代码优化不仅仅是性能的提升,还包括代码的可读性、可维护性等方面。应该尽可能地写出清晰、简洁、易于理解的代码。
1. 文本文件:最常见的输出形式,以文本文件的形式将生成的代码保存在本地磁盘中,方便开发人员进行后续的编辑和修改。
2. 代码片段:当我们需要将生成的代码嵌入到现有的代码文件或模板中时,生成器可以提供特定的代码片段。
3. 二进制文件:某些生成器可以直接输出编译好的二进制文件,这种方式适用于需要直接在生产环境中使用的场景。
4. API:有些生成器可以提供API接口,通过调用接口来获取生成的代码,这种方式适合于需要实现自动化集成的场景。
5. 插件:对于一些常用的开发工具,生成器也可以提供相应的插件,方便开发人员快速生成代码。
编译程序的工作过程一般划分为五个阶段:1词法分析、2语法分析、3语义分析与中间代码产生、4优化、5目标代码生成。
词法分析:也就是从左到右一个一个的读入源程序,识别一个单词或符号,并进行归类。
语法分析: 在词法分析的基础上,将单词序列分解成各类语法短语,如“程序”,“语句”,“表达式”等。
语义分析:审查源程序是否有语义的错误,当不符合语言规范的时候,程序就会报错。
中间代码生成:在进行了语法和语义的分析工作之后,编译程序将源程序变成了一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。
代码优化:这个阶段是对前阶段的中间代码进行变换或改造,目的是使生成的目标代码更为高效,即节省时间和空间。
目标代码生成:也就是把优化后的中间代码变换成指令代码或汇编代码。
乔姆斯基类型文法是针对自然语言的一种分类方法,它将文法分为四个类型(以由 Chomsky 发明者名字命名):
1. 0 型文法(无限制文法):规则形式无限制。这些语法规则适用于任何形式的语言。
2. 1 型文法(上下文有关文法):规则形式是 A -> B,其中 A 和 B 是符号串,且 A 至少包含一个非终结符号。
3. 2 型文法(上下文无关文法):规则形式是 A -> B,其中 A 是一个非终结符号,B 是一个符号串,可以是非终结符号、终结符号串或空串,但不包含上下文信息。
4. 3 型文法(正则文法):规则形式是 A -> aB 或 A -> a,其中 A 和 B 是非终结符号,a 是终结符号。
简单来说,0 型文法最为强大,3 型文法最为弱小。随着文法类型的增加,产生的语言集合越来越小,但对于一般的自然语言处理任务,2 型文法已经足够使用了。
DFA 与 NFA 的区别表现为两个方面 : 一是 NFA 可以若干个开始状态,而 DFA 仅只一个开始状态。 另一方面, DFA 的映象 M 是从 K×∑ 到 K ,而 NFA 的映象 M 是从K×∑到K的子集,即映象 M 将产生一个状态集合(可能为空集),而不是单个状态。
LL(1)的含义为:第一个L表明自顶向下分析时从左向右扫描输入串,第二个L表明分析过程将最左推导,1表明只需向右看一个符号便可决定如何推导,即选择那个产生式进行推导。
(1)便于进行与机器无关的代码优化;
(2)使编译程序改变目标机更容易;易于编译器的移植
(3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰。
P65-15:
P64-12(b):
其他博主:
P75-例4.5:
P81-1:
P81-4:
emmm我自己写的,拍出来可能不清楚,所以推荐去看看这个博主的LL1分析表构造
-->LL(1)文法定义p73
P105-例5.8:
P111-例5.11:
P134-5:
看看上面例题P134-5
看看上面例题P134-5
注意区分LR和SLR。。。
考核:给出自然语言描述的规则要求,可用正规式、NFA描述该规则。
参考题:
(1) C语言的标识符;
(2) 以01结尾的二进制数串;
(3) 含有子串010的所有二进制数串;
(4) 包含奇数个1或奇数个0的二进制串;
(5) 不包含字串abb的由a和b组成的符号串的全体。
(1) (_|letter)(_|digit|letter)*
(2) (1|0)*01
(3) (0|1)*010(0|1)*
(4) ((0|1)*0|空)1(11)*(空|0(0|1)*)|((0|1)*1|空)0(00)*(空|1(0|1)*)
(5) bb*|(bb*a|a)(a|ab)*