Analisi lessicale (analizzatore) nella progettazione del compilatore con esempio
Cos'è l'analisi lessicale?
Analisi lessicale è la primissima fase nella progettazione del compilatore. Un Lexer prende il codice sorgente modificato che è scritto sotto forma di frasi. In altre parole, ti aiuta a convertire una sequenza di caratteri in una sequenza di token. L'analizzatore lessicale suddivide questa sintassi in una serie di token. Rimuove qualsiasi spazio extra o commento scritto nel codice sorgente.
I programmi che eseguono l'analisi lessicale nella progettazione del compilatore sono chiamati analizzatori lessicali o lexer. Un lexer contiene tokenizzatore o scanner. Se l'analizzatore lessicale rileva che il token non è valido, genera un errore. Il ruolo dell'analizzatore lessicale nella progettazione del compilatore è leggere i flussi di caratteri dal codice sorgente, verificare la presenza di token legali e passare i dati all'analizzatore di sintassi quando richiesto.
Esempio
How Pleasant Is The Weather?
Vedi questo esempio di analisi lessicale; Qui possiamo facilmente riconoscere che ci sono cinque parole How Pleasant, The, Weather, Is. Questo è molto naturale per noi poiché possiamo riconoscere i separatori, gli spazi vuoti e il simbolo di punteggiatura.
HowPl easantIs Th ewe ather?
Ora, controlla questo esempio, possiamo anche leggere questo. Tuttavia, ci vorrà del tempo perché i separatori vengono inseriti nei posti dispari. Non è qualcosa che ti arriva subito.
Terminologie di base
Cos'è un lessema?
Un lessema è una sequenza di caratteri inclusi nel programma sorgente in base allo schema di corrispondenza di un token. Non è altro che un'istanza di un token.
Cos'è un gettone?
I token nella progettazione del compilatore sono la sequenza di caratteri che rappresenta un'unità di informazione nel programma sorgente.
Cos'è il modello?
Un modello è una descrizione utilizzata dal token. Nel caso di una parola chiave che utilizza come token, il modello è una sequenza di caratteri.
Analizzatore lessicale Architecture: Come vengono riconosciuti i token
Il compito principale dell'analisi lessicale è leggere i caratteri di input nel codice e produrre token.
L'analizzatore lessicale esegue la scansione dell'intero codice sorgente del programma. Identifica ciascun token uno per uno. Gli scanner vengono solitamente implementati per produrre token solo quando richiesto da un parser. Ecco come funziona il riconoscimento dei token nella progettazione del compilatore:

