小型编译器设计实践

小型编译器设计实践

查阅电子书
手机扫码
  • 微信扫一扫

    关注微信公众号

因版权原因待上架

编辑推荐

以目前较为流行的加强型PIC16Fxxxx为目标处理器,论述开发、设计相应的C语言编译器工具包的详细过程。

内容简介

作为计算机技术核心软件之一的编译器是业内人士关心的课题和日常工作中的重要工具,编译器的设计及其理论是大专院校相关专业的必修内容。

本书以Microchip公司设计生产的PIC16F系列处理器为目标对象,使用实战的形式叙述编译器设计的步骤和细节,并提供了全部设计源代码。

本书内容着眼于编译器设计的具体实现过程而非理论,以计算机行业中对编译器设计感兴趣的爱好者为主要阅读对象,也可作为大专院校相关专业师生的参考资料。

作者简介

编著者苏孟晋,出生于上海,祖籍江苏常州。1978年考入浙江大学计算机专业就读,1982年获学士学位。同年开始在上海同济大学计算机专业供职,1987年获讲师职称。1990年赴美留学,于1992年获硕士学位。

章节目录

版权信息

内容简介

前言

第一篇 PIC16Fxxxx编译器(cc16e.exe)的设计

第1章 工具准备和系统设置

1.1 GNU C/C++编译工具的选择

1.1.1 MinGW

1.1.2 DJGPP

1.1.3 Cygwin

1.2 解析工具构造器

1.3 工具的安装

1.4 目标编译器运行前的系统设置

第2章 预处理器的设计

2.1 预处理器(C/C++版)

2.1.1 项目文件及其设置

2.1.2 任务和算法

2.2 源程序预处理器(flex版)

2.2.1 正规表达式简介

2.2.2 预处理器设计实战

2.3 本章小结

第3章 编译器设计初步实践

3.1 设计简介

3.2 一个简单的C语言关键字识别器

3.2.1 工程项目文件

3.2.2 项目运行主程序

3.2.3 词法解析自动机部分

3.2.4 词法解析C语言部分

3.3 编译器雏形(flex和bison的使用)

3.3.1 问题的提出和任务

3.3.2 工程文件makefile

3.3.3 词法解析规则部分

3.3.4 词法解析的启动

3.3.5 语法解析器文本及其基本格式

3.3.6 语法解析器文本各区域的内容

3.4 语法解析和词法解析之间的数值传递

3.4.1 语法解析器文本的定义部分

3.4.2 语法解析器识别规则部分

3.4.3 词法解析器解析规则部分

3.5 编译树的构建

3.5.1 编译树中的数据类型和结构

3.5.2 节点生成和处理函数

3.5.3 扩充语法解析器文本的定义部分

3.5.4 语法解析器文本的语法解析识别规则部分

3.6 源程序语句代码的截取和嵌入

3.6.1 缓冲区与相关函数

3.6.2 截取源程序代码并送入缓冲区中

3.6.3 读取源代码缓冲内容

3.6.4 增加新定义并扩充node数据结构

3.6.5 支持函数和程序

3.6.6 在源程序片段中嵌入节点

3.7 编译树的显示

3.7.1 用于显示编译树的函数

3.7.2 编译树的显示操作

第4章 编译器设计实战

4.1 对C语言的词法解析

4.1.1 词法解析宏定义部分

4.1.2 各种常数解析识别

4.1.3 C语言关键字和标识符解析

4.1.4 C语言各种操作运算符识别

4.1.5 关于字符和字符串常数的处理

4.2 对C语言的语法解析

4.2.1 描述特征的attrib完整结构

4.2.2 各类node数据结构的完善

4.2.3 语法解析定义部分的完善

4.2.4 函数声明/定义的完善

4.2.5 运算语法和运算符优先确定

4.2.6 变量定义语法规则的完善

4.3 支持预处理等语句的语法解析

4.3.1 用于预处理语句的新增变量

4.3.2 用于预处理语句的新增解析状态

4.3.3 用于预处理语句的解析

4.3.4 用于预处理语句的节点和数据类型

4.4 支持结构化数据的语法解析

4.5 支持对typedef的语法解析

4.5.1 支持typedef的新变量

4.5.2 判断标识符的性质

4.5.3 typedef语法解析

4.5.4 识别结构化数据定义中出现的新类型名

4.5.5 使用新类型名

4.6 本章小结

第5章 编译树的预扫描

5.1 符号表的基本数据结构和应用

5.1.1 符号表基本数据结构Nnode

5.1.2 符号表链数据结构Nlist

5.2 符号的链表操作

5.2.1 符号表节点和表链的初始化

