电子工业出版社精品店店铺主页二维码
电子工业出版社精品店
微信扫描二维码,访问我们的微信店铺

小型编译器设计实践 编译器设计初步实践讲解书籍 编译器设计实战介绍书 电子工业出版社 苏孟晋 著

49.00
运费: 免运费
小型编译器设计实践 编译器设计初步实践讲解书籍 编译器设计实战介绍书 电子工业出版社 苏孟晋 著 商品图0
小型编译器设计实践 编译器设计初步实践讲解书籍 编译器设计实战介绍书 电子工业出版社 苏孟晋 著 商品图1
小型编译器设计实践 编译器设计初步实践讲解书籍 编译器设计实战介绍书 电子工业出版社 苏孟晋 著 商品缩略图0 小型编译器设计实践 编译器设计初步实践讲解书籍 编译器设计实战介绍书 电子工业出版社 苏孟晋 著 商品缩略图1

商品详情

书名:小型编译器设计实践
定价:99.8
ISBN:9787121471964
作者:无
版次:*1版
出版时间:2024-01

内容提要:
本书主要着力于叙述编译器具体的设计和编程细节,并不侧重探究编译器的设计理论。本书以目前较为流行的两款微处理器(MCU)为例,设计、开发相应的C语言编译器工具包:(1) 加强型PIC16Fxxxx系列MCU、8位微处理器、RISC系统结构、小端式体系(little-endian)。(2) STM8系列MCU、8位微处理器、CISC系统结构、大端式体系(big-endian)。本书以实际目标处理器为对象,介绍和展现编译器设计的全部详细过程。



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

媒体评论:
着力于叙述编译器具体的设计和编程细节,并不侧重探究编译器的设计理论。

目录:

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

*1章 工具准备和系统设置..2

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

1.1.1 MinGW .............. 2

1.1.2 DJGPP ................ 2

1.1.3 Cygwin ............... 2

1.2 解析工具构造器 ............ 3

1.3 工具的安装 .................... 3

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

*2章 预处理器的设计.........5

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

2.1.1 项目文件及其设置..........................6

2.1.2 任务和算法........ 7

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

2.2.1 正规表达式简介............................12

2.2.2 预处理器设计实战........................14

2.3 本章小结 ...................... 20

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

3.1 设计简介 ...................... 21

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

3.2.1 工程项目文件..22 3.2.2 项目运行主程序............................23

小型编译器设计实践

3.2.3 词法解析自动机部分....................23

3.2.4 词法解析 C 语言部分 ................... 24

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

3.3.1 问题的提出和任务........................25

3.3.2 工程文件 makefile.........................26

3.3.3 词法解析规则部分........................26

3.3.4 词法解析的启动............................27

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

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

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

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

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

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

3.5 编译树的构建 .............. 34

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

3.5.2 节点生成和处理函数....................35

3.5.3 语法解析器文本的定义部分 ........ 36

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

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

3.6.1 缓冲区与相关函数........................38

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

3.6.3 读取源代码缓冲内容....................39

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

3.6.5 支持函数和程序............................40

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

3.7 编译树的显示 .............. 41

3.7.1 用于显示编译树的函数 ................ 42 3.7.2 

编译树的显示操作........................42

第4章编译器设计实战.......44 4.1 

第5章对 C 语言的词法解析..44

VIII


4.1.1 词法解析宏定义部分....................44

4.1.2 各种常数解析识别........................45

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

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

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

4.2 对 C 语言的语法解析.. 47

4.2.1 描述特征的 attrib 完整结构 ......... 48

4.2.2 各类 node 数据结构的完善 .......... 48

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

4.2.4 函数声明/定义的完善................... 51

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

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

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

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

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

4.3.3 用于预处理语句的解析 ................ 57

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

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

4.5 支持对 typedef 的语法解析 ...................... 63

4.5.1 支持 typedef 的新变量 .................. 63

