2016-12-02 13 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はゲッターコールです。最初の呼び出し(instanceof)の結果がArrayのインスタンスであっても、タイプシステムは、2番目の呼び出し(割り当ての右側)がArrayインスタンスも返すことを保証できません。割り当ては、その後不要となるが

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

溶液は、ローカル変数を抽出することです。