旧读书笔记:编译原理(第2版)笔记
来源:互联网 发布:杰森理查德森体测数据 编辑:程序博客网 时间:2024/04/27 22:40
编译原理(第2版)笔记
目录
[隐藏]- 1 一个简单的语法制导翻译器
- 1.1 右结合文法
- 1.2 运算符优先级
- 1.3 二义文法的消除:注意这里分号在不是stmt的后面
- 1.4 递归下降:左递归修改为右递归,增加e
- 1.5 AST:抽象语法树
- 1.6 为每个作用域设置一个符号表
- 1.7 静态检查
- 2 词法分析
- 3 语法分析
- 3.1 CFG
- 3.2 递归下降语法分析:求FIRST、FOLLOW集
- 3.2.1 LL(1)文法
- 3.3 自底向上语法分析
- 3.3.1 移进-归约
- 3.4 LR分析器
- 3.4.1 LR(0)
- 3.4.2 SLR
- 3.4.3 规范LR(1)
- 3.4.4 LALR
- 3.4.5 二义文法
- 3.4.6 YACC
- 4 语法制导的翻译
- 4.1 SDD:语法制导定义
- 4.2 继承属性与综合属性
- 4.3 依赖图
- 4.4 SDD1:`S属性`
- 4.5 SDD2:`L属性`
- 5 中间代码生成
- 5.1 DAG
- 5.2 类型推导:合一
- 6 运行时环境
- 6.1 ‘调用-返回’序列
- 6.2 活动记录栈
- 6.3 访问链(access link)
- 7 代码生成
- 7.1 目标代码
- 7.2 基本块
- 7.3 流图
- 7.4 局部优化
- 8 机器无关优化(全局优化)
- 8.1 数据流分析
- 8.2 常量传播
- 8.3 流图中的循环
- 8.3.1 支配节点
- 8.3.2 深度优先排序
- 8.3.3 回边
- 8.3.4 图的深度
- 8.3.5 可归约性
- 8.4 区域分析
- 9 指令级并行
- 10 并行性和局部优化
- 10.1 源代码转换:7个基本仿射变换
- 10.2 流水线化技术
- 11 过程间分析
- 11.1 调用图
- 11.2 上下文相关
- 11.3 Datalog规则
- 11.4 上下文相关指针分析
- 12 Comment
[编辑]一个简单的语法制导翻译器
[编辑]右结合文法
如对赋值a=b=c,有:
right := left=right | letterleft := letterletter := a | b | c
[编辑]运算符优先级
创建2个非终结符expr、term分别对应这两个优先级(+-和*/),并引进另一个factor代表运算基本单元,并考虑两者都是左结合,则有:
term := term * factor | term / factor | factor expr := expr + term | expr - term | term factor:= DIGIT | ( expr )
请注意这里对非终结符命名的技巧。
[编辑]二义文法的消除:注意这里分号在不是stmt的后面
stmt := ID = expr ; | if( expr ) stmt | if( expr ) stmt else stmt | while( expr ) stmt | do stmt while ( expr ) ; | { stmts } stmts := stmts stmt | e
[编辑]递归下降:左递归修改为右递归,增加e
之前:
A := Aa | b
之后:
A := bR R := aR | e
[编辑]AST:抽象语法树
[编辑]为每个作用域设置一个符号表
[编辑]静态检查
- 左值、右值
- 类型一致
- 自动类型转换
- 重载
[编辑]词法分析
- 缓冲区:eof(-1)标记
- 正则表达式
- Aho和Corasick对KMP算法进行了推广,使得可识别一个关键字集合中的任何关键字(字符串处理领域4个算法/数据结构:KMP、BM、后缀树(数组)、AC自动机)
- Lex
- 在Fortran和其他一些语言中,关键字并不是保留字,。。。(查看其后缀)
- FA
- NFA到DFA的转换:e-Closure的构造
- NFA的on-the-fly模拟(也就是说,‘即时使用’)
- DFA中的死状态(不可达)
- 从re直接构造DFA:nullable、firstpos、lastpos、followpos
- DFA最小化(最小的是不是唯一的??)
- DFA存储
int nextState(s,a){ if( check[ base[s]+a ] == s ) return next[ base[s]+a ]; else return nextState( default[s],a ); }
[编辑]语法分析
[编辑]CFG
[编辑]递归下降语法分析:求FIRST、FOLLOW集(其实就是一个传递闭包)
[编辑]LL(1)文法
[编辑]自底向上语法分析
[编辑]移进-归约
[编辑]LR分析器
[编辑]LR(0)
[编辑]SLR
- ACTION
- GOTO
[编辑]规范LR(1)
- LR(1)项
[编辑]LALR
- 合并具有相同core的LR(1)项
[编辑]二义文法
[编辑]YACC
[编辑]语法制导的翻译
[编辑]SDD:语法制导定义
[编辑]继承属性与综合属性
[编辑]依赖图
[编辑]SDD1:`S属性`
- 所有属性都是综合的
[编辑]SDD2:`L属性`
- 继承属性:只能够依赖parent节点的继承属性,和左兄弟的(任意)属性
- 实际上,这保证了能够在一趟深度遍历中处理完所有工作。。。
[编辑]中间代码生成
[编辑]DAG
[编辑]类型推导:合一
[编辑]运行时环境
[编辑]‘调用-返回’序列
[编辑]活动记录栈
[编辑]访问链(access link)
[编辑]代码生成
[编辑]目标代码
- 指令集
- 地址空间:Code、Static、Heap、Stack
[编辑]基本块
[编辑]流图
[编辑]局部优化
- 窥孔优化
- 寄存器分配
- 树重写
[编辑]机器无关优化(全局优化)
- 公共子表达式
- 复制传播
[编辑]数据流分析
- 到达定值
- 活跃变量分析
- 可用表达式
[编辑]常量传播
[编辑]流图中的循环
[编辑]支配节点
[编辑]深度优先排序
[编辑]回边
[编辑]图的深度
[编辑]可归约性
[编辑]区域分析
[编辑]指令级并行
[编辑]并行性和局部优化
[编辑]源代码转换:7个基本仿射变换
- 融合(fusion)
- 裂变(fission)
- 重新索引
- 缩放
- 反置(reversal)——反向循环
- 交换(permutation)——交换内外循环
- 倾斜(skewing)
[编辑]流水线化技术
[编辑]过程间分析
[编辑]调用图
[编辑]上下文相关
[编辑]Datalog规则
[编辑]上下文相关指针分析
[编辑]Comment
0 0
- 旧读书笔记:编译原理(第2版)笔记
- 编译原理笔记(2)
- 《编译原理(英文版.第2版)》
- 编译原理/紫龙书(第2版) 答案 1.1
- 编译原理/紫龙书(第2版) 答案 1.3
- 编译原理/紫龙书(第2版) 答案 1.6
- [编译原理读书笔记][第2章 一个简单的语法制导程序]
- [编译原理读书笔记][第3章 词法分析]
- 【旧】C++Primer读书笔记(2)
- 读书笔记(II) 编译原理及实践
- 编译原理 虎书 读书笔记
- 编译原理读书笔记
- Go语言编程(旧读书笔记)
- 编译原理学习笔记-2
- 编译原理学习笔记2
- 编译原理笔记(1)
- 编译原理笔记(1)
- Python基础教程(第2版)读书笔记
- Google官方抽屉DrawerLayout使用心得、踩坑经验以及定制化
- 怎么在一个工程开发手机版+平板版
- c primer 8.1练习答案
- NoSQL 数据库产品学习总结(一)
- 第五单元 5.18
- 旧读书笔记:编译原理(第2版)笔记
- 安装ubuntu后启动黑屏
- IDFA的值什么时候会发生改变
- 关于Basler摄像头图像转换成Mat类型(第二版)
- Linux访问受限,访问Linux总是Forbidden
- Linux 下crontab简单使用
- ShellExecuteEx提升子进程权限
- 如何安全地存储密码?
- Kablink Team文档&资料