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

Slides:



Advertisements
Presentazioni simili
/ fax
Advertisements

1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
Interfacce Java.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Alcune Classi Standard Object, Vettori. Esercizio dellultima volta Superclasse Persona Sottoclasse Libro.
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.
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 la competenza alfabetica della popolazione italiana CEDE distribuzione percentuale per livelli.
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel.
Esempio: Tombola! Parte seconda.
Unified Modeling Language class C {…} class B extends C {…} Esiste una notazione grafica per mostrare le relazioni di ereditarietà. Object StringC B Tutte.
Richiami di Java Multithreading. Threads (subclassing) public class A { public void a_method { C t = new C(); //C t = new C(String name); t.start(); …
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
// PROTOTIPI void costruisciLista(Pnodo &, string &); void stampaLista(Pnodo ); void creaNodo (int, Pnodo&); Pnodo inserisciNodoTesta (int,Pnodo &); Pnodo.
Algoritmi e strutture dati Dizionari Alberi binari di ricerca (BST)
6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
1 Implementazione di Linguaggi 2 PARTE 6 Implementazione di Linguaggi 2 PARTE 6 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
1 Meccanismi per la definizione di tipi di dato §la programmazione di applicazioni consiste in gran parte nella definizione di nuovi tipi di dato §un qualunque.
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.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Programmazione distribuita in Java
Ricerca di una chiave: Search(x, k) if x == nil or k == x.key return x
22 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ore 10:00.
OUTPUT FORMATTATO La funzione printf consente di effettuare la stampa a video formattata. Sintassi: printf ( stringa_formato, arg0, arg1, … ); La stringa.
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2003/2004.
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
Realizzazione Grammatica non contestuale –no ricorsioni sinistre –LL(1) produzione individuata dal primo token Ogni non-terminale -> funzione –rappresenta.
1 Questionario di soddisfazione ATA - a. sc. 2008/09 Il questionario è stato somministrato nel mese di aprile Sono stati restituiti 29 questionari.
IN OGNI LUOGO, IN OGNI TEMPO… CON MINIMI VINCOLI TECNOLOGICI… DISPONIBILITA’ DELL’ INFORMAZIONE… IN OGNI LUOGO, IN OGNI TEMPO… CON MINIMI VINCOLI.
1101 = x 10 x 10 x x 10 x = CORRISPONDENZE
Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,
Ad opera di: Matteo Donatelli e Maurizio Di Paolo Presentazione su : Elettropneumatica 1.
1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java.
Bando di Residenza Cap Scheda ENTE 3ROL - Richieste On Line.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Pippo.
Bando Pittori e Scultori in Piemonte alla metà del ‘700
Stack Già visto l’altra volta senza gestione eccezioni, le prime tre slide servono solo come ripasso, dalla quarta argomento nuovo class Stack { int data[];
lun mar mer gio ven SAB DOM FEBBRAIO.
Sintassi: Programma e classi Program::=prog {ClassDeclList {StatList}} ClassDeclList::=ClassDecl ClassDeclList |  ClassDecl::=class Ide c [StaticMetDefList]
1 Un esempio con iteratore: le liste ordinate di interi.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
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 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.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
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.
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 Le s-espressioni. 2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio.
Esercizio 3. Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare i commenti.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
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.
Esercizi iteratori. Matrice import java.util.Iterator; public class MatrixIterator implements Iterator { private Matrix matrix; private int currentRow.
1 Un esempio con iteratore: le liste ordinate di interi.
Sommario cos’è un tipo di dato astratto astrazione tramite specifica:
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

1 Le s-espressioni

2 Un nuovo esempio completo: le s-espressioni 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 è indefinito, // 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 () throws NullPointerException // EFFECTS: ritorna true se this è lalbero vuoto, // altrimenti ritorna false. Se this è indefinito solleva // NullPointerException public boolean atom () throws NullPointerException // EFFECTS: ritorna false se this è un albero binario, // altrimenti ritorna true. Se this è indefinito solleva // NullPointerException 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 lalbero è vuoto oppure consiste di una sola foglia –la variabile stringa che contiene leventuale 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 è lalbero che ha come sottoalberi // sinistro e destro (c.sinistro) e (c.destro) // linvariante 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 è lalbero 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 = ""; } linvariante è 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 è lalbero 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; } linvariante è 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 this o s sono indefiniti, // 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 è lalbero 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 lalbero 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 a a a b c

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

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 TaTb

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 linvariante è soddisfatto –foglia è false –destro non è modificato –sinistro soddisfa linvariante per induzione

19 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 è lalbero 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) {if (foglia) throw new NotANodeException("Sexpr.rplaca"); sinistro = s; return; } 4 soddisfa chiaramente la specifica

20 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) {if (foglia) throw new NotANodeException("Sexpr.rplacd"); destro = s; return; }

21 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; }

22 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 () throws NullPointerException // EFFECTS: ritorna true se this è lalbero vuoto, // altrimenti ritorna false. {if (! foglia) return false; if (stringa == "") return true; return false; } public boolean atom () throws NullPointerException // EFFECTS: ritorna false se this è un albero binario, // altrimenti ritorna true. return foglia;}

23 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 leccezione!

24 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))

25 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 // linvariante 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())

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

27 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 leccezione!

28 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");}