2016-09-23 15 views
0

私は列挙型のような単純な言語を使っています。相互参照されたEnumEntryのための解決方法を得るにはどうすればいいですか?また、EnumEntityでEnumEntryをフィルタリングするために良いだろう...enum型の言語のXtext相互参照

MyDsl.xtext

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

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

Model: 
    entity_node = Entity | EnumEntity; 

Entity: 
    type = ('my_entity') ':' name = ID '{' 
    (parts += EntityPart)* 
    '}'; 

EnumEntity: 
    type = ('my_enum') ':' name = ID '{' 
    //entry = EnumEntry (',' entrys+= EnumEntry)* Fixed after Christian comment 
    entrys+= EnumEntry (',' entrys+= EnumEntry)* 
    '}'; 

EnumEntry: 
    name = ID; 

EnumUsage: 
    /* What should I do here? */ 
    enumEntity = [EnumEntity]'.'entry = [EnumEntry]; 

EntityPart: 
    EnumUsage ';'; 

my_enum_entity.mydsl

my_enum:my_enum_entity 
{ 
    my_enum_entry_1, 
    my_enum_entry_2, 
    my_enum_entry_3 
} 

my_pretty_entity.mydsl

my_entity:my_pretty_entity 
{ 
    my_enum_entity.my_enum_entry_2;             
} 

Some error

答えて

1

あなたはscopeproviderをカスタマイズしていないか、単にコードを投稿していませんでしたか?

ID期待して何かあなたが

EnumUsage: entry = [EnumEntry|FQN]; 
FQN: ID ("." ID)*; 
+0

のNopのような文法を適応スコープ適合させたくない場合は

class MyDslScopeProvider extends AbstractMyDslScopeProvider { override getScope(EObject context, EReference reference) { if (reference == MyDslPackage.Literals.ENUM_USAGE__ENUM_ENTRY) { if (context instanceof EnumUsage) { return Scopes.scopeFor(context.enumEntity.entrys) } } super.getScope(context, reference) } } 

、私はあなたが例を提供することができます)scopeprovider =を変更していないどのようにそれができるようにそれを上書きして鳩にする? =) – ArchCC

+0

更新しました –

+0

ありがとうございます、しかし、それはMyDslPackage.Literals.ENUM_USAGE__ENUM_ENTRYである必要がありますか? – ArchCC