XText -Liste von Elementen oder nur ein Element
Frage
Ich versuche eine Grammatik zu erstellen, die Folgendes analysieren würde:
reference: java.util.String
Aber auch
reference: {java.util.String, java.lang.Integer}
Mit anderen Worten, ich möchte, dass es beide eine Liste qualifizierter Namen, aber auch nur ein Element analysiert (in diesem Fall nicht durch '{' 'gekennzeichnet ist).
Was ich ausprobiert habe, ist Folgendes:
Reference:
'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values+=QualifiedName);
Ich erhalte jedoch einen Fehler: fehlt '{' bei 'Java', wenn ich die erste Form der Referenz verwende (ohne {). Irgendwelche Vorschläge, was ich versuchen sollte?
Bearbeiten: Auch versucht
Reference:
'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | ((!'{')values+=QualifiedName);
Aber eine nicht tragfähige Alternative bei der Input '!' Fehler in der Grammatikdefinition.
Edit2: Ich habe keine Probleme mit der "Komma -getrennten Liste", ich habe es getrennt versucht und es funktioniert gut. Mein einziges Problem ist die Unterscheidung zwischen den beiden Teilen der Regel basierend auf dem '{' Zeichen.
Lösung
Dies wird den Trick machen:
Reference:
'reference' ':' (
'{' values+=QualifiedName (',' values+=QualifiedName)* '}'
| values+=QualifiedName
);
Bitte beachten Sie die Präzedenzfälle von Gruppen und Alternativen.
Andere Tipps
Ich bin ziemlich neu in Xtext, also probiere es nur aus:
Reference:
'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)* '}') | (values=QualifiedName);
oder
Reference:
'reference' ':' ('{' values+=QualifiedName (',' values+=QualifiedName)+ '}') | (values=QualifiedName);