4.5.2 判断标识符的性质........................64

4.5.3 typedef 语法解析...........................64

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

4.5.5 使用新类型名..66

4.6 本章小结 ...................... 66

第5章 编译树的预扫描.......67

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

5.1.1 符号表基本数据结构 Nnode ........ 69

5.1.2 符号表链数据结构 Nlist...............69

5.2 符号的链表操作 .......... 71

目录

IX


小型编译器设计实践

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

5.2.2 对符号表链的搜索........................72

5.2.3 对符号表链添加符号定义 ............ 72

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

5.2.5 介绍一组辅助函数........................73

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

5.3 对编译树的预扫描 ...... 75

5.3.1 预扫描操作的类............................75

5.3.2 预扫描的启动运行........................76

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

5.3.4 对 idNode_t 节点的扫描 ............... 77

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

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

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

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

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

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

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

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

5.3.13 对 typedef 语句的扫描处理 ........ 86

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

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

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

5.3.17 对#pragma 操作的扫描处理 ....... 90

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

5.4 本章小结 ...................... 91

第6章 P-代码与虚拟机.......92 

6.1 基本数据结构 .............. 93

6.1.1 操作项 Item 数据结构 ..................93

6.1.2 代码片段 Pnode 数据结构............95

X

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

6.2 变量表和函数表 .......... 98

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

6.2.2 Dlink 的应用操作和表示............100

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

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

6.3 P-代码生成基础......... 103

6.3.1 生成器类........ 104

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

6.4 P-代码生成过程......... 107

语句行终结和复合语句 .............. 107

变量声明和定义..........................10

普通函数的声明和定义 .............. 111 

赋值操作语句 113 

变量地址 ADDR_OF .................. 114 

变量地址 POS_OF ...................... 115 

表达式中数组偏址计算 .............. 117 

调试显示工具的扩充..................120 

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

变量的成员间接偏移寻址 ........ 124 

预先递增和预先递减 ................ 126 

滞后递增和滞后递减 ................ 127 

sizeof()函数 . 129 

标号语句 LABEL 和 GOTO 语句 .......................... 130 

单目运算语句............................130 

类型强制转换............................132 

SBIT 类型操作项......................133 

复合赋值运算 ADD_ASSIGN 和 SUB_ASSIGN..133 算术运算“+”和“-”............ 135 

逻辑运算“&”、“|”和“^” .. 136

目录

XI


小型编译器设计实践

6.4.21 其他复合赋值运算....................137

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

6.4.23 算术比较运算............................139

6.4.24 逻辑“与关联”操作 ................ 140

6.4.25 逻辑“或关联”操作 ................ 141

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

6.4.27 if 语句 .......... 144

6.4.28 while 语句....145

6.4.29 do ... while 语句 ......................... 146

6.4.30 for 语句 ........ 147

6.4.31 break 和 continue 语句 .............. 148

6.4.32 switch 语句 .. 149

6.4.33 call 语句 ....... 153

6.4.34 条件运算符“?”语句 .............. 156

6.4.35 连续运算符“,”语句 ............... 158

6.4.36 函数返回 return 语句 ................ 159

6.4.37 汇编语言插入语句 AASM ....... 160

6.4.38 编译设置语句 PRAGMA.......... 160

6.5 本章总结 .................... 160

第7章 P-代码的优化........162

7.1 清除冗余的代码 ........ 164

7.1.1 删除冗余的标号..........................164

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

7.1.3 常数与地址运算的合并 .............. 168

7.2 代码的合并简化 ........ 169

7.2.1 地址与常数运算的合并 .............. 169

7.2.2 合并间接偏址计算......................170

7.2.3 简化和重组双目运算..................171

7.2.4 省略临时变量 171

7.2.5 变换运算顺序 172

XII


7.2.6 合并连续常数运算......................172

7.2.7 简化运算类型 173

7.3 条件跳转操作的优化  173

