前言 1
第1章 Flex和Bison简介 7
词法分析和语法分析 7
正则表达式和词法分析 8
文法与语法分析 16
二义性文法:并不多见 20
添加更多的规则 21
Flex和Bison与手写的词法分析器和语法分析器的对比 22
练习 23
第2章 使用Flex 25
正则表达式 25
Flex词法分析器中的文件I/O操作 29
读取多个文件 30
Flex词法分析器的I/O结构 32
起始状态和嵌套输入文件 34
符号表和重要语汇索引生成器 38
C语言交叉引用 44
练习 51
第3章 使用Bison 53
Bison语法分析器如何匹配输入 53
移进/归约分析 54
Bison语法分析器 57
基于抽象语法树的改进的计算器 58
移进/归约冲突和操作符优先级 63
一个高级计算器 66
使用高级计算器 84
练习 85
第4章 分析SQL 86
SQL概述 86
关系操作 88
使用SQL的三种方法 88
从SQL到逆波兰式(RPN) 89
词法分析器 90
语法分析器 99
SQL分析器的Makefile 121
练习 122
第5章 Flex规范参考 123
Flex结构规范 123
BEGIN 124
C++词法分析器 125
上下文相关性 125
定义(替换) 126
ECHO 127
输入管理 127
Flex库 130
交互模式和批处理模式的词法分析器 130
行号和yylineno 130
文字块 131
单一程序中的多重词法分析器 131
编译词法分析器的选项 133
Flex词法分析器的可移植性 133
可重入词法分析器 134
正则表达式语法 137
REJECT 139
从yylex()返回值 140
起始状态 140
unput() 141
yyinput()yyunput() 142
yyleng 142
yyless() 142
yylex()和YY_DECL 143
yymore() 143
yyrestart() 144
yy_scan_string和yy_scan_buffer 144
YY_USER_ACTION 144
yywrap() 144
第6章 Bison规范参考 145
Bison语法结构 145
二义性和冲突 148
Bison程序的问题 150
C++语法分析器 151
%code块 151
结束标记 151
错误记号和错误恢复 152
继承属性($0) 152
词法反馈 154
文字块 155
文字记号 155
位置 156
%parse-param 156
Bison语法分析器的可移植性 157
优先级和结合性声明 158
递归规则 160
规则 161
特殊字符 162
%start声明 164
符号值 164
记号 165
可变语法和多重语法 168
多重语法分析器 169
y.output文件 170
Bison库文件 171
YYABORT 172
YYACCEPT 172
YYBACKUP 173
yyclearin 173
yydebug和YYDEBUG 173
YYERROR 174
yyerror() 175
yyparse() 175
YYRECOVERING() 175
第7章 二义性和冲突 177
指针模型和冲突 177
冲突类型 179
语法分析器状态 181
name.output的内容 182
归约/归约冲突 183
移进/归约冲突 184
复习name.output中的冲突 187
常见的冲突例子 188
IF/THEN/ELSE 190
你如何解决冲突? 192
IF/THEN/ELSE(移进/归约冲突) 192
嵌套循环(移进/归约冲突) 194
表达式优先级(移进/归约冲突) 195
总结 199
练习 199
第8章 错误报告和恢复 200
错误报告 200
错误恢复 208
Bison错误恢复 208
编译器错误恢复 211
练习 212
第9章 Flex和Bison进阶 213
纯词法分析器和纯语法分析器 213
GLR分析 234
C++语法分析器 239
练习 246
附录 SQL语法分析器文法和交叉引用 247
术语表 263