ho definito il seguente minimo Peg.js grammatica:Come funziona il backtracking in peg.js (con esempio)?
start = "A1"/"A123"
che si può provare in the sandbox.
Mi sarei aspettato che corrispondesse "A1" e "A123" (secondo la mia idea di come funziona il backtracking). Ma non è questo il caso: la grammatica riconosce "A1" ma non "A123".
Nota: Non sto cercando per il consiglio "invertire l'ordine dei termini", come nel relativo domanda How to transform a simple grammar into something which works in PEG.js (expected "a" but "a" found). Piuttosto, sto cercando di capire il comportamento che sto vedendo e perché il backtracking di Peg.js non si applica in questo caso. Per una spiegazione del motivo per cui l'inversione dell'ordine dei miei termini non aiuta, vedi l'esempio più realistico di seguito.
Per un esempio più realistico, considerano le unità parsing. Una grammatica dovrebbe riconoscere le unità metriche (come "m", "mol") con prefissi facoltativi, come "mm", "mmol", così come le unità non metriche come "yr", "settimana" o "mo".
La seguente grammatica Peg.js non riconoscerà "mol" perché viene interrotta consumando "mo" e non torna indietro. (Cambiare l'ordine dei termini non aiuta, anzi, farà sì che "mo" di essere riconosciuto a scapito di "mol" o "mmol".)
start = nonmetric/metric/prefix metric
metric = "mol"/"l"/"m"/"g"
nonmetric = "yr"/"mo"/"week"/"day"/"hour"
prefix = "m"/"k"/"c"
posso fare la cosa analoga in Antlr con buon successo:
grammar units;
start : nonmetric | metric | prefix metric;
metric : 'mol' | 'l' | 'm' | 'g';
nonmetric : 'yr' | 'mo' | 'week' | 'day' | 'hour';
prefix : 'm' | 'k' | 'c';
Grazie per i begli esempi a questo problema quando si cerca di imparare Peg.js proveniente da Antlr. Mi ha davvero aiutato a capire cosa diavolo non andava nella mia grammatica. – Mitja