Domanda

Sto cercando di analizzare il modello Ecore.Se c'è un campo collegato all'interfaccia, non posso accedere ai valori di implementazione.

xtext grammatic:

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

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

MapKeyDataType:
  'String' | 'int';

MapValueType:
  MapKeyDataType | 'float' | MapCreate;
.

Implementazione del campione:

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


.

Parsing Il campo keyType funziona bene, ma come fare lo stesso con valueType?È sempre nullo.

È stato utile?

Soluzione

La tua grammatica è falsa. Essenzialmente si tenta di effettuare istanze del tuo Map essere un super-tipo di istanze di String. Questo non funzionerà mai e XTEXT probabilmente mostrerà alcuni avvertimenti per quella grammatica.

Cosa succede è fondamentalmente quanto segue:

Si definisce una regola MapKeyDataType come regola del tipo di dati (fare riferimento ai documenti per i dettagli). Cioè, il suo tipo di ritorno è String.

Inoltre si definisce una regola MapValueType che delega a MapKeyDataType. Ciò implica che il tipo di ritorno deve essere compatibile con la compatibilità (un tipo super) del tipo di ritorno di MapKeyDataType. Dovrebbe essere un String o uno dei suoi super tipi, ad es. Object. Ora si delega anche da MapValueType a MapCreate. MapCreate a Turn non produce una stringa semplice ma istanze di MapCreate. Il MapCreate e il String di Java non sono generalmente compatibili con l'assegnazione. L'inferenza del tipo di XTEXT ora rende MapKeyDataType non restituire più la stringa ma dichiara invece il tipo di ritorno MapKeyDataType. Non ci saranno istanze, però, poiché non vengono mai istanziati: la regola del parser non ha alcun incarico. Ecco perché la tua grammatica causa problemi sul tuo fianco.

Qualcosa come questo potrebbe pulirlo un po ':

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';
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top