2012-02-16 11 views
0

私は次のように解析します文法を作成しようとしています:のXtextリストまたは一つだけのアイテム

つまり
reference: java.util.String 

が、同様に

reference: {java.util.String, java.lang.Integer} 

、私はそれがしたいです修飾された名前のリストと、1つの項目(この場合は '{'でマークされていない項目)の両方を解析します。

私が試したことは、このされています。しかし、私はエラーを取得しています

Reference: 
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values+=QualifiedName); 

:「{」 'Javaので、参照の最初の形式を使用している場合({なし)欠落しています。何を試してみるべきですか?

編集:また

Reference: 
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | ((!'{')values+=QualifiedName); 

を試みたが、入力時に何も実行可能な代替案を取得していません '!'文法定義の誤り。

EDIT2:「コンマ区切りリスト」に問題はありません。私はこれを別々に試してみましたが、うまくいきました。私の唯一の問題は、ルールの2つの部分を '{'文字に基づいて区別することです。

答えて

8

これは、トリックを行います:

Reference: 
'reference' ':' (
    '{' values+=QualifiedName (',' values+=QualifiedName)* '}' 
    | values+=QualifiedName 
); 

precedenciesを気にしてください。グループと選択肢の

+0

偉大な、私は今どこに間違って行ったそれを得る:) – Deelazee

0

私はちょうどそれを試しを与えること、のXtextに非常に新しいです:

Reference: 
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values=QualifiedName); 

または

Reference: 
    'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)+ '}') | (values=QualifiedName); 
+0

最初に:QualifiedNameは、他の値の場合とは異なるカーディナリティを持つため(文法でエラーが発生するため)、QualifiedNameを値に割り当てることはできません。 2番目:私はリストが不定サイズである必要があるので、+は適合しません(0または1を意味します)。しかし、試してくれてありがとう。 – Deelazee

関連する問題