2016-10-18 6 views
0

У меня есть xtext-грамматика для языка моделирования, который имеет несколько типов переменных. В некоторых случаях я хочу выделить тип, который может иметь переменная. Текущий рабочий процесс состоит в том, чтобы просто использовать VariableQualifier (как в приведенной ниже грамматике) и использовать валидатор для разрешения только того типа, который я хочу. Затем каждый раз, когда я обращаюсь к ссылке, я должен явно ее использовать.Спецификатор переменной xtext typesafe

Есть ли лучшее решение?

VariableReference: 
    ref=[Variable] 
; 
VariableQualifier: 
    (namespace+=NamespaceReference '.')* element=VariableReference 
; 
EnumerationReference: 
    ref=[Enumeration] 
; 
EnumerationQualifier: 
    (namespace+=NamespaceReference '.')* element=EnumerationReference 
; 
NamespaceReference: 
    ref=[Namespace] 
; 

ответ

0

Один общий шаблон для такого рода проблемы имеют одну общую ссылку синтаксически, что указывает на абстрактный тип супер для всех возможных целей (общий супер тип переменной | перечисления | пространство имен).

т.д .:

VariableReference: 
    ref=[AbstractElement] ({VariableReference.parent=current} '.' ref=[AbstractElement])*; 

отметить также, что моделирование и ссылки пространств имен часто на самом деле не нужны. Вместо этого вы можете использовать полностью квалифицированные имена вещей.

E.g.

VariableReference: 
    ref=[AbstractElement|QualifiedName]