2016-12-02 88 views
0

我想做一個允許聲明數組和結構的Dsl。我可以用這個語法來做:Xtext,聲明數組和結構類型

Set: 
    'SET' '(' attribute=ID ',' value=AttributeValue ')'; 
SimpleValue: 
    INT | STRING; 

Structure: 
    '{' ID ':' AttributeValue (',' ID ':' AttributeValue)* '}'; 

Array: 
    '[' AttributeValue (',' AttributeValue)* ']' ; 

AttributeValue: 
    SimpleValue | 
    Structure | 
    Array 
; 

但是,在我的解釋器中,我無法確定我的變量的類型。不能這樣做:

if(s.value instanceof Array) {val Array array = s.value} 

我這個語法嘗試:

SimpleValue: 
    {SimpleValue} 
    INT | STRING 
; 

Structure: 
    '{' ID ':' var0=SimpleValue (',' ID ':' var1=SimpleValue)* '}' 
; 

Array: 
    '[' var0=SimpleValue(',' var1=SimpleValue)* ']' 
; 

AttributeValue : 
    SimpleValue | 
    Structure | 
    Array 
; 

,但它不工作。在線路

if(s.value instanceof Array) {val Array array = s.value} 

s.value是紅色「Type mismatch: cannot convert from AttributeValue to Array"錯誤

回答

0

你爲什麼不指定數組值?

Array: '[' values+=AttributeValue (',' values+=AttributeValue)* ']' ; 

,做類似的東西在裏面的結構?

Structure: '{' values+=StructureValue (',' values+=StructureValue)* '}'; 
StructureValue: name=ID ':' value=AttributeValue; 
0

你的問題是純粹的Xtend問題,無關緊要th Xtext。

s.value是一個getter調用。即使第一個呼叫的結果(在instanceof中)是Array的實例,類型系統也不能保證第二個呼叫(在分配的右側)也將返回Array實例。

的解決方案是,以提取一個局部變量:

val value = s.value 
if(value instanceof Array) {val Array array = value} 

雖然分配然後變得不必要。