首页 > 代码库 > 自己动手写编译器、链接器目录结构
自己动手写编译器、链接器目录结构
自序 8
第1章 引言 10
1.1 Hello World编译过程分析 10
1.1.1 Hello World程序源文件 10
1.1.2 词法分析 11
1.1.3 语法分析 12
1.1.4 语义分析 13
1.1.5 链接器 14
1.2 SCC编译器简介 16
1.2.1 SCC编译器架构 16
1.2.2 SCC编译器开发环境 17
1.2.3 SCC编译器运行环境 18
第2章 文法知识 20
2.1 语言概述 20
2.2 形式语言 21
2.2.1 字母表和符号串 21
2.2.2 文法与语言的形式定义 22
2.2.3 文法与语言的类型 23
2.2.4 程序设计语言描述工具 25
2.3 词法分析方法 26
2.3.1 词法定义例举 27
2.3.2 状态转换图 27
2.3.3 词法分析程序流程图 28
2.4 语法分析方法 28
2.4.1 LL分析器 28
2.4.2 LL(k)文法 29
2.4.3 LL(1)文法 29
2.4.4 递归子程序法 31
2.4.5 文法的等价变换 34
第3章 SC语言定义 36
3.1 SC语言的蓝本选择 36
3.1.1 Traditional C 36
3.1.2 C89 36
3.1.3 C99 37
3.2 SC语言对C89简化原则 37
3.3 SC语言的字符集 37
3.3.1 基本字符集 38
3.3.2 扩展字符集 39
3.4 SC语言词法定义 39
3.4.1 关键字 39
3.4.2 标识符 40
3.2.3 整数常量 41
3.2.4 字符常量 41
3.4.3 字符串常量 42
3.4.4 运算符及分隔符 42
3.4.5 注释 43
3.5 SC语言语法定义 43
3.5.1 外部定义 43
3.5.2 语句 46
3.5.3 表达式 50
3.6 SC语言与C语言功能对比 57
3.6.1 关键字 57
3.6.2 数据类型 58
3.6.3 存储类型 59
3.6.4 常量 59
3.6.5 变量 59
3.6.6 函数 60
3.6.7 语句 60
3.6.8 表达式 63
第4章 SC语言词法分析 65
4.1 词法分析的任务的官方说法 65
4.2 单词编码 66
4.3 词法分析用到的数据结构 68
4.3.1 动态字符串 69
4.3.2 动态数组 71
4.3.3 哈希表 74
4.3.4 单词表 75
4.4 错误处理,未雨绸缪 80
4.5 词法分析过程 85
4.5.1 词法分析主程序 85
4.5.2 预处理 89
4.5.3 解析标识符 92
4.5.4 解析整数 93
4.5.5 解析字符串 93
4.5.6 词法分析流程图 96
4.6 词法着色 98
4.7 控制程序 99
4.8 词法分析成果展示 100
第5章 SCC语法分析 101
5.1 外部定义 102
5.1.1 翻译单元 102
5.1.2 外部声明 103
5.1.3 类型区分符 105
5.1.4 结构区分符 107
5.1.5 函数调用约定 110
5.1.6 结构成员对齐 110
5.1.7 声明符 111
5.1.8 初值符 115
5.2 语句 115
5.2.1 复合语句 117
5.2.2 表达式语句 118
5.2.3 选择语句 119
5.2.4 循环语句 119
5.2.5 跳转语句 120
5.3 表达式 122
5.3.1 赋值表达式 123
5.3.2 相等类表达式 124
5.3.3 关系表达式 124
5.3.4 加减类表达 125
5.3.5 乘除类表达式 126
5.3.6 一元表达式 126
5.3.7 后缀表达式 128
5.3.8 初值表达式 129
5.4 语法缩进 131
5.4.1 用到的全局变量及枚举 131
5.4.2 语法缩进程序 131
5.5 控制程序 133
5.6 成果展示 133
第6章 符号表 134
6.1 符号表简介 137
6.1.1 收集符号属性 137
6.1.2 语义的合法性检查 138
6.2 符号表用到的主要数据结构 139
6.2.1 栈结构 139
6.2.2 符号表结构 143
6.2.3 数据类型结构 148
6.2.4 存储类型 149
6.3 符号表的构造过程 150
6.3.1 外部声明 150
6.3.2 类型区分符 153
6.3.3 结构区分符 154
6.3.4 声明符 161
6.3.5 变量初始化 167
6.3.6 复合语句 167
6.3.7 sizeof表达式 168
6.3.8 初等表达式 169
6.4 控制程序 171
6.5 成果展示 173
第7章 生成COFF目标文件 175
7.1 COFF文件结构 175
7.1.1 基本概念 175
7.1.2 总体结构 176
7.1.3 COFF文件头 177
7.1.4 节头表 180
7.1.5 代码节内容 187
7.1.6 数据节与导入节内容 187
7.1.7 COFF符号表 188
7.1.8 COFF字符串表 192
7.1.9 COFF重定位信息 193
7.2 生成COFF目标文件 195
7.2.1 生成节表 196
7.2.2 生成符号表 198
7.2.3 生成重定位信息 201
7.2.4 生成目标文件 202
7.3 成果展示 205
第8章 x86机器语言 207
8.1 x86机器语言简介 207
8.2 通用指令格式 207
8.2.1 指令前缀 208
8.2.2 操作码 210
8.2.3 ModR/M字节 210
8.2.4 偏移量与立即数 213
8.3 X86寄存器 213
8.3.1 数据寄存器 213
8.3.2 变址寄存器 213
8.3.3 指针寄存器 214
8.3.4 段寄存器 214
8.3.5 指令指针寄存器 215
8.3.6 标志寄存器 215
8.4 指令参考 216
8.4.1 符号说明 216
8.4.2 数据传送指令 218
8.4.3 算术运算指令 221
8.4.4 逻辑运算指令 225
8.4.5 控制转移指令 228
8.4.6 串操作指令 232
8.4.7 处理器控制指令 232
8.5 生成X86机器语言 233
8.5.1 操作数栈 233
8.5.2 生成通用指令 235
8.5.3 生成数据传送指令 238
8.5.4 生成算术与逻辑运算指令 242
8.5.5 生成控制转移指令 246
8.5.6 寄存器使用 250
8.6 成果展示 252
第9章 SCC语义分析 254
9.1 外部定义 254
9.1.1 声明与函数定义 254
9.1.2 初值符 257
9.1.3 函数体 259
9.2 语句 262
9.2.1 表达式语句 262
9.2.2 选择语句 263
9.2.3 循环语句 264
9.2.4 跳转语句 266
9.3 表达式 269
9.3.1 赋值表达式 270
9.3.2 相等类表达式 271
9.3.3 关系表达式 272
9.3.4 加减类表达 273
9.3.5 乘除类表达式 274
9.3.6 一元表达式 276
9.3.7 后缀表达式 278
9.3.8 初值表达式 282
9.4 成果展示 284
第10章 链接器 286
10.1 链接方式与库文件 286
10.2 PE文件格式 288
10.2.1 总体结构 288
10.2.2 DOS部分 289
10.2.3 NT头 291
10.2.4 节头表 298
10.2.5 代码节 298
10.2.6 .数据节 300
10.2.7 导入节 301
10.3 链接器代码实现 305
10.3.1 生成PE文件头 305
10.3.2 加载目标文件 308
10.3.3 加载引入库文件 310
10.3.4 解析外部符号 311
10.3.5 计算节区的RVA地址 314
10.3.6 重定位符号地址 315
10.3.7 修正需要重定位的地址 316
10.3.8 写PE文件 317
10.3.9 生成EXE文件 319
10.4 SCC编译器总控程序 320
10.5 成果展示 324
第11章 SC语言程序开发 326
11.1 用SCC进行程序开发流程 326
11.2 SCC编译器测试程序 326
11.2.1 表达式测试 326
11.2.2 语句测试 330
11.2.3 结构体测试 332
11.2.4 函数参数传递测试 335
11.2.5 字符串测试 337
11.2.6 全局变量测试 338
11.3 SC语言应用举例 339
11.3.1 可接收命令参数的控制台程序 339
11.3.2 可接收命令参数的Win32程序 340
11.3.3 HelloWindows窗口程序 341
11.3.4 文件复制程序 346
11.3.5 九九乘法表 349
11.3.6 打印菱形 350
11.3.7 屏幕捕捉程序 353
第12章 附录一SCC文法定义中英文对照表 361
第13章 参考文献 366
自己动手写编译器、链接器目录结构