lex 和 yacc 学习…

经过了几次补充和大改之后dbscale的sql解析器的第一个版本基本出来了。 lex <wbr>和 <wbr>yacc <wbr>学习笔记3 <wbr>(bison语法中冲突的处理)
用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

转载请注明出自高孝鑫的博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值