2016-07-24 12 views
0

新しい文法を書こうとしましたが、Var(文法の一種)をあらかじめ定義された定数のセットにできるJavaのEnumのようなものを書きました。Enumの定数へのXtextの相互参照

このVarに含まれる定数を認識したいのですが、私はそれを行う方法を見つけられませんでした(ただし、「XtextとXtendでドメイン固有の言語を実装する」という本を読んでみます)。

Domainmodel: 
    (elements+=AbstractElement)*; 

PackageDeclaration: 
    'package' name=QualifiedName '{' 
    (elements+=AbstractElement)* 
    '}'; 

AbstractElement: 
    PackageDeclaration | Type | Import; 

QualifiedName: 
    ID ('.' ID)*; 

Import: 
    'import' importedNamespace=QualifiedNameWithWildcard; 

QualifiedNameWithWildcard: 
    QualifiedName '.*'?; 

Type: 
    DataType | Entity | Var; 

DataType: 
    'datatype' name=ID; 

Entity: 
    'entity' name=ID ('extends' superType=[Entity|QualifiedName])? '{' 
    (features+=Feature)* 
    '}'; 

Feature: 
    (many?='many')? name=ID ':' type=[VarDecl |QualifiedName]; 

Var: 
    kind='Var' var=VarDecl; 

VarDecl: 
    type=VarType name=SimpleVarID; 

SimpleVarID: 
    ID ('[' INT ']')*; 

VarType: 
    name='boolean' 
    | '{' const+=TypeConstant (',' const+=TypeConstant)* '}'; 

TypeConstant: 
    ID | INT | 'FALSE' | 'TRUE'; 

ので、例は次のとおりです:

Var {LEFT,RIGHT} move 

entity C { 
    content: move 
    side: LEFT //ERROR: couldn't resolve reference to VarDecl 'LEFT' 
} 

私はLEFことを知っているので、私はドメインモデルの文法に少し例を作っ

)インターネット上で多くのことを検索TはVarDeclではなく、IDですが、どうやって違うのか分かりません。 LEFTが移動するもののように認識されるように、私は何をする必要がありますか?
コメント:私の実際の文法では、実際には移動== LEFT(ブール演算子)を試みますが、LEFTは移動の定数として認識されません(同じエラーが表示されます)。

ありがとうございます!

答えて

0

私はあなたを取得しますが、ここでいくつかのヒント

まずあなただけが文法でできるようなものを参照することができますが、あなたが

に名前を付ける気にする必要があり

QualifiedName: 
    TypeConstantLiteral ('.' TypeConstantLiteral)*; 

VarType: 
    name='boolean' 
    | '{' const+=TypeConstant (',' const+=TypeConstant)* '}'; 

Feature: 
    (many?='many')? name=ID ':' type=[Referrable | QualifiedName];  

Referrable: 
    VarDecl | TypeConstant 
; 

TypeConstant: 
    name=TypeConstantLiteral; 

TypeConstantLiteral:ID | INT | 'FALSE' | 'TRUE';  

その後、あるかどうかわからないです

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule { 

    override bindIQualifiedNameProvider() { 
     SimpleNameProvider 
    } 

} 

(あなたの用途に応じて、独自のDefaultDeclarativeNameProviderのサブクラスを使用することができます)

注意:これは型システム/スコープ/バリデーションをまだカバーしていません

+0

ありがとうございました! – RoG

関連する問題