2011-08-18 11 views
2

XTextで私自身のDSLを開発しています。私の現在の.xtextファイルここXTextで自分のDSL。無制限のかっこ( "("、 ")")の問題

1 AND (2 OR (3 OR 4)) 

が、私はこのような何かをしたい

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でどのように実現できるのか分かりません。誰でも助けることができますか?

thxを支援します。

答えて

3

はこれを試してみてくださいXText(これはテストしませんでした)ですが、これはXTextが構築されているANTLR(ANTLRのみを使用しているかもしれません)で動作します。

Aslo、あなたはおそらくスペースであなたのオペレータのトークンを囲むようにしたいが、隠されたパーサーチャネル上に置かないでください:

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

... 

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

... 

それ以外の場合、このようなソースは失敗します:

1 AND(2 OR 3) 

詳細については、XTextユーザーガイドのHidden Terminal Symbolsを参照してください。

+0

@SCBoy、「隠れ端末記号」に関する私の発言も見てください。 –

3

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

私はXTEXT構文の詳細を知っているが、あなたが持っている可能性がBCNFのような構文を使用していない:私は経験がない

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

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

注:

CONDITION_LEVEL: 
    NUMBER 
    '(' CONDITION_LEVEL OPERATOR CONDITION_LEVEL ')' 
関連する問題