Linguaggi e Traduttori: Analisi lessicale

Documenti analoghi
Linguaggi e Ambienti di Programmazione

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd

Linguaggi Regolari e Linguaggi Liberi

Linguaggi Regolari e Linguaggi Liberi

Analizzatore Lessicale Parte I Scanner

Analisi lessicale (scanner)

Dispensa 2. Data una grammatica context free esistono tre metodi diversi per costruirne la parsing table per un parser LR:

Espressioni regolari

Dispensa 1. Da un punto di vista logico l architettura di un compilatore si può suddividere in due parti: Analisi e Sintesi.

Grammatiche Parse trees Lezione del 17/10/2012

Esercizi di Fondamenti di Informatica per la sicurezza. Stefano Ferrari

Fasi di un Compilatore

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Linguaggi Liberi dal Contesto. Linguaggi Liberi dal Contesto

Quiz sui linguaggi regolari

Informatica teorica Lez. n 7 Macchine di Turing. Macchine di Turing. Prof. Giorgio Ausiello Università di Roma La Sapienza

Verificare se una grammatica e LL(1) e costruirne la tabella di parsing. Verificare se una grammatica e LR(0) e costruirne la tabele ACTION e GOTO

LINGUAGGI DI ALTO LIVELLO. Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware

Proprieta dei Linguaggi regolari

Linguaggi regolari e automi a stati finiti

Esempio stringhe palindrome 1

Sui Linguaggi Regolari: Teorema di Kleene - Pumping Lemm

Corso di Informatica 1 Esercitazione n. 4

Introduzione alla programmazione

Aniello Murano Automi e Pushdown

Automi. Rosario Culmone, Luca Tesei. 20/10/2009 UNICAM - p. 1/55

Espressioni regolari descrivono i linguaggi regolari. Un FA (NFA o DFA) è un metodo per costruire una macchina che riconosce linguaggi regolari.

Esercitazioni di Linguaggi e Traduttori

Lezione 6 Introduzione al C++ Mauro Piccolo

Cosa si intende con stato

Analizzatori Lessicali con JLex. Giuseppe Morelli

Yet Another Compiler-Compiler. Generazione automatica di analizzatori sintattici

Informatica e Comunicazione Digitale Crediti formativi 9. No, ma la frequenza è fortemente consigliata Lingua di erogazione

Ottimizzazione dei Sistemi Complessi

Il Modello di un Compilatore. La costruzione di un compilatore per un particolare linguaggio di programmazione e' abbastanza complessa.

Fondamenti d Informatica: Le Macchine di Turing. Barbara Re, Phd

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Automi e Linguaggi Formali

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

LA METAFORA DELL UFFICIO

Dall algoritmo al programma

Il linguaggio di programmazione Python

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

L intero è o il valore zero o una stringa di cifre che inizia con una cifra diversa sa zero.

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Definizione di Grammatica

Principio di composizione delle MT

Pumping lemma per i linguaggi Context-free

Introduzione alla programmazione strutturata

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Introduzione agli Algoritmi

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Macchina di Turing Universale

I Linguaggi di Programmazione

INTRODUZIONE AL TESTO FILOSOFICO

Rappresentazione con i diagrammi di flusso (Flow - chart)

Linguaggi e Traduttori: Introduzione al corso

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

LINGUAGGI CONTEXT FREE. Lezione Lezione

Dispensa YACC. 1.1 YACC: generalità

AUTOMA A STATI FINITI

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Cognome e Nome : Corso e Anno di Immatricolazione: Modalità di Laboratorio (Progetto/Prova) :

Transcript:

Linguaggi e Traduttori: Analisi lessicale Armando Tacchella Sistemi e Tecnologie per il Ragionamento Automatico (STAR-La) Dipartimento di Informatica Sistemistica e Telematica (DIST) Università di Genova AA 2006/2007 - Primo semestre

Outline Introduzione e motivazioni Strumenti formali Espressioni regolari (RE) Automi a stati finiti (DFA) Relazione tra RE e DFA Automi a stati finiti non deterministici (NFA) Costruzione di Thomson: da RE a NFA Conversione da NFA a DFA

Il Front End COMPILATORE codice sorgente codice eseguiile errori Lo scopo del Front End è quello di analizzare il codice sorgente Eseguire un test di appartenenza: programma linguaggio? Verificare se il programma è semanticamente en fondato Costruire la rappresentazione intermedia (IR)

Realizzazione del Front End Scanner Parser codice sorgente token stream errori IR Specifica della sintassi con una notazione formale espressioni regolari per l analisi lessicale grammatiche context-free per l analisi sintattica Sintesi automatica dei riconoscitori lessical e sintattici

