2016-12-02 4 views
0

Je souhaite créer un Dsl permettant de déclarer des tableaux et des structures. Je peux le faire avec cette grammaire:Xtext, Déclaration des types de tableau et de structure

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

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

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

AttributeValue: 
    SimpleValue | 
    Structure | 
    Array 
; 

Cependant, dans mon interprète, je ne peux pas comprendre le type de mes variables. ne peut pas faire quelque chose comme:

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

J'ai essayé avec cette grammaire:

SimpleValue: 
    {SimpleValue} 
    INT | STRING 
; 

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

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

AttributeValue : 
    SimpleValue | 
    Structure | 
    Array 
; 

mais il ne fonctionne pas. Dans la ligne

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

s.value est rouge "Type mismatch: cannot convert from AttributeValue to Array" erreur

Répondre

0

pourquoi ne pas vous attribuez les valeurs de tableau?

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

et faire quelque chose de similaire de structure à l'intérieur?

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

Votre problème est un pur problème Xtend et n'a rien à voir avec Xtext.

s.value est un appel getter. Même si le résultat du premier appel (dans le instanceof) est une instance de Array, le système de types ne peut pas garantir que le second appel (du côté droit de l'affectation) renverra également une instance Array.

La solution est d'extraire une variable locale:

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

Bien que la cession devient alors inutile.