- "Get next token" è un comando che viene inviato dal parser all'analizzatore lessicale.
- Alla ricezione di questo comando, l'analizzatore lessicale analizza l'input finché non trova il token successivo.
- Restituisce il token a Parser.
L'Analizzatore lessicale salta gli spazi bianchi e i commenti durante la creazione di questi token. Se è presente un errore, l'analizzatore lessicale correlerà tale errore con il file sorgente e il numero di riga.
Ruoli dell'analizzatore lessicale
L'analizzatore lessicale esegue i compiti indicati di seguito:
- Aiuta a identificare il token nella tabella dei simboli
- Rimuove gli spazi bianchi e i commenti dal programma sorgente
- Correla i messaggi di errore con il programma sorgente
- Ti aiuta ad espandere le macro se si trova nel programma sorgente
- Leggere i caratteri immessi dal programma sorgente
Esempio di analisi lessicale, token, non token
Considerare il seguente codice che viene immesso in Lexical Analyzer
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
Esempi di token creati
Lessema | Token |
---|---|
int | Parola chiave |
massimo | Identifier |
( | Operator |
int | Parola chiave |
x | Identifier |
, | Operator |
int | Parola chiave |
Y | Identifier |
) | Operator |
{ | Operator |
If | Parola chiave |
Esempi di non token
Tipo | Esempi |
---|---|
Commento | // Questo confronterà 2 numeri |
Direttiva del preprocessore | #includere |
Direttiva del preprocessore | #definire NUMERI 8,9 |
Macro | NUMERI |
spazio bianco | /n /b /t |
Errori lessicali
Una sequenza di caratteri che non è possibile scansionare in alcun token valido è un errore lessicale. Fatti importanti sull'errore lessicale:
- Gli errori lessicali non sono molto comuni, ma dovrebbero essere gestiti da uno scanner
- Gli errori di ortografia di identificatori, operatori e parole chiave sono considerati errori lessicali
- Generalmente, un errore lessicale è causato dalla comparsa di qualche carattere illegale, soprattutto all'inizio di un token.
Recupero errori nell'analizzatore lessicale
Ecco alcune tecniche di ripristino degli errori più comuni:
- Rimuove un carattere dall'input rimanente
- Nella modalità panico, i caratteri successivi vengono sempre ignorati finché non si raggiunge un token ben formato
- Inserendo il carattere mancante nell'input rimanente
- Sostituisci un carattere con un altro carattere
- Trasporre due caratteri seriali
Analizzatore lessicale vs. Parser
Analizzatore lessicale | parser |
---|---|
Scansione del programma di input | Eseguire l'analisi della sintassi |
Identificare i token | Creare una rappresentazione astratta del codice |
Inserisci i token nella tabella dei simboli | Aggiorna le voci della tabella dei simboli |
Genera errori lessicali | Genera un albero di analisi del codice sorgente |
Perché separare Lexical e Parser?
- La semplicità del design: facilita il processo di analisi lessicale e di analisi della sintassi eliminando token indesiderati
- Per migliorare l'efficienza del compilatore: aiuta a migliorare l'efficienza del compilatore
- Specializzazione: è possibile applicare tecniche specializzate per migliorare il processo di analisi lessicale
- Portabilità: solo lo scanner necessita di comunicare con il mondo esterno
- Maggiore portabilità: peculiarità specifiche del dispositivo di input limitate al lexer
Vantaggi dell'analisi lessicale
- Il metodo dell'analizzatore lessicale viene utilizzato da programmi come compilatori che possono utilizzare i dati analizzati dal codice di un programmatore per creare un codice eseguibile binario compilato
- Viene utilizzato dai browser Web per formattare e visualizzare una pagina Web con l'aiuto di dati analizzati da Javascript, HTML, CSS
- Un analizzatore lessicale separato ti aiuta a costruire un processore specializzato e potenzialmente più efficiente per l'attività
Svantaggio dell'analisi lessicale
- È necessario dedicare molto tempo alla lettura del programma sorgente e al partizionamento sotto forma di token
- Alcune espressioni regolari sono piuttosto difficili da comprendere rispetto alle regole PEG o EBNF
- È necessario uno sforzo maggiore per sviluppare ed eseguire il debug del lexer e delle descrizioni dei token
- È necessario un ulteriore sovraccarico di runtime per generare le tabelle lexer e costruire i token
Sommario
- L'analisi lessicale è la primissima fase nella progettazione del compilatore
- Lessemi e token sono la sequenza di caratteri inclusi nel programma sorgente in base allo schema di corrispondenza di un token
- L'analizzatore lessicale è implementato per scansionare l'intero codice sorgente del programma
- L'analizzatore lessicale aiuta a identificare il token nella tabella dei simboli
- Una sequenza di caratteri che non è possibile scansionare in alcun token valido è un errore lessicale
- Rimuove un carattere dall'input rimanente è un utile metodo di ripristino dell'errore
- L'analizzatore lessicale esegue la scansione del programma di input mentre il parser esegue l'analisi della sintassi
- Facilita il processo di analisi lessicale e di analisi della sintassi eliminando i token indesiderati
- L'analizzatore lessicale viene utilizzato dai browser Web per formattare e visualizzare una pagina Web con l'aiuto di dati analizzati da JavsScript, HTML, CSS
- Il più grande svantaggio dell'utilizzo dell'analizzatore lessicale è che richiede un ulteriore sovraccarico di runtime per generare le tabelle lexer e costruire i token