Xtext,声明数组和结构类型

时间:2016-12-02 09:38:29

标签: java dsl xtext xtend

我想制作一个允许声明数组和结构的Dsl。我可以用这个语法来做到这一点:

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"错误

2 个答案:

答案 0 :(得分:0)

为什么不分配数组值?

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

并在内部结构做类似的事情?

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

答案 1 :(得分:0)

您的问题是纯Xtend问题,与Xtext无关。

s.value是一个吸气者电话。即使第一次调用的结果(在instanceof中)是Array的实例,类型系统也不能保证第二次调用(在赋值的右侧)也将返回Array个实例。

解决方案是提取局部变量:

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

虽然不需要分配。