Analisi lessicale nella progettazione di compilatori con esempi

Sommario:

Anonim

Cos'è l'analisi lessicale?

L'ANALISI LESSICA è la prima 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 gettoni. L'analizzatore lessicale suddivide questa sintassi in una serie di token. Rimuove qualsiasi spazio aggiuntivo o commento scritto nel codice sorgente.

I programmi che eseguono l'analisi lessicale sono chiamati analizzatori lessicali o lexer. Un lexer contiene tokenizer o scanner. Se l'analizzatore lessicale rileva che il token non è valido, genera un errore. Legge i flussi di caratteri dal codice sorgente, controlla i token legali e passa i dati all'analizzatore di sintassi quando lo richiede.

Esempio

How Pleasant Is The Weather?

Vedi questo esempio; 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 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 luoghi dispari. Non è qualcosa che ti viene subito.

In questo tutorial imparerai

  • Terminologie di base:
  • Architettura dell'analizzatore lessicale: come vengono riconosciuti i token
  • Ruoli dell'analizzatore lessicale
  • Errori lessicali
  • Ripristino degli errori nell'analizzatore lessicale
  • Analizzatore lessicale vs parser
  • Perché separare Lexical e Parser?
  • Vantaggi dell'analisi lessicale
  • Svantaggio dell'analisi lessicale

Terminologie di base

Cos'è un lessema?

Un lessema è una sequenza di caratteri inclusi nel programma sorgente in base al modello di corrispondenza di un token. Non è altro che un'istanza di un token.

Cos'è un token?

Il token è una sequenza di caratteri che rappresenta un'unità di informazioni nel programma sorgente.

Cos'è Pattern?

Un pattern è una descrizione utilizzata dal token. Nel caso di una parola chiave che utilizza come token, il modello è una sequenza di caratteri.

Architettura dell'analizzatore lessicale: 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 ogni token uno per uno. Gli scanner sono generalmente implementati per produrre token solo quando richiesto da un parser. Ecco come funziona-

  1. "Get next token" è un comando che viene inviato dal parser all'analizzatore lessicale.
  2. Alla ricezione di questo comando, l'analizzatore lessicale scansiona l'input fino a trovare il token successivo.
  3. Restituisce il token a Parser.

Lexical Analyzer salta spazi bianchi e commenti durante la creazione di questi token. Se è presente un errore, l'analizzatore lessicale correlerà tale errore con il file di origine e il numero di riga.

Ruoli dell'analizzatore lessicale

L'analizzatore lessicale esegue le attività indicate di seguito:

  • Aiuta a identificare il token nella tabella dei simboli
  • Rimuove gli spazi bianchi e i commenti dal programma di origine
  • Correla i messaggi di errore con il programma di origine
  • Ti aiuta ad espandere le macro se si trova nel programma sorgente
  • Legge i caratteri di input dal programma sorgente

Esempio di analisi lessicale, token, non token

Considera il codice seguente che viene fornito a Lexical Analyzer

#include int maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}

Esempi di token creati

Lexeme Gettone
int Parola chiave
massimo Identificatore
( Operatore
int Parola chiave
X Identificatore
, Operatore
int Parola chiave
Y Identificatore
) Operatore
{ Operatore
Se Parola chiave

Esempi di non token

genere Esempi
Commento // Questo confronterà 2 numeri
Direttiva pre-processore #include
Direttiva pre-processore #define NUMS 8,9
Macro NUMS
Spazio bianco / n / b / t

Errori lessicali

Una sequenza di caratteri che non è possibile scansionare in nessun token valido è un errore lessicale. Fatti importanti sull'errore lessicale:

  • Gli errori lessicali non sono molto comuni, ma dovrebbero essere gestiti da uno scanner
  • Errori ortografici di identificatori, operatori, parole chiave sono considerati errori lessicali
  • Generalmente, un errore lessicale è causato dalla comparsa di qualche carattere illegale, principalmente all'inizio di un token.

Ripristino degli errori nell'analizzatore lessicale

Di seguito sono riportate alcune delle tecniche di ripristino degli errori più comuni:

  • Rimuove un carattere dall'input rimanente
  • Nella modalità panico, i caratteri successivi vengono sempre ignorati fino a quando non raggiungiamo un token ben formato
  • Inserendo il carattere mancante nell'input rimanente
  • Sostituisci un personaggio con un altro personaggio
  • Trasponi due caratteri seriali

Analizzatore lessicale vs parser

Analizzatore lessicale Parser
Programma di input di scansione Eseguire l'analisi della sintassi
Identifica i token Crea una rappresentazione astratta del codice
Inserisci i gettoni 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 sintassi eliminando i token indesiderati
  • Per migliorare l'efficienza del compilatore: aiuta a migliorare l'efficienza del compilatore
  • Specializzazione: possono essere applicate tecniche specialistiche per migliorare il processo di analisi lessicale
  • Portabilità: solo lo scanner richiede per 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 i 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 JavsScript, HTML, CSS
  • Un analizzatore lessicale separato 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 abbastanza difficili da capire rispetto alle regole PEG o EBNF
  • È necessario uno sforzo maggiore per sviluppare ed eseguire il debug del lexer e delle sue descrizioni dei token
  • È necessario un sovraccarico di runtime aggiuntivo per generare le tabelle lexer e costruire i token

Sommario

  • L'analisi lessicale è la prima fase nella progettazione del compilatore
  • Un lessema è una sequenza di caratteri inclusi nel programma sorgente in base al modello 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 nessun token valido è un errore lessicale
  • Rimuove un carattere dall'input rimanente è utile Metodo di ripristino degli errori
  • Lexical Analyzer esegue la scansione del programma di input mentre il parser esegue l'analisi della sintassi
  • Facilita il processo di analisi lessicale e di 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 sovraccarico di runtime aggiuntivo per generare le tabelle lexer e costruire i token