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:

Analizzatore lessicale Architectura
Analizzatore lessicale Architectura
  1. "Get next token" รจ un comando che viene inviato dal parser all'analizzatore lessicale.
  2. Alla ricezione di questo comando, l'analizzatore lessicale analizza l'input finchรฉ non trova il token successivo.
  3. 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

Sintesi

  • 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

Riassumi questo post con: