Ich habe die folgende minimale Peg.js Grammatik definiert:Wie funktioniert Backtracking in peg.js (mit Beispiel)?
start = "A1"/"A123"
, die Sie in the sandbox versuchen.
Ich hätte erwartet, "A1" sowie "A123" (nach meiner Vorstellung, wie Backtracking funktioniert) zu entsprechen. Aber das ist nicht der Fall: Die Grammatik erkennt "A1", aber nicht "A123".
Hinweis: Ich bin nicht auf der Suche nach dem Rat "umkehren Sie die Reihenfolge Ihrer Begriffe" wie in der verwandten Frage How to transform a simple grammar into something which works in PEG.js (expected "a" but "a" found). Ich versuche vielmehr, das Verhalten, das ich sehe, zu verstehen, und warum Peg.js 'Backtracking in diesem Fall nicht anwendbar ist. Für eine Erklärung, warum die Umkehrung der Reihenfolge meiner Begriffe nicht hilft, siehe das realistischere Beispiel unten.
Um ein realistischeres Beispiel zu erhalten, betrachten Sie Einheitenparsing. Eine Grammatik sollte metrische Einheiten (wie "m", "mol") mit optionalen Präfixen wie "mm", "mmol", sowie nichtmetrischen Einheiten wie "Jahr", "Woche" oder "Mo" erkennen.
Die folgende Peg.js-Grammatik wird "mol" nicht erkennen, weil sie "mo" austrickst und nicht zurückgeht. (Änderung der Reihenfolge der Begriffe hilft nicht, oder vielmehr bewirkt „mo“ auf Kosten der „mol“ erkannt werden oder „mmol“.)
start = nonmetric/metric/prefix metric
metric = "mol"/"l"/"m"/"g"
nonmetric = "yr"/"mo"/"week"/"day"/"hour"
prefix = "m"/"k"/"c"
Ich kann tun, um die analoge Sache in Antlr mit gutem Erfolg:
grammar units;
start : nonmetric | metric | prefix metric;
metric : 'mol' | 'l' | 'm' | 'g';
nonmetric : 'yr' | 'mo' | 'week' | 'day' | 'hour';
prefix : 'm' | 'k' | 'c';
Danke für die netten Beispiele zu diesem Problem, wenn man versucht, Peg.js von Antlr zu lernen. Es half mir wirklich zu verstehen, was zur Hölle mit meiner Grammatik falsch war. – Mitja