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)

    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