【问题标题】:Xtext, Declaring array and structure typesXtext,声明数组和结构类型
【发布时间】:2016-12-02 09:38:29
【问题描述】:

我想制作一个允许声明数组和结构的 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" 错误

【问题讨论】:

    标签: java dsl xtext xtend


    【解决方案1】:

    为什么不给数组赋值?

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      解决办法是提取一个局部变量:

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

      虽然这样分配就变得不必要了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        相关资源
        最近更新 更多