Domanda

Come ricorsiva salita parser lavoro?Ho scritto un ricorsiva discesa parser me, ma non capisco LR parser tutti che bene.Quello Che Ho trovato su Wikipedia ha solo aumentato la mia confusione.

Un'altra domanda è: perché ricorsiva salita parser non vengono utilizzati più di loro tavolo-based.Sembra che ricorsive salita parser avere una maggiore performance in generale.

È stato utile?

Soluzione

Il clasical drago libro spiega molto bene come LR parser lavoro. C'è anche tecniche di parsing. Una guida pratica. dove si può leggere su di loro, se ricordo bene. L'articolo di Wikipedia (almeno l'introduzione) non è giusto. Sono stati creati da Donald Knuth, e li spiega nel suo The Art of Computer Programming Volume 5. Se si capisce lo spagnolo, c'è una lista completa dei libri qui postato da me. Non tutto ciò che i libri sono in spagnolo, sia.

Prima di capire come funzionano, è necessario comprendere alcuni concetti come primo, segue e lookahead. Inoltre, ho davvero vi consiglio di comprendere i concetti alla base LL (discendente) parser prima di cercare di capire LR parser (ascendenti).

Ci sono una famiglia di parser LR, specialmente LR (K), SLR (K) e LALR (K), dove K è il numero di lookahead hanno bisogno di lavorare. Yacc supporta LALR (1) parser, ma si può fare ritocchi, non teoria basata, per renderlo lavora con più potente tipo di grammatiche.

A proposito di prestazioni, dipende dalla grammatica in fase di analisi. Eseguono in tempo lineare, ma quanti lo spazio di cui hanno bisogno dipende da quanti stati si fa a costruire per il parser finale.

Altri suggerimenti

Sono personalmente avendo un momento difficile capire come una chiamata di funzione può essere più veloce - molto meno "significativamente più veloce" di una tabella di ricerca. E ho il sospetto che anche "significativamente più veloce" è insignificante in confronto a tutto il resto che un lexer / parser ha a che fare (in primo luogo la lettura e la creazione di token del file). Ho guardato la pagina di Wikipedia, ma non ho seguito i riferimenti; ha l'autore in realtà di un profilo completo lexer / parser?

Più interessante per me è il declino della Tabella-driven parser rispetto alla discesa ricorsiva. Io vengo da un background C, dove yacc (o equivalente) è stato il generatore di parser di scelta. Quando mi sono trasferito a Java, ho trovato un'implementazione tavolo-driven (JavaCup), e diverse implementazioni ricorsivo discesa (JavaCC, ANTLR).

Ho il sospetto che la risposta è simile alla risposta di "perché Java invece di C": velocità di esecuzione non è importante quanto la velocità di sviluppo. Come indicato nella voce di Wikipedia, Tabella-driven parser sono praticamente impossibili da comprendere dal codice (indietro quando stavo usando loro, ho potuto seguire le loro azioni, ma sarei mai stata in grado di ricostruire la grammatica del parser). discesa ricorsiva, in confronto, è molto intuitivo (che è senza dubbio il motivo per cui è anteriore guidata da tabella da circa 20 anni).

L'articolo di Wikipedia su ricorsiva salita l'analisi di riferimenti a quello che sembra essere la carta originale sull'argomento ("Molto Veloce LR Analisi").Scrematura che la carta chiarito alcune cose per me.Cose che ho notato:

  1. La carta parla di generazione di codice assembly.Mi chiedo se si può fare le stesse cose che si fanno se si sta generando C o codice Java invece;vedere sezioni 4 e 5, Errore di "recupero" e "Stack overflow controllo".(Non sto cercando di FUD la loro tecnica è forse bene -- solo dicendo che è qualcosa che si potrebbe desiderare di guardare in prima di commettere.)

  2. Mettono a confronto i loro ricorsiva salita strumento al proprio tavolo-driven parser.Dalla descrizione nella loro sezione risultati, sembra che il loro tavolo-driven parser è "interpretato";non richiede alcuna personalizzato codice generato.Mi chiedo se c'è una terra di mezzo dove la struttura complessiva è ancora table-driven, ma si genera codice personalizzato per alcune azioni per accelerare le cose.

La carta a cui fa riferimento la pagina di Wikipedia:

Un altro articolo sull'utilizzo di generazione del codice, invece di tabella-interpretazione:

Si noti, inoltre, che recursive-discesa di analisi non è il modo più veloce per analizzare LL-la grammatica i linguaggi basati su:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top