移进规约冲突一例

最近需要给REVOKE语句增加一个新的语法形式,原来的语法形式如下:

 

RevokeStmt: REVOKE opt_revoke_grant_option privileges ON privilege_target

            FROM grantee_list opt_cascade_restrict

 

opt_revoke_grant_option:

             GRANT OPTION FOR

            | /*EMPTY*/

 

原计划按如下形式增加新的语法形式:

 

RevokeStmt: REVOKE opt_revoke_grant_option privileges ON privilege_target

            FROM grantee_list opt_cascade_restrict

            |REVOKE privileges2 FROM grantee_list

 

opt_revoke_grant_option:

             GRANT OPTION FOR

            | /*EMPTY*/

 

通过bison编译,发现移进/规约冲突(SHIFT/REDUCT CONFLICT),查看output文件如下:

 

State 49 conflicts: 6 shift/reduce

查看State 49如下:

 

state 49

 

  1386  RevokeStmt: REVOKE . opt_revoke_grant_option privileges ON privilege_target FROM grantee_list opt_cascade_restrict

  1387           | REVOKE . privileges2 FROM grantee_list opt_grant_admin_option

 

……

EXECUTE   shift, and go to state 572

GRANT     shift, and go to state 573

INSERT    shift, and go to state 574

 

$default  reduce using rule 1433 (opt_revoke_grant_option)

……

 

由于opt_revoke_grant_option可以为空(EMPTY),则在EMPTY时,既可以采用规则1386对opt_revoke_grant_option进行规约(见红色字体),也可以采用规则1387移进到privileges2。

 

通过增加一个新的规则privileges_and_grantee来解决该问题:

RevokeStmt: REVOKE opt_revoke_grant_option privileges_and_grantee

 

privileges_and_grantee:

            privileges ON privilege_target

            FROM grantee_list opt_cascade_restrict

            |privileges2 FROM grantee_list

 

 

上面的修改会改变语法形态,由于opt_revoke_grant_option不一定是EMPTY,还可能是GRANTOPTION FOR,所以,第二条语法规则会增加如下语法形态:

 

REVOKE GRANT OPTION FOR privileges2 FROM grantee_list

 

虽然可以通过判断opt_revoke_grant_option是否为空在语义分析时来报错,但语法形态不符合我们的本意。

 

拆分语法规则:

 http://blog.csdn.net/shujiezhang

另外可以通过拆分语法规则的方式,来解决该问题,可以将opt_revoke_grant_option语法规则拆分掉,那么在privileges之前就不再产生规约,从而屏蔽掉移进规约冲突。

 

增加一个新的语法规则,revoke_privilege来取代原有的移进规约冲突的位置:

 

RevokeStmt: REVOKE revoke_privileges ON privilege_target

            FROM grantee_list opt_cascade_restrict

            |REVOKE revoke_privileges FROM grantee_list

 

revoke_privileges:

            privileges

            |GRANT OPTION FOR privileges

            |privileges2

 

 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值