编译原理01-引论

0 课程导读

0.1 学习课程三要素

  • 端正学习态度:坚持上课!认真完成作业!难!
  • 从内心深处:喜欢钻研底层技术!更难!
  • 多动手:PL/0编译器 + ANTLR工具

0.2 章节划分

2456语法分析(重点)

3词法分析(重点)

78语义分析(难点)

(具体见下面1.3的各个环节展开)

第一章 引 论

1.1 什么是编译程序

**翻译程序:**将一种语言(源语言)翻译成 另一种逻辑上等价的语言(目标语言)的程序。

**编译程序:**源语言为高级语言,目标语言 是低级语言(汇编或机器语言)的翻译程序。

image.png

重点:高级语言程序到可执行代码的转换过程

image.png

  • 预处理程序:将源程序汇集在一起,并且负责文件合并、宏展开等任务。
  • 另外,如果产生的目标程序是汇编代码形式,则需要经汇编程序翻译成机器代码。

1.2 解释程序

image.png

1.3 编译过程和编译程序的结构

重点:编译程序的功能和组织结构

image.png

(下面将各个环节展开简单说明,具体内容分别在对应章节)

1.3.1 词法分析(扫描器,Scanner )

从左到右,逐个字符读入源程序,对 构成源程序的字符流进行扫描和分解,从而识别出各个单词,并给予种别(属性) 和内部形式(值)构成单词的内部表示。

第3章有详细的介绍。

例:Pascal源程序片段

image.png

1.3.2 语法分析(分析器,Analyzer)

在词法分析的基础上,对单词序列进 行语法检查,即分析源程序的语法结构, 并用明确的结构(如语法树)表示。

第2、4、5、6章有详细的介绍。

例:Pascal源程序片段

image.png

1.3.3 语义分析

检查程序有无语义错误,为代码生成阶 段收集类型信息,同时,解释程序的意义。

第7章和第8章有详细的介绍。

例:Pascal源程序片段

image.png

1.3.4 中间代码生成

在进行了上述的词法分析,语法分析和语义分析阶 段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码

所谓“中间代码”是一种结构简单、含义明确的记 号系统,这种记号系统可以设计为多种多样的形式,重 要的设计原则为两点:一是容易生成;二是容易将它翻 译成目标代码

第8章有详细的介绍。

image.png

1.3.5 中间代码优化

代码优化──可多次

局部优化:

  • 合并已知量 ── 编译时计算常量表达式
  • 共享子表达式 ── 删除多余代码
  • 降低运算强度 ── 乘方──乘
  • 改变计算顺序 ── 减少指令、减少中间量

循环优化:

  • 循环不变部分外提
  • 下标地址计算优化
  • 降低运算强度 ── 乘 ──加

与机器有关的优化:

  • 使用特殊指令 ── 如计数转移指令
  • 寄存器分配 第10章有详细的介绍。
1.3.6 目标代码的生成

把中间代码变换成特定机器上的绝对 指令代码或可重定位的指令代码或汇编指 令代码。

第11章有详细的介绍。

举个栗子:代码优化和目标代码的生成

image.png

1.表格管理(符号表)

为了合理的管理表格(构造、查找、更新), 设立一些专门子程序称为表格管理程序负责管 理表格。 (见下图)

2.出错处理

编译程序在各个阶段应诊断和报告源程序中 的错误,包括词法错误、语法错误和语义错误 等。

image.png

1.4 编译程序的组织

1.4.1 前端和后端

image.png

  • 前端:与源语言有关,而与目标机无关的编译程序
  • 后端:与目标机有关,而与源语言无关的编译程序
1.4.2 分遍(趟,PASS)问题

是对源程序或源程序的中间结果从头到尾扫描并完成规定任务的过程

1.5 编译程序的实现方法

1.预处理方法

用于语言的扩充。设已有L语言的编译器,其扩充语言L1的编译器可通过语言转换程序将L1程序转换为L程序,利用L的编译器,从而实现L1的编译器。

2.移植法

同一语言的编译器在不同机器间的移植。方法: a 目标代码的转换 b 修改中间代码到目标代码的转换

3.自展法

自我扩展,自己编写自己的编译器。

4.工具法

利用编译阶段各个部分的自动生成工具自动生成,例如常用的yacc和lex。

1.6 课后练习

image.png

【学习笔记汇总】

持续更新

