1

SELECTSQLクエリの一部を含む DSL を実装しようとしています。

2 つのテーブル間の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

それらを個別に定義することができます。それは回避策ですが、列挙型ほどエレガントではない場合があります。

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 に答える