Progettazione del compilatore - Analisi lessicale

L'analisi lessicale è la prima fase di un compilatore. Prende il codice sorgente modificato dai preprocessori del linguaggio scritti sotto forma di frasi. L'analizzatore lessicale suddivide queste sintassi in una serie di token, rimuovendo eventuali spazi o commenti nel codice sorgente.

Se l'analizzatore lessicale trova un token non valido, genera un errore. L'analizzatore lessicale lavora a stretto contatto con l'analizzatore di sintassi. Legge i flussi di caratteri dal codice sorgente, controlla i token legali e passa i dati all'analizzatore di sintassi quando lo richiede.

Gettoni

Si dice che i lessemi siano una sequenza di caratteri (alfanumerici) in un token. Ci sono alcune regole predefinite per identificare ogni lessema come token valido. Queste regole sono definite da regole grammaticali, per mezzo di un modello. Un pattern spiega cosa può essere un token e questi pattern sono definiti per mezzo di espressioni regolari.

Nel linguaggio di programmazione, parole chiave, costanti, identificatori, stringhe, numeri, operatori e simboli di punteggiatura possono essere considerati come token.

Ad esempio, in linguaggio C, la riga di dichiarazione della variabile

int value = 100;

contiene i token:

int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).

Specifiche dei token

Cerchiamo di capire come la teoria del linguaggio assume i seguenti termini:

Alfabeti

Qualsiasi insieme finito di simboli {0,1} è un insieme di alfabeti binari, {0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F} è un insieme di alfabeti esadecimali, {az, AZ} è un insieme di alfabeti in lingua inglese.

stringhe

Qualsiasi sequenza finita di alfabeti è chiamata stringa. La lunghezza della stringa è il numero totale di occorrenze di alfabeti, ad esempio, la lunghezza della stringa tutorialspoint è 14 ed è indicata da | tutorialspoint | = 14. Una stringa senza alfabeti, cioè una stringa di lunghezza zero è conosciuta come una stringa vuota ed è denotata da ε (epsilon).

Simboli speciali

Una tipica lingua di alto livello contiene i seguenti simboli: -

Simboli aritmetici Addizione (+), Sottrazione (-), Modulo (%), Moltiplicazione (*), Divisione (/)
Punteggiatura Virgola (,), punto e virgola (;), punto (.), Freccia (->)
Incarico =
Assegnazione speciale + =, / =, * =, - =
Confronto ==,! =, <, <=,>,> =
Preprocessore #
Identificatore di posizione &
Logico &, &&, |, ||,!
Operatore di turno >>, >>>, <<, <<<

linguaggio

Una lingua è considerata come un insieme finito di stringhe su un insieme finito di alfabeti. I linguaggi informatici sono considerati insiemi finiti e su di essi possono essere eseguite operazioni su insiemi matematici. Le lingue finite possono essere descritte per mezzo di espressioni regolari.

Regola di corrispondenza più lunga

Quando l'analizzatore lessicale legge il codice sorgente, esegue la scansione del codice lettera per lettera; e quando incontra uno spazio bianco, un simbolo di operatore o simboli speciali, decide che una parola è completata.

For example:

int intvalue;

Durante la scansione di entrambi i lessemi fino a 'int', l'analizzatore lessicale non può determinare se si tratta di una parola chiave int o delle iniziali dell'identificatore int value.

La regola di corrispondenza più lunga afferma che il lessema scansionato deve essere determinato in base alla corrispondenza più lunga tra tutti i token disponibili.

Segue anche l'analizzatore lessicale rule prioritydove una parola riservata, ad esempio, una parola chiave, di una lingua ha la priorità sull'input dell'utente. Cioè, se l'analizzatore lessicale trova un lessema che corrisponde a qualsiasi parola riservata esistente, dovrebbe generare un errore.