定义一个终端,它是 xtext 中 ID 的子集

define a terminal that is a subset of ID in xtext

我想创建一个可以与ID匹配但不完全匹配的终端。 ID 为

terminal ID         : '^'?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

我想定义的终端是

terminal TYPE: (('a'..'z'|'A'..'Z')?('a'..'z'|'A'..'Z'|'_'|'0'..'9')*)?

因为 TYPE 可以匹配 ID 我收到 RULE_ID 错误,在这种情况下我能做什么?

______EDIT__________

Domainmodel :
    (elements+=XType)*;

terminal TYPE: ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

MyID: 
    TYPE | ID
;

XType:
    DataType | Entity;

DataType:
    'datatype' name=MyID;

Entity:
    'entity' name=MyID ('extends' superType=[Entity])? '{'
        (features+=Feature)*
    '}';

Feature:
    (many?='many')? name=MyID ':' type=[XType];

模型(基于博客示例)

datatype String

entity Blog {
    title: String
    title2: String
    many posts: Post
    many Posts: Post
}

entity HasAuthor {
    author: String
}

entity Post extends HasAuthor {
    title: String
    content: String
    many comments: Comment
}

entity Comment extends HasAuthor {
    content: String
}

你可以引入数据类型规则

MyID: ID | TYPE;

以及 MyID 的值转换器,并在您使用 ID 的地方使用它

或者您忘记输入并在验证器中检查限制范围

Domainmodel :
    (elements+=XType)*;

terminal TYPE: ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

MyID: 
    TYPE | ID
;

XType:
    DataType | Entity;

DataType:
    'datatype' name=MyID;

Entity:
    'entity' name=MyID ('extends' superType=[Entity|MyID])? '{'
        (features+=Feature)*
    '}';

Feature:
    (many?='many')? name=MyID ':' type=[XType|MyID];