2016-04-21 41 views
1

我想创建一个可以与ID匹配但不完全的终端。 虽然ID是定义一个终端,它是xtext中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')*)? 

,因为类型可以匹配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 
} 

回答

1

您可以引入一个数据类型规则

MyID: ID | TYPE; 

而对于身份识别码值转换器,并使用在您使用的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]; 
+0

我不知道你是什么意思或忘记类型和验证 – Quantico

+0

内禁区范围做检查只需要一个终端ULE叫统一了您的类型和ID号,然后做了限制我验证您为ID分配的属性或具有数据类型规则TYPE:带有IValueConverter的ID在错误输入中抛出ValueConverterExceptions –

+0

查看验证器xtext预生成它具有一个用大写字母开头的规则,尽管ID会允许小写字母 –

相关问题