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.

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top