5.2.2 对符号表链的搜索

5.2.3 为符号表链添加符号定义

5.2.4 对符号表链删除一个节点

5.2.5 介绍一组辅助函数

5.2.6 关于enum枚举成员的取值和等价长度

5.3 对编译树的预扫描

5.3.1 预扫描操作的类

5.3.2 预扫描的启动运行

5.3.3 编译树的基本构造和周游扫描

5.3.4 对idNode_t节点的扫描

5.3.5 对复合语句操作的扫描处理

5.3.6 对宏定义语句#define和#undef的扫描处理

5.3.7 对#ifdef和#ifndef语句的扫描处理

5.3.8 对#if…#else…#endif语句的扫描处理

5.3.9 对函数调用CALL操作的扫描处理

5.3.10 对函数定义FUNC_DECL操作的扫描处理

5.3.11 对enum语句操作的扫描处理

5.3.12 对变量定义操作的扫描处理

5.3.13 对typedef语句的扫描处理

5.3.14 对sizeof()函数记号的扫描处理

5.3.15 对类型强制转换操作的扫描处理

5.3.16 对寄存器位定义操作的扫描处理

5.3.17 对#pragma操作的扫描处理

5.3.18 对其他操作类型的处理和对常数运算的归并

5.4 本章小结

第6章 P-代码与虚拟机

6.1 基本数据结构

6.1.1 操作项Item数据结构

6.1.2 代码片段Pnode数据结构

6.1.3 编译栈和操作项的移入与归约

6.2 变量表和函数表

6.2.1 变量表数据节点Dnode和链表Dlink的结构

6.2.2 Dlink的应用操作和表示

6.2.3 函数表数据节点Fnode和链表Flink的结构

6.2.4 函数内部的标号(label)和临时变量的命名

6.3 P-代码生成基础

6.3.1 生成器类

6.3.2 生成器类的构建和运行启动

6.4 P-代码生成过程

6.4.1 语句行终结和复合语句

6.4.2 变量声明和定义

6.4.3 普通函数的声明和定义

6.4.4 赋值操作语句

6.4.5 变量地址ADDR_OF

6.4.6 变量地址POS_OF

6.4.7 表达式中数组偏址计算

6.4.8 调试显示工具的扩充

6.4.9 结构实体变量的成员偏移寻址

6.4.10 变量的成员间接偏移寻址

6.4.11 预先递增和预先递减

6.4.12 滞后递增和滞后递减

6.4.13 sizeof()函数

6.4.14 标号语句LABEL和GOTO语句

6.4.15 单目运算语句

6.4.16 类型强制转换

6.4.17 SBIT类型操作项

6.4.18 复合赋值运算ADD_ASSIGN和SUB_ASSIGN

6.4.19 算术运算“+”和“-”

6.4.20 逻辑运算“&”、“|”和“^”

6.4.21 其他复合赋值运算

6.4.22 算术运算“*”、“/”和“%”,以及“移位”运算

6.4.23 算术比较运算

6.4.24 逻辑“与关联”操作

6.4.25 逻辑“或关联”操作

6.4.26 增加新函数及其相应的数据变量

6.4.27 if语句

6.4.28 while语句

6.4.29 do...while语句

6.4.30 for语句

6.4.31 break和continue语句

6.4.32 switch语句

6.4.33 call语句

6.4.34 条件运算符“?”语句

6.4.35 连续运算符“,”语句

6.4.36 函数返回return语句

6.4.37 汇编语言插入语句AASM

6.4.38 编译设置语句PRAGMA

6.5 本章小结

第7章 P-代码的优化

7.1 清除冗余的代码

7.1.1 删除冗余的标号

7.1.2 清除与无条件跳转语句有关的冗余

7.1.3 常数与地址运算的合并

7.2 代码的合并简化

7.2.1 地址与常数运算的合并

7.2.2 合并间接偏址计算

7.2.3 简化和重组双目运算

7.2.4 省略临时变量

7.2.5 变换运算顺序

7.2.6 合并连续常数运算

7.2.7 简化运算类型

7.3 条件跳转操作的优化

7.3.1 简单的跳转类型变换

7.3.2 使用位检测进行跳转类型的变换

7.3.3 清除与常数0的等值比较

7.3.4 合并简单递减(递加)并跳转操作

7.4 关于特殊常数操作运算的优化

7.4.1 简化算术逻辑运算

7.4.2 简化常数为2的幂次方运算

7.5 关于临时变量使用的优化

7.5.1 清除赋值后未被使用的临时变量

7.5.2 临时变量的重复使用

7.5.3 临时变量长度最小化

