编译原理


1.编译简介

编译器:

源程序——【编译器】-(错误信息)——目标程序

一种语言的处理系统:
源程序梗概——【预处理器】——源程序——【编译器】——目标汇编程序——【汇编器】——可充定位机器代码——【装载器/链接—编辑器】+(库、可重定位目标程序)——绝对机器代码

源程序分析:过程分三阶段;

第一阶段:线性分析(词法分析||扫描);

第二阶段:层次分析(语法分析);

程序的层次结构通常通过【递归规则】来表达:
*任何一个标识符、任何一个数、或者混合搭配的 都是表达式

第三阶段:语义分析;
作用:语义错误;类型检查;

在机器内部,相同数值整数和实数是两种不同的二进制表示形式;

文本格式器的分析:
文本格式器输入的内容(水平排列),字符和词分组成为盒子,没有“空白”(空格|换行)
隔开的连续字符串被识别为一个词。

水平排列、垂直排列、平方(sub上标 sup下标),盒子大小和位置需要由EQN文本语法结构来确定。

编辑器的各个阶段(逻辑组织):

编译器各阶段

符号表管理:快速找到每个标识符的记录。
标识符属性包括:存储位置、类型、作用域等信息。

错误检测与报告:
发现错误后,必须以恰当的方式及进行处理,使得编译器继续运行,以检测出源程序中更多的错误。

发现错误立即停止运行的编辑器不是一个好的编辑器!

各分析阶段:

1.词法分析器:读入源程序的字符,并将这些字符分组形成记号流,每个记号流表示一个逻辑上相关的字符序列。形成有个记号的字符序列成为该记号的词素。

2.语法分析器,在记号流上建立一个层次结构(典型:语法树);每个数据树内街店是一个记录,每个记录具有三个域,一个存储操作符,另外两个域存储指左、右子节点的指针。

3.语义分析器

中间代码生成(表示):

重要性质:1.易于产生;2.易于翻译成目标程序;

有多种形式:例如:“三地址码”,由指令序列组成,每个指令最多有三个操作符:temp1...;temp2...;temo3...;

代码优化:该阶段视图改进中间代码,以产生执行速度较快的机器代码,有些编译器就几乎没有进行代码优化。能够很大程度优化的编译器称为“优化编译器”。

代码生成:编译最后阶段目标代码生成,生成课重定位的机器代码或汇编代码,编译器为源程序定义和使用的变量选择储存单元,并把中间指令翻译成完成相同任务的机器代码指令序列,关键问题————寄存器分配。

编译器的伙伴:

编译器的输入可能由一个或者多个预处理器产生,编译器的输出也可能进一步加工处理才能成为可执行的机器代码。

预处理器:预处理器产生编译器的输入,一般具有一下功能:

1.宏处理(宏:经常使用的较长的机构的缩写);2.文件包含(把文件包含在程序正文中);3.“理性”预处理器(现代没有的控制结构【没有while...if】理性预存理器可用内部宏定义的向用户提供这类【比计较老式语言】控制结构);4.语言扩充(增强语言的能力);

宏处理器处理两种类型的语句:1.宏定义(唯一字符||关键字来识别);2.宏引用

汇编器:
某些编译器产生汇编代码,汇编代码需要交个汇编器来处理;也有些编译器能完成汇编器工作,产生可重定位的机器代码,交给装配器||链接器处理。

汇编代码是机器代码的容易记忆的形式,汇编代码使用名称而不是二进制代码来操作,存储地址也用名称表示。

两遍汇编:
第一遍扫描:存储单元中的所有表示符都被识别出来并存入符号表(汇编器符号表和编译器的符号表分开你);【识别出表示内存位置的表示符并为他们分配存储地址】
第二遍扫描:将每个操作符翻译成机器语言中代表相应操作的二进制位序列,将代表存储单元的每个标识符翻译成符号哦表中的该标识符的地址。【用地址代替标识符】

装配器和链接编辑器:
通常,装配器完成程序的装入和链接编辑两项功能;

编译器各阶段的分组:

前端与后端 两大阶段;
前端,包括依赖于源语言并在很大程度上独立于目标机器的某些阶段的某些部分;

后端,包括编译器中依赖于目标机器的阶段的某些部分;依赖于中间语言;

编译器的遍,编译的若干阶段通常是以一遍来实现的,每遍读一次输入文件,产生一个输出文件。

减少编译的变数,预留空白位置,使用“回填”技术。

编译器的构造工具:

分析器生成器、扫描器生成器、语法制导翻译引擎,数据流引擎、自动代码生成器..

所有语言的词法分析器除了对特殊的关键词和字符号的识别以外基本都一样;

2.简单的一遍编译器:

Page33


纯属个人观点,仅供参考!

转载于:https://www.cnblogs.com/yancongyang/p/7009681.html