【学习资料】

  • 教材:《编译原理(第3版)王生原》
  • 软件下载:PL0(VS2010版)(待上传)
  • 待补充:可能是ppt、github等
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本书系统介绍了经典的编译理论和技术,同时也包含了面向对象语言等当前较新语言的编译技术。本书更可贵之处在于提供了较完整的适用于教学实践的样例语言,是一本理论和实践内容相结合的、不可多得的好书。 本书可用作大专院校教材、教师参考书以及编译器研究人员的参考资料。 <br>目 录<br>译者序<br>前言<br>第1章 概论 1<br>1.1 为什么要用编译器 2<br>1.2 与编译器相关的程序 3<br>1.3 翻译步骤 5<br>1.4 编译器中的主要数据结构 8<br>1.5 编译器结构中的其他问题 10<br>1.6 自举与移植 12<br>1.7 TINY样本语言与编译器 14<br>1.7.1 TINY语言 15<br>1.7.2 TINY编译器 15<br>1.7.3 TM机 17<br>1.8 C-Minus:编译器项目的一种语言 18<br>练习 19<br>注意与参考 20<br>第2章 词法分析 21<br>2.1 扫描处理 21<br>2.2 正则表达式 23<br>2.2.1 正则表达式的定义 23<br>2.2.2 正则表达式的扩展 27<br>2.2.3 程序设计语言记号的正则表达式 29<br>2.3 有穷自动机 32<br>2.3.1 确定性有穷自动机的定义 32<br>2.3.2 先行、回溯和非确定性自动机 36<br>2.3.3 用代码实现有穷自动机 41<br>2.4 从正则表达式到DFA 45<br>2.4.1 从正则表达式到NFA 45<br>2.4.2 从NFA到DFA 48<br>2.4.3 利用子集构造模拟NFA 50<br>2.4.4 将DFA中的状态数最小化 51<br>2.5 TINY扫描程序的实现 52<br>2.5.1 为样本语言TINY实现一个扫描<br>程序 53<br>2.5.2 保留字与标识符 56<br>2.5.3 为标识符分配空间 57<br>2.6 利用Lex 自动生成扫描程序 57<br>2.6.1 正则表达式的Lex 约定 58<br>2.6.2 Lex输入文件的格式 59<br>2.6.3 使用Lex的TINY扫描程序 64<br>练习 65<br>编程练习 67<br>注意与参考 67<br>第3章 上下文无关文法及分析 69<br>3.1 分析过程 69<br>3.2 上下文无关文法 70<br>3.2.1 与正则表达式比较 70<br>3.2.2 上下文无关文法规则的说明 71<br>3.2.3 推导及由文法定义的语言 72<br>3.3 分析树与抽象语法树 77<br>3.3.1 分析树 77<br>3.3.2 抽象语法树 79<br>3.4 二义性 83<br>3.4.1 二义性文法 83<br>3.4.2 优先权和结合性 85<br>3.4.3 悬挂else问题 87<br>3.4.4 无关紧要的二义性 89<br>3.5 扩展的表示法:EBNF和语法图 89<br>3.5.1 EBNF表示法 89<br>3.5.2 语法图 91<br>3.6 上下文无关语言的形式特性 93<br>3.6.1 上下文无关语言的形式定义 93<br>3.6.2 文法规则和等式 94<br>3.6.3 乔姆斯基层次和作为上下文无关<br>规则的语法局限 95<br>3.7 TINY语言的语法 97<br>3.7.1 TINY的上下文无关文法 97<br>3.7.2 TINY编译器的语法树结构 98<br>练习 101<br>注意与参考 104<br>第4章 自顶向下的分析 105<br>4.1 使用递归下降分析算法进行自顶向下<br>的分析 105<br>4.1.1 递归下降分析的基本方法 105<br>4.1.2 重复和选择:使用EBNF 107<br>4.1.3 其他决定问题 112<br>4.2 LL(1)分析 113<br>4.2.1 LL(1)分析的基本方法 113<br>4.2.2 LL(1)分析与算法 114<br>4.2.3 消除左递归和提取左因子 117<br>4.2.4 在LL(1)分析中构造语法树 124<br>4.3 First集合和Follow集合 125<br>4.3.1 First 集合 125<br>4.3.2 Follow 集合 130<br>4.3.3 构造LL(1)分析表 134<br>4.3.4 再向前:LL(k)分析程序 135<br>4.4 TINY语言的递归下降分析程序 136<br>4.5 自顶向下分析程序中的错误校正 137<br>4.5.1 在递归下降分析程序中的错误<br>校正 138<br>4.5.2 在LL(1)分析程序中的错误校正 140<br>4.5.3 在TINY分析程序中的错误校正 141<br>练习 143<br>编程练习 146<br>注意与参考 148<br>第5章 自底向上的分析 150<br>5.1 自底向上分析概览 151<br>5.2 LR(0)项的有穷自动机与LR(0)分析 153<br>5.2.1 LR(0)项 153<br>5.2.2 项目的有穷自动机 154<br>5.2.3 LR(0)分析算法 157<br>5.3 SLR(1)分析 160<br>5.3.1 SLR(1)分析算法 160<br>5.3.2 用于分析冲突的消除二义性<br>规则 163<br>5.3.3 SLR(1)分析能力的局限性 164<br>5.3.4 SLR(k)文法 165<br>5.4 一般的LR(1)和LALR(1)分析 166<br>5.4.1 LR(1)项的有穷自动机 166<br>5.4.2 LR(1)分析算法 169<br>5.4.3 LALR(1)分析 171<br>5.5 Yacc:一个LALR(1)分析程序的<br>生成器 173<br>5.5.1 Yacc基础 173<br>5.5.2 Yacc选项 176<br>5.5.3 分析冲突与消除二义性的规则 180<br>5.5.4 描述Yacc分析程序的执行 183<br>5.5.5 Yacc中的任意值类型 184<br>5.5.6 Yacc中嵌入的动作 185<br>5.6 使用Yacc生成TINY分析程序 186<br>5.7 自底向上分析程序中的错误校正 188<br>5.7.1 自底向上分析中的错误检测 188<br>5.7.2 应急方式错误校正 188<br>5.7.3 Yacc中的错误校正 189<br>5.7.4 TINY中的错误校正 192<br>练习 192<br>编程练习 195<br>注意与参考 197<br>第6章 语义分析 198<br>6.1 属性和属性文法 199<br>6.1.1 属性文法 200<br>6.1.2 属性文法的简化和扩充 206<br>6.2 属性计算算法 207<br>6.2.1 相关图和赋值顺序 208<br>6.2.2 合成和继承属性 212<br>6.2.3 作为参数和返回值的属性 219<br>6.2.4 使用扩展数据结构存储属性值 221<br>6.2.5 语法分析时属性的计算 223<br>6.2.6 语法中属性计算的相关性 226<br>6.3 符号表 227<br>6.3.1 符号表的结构 228<br>6.3.2 说明 230<br>6.3.3 作用域规则和块结构 232<br>6.3.4 同层说明的相互作用 236<br>6.3.5 使用符号表的属性文法的一个<br>扩充例子 237<br>6.4 数据类型和类型检查 241<br>6.4.1 类型表达式和类型构造器 242<br>6.4.2 类型名、类型说明和递归类型 246<br>6.4.3 类型等价 248<br>6.4.4 类型推论和类型检查 253<br>6.4.5 类型检查的其他主题 255<br>6.5 TINY语言的语义分析 257<br>6.5.1 TINY的符号表 258<br>6.5.2 TINY语义分析程序 259<br>练习 260<br>编程练习 264<br>注意与参考 264<br>第7章 运行时环境 266<br>7.1 程序执行时的存储器组织 266<br>7.2 完全静态运行时环境 269<br>7.3 基于栈的运行时环境 271<br>7.3.1 没有局部过程的基于栈的环境 271<br>7.3.2 带有局部过程的基于栈的环境 281<br>7.3.3 带有过程参数的基于栈的环境 284<br>7.4 动态存储器 286<br>7.4.1 完全动态运行时环境 286<br>7.4.2 面向对象的语言中的动态存储器 287<br>7.4.3 堆管理 289<br>7.4.4 堆的自动管理 292<br>7.5 参数传递机制 292<br>7.5.1 值传递 293<br>7.5.2 引用传递 294<br>7.5.3 值结果传递 295<br>7.5.4 名字传递 295<br>7.6 TINY语言的运行时环境 296<br>练习 297<br>编程练习 303<br>注意与参考 304<br>第8章 代码生成 305<br>8.1 中间代码和用于代码生成的数据<br>结构 305<br>8.1.1 三地址码 306<br>8.1.2 用于实现三地址码的数据结构 308<br>8.1.3 P-代码 310<br>8.2 基本的代码生成技术 312<br>8.2.1 作为合成属性的中间代码或目标<br>代码 312<br>8.2.2 实际的代码生成 314<br>8.2.3 从中间代码生成目标代码 317<br>8.3 数据结构引用的代码生成 319<br>8.3.1 地址计算 319<br>8.3.2 数组引用 320<br>8.3.3 栈记录结构和指针引用 325<br>8.4 控制语句和逻辑表达式的代码生成 328<br>8.4.1 if 和while 语句的代码生成 328<br>8.4.2 标号的生成和回填 330<br>8.4.3 逻辑表达式的代码生成 330<br>8.4.4 if 和while 语句的代码生成过程<br>样例 331<br>8.5 过程和函数调用的代码生成 334<br>8.5.1 过程和函数的中间代码 334<br>8.5.2 函数定义和调用的代码生成过程 336<br>8.6 商用编译器中的代码生成:两个案<br>例研究 339<br>8.6.1 对于80×86的Borland 3.0版C编<br>译器 339<br>8.6.2 Sun SparcStation的Sun 2.0 C编<br>译器 343<br>8.7 TM:简单的目标机器 346<br>8.7.1 Tiny Machine的基本结构 347<br>8.7.2 TM模拟器 349<br>8.8 TINY语言的代码生成器 351<br>8.8.1 TINY代码生成器的TM接口 351<br>8.8.2 TINY代码生成器 352<br>8.8.3 用TINY编译器产生和使用TM<br>代码文件 354<br>8.8.4 TINY编译器生成的TM代码文<br>件示例 355<br>8.9 代码优化技术考察 357<br>8.9.1 代码优化的主要来源 358<br>8.9.2 优化分类 360<br>8.9.3 优化的数据结构和实现技术 362<br>8.10 TINY代码生成器的简单优化 366<br>8.10.1 将临时变量放入寄存器 366<br>8.10.2 在寄存器中保存变量 367<br>8.10.3 优化测试表达式 367<br>练习 368<br>编程练习 371<br>注意与参考 372<br>附录A 编译器设计方案 373<br>附录B 小型编译器列表 381<br>附录C Tiny Machine模拟器列表 417<br>
目 录 译者序 前言 第1章 概论 1 1.1 为什么要用编译器 2 1.2 与编译器相关的程序 3 1.3 翻译步骤 5 1.4 编译器中的主要数据结构 8 1.5 编译器结构中的其他问题 10 1.6 自举与移植 12 1.7 TINY样本语言与编译器 14 1.7.1 TINY语言 15 1.7.2 TINY编译器 15 1.7.3 TM机 17 1.8 C-Minus:编译器项目的一种语言 18 练习 19 注意与参考 20 第2章 词法分析 21 2.1 扫描处理 21 2.2 正则表达式 23 2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到NFA 45 2.4.2 从NFA到DFA 48 2.4.3 利用子集构造模拟NFA 50 2.4.4 将DFA中的状态数最小化 51 2.5 TINY扫描程序的实现 52 2.5.1 为样本语言TINY实现一个扫描 程序 53 2.5.2 保留字与标识符 56 2.5.3 为标识符分配空间 57 2.6 利用Lex 自动生成扫描程序 57 2.6.1 正则表达式的Lex 约定 58 2.6.2 Lex输入文件的格式 59 2.6.3 使用Lex的TINY扫描程序 64 练习 65 编程练习 67 注意与参考 67 第3章 上下文无关文法及分析 69 3.1 分析过程 69 3.2 上下文无关文法 70 3.2.1 与正则表达式比较 70 3.2.2 上下文无关文法规则的说明 71 3.2.3 推导及由文法定义的语言 72 3.3 分析树与抽象语法树 77 3.3.1 分析树 77 3.3.2 抽象语法树 79 3.4 二义性 83 3.4.1 二义性文法 83 3.4.2 优先权和结合性 85 3.4.3 悬挂else问题 87 3.4.4 无关紧要的二义性 89 3.5 扩展的表示法:EBNF和语法图 89 3.5.1 EBNF表示法 89 3.5.2 语法图 91 3.6 上下文无关语言的形式特性 93 3.6.1 上下文无关语言的形式定义 93 3.6.2 文法规则和等式 94 3.6.3 乔姆斯基层次和作为上下文无关 规则的语法局限 95 3.7 TINY语言的语法 97 3.7.1 TINY的上下文无关文法 97 3.7.2 TINY编译器的语法树结构 98 练习 101 注意与参考 104 第4章 自顶向下的分析 105 4.1 使用递归下降分析算法进行自顶向下 的分析 105 4.1.1 递归下降分析的基本方法 105 4.1.2 重复和选择:使用EBNF 107 4.1.3 其他决定问题 112 4.2 LL(1)分析 113 4.2.1 LL(1)分析的基本方法 113 4.2.2 LL(1)分析与算法 114 4.2.3 消除左递归和提取左因子 117 4.2.4 在LL(1)分析中构造语法树 124 4.3 First集合和Follow集合 125 4.3.1 First 集合 125 4.3.2 Follow 集合 130 4.3.3 构造LL(1)分析表 134 4.3.4 再向前:LL(k)分析程序 135 4.4 TINY语言的递归下降分析程序 136 4.5 自顶向下分析程序中的错误校正 137 4.5.1 在递归下降分析程序中的错误 校正 138 4.5.2 在LL(1)分析程序中的错误校正 140 4.5.3 在TINY分析程序中的错误校正 141 练习 143 编程练习 146 注意与参考 148 第5章 自底向上的分析 150 5.1 自底向上分析概览 151 5.2 LR(0)项的有穷自动机与LR(0)分析 153 5.2.1 LR(0)项 153 5.2.2 项目的有穷自动机 154 5.2.3 LR(0)分析算法 157 5.3 SLR(1)分析 160 5.3.1 SLR(1)分析算法 160 5.3.2 用于分析冲突的消除二义性 规则 163 5.3.3 SLR(1)分析能力的局限性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是我,Zack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值