Interfaccia modello XTEXT Parse EMF
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.
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';
.