绪论 1
预备知识 1
组织 2
源代码及其兼容性 2
第一章 基本概念 4
1.1 编译器的组成成份 4
1.2 计算机语言的表示 7
1.3 递归下降的表达式编译器 12
第二章 输入与词法分析 24
2.1 作为编译器成份的词法分析器 24
2.2 词法分析器中的错误恢复 25
2.3 输入系统 25
2.4 词法分析 36
2.5 LEX—词法分析程序生成器 56
第三章 上下文无关文法 111
3.1 句子、短语、上下文无关文法 111
3.2 推导和句型 112
3.3 语法分析树和语义障碍 113
3.4 ?产生式 115
3.5 输入结束标志 116
3.6 右线性文法 116
3.7 表、递归和结合性 117
3.8 表达式 120
3.9 文法的二义性 122
3.10 语法制导翻译 122
3.11 表示普通文法 128
第四章 自顶向下的语法分析 130
4.1 下推自动机 130
4.2 在自顶向下的语法分析过程中使用PDA 133
4.3 自顶向下语法分析器中的错误恢复 133
4.4 增量式文法和表驱动的语法分析器 135
4.5 自顶向下语法分析过程的自动化 137
4.6 LL(1)文法及其局限性 141
4.7 构造语法分析表 142
4.8 修改文法 146
4.9 LL(1)语法分析器的实现 153
4.10 llama—实现LL(1)语法分析程序生成器 181
第五章 自底向上的语法分析 222
5.1 自底向上的语法分析过程 222
5.2 自底向上语法分析过程中的递归 225
5.3 用自动机实现语法分析器 225
5.4 LR语法分析器中的错误恢复 230
5.5 值栈和属性处理 230
5.6 构造LR语法分析表—理论 234
5.7 表示LR状态表 243
5.8 消除单归约状态 247
5.9 使用二义性文法 249
5.10 实现LALR(1)语法分析器:OCCS输出文件 253
5.11 实现LALR(1)语法分析程序生成器:OCCS核心 266
5.12 生成语法分析器文件 271
5.13 生成LALR(1)语法分析表 272
第六章 代码生成 296
6.1 中间语言 296
6.2 C_code:一种中间语言和虚机 298
6.3 符号表 317
6.4 语法分析器:配置 337
6.5 语法分析器 343
6.6声明 346
6.7 子程序gen() 374
6.8 表达式 380
6.9 语句和控制流 425
第七章 优化策略 435
7.1 语法分析优化 435
7.2 线性(窥孔)优化 435
7.3 结构优化 441
7.4 别名问题 448
附录A 支持函数 450
A.1 丰富的包含文件 450
A.2 集合操作 456
A.3 数据库维护—哈希法 470
A.4 ANSI可变参数机制 480
A.5 函数转换 481
A.6 打印函数 485
A.7 排序 489
A.8 附加函数 492
A.9 用于IBM PC的低缓视频I/O函数 495
A.10 低级I/O与接合函数 513
A.11 窗口管理:Curses 515
附录B PASCAL编译器的一些说明 534
B.1 子程序参数 534
B.2 反回值 534
B.3 堆栈帧 534
附录C C语言的语法 536
附录D LEX 540
D.1 LEX和Occs的结合使用 540
D.2 LEX输入文件结构 541
D.3 LEX规则部分 542
D.4 LEX命令行开关 548
D.5 限制和不足 549
D.6 例子:一个C语言的语义分析器 551
附录E LLama和Occs 554
E.1 编译器的编译器的使用 555
E.2 输入文件 555
E.3 定义部分 555
E.4 规则部分 556
E.5 代码部分 558
E.6 输出文件 559
E.7 命令行开关 559
E.8 直观的语法分析器 560
E.9 几个有用的子程序和变量 565
E.10 使用自己编写的语法分析器 567
E.11 Occs 568
E.12 LLama 587
附录F C-code总结 591