本书以一个编译器的设计实现案例贯穿全书,以Sample语言为代表,利用软件工程的思想,采取自顶向下分析设计、逐步求精的方法,从词法分析开始,随着教学的深入逐步对编译程序及相关部分进行分析、设计,直至完成整个编译器的设计。
本书以提高学生的软件开发能力为目标,除了介绍与编译有关的基础知识外,更注重介绍设计、开发编译程序的过程、方法和技术。本书强调理论和实践相结合,主要从实用性和可操作性的角度把握; 内容丰富,文字精练,重点突出,不求大而全,但求简而精。本书面向普通高校计算机专业的本科学生,也可作为自学考试教材及读者自学的参考书。
目录
- 第1章概述
- 1.1程序设计语言与翻译程序
- 1.2编译过程和编译程序的结构
- 1.2.1编译过程概述
- 1.2.2编译程序的结构
- 1.2.3编译阶段的组合
- 1.3编译程序的构造
- 1.3.1编译程序的构造与生成
- 1.3.2Sample语言编译程序的设计
- 1.4编译程序的发展及应用
- 1.4.1编译程序的发展
- 1.4.2为什么要学习编译原理及其构造技术
- 1.4.3编译技术的应用
- 1.5小结
- 1.6习题
- 第2章形式语言基本知识
- 2.1符号和符号串
- 2.2上下文无关文法及其语言
- 2.2.1上下文无关文法
- 2.2.2推导、句型和语言
- 2.3语法树和文法的二义性
- 2.3.1语法分析树
- 2.3.2文法的二义性
- 2.4文法的分类
- 2.5类Pascal语言Sample的简单介绍
- 2.5.1Sample语言字符集的定义
- 2.5.2Sample语言单词的定义
- 2.5.3Sample语言数据类型的定义
- 2.5.4Sample语言表达式的定义
- 2.5.5Sample语言语句的定义
- 2.5.6Sample语言程序的定义
- 2.5.7符合Sample语言定义的源程序举例
- 2.6小结
- 2.7习题
- 第3章词法分析
- 3.1词法分析的任务和功能
- 3.1.1词法分析的功能
- 3.1.2单词的类型和类别码
- 3.2词法分析器的设计
- 3.2.1词法分析器的接口
- 3.2.2词法分析程序的总体设计
- 3.2.3词法分析程序的详细设计
- 3.2.4单词的识别和状态转换图
- 3.2.5符号表及其操作
- 3.2.6词法分析阶段的错误处理
- 3.3正规文法、正规式与有穷自动机
- 3.3.1正规文法
- 3.3.2正规式
- 3.3.3有穷自动机
- 3.3.4正规文法与有穷自动机的等价性
- 3.3.5正规式与有穷自动机的等价性
- 3.4词法分析器的自动产生
- 3.4.1Lex的概述
- 3.4.2Lex源文件的格式
- 3.4.3Lex源文件中正规式的约定
- 3.4.4Lex源文件的翻译规则
- 3.4.5Lex源程序设计举例
- 3.4.6Lex使用中的一些注意事项
- 3.4.7使用Lex自动生成Sample语言的词法分析器
- 3.5小结
- 3.6习题
- 第4章语法分析
- 4.1语法分析概述
- 4.2自上而下分析面临的问题及其解决方法
- 4.2.1确定的自上而下分析面临的两个问题
- 4.2.2左递归的消除
- 4.2.3回溯的消除
- 4.2.4LL(1)文法
- 4.3确定的自上而下的分析方法
- 4.3.1递归下降分析法
- 4.3.2预测分析法
- 4.4Sample语言自上而下语法分析程序的设计
- 4.5自下而上语法分析的思想
- 4.5.1“移进归约”分析方法
- 4.5.2规范归约与句柄
- 4.6算符优先分析
- 4.6.1算符优先文法
- 4.6.2算符优先表的构造
- 4.6.3算符优先分析方法
- *4.6.4算符优先函数
- 4.7LR分析法
- 4.7.1LR分析概述
- 4.7.2LR(0)分析
- 4.7.3SLR(1)分析
- *4.7.4LR(1)分析
- *4.7.5LALR(1)分析
- *4.7.6二义文法在LR分析中的应用
- 4.8语法分析器的自动生成工具Yacc
- 4.8.1Yacc概述
- 4.8.2Yacc源文件的格式
- 4.8.3Yacc的翻译规则
- 4.8.4Yacc的辅助程序
- 4.9语法分析程序中的错误处理
- 4.9.1语法分析中的错误处理的一般原则
- 4.9.2自上而下语法分析的错误处理
- 4.9.3自下而上语法分析的错误处理
- 4.10小结
- 4.11习题
- 第5章语义分析和中间代码生成
- 5.1静态语义检查
- 5.2中间代码的形式
- 5.2.1逆波兰式
- 5.2.2三地址代码
- 5.3属性文法和语法制导的翻译
- 5.3.1属性文法
- 5.3.2综合属性
- 5.3.3继承属性
- 5.3.4语法制导的翻译方法
- 5.4常见语句的语法制导的翻译
- 5.4.1常量说明语句的翻译
- 5.4.2变量说明语句的翻译
- 5.4.3简单算术表达式和赋值语句的翻译
- 5.4.4布尔表达式的翻译
- 5.4.5IF语句的翻译
- 5.4.6REPEAT语句的翻译
- 5.4.7FOR语句的翻译
- 5.5Sample语言语法制导的翻译程序的设计
- 5.6小结
- 5.7习题
- 第6章运行时存储空间的组织
- 6.1源程序及其目标程序执行时的活动
- 6.1.1源程序中的过程
- 6.1.2过程执行时的活动
- 6.1.3名字的作用域
- 6.1.4参数的传递
- 6.1.5名字的绑定
- 6.2程序执行时的存储器组织
- 6.2.1程序执行时存储器的划分
- 6.2.2局部数据区的内容
- 6.2.3存储分配策略
- 6.3静态存储分配
- 6.3.1静态存储分配的性质
- 6.3.2静态存储分配的实现
- 6.3.3临时变量的地址分配
- 6.4栈式存储分配
- 6.5堆式存储分配
- 6.6小结
- 6.7习题
- 第7章代码优化
- 7.1概述
- 7.1.1代码优化器的结构及所处的地位
- 7.1.2优化的原则
- 7.1.3优化的主要种类
- 7.1.4基本块的概念及流图
- 7.2局部优化
- 7.2.1删除公共子表达式
- 7.2.2复写传播
- 7.2.3删除无用代码
- 7.2.4对程序进行代数恒等变换
- 7.2.5利用基本块的DAG进行优化
- 7.3循环优化
- 7.3.1循环的定义
- 7.3.2代码外提
- 7.3.3强度削弱
- 7.3.4删除归纳变量
- 7.4小结
- 7.5习题
- 第8章目标代码生成
- 8.1概述
- 8.2目标机器
- 8.3简单的代码生成算法
- 8.3.1中间代码的简单翻译方法
- 8.3.2引用信息和活跃信息
- 8.3.3寄存器描述和地址描述
- 8.3.4基本块的代码生成算法
- 8.4从DAG生成目标代码
- 8.5Sample语言代码优化及目标代码生成器的设计
- 8.6小结
- 8.7习题
- 参考文献