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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top