Compilatori 2005

docente: Fausto Spoto
fausto.spoto@univr.it

Il compilatore Kitten versione 0.01

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


Lucidi:


Testi d'esame:
  • 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
    Lezione 1 (11 gennaio 2005)
  • introduzione al corso
  • compilatori, fasi di compilazione.
  • esempi dei risultati parziali delle fasi di compilazione
  • esempi di programmi Kitten
    Laboratorio 1 (12 gennaio 2005)
  • installazione di Kitten
  • esempi di utilizzo e compilazione in Kitten
    Lezione 2 (14 gennaio 2005)
  • espressioni regolari
  • traduzione in automi a stati finiti
  • implementazione dell'analisi lessicale di Kitten
    Lezione 3 (21 gennaio 2005)
  • parsing discendente ricorsivo
  • insiemi NULLABLE, FIRST e FOLLOW
    Laboratorio 2 (25 gennaio 2005)
  • aggiungere al linguaggio Kitten i token Questo si ottiene modificando il file Syntactical/sym.java in modo da aggiungervi cinque nuovi token, enumerati con una costante diversa da quelle già usate. Bisogna quindi inserire le espressioni regolari per i nuovi token dentro Lexical/Kitten.lex e aggiungere la stringa che va stampata per i nuovi token dentro Lexical/Main_lexical.java. Infine, compilate con make clean (per cancellare tutto) seguito da make lexical.
    Provate il risultato su un file sorgente Kitten da voi creato e contenente i nuovi token!
    Lezione 4 (26 gennaio 2005)
  • esercizi sul parsing discendente ricorsivo
  • gerarchia di grammatiche LL(k)
  • automi a pila
  • item LR(0), chiusura di un insieme di item
  • costruzione dell'automa LR(0)
    Lezione 5 (28 gennaio 2005)
  • costruzione della tabella LR(0)
  • esercizi di parsing LR(0)
  • parsing SLR
  • esercizi di parsing SLR
    Lezione 6 (4 febbraio 2005)
  • parsing LR(0) ed SLR con epsilon-produzioni
  • item LR(1)
  • costruzione dell'automa LR(1)
  • costruzione delle tabella LR(1)
    Laboratorio 3 (8 febbraio 2005)
  • l'analisi sintattica di Kitten: lucidi
  • aggiunta a Kitten delle produzioni sintattiche per Questo si ottiene modificando le produzioni grammaticali dentro Syntactical/Kitten.cup. Si noti che: Quindi si compili con make syntactical. Eventuali errori sono scritti dentro al file Syntactical/Kitten.err. Si noti che i post-incremento e post-decremento possono essere sia espressioni che comandi. La sintassi deve essere scelta in modo che i seguenti sorgenti siano riconosciuti come legali: Switch1.kit, Switch2.kit, Switch3.kit e Cifra2.kit. Invece questi sorgenti devono provocare un syntax error: Errore1.kit, Errore2.kit e Errore3.kit. Si noti che i case dello switch sono espressioni arbitrarie!


    Lezione 7 (9 febbraio 2005)

  • parsing LALR(1)
  • esercizi sul parsing LR(1) ed LALR(1)
  • gerarchia di grammatiche LR(k)
  • gerarchia complessiva delle grammatiche
  • parsing con grammatiche ambigue, associatività e precedenze
    Lezione 8 (11 febbraio 2005)
  • esercizi sul parsing LL(1), SLR, LR(0) ed LR(1)
  • classi di sintassi astratta
  • generazione dell'albero di sintassi astratta con parsing LL ed LR
  • visione d'insieme delle classi di sintassi astratta di Kitten
    Laboratorio 4 (15 febbraio 2005)
  • classi di sintassi astratta di Kitten
  • implementazione delle classi di sintassi astratta per Occorre creare delle classi di sintassi astratta dentro la directory Absyn. Fate attenzione a dove metterle nella gerarchia globale. Post-incremento e post-decremento possono essere sia comandi che espressioni, e quindi danno origine a due classi di sintassi astratta ciascuno, sotto Expression e sotto Command, rispettivamente.

    Date a queste classi un metodo fittizio:

    public Bytecode translate() { return null; }

    dove Bytecode sta per Bytecode.Bytecode.

    Scrivete delle azioni semantiche sotto le produzioni di sintassi concreta inserite nel laboratorio precedente dentro al file Syntactical/Kitten.cup, e dichiarate il tipo di ritorno di eventuali nuovi non terminali che sono stati introdotti. Infine compilate con make syntactical.

    Compilando i file di esempio del laboratorio precedente, si dovrebbero generare dei file .dot che, una volta trasformati in postscript, visualizzano anche le nuove classi di sintassi astratta.


    Lezione 9 (16 febbraio 2005)

  • approfondimenti sulle classi di sintassi astratta di Kitten
  • analisi semantica e type-checking: motivazione e fasi
  • linguaggi non tipati, debolmente tipati, fortemente tipati
  • tipi Kitten
  • fase 1 del type-checking: costruzione dei tipi Kitten dalla loro sintassi astratta
  • Lucidi sull'analisi semantica
    Lezione 10 (18 febbraio 2005)
  • fase 2 del type-checking:
  • giudizi e regole
  • regole per le classi astratte di Kitten
  • implementazione delle regole di type-checking
  • controllo dell'accesso alle costanti
  • controllo della posizione di break e continue
    Laboratorio 5 (22 febbraio 2005)
  • specifica e implementazione del type-checking per Questo si ottiene in varie fasi:
    Lezione 11 (23 febbraio 2005)
  • esercizi sul type-checking
  • il bytecode Kitten:
  • Lucidi sul bytecode Kitten.
    Lezione 12 (25 febbraio 2005)
  • eserici sul bytecode sequenziale
  • chiamata e ritorno da metodo nel bytecode Kitten
  • blocchi di base: linkati, condizionali e finali
  • esercizi sul bytecode Kitten non sequenziale
    Laboratorio 6 (1 marzo 2005)

    Modifica del type-checking in modo da permettere ai break di comparire nel corpo dei case.


    Lezione 13 (4 marzo 2005)

  • generazione del codice intermedio per le espressioni: tipo statico e contesto
  • generazione del codice intermedio per i leftvalue visti come espressioni
  • lucidi sulla generazione del codice intermedio
    Laboratorio 7 (8 marzo 2005)
  • implementazione della generazione del codice intermedio per visti come espressioni.

    Suggerimento:


    Lezione 14 (9 marzo 2005)
  • la generazione del codice intermedio per la scrittura nei leftvalue
  • la generazione del codice intermedio per i comandi
  • esercizi sulla generazione del codice intermedio
    Lezione 15 (11 marzo 2005)
  • la generazione del codice intermedio per break e continue
  • esercizi sulla generazione del codice intermedio
  • la generazione del codice oggetto Java bytecode
  • lucidi sulla generazione del codice oggetto Java bytecode
    Progetto

    Continuate il lavoro dei laboratori:

    Menzione speciale della giuria

    Un bonus di ben tre punti verrà accordato al gruppo che consegnerà entro la mezzanotte del 3 aprile un progetto che compila correttamente il file Gara.kit generando un file Gara.class più piccolo di quello dei concorrenti. A parità di dimensione, vince chi ha consegnato prima.