7.6 其他种类的优化

7.6.1 清除ACC与临时变量之间的赋值

7.6.2 对数据结构成员偏址寻址过程进行优化

7.7 本章小结

第8章 汇编语言输出

8.1 PIC16Fxxxx处理器简介

8.1.1 加强版PIC16Fxxxx指令系统和伪指令

8.1.2 加强版PIC16Fxxxx编译器对RAM公用区域的用途划分

8.1.3 汇编器设计的基本结构

8.2 编译器的汇编语言输出

8.2.1 汇编语言输出的起始

8.2.2 汇编语言输出全局RAM变量

8.3 运行代码的汇编语言输出

8.3.1 函数起始P_FUNC_BEG的汇编语言输出

8.3.2 函数结束P_FUNC_END的汇编语言输出

8.3.3 注释和标号行的汇编语言输出

8.3.4 函数调用CALL的汇编语言输出

8.3.5 无条件跳转GOTO的汇编语言输出

8.3.6 “=”和P_MOV赋值操作的汇编语言输出

8.3.7 INC_OP和DEC_OP运算的汇编语言输出

8.3.8 NEG_OF运算的汇编语言输出

8.3.9 “~”运算的汇编语言输出

8.3.10 “!”运算的汇编语言输出

8.3.11 算术复合赋值运算ADD_ASSIGN和SUB_ASSIGN

8.3.12 逻辑复合赋值运算AND_ASSIGN、OR_ASSIGN和XOR_ASSIGN

8.3.13 P_JZ和P_JNZ的汇编语言输出

8.3.14 P_JBZ和P_JBNZ的汇编语言输出

8.3.15 P_ARG_PASS的汇编语言输出

8.3.16 P_CALL的汇编语言输出

8.3.17 P_JZ_INC、P_JZ_DEC、P_JNZ_INC和P_JNZ_DEC的汇编语言输出

8.3.18 “+”和“-”运算的汇编语言输出

8.3.19 P_JEQ和P_JNE的汇编语言输出

8.3.20 “位”变量的比较和跳转汇编语言输出

8.3.21 P_JLT、P_JLE、P_JGT和P_JGE的汇编语言输出

8.3.22 关于确定比较结果的cmpJump()函数

8.3.23 复合型左移位LEFT_ASSIGN的汇编语言输出

8.3.24 复合型右移位RIGHT_ASSIGN的汇编语言输出

8.3.25 左移位LEFT_OP的汇编语言输出

8.3.26 右移位RIGHT_OP的汇编语言输出

8.3.27 复合乘法MUL_ASSIGN的汇编语言输出

8.3.28 乘法的汇编语言输出

8.3.29 复合除法DIV_ASSIGN和复合取模MOD_ASSIGN的汇编语言输出

8.3.30 除法和取模的汇编语言输出

