2016-07-24 3 views
0

Я пытаюсь написать новую грамматику, и я написал что-то вроде Enum в Java, что позволяет Var (тип в моей грамматике) быть набором предопределенных констант.Перекрестная ссылка Xtext на константы Enum

Я хочу, чтобы он распознавал константы, которые относятся к этому 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, это идентификатор, но я не знаю, как это сделать. Что мне нужно сделать, чтобы LEFT распознавался как нечто, что можно было бы переместить?
комментарий: в моей реальной грамматике я действительно пытаюсь сделать move == 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 вместо

обратите внимание: это не распространяется на типы system/scoping/validation

+0

Спасибо большое !, Это сработало! – RoG