Пример объекта XText, примитивный тип

Что я пытаюсь сделать, так это немного изменить базовый пример entity DSL, чтобы он поддерживал примитивы, и можно сделать что-то вроде этого:

entity Dog {
   name : String
}

entity Person {
   name : String
   dog : Dog
}

Так что тип членов может быть либо ссылкой на имя другого объекта, либо предопределенным примитивом. Я также ищу способ, поэтому в сгенерированном редакторе есть помощь по содержимому как для примитивов, так и для имен сущностей.

Вот мой .xtext на данный момент:

Model:
    (entites+=Entity)*;

Entity:
    'entity' name=ID '{'
    (members+=Member)*
    '}';

AbstractType:
    Entity | PrimitiveType;

PrimitiveType:
    name='Integer' | name='String';

Member:
    (many?='many')? name=ID ':' (type=[AbstractType]);

В этом случае Integer и String распознаются редактором как ключевые слова, но помечаются как ошибочные с сообщением:

несоответствующий ввод "Целое число", ожидающий RULE_ID

Я попытался использовать решение для этого вопроса: Определение примитивов в xtext Grammar , что было наполовину -прилично, потому что примитивы не были помечены как ошибочные, но для них не было помощи по содержимому.

Так как же правильно это сделать?


person Balázs Édes    schedule 17.05.2014    source источник


Ответы (1)


xxxx=[YYYYY] является перекрестной ссылкой. это ссылка на что-то, что определено где-то еще. в вашей модели у вас нет экземпляра PrimitiveType, поэтому у вас не может быть его экземпляра. поэтому вы должны определить их явно

Model:
(primitives+= PrimitiveType)*;
PrimitiveType:
'datatype' (name='Integer' | name='String');

модель

datatype String
datatype Integer
entity Dog {
    name : String
}

entity Person {
   name : String
   dog : Dog
}

или придется придумывать совершенно другую грамматику

Model:
    (entites+=Entity)*;

Entity:
    'entity' name=ID '{'
    (members+=Member)*
    '}';

Type:
    EntityRefence | SimpleDataType;

EntityRefence:
    entity=[Entity]
;

SimpleDataType:
    type=PrimitiveType
;


enum PrimitiveType:
    String | Integer
;

Member:
    (many?='many')? name=ID ':' type=Type;
person Christian Dietrich    schedule 17.05.2014
comment
Большое спасибо, это было именно то, что я искал. - person Balázs Édes; 17.05.2014