目 录 译者序 前言 第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)分析能力的局限性 164 5.3.4 SLR(k)文法 165 5.4 一般的LR(1)和LALR(1)分析 166 5.4.1 LR(1)项的有穷自动机 166 5.4.2 LR(1)分析算法 169 5.4.3 LALR(1)分析 171 5.5 Yacc:一个LALR(1)分析程序的 生成器 173 5.5.1 Yacc基础 173 5.5.2 Yacc选项 176 5.5.3 分析冲突与消除二义性的规则 180 5.5.4 描述Yacc分析程序的执行 183 5.5.5 Yacc中的任意值类型 184 5.5.6 Yacc中嵌入的动作 185 5.6 使用Yacc生成TINY分析程序 186 5.7 自底向上分析程序中的错误校正 188 5.7.1 自底向上分析中的错误检测 188 5.7.2 应急方式错误校正 188 5.7.3 Yacc中的错误校正 189 5.7.4 TINY中的错误校正 192 练习 192 编程练习 195 注意与参考 197 第6章 语义分析 198 6.1 属性和属性文法 199 6.1.1 属性文法 200 6.1.2 属性文法的简化和扩充 206 6.2 属性计算算法 207 6.2.1 相关图和赋值顺序 208 6.2.2 合成和继承属性 212 6.2.3 作为参数和返回值的属性 219 6.2.4 使用扩展数据结构存储属性值 221 6.2.5 语法分析时属性的计算 223 6.2.6 语法中属性计算的相关性 226 6.3 符号表 227 6.3.1 符号表的结构 228 6.3.2 说明 230 6.3.3 作用域规则和块结构 232 6.3.4 同层说明的相互作用 236 6.3.5 使用符号表的属性文法的一个 扩充例子 237 6.4 数据类型和类型检查 241 6.4.1 类型表达式和类型构造器 242 6.4.2 类型名、类型说明和递归类型 246 6.4.3 类型等价 248 6.4.4 类型推论和类型检查 253 6.4.5 类型检查的其他主题 255 6.5 TINY语言的语义分析 257 6.5.1 TINY的符号表 258 6.5.2 TINY语义分析程序 259 练习 260 编程练习 264 注意与参考 264 第7章 运行时环境 266 7.1 程序执行时的存储器组织 266 7.2 完全静态运行时环境 269 7.3 基于栈的运行时环境 271 7.3.1 没有局部过程的基于栈的环境 271 7.3.2 带有局部过程的基于栈的环境 281 7.3.3 带有过程参数的基于栈的环境 284 7.4 动态存储器 286 7.4.1 完全动态运行时环境 286 7.4.2 面向对象的语言中的动态存储器 287 7.4.3 堆管理 289 7.4.4 堆的自动管理 292 7.5 参数传递机制 292 7.5.1 值传递 293 7.5.2 引用传递 294 7.5.3 值结果传递 295 7.5.4 名字传递 295 7.6 TINY语言的运行时环境 296 练习 297 编程练习 303 注意与参考 304 第8章 代码生成 305 8.1 中间代码和用于代码生成的数据 结构 305 8.1.1 三地址码 306 8.1.2 用于实现三地址码的数据结构 308 8.1.3 P-代码 310 8.2 基本的代码生成技术 312 8.2.1 作为合成属性的中间代码或目标 代码 312 8.2.2 实际的代码生成 314 8.2.3 从中间代码生成目标代码 317 8.3 数据结构引用的代码生成 319 8.3.1 地址计算 319 8.3.2 数组引用 320 8.3.3 栈记录结构和指针引用 325 8.4 控制语句和逻辑表达式的代码生成 328 8.4.1 if 和while 语句的代码生成 328 8.4.2 标号的生成和回填 330 8.4.3 逻辑表达式的代码生成 330 8.4.4 if 和while 语句的代码生成过程 样例 331 8.5 过程和函数调用的代码生成 334 8.5.1 过程和函数的中间代码 334 8.5.2 函数定义和调用的代码生成过程 336 8.6 商用编译器中的代码生成:两个案 例研究 339 8.6.1 对于80×86的Borland 3.0版C编 译器 339 8.6.2 Sun SparcStation的Sun 2.0 C编 译器 343 8.7 TM:简单的目标机器 346 8.7.1 Tiny Machine的基本结构 347 8.7.2 TM模拟器 349 8.8 TINY语言的代码生成器 351 8.8.1 TINY代码生成器的TM接口 351 8.8.2 TINY代码生成器 352 8.8.3 用TINY编译器产生和使用TM 代码文件 354 8.8.4 TINY编译器生成的TM代码文 件示例 355 8.9 代码优化技术考察 357 8.9.1 代码优化的主要来源 358 8.9.2 优化分类 360 8.9.3 优化的数据结构和实现技术 362 8.10 TINY代码生成器的简单优化 366 8.10.1 将临时变量放入寄存器 366 8.10.2 在寄存器中保存变量 367 8.10.3 优化测试表达式 367 练习 368 编程练习 371 注意与参考 372 附录A 编译器设计方案 373 附录B 小型编译器列表 381 附录C Tiny Machine模拟器列表 417
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值