XTEXT实体例如,原始类型(XText entity example, primitive typ

2019-10-30 10:50发布

我想要做的,是修改了一下基本的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由编辑为关键字的认可,但它们标记为错误,与消息:

不匹配输入“整数”期待RULE_ID

我试着用了这个问题的解决方案: 定义XTEXT语法中基元 ,其中一半是体面的,因为原语未标记为错误,但没有内容帮助他们。

那么,什么是该做的正确方法是什么?

Answer 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;


文章来源: XText entity example, primitive type
标签: xtext