移進規約衝突一例

2021-06-28 21:56:41 字數 2111 閱讀 7984

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