1 Espressioni 4 dato che non abbiamo previsto inizializzazioni per le variabili (statiche e di istanza) all’interno delle classi, le espressioni possono comparire solo all’interno dei metodi 4 consideriamo solo alcuni dei casi di espressioni –quelli che riguardano oggetti
2 Espressioni Expr := new Id | (creazione di istanza) Path Id (accesso al valore di una variabile) Path := Path id. | (si parte da Path) this. | (si parte dall’oggetto corrente) (cammino vuoto) 4 Ambigua? No
3 La relazione di transizione per le espressioni Expr := new Id | (creazione di istanza) Path Id (accesso al valore di una variabile) Expr * Cenv * Heap * Astack expr Val * Heap
4 Creazione di oggetti Expr * Cenv * Heap * Astack expr Val * Heap (a) = (_,_,_, , ) l = newloc( ) ’ = instantiate( , l) ’ = copy( ) ’’ = hbind( , l, (a, ’, ’)) ’(a) = (_, b, _) ’= push( , (l, push(emptystack(), newframe()))) com ________________________________________________ expr
5 Creazione di oggetti: commenti (a) = (_,_,_, , ) l = newloc( ) ’ = instantiate( , l) ’ = copy( ) ’’ = hbind( , l, (a, ’, ’)) ’(a) = (_, b, _) ’= push( , (l, push(emptystack(), newframe()))) com ________________________________________________ expr 4 l’oggetto contiene –il nome della classe –una copia del frame delle variabili di istanza –una specializzazione sull’oggetto dell’ambiente di metodi di istanza 4 il costruttore viene eseguito come una invocazione di metodo –non facciamo vedere i possibili effetti “nascosti” sui frames di variabili statiche (modifica di da parte di com )
6 Risoluzione di nomi (semplici) 4 il riferimento ad un identificatore (non qualificato) può in generale essere risolto –nella pila di frames sulla testa dello stack delle attivazioni –nei frames delle variabili di istanza di un oggetto –nei frames di variabili statiche di una classe 4 il modo di effettuare la ricerca dipende da dove essa inizia –un metodo (quello correntemente attivo) –un oggetto –una classe Ide * (Ide | Loc | met) * Cenv * Heap * Astack naming Val
7 Risoluzione di nomi (nella classe) Ide * (Ide | Loc | met) * Cenv * Heap * Astack naming Val (c) = (c1, , _, _, _) defined( , i) _____________________________________________ naming (i) (c) = (c1, , _, _, _) not defined( , i) naming v _____________________________________________ naming v
8 Risoluzione di nomi (nell’oggetto) Ide * (Ide | Loc | met) * Cenv * Heap * Astack naming Val (l) = (c, , _) defined( , i) _____________________________________________ naming (i) (l) = (c, , _) not defined( , i) naming v _____________________________________________ naming v
9 Risoluzione di nomi (nel metodo) Ide * (Ide | Loc | met) * Cenv * Heap * Astack naming Val top( ) = (x, ) = top( ) defined( , i) _____________________________________________ naming (i) top( ) = (x, ) = top( ) not defined( , i) ’ = push(pop( ), (x, pop( ))) naming v _____________________________________________ naming v top( ) = (x, ) empty( ) naming v _____________________________________________ naming v
10 Qualificazione dei nomi (paths) Path := Path id. | (si parte da Path) this. | (si parte dall’oggetto corrente) (cammino vuoto) 4 la semantica di un path determina il punto di partenza di una operazione di naming Path * (Ide | Loc | met) * Cenv * Heap * Astack path (Ide | Loc | met)
11 Qualificazione dei nomi Path * (Ide | Loc | met) * Cenv * Heap * Astack path (Ide | Loc | met) path p’ naming o’ _________________________________________________ path o’ top( ) = (o, _) ____________________________ path o path x
12 Come trovare il valore di un nome Expr := Path Id Expr * Cenv * Heap * Astack expr Val * Heap path p’ naming v ___________________________________________________ expr 4 i controlli statici garantiscono che il nome (nel frame opportuno) abbia già ricevuto un valore (inizializzazione o assegnamento) prima dell’uso
13 I comandi 4 un blocco (corpo di un metodo) è una sequenza di dichiarazioni e comandi (che possono anche essere blocchi nidificati) 4 la composizione sequenziale viene trattata in modo standard –nel costrutto c;cl valutiamo cl nello stato risultante dalla valutazione di c 4 trattiamo anche le dichiarazioni di variabili (locali al metodo) come comandi 4 vediamo solo alcuni casi di comandi –condizionali e loops hanno la semantica vista nel primo corso Com * Cenv * Heap * Astack com Heap * Astack * Cenv
14 Sintassi dei comandi Com := {Com} | (blocco annidato) Path Id = Expr | (assegnamento) Type Id = Expr | (dichiarazione) Path Id (Expr_list) | (invocazione di metodo) Com * Cenv * Heap * Astack com Heap * Astack * Cenv
15 Semantica dei blocchi Com := {Com} (blocco annidato) Com * Cenv * Heap * Astack com Heap * Astack * Cenv top( ) = (x, ) ’=push(pop( ), (x, push( , newframe()))) com top( ’’) = (x, ’) ________________________________________________ com
16 Semantica delle dichiarazioni Com := Type Id = Expr (dichiarazione) Com * Cenv * Heap * Astack com Heap * Astack * Cenv top( ) = (x, ) = top( ) expr ’= bind( , i, v) ’=push(pop( ), (x,push(pop( ), ’))) _________________________________________ com la bind “modifica” dentro