SQL JOIN子句:用一个枚举替换一堆标志

时间:2012-11-10 13:15:37

标签: grammar xtext

我正在尝试实现包含SQL SELECT查询的某些部分的DSL。

指定了两个表之间的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语句。
  • 可选关键字和嵌入空格的处理是语法工作。

有没有合理的方法将枚举连接到语法的其余部分?

1 个答案:

答案 0 :(得分:0)

你可以单独定义它们,但它可能不如enum那么优雅,尽管它是一种解决方法;

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:
...