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?
risposta
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 è.
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.
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.
È 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.
- 1. Come vengono sviluppate le parole chiave?
- 2. Come leggere un file CSV una riga alla volta e analizzare le parole chiave
- 3. Come funzionano esattamente le parole chiave "param"?
- 4. C# Linq Parole chiave?
- 5. VB.NET Comportamento delle parole chiave WithEvents: restrizione del compilatore VB.NET?
- 6. C# variabili per parole chiave come
- 7. Quali sono le parole chiave per le parole chiave del gruppo di annunci Facebook?
- 8. Devo bloccare l'oggetto durante la lettura?
- 9. Uso di parole chiave virtuali in C++
- 10. Leggi le linee tra due parole chiave
- 11. Come formattare le parole chiave in Microdata per un CreativeWork?
- 12. problema di parole chiave dinamiche
- 13. C# enumerazioni con parole chiave riservate
- 14. ruby search array per le parole chiave
- 15. Percorso di parole chiave in SDL Tridion
- 16. C++/CLI-Domanda: Esiste un equivalente alla parola chiave C# "è" o devo usare la riflessione?
- 17. preprocessore per sostituire le parole chiave javascript
- 18. Clang C Compilatore parola chiave 'class' riservata?
- 19. __strong e inserimento di parole chiave __weak - Objective-C
- 20. Trova le prime 4 parole e le ultime 4 parole del database dopo determinate parole chiave?
- 21. vim non evidenzia alcune parole chiave C++
- 22. errore durante la scrittura pymongo
- 23. Perché il compilatore Delphi crea un file chiamato "c" durante la creazione di un progetto specifico?
- 24. Come utilizzare parole chiave personalizzate in SVN
- 25. Come posso bloccare un file durante la scrittura tramite FileStream?
- 26. Devo ripetere la parola chiave inline sull'attuazione funzione
- 27. Le parole chiave transitorie possono contrassegnare un metodo?
- 28. Le macro di Racket possono assumere argomenti di parole chiave?
- 29. Come analizzare/analizzare semplice codice C/C++ da C# per ottenere un elenco di metodi
- 30. Come le stringhe concat compilatore C#
È possibile provare l'hashing perfetto, ma è improbabile che questa fase sarà il collo di bottiglia delle prestazioni. –
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. –
E ora ho notato che [scansione] è il tag sbagliato. Cambiato di nuovo, in [lexer]. –