Microsintassi e sintassi stream di caratteri Scanner (microsintassi) stream di token errori Parser (sintassi) IR + annotazioni token = <parte del discorso, lessema> L analizzatore lessicale identifica i token L analizzatore sintattico controlla il rispetto della grammatica L analisi sintattica è più complessa La separazione semplifica l implementazione

Visione d insieme Codice sorgente Scanner stream di token specifiche taelle/codice Generatore di Scanner COMPILAZIONE PROGETTAZIONE Le specifiche per il generatore sono espressioni regolari L analizzatore lessicale è un implementazione degli automi a stati finiti che corrispondono alle specifiche

Outline Introduzione e motivazioni Strumenti formali Espressioni regolari (RE) Automi a stati finiti (DFA) Relazione tra RE e DFA Automi a stati finiti non deterministici (NFA) Costruzione di Thomson: da RE a NFA Conversione da NFA a DFA

Operazioni su insiemi (Ripasso?) Operazione Definizione Unione di L ed M L M L M = {s s L o s M} Concatenazione di L ed M LM LM = {st s L e t M} Chiusura di L L L = 0 i Li

Espressioni regolari (RE) Dato un alfaeto (insieme di simoli) Σ è una RE che denota l insieme vuoto {} Se s Σ allora s è una RE che denota {s} Se x e y sono RE che denotano L(x) ed L(y) allora x y è una RE che denota L(x) L(y) xy è una RE che denota L(x)L(y) x è una RE che denota L(x)

Utilizzo delle RE Dato un generico alfaeto Σ utilizzando le RE possiamo specificare singole parole con la concatenazione insiemi di parole con l unione insiemi di parole aventi la stessa struttura con la chiusura Ad esempio, dato Σ = {caratteri ASCII} possiamo scrivere: una RE per ogni singola parola chiave del C: if, then, void, int, ecc una RE che racchiude tutte le parole chiave del C: if then void int una RE che riconosce identificatori validi in C: date x = a z A B _ e y = x 0 9, l espressione xy definisce (infiniti) identificatori

Outline Introduzione e motivazioni Strumenti formali Espressioni regolari (RE) Automi a stati finiti (DFA) Relazione tra RE e DFA Automi a stati finiti non deterministici (NFA) Costruzione di Thomson: da RE a NFA Conversione da NFA a DFA

Automi a stati finiti deterministici (DFA) Un DFA è una quintupla S, Σ, δ, s 0, S F, dove: S è un insieme di finito stati (o configurazioni) Σ è un insieme finito di simoli δ è una funzione δ : S Σ S s 0 è lo stato di partenza s 0 S S F è l insieme degli stati finali S F S Intuitivamente, data una sequenza di simoli w: l automa si accende nello stato s 0 dato lo stato corrente s, l automa consuma un carattere c di w, ed effettua una transizione nello stato δ(s, c) quando w è stata consumata, se lo stato corrente appartiene a S F allora w è accettata dall automa, altrimenti è rifiutata

Utilizzo dei DFA a z A Z _ 0 9 s0 a z A Z _ s1 Un DFA per riconoscere gli identificatori validi del C Formalmente: Σ = {a,, z, A,, Z, _, 0,, 9} S = {s 0, s 1 } δ è la funzione rappresentata dal diagramma S F = {s 1 } Identificatori accettati: _, a21, pippo Identificatori rifiutati: 15, 7a

Sintesi dei DFA Schema del riconoscitore ISIDENTIFIER(inputStream) : ool 1 char GETCHAR(inputStream) 2 state s 0 3 while (char EOF) 4 state δ(state, char) 5 char GETCHAR(inputStream) 6 if state S F 7 then return TRUE 8 else return FALSE Funzione di transizione δ a z 0 9 altro A Z _ s 0 s 1 err err s 1 s 1 s 1 err

Outline Introduzione e motivazioni Strumenti formali Espressioni regolari (RE) Automi a stati finiti (DFA) Relazione tra RE e DFA Automi a stati finiti non deterministici (NFA) Costruzione di Thomson: da RE a NFA Conversione da NFA a DFA

Visione d insieme descrivono Linguaggi Regolari riconoscono Espressioni Regolari (RE)??? Automi a Stati Finiti (DFA) Le RE descrivono (tutti e soli) i linguaggi regolari I DFA riconoscono (tutti e soli) i linguaggi regolari Quale corrispondenza tra RE e DFA? Chiave per la sintesi automatica di scanner

Da RE a DFA: prolematiche La RE (a ) a corrisponde al DFA: a s0 a s1 a s2 s3 a La corrispondenza non è immediata La conversione diretta è difficilmente automatizzaile

Da RE a DFA: non determinismo Un altro automa per la RE (a ) a a s0 s1 a s2 s3 s4 Un riconoscitore intrinsecamente diverso: s 0 ha una transizione con s 1 ha due transizioni uscenti con a Si tratta di un automa a stati finiti non deterministico

