Ich versuche zu verstehen, welche Alternativen in ANTLR Regeln bevorzugen, wenn mehrere übereinstimmen. Gemäß this answer sind Alternativen in Lexer-Regeln ungeordnet, außer wenn nach einem nicht-gierigen Muster (*?
, +?
, ??
). Zum Beispiel diese Grammatik:ANTLR: Muster Gier und alternative Reihenfolge
lexer grammar Test;
X : 'z'*? (FOO | FOOBAR);
fragment FOO: 'foo';
BAR: 'bar';
fragment FOOBAR: 'foobar';
gegebene Eingabe "foobar" entspricht zwei Token: X
"foo" und BAR
"bar", weil Alternativen in X
geordnet. Wenn wir 'z'*?
entfernen oder es sogar in einen gierigen 'z'*
ändern, werden Alternativen wieder ungeordnet und das einzige übereinstimmende Token ist X
"foobar".
Allerdings, wenn ich die Regeln Parser Regeln ändern:
grammar Test;
x : 'z'*? (foo | foobar);
foo: 'foo';
bar: 'bar';
foobar: 'foobar';
greediness auf 'z'
scheinen gar nicht Materie. Gegeben Eingang „foobar“, Regel x
folgt die zweite Alternative und verbraucht den gesamten Eingang, Baum produzierte (x (foobar "foobar"))
Die Frage ist: gibt es eine definitive Dokumentation, wie Lexer und Parser Regeln Eingang verbrauchen und welche Spiele sie bevorzugen, wenn mehrere Sind möglich?