2012-11-10 26 views
1

我試圖實現一個包含SQL SELECT查詢的某些部分的DSL。SQL JOIN子句:用一個Enum替換一堆標誌

兩個表之間的JOIN語法被指定(例如,用於PostgreSQL)所示:

// one of theese: 
[ INNER ] JOIN 
LEFT [ OUTER ] JOIN 
RIGHT [ OUTER ] JOIN 
FULL [ OUTER ] JOIN 
CROSS JOIN 

注意可選的關鍵字。

以下的Xtext語法作品(排序):當然

Join: 
    'INNER'? inner?='JOIN' 
| left?='LEFT' 'OUTER'? 'JOIN' 
| right?='RIGHT' 'OUTER'? 'JOIN' 
| full?='FULL' 'OUTER'? 'JOIN' 
| cross?='CROSS' 'JOIN' 
; 

模型推理將創建一批不能很好地處理後旗。

我真的是一個枚舉這樣的:

enum JoinType: INNER_JOIN | LEFT_JOIN | RIGHT_JOIN | FULL_JOIN | CROSS_JOIN; 

我想一個枚舉,因爲:

  • 發電機等。可以使用簡單的switch聲明。
  • 可選關鍵字和嵌入空白的處理是語法工作。

是否有任何合理的方法將該枚舉連接到其餘的語法?

回答

0

您可以單獨定義它們,它可能不像枚舉那麼優雅,儘管它是一種方法;

Join: 
(joins += JoinType)+ // or however you wish 
; 
JoinTypes: 
INNER_JOIN | LEFT_JOIN | RIGHT_JOIN | FULL_JOIN | CROSS_JOIN 
; 

然後定義它們中的每一個以及你想要的。

INNER_JOIN: 
// whatever you want, optional keywords etc. 
; 
LEFT_JOIN: 
... 
+0

使用你的語法,我得到一個具有'EString'類型的特性'連接'的EClass'Join'。然後,我將不得不手動評估字符串,包括可選關鍵字,甚至可能是whitepspace。這正是我想要推送到Xtext/ANTLR/...的煩人的部分:-) –

+0

它不像枚舉,但例如,如果您使用Xtend代碼生成,解析時可以得到整體。雖然在編碼時它可能不如直接枚舉那樣方便,但它就像在後臺解析枚舉一樣,因爲您可以獲得枚舉類型。它也不會像前面的字符串一樣。智能感知系統會期望您遵守一個加入規則,並且會根據您的規則完成代碼。但是,它不會像你想要的確切枚舉:) –

+0

如果我將使用_only_ Xtend生成/處理,然後我可以使用我原來的語法,並將標誌和枚舉之間的映射封裝到一個方便的擴展。你的建議是相似的,但交易處理字符串處理原始布爾值。由於此時布爾值已經是比字符串更高的值,我不認爲這是一個好的處理。 –