Automi a stati finiti non deterministici (NFA) Un NFA accetta una stringa x se e solo se esiste una sequenza di transizioni da s 0 a s S F (ignorando ) che corrisponde ai simoli di x Le transizioni su non consumano l input L esecuzione di un NFA prevede che si indovini la mossa corretta ad ogni passo viene sempre fatta la scelta giusta se una sequenza di scelte giuste accetta x allora x fa parte del linguaggio riconosciuto dall automa

Relazione tra NFA e DFA I DFA sono un caso particolare di NFA non ammettono transizioni su le transizioni sono descritte da una funzione Un DFA può essere simulato con un NFA (ovviamente!) Un NFA può essere simulato con un DFA (meno ovvio) Simulare sovrapposizioni di stati Nel caso pessimo, esplosione esponenziale (spazio) Tempo di esecuzione comunque proporzionale a x

RE, NFA e DFA nei compilatori Per generare automaticamente il codice dell analizzatore lessicale: 1 Scrivere le specifiche con le RE (a mano) 2 Convertire le RE in un NFA (Thomson s construction) 3 Convertire l NFA in un DFA (Suset construction) 4 (Minimizzare il DFA risultante) 5 Generare il codice

Outline Introduzione e motivazioni Strumenti formali Espressioni regolari (RE) Automi a stati finiti (DFA) Relazione tra RE e DFA Automi a stati finiti non deterministici (NFA) Costruzione di Thomson: da RE a NFA Conversione da NFA a DFA

Elementi di ase s0 a s1 s0 a s1 s2 s3 NFA per a NFA per a s0 s1 a s2 s5 s0 s1 a s2 s3 s3 s4 NFA per a NFA per a

Esempio di costruzione di Thomson (1/2) NFA per la RE a( c) 1 NFA per a, e c s0 a s1 s0 s1 s0 c s1 2 NFA per c s1 s0 s2 s5 s3 c s4 3 NFA per ( c) s2 s0 s1 s3 s6 s7 s4 c s5

Esempio di costruzione di Thomson (2/2) 4 NFA per a( c) s8 a s9 s0 s1 s2 s3 s6 s7 s4 c s5 È possiile costruire un automa molto più semplice a mano s0 a s1 c però la costruzione di Thomson può essere automatizzata!

Outline Introduzione e motivazioni Strumenti formali Espressioni regolari (RE) Automi a stati finiti (DFA) Relazione tra RE e DFA Automi a stati finiti non deterministici (NFA) Costruzione di Thomson: da RE a NFA Conversione da NFA a DFA

Suset Construction: NFA DFA Si tratta di simulare un NFA Due funzioni chiave: MOVE(s i, a): insieme degli stati raggiungiili da s i tramite a -CLOSURE: insieme degli stati raggiungiili da s i tramite Algoritmo: Lo stato iniziale del DFA q 0 è la -CLOSURE dello stato iniziale del NFA s 0, ossia q 0 = -CLOSURE(s 0 ) Lo stato successivo è l immagine di q 0, ossia la -CLOSURE del risultato di MOVE(s i, α) per ogni α Σ Ripeto il procedimento finché nessun nuovo stato q i viene creato

Pseudo-codice per la suset construction q 0 -CLOSURE({s 0 }) Q {q 0 } W {q 0 } while (W ) selezionare e rimuovere q da W foreach α Σ t -CLOSURE(MOVE(q,α)) δ(q, α) t if (t S) then S S {t} W W {t} L algoritmo termina: 1 S non contiene duplicati 2 2 {# stati NFA} è finito 3 il loop while aggiunge sempre elementi ad S (monotono) il loop termina! S contiene tutti gli stati raggiungiili dell NFA esplora tutti i simoli in tutti gli stati costruisce ogni possiile configurazione S e δ sono il DFA risultante

Esempio di conversione NFA DFA (1) s8 a s9 s0 s1 s2 s3 s6 s7 s4 c s5 Stati DFA (q) Stati NFA (s) -CLOSURE(MOVE(q,*)) a c q 0 s 8 s 9,s 0,s 1, s 2,s 4,s 7 q 1 s 9,s 0,s 1, s 3, s 6, s 7, s 5, s 6, s 7, s 2,s 4,s 7 s 1,s 2,s 4 s 1,s 2,s 4 q 2 s 3, s 6, s 7, q 2 q 3 s 1,s 2,s 4 q 3 s 5, s 6, s 7, q 2 q 3 s 1,s 2,s 4

Esempio di conversione NFA DFA (2) q2 q0 a q1 c c q3 s0 a s1 Generato automaticamente c Generato a mano c L automa ottenuto: ha minori dimensioni del NFA corrispondente, ha tutte le transizioni deterministiche, e può essere implementato utilizzando il codice visto in precedenza