1

我正在尝试实现一个包含 SQLSELECT查询某些部分的 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语句。
  • 可选关键字和嵌入空格的处理是语法工作。

有什么合理的方法可以将该枚举与语法的其余部分联系起来吗?

4

1 回答 1

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:
...
于 2012-11-14T09:21:14.163 回答