Domanda

Sono nuovo al mondo dei compilatori, e di recente ho sentito parlare di una cosa chiamata generatore di parser. Da quello che ho (credo) ho capito, generatori di parser prendono in un file di sintassi e di output un file di codice sorgente in grado di analizzare i file con la sintassi data.

Alcune domande:

  1. Ho capito che correttamente?

  2. Se è così, è Ragel un tale strumento?

  3. Se lo è, può Ragel uscita un parser D in codice sorgente D?

Grazie!

È stato utile?

Soluzione

  1. Questo è fondamentalmente esso. generatori di parser trasformano una grammatica in un file di origine che può essere utilizzato per riconoscere le stringhe che sono membri del lingua definito dalla grammatica. Spesso, ma non sempre, un generatore di parser richiede un analizzatore lessicale per rompere il testo verso il basso in token prima che fa il suo lavoro. Lex e Yacc sono classici esempi di un generatore di analizzatore lessicale e parser abbinato.

    I moderni generatori di parser offrono funzionalità aggiuntive. Per esempio, ANTLR può generare il codice per l'analisi lessicale, analisi grammaticale, e anche a piedi l'albero di sintassi astratta generata. Elkhound genera un parser che utilizza il GLR analisi algoritmo. Questo gli permette di riconoscere una più ampia gamma di linguaggi di algoritmi di analisi non generalizzate. PEG Parser non richiedono un analizzatore lessicale separata.

  2. Ragel effettivamente genera un analizzatore lessicale nella forma di una macchina a stati finiti. Si può riconoscere un linguaggio regolare ma non un lingua context-free. Ciò significa che non in grado di riconoscere la maggior parte dei linguaggi di programmazione, tra cui D.

  3. Ragel fa generare il codice D se avete bisogno di un analizzatore lessicale veloce.

Per comprendere appieno ciò che un generatore di parser fa per voi, avrete bisogno di un po 'di linguaggio formale e la teoria di analisi. Ci sono posti peggiori per iniziare rispetto alla The Dragon Libro . Vedi anche:. Imparare a scrivere un compilatore

Se vi sentite coraggiosi, essere sicuri di controllare le lexing e il codice di analisi distribuita con il compilatore DMD - / dmd2 / src / DMD / -. Lexer.c e parse.c

Altri suggerimenti

Mentre Ragel è basata sulle espressioni regolari, non è solo un generatore di FSM regex. Permette ricorsione utilizzando una sintassi di chiamata / rendimento aggiuntivo, così come altre caratteristiche che permettono l'analisi di lingue non regolari. Così, mentre Ragel non genera FSM, permette generando più FSM diversi e fornisce i meccanismi per la commutazione fra loro in punti arbitrari, o utilizzando una speciale sintassi transizione della macchina. Esso consente inoltre di eseguire codice arbitrario a transizioni di stato.

Un'altra cosa che rende Ragel unico è che è in linea. In altre parole, è facile da usare per i dati di scansione da una fonte asincrono, come un socket non bloccante. Utilizza anche senza risorse dinamiche, salvo che per la chiamata / ritorno è possibile utilizzare sia statica, automatica, o la memoria dinamica per lo stack; Comunque tu voglia. Non c'è stato globale, sia.

Ragel è abbastanza unica. Diversamente dalla maggior parte (tutti?) Generatori tradizionali, è stato fatto per la programmazione di rete.

Potrebbe essere:

MySourceCode -> (Scanner) -> MyScannerDataFile MyScannerDataFile -> (Parser) -> MyParserDataFile MyParserDataFile -> (CodeGenerator) -> MyExecutableFile

o

MySourceCode -> (ScannerAndParser) -> MyScannerAndParserDataFile MyScannerAndParserDataFile -> (CodeGenerator) -> MyExecutableFile

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