这部分内容会介绍一些如何对miniob中的词法语法分析模块进行开发与调试,以及依赖的工具。
词法分析代码lex_sql.l使用下面的命令生成C代码:
flex --header-file=lex.yy.h lex_sql.l
生成 lex.yy.c
和lex.yy.h
文件。
语法分析代码yacc_sql.y使用下面的命令生成C代码:
bison -d -b yacc_sql yacc_sql.y
将会生成代码yacc_sql.tab.c和yacc_sql.tab.h。
其中-b表示生成的源码文件前缀,-d表示生成一个头文件。
注意:flex 使用 2.5.35 版本测试通过,bison使用3.7版本测试通过(请不要使用旧版本,比如macos自带的bision)。
注意:当前没有把lex_sql.l和yacc_sql.y加入CMakefile.txt中,所以修改这两个文件后,需要手动生成c代码,然后再执行编译。
对于lex_sql.l,参考代码中的YYDEBUG宏,可以在lex_sql.l中增加调试代码和开启宏定义,也可以在编译时定义这个宏,比如直接修改lex.yy.c代码,在代码前面增加#define YYDEBUG 1。注意,lex.yy.c是自动生成代码,执行flex命令后,会把之前的修改覆盖掉。示例:
#include "yacc_sql.tab.h"
extern int atoi();
extern double atof();
char * position = "";
#define YYDEBUG 1 // 可以在这里定义 YYDEBUG宏
#ifdef YYDEBUG
#define debug_printf printf // 也可以调整lex_sql.l代码,在定义YYDEBUG宏的时候,做更多事情
#else
#define debug_printf(...)
#endif // YYDEBUG
对于yacc_sql.y,可以在yyerror中输出错误信息,或者直接使用调试工具设置断点跟踪。
-
下载一个合适版本的bison源码 下载链接,比如 bison-3.7.tar.gz
-
在本地解压。
tar xzvf bison-3.7.tar.gz
,然后进入bison-3.7:cd bison-3.7
; -
执行
./configure --prefix="your/bison/install/path"
-
执行 make install
-
安装完成
注意: 安装后的Bison在指定的安装目录的bin下,如果不调整PATH环境变量,无法直接使用到最新编译的bison二进制文件,需要写全路径使用,比如 your/bison/install/path/bin/bison。