Xtext analisar EMF modelo de interface
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.
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';