博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移进规约冲突一例
阅读量:4074 次
发布时间:2019-05-25

本文共 1838 字,大约阅读时间需要 6 分钟。

最近需要给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

 

 

你可能感兴趣的文章
世界杯买球算法
查看>>
阶乘、阶乘之和的函数式风格实现
查看>>
SVN部署(本地)
查看>>
SVN部署(远程)服务器篇
查看>>
SVN部署(远程)客户端篇
查看>>
CLAPACK动态调用
查看>>
MFC中由左键单击模拟左键双击引起的问题
查看>>
一个指针的引用引发的血案
查看>>
vector的push_back对于拷贝构造和赋值操作的调用
查看>>
OpenSees开发(一)windows 上编译opensees (使用vs2005)
查看>>
小议函数指针
查看>>
WEB服务器、应用程序服务器、HTTP服务器区别
查看>>
用户名称修改的完美解决方法
查看>>
discuz 3 头像显示不成功
查看>>
手动添加uc应用及其 提示notelist表缺少appX字段的处理方法
查看>>
Discuz!X3.2 uc_server密码正确无法登录的解决方法
查看>>
discuz登录admin后台老是自动跳出来
查看>>
discuz限制用户查看购买记录
查看>>
MFC画图
查看>>
一个GDI双缓冲类
查看>>