最近需要給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是否為空在語義分析時來報錯,但語法形態不符合我們的本意。
另外可以通過拆分語法規則的方式,來解決該問題,可以將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
oracle裡面使用臨時表解決表衝突一例(轉貼)
平台 windows 2000 server sp3 資料庫 oracle 9.0.1.1.1 現場描述 使用者抱怨不能同時對多個單位進行資料處理,執行出現的錯誤資訊為 sql exec sp hyb da ryxx dwbh test 331028 begin sp hyb da ryxx dwb...
演算法優化一例
本文將以排序演算法中的插入排序為例,介紹優化演算法,編制高效程式的方法。人們通常用於排序手中橋牌的方法是一次考慮一張牌,將它插入到已經排序過的牌的適當位置中 時刻讓它們保持有序 在計算機實現中,我們需要將較大的元素移到右邊,為插入的元素準備空間,然後再在空位置上插入該元素。該演算法的通常的乙個實現如...
delegate 委託一例
using system using system.collections.generic using system.linq using system.text namespace consoletest public static void englishgreeting string snam...