XText实体示例,基本类型

时间:2014-05-17 10:10:57

标签: 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]);

在这种情况下,编辑器会将IntegerString识别为关键字,但会将其标记为错误,并显示以下消息:

  

不匹配的输入'Integer'期待RULE_ID

我尝试使用此问题的解决方案: Defining Primitives within xtext Grammar, 因为原语没有被标记为错误,但没有内容帮助。

那么这样做的正确方法是什么?

1 个答案:

答案 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;