我正在尝试做的是修改基本的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
识别为关键字,但会将其标记为错误,并显示以下消息:
不匹配的输入'Integer'期待RULE_ID
我尝试使用此问题的解决方案: Defining Primitives within xtext Grammar, 因为原语没有被标记为错误,但没有内容帮助。
那么这样做的正确方法是什么?
答案 0 :(得分: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;