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;