2016-07-24 5 views
0

Ich versuche, neue Grammatik zu schreiben, und ich schrieb etwas wie Enum in Java, das für Var (ein Typ in meiner Grammatik) eine Reihe von vordefinierten Konstanten ermöglicht.Xtext Querverweis auf Konstanten von Enum

Ich möchte es die Konstanten, die zu diesem Var gehören zu erkennen, aber ich habe keinen Weg gefunden, wie es geht (obwohl ich versuche, das Buch zu lesen "Implementieren von domänenspezifischen Sprachen mit Xtext und Xtend", und viel im Internet gesucht)

Also machte ich ein kleines Beispiel auf der Domainmodel Grammatik:

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'; 

So ist das Beispiel:

Var {LEFT,RIGHT} move 

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

ich weiß, dass LEF T ist nicht VarDecl, es ist ID, aber ich weiß nicht, wie ich es anders machen soll. Was ich tun muss, damit LEFT wie etwas erkennen würde, das einschließt, sich zu bewegen?
Kommentar: in meiner echten Grammatik versuche ich tatsächlich zu bewegen == LEFT (boolescher Operator) und es ist nicht LEFT als Konstante der Bewegung zu erkennen (der gleiche Fehler erscheint).

Danke!

Antwort

0

ich bin nicht sicher, ob ich Sie bekommen, aber hier sind einige Hinweise

Zuerst kann man nur die Dinge verweisen, die Sie in der Grammatik erlauben

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';  

dann müssen Sie

über Namensgebung Pflege
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule { 

    override bindIQualifiedNameProvider() { 
     SimpleNameProvider 
    } 

} 

(abhängig von Ihrem Anwendungsfall können Sie stattdessen eine eigene Unterklasse von DefaultDeclarativeNameProvider verwenden

Bitte beachten Sie: Dies deckt Typsystem/Scoping/Validierung noch nicht ab

+0

Vielen Dank !!, Es hat funktioniert! – RoG