2

XTextで独自のDSLを開発しています。

私はこのようなことをしたい:

1 AND (2 OR (3 OR 4))

ここに私の現在の.xtextファイル:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Model:
    (greetings+=CONDITION_LEVEL)
;

terminal NUMBER :
    ('1'..'9') ('0'..'9')*
;

AND:
    ' AND '
;

OR:
    ' OR '
;

OPERATOR : 
    AND | OR
;

CONDITION_LEVEL:
    ('('* NUMBER (=>')')* OPERATOR)+ NUMBER ')'*
;

私が抱えている問題は、DSLが無制限のブラケットを作成する可能性があるはずですが、プログラマーが開いているすべてのブラケットを閉じないとエラーを表示することです。

例:

1 AND (2 OR (3 OR 4)

1つの角かっこがありません->エラーが発生するはずです。

XTextでこれをどのように実現できるかわかりません。誰か助けてもらえますか?

助けてくれてありがとう。

4

2 に答える 2

3

構文を再帰的にする必要があります。基本的な考え方は、CONDITION_LEVELたとえば、 aを。でCONDITION_LEVEL区切って2つにすることができるということOPERATORです。

xtext構文の詳細はわかりませんが、BCNFのような構文を使用すると次のようになります。

CONDITION_LEVEL:
    NUMBER
    '(' CONDITION_LEVEL OPERATOR CONDITION_LEVEL ')'
于 2011-08-18T12:09:37.653 に答える
3

これを試して:

CONDITION_LEVEL
  :  ATOM ((AND | OR) ATOM)*
  ;

ATOM 
  :  NUMBER 
  |  '(' CONDITION_LEVEL ')'
  ;

私はXTextの経験がないことに注意してください(したがって、これをテストしませんでした)が、これはXTextが構築されているANTLRで機能します(またはおそらくANTLRのみを使用します...)。

Aslo、おそらくオペレータートークンをスペースで囲みたくないでしょうが、それらを非表示のパーサーチャネルに配置します。

grammar org.xtext.example.mydsl.MyDsl hidden(SPACE)

...

terminal SPACE : (' '|'\t'|'\r'|'\n')+;

...

そうしないと、このようなソースは失敗します。

1 AND(2 OR 3)

詳細については、XTextユーザーガイドの非表示終端記号を参照してください。

于 2011-08-18T12:21:38.057 に答える