2015-11-19 7 views
5

Attualmente sto scrivendo un compilatore C to Assembly, non è pensato per essere pratico, ma mi piacerebbe farlo per il valore educativo. Mi stavo chiedendo quando sto testando le parole chiave, c'è un modo più efficace invece di leggere la parola successiva nel file e poi eseguirlo attraverso un gruppo di istruzioni nidificate if che testano le parole chiave. C'è un modo migliore?Come devo analizzare le parole chiave durante la scrittura di un compilatore C?

+2

È possibile provare l'hashing perfetto, ma è improbabile che questa fase sarà il collo di bottiglia delle prestazioni. –

+2

Ho cambiato il tag [parsing] in [scanning]. L'identificazione dei token individuali viene eseguita dalla prima fase del compilatore, dallo scanner e non dalla seconda fase, il parser. –

+0

E ora ho notato che [scansione] è il tag sbagliato. Cambiato di nuovo, in [lexer]. –

risposta

8

La tua domanda è in realtà abbastanza specifica. Stai chiedendo come costruire l'analizzatore lessicale, noto anche come scanner, e come riconoscere in modo efficiente e conveniente le parole chiave. Lo scanner è la prima fase di un tipico compilatore e converte il codice sorgente, che è una sequenza di caratteri, in una sequenza di token, in cui un token è un'unità come un numero, un operatore o una parola chiave.

Poiché le parole chiave corrispondono al modello per gli identificatori generali, un trucco comune consiste nel mettere tutte le parole chiave nella tabella dei simboli, insieme con le informazioni che si tratta di una parola chiave. Quindi, quando lo scanner trova un identificatore, come al solito cerca nella tabella dei simboli per vedere se quell'identificatore è stato visto prima. Se questo identificatore fosse un kewyord, sarà trovato, insieme con le informazioni su quale parola chiave è.

4

Stai facendo questo per una parte di una classe? Se è così, ci dovrebbero essere delle linee guida sull'analisi e sul lexing. Altrimenti, hai molto lavoro!

Scrivere un compilatore reale è molto più complicato di una semplice serie di istruzioni if, perché è necessario tenere traccia dell'ambiente. Dovrai pensare a come autorizzi classi, funzioni, chiamate di funzioni, istanze di classi, funzioni ricorsive ... la lista continua.

Date un'occhiata a lezioni del corso da UC Berkeley in materia, vale a dire di analisi, Lexing, generazione di codice, e gli strumenti necessari:

http://www-inst.eecs.berkeley.edu/~cs164/fa13/

Nota che questo corso in usati C++ scrivere un Python2.5 nel compilatore di Assembly, ma i concetti nelle conferenze e letture e alcuni strumenti non sono limitati alla lingua.

3

Le parole chiave (anziché i token in generale) sono un insieme chiuso, per cui è pratico generare una funzione di hash libera da collisioni. Poiché il set è piccolo, non è nemmeno necessario avere una funzione hash minima.

0

È possibile farlo con un gruppo di if-else se istruzioni e strcmp(). Tuttavia, le dichiarazioni di scrittura per tutte le parole chiave diventano fastidiose molto rapidamente. Faresti meglio a usare una tabella hash: all'inizio della compilation metti tutte le parole chiave nella tabella e poi esegui le ricerche secondo necessità. Lo svantaggio di questo è che se devi usare C, dovrai anche scrivere la tua tabella hash (o usarne una da una libreria). Se puoi usare C++, però, puoi usare una mappa o una unordered_map da STL. In ogni caso, se sei preoccupato per la performance, come qualcuno ha menzionato, non sarà un collo di bottiglia.

Problemi correlati