旧读书笔记:编译原理(第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:抽象语法树

[编辑]为每个作用域设置一个符号表

[编辑]静态检查

  • 左值、右值
  • 类型一致
    1. 自动类型转换
    2. 重载

[编辑]词法分析

  • 缓冲区:eof(-1)标记
  • 正则表达式
  • Aho和Corasick对KMP算法进行了推广,使得可识别一个关键字集合中的任何关键字(字符串处理领域4个算法/数据结构:KMP、BM、后缀树(数组)、AC自动机
  • Lex
  • 在Fortran和其他一些语言中,关键字并不是保留字,。。。(查看其后缀)
  • FA
    1. NFA到DFA的转换:e-Closure的构造
    2. NFA的on-the-fly模拟(也就是说,‘即时使用’)
    3. DFA中的死状态(不可达)
    4. 从re直接构造DFA:nullable、firstpos、lastpos、followpos
    5. 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个基本仿射变换

  1. 融合(fusion)
  2. 裂变(fission)
  3. 重新索引
  4. 缩放
  5. 反置(reversal)——反向循环
  6. 交换(permutation)——交换内外循环
  7. 倾斜(skewing)

[编辑]流水线化技术

[编辑]过程间分析

[编辑]调用图

[编辑]上下文相关

[编辑]Datalog规则

[编辑]上下文相关指针分析

[编辑]Comment

0 0