8.3.31 PRAGMA(#pragma)的汇编语言输出

8.3.32 函数型汇编插入

8.3.33 P_DJNZ/P_IJNZ的汇编语言输出

8.3.34 逻辑运算的汇编语言输出

8.3.35 AASM的汇编语言输出

8.4 非运行代码的汇编语言输出

8.4.1 RAM变量初始化的汇编语言输出

8.4.2 ROM常数的汇编语言输出

8.4.3 ROM字符串的汇编语言输出

第9章 PIC16Fxxxx编译器最后的完善

9.1 为编译器增加编译运行的编译选项

9.1.1 增加编译选项

9.1.2 搜索/获取编译选项

9.1.3 使用编译选项

9.2 编译器库函数的设计

9.2.1 编译器基本库函数的设计

9.2.2 编译器扩充型库函数的设计

9.3 支持超强型PIC16Fxxxx处理器的思考和对策

第二篇 PIC16Fxxxx汇编器(as16e.exe)的设计

第10章 PIC16Fxxxx汇编器的词法解析器

10.1 数据结构的设计

10.2 汇编器的词法解析设计

10.2.1 起始状态

10.2.2 操作码状态

10.2.3 操作数状态

10.3 汇编器的语法解析设计

10.3.1 文件语句行的语法规则和处理

10.3.2 汇编语句行的语法规则和处理

10.3.3 汇编语句操作数处理

10.3.4 汇编器的产生

10.4 汇编器对输入文件的扫描

10.4.1 汇编器的P16E_asm类的启动

10.4.2 汇编器的P16E_asm对指令序列的两次扫描

10.5 汇编器的代码转换输出

10.5.1.obj文件格式

10.5.2.obj和.lst文件输出启动的伪指令部分

10.5.3.obj和.lst文件输出启动的常规指令部分

10.6 汇编器的最后完善

10.6.1 启动运行选项的设计

10.6.2 支持超强型PIC16Fxxxx的代码输出

第三篇 PIC16Fxxxx连接器(lk16e.exe)的设计

第11章 PIC16Fxxxx连接器基本设计

11.1.obj文件的读入和语法扫描

11.1.1 输入文件和数据结构

11.1.2 连接器输入文件的词法解析

11.1.3 连接器输入文件的语法解析

11.2 分段类型及其数据结构

11.3 连接器起始和运行模式

11.4 内存类型和模式的建立

11.4.1 内存类及其相关的服务函数

11.4.2 内存空间分配函数和内存地址空间转换选择

11.5 符号数据结构

11.5.1 Symbol类的数据结构和启用

11.5.2 Memory和Symbol类在连接中的应用

11.6 连接操作

11.6.1 连接类P16link

11.6.2 连接类P16link的启用

11.6.3 搜索被使用的分段并舍弃未被使用的分段

11.6.4 表达式取值函数

11.6.5 对各分段的内存空间进行分配和定位

11.6.6 连接后的结果文件输出

第12章 PIC16Fxxxx连接器的加强与深入

12.1 问题的提出和应对

12.2 函数活跃状态的判断原则

12.2.1 基本判断原则

12.2.2 进程类型互斥原则

12.3 函数内部变量空间共享的实现和设计

12.3.1 功能的嵌入

12.3.2 算法的实现

12.3.3 函数内部变量共享群的生成

12.4 本章小结

第13章 PIC16Fxxxx编译器设计的总结和应用实例

13.1 应用实例1:基于si47xx模块的收音机

13.1.1 设计选材

13.1.2 应用程序设计

13.2 应用实例2:USB/UART转接器

13.2.1 设计选材

13.2.2 设计考虑

小型编译器设计实践是2024年由电子工业出版社出版,作者苏孟晋 编著。

得书感谢您对《小型编译器设计实践》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

购买这本书

你可能喜欢
C#程序设计基础与实践 电子书
本书以C#语言为载体,系统地讲解了算法的概念、程序设计的基本思想,以及常用的程序设计方法。本书的主要内容包括:程序设计基础知识与C#程序设计的一般方法;算法的概念及应用;数据类型的概念及C#中的常用数据类型;类和对象的概念及应用;用户界面设计的一般方法和技能;I/O流与数据文件的概念及应用。
数字产品设计理论与实践 电子书
随着数字技术的发展,人们对数字产品的需求不断升级,数字产品设计需要考量的因素也更复杂,因此数字产品设计人员面临着更大的挑战。为拓宽数字产品设计相关专业学生的视野,使其更好地应对数字化社会的迅速变革,本书讲解了数字产品的相关理论知识及设计方法。本书共六章。*一章讲解了数字产品设计应该掌握的基础知识,如数字技术的发展、数字产品设计的由来、用户体验及情感化设计相关理论等内容;第二章讲解了数字产品及其设计
ASIC设计理论与实践——RTL 验证、综合与版图设计 电子书
本书以一个8位RISCCPU的设计为主线,按照集成电路设计流程,对CPU进分解,从简单计数器模块开始,到寄存器,再到存储控制器,以及CPU状态控制器等,将重点讲授组合逻辑与时序逻辑、阻塞赋值与非阻塞赋值、状态机的设计及验证方法。并通过对其进行逻辑综合和版图设计,内容覆盖了数字集成电路设计全流程。
C51单片机项目设计实践教程 电子书
本书以C语言为主要编程语言,基于KEIL开发平台和PROTEUSISIS7仿真平台,对许多企业微型项目的实现方法进行了阐述。本书分为两篇。第1篇第1、第2章介绍了单片机的基础知识,包括数制转换、硬件结构和存储器结构等,第3章介绍了单片机的汇编语言及其程序设计方法,第4章重点介绍了51单片机C语言语法及程序设计方法;第2篇以实际项目导向的方式分别介绍了定时/计数器、中断系统、串行扩展、串行口、人机交
程序设计竞赛训练营:算法与实践 电子书
本书分为回溯法、图、动态规划、网格等部分。回溯法部分介绍单向搜索和双向搜索,给出高级搜索的技巧;图部分分为图遍历和图算法章节,先介绍图遍历的方法,再以最小生成树问题、单源最短路径问题、多源最短路径问题、网络流问题中的经典算法为例,介绍了十余种算法的原理和相关应用;动态规划部分逐一介绍了集合型、区间型、图论型、概率型、非典型动态规划,并介绍了空间、时间上的优化技巧,以及相应的备忘、松弛技巧;网格部分