Sei sulla pagina 1di 23

Automi e Linguaggi Formali

Docente: Francesca Rossi

E-mail: frossi@math.unipd.it

Docente: Francesca Rossi Automi e Linguaggi Formali


Orario e ricevimento

Orario:
Lunedi, Martedi, Mercoledi, Giovedi 13:30-15:30 LUM250
Crediti: 8 crediti formativi, circa 64 ore di lezione
Ricevimento:
Martedi 11:00-13:00, studio 428, IV piano, Torre Archimede
(Via Trieste 63)

Docente: Francesca Rossi Automi e Linguaggi Formali


Sito del corso

URL: http://www.math.unipd.it/frossi/automi2013.html

Contiene:
programma
date appelli
lucidi
voti
...

Docente: Francesca Rossi Automi e Linguaggi Formali


Altre informazioni utili

Libro principale: Automi, linguaggi e calcolabilita,


J. E. Hopcroft, R. Motwani, and J. D. Ullman, terza edizione,
Pearson/Addison-Wesley, 2009.
Altro libro: Compilatori: principi, tecniche e strumenti, A.H.
Aho, M. S. Lam, R. Sethi, J. D. Ullman, seconda edizione,
Pearson/Addison-Wesley, 2009.
Compitini (forse): Due compitini, uno a meta del corso e
uno alla fine. Possono sostituire lo scritto.
Esame: Scritto e, se richiesto dal docente, colloquio orale.
Cinque appelli: due a fine corso (Dicembre-Gennaio), uno alla
fine del II trimestre (Aprile), uno a Luglio, uno a Settembre.
I lucidi per i capitoli 1-7 del libro principale sono basati sui
lucidi in inglese di Gosta Grahne e David Ford
(http://www.cs.concordia.ca/~grahne/hmu slides/).

Docente: Francesca Rossi Automi e Linguaggi Formali


Sommario del corso
Struttura dei un compilatore e fasi principali (cap.1 CPTS)
Analisi lessicale (cap. 3 CPTS)
Automi a stati finiti (cap.1,2 ALC)
Espressioni regolari (cap.3 ALC)
Pumping lemma e proprieta dei linguaggi regolari (cap.4
ALC)
Minimizzazione degli automi a stati finiti (cap.4 ALC)
Analisi sintattica top-down e bottom-up (cap.4 CPTS)
Grammatiche libere da contesto (cap.5 ALC)
Linguaggi regolari e grammatiche (cap.5 ALC)
Automi a pila (cap.6 ALC)
Pumping lemma per linguaggi liberi da contesto (cap.7 ALC)
Macchine di Turing, problemi ricorsivamente enumerabili
(cap.8 ALC)
Riduzioni e teorema di Rice (cap.9 ALC)
Classi P e NP (cap.10 ALC)
Docente: Francesca Rossi Automi e Linguaggi Formali
Linguaggi di programmazione

Linguaggi di programmazione = notazione per descrivere


calcoli e computazioni
Per eseguire un programma, deve essere tradotto in una forma
che puo essere capita da un calcolatore compilatore
Principi e tecniche utili non solo per costruire compilatori, ma
in molte altre aree dellinformatica: linguaggi di
programmazione, architettura, teoria dei linguaggi, algoritmi,
ingegneria del software, ecc.

Docente: Francesca Rossi Automi e Linguaggi Formali


Compilatori

Compilatore: programma che legge un programma scritto in


un linguaggio di programmazione (linguaggio sorgente) e lo
traduce in un programma equivalente scritto in un altro
linguaggio (linguaggio oggetto)
Un compilatore mostra anche gli errori che trova durante la
traduzione
Se il linguaggio oggetto e eseguibile da una macchina, un
utente puo eseguirlo per passare da input ad output
Interprete: esegue direttamente le operazioni specificate nel
programma sorgente (traducendo unistruzione alla volta ed
eseguendo il pezzo di programma oggetto generato)
Di solito piu veloce lesecuzione di programmi compilati
Assembler: compilatore da linguaggio assembly a codice
macchina

Docente: Francesca Rossi Automi e Linguaggi Formali


Struttura di un compilatore

Due parti: analisi e sintesi


Analisi (front end): prende un programma e lo divide in parti
su cui impone una struttura grammaticale; crea una
rappresentazione intermedia del programma sorgente; segnala
possibili errori; mette informazioni sul programma in una
tavola dei simboli, da passare alla sintesi
Sintesi (back end): costruisce il programma oggetto dalla
rappresentazione intermedia e la tavola dei simboli
Sequenza di fasi: ogni fase trasforma una rappresentazione del
programma sorgente in unaltra
Fasi principali: analisi lessicale, analisi sintattica, analisi
semantica, generazione del codice intermedio, ottimizzazionee
del codice, generazione del codice

Docente: Francesca Rossi Automi e Linguaggi Formali


Analisi lessicale (scanning)
Legge la stringa di caratteri del programma sorgente e
raggruppa i caratteri in sequenze chiamate lexemi
Per ogni lexema, un token <nome-token,valore-attributo>
nome-token: simbolo associato al token
valore-attributo: punta alla tavola dei simboli
Esempio: comando posizione = iniziale + velocita
* 60
lexema posizione token <id,1>: riga 1 della tavola dei
simboli contiene posizione
lexema = e token <=> (nessun valore attributo)
lexema iniziale e token <id,2>, riga 2 contiene iniziale
lexema + e token <+>
lexema velocita e token <id,3>, riga 3 contiene velocita
lexema * e token <*>
lexema 60 e token <60>
Rappresentazione finale: <id,1> <=> <id,2> <+> <id,3>
<*> <6>
Useremo: linguaggi regolari, automi a stati finiti,
espressioni regolari
Docente: Francesca Rossi Automi e Linguaggi Formali
Analisi sintattica (parsing)

Il parser usa la prima componente dei token per creare una


rappresentazione ad albero della lista di tokens (struttura
grammaticale)
Albero: insieme di nodi e archi diretti (da padre a figlio), tale
che un nodo (radice) non ha padri, e tutti gli altri hanno
esattamente un padre. Foglie: nodi senza figli.
Albero sintattico: nodo interno = operazione, figli =
argomenti dell operazione
Mostra lordine in cui eseguire le operazioni
Useremo: grammatiche libere da contesto, automi a pila,
linguaggi liberi da contesto

Docente: Francesca Rossi Automi e Linguaggi Formali


Esempio
Dalla lista di tokens <id,1> <=> <id,2> <+> <id,3> <*>
<6> allalbero sintattico

=
/ \
<id,1> +
/ \
<id,2> *
/ \
<id,3> 60

Prima dobbiamo moltiplicare il lexema del token <id,3>, cioe


velocita con 60
poi dobbiamo sommare il risultato con il valore di iniziale
poi dobbiamo mettere il risultato nella locazione
dellidentificatore posizione
Docente: Francesca Rossi Automi e Linguaggi Formali
Analisi semantica

Usa lalbero sintattico e la tavola dei simboli per controllare la


consistenza semantica del programma
Colleziona informazioni sui tipi e le mette nella tavola dei
simboli (per la fase di generazione del codice)
Controllo dei tipi (type checking): il tipo di ogni operazione
deve andare daccordo con i tipi dei suoi operandi
Esempio: un indice di un array deve essere un intero (errore se
ad esempio floating-point)
Coercion: conversione di tipo
a volte unoperazione puo essere applicata sia a due interi che
a due floating-point
se un operando e intero e laltro e floating point, lintero
viene convertito in floating-point

Docente: Francesca Rossi Automi e Linguaggi Formali


Esempio

Se posizione, iniziale, e velocita sono dichiarati come


numero floating-point, e se il lexema 60 e un integer, loperazione
* e applicata ad un numero integer (60) e ad un floating-point
(velocita) conversione di 60 in un floating-point. Dallalbero
sintattico di sinistra a quello sulla destra:

= =
/ \ / \
<id,1> + <id,1> +
/ \ / \
<id,2> * <id,2> *
/ \ / \
<id,3> 60 <id,3> inttofloat
|
60

Docente: Francesca Rossi Automi e Linguaggi Formali


Generazione del codice intermedio

Rappresentazione intermedia simile al codice macchina


Spesso codice a tre indirizzi: sequenza di istruzioni simili
allassembly con tre operandi per istruzione
Nellesempio, si ottiene:
t1 = inttofloat(60)
t2 = id3 * t1
t3 = id2 + t2
id1 = t3
Al piu un operatore sulla destra: le istruzioni danno lordine
in cui effettuare le operazioni
Esempio: la moltiplicazione precede la somma
Un nome temporaneo generato per contenere il valore
calcolato da ogni istruzione

Docente: Francesca Rossi Automi e Linguaggi Formali


Ottimizzazione del codice

Miglioramento del codice intermedio per ottenere un migliore


codice oggetto
Migliore: piu veloce, piu corto, meno energia necessaria, ecc.
Esempio: da
t1 = inttofloat(60)
t2 = id3 * t1
t3 = id2 + t2
id1 = t3
a
t1 = id3 * 60.0
id1 = id2 + t1
Conversione da integer a floating-point fatta a a tempo di
compilazione (e non a tempo di esecuzione), e quindi
eliminata dal codice
t3 era usato solo per trasmettere un valore ad id1
Docente: Francesca Rossi Automi e Linguaggi Formali
Generazione del codice
Da rappresentazione intermedia a codice oggetto
Registri o locazioni di memoria per ogni variabile del codice
Da ogni istruzione in codice intermedio a sequenza di
istruzioni in codice macchina
Esempio: da
t1 = id3 * 60.0
id1 = id2 + t1
a
LDF R2, id3
MULF R2, R2, #60.0
LDF R1, id2
ADDF R1, R1, R2
STF id1, R1
Il primo operando specifica una destinazione, F: floating-point
id3 in R2, poi moltiplicazione con 60.0 e risultato in R2, poi
id2 in R1, poi somma di R1 e R2 in R1, poi R1 in id1
Docente: Francesca Rossi Automi e Linguaggi Formali
Strumenti per la costruzione di un compilatore

Generatori di parser: generano automaticamente un parser


dalla descrizione della grammatica di un linguaggio
Generatori di scanner: generano automaticamente un
analizzatore lessicale dalla descrizione tramite espressioni
regolari dei token di un linguaggio
Generatori di generatori di codice: da regole per tradurre ogni
operazione in una sequenza di istruzioni in linguaggio
macchina

Docente: Francesca Rossi Automi e Linguaggi Formali


Ruolo dellanalisi lessicale

Legge i caratteri del programma, li raggruppa in lexemi,


produce in output una sequenza di token per ogni lexema
Quando trova un lexema che rappresenta un indentificatore,
mette il lexema nella tavola dei simboli
Elimina spazi bianchi e commenti
Scanning (compattazione della stringa di caratteri con
eliminazione di commenti e spazi bianchi) seguito da analisi
lessicale (tokens da lexemi)
Diagramma o altro modo di descrivere i lexemi di ogni token
Useremo automi a stati finiti e espressioni regolari
(equivalenti)

Docente: Francesca Rossi Automi e Linguaggi Formali


Token, pattern, lexemi
Token: coppia <nome token, valore attributo>
nome token: simbolo astratto che rappresenta ununita
lessicale (una parola chiave, un identificatore, ecc.)
Pattern: descrizione della forma che i lexemi di un token
possono avere
Esempio: se il token e una parola chiave, il pattern e la
sequenza di caratteri che formano la parola chiave. Per
identificatori, il pattern descrive tante stringhe di caratteri, che
sono tutte identificatori.
Lexema: sequenza di caratteri del programma sorgente che
rispetta il pattern di un token
Esempi:
token if, pattern: caratteri i e f, lexema: if
token id, pattern: una lettera seguita da lettere e cifre, esempi
di lexemi: posizione, iniziale
token number, pattern: un numero, esempi di lexemi:
3.14159, 0, 6.2
Docente: Francesca Rossi Automi e Linguaggi Formali
Casi tipici di token

Un token per ogni parola chiave


Vari token per gli operatori
Un token per tutti gli identificatori
Vari token per le costanti (numeri, letterali, ecc.)
Token per altri simboli (parentesi, virgola, ecc.)
Nome token per dire che token e, valore attributo per indicare
quale lexema come istanza del token.

Docente: Francesca Rossi Automi e Linguaggi Formali


Esempio

Comando Fortran E = M * C ** 2
Token generati:
<id, puntatore ad E nella tavola dei simboli>
<assign-op>
<id, puntatore ad M nella tavola dei simboli>
<mult-op>
<id, puntatore a C nella tavola dei simboli>
<exp-op>
<number, valore intero 2>

Docente: Francesca Rossi Automi e Linguaggi Formali


Input buffering
Esempio: per sapere di essere alla fine di un identificatore,
dobbiamo almeno leggere un carattere che non e ne una
lettera ne una cifra
Esempio (C): < potrebbe essere un operatore oppure linizio
di <=
Esempio (Fortran 90, spazi sono ignorati): nel comando
DO 5 I = 1.25
il primo lexema e DO5I (e un comando di assegnamento),
mentre in
DO 5 I = 1,25
il primo lexema e la parola chiave DO (comando for)
Spesso e necessario leggere oltre la fine di un lexema per
capire che lexema e
Due puntatori per scorrere linput: uno allinizio del lexema
corrente, uno per leggere oltre, finche non si trova un lexema
che corrisponde ad un token
Docente: Francesca Rossi Automi e Linguaggi Formali
Specifica dei token

Linguaggi regolari
Espressioni regolari per descrivere i token
Automi a stati finiti per descrivere analizzatori lessicali
Da espressione regolare ad automa

Docente: Francesca Rossi Automi e Linguaggi Formali

Potrebbero piacerti anche