7.3.1 简单的跳转类型变换..................173

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

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

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

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

7.4.1 简化算术逻辑运算......................175

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

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

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

7.5.2 临时变量的重复使用..................179

7.5.3 临时变量长度*小化..................180

7.6 其他种类的优化 ........ 181

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

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

7.7 本章小结 .................... 184

第8章 汇编语言输出........185

8.1 PIC16Fxxxx 处理器简介 ......................... 185

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

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

8.1.3 汇编器设计的基本结构 .............. 188

8.2 编译器的汇编语言输出 .......................... 190

8.2.1 汇编语言输出的起始..................190

8.2.2 汇编语言输出全局 RAM 变量...192 8.3 运行代码的汇编语言输出 ...................... 193

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

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

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

目录

XIII


小型编译器设计实践

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

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

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

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

8.3.8 NEG_OF 运算的汇编语言输出 . 206

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

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

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

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

XOR_ASSIGN........................... 211

8.3.13 P_JZ 和 P_JNZ 的汇编语言输出 ........................... 213

8.3.14 P_JBZ 和 P_JBNZ 的汇编语言输出 ...................... 214

8.3.15 P_ARG_PASS 的汇编语言输出 ............................. 215

8.3.16 P_CALL 的汇编语言输出 ........ 215

8.3.17 P_JZ_INC、P_JZ_DEC、P_JNZ_INC 和 P_JNZ_DEC 的汇编

语言输出......216

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

8.3.19 P_JEQ 和 P_JNE 的汇编语言输出......................... 221

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

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

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

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

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

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

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

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

8.3.28 乘法的汇编语言输出 ................ 242

8.3.29 复合除法 DIV_ASSIGN 和复合取模 MOD_ASSIGN 的汇编

语言输出 .....243

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

XIV


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

8.3.32 函数型汇编插入........................246

8.3.33 P_DJNZ/P_IJNZ 的汇编语言输出 ......................... 247

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

8.3.35 AASM 的汇编语言输出 ........... 251

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

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

8.4.2 ROM 常数的汇编语言输出........253

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

第9章 PIC16Fxxxx编译器*后的完善...........257

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

9.1.1 增加编译选项 258

9.1.2 搜索/获取编译选项..................... 260

9.1.3 使用编译选项 260

9.2 编译器库函数的设计  262

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

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

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

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

*10章 PIC16Fxxxx汇编器的词法解析器......268

10.1 10.2

10.3

数据结构的设计 ...... 268

汇编器的词法解析设计 ........................ 271

10.2.1 起始状态...... 272

10.2.2 操作码状态.. 273

10.2.3 操作数状态.. 273

汇编器的语法解析设计 ........................ 274

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

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

10.3.3 汇编语句操作数处理 ................ 276

目录

XV


小型编译器设计实践

10.4

10.5

10.6

10.3.4 汇编器的产生............................278 

汇编器对输入文件的扫描 .................... 279

10.4.1 汇编器的 P16E_asm 类的启动.280

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

汇编器的代码转换输出 ........................ 282

电子工业出版社精品店店铺主页二维码
电子工业出版社精品店
扫描二维码,访问我们的微信店铺

小型编译器设计实践 编译器设计初步实践讲解书籍 编译器设计实战介绍书 电子工业出版社 苏孟晋 著

手机启动微信
扫一扫购买

收藏到微信 or 发给朋友

1. 打开微信,扫一扫左侧二维码

2. 点击右上角图标

点击右上角分享图标

3. 发送给朋友、分享到朋友圈、收藏

发送给朋友、分享到朋友圈、收藏

微信支付

支付宝

扫一扫购买

收藏到微信 or 发给朋友

1. 打开微信,扫一扫左侧二维码

2. 点击右上角图标

点击右上角分享图标

3. 发送给朋友、分享到朋友圈、收藏

发送给朋友、分享到朋友圈、收藏