移进规约冲突一例

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

时间: 2024-10-11 04:39:16

移进规约冲突一例的相关文章

jQuery事件 mouseover方法与mouseout方法实现鼠标移进显示移出消失的效果 (css控制span标签)

<script> $(function(){ var text ; $(".pos span").each(function(){ text = $(this).text().trim(); if(text=="设为默认"){ $(this).css('display','none'); } }); $(".pos").mouseover(function(){ //鼠标移进显示效果 text = $(this).find('span

复杂进销存样例

为方便开发参考,实现复杂的交互及子从表的操作,后面版本将提供复杂的进销存样例,并集成代码生成器生成复杂的表操作主要功能:主从表联合显示批量提交,批量导入弹窗选择动态计算行等等...

华为Huawei Honor6 荣耀6 开机卡住不进系统恢复一例

Huawei Honnor6 荣耀6 开机卡住不进系统无损镜像一例 昨天接到我们客户一台華為Honnor6 荣耀6,开机卡屏,进不了系统,要求恢复数据.如题 在我们UFED的帮助下,最后手机无损取得镜像,芯片完好无损,数据也完无损!Thats amazing! 各位有需要的可以联系我!微信17701607488 网址https://shop110840885.taobao.com/ -----

使用animate()的时候,有时候会出现移进移出的闪动问题

怎么解决这种问题呢?在animate()前面需要加上stop() 例如: $(".nav_list").hover(function(){ $(".div1").stop().slowDown(); },function(){ $(".div1").stop().slowUp(); })

构造可配置词法语法分析器生成器(下)

本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo mylex & xparser mylex & xparser是笔者实现的类似于Lex和Yacc的词法语法分析器生成器,它接受正则表达式定义的词法规则和BNF定义的语法规则,自动构造对应的以C为宿主语言的词法分析器源程序mylex.h, mylex.c和语法分析器源程序xparser.h, xparser.c. mylex & xparser特点如下: 轻量无依赖:构造器的主要代码仅2

SQLite3源程序分析之Lemon分析器生成工具

1.概述 Lemon是一个LALR(1)文法分析器生成工具.虽然它是SQLite作者针对SQLite写的一个分析器生成工具,但是它与bison和yacc类似,是一个可以独立于SQLite使用的开源的分析器生成工具.而且它使用与yacc(bison)不同的语法规则,可以减少编程时出现错误的机会.Lemon比yacc和bison更精致.更快,而且是可重入的,也是线程安全的——这对于支持多线程的程序是非常重要的. Lemon的主要功能就是根据上下文无关文法(CFG),生成支持该文法的分析器.程序的输入

基于PLY的STL文件基本信息统计方法

1.摘要 STL文件是快速成型设备中常用的文件格式,随着3D打印技术的发展,STL格式文件的应用日益广泛.Python语言具有丰富和强大的类库,其语言简洁而清晰,因而Python语言越来越受欢迎.PLY是具名的LEX.YACC的Python版本,本文介绍了利用PLY模块对STL文件进行基本信息统计. KeyWord:PLY.语法分析.词法分析.STL 2.简介 计算机语言是计算机软件的系统的基础,经过几十年的发展,实现了从低级语言到高级语言的转变.原始的机器语言,到低级的汇编语言,它们虽然可以运

LL(1),LR(0),SLR(1),LR(1),LALR(1)的 联系与区别

一:LR(0),SLR(1),规范LR(1),LALR(1)的关系     首先LL(1)分析法是自上而下的分析法.LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法.            自上而下:从开始符号出发,根据产生式规则推导给定的句子.用的是推导            自下而上:从给定的句子规约到文法的开始符号.用的是归约      1: SLR(1)与LR(0)的关系:            SLR(1)与LR(0):简单的LR语法分析技术(即SLR(1)分析技

现代编译原理--第三章(抽象语法树以及源码)

这是flxe的文件,文件名称为tiger.l %{ #include <string.h> #include "util.h" #include "tokens.h" #include "errormsg.h" #include "iostream" #include "tiger.tab.h" int charPos=1; int count = 0 ; #ifdef __cplusplus