我想制作一个允许声明数组和结构的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"
错误
答案 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}
虽然不需要分配。