2009-12-17 11 views
16

Per concetto/funzione/implementazione, quali sono le differenze tra compilatori e parser?Differenza tra compilatori e parser?

+16

Qual è la differenza tra un frigorifero e un compressore. – Nifle

+6

Il frigorifero fa un uso pesante del compressore per fare il suo lavoro ma un compressore non è affatto un frigorifero. Compilatore sostitutivo per refigirator e parser per compressore. – Nifle

+1

Bella analogia, Nifle :-) – Joey

risposta

37

Un compilatore è spesso costituito da diversi componenti, uno dei quali è un parser. Un insieme comune di componenti in un compilatore è:

  • Lexer - rompi il programma in parole.
  • Parser - controlla che la sintassi delle frasi sia corretta.
  • Analisi semantica: controlla che le frasi abbiano un senso.
  • Ottimizzatore - modifica le frasi per brevità.
  • Generatore di codice: genera qualcosa con un significato semantico equivalente utilizzando un altro vocabolario.
    Per aggiungere un po ':

Come accennato altrove, piccolo C è un compilatore decente ricorsivo che il codice generato come è analizzato. Analisi sostanzialmente sintattica, analisi semantica e generazione di codice in un unico passaggio. Come ricordo, ha anche lessato il parser.

Molto tempo fa, ho scritto un compilatore C (in realtà diversi: la famiglia Introl-C per microcontrollori) che utilizzava la sintassi ricorsiva, eseguiva la sintassi e il controllo semantico durante l'analisi e produceva una rappresentazione ad albero del programma da cui codice è stato generato.

Oggi sto lavorando a un compiler che fa codice sorgente -> token -> AST -> IR ->, praticamente come descritto sopra.

+1

+1 per annotare le diverse parti e menzionare anche come si relazionano al testo (anche se per un teorico informatico un programma completo sarebbe una parola singola :-)). – Joey

+1

Un parser dovrebbe verificare se la sintassi delle frasi sia corretta, comunque. E il lexer potrebbe già guardare in un dizionario per vedere se le parole sono truccate o sono effettivamente parole corrette da usare. Ma questo compito è un po 'confuso tra i lexer e parser, però. – Joey

+0

Il parser non controlla solo la sintassi, ma il controllo della sintassi è più un sottoprodotto della costruzione di una rappresentazione astratta, non è vero? –

1

Un parser legge semplicemente un testo in una rappresentazione interna, più astratta, spesso un albero o un grafico di qualche tipo.

Un compilatore traduce tale rappresentazione interna in un altro formato. Molto spesso questo significa convertire il codice sorgente in programmi eseguibili. Ma l'obiettivo non deve essere un codice macchina. Può essere anche un altro linguaggio di programmazione; il compilatore sarebbe ancora un compilatore. Ovviamente un compilatore ha bisogno di un parser per leggerne effettivamente l'input.

3

Il compilatore ha sempre un parser all'interno. Parser elabora solo il linguaggio e restituisce la rappresentazione ad albero di esso, il compilatore genera qualcosa da quell'albero, i codici macchina attuali o un'altra lingua.

-2

Un compilatore è un tipo speciale di programma per computer che converte un file di testo leggibile in un formato che il computer può facilmente comprendere. Al suo livello più elementare, un computer può solo capire due cose, una 1 e una 0. A questo livello, un umano opererà molto lentamente e troverà incomprensibili le informazioni contenute nella lunga serie di 1 e 0. Un compilatore è un programma per computer che colma questa lacuna.

Un parser è un software che valuta la sintassi di uno script quando viene eseguito su un server Web. Per i linguaggi di scripting utilizzati sul Web, il parser funziona come un compilatore potrebbe funzionare in altri tipi di ambienti di sviluppo delle applicazioni. I parser sono comunemente usati nello sviluppo di script perché possono valutare il codice quando lo script viene eseguito e non richiedono che il codice venga compilato primo.

1

Un parser contiene dati grezzi e parses in una struttura ad albero. Questo albero di sintassi viene quindi passato al generatore, che lo trasformerà in qualsiasi cosa debba generare.

Quindi, un parser è una parte di un compilatore.

+0

non devono produrre una struttura ad albero –

+0

Avete un esempio per un parser che non produce un albero? –

+0

Che dire di un parser per una lingua che rappresenta grafici arbitrari? Gli analisti generalmente traducono qualcosa di testuale in una rappresentazione interna. Quest'ultimo è più spesso un albero per le lingue con grammatiche libere da contesto definite formalmente, ma in realtà può essere qualsiasi cosa che sia conveniente da gestire. – Joey

0

In generale, parser è una parte del compilatore, ma il compilatore è progettato per convertire lo script ricevuto in generale in codice leggibile dalla macchina o talvolta in un'altra lingua.