Title: Sintassi e Semantica Nucleo di C:
1Sintassi e SemanticaNucleo di C
- Espressioni
- numeriche
- booleane
- Comandi
- assegnamento
- condizionale
- iteratore
- sequenza di istruzioni
- blocco
- Dichiarazioni
Costrutti comuni a tutti i linguaggi imperativi
2Esempio
3Un altro esempio
int main() int x9 (1) int y3
(2) if (xgty) int zx (3)
xz-y else xy (4)
yz (5)
dichiarazioni
blocco
condizionale
assegnamento
Notare il blocco la dichiarazione e luso di z.
È corretto? Ha senso?
4Lo stack (o pila )(proprio quella dei piatti che
avete lavato ieri sera)
- Lo stack è una sequenza di elementi in cui è
definito un particolare ordine di manipolazione
degli elementi. - Definiamo
- lo stack vuoto è la particolare pila che non
contiene elementi (indicata con nil, EmptyStack,
?, ecc.) - la testa dello stack (top dello stack) calcola
lultimo elemento inserito, non modifica lo stack - pop calcola lelemento in testa allo stack e
modifica lo stack eliminando lelemento in testa. - push inserisce un elemento in testa allo stack,
nel seguito push è indicata con .. Modifica lo
stack.
5Esempi di stack e operazioni
testa
pop(s)6
pop(nil) ? (indefinito) è una situazione di
errore
6Lo stato
- Nella semantica che vedremo per il C utilizzeremo
i seguenti domini - Ide gli identificatori validi del C,
- Val gli interi
- DenLoc ? FunctDecl ? Unbound.
- Loc gli indirizzi delle locazioni di memoria
(sono naturali) - FunctDecl le dichiarazioni di funzione (le
vedremo più avanti
7Lo stato
- Lo stato ha 2 componenti
- Lambiente (nel seguito indicato con s) che è
uno stack di frame. I frame in questo caso
rappresentano funzioni da Ide in Den. - La memoria (nel seguito indicato con m) che è
una funzione dal Loc -gt Val. Anche la memoria è
un frame.
8Operazioni sulle strutture dello stato(Frame)
- Ricerca
- ?(i) per gli elementi dello stack, ha tipo ? x
Ide ? Den nellinterprete si chiama look - m(l) per la memoria ha tipo M x Loc ? Val
nellinterprete si chiama lookM - Inserzione
- free(m) esiste solo per la memoria e corrisponde
allallocazione di memoria, ha tipo M ? Loc x M,
nellinterprete si chiama free. - per gli elementi dello stack jd/i ha tipo F x
Ide x Den? F - Modifica
- per la memoria mv/l) ha tipo M x Loc x Val ? M,
nellinterprete si chiama updateM
9Operazioni sugli stack
- Ricerca
- s(i) per gli elementi dello stack, ha tipo S
x Ide ? Den nellinterprete si chiama lookUp. Si
cerca nel frame top dello stack, se non contiene
un legame si va cercare nel resto delo stack,
secondo lordine di accesso degli elementi usuale
per gli stack. - Inserzione
- di un legame (ide,d) ha tipo S x Ide x Den ? S.
Nella semantica si esprime come composizione di
inserzione di un bind nel frame e push (.),
nellinterprete si chiama addBind
10Selezione della denotazione associata ad un
identificatore nello stack di frame
Formalmente abbiamo la seguente definizione
ricorsiva
11La Grammatica del C
Programma Direttive Prototipi TypeR main()
StmtList FunctDecList Direttive
Direttiva Direttive ? Direttiva define Ide
include ltIde.hgt... Prototipi Prototipo
Prototipi ? Prototipo Type Ide(FormalList)
FunctDecList FunctDecl FunctDecList ?
FunctDec (int void) Ide (int Ide)
StmtList StmtListStmt StmtList ?
12La Grammatica del C - segue
StmtDecl Com ComIdeExp
Assegnamento if (Exp) Com else Com
Condizionale while (Exp) Com
Iteratore StmtList
Blocco Ide(Exp) Invocazione di
fun return Exp Calcolo dei
valore Exp Ide Const Exp Op Exp Uop Exp
Ide Ide(Exp) (Exp)... Decl Type Ide
Exp FunctDec Type int float
double TypeRType void
13PicoC
- Restrizioni
- non ci sono le direttive (anche perchè nella
semantica non hanno senso) - tipi solo int
- parametri funzioni con un e un solo parametro
- non cè input/output
- non ci sono tipi strutturati (array,struct,
unioni) ecc). - Estensioni
- le definizioni di funzione sono dichiarazioni e
possono comparire in un punto qualunque del
programma
14PicoC
Programmaint main() StmtList StmtList
Stmt StmtList ? StmtDecl
Com ComIdeExp Assegnamento
if (Exp) Com else Com Condizionale
while (Exp) Com Iteratore
StmtList Blocco
Ide(Exp) Invocazione di fun
return Exp Calcolo del valore Exp Ide
Const Exp Op Exp Uop Exp Ide Ide(Exp)
(Exp)... Decl int Ide Exp
FunctDec FunctDec (int void) Ide (int Ide)
StmtList
15Rappresentazione delle variabili nello stato
s
m
s
m
l1
j
l1
j
3
l1
x
l1
x
l2
1
l3
y
l2
y
l3
0
l2
z
l3
z
l4
-4
j
l4
x
sltx, l1gt, lty, l2gt, ltz, l3gt.W
l4
w
m(s(y)? m(s(y)?
16Sistema di transizioni per le espressioni
S explt ?exp , Texp , ?exp ?exp ltE,lt?,?gtgt
E ?Exp, ? ??, ? ?M ? ltv,lt?,?gtgt v ? Val , ?
??, ? ?M Texp ltv,lt?,?gtgt v ? Val , ? ??, ?
?M ?exp (), ..., tutte le regole che
vedremo
17 Semantica le espressioni
ltE,lts,?gtgt?expltv,lts,?gtgt ltE,lts,?gtgt?expltv,lts,
?gtgt v opv v
ltE op E, lts, ?gt gt ?exp ltv, lts, ?gtgt ltE,
lts,? gtgt ?expltv, lts, ?gtgt uop v v ltuop
E, lts,? gtgt ?exp ltv, lts, ?gtgt
? (s(x)) v ltx,
lts,? gtgt ?exp ltv, lts,?gtgt v ?
(const) ltconst,lts,? gtgt ?expltv,lts,?gtgt
(Eop)
(Euop)
(B())
(Eidev)
(Btrue)
(Econst)
18Sistema di transizioni per i comandi e
dichiarazioni
S comlt ?com , Tcom , ?com ?com ltC,lt?,?gtgt
C ?Stmt, ? ??, ? ?M ? lt?,?gt ? ??, ? ?M
Tcom lt?,?gt ? ??, ? ?M ?com (), ...,
tutte le regole che vedremo
19Assegnamento
Sintassi
Com Ide Exp
Semantica
ltE,lt?,?gt gt ?exp ltv ,lt?, ?gtgt ?(x)l ? ?
ltxE,lt?,?gt gt ?com lt?, ?v/lgt
20 Sequenza di istruzioni StmtList
Sintassi
StmtList Stmt StmtList ?
Semantica
ltCom, lt?,?gtgt ?com lt?,?gtgt ltStmtList,lt?,
?gtgt ?comlt?,?gtgt ltCom StmtList,lt?,?gtgt ?com
lt?,?gtgt ltDecl,lt?,?gtgt ?comlt?,?gt
ltStmtList,lt?,?gtgt?com lt?,?gtgt ltDecl
StmtList,lt?,?gtgt ?com lt?,?gtgt
(StmtListcom)
(StmtListdecl)
21Un condizionale if
Sintassi
Com ... if (BE) Com else Com ...
Semantica
ltE,lt?,?gtgt ?explttt,lt?,?gtgt ltC1,lt?,?gtgt?cmdlt?
,?gt ltif(E) C1 else C2
,lt?, ?gtgt ?com lt?,?gtgt ltE,lt? ?gtgt
?expltff,lt?,?gtgt ltC2,lt?,?gtgt ?cmd lt?,?gt
ltif(E) C1 else C2,lt?, ?gtgt ?com
lt?,?
(if-tt)
(if-ff)
22Un iteratore while
Sintassi
Com ... while (BE) Com ...
Semantica
ltE
,lt?,?gt gt ?exp ltff,lt?,?gtgt
ltwhile(E) C,lt?, ?gt gt ?comlt?,?gt
ltE,lt?,?gtgt ?exp lttt,lt?,?gtgt ltC,lt?,?gtgt
?com lt?,?gtgt ltwhile(E) C ,lt?, ?gtgt
?com lt?,?gt ltwhile(E)
C ,lt?,?gt gt ?com lt?,?gt
23La semantica il Blocco
Sintassi
Com StmtList
Semantica
ltStmtList, lt?.?, ?gtgt ?com ltj.?,
?gt
ltStmtList,lt?,?gtgt ?com lt?,?gt ??? ????
(Block)
24Semantica delle dichiarazioni
Sintassi
Decl Type Ide Type Ide Exp
Semantica
free (m) ltl,?gt s j.s
ltT x ,lts,?gtgt ?dcl lt j l /x.s,??/lgt
ltE,lts,?gtgt?expltv,lts,?gtgt free (m) ltl,?gt
s j.s ltT xE , lts, ?gtgt ?dcl ltj
l/x.s,?v/lgtgt
(var1)
(var2)
Notare linserzione del legame nel top dello stack
25Semantica del programma
Sintassi
programma int main () StmtList
Semantica
ltStmtList, lt?.?,?0gt gt ?com lts,?gt
ltint main() StmtList gt ? lts,?gt
(prog)
26Linguaggi a blocchi
- C è un linguaggio a blocchi perchè le variabili
esistono solo allinterno del blocco in cui sono
definite. - In C, come nella maggior parte dei linguaggi a
blocchi, è corretto riutilizzare un
identificatore per definire una variabile, con la
seguente semantica - Sia y la variabile definita nel blocco più
esterno e y la variabile definita nel blocco
interno. - y e y sono due variabili diverse. La y esiste
solo nel blocco interno e poi scompare. La y
esiste sempre (cioè nel blocco esterno e quindi
in quello interno) ma nel blocco interno non si
riesce a denotare (è coperta dalla y). - In Java il riutilizzo di un identificatore in un
blocco annidato è vietato
27Equivalenza di programmi
- I comandi C e C sono equivalenti se ?lts,mgt vale
una delle seguenti condizioni - ltC,lts,mgtgt e ltC, lts,mgtgt NON portano ad una
configurazione terminale - Se ltC,lts,mgtgt? lts,mgt allora ltC, lts,mgtgt ?
lts,mgt e vale che x x?Ide?s(x) ? ?x
x?Ide?s(x) ? ?? m(s(x)) m(s(x))
cioè le configurazioni terminali
definiscono le stesse variabili a cui sono
assegnati gli stessi valori. - Dimostrazione per casi se necessario
28Equivalenza debole (condizionale) di programmi
- I comandi C e C sono equivalenti in uno stato
lts,mgt che soddisfa una data condizione cioè tale
che ...es m(s(x))v), come prima Se
ltC,lts,mgtgt? lts,mgt allora ltC,
lts,mgtgt ? lts,mgt e vale che x x?Ide?s(x)
? ?x x?Ide?s(x) ? ? ? m(s(x))
m(s(x)) - cioè le configurazioni terminali definiscono le
stesse variabili a cui sono assegnati gli
stessi valori. - Dimostrazione per casi se necessario anche in
questo caso