Compilatori 2008
docente: Fausto Spoto fausto.spoto@univr.it o su skype
fausto.spoto
collaboratore didattico: Andrea Turrini
Il compilatore Kitten versione 25/1/2008 (funziona solo su Java 1.5 o superiore)
L'analizzatore di grammatiche GRAN e la sua
documentazione, di
Enrico Masserdotti: emasserdotti AT gmail DOT com
Documentazione della libreria BCEL
Sito da cui scaricare il graphviz per il formato .dot
Il manuale ufficiale della Java Virtual Machine
Making Compiler Design Relevant for Students who will (Most Likely) Never Design a Compiler di Saumya Debray
Dispensa
Testi d'esame (alcuni sono troppo vecchi per il programma attuale!):
24 giugno 2002 postscript,
pdf
3 luglio 2002 postscript,
pdf
6 settembre 2002 postscript,
pdf
20 dicembre 2002 postscript,
pdf
2 aprile 2003 postscript,
pdf
23 giugno 2003 postscript,
pdf
25 luglio 2003 postscript,
pdf
24 settembre 2003 postscript,
pdf
10 ottobre 2003 postscript,
pdf
12 dicembre 2003 postscript,
pdf
26 marzo 2004 postscript,
pdf
2 aprile 2004 postscript,
pdf
21 giugno 2004 postscript,
pdf
5 luglio 2004 postscript,
pdf
21 settembre 2004 postscript,
pdf
1 aprile 2005 postscript,
pdf
20 giugno 2005 postscript,
pdf,
soluzione esercizi 2-3
4 luglio 2005 postscript,
pdf,
soluzione esercizi 2-3
5 settembre 2005 postscript,
pdf
5 ottobre 2005 postscript,
pdf
12 dicembre 2005 postscript,
pdf
31 marzo 2006 postscript,
pdf
19 giugno 2006 postscript,
pdf
3 luglio 2006 postscript,
pdf
29 settembre 2006 postscript,
pdf
5 ottobre 2006 postscript,
pdf
31 ottobre 2006 postscript,
pdf
15 dicembre 2006 postscript,
pdf
27 giugno 2007 postscript,
pdf
Lezione 1 (28 gennaio 2008, ore 14:30-16:30)
introduzione al corso
i compilatori
esempi di programmi Kitten
espressioni, comandi, valori, tipi
relazione di sottotipo
Lezione 2 (29 gennaio 2008, ore 14:30-16:30)
analisi lessicale, token, espressioni regolari
JLex: specifica di token e azioni
da espressioni regolari ad automa finito non deterministico e poi deterministico
Laboratorio 1 (1 febbraio 2008, ore 8:30-10:30)
Si parta da questo codice, che include
JLex e JavaCup. Si modifichi Exp.lex in modo
che riconosca numeri interi positivi, i simboli delle quattro operazioni e
scarti gli spazi. Si ricordi che i token vanno enumerati dentro
sym.java. Quindi si compili:
java JLex.Main Exp.lex
mv Exp.lex.java Yylex.java
Fatto questo, scrivete delle regole di grammatica dentro
Exp.cup in modo da generare delle espressioni aritmetiche con notazione
prefissa. Per compilare:
java java_cup.Main -parser Parser <Exp.cup
javac Parser.java
e quindi testatelo con:
java Parser test
Infine, cercate di fargli calcolare il valore dell'espressione aritmetica,
usando delle decorazioni delle regole di grammatica.
Soluzione: Exp.lex e Exp.cup
Lezione 3 (4 febbraio 2008, ore 14:30 - 16:30)
grammatiche
grammatica per Kitten
leftvalue e rightvalue
Lezione 4 (5 febbraio 2008, ore 14:30 - 16:30)
forme sentenziali annullabili
definizione composizionale dell'annullabilità
calcolo degli annullabili
inizi di una forma sentenziale
definizione composizionale degli inizi
calcolo degli inizi per i non terminali
definizione dei seguiti
calcolo dei seguiti dei non terminali
insiemi discriminanti per il parsing a discesa ricorsiva
tabella e parsing LL(1)
Laboratorio 2 (8 febbraio 2008, ore 8:30-10:30)
Si completi la classe Binary.kit
scrivendola nella directory testcases. Dovrete aggiungere il
costruttore, che costruisce un numero binario rappresentato in modo inverso
come una lista (la testa della lista è il bit meno significativo);
il metodo toString(), che restituisce una stringa che rappresenta
il numero binario (nel senso solito), e il metodo main(), che crea
il numero binario 815, lo trasforma in stringa, aggiunge un new-line e stampa
il risultato a video. Quindi si provi a compilare tale classe
e ad eseguirla.
Soluzione: Binary.kit
Lezione 5 (11 febbraio 2008, ore 14:30 - 16:30)
gerarchia LL
esercizi sul parsing LL(1)
item LR(0)
chiusura di un insieme di item e stati LR(0)
automa a pila: azioni di spostamento, riduzione, accettazione
Lezione 6 (12 febbraio 2008, ore 14:30 - 16:30)
costruzione della tabella LR(0)
esempio di parsing LR(0)
il parsing SLR
esempio di parsing SLR
Laboratorio 3 (15 febbraio 2008, ore 8:30-10:30)
- Si aggiungano a Kitten
i token SAME e SUPER
che rappresentano le stringhe omonime. Occorre sia modificare
lexical/Kitten.lex che l'enumerazione in syntactical/sym.java
che il lexical/Main_lexical.jav (si ricordi di eseguire
make lexical alla fine)
- Si verifichi che tali token siano
effettivamente riconosciuti provando a compilare
Data.kit e
Giorno.kit
- Se l'analisi lessicale funziona, si passi a modificare la grammatica
in syntactical/Kitten.cup in modo da dare la possibilità
(facoltativa) di cominciare un costruttore con
same oppure super. Non si aggiungano azioni semantiche alla
grammatica, è ancora troppo presto!
- Si esegua make syntactical
e si verifichi che i file
Data.kit e
Giorno.kit vengano compilati senza errori
di sintassi.
Soluzione: Kitten.lex e
Kitten.cup.
Lezione 7 (18 febbraio 2008, ore 14:30-16:30)
item LR(1)
costruzione della tabella LR(1)
Automa e tabella LALR(1)
Lezione 8 (19 febbraio 2008, ore 14:30-16:30)
Azioni semantiche associate alle produzioni
Esempi di decorazione di una grammatica con azioni semantiche
Uso delle azioni semantiche per costruire la sintassi astratta del
codice sorgente
Struttura e classi della sintassi astratta Kitten
Laboratorio 4 (22 febbraio 2008, ore 8:30-10:30)
Si modifichi la classe di sintassi astratta per la dichiarazione di un
costruttore in Kitten in modo da fare spazio all'eventuale presenza di
un super o same all'inizio del corpo del costruttore.
Si aggiungano solo i campi necessari e si modifichi il metodo
toDot() per la stampa della sintassi astratta come grafo.
Si modifichino quindi le azioni semantiche in modo che venga
creata tale classe di sintassi astratta estesa per i costruttori.
Si verifichi che tutto funzioni dando il make syntactical e
compilando i soliti esempi
Data.kit e
Giorno.kit e controllando
che il grafo di sintassi astratto sia sensato.
Dovreste ottenere qualcosa che rassomiglia a questo grafo
e a quest'altro.
Lezione 9 (25 febbraio 2008)
Gerarchia di parsing delle grammatiche
Il parsing con grammatiche ambigue: il caso delle espressioni aritmetiche
Analisi semantica: sue funzioni
Classi per i tipi semantici di Kitten
Analisi semantica delle espressioni di tipo Kitten
Analisi semantica delle espressioni Kitten piú semplici
Lezione 10 (26 febbraio 2008)
Analisi semantica delle espressioni Kitten piú complesse
Implementazione dell'analisi semantica delle espressioni
Analisi semantica dei comandi Kitten
Lezione 11 (29 febbraio 2008)
Implementazione dell'analisi semantica dei comandi Kitten
Analisi semantica della dichiarazione di metodi e costruttori
Esercizi sull'analisi semantica
Laboratorio 5 (7 marzo 2008, ore 8:30-10:30)
Inizio dell'implementazione dell'analisi semantica delle direttive
same e super
Laboratorio 6 (13 marzo 2008, ore 8:30-12:30)
Generazione del codice bytecode
Inizio dell'implementazione
della generazione del codice bytecode per le direttive
same e super
Corso integrativo su Z
- Lucidi: lec1.pdf,
lec21.pdf,
lec22.pdf,
lec23.pdf
- Lucidi: lect3.pdf,
FestivalFoods.pdf
- Lucidi: lect4.pdf,
GlossayofZnotation.pdf,
employmentExchange.pdf
- Lucidi: lect51.pdf,
lect52.pdf,
refcard.pdf,
ztcman.pdf,
zansman.pdf
- Lucidi: lect6.pdf