2016-04-21 42 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會允許小寫字母 –

相關問題