XText实体示例,基本类型

XText实体示例,基本类型,xtext,Xtext,我想做的是,稍微修改一下基本的实体DSL示例,使其支持原语,类似的事情可以做到: entity Dog { name : String } entity Person { name : String dog : Dog } 这样,成员的类型既可以是对另一个实体名称的引用,也可以是预定义的原语。我也在寻找一种方法,因此在生成的编辑器中为原语和实体名称提供了内容帮助 这是我迄今为止的.xtext: Model: (entites+=Entity)*; 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
被编辑器识别为关键字,但它们被标记为错误,并显示以下消息:

输入“整数”不匹配,需要规则\u ID

我尝试使用此问题的解决方案: , 这有点像样,因为原语没有标记为错误,但没有内容辅助


那么正确的方法是什么呢?xxxx=[YYYYY]是一个交叉引用。这是对其他地方定义的东西的引用。在您的模型中,您没有原语类型的实例,因此您无法拥有它的实例。所以你必须明确地定义它们

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

或者必须想出一个完全不同的语法

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;

非常感谢,这正是我想要的。
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;