次の最小限の Peg.js 文法を定義しました。
start = "A1" / "A123"
サンドボックスで試すことができます。
「A1」と「A123」が一致すると予想していました (バックトラッキングの仕組みに関する私の考えによると)。しかし、そうではありません: 文法は "A1" を認識しますが、"A123" は認識しません。
注:関連する質問How to transform a simple grammar into something that works in PEG.js (expected "a" but "a" found) のように、「用語の順序を逆にする」というアドバイスは探していません。むしろ、私が見ている動作と、この場合に Peg.js のバックトラッキングが適用されない理由を理解しようとしています。用語の順序を逆にしても効果がない理由については、以下のより現実的な例を参照してください。
より現実的な例として、単位の解析を考えてみましょう。文法は、メートル法単位 (「m」、「mol」など) を、「mm」、「mmol」などのオプションの接頭辞とともに認識し、「yr」、「week」、または「mo」などの非メートル法単位も認識する必要があります。
次の Peg.js 文法は、「mo」を消費してつまずいてバックトラックしないため、「mol」を認識しません。(用語の順序を変更しても意味がありません。むしろ、「mol」または「mmol」を犠牲にして「mo」が認識されるようになります。)
start = nonmetric / metric / prefix metric
metric = "mol" / "l" / "m" / "g"
nonmetric = "yr" / "mo" / "week" / "day" / "hour"
prefix = "m" / "k" / "c"
私はAntlrで同様のことをうまくやることができます:
grammar units;
start : nonmetric | metric | prefix metric;
metric : 'mol' | 'l' | 'm' | 'g';
nonmetric : 'yr' | 'mo' | 'week' | 'day' | 'hour';
prefix : 'm' | 'k' | 'c';