Analisi lessicale (analizzatore) nella progettazione del compilatore con esempio

⚡ Riepilogo intelligente

L'analisi lessicale è la prima fase della progettazione di un compilatore, in cui un analizzatore lessicale converte un flusso di caratteri sorgente in token significativi. Rimuove gli spazi bianchi e i commenti, registra i token nella tabella dei simboli e segnala gli errori lessicali al parser.

  • 🔤 Prima fase di compilazione: L'analisi lessicale legge i caratteri sorgente e li converte in una sequenza di token.
  • 🧩 Parole chiave: Un lessema è una sequenza di caratteri corrispondente, un token è la sua categoria e un modello definisce la regola.
  • ???? ️ Come funziona: Il parser richiede "ottieni il token successivo" e lo scanner restituisce i token su richiesta.
  • 🧹 Ruolo di pulizia: L'analizzatore lessicale rimuove gli spazi bianchi e i commenti, espande le macro e popola la tabella dei simboli.
  • ⚠️ Errori lessicali: Caratteri non validi o identificatori scritti in modo errato generano errori, che vengono gestiti tramite tecniche di recupero come la cancellazione o la trasposizione.
  • 🔀 Analizzatore lessicale vs. analizzatore sintattico: Il lessatore identifica i token; il parser costruisce un albero sintattico durante l'analisi della sintassi.

Analisi lessicale

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 Crea un addominalitract rappresentazione 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 JavaCopione, 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

DOMANDE FREQUENTI

Tra gli strumenti più diffusi ci sono Lex e la sua versione open-source Flex. Si scrivono i pattern dei token come espressioni regolari e lo strumento genera automaticamente il codice sorgente dello scanner, evitando di dover programmare manualmente il tokenizer.

Un analizzatore lessicale definisce ogni token come un'espressione regolare e implementa la corrispondenza utilizzando automi a stati finiti. Scansiona i caratteri da sinistra a destra ed emette la corrispondenza valida più lunga come token successivo.

Una tabella dei simboli è una struttura dati in cui l'analizzatore lessicale memorizza gli identificatori e i relativi attributi, come nome e tipo. Later le fasi del compilatore leggono e aggiornano track variabili e funzioni.

L'IA può generare espressioni regolari di token da esempi, individuare ambiguità o sovrapposizioniping modelli e spiega gli errori dello scanner. Questo velocizza la creazione e il debug di un analizzatore lessicale per un nuovo linguaggio o DSL.

Non esattamente. I compilatori utilizzano regole fisse e automi a stati finiti per tokenizzare il codice, mentre i modelli di intelligenza artificiale suddividono il testo in token statistici a livello di sottoparola. Gli obiettivi sono diversi: analisi sintattica esatta contro comprensione flessibile del linguaggio.

Riassumi questo post con: