展开全部

主编推荐语

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

内容简介

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

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

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

目录

  • 版权信息
  • 内容简介
  • 前言
  • 第一篇 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 设计考虑
展开全部

评分及书评

尚无评分
目前还没人评分

出版方

电子工业出版社

电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。