120 likes | 305 Views
Qualificazione dei nomi (paths). Path := Path id. | (si parte da Path) this. | (si parte dall’oggetto corrente) (cammino vuoto) la semantica di un path determina il punto di partenza di una operazione di naming Path * (Ide | Loc | met) * Cenv * Heap * Astack path
E N D
Qualificazione dei nomi (paths) Path := Path id. | (si parte da Path) this. | (si parte dall’oggetto corrente) (cammino vuoto) • 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)
Qualificazione dei nomi Path * (Ide | Loc | met) * Cenv * Heap * Astack path (Ide | Loc | met) <P,x, r, z ,s > path p’ <o, p’, r, z ,s > naming o’ _________________________________________________ <P o., x, r, z ,s > path o’ top(s) = (o, _) ____________________________ <this., met, r, z , s > path o < , x, r, z , s > path x
Come trovare il valore di un nome Expr := Path Id Expr * Cenv * Heap * Astack expr Val * Heap <P, met,r, z ,s > path p’ <o, p’, r, z , s > naming v ___________________________________________________ <P o, r, z , s > expr<v, z > • i controlli statici garantiscono che il nome (nel frame opportuno) abbia già ricevuto un valore (inizializzazione o assegnamento) prima dell’uso
I comandi • un blocco (corpo di un metodo) è una sequenza di dichiarazioni e comandi (che possono anche essere blocchi nidificati) • la composizione sequenziale viene trattata in modo standard • nel costrutto c;cl valutiamo cl nello stato risultante dalla valutazione di c • trattiamo anche le dichiarazioni di variabili (locali al metodo) come comandi • vediamo solo alcuni casi di comandi • condizionali e loops hanno la semantica vista nel primo corso Com * Cenv * Heap * Astack com Heap * Astack * Cenv
Sintassi dei comandi Com := {Com} | (blocco annidato) Path Id = Expr | (assegnamento) Type Id = Expr | (dichiarazione) altri comandi:while-for-…(come nella prima parte) Path Id (Expr_list) | (invocazione di metodo) Com * Cenv * Heap * Astack com Heap * Astack * Cenv
Semantica dei blocchi Com := {Com} (blocco annidato) Com * Cenv * Heap * Astack com Heap * Astack * Cenv top(s) = (x, t) s’=push(pop(s), (x, push(t , newframe()))) <c, r, z, s’> com <z’, s’’,r’> top(s’’) = (x,t’) <{c}, r, z, s> com <z’, push(pop(s’’), (x, pop(t’))),r’>
Semantica delle dichiarazioni Com := Type Id = Expr (dichiarazione) Com * Cenv * Heap * Astack com Heap * Astack * Cenv top(s) = (x, t) j = top(t) <e, r, z, s> expr <v, z’> j’= bind(j, i, v) s’=push(pop(s), (x,push(pop(t) , j’))) _________________________________________ <t i = e, r, z, s> com <z’, s’,r > • la bind “modifica”jdentros
Invocazione di metodi Com := Path Id (Expr_list) • path trattati come nelle variabili <P, x, r, z, s> path p’ • Risoluzione del nome: Ide * (Ide | Loc) * Cenv * Heapfmet Ide * Blocco * (Ide | Loc)
Risoluzione del nome (nella classe) Ide * (Ide | Loc) * Cenv * Heapfmet Ide * Blocco * (Ide | Loc) r(c) = (c1, _, m, _, _) mdefined(f,m) _____________________________________________ <f, c:Ide, r, z> fmet m(f) r(c) = (c1, _, m, _, _) not mdefined(f,m) <f, c1, r, z> fmet md _____________________________________________ <f, c:Ide, r, z> fmet md
Risoluzione del nome (nell’oggetto) Ide * (Ide | Loc) * Cenv * Heapfmet Ide * Blocco * (Ide | Loc) z(l) = (c, _, m) mdefined(f,m) _____________________________________________ <f, l:Loc, r, z> fmet m(f) z(l) = (c, _, m) not mdefined(f,m) <f, c, r, z> fmet md _____________________________________________ <f, c:Ide, r, z> fmet md
Invocazione di metodi Com := Id (Expr) • un solo argomento Com * Cenv * Heap * AstackcomHeap * Astack * Cenv Ide * (Ide | Loc) * Cenv * Heapfmet Ide * Blocco * (Ide | Loc) top(s) = (x, _) <P,x, r, z, s> path p’ <f, p’, r, z> fmet (par, b,y) <e, r, z, s> expr <v, z’> j = bind(newframe(), par, v) s’ = push(s, (y, push(emptystack(), j))) <b, r, z’, s’>com <z’’,s’’, r’> ________________________________________________ <P f (e), r, z, s)> com <z’’,pop(s’’), r’>
Invocazione di metodi: commenti top(s) = (x, _) <P,x, r, z, s > path p’ <f, x, r, z> fmet (par, b,y) <e, r, z, s> expr <v, z’ > j = bind(newframe(), par, v) s’ = push(s, (y, push(emptystack(), j))) <b, r, z’, s’>com <z’’,s’’, r’> ________________________________________________ <f(e), r, z, s)> com <z’’,pop(s’’), r’> • si effettua la ricerca del metodo a partire dalla classe o dall’oggetto contenuti nella testa della pila • si valuta il parametro attuale • si crea un nuovo stack di frames, il cui unico frame contiene l’associazione tra parametro formale e valore del parametro attuale • si pusha sulla pila il record che contiene la classe o l’oggetto associato al metodo e la pila di frames • si valuta il corpo del metodo