Questo a causa della trasparenza referenziale. Così come nessuna funzione può dire la differenza tra
let x = 1:x
let x = 1:1:1:x
let x = 1:1:1:1:1:1:1:1:1:... -- if this were writeable
nessuna funzione può dire la differenza tra una grammatica, che è un grafico finito e una grammatica, che è un albero infinito. Gli algoritmi di analisi bottom-up devono essere in grado di vedere la grammatica come un grafico, al fine di enumerare tutti i possibili stati di analisi.
Il fatto che i parser top-down vedano il loro input come alberi infiniti consente loro di essere più potenti, dal momento che l'albero potrebbe essere computazionalmente più complesso di qualsiasi grafico; per esempio,
numSequence n = string (show n) *> option() (numSequence (n+1))
accetta qualsiasi sequenza ascendente finito di numeri da n
. Questo ha infiniti diversi stati di parsing. (Potrebbe essere possibile rappresentare in un modo context-free, ma sarebbe difficile e richiede una maggiore comprensione del codice di una libreria di analisi è in grado di, credo)
Un basso verso l'alto biblioteca combinatore poteva essere scritta, anche se è un po 'brutto, richiedendo tutti parser per essere "etichettato" in modo tale che
- la stessa etichetta si riferisce sempre alla stessa parser e
- c'è solo un insieme finito di etichette
a quel punto inizia ad assomigliare molto più ad una specifica tradizionale di una grammatica che ad una specifica combinatoria. Tuttavia, potrebbe essere ancora bello; dovresti solo etichettare produzioni ricorsive, che escluderebbero regole infinitamente grandi come numSequence
.