Non hai mai bisogno del CNF. Ha lo svantaggio di cambiare la struttura grammaticale. Ma è necessario introdurre non terminali intermedi in modo che nessun lato destro sia più lungo di 2 (2 moduli) poiché la lunghezza RHS determina la complessità. Il miglior tentativo di spiegare che intuitivamente è, se la memoria serve, un articolo di Beau Shiel, "Observations on Context Free Parsing", pubblicato nel 1976 in una conferenza linguistica computazionale. L'algoritmo di Earley utilizza implicitamente la forma 2. È appena nascosto nell'algoritmo. Per quanto riguarda il recupero e la gestione della foresta di analisi, è necessario esaminare il Web "analisi della foresta di intersezione". In realtà è molto semplice. Molti articoli sono sul Web, se si ottengono (da citazioni o tabelle di contenuti) i titoli o gli autori per cercarli direttamente.
In realtà, puoi fare molto di più rispetto a CF e ottenere ancora foreste di analisi in tempi polinomiali. La domanda è, a volte: cosa puoi farci una volta che l'hai?
Uno scopo dell'ultimo articolo che menzioni è mostrare che algoritmi complessi (come GLR) non necessariamente acquistano nulla nel tempo o nello spazio e possono cambiare la tua foresta di analisi.
Un'osservazione sull'insegnamento. Penso che Earley, per così dire, sia troppo complicato per l'insegnamento e potrebbe essere sostituito da algoritmi più semplici con essenzialmente lo stesso contenuto educativo. L'insegnamento riguarda concetti o tecnologia. Nell'algoritmo di Earley, i concetti essenziali sono nascosti nella complessità dei dettagli e da un punto di vista tecnologico è obsoleto. Era un ottimo documento, ma non significa che sia il miglior approccio pedagogico.
Ci possono essere più informazioni nella letteratura linguistica computazionale che nei normali canali di informatica. Non ho il libro Ceriel-Grune-Jacobs, ma sarei sorpreso se non avessero tutti i riferimenti adeguati (anche se non sono sicuro dei loro criteri di selezione).
Complemento a seguito di una richiesta in un commento (7 luglio 2013)
Questo complemento riguarda l'esistenza di algoritmi più semplici di quelli di Earley.
Come ho detto, la ricerca sul Web in "analisi della foresta di intersezione" dovrebbe fornire rapidamente riferimenti, dai quali è possibile approfondire ulteriormente.
L'idea di base è che tutti i percorsi che analizzano la costruzione di una foresta condivisa non sono altro che la vecchia costruzione dell'intersezione di Bar Hillel, Perles e Shamir per un linguaggio regolare e un linguaggio privo di contesto, usando un automa finito e una grammatica senza contesto. Data la grammatica CF, applichi la costruzione a un automa banale che riconosce solo la tua stringa di input. Questo è tutto. La foresta condivisa è solo la grammatica dell'intersezione. È correlato alla grammatica originale attraverso un omomorfismo, riconosce solo la stringa data, ma con tutti gli alberi di analisi della grammatica originale fino a quell'omomorfismo (cioè la semplice ridenominazione dei non terminali).
La grammatica risultante contiene molte cose inutili, non terminali e regole, che non sono raggiungibili dall'assioma (non si trovano in una stringa derivata dal simbolo iniziale) o che non sono produttive (non possono essere derivate in un terminale stringa).
Quindi, o devi pulirlo con un buon pennello alla fine (possibilmente lungo ma algoriticamente semplice), oppure puoi provare a migliorare la costruzione in modo che ci sia meno lanugine inutile da spazzolare alla fine.
Ad esempio, la costruzione CYK è esattamente questo, ma organizzata in modo tale che tutte le regole e i non terminali creati siano produttivi, sebbene molti possano essere irraggiungibili. Questo è prevedibile da una tecnica dal basso verso l'alto.
Le tecniche top-down (come quelle basate su LR (k)) eviteranno regole e non terminali irraggiungibili, ma creeranno quelle non produttive.
Gran parte della spazzolatura può effettivamente essere raggiunta con un uso adeguato dei puntatori, penso, ma non lo guardo da molto tempo.
Tutti gli algoritmi esistenti seguono essenzialmente quel modello. Questo è davvero il nocciolo della questione ed è molto semplice. Allora perché seppellirlo nella complessità?
Molte "ottimizzazioni" sono proposte nella letteratura spesso basate sulla famiglia di costruzioni parser LR (k), LL (k), possibilmente con un factoring statico di queste costruzioni (Earley non ha factoring statico). Potrebbe effettivamente essere applicato a tutte le tecniche conosciute, inclusi i precedenti parser precedenti. Metto "ottimizzazione" tra virgolette perché di solito non chiarisce cosa stai ottimizzando, o anche se lo stai effettivamente ottimizzando, o se il vantaggio del miglioramento valga la complessità aggiunta del tuo parser. Su questo troverai pochi dati oggettivi, formali o sperimentali (ce ne sono alcuni), ma molte altre affermazioni. Non sto dicendo che non c'è nulla di interessante. Ci sono alcune idee intelligenti.
Ora, una volta che conosci l'idea di base, le "ottimizzazioni" o miglioramenti possono spesso essere introdotte staticamente (possibilmente in modo incrementale) costruendo un automa push-down dalla grammatica, seguendo il tipo di tecnica di costruzione del parser che ti interessa e quindi applicando la costruzione del prodotto incrociato per l'intersezione con quell'automa (quasi la stessa cosa che per fare con la grammatica) o con una grammatica derivata da quell'automa.
Quindi puoi introdurre campane e fischietti, ma si tratta principalmente di dettagli tecnologici.
Secondo quanto riferito, la Philosophiæ Naturalis Principia Mathematica di Isaac Newton è un grande pezzo di fisica e matematica. Non penso che sia nell'elenco di lettura di molti studenti. A parità di altre condizioni, non credo sia molto utile insegnare l'algoritmo di Earley, sebbene sia un pezzo storico importante. Gli studenti hanno abbastanza da imparare così com'è. A rischio di essere abbattuto da molte persone, penso lo stesso per il documento Knuth LR (k). È un superbo pezzo di analisi teorica e probabilmente una lettura importante per un teorico. Dubito fortemente che sia così essenziale per la costruzione di parser dato lo stato attuale della tecnologia, sia hardware che software. Sono passati i tempi in cui l'analisi era una parte significativa del tempo di compilazione, o quando la velocità dei compilatori era un problema critico (conoscevo una società che morì per i costi di compilazione circa 30 anni fa). Lo specialista di analisi potrebbe voler apprendere tale conoscenza specializzata ad un certo punto, ma lo studente medio in informatica, programmazione o ingegneria non ne ha bisogno.
Se gli studenti devono dedicare più tempo all'analisi, ci sono altre estensioni che potrebbero essere più utili e più formative, come quelle utilizzate nella linguistica computazionale. Il primo ruolo dell'insegnamento è quello di estrarre le idee semplici che strutturano le conoscenze scientifiche, non costringere gli studenti a soffrire di ciò che gli scienziati ricercatori dovevano soffrire (esclusi gli studenti di dottorato: è un rito di passaggio :-).
Licenza CC BY-SA 3.0 dall'autore