qualificazione dei nomi (paths)
Post on 19-Jan-2016
58 Views
Preview:
DESCRIPTION
TRANSCRIPT
1
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)
2
Qualificazione dei nomi
Path * (Ide | Loc | met) * Cenv * Heap * Astack path (Ide | Loc | met)
<P,x, ,,> path p’ <o, p’, ,,> naming o’
_________________________________________________
<P o., x, <P o., x, ,,,,> > path path o’o’
top() = (o, _) ____________________________
<this., met, <this., met, ,,, , > > path path oo
< , x, < , x, ,,, , > > path path xx
3
Come trovare il valore di un nome
Expr := Path Id
Expr * Cenv * Heap * Astack expr Val * Heap
<P, met,,,> path p’ <o, p’, ,, > naming v
___________________________________________________
<P o, <P o, ,,, , > > exprexpr<v, <v, >>
i controlli statici garantiscono che il nome (nel frame opportuno) abbia già ricevuto un valore (inizializzazione o assegnamento) prima dell’uso
4
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
5
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
6
Semantica dei blocchi
Com := {Com} (blocco annidato)
Com * Cenv * Heap * Astack com Heap * Astack * Cenv
top() = (x, ) ’=push(pop(), (x, push( , newframe())))
<c, ,, ’> com <’, ’’, ’> top(’’) = (x,’)
<{c}, <{c}, ,,, , > > com com <<’, push(pop(’, push(pop(’’), (x, pop(’’), (x, pop(’))),’))), ’>’>
7
Semantica delle dichiarazioni
Com := Type Id = Expr (dichiarazione)
Com * Cenv * Heap * Astack com Heap * Astack * Cenv
top() = (x, ) = top()
<e, ,, > expr <v, ’> ’= bind(, i, v)
’=push(pop(), (x,push(pop() , ’)))_________________________________________
<t i = e, <t i = e, ,,, , > > com com <<’, ’, ’,’, >>
la bind “modifica” dentro
8
Invocazione di metodi
Com := Path Id (Expr_list)
path trattati come nelle variabili
<P, x, ,, > path p’
Risoluzione del nome:
Ide * (Ide | Loc) * Cenv * Heap fmetIde * Blocco * (Ide | Loc)
9
Risoluzione del nome (nella classe)
Ide * (Ide | Loc) * Cenv * Heap fmetIde * Blocco * (Ide | Loc)
(c) = (c1, _, , _, _) mdefined(f,)_____________________________________________<f, c:Ide, ,> fmet (f)
(c) = (c1, _, , _, _) not mdefined(f,)
<f, c1, ,> fmet md_____________________________________________<f, c:Ide, ,> fmet md
10
Risoluzione del nome (nell’oggetto)
Ide * (Ide | Loc) * Cenv * Heap fmetIde * Blocco * (Ide | Loc)
(l) = (c, _, ) mdefined(f,)_____________________________________________<f, l:Loc, ,> fmet (f)
(l) = (c, _, ) not mdefined(f,)
<f, c, ,> fmet md_____________________________________________<f, c:Ide, ,> fmet md
11
Invocazione di metodi
Com := Id (Expr) un solo argomento
Com * Cenv * Heap * Astack com Heap * Astack * Cenv
Ide * (Ide | Loc) * Cenv * Heap fmet Ide * Blocco * (Ide | Loc)
top() = (x, _) <P,x, ,> path p’
<f, p’, ,> fmet (par, b, y)
<e, ,, > expr <v, ’> = bind(newframe(), par, v)
’ = push(, (y, push(emptystack(), )))<b, ,’, ’> com <’’, ’’, ’>________________________________________________
<P f (e), ,, )> com <’’,pop(’’), ’>
12
Invocazione di metodi: commenti
top() = (x, _) <P,x, ,> path p’
<f, x, ,> fmet (par, b, y)
<e, ,, > expr <v, ’ > = bind(newframe(), par, v)
’ = push(, (y, push(emptystack(), )))
<b, ,’, ’> com <’’, ’’, ’>________________________________________________
<f(e), ,, )> com <’’, pop(’’), ’>
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
top related