文章目录
编译原理知识总结
1、基本概念
1.1 编译器与解释器
-
翻译器
包含编译器和解释器,是一个更大的概念,跟平常英文翻译成中文一样,这里的翻译是将高级程序语言翻译成机器能识别的机器码(汇编指令) -
编译器
想到C语言,程序要执行,就要先编译成机器码,然后才能执行 -
解释器
python为代表,程序一边翻译成机器码,一边执行
1.2 编译器前端
词法分析器
涉及到 正则、DFA(确定的有限自动机)、NFA(不确定的有限自动机)语法分析器
涉及到 上下文无关文法、 LL(1)文法、LR文法语义分析器
涉及到综合属性、继承属性、带注释的语法分析树
ps:这里目前只能想到这么多,有些学的已经忘了,等复习的过程中补充
1.3 遍的概念
-
编译器将文件从头到尾读一遍称作一遍,可以理解这是一个衡量编译器效率的指标
-
一个阶段可以对文件进行多遍操作,一遍操作也可以有多个阶段(这里的阶段可以指词法分析阶段,语法分析阶段)
整个编译过程流程图
1.4 习题
-
树的三种遍历方法
对每一棵树进行相同的遍历方法,由于树的定义是递归的,也就是需要看完一棵树左子树或者右子树才往下看
- 前序遍历 顺序: 树根 => 左子树() => 右子树()
- 中序遍历 顺序: 左子树() => 树根 => 右子树()
- 后序遍历 顺序: 左子树() => 右子树() => 树根
-
题目:下图生成中间代码使用的树的遍历方式是什么?
- 答案:
后序遍历
2、词法分析器
2.1 正规式
2.1.1 基本概念
字母表:符号的有限集合, 例:Σ={0,1}
串:符号的有穷序列,例:0110, ε (空串)
语言:字母表上的一个串集{ε, 0, 00}
2.1.2 串的运算
-
连接 xy
-
积(指数) s0 为 ε,si = si-1 s
2.1.3 语言的运算
- 和:L∪M = {s | s 属于L 或 s 属于 M }
- 连接:LM = {st | s 属于L 且 t 属于 M}
- 指数:L0是{ε},Li是Li -1L (i > 0)
- 闭包:L* = L0 ∪ L1 ∪ L2 ∪…
- 正闭包: L+ = L1 ∪ L2 ∪…
2.1.4 习题
2.2 DFA 与 NFA
-
五元组
(状态集合、输入集合、初始状态,转移函数、接受状态)=> (S, s0, Σ, move, F) -
DFA识别过程:
初始状态
接受输入集合中的字符
,然后转移
到下一个状态, 最终到达接受状态
中 一个状态
2.2.1 构建确定性有限自动机
- DFA的识别过程就是构建确定性有限自动机的过程
2.2.2 不确定性有限自动机转化成确定性有限自动机
方法:子集构造法
操作:将NFA中相等的状态
合并为一个状态集合
,这个状态集合就是DFA中的一个状态
。那么什么是相等的状态?对于开始状态,不输入任何的符号或者说是输入空能到达的状态是相等的状态;然后从开始状态集合出发,集合中的每个状态对于输入符号,都能到达一些状态,这些状态是相等的状态,将能到达的状态放在一个集合,构成DFA中的一个状态
一道例题
2.2.3 确定性有限自动机的化简
- 从最开始的
终止态集合
和非终止态集合
出发,如果对于输入,产生了不在一个集合的状态
,就需要将状态进行划分
,重复上面的过程,直到不产生新的划分
2.2.4 正规式到确定性有限自动机
一些从正规式到NFA的规则
构建过程
模块化的思想
,将一个长的正规式,划分成几个模块,模块可以是上面几种基本形式,然后将模块连接起来,完成了从正规式到NFA的构建