Lista xtext di elementi o di una sola voce
Domanda
Sto cercando di creare una grammatica che analizzare il seguente:
reference: java.util.String
, ma pure
reference: {java.util.String, java.lang.Integer}
In altre parole, lo voglio analizzare sia un elenco di nomi qualificati, ma anche solo un elemento (non segnata da '{' in questo caso).
Quello che ho cercato è questo:
Reference:
'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values+=QualifiedName);
Comunque, sto ottenendo un errore: manca '{' a 'Java', quando si utilizza la prima forma di riferimento (senza {). Qualche suggerimento quello che dovrei provare?
EDIT: provato anche
Reference:
'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | ((!'{')values+=QualifiedName);
ma ottenere un no valida alternativa all'ingresso '!' errori nella definizione della grammatica.
EDIT2: io non sto avendo problemi con il "elenco separato da virgole", ho provato questo separatamente e funziona bene. Il mio unico problema è distinguere tra le due parti della regola in base alla '{' carattere.
Soluzione
Questo farà il trucco:
Reference:
'reference' ':' (
'{' values+=QualifiedName (',' values+=QualifiedName)* '}'
| values+=QualifiedName
);
Si prega di ricordare i precedencies dei gruppi e delle alternative.
Altri suggerimenti
Sono abbastanza nuovo per xtext, quindi basta dargli una prova:
Reference:
'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values=QualifiedName);
o
Reference:
'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)+ '}') | (values=QualifiedName);