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