1 Le s-espressioni. 2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio.

Slides:



Advertisements
Presentazioni simili
1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
Advertisements

1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Esercizi su alberi binari
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su alberi binari
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Astrazione procedurale ed eccezioni
1 Un esempio con iteratore: le liste ordinate di interi.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento,
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Astrazione di dati Esercizio 1. Si completi l’implementazione Poly.add data a lezione con la specifica e l’implementazione degli ausiliari min e max data.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
Liste di Interi Esercitazione. IntList Lista di interi Problema tipico: memorizzare una sequenza di valori [6,0,9,3….9] Vediamo un tipo di dato utile.
Compitino del 2004 Alberi Generici. Idea Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
1 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
Esercitazione Object, Vettori, Liste. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo lo.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
1 Un esempio: le liste ordinate di interi. 2 Liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 31 Marzo 2004). Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Esercizio 3. Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare i commenti.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
Primo Compitino Terzo Esercizio Implementare il tipo di dato astratto Table un oggetto di tipo Table ha due colonne e un numero variabile di righe.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
Esercizi iteratori. Matrice import java.util.Iterator; public class MatrixIterator implements Iterator { private Matrix matrix; private int currentRow.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 Abbiamo visto come si definiscono insiemi di stringhe, insiemi di interi, insiemi di caratteri, etc.
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
Ex.1 - Astrazioni su Dati Si abbia il tipo di dato stack di interi, IntStack, specificato sotto: public class IntStack { \\ OVERVIEW: uno Stack è una collezione.
1 Tipi di dato modificabili §a livello semantico, riconduciamo la modificabilità alla nozione di variabile l lo stato “modificabile” corrispondente sarà.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

1 Le s-espressioni

2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio LISP –modificabile –la nostra versione è dotata di un iteratore

3 Specifica di Sexpr 1 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) // costruttori public Sexpr () // EFFECTS: inizializza this alla Sexpr vuota public Sexpr (String s) // EFFECTS: inizializza this alla foglia contenente s // metodi public Sexpr cons (Sexpr s) throws NullPointerException // EFFECTS: costruisce un nuovo albero binario che ha // this come sottoalbero sinistro ed s come // sottoalbero destro. Se s è indefinita, // solleva NullPointerException public void rplaca (Sexpr s) throws NotANodeException // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero sinistro // con s. Se this non è un nodo binario solleva // NotANodeException (checked)

4 Specifica di Sexpr 2 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) public void rplacd (Sexpr s) throws NotANodeException // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero destro // con s. Se this non è un nodo binario solleva // NotANodeException (checked) public Sexpr car () throws NotANodeException // EFFECTS: ritorna il sottoalbero sinistro di this. // Se this non è un nodo binario solleva // NotANodeException (checked) public Sexpr cdr () throws NotANodeException // EFFECTS: ritorna il sottoalbero destro di this. // Se this non è un nodo binario solleva // NotANodeException (checked)

5 Specifica di Sexpr 3 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) public boolean nullS () // EFFECTS: ritorna true se this è l’albero vuoto, // altrimenti ritorna false public boolean atom () // EFFECTS: ritorna false se this è un albero binario, // altrimenti ritorna true. public Iterator leaves () // EFFECTS: ritorna un generatore che produrrà le foglie // nella frontiera di this (come Strings), da sinistra a // destra // REQUIRES: this non deve essere modificato finché // il generatore è in uso }

6 Implementazione di Sexpr 1 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; 4 la rep contiene –una variabile boolean che ci dice se l’albero è vuoto oppure consiste di una sola foglia –la variabile stringa che contiene l’eventuale stringa associata alla foglia –due (puntatori a) Sexpr che contengono i sottoalberi sinistro e destro, rispettivamente 4 implementazione ricorsiva

7 Implementazione di Sexpr 2 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; // la funzione di astrazione (ricorsiva!) //  (c) = // se c.foglia && c.stringa = “”, Sexpr vuota // se c.foglia && c.stringa = s, foglia s // altrimenti è l’albero che ha come sottoalberi // sinistro e destro  (c.sinistro) e  (c.destro) // l’invariante di rappresentazione (ricorsivo!) // I (c) = c.foglia oppure // (!c.foglia e c.sinistro != null e c.destro != null // e I (c.sinistro) e I (c.destro))

