2016-12-02 107 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} 

虽然分配然后变得不必要。