miniob-sql-parser.md 2.3 KB
Newer Older
羽飞's avatar
羽飞 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
这部分内容会介绍一些如何对miniob中的词法语法分析模块进行开发与调试,以及依赖的工具。

# 如何编译词法分析和语法分析模块

词法分析代码lex_sql.l使用下面的命令生成C代码:

```bash
flex --header-file=lex.yy.h lex_sql.l
```

生成 `lex.yy.c``lex.yy.h`文件。

语法分析代码yacc_sql.y使用下面的命令生成C代码:

```bash
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命令后,会把之前的修改覆盖掉。示例:

```c++
#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
1. 下载一个合适版本的bison源码 [下载链接](http://ftp.gnu.org/gnu/bison/),比如 [bison-3.7.tar.gz](http://ftp.gnu.org/gnu/bison/bison-3.7.tar.gz)

2. 在本地解压。`tar xzvf bison-3.7.tar.gz`,然后进入bison-3.7: `cd bison-3.7`;

3. 执行  `./configure --prefix="your/bison/install/path"`

4. 执行 make install

5. 安装完成

注意: 安装后的Bison在指定的安装目录的bin下,如果不调整PATH环境变量,无法直接使用到最新编译的bison二进制文件,需要写全路径使用,比如 your/bison/install/path/bin/bison。