编译原理
文章目录
计算机程序语言及编译
- 高级语言
- 数学公式
- 和自然语言表达
- 汇编语言
- 引入主记符
- 机器语言
- 01组成的二进制形式
- 一般使用十六进制数表示[易于理解]
- 可以被计算机直接理解
- 三者之间的关系
- 高级语言->编译->汇编语言->汇编->机器语言
- 高级语言->编译->机器语言
- 源语言: 高级语言
- 目标语言:机器或者汇编语言
编译的本质就是一个翻译的过程
编译器在语言处理系统中的位置
源程序
|
预处理器
|
经过预处理的源程序
|
编译器
|
汇编语言程序
|
汇编器
|
可重定向的机器代码 [可重定向: 内存中起始地址是不固定的]
|
链接起/加载器 [加载器:可修改重定向地址] [链接器:连接库文件,解决外部内存地址,引用其他程序的文件]
|
目标机器代码 [绝对地址=起始地址+相对地址]
编译系统的结构
字符流
|
词法分析 [词法单元流]
|
语法分析 [语法树]
|
语义分析 [语法树][独立于具体的编程语言]
|
中间代码生成器 [中间表示形式]
|
机器无关代码优化 [中间表示形式]
|
目标代码生成器 [目标机器语言]
|
机器相关代码优化 [目标机器语言]
- 组成
- 分析部分 [与源语言相关]
- 综合部分 [与目标语言相关]
- 还有一个就是中间阶段
词法分析
- 工作任务
- 从左向右逐行扫描源程序的字符
- 识别单词 [机内表示->词法单元形式表示,也就是token表示] [token类似于一个map键值对,多个token和其他字符组成token序列]
- 确定单词类型
- 单词类型 [种别码]
- 关键字 :一对一
- 标识符: 多对一
- 常量: 一对一
- 运算符:一对一
- 界限符:一对一
语法分析 [概述]
- 工作任务
- 处理词法分析器中输出的token序列 [token序列上述略有提到]
- 识别各类短语
- 构造语法分析树
- 文法
- D:声明语句
- T:类型
- DIS:标识符序列
语义分析[概述]
- 工作任务
- 收集标识符的属性信息
- 语义检查
- 属性信息
- 种属 [比如:数组,常数]
- 类型
- 存储位置和长度
- 值
- 作用域
- 参数和返回值信息
- 符号表
- 存储标识符的属性信息的一个数据结构
- 语义检查
- 变量或者函数未经声明就使用
- 变量或者函数重复声明
- 运算类型不一致 [隐式转换]
- 操作数和操作符之间的类型不匹配
- 数组下标非整数
- 非数组标量使用下标访问
- 非函数使用函数调用
- 函数参数或者参数类型不正确
- 函数返回值不正确
中间代码生成
-
源程序的中间表示形式
- 三地址码 [每个指令最多有三个操作数]
- 语法结构树/语法树
-
指令类型
- 赋值指令
- 赋值类型
- 条件跳转
- 非条件跳转
- 参数传递
- 函数调用
- 函数返回
- 数组引用
- 数组赋值
- 地址和指针操作
-
三地址表示形式
-
四元式 [最多三个操作数,一个操作符]
-
三元式
-
间接三元式
文法
- 字母表
- ∑ 表示
- 有穷符合集合 [符号: 字母,数字,标点符号 ]
- 字母表运算
- 相乘
- 幂次方
- 正闭包 [长度正数的符号构成的集合] [{a,b,c,d}+]
- 克林闭包 [任意符号串构成的集合,长度可以为0]
- 串
- 又穷的字符序列
- 串的运算
- 连接
- 空串
- 幂运算
- 文法定义
- 未使用尖括号括起来的表示基本符号
- 尖括号括起来的表示语法表示
- 文法的形式化定义
- 终结符集合: token
- 非终结符集合:语法变量
- 产生式集合:产生串的式子
- 开始符号:
- 产生式简写
- a->b,a->c [可以写成 a->b |c] b,c为a的候选式
- 符号约定
- 终结符的约定
- 非终结符的约定
- 文法符号串 [可以表示终结符或者非终结符]
- 推到和规约 [这是一个逆过程]
- 文法的分类
- 0型文法
- 无限制文法
a->b
,a至少包含一个非终结符- 1 型文法
- 上下文有关文法
a->b
,a符号的个数小于等于b符号的个数- b不包含空串形式
- 2型文法
- 上下文无关文法
- 3型文法
- 正则文法
- 左线性
- 右线性
上下文无关文法分析树
- 根节点: 文法开始符号
- 内部节点: 产生式的
a->b
应用 - 叶节点: 可以是终结符或者非终结符
- 边缘或者树的产出: 从左到右排列叶节点
- 短语: 分析树中每棵子树的边缘组成短语
- 直接短语: 只有父子两代的节点的短语
- 二义性文法: 一个文法生成多个分析树
正则表达式
- 何为正则 RE
- 字符串匹配模式
+
出现1 多 次
*
出现0 1 多 次
?
出现0 1 次
$
结束位置()
子表达式的开始和结束.
除换行符之外的任意单字符^
开始位置|
两项之间的选择{2}
确定的两次{2,}
至少两次{2,5}
最少两次,最多五次\b
边界单词\B
非边界单词x|y
两者中的一个[xyz]
任意一个[^xyz]
不匹配其中的任意一个[a-z]
范围
有穷自动机
- 离散的输入输出
- 又穷的内部状态
- 转换图
- 初始状态 :start箭头指示
- 终止状态: 双圈 [可以有多个]
- 带有标记的箭头
- 分类
- 确定的有穷自动机 DFA
- 不确定的有穷自动机 NFA
- 由正则表达式构造确定有穷自动
- 先是RE->NDF
- 再是NFA->DFA
r1r2
串联r1|r2
并联r1*克林闭包
自我循环- DFA的每一个状态都是NFA状态的集合
- 空边,直接进入下一个状态