8 Implementazione di Sexpr 3 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; // costruttori public Sexpr () // EFFECTS: inizializza this alla Sexpr vuota {foglia = true; stringa = ""; } public Sexpr (String s) // EFFECTS: inizializza this alla foglia contenente s {foglia = true; stringa = s; }

9 Implementazione di Sexpr 3.1 public class Sexpr { private boolean foglia; private Sexpr sinistro, destro; private String stringa; //  (c) = // se c.foglia && c.stringa = “”, Sexpr vuota // se c.foglia && c.stringa = s, foglia s // altrimenti è l’albero che ha come sottoalberi // sinistro e destro  (c.sinistro) e  (c.destro) // I (c) = c.foglia oppure // (!c.foglia e c.sinistro != null e c.destro != null // e I (c.sinistro) e I (c.destro)) public Sexpr () // EFFECTS: inizializza this alla Sexpr vuota {foglia = true; stringa = ""; }  l’invariante è soddisfatto ( foglia è true ) 4 la specifica è soddisfatta  (c) = Sexpr vuota, perché foglia && stringa = “”

10 Implementazione di Sexpr 3.2 public class Sexpr { private boolean foglia; private Sexpr sinistro, destro; private String stringa; //  (c) = // se c.foglia && c.stringa = “”, Sexpr vuota // se c.foglia && c.stringa = s, foglia s // altrimenti è l’albero che ha come sottoalberi // sinistro e destro  (c.sinistro) e  (c.destro) // I (c) = c.foglia oppure // (!c.foglia e c.sinistro != null e c.destro != null // e I (c.sinistro) e I (c.destro)) public Sexpr (String s) // EFFECTS: inizializza this alla foglia contenente s {foglia = true; stringa = s; }  l’invariante è soddisfatto ( foglia è true ) 4 la specifica è soddisfatta  (c) = foglia s, perché foglia && stringa = s

11 Implementazione di Sexpr 4 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; public Sexpr cons (Sexpr s) throws NullPointerException // EFFECTS: costruisce un nuovo albero binario che ha // this come sottoalbero sinistro ed s come // sottoalbero destro. Se s è indefinito, // solleva NullPointerException {if (s == null) throw new NullPointerException (“Sexpr.cons”); Sexpr nuovo = new Sexpr(); nuovo.sinistro = this; nuovo.destro = s; nuovo.foglia = false; return nuovo; }

12 Implementazione di Sexpr 4.1 public class Sexpr { private boolean foglia; private Sexpr sinistro, destro; private String stringa; // I (c) = c.foglia oppure // (!c.foglia e c.sinistro != null e c.destro != null // e I (c.sinistro) e I (c.destro)) public Sexpr cons (Sexpr s) throws NullPointerException {if (s == null) throw new NullPointerException (“Sexpr.cons”); Sexpr nuovo = new Sexpr(); nuovo.sinistro = this; nuovo.destro = s; nuovo.foglia = false; return nuovo; } 4 !nuovo.foglia 4 nuovo.sinistro != null e nuovo.destro != null  I (nuovo.sinistro) e I (nuovo.destro), perché per induzione I (this) e I (s)

13 Implementazione di Sexpr 4.2 public class Sexpr { private boolean foglia; private Sexpr sinistro, destro; private String stringa; //  (c) = // se c.foglia && c.stringa = “”, Sexpr vuota // se c.foglia && c.stringa = s, foglia s // altrimenti è l’albero che ha come sottoalberi // sinistro e destro  (c.sinistro) e  (c.destro) public Sexpr cons (Sexpr s) throws NullPointerException // EFFECTS: costruisce un nuovo albero binario che ha // this come sottoalbero sinistro ed s come // sottoalbero destro. Se s è indefinito, // solleva NullPointerException {if (s == null) throw new NullPointerException (“Sexpr.cons”); Sexpr nuovo = new Sexpr(); nuovo.sinistro = this; nuovo.destro = s; nuovo.foglia = false; return nuovo; }  correttezza ovvia

14 Come è fatta una Sexpr 4 vediamo l’albero prodotto dalla espressione (((((new Sexpr("a")).cons(new Sexpr("a"))). cons((new Sexpr("c")).cons(new Sexpr("a")))). cons((new Sexpr()).cons((new Sexpr()).cons(new Sexpr("b")))))) F F “a” F FF T TF T T T T T “” “b” “c” “”

15 Come è fatta una Sexpr 2 4 sottoalberi possono essere condivisi Sexpr s1 = new Sexpr("a"); Sexpr s2 = s1.cons(s1); F T“a”

16 Implementazione di Sexpr 5 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; public void rplaca (Sexpr s) throws NotANodeException // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero sinistro // con s. Se this non è un nodo binario solleva // NotANodeException (checked) {if (foglia) throw new NotANodeException("Sexpr.rplaca"); sinistro = s; return; }

17 Come è fatta una Sexpr 3  usando le operazioni che modificano ( rplaca e rplacd ) si possono costruire strutture cicliche Sexpr s1 = new Sexpr("a"); Sexpr s2 = new Sexpr(”b"); Sexpr s3 = s1.cons(s2); s3.rplaca(s3); F T“a”T“b”

18 Implementazione di Sexpr 5.1 public class Sexpr { private boolean foglia; private Sexpr sinistro, destro; private String stringa; // I (c) = c.foglia oppure // (!c.foglia e c.sinistro != null e c.destro != null // e I (c.sinistro) e I (c.destro)) public void rplaca (Sexpr s) throws NotANodeException {if (foglia) throw new NotANodeException("Sexpr.rplaca"); sinistro = s; return; } 4 l’invariante non è soddisfatto! –foglia è false –destro non è modificato –sinistro soddisfa l’invariante per induzione ma nessuno ci garantisce che valga sinistro != null –dobbiamo modificare specifica e implementazione per garantire che valga s != null

19 Implementazione di Sexpr public class Sexpr { private boolean foglia; private Sexpr sinistro, destro; private String stringa; // I (c) = c.foglia oppure // (!c.foglia e c.sinistro != null e c.destro != null // e I (c.sinistro) e I (c.destro)) public void rplaca (Sexpr s) throws NotANodeException, NullPointerException {if (foglia) throw new NotANodeException("Sexpr.rplaca"); if (s == null) throw new NullPointerException("Sexpr.rplaca"); sinistro = s; return; } 4 ora l’invariante è soddisfatto 4 le dimostrazioni servono anche a trovare gli errori!

20 Implementazione di Sexpr 5.2 public class Sexpr { private boolean foglia; private Sexpr sinistro, destro; private String stringa; //  (c) = // se c.foglia && c.stringa = “”, Sexpr vuota // se c.foglia && c.stringa = s, foglia s // altrimenti è l’albero che ha come sottoalberi // sinistro e destro  (c.sinistro) e  (c.destro) public void rplaca (Sexpr s) throws NotANodeException // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero sinistro // con s. Se this non è un nodo binario solleva // NotANodeException (checked). Se s è indefinito solleva // NullPointerException {if (foglia) throw new NotANodeException("Sexpr.rplaca"); if (s == null) throw new NullPointerException("Sexpr.rplaca"); sinistro = s; return; } 4 soddisfa chiaramente la specifica

21 Implementazione di Sexpr 6 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; public void rplacd (Sexpr s) throws NotANodeException // MODIFIES: this // EFFECTS: rimpiazza in this il sottoalbero destro // con s. Se this non è un nodo binario solleva // NotANodeException (checked). Se s è indefinito solleva // NullPointerException {if (foglia) throw new NotANodeException("Sexpr.rplacd"); if (s == null) throw new NullPointerException("Sexpr.rplacd"); destro = s; return; }  cambiata come rplaca

22 Implementazione di Sexpr 7 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; public Sexpr car () throws NotANodeException // EFFECTS: ritorna il sottoalbero sinistro di this. // Se this non è un nodo binario solleva // NotANodeException (checked) {if (foglia) throw new NotANodeException("Sexpr.car"); return sinistro; } public Sexpr cdr () throws NotANodeException // EFFECTS: ritorna il sottoalbero destro di this. // Se this non è un nodo binario solleva // NotANodeException (checked) {if (foglia) throw new NotANodeException("Sexpr.cdr"); return destro; }

23 Implementazione di Sexpr 8 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; public boolean nullS () // EFFECTS: ritorna true se this è l’albero vuoto, // altrimenti ritorna false. {if (! foglia) return false; if (stringa == "") return true; return false; } public boolean atom () // EFFECTS: ritorna false se this è un albero binario, // altrimenti ritorna true. {return foglia;}

24 Implementazione di Sexpr 9 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; public Iterator leaves () // REQUIRES: this non deve essere ciclico // EFFECTS: ritorna un generatore che produrrà le foglie // nella frontiera di this (come Strings), da sinistra a // destra // REQUIRES: this non deve essere modificato finché // il generatore è in uso {return new LeavesGen(this,numerofoglie());} private int numerofoglie () { if (foglia) {if (stringa == "") {return 0; } else {return 1; } } try {return (car().numerofoglie() + cdr().numerofoglie()); } catch (NotANodeException e) {return 0; } } 4 il try & catch solo per evitare di dichiarare l’eccezione!

25 Implementazione del generatore di Sexpr 1 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; private static class LeavesGen implements Iterator { private LeavesGen figlio; // sottogeneratore corrente private Sexpr io; // il mio albero private int quanti; // numero di elementi ancora da generare // la funzione di astrazione (ricorsiva!) //  (c) = se c.quanti = 0 allora [], // se c.quanti = 1 allora [c.io.stringa], // altrimenti  (c.figlio) +  (LeavesGen(c.destra))

26 Implementazione del generatore di Sexpr 2 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; private static class LeavesGen implements Iterator { private LeavesGen figlio; // sottogeneratore corrente private Sexpr io; // il mio albero private int quanti; // numero di elementi ancora da generare // l’invariante di rappresentazione // I (c) = (c.quanti = 0 e c.io.foglia e // c.io.stringa = “”) oppure // (c.quanti = 1 e c.io.foglia e c.io.stringa != “”) // oppure // (c.quanti > 0 e c.io != null e c.figlio != null e // c.quanti = c.figlio.quanti + // c.io.destra.numerofoglie())

27 Esercizio per casa  implementare repOK e toString per il generatore e provarli su qualche esempio per vedere se sono giusti

28 Implementazione del generatore di Sexpr 3 public class Sexpr { // OVERVIEW: una Sexpr è un albero binario modificabile // che ha sulle foglie atomi (stringhe) private boolean foglia; private Sexpr sinistro, destro; private String stringa; private static class LeavesGen implements Iterator { private LeavesGen figlio; // sottogeneratore corrente private Sexpr io; // il mio albero private int quanti; // numero di elementi ancora da generare LeavesGen (Sexpr s,int n) { //REQUIRES: s != null quanti = n; if (quanti > 0) {io = s; if (io.foglia) return; try {figlio = new LeavesGen(io.car(), io.car().numerofoglie()); } catch (NotANodeException e) {} return; } 4 il try & catch solo per evitare di dichiarare l’eccezione!

29 Implementazione del generatore di Sexpr 4 public class Sexpr { private boolean foglia; private Sexpr sinistro, destro; private String stringa; private static class LeavesGen implements Iterator { private LeavesGen figlio; // sottogeneratore corrente private Sexpr io; // il mio albero private int quanti; // numero di elementi ancora da generare public boolean hasNext() { return quanti > 0;} public Object next () throws NoSuchElementException { if (quanti == 0) throw new NoSuchElementException("Sexpr.leaves"); quanti--; if (io.foglia) {return io.stringa;} try {return figlio.next(); } catch (NoSuchElementException e) {} try {figlio = new LeavesGen(io.cdr(), io.cdr().numerofoglie()); return figlio.next(); } catch (NotANodeException e) { throw new NoSuchElementException("Sexpr.leaves");}