Pergunta

Eu estou tentando analisar o modelo ecore.Se há uma interface ligada campo, eu não posso aceder a implementação de valores.

Xtext Gramática:

Map:
  type=MapCreate
  name=ID '='
  mapcontent+=MapBody (',' mapcontent+=MapBody)* ';';

  MapCreate:
  'Map' '<' keyType=MapKeyDataType ',' valueType=MapValueType '>';

MapKeyDataType:
  'String' | 'int';

MapValueType:
  MapKeyDataType | 'float' | MapCreate;

exemplo de implementação:

Map<int, String> ma = {0="a", 5="b"};

Análise keyType campo funciona bem, mas como fazer o mesmo com valueType?É sempre nulo.

Foi útil?

Solução

Sua gramática é falso.Essencialmente, você tenta fazer as instâncias de seu Map ser um super-tipo de instâncias de String.Que nunca vai trabalhar e Xtext provavelmente vai mostrar alguns avisos para que a gramática.

O que acontece é basicamente o seguinte:

Você definir uma regra MapKeyDataType como uma regra de tipo de dados (consulte a documentação para obter detalhes).Que é, seu tipo de retorno é String.

Também pode definir uma regra de MapValueType que os delegados para MapKeyDataType.Isto implica que o tipo de retorno tem de ser atribuição compatível (um tipo super) do tipo de retorno do MapKeyDataType.Ele teria que ser um String ou um de seus super tipos, por exemplo, Object.Agora você também delegado da MapValueType para MapCreate. MapCreate por sua vez, não produz uma simples cadeia de caracteres, mas instâncias de MapCreate.O seu MapCreate e Java String geralmente não atribuição compatível.A inferência de tipo de Xtext agora faz MapKeyDataType não mais retornando Cadeia de caracteres, mas declara o tipo de retorno MapKeyDataType em vez disso.Não haverá quaisquer instâncias, pois eles nunca são instanciados:o analisador de regra não têm qualquer atribuições.Por isso, sua gramática, provoca problemas no seu lado.

Algo como isso poderia limpá um pouco:

Map:
  type = MapType name=ID '=' ...;
MapType:
  {MapType} name='Map' '<' keyType=PlainType ',' valueType=ValueType '>';
PlainType returns Type:
  name = 'String' | name='int';
ValueType returns Type:
  MapType | PlainType | ValuePlainType;
ValuePlainType returns Type:
  name='float';
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top