2016-07-24 39 views
0

我嘗試編寫新的語法,並且我在Java中編寫了類似Enum的東西,它使Var(我的語法中的一個類型)成爲一組預定義的常量。Xtext交叉引用枚舉的常量

我希望它能夠識別包含在這個Var中的常量,但我沒有找到辦法如何去做(雖然我嘗試閱讀「使用Xtext和Xtend實現特定於領域的語言」一書,並且在互聯網上搜索了很多)

所以我對語法的DomainModel了一個小例子:

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作爲移動常量(同樣的錯誤出現)。

謝謝!

回答

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