经过了几次补充和大改之后dbscale的sql解析器的第一个版本基本出来了。
用flex和bison弄语法解析器最头疼的问题就是各种语法冲突。
当出现冲突的时候可以使用 bison -v xxx.yy 命令来查看具体的冲突。该命令会生成一个xxx.output文件, 文件中在 Terminals 和 语法之间会把那些个states有冲突给列出来,例如:
状态 562 conflicts: 26 shift/reduce
有些时候语法冲突可以简单的通过bison提供的优先级说明符 %prec来解决如上面的发生冲突的“状态526”,通过查看“状态526”的具体内容我们可以看到如下冲突分支:
375 expr: expr . '+' expr
......
385
| expr . compare expr
385
| expr compare expr .
......
可以明显的看到bison在处理 语法分支 "expr: expr compare expr"时不知道该如何去读,这个可以通过如下方式来解决:
...
%left COM_EQ
...
expr: expr compare expr %prec COM_EQ
...
指定这条语句参照某个其他操作符的结合顺序,这里是参照操作符 COM_EQ, 它的结合顺序是先左,即解析成
expr: expr . compare expr
转载请注明出自高孝鑫的博客

用flex和bison弄语法解析器最头疼的问题就是各种语法冲突。
当出现冲突的时候可以使用 bison -v xxx.yy 命令来查看具体的冲突。该命令会生成一个xxx.output文件, 文件中在 Terminals 和 语法之间会把那些个states有冲突给列出来,例如:
状态 562 conflicts: 26 shift/reduce
有些时候语法冲突可以简单的通过bison提供的优先级说明符 %prec来解决如上面的发生冲突的“状态526”,通过查看“状态526”的具体内容我们可以看到如下冲突分支:
......
......
可以明显的看到bison在处理 语法分支 "expr: expr compare expr"时不知道该如何去读,这个可以通过如下方式来解决:
...
%left
...
expr: expr compare expr %prec COM_EQ
...
指定这条语句参照某个其他操作符的结合顺序,这里是参照操作符 COM_EQ, 它的结合顺序是先左,即解析成
expr: expr . compare expr
转载请注明出自高孝鑫的博客