Descrizione dei linguaggi - Dipartimento di Informatica

Transcript

Descrizione dei linguaggi - Dipartimento di Informatica
Linguaggi di Programmazione
Corso di Laurea in “ITPS”
Descrizione dei
Linguaggi di programmazione
Valeria Carofiglio
(Questo materiale è una rivisitazione del materiale
prodotto da Nicola Fanizzi)
1
Argomenti
• Introduzione
• Sintassi e Lessico
–
Grammatiche, derivazioni, alberi, ambiguità
• Semantica
• Pragmatica
• Implementazione
2
Definire
un Linguaggio di Programmazione
Linguaggio di programmazione
Una notazione (linguaggio artificiale)
per descrivere algoritmi e strutture dati
destinatario della comunicazione = calcolatore
• Linguistica => per poter descrivere un linguaggio:
–
Sintassi
• Lessico
• (Morfologia)
–
–
Semantica
Pragmatica
Studio dei
Livelli di descrizione di
un linguaggio
3
Definire
un Linguaggio di Programmazione
Linguaggio di programmazione
Una notazione (linguaggio artificiale)
per descrivere algoritmi e strutture dati
destinatario della comunicazione = calcolatore
• Linguistica => per poter descrivere un linguaggio:
–
Sintassi
• Lessico
• (Morfologia)
–
–
Semantica
Pragmatica
Studio dei
Livelli di descrizione di
un linguaggio
• In informatica c'è un altro livello:
–
Implementazione
4
Sintassi: Una relazione tra segni
“quali sono le frasi corrette ?”
5
Sintassi: Una relazione tra segni
“quali sono le frasi corrette ?”
Dato un alfabeto:
I°Stadio: Lessico
“quali sequenze di simboli
costituiscono le parole del
linguaggio ?”
•
Esempio: il caso del linguaggio naturale
(Italiano)
Alfabeto latino su 22 lettere:{A..Z }
Livello lessicale
Parole legali in italiano:
sequenze corrette di lettere
6
Sintassi: Relazione tra segni
“quali sono le frasi corrette ?”
Dato un alfabeto:
I°Stadio: Lessico
“quali sequenze di simboli
costituiscono le parole del
linguaggio ?”
• Relazione tra simboli
dell'alfabeto
II°Stadio
“quali sequenze di parole
costituiscono le frasi
del linguaggio ?”
Esempio: il caso del linguaggio naturale
(Italiano)
Alfabeto latino su 22 lettere:{A..Z }
Livello lessicale
Parole legali in italiano:
sequenze corrette di lettere
Frasi legali in Italiano:
sequenze corrette di parole
Livello morfologico
7
Semantica:
Relazione tra segni e significati
“cosa significa una frase corretta ?”
Difficile in linguaggio naturale/ Più semplice nei linguaggi ar tificiali
Esempio:
Il significato di un programma potrebbe essere la funzione
matematica che quel programma computa
8
Pragmatica:
“Come usare una frase corretta e sensata?”
Punto di vista del programmatore:
Frasi con lo stesso significato possono essere usate da
due persone in modo diverso
Contesti linguistici diversi possono richiedere
l’uso di frasi diverse
9
Implementazone:
Livello esistente solo per i LdP
“Come eseguire una frase corretta
rispettandone la semantica?”
Punto di vista del progettista
(Software o del linguaggio)
Mediante quale processo le frasi operative del
linguaggio realizzano lo stato di cose di cui parlano
(descritto dall’implementazione del linguaggio)
10
Sintassi
L= { stringhe di caratteri su un certo alfabeto}
Se L è finito: possiamo elencare tutte le parole di L
(es: Il vocabolario di italiano è un volume finito)
I LdP possono essere costituiti anche da un numero infinito di parole
(lessico infinito)
Regole sintattiche
specificano quali stringhe appartengono ad L
L
Naturale
Artificiale
Numerose
complesse
Poche regole
11
Sintassi: gli elementi che ci servno
Elementi lessicali di un LdP (lessemi)
(unità del livello sintattico più basso (lessico) di un linguaggio )
Identificatori
costanti
operatori
punteggiatura
Programma: frase di LdP (visto come <lessemi>)
Token (simboli)
(categorie (astrazioni) di lessemi )
Esempio
Index := 3 * count + 5;
Lessemi
Token
index
id
:=
assign
3
num
*
times
count
id
+
plus
5
num
;
semicolon
12
Sintassi
Definizione formale di un linguaggio
Per generazione
Per riconoscimento
L definito su alfabeto ∑
frase
R
verdetto
frase
∈
∉
L
R è lo strumento per riconoscere
le frasi di L
Se L è infinito
R non è adatto per enumerare le
frasi di L
Usato per verificare la
correttezza sintattica di un
programma scritto in L
13
Sintassi
Definizione formale di un linguaggio
Per generazione
Per riconoscimento
L definito su alfabeto ∑
L definito su alfabeto ∑
frase
R
verdetto
frase
∈
∉
R è lo strumento per riconoscere
le frasi di L
Se L è infinito
Push
L
G
Frase
(qulaunque)
G è lo strumento per generare
le frasi di L
R non è adatto per enumerare le
frasi di L
Usato per verificare la
correttezza sintattica di un
programma scritto in L
14
Sintassi
Definizione formale di un linguaggio
Per generazione
Per riconoscimento
L definito su alfabeto ∑
L definito su alfabeto ∑
frase
R
verdetto
frase
∈
∉
R è lo strumento per riconoscere
le frasi di L
Se L è infinito
R non è adatto per enumerare le
frasi di L
Usato per verificare la
correttezza sintattica di un
programma scritto in L
Push
L
G
Frase
(qulaunque)
G è lo strumento per generare
le frasi di L
R: funziona per tentativi
G: aleatorietà della definizione
della frase
15
Sintassi
Definizione formale di un linguaggio
Per generazione
Per riconoscimento
L definito su alfabeto ∑
L definito su alfabeto ∑
frase
R
verdetto
frase
∈
∉
R è lo strumento per riconoscere
le frasi di L
Se L è infinito
R non è adatto per enumerare le
frasi di L
Usato per verificare la
correttezza sintattica di un
programma scritto in L
Push
L
G
Frase
(qulaunque)
G è lo strumento per generare
le frasi di L
R: funziona per tentativi
G: aleatorietà della definizione
della frase
Importante scoperta:
Stretta connessione tra R e G:
Il meccanismo di R è basato su
16
quello di G
Metodi formali
per la definizione della sintassi
1950:
J.Backus
N.Chomsky
(strumenti generativi)
Inventano la stessa notazione anche se in
contesti diversi
17
Metodi formali
per la definizione della sintassi
1950:
(strumenti generativi)
J.Backus
N.Chomsky
Inventano la stessa notazione anche se in
contesti diversi
(Linguistica) Chomsky:
Specifica 4 classi di strumenti
generativi (grammatiche)
0
1
2
3
4 classi di
linguaggi
Classe 2 Gram.non-contestualià sintassi
Classe 3 Gram. Regolarià lessico
18
Metodi formali
per la definizione della sintassi
1950:
(strumenti generativi)
J.Backus
N.Chomsky
Inventano la stessa notazione anche se in
contesti diversi
(Linguistica) Chomsky:
Specifica 4 classi di strumenti
generativi (grammatiche)
0
1
2
3
4 classi di
linguaggi
Classe 2 Gram.non-contestualià sintassi
Classe 3 Gram. Regolarià lessico
(Informatica) Backus:
Presenta Algol 60
(sintassi specificata in BNF)
BNF
(Backus Naur Form)
Quasi equivalente allo
strumento di tipo 2 di chomsky
metalinguaggio
19
Esempio
Vogliamo descrivere il linguaggio delle stringhe palindrome
costruite a partire dai simboli a e b
A= {a,b}
L={a,b, aa, bb, aaa, …, abba, aabaa}
Definizione ricorsiva:
20
Esempio
Vogliamo descrivere il linguaggio delle stringhe palindrome
costruite a partire dai simboli a e b
A= {a,b}
L={a,b, aa, bb, aaa, …, abba, aabaa}
Definizione ricorsiva:
• a e b sono palindrome (base)
• Se s è palindroma (passo)
– asa e bsb sono palindrome
21
Esempio
Vogliamo descrivere il linguaggio delle stringhe palindrome
costruite a partire dai simboli a e b
A= {a,b}
L={a,b, aa, bb, aaa, …, abba, aabaa}
Definizione ricorsiva:
• a e b sono palindrome (base)
a, aaa, aba, ababa,
• Se s è palindroma (passo)
– asa e bsb sono palindrome
….
Stringhe di lunghezza
dispari su A
22
Esempio
Vogliamo descrivere il linguaggio delle stringhe palindrome
costruite a partire dai simboli a e b
A= {a,b}
L={a,b, aa, bb, aaa, …, abba, aabaa}
Definizione ricorsiva:
• a e b sono palindrome (base)
a, aaa, aba, ababa,
• Se s è palindroma (passo)
– asa e bsb sono palindrome
• Stringa vuota
….
Stringhe di lunghezza
dispari su A
Per stringhe di lunghezza
pari
23
Esempio
Vogliamo descrivere il linguaggio delle stringhe palindrome
costruite a partire dai simboli a e b
A= {a,b}
L={a,b, aa, bb, aaa, …, abba, aabaa}
Definizione ricorsiva:
• a e b sono palindrome (base)
a, aaa, aba, ababa,
• Se s è palindroma (passo)
– asa e bsb sono palindrome
• Stringa vuota
Per stringhe di lunghezza
pari
….
Stringhe di lunghezza
dispari su A
Se s è una stringa palindroma
Esiste una
successione di regole sintattiche
che la costruisce
24
Grammatiche non contestuali
(o libere da contesto)
Dato un alfabeto A (finito e non vuoto) si costruisce l'insieme (infinito)
A* di tutte le stringhe su A
– A* contiene anche la Stringa vuota (senza simboli di A) denotata
con ε (un linguaggio formale è un sottoinsieme di A*)
• Grammatica G = (NT,T,R,S)
– NT insieme di simboli non terminali o variabili
– T insieme dei simboli terminali
• (es., A oppure A *)
– R insieme di regole di produzione V → W con
• V ∈ NT
• W ∈ (T ∪ NT)*
– S ∈ NT (scopo, simbolo distintivo, iniziale o di
partenza)
25
Esempio
Grammatica per stringhe di palindrome su
A={a,b}
• G = ({P}, A, R, P) con
R={
P→ε
P→a
P→b
P → aPa
P → bPb}
26
Esempio2
Grammatica per descrivere le espressioni aritmetiche tra identificatori
costituiti da sequenze finite di “a” e “b” (su op. unari e binari)
•
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R={
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→a
I→b
I → Ιa
I → Ιb}
27
Esempio2
Grammatica per descrivere le espressioni aritmetiche tra identificatori
costituiti da sequenze finite di “a” e “b” (su op. unari e binari)
•
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R={
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→a
I→b
I → Ιa
I → Ιb}
Per definire una
espressione aritmetica
Per definire un
Identificatore
28
Derivazione:
aspetto operativo delle grammatiche
Una derivazione consiste nella
ripetuta applicazione di regole di una grammatica
Grammatica per descrivere le
espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→ a
I→ b
I → Ιa
I → Ιb}
La stringa
ab*(a+b)
È coprretta secondo la
grammatica data
Applicazione ripetuta
regole di produzione
ßà
regole di riscrittura
(NOT: ⇒)
29
Derivazione:
aspetto operativo delle grammatiche
Una derivazione consiste nella
ripetuta applicazione di regole di una grammatica
Grammatica per descrivere le
espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→ a
I→ b
I → Ιa
I → Ιb}
La stringa
ab*(a+b)
È corretta secondo la grammatica
Applicazione ripetuta
(E ⇒3E*E
⇒ 1I
*E
⇒10Ib *E
⇒7 ab *E
⇒6 ab*(E)
⇒2 ab*(E+E)
⇒1 ab *(I+E)
⇒7 ab*(a+E)
⇒1 ab*(a+I)
⇒8 ab*(a+b)
30
Derivazione:
aspetto operativo delle grammatiche
Una derivazione consiste nella
ripetuta applicazione di regole di una grammatica
Grammatica per descrivere le
espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→ a
I→ b
I → Ιa
I → Ιb}
La stringa
ab*(a+b)
È corretta secondo la grammatica
Applicazione ripetuta
(E ⇒3E*E
⇒ 1I
*E
⇒10Ib *E
⇒7 ab *E
⇒6 ab*(E)
⇒2 ab*(E+E)
⇒1 ab *(I+E)
⇒7 ab*(a+E)
⇒1 ab*(a+I)
⇒8 ab*(a+b)
Notazione
E ⇒∗
(ab*(a+b))
31
Derivazione
Fissata una grammatica
G = (NT,T,R,S)
Assegnate due stringhe
“v” e “w” su NT ∪ T
-----------------• Da v si deriva direttamente w (v ⇒ w)
– Se w si ottiene da v sostituendo ad un simbolo non
terminale V di v il corpo di una regola di produzione di
R la cui testa sia V
• Da v si deriva w (v ⇒∗ w)
– Se esiste una sequenza finita (anche vuota) di
derivazioni dirette: v ⇒ wo ⇒ w1 ⇒ … ⇒ w
32
Linguaggio generato da una
grammatica
Il linguaggio generato da una grammatica
G = (NT,T,R,S)
è costituito
dall'insieme delle stringhe derivabili dal
simbolo iniziale di G
Formalmente:
L(G) = { ω ∈ Τ∗ | S ⇒∗ ω}
Definisce un linguaggio su T*
33
Backus-Naur Form (BNF)
Idea di fondo:
astrazione per definire le strutture sintattiche
(Token-Simboli)
Es (C):Istruzione di assegnazione
Assignà var = Expr
L’astrazione assign è definita come una istanza dell’astrazione var
seguita dal lessema = seguita da una istanza dell’astrazione Expr
34
Backus-Naur Form (BNF)
Idea di fondo:
astrazione per definire le strutture sintattiche
(Token-Simboli)
Es (C):Istruzione di assegnazione
Assignà var = Expr
L’astrazione assign è definita come una istanza dell’astrazione var
seguita dal lessema = seguita da una istanza dell’astrazione Expr
Astrazione ≡ simbolo non terminale
Struttura sintattica/Token/lessema ≡
simbolo terminale
Grammatica ≡ insieme di regole
35
Regole BNF
• Una regola ha una parte sinistra (left-hand
side: LHS) e una parte destra (right-hand side:
RHS), che consistono di simboli terminali e nonterminali
LHS ::= RHS
Es:Istruzione di assegnazione
<Assign >::= <var> = <Expr>
• Una regola per un simbolo non-terminale può
avere più d'una parte destra, separate dal
simbolo “ | “
36
Regole BNF
• La freccia “à” è sostituita da “::=”
• I simboli non terminali sono scritti tra parentesi
angolari <…>
– (maiuscoli nelle grammatiche di Chomsky)
37
Esempio3
Grammatica per descrivere le espressioni aritmetiche tra identificatori
costituiti da sequenze finite di “a” e “b” (su op. + * unario e
binario)
•
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {
1.
E→Ι
2.
3.
E → E+E
E → E*E
4.
5.
6.
E → E-E
E → -E
E → (E)
7.
8.
9.
I→a
I→b
I → Ιa
BNF
<E> ::= <I> | <E> + <E> |
<E>*<E>|
<E>-<E> |
-<E>|
(<E>)
10. I → Ιb}
38
Esempio4
<program> ::= <stmts>
<stmts> ::= <stmt> | <stmt> ; <stmts>
<stmt> ::= <var> = <expr>
<expr> ::= <term> + <term> | <term> - <term>
<term> ::= <var> | const
<var> ::= a | b | c | d
39
Osserviamo che..
La derivazione di una stringa
è un processo
rigidamente sequenziale
La stringa
ab*(a+b)
È corretta secondo la grammatica
Applicazione ripetuta
Alcuni passi devono
essere effettuati
in un certo ordine
Altri passi possono
essere scambiati
d’ordine
(E ⇒3E*E
⇒ 1I
*E
⇒10Ib *E
⇒7 ab *E
⇒6 ab*(E)
⇒2 ab*(E+E)
⇒1 ab *(I+E)
⇒7 ab*(a+E)
⇒1 ab*(a+I)
⇒8 ab*(a+b)
40
Derivazioni canoniche
• Una derivazione sinistra (leftmost
derivation) è una derivazione nella quale si
espande il non-terminale più a sinistra in
ogni forma di frase intermedia
• Analogamente si definisce la derivazione
destra
(rightmost derivation)
NB:
Ci sono derivazioni che non sono né destre né
sinistre
41
Alcuni passi della derivazione
possono essere scambiati
Grammatica per descrivere le
espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {
App.ripetuta
(E ⇒3E*E
⇒ 6E
*(E)
⇒2 E * (E+E)
⇒1 E *(E+I)
⇒8 E * (E+b)
⇒1 E * (I+b)
⇒7 E * (a+b)
⇒1 I*(a+b)
⇒10 Ib*(a+b)
⇒7 ab*(a+b)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→ a
I→ b
I → Ιa
I → Ιb}
App.ripetuta
(E ⇒3E*E
⇒ 1I
*E
⇒10Ib *E
⇒7 ab *E
⇒6 ab*(E)
⇒2 ab*(E+E)
⇒1 ab *(I+E)
⇒7 ab*(a+E)
⇒1 ab*(a+I)
⇒8 ab*(a+b)
42
Alcuni passi della derivazione
possono essere scambiati
Grammatica per descrivere le
espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
Deriv. destra
App.ripetuta
(E ⇒3E*E
⇒ 6E
*(E)
⇒2 E * (E+E)
⇒1 E *(E+I)
⇒8 E * (E+b)
⇒1 E * (I+b)
⇒7 E * (a+b)
⇒1 I*(a+b)
⇒10 Ib*(a+b)
⇒7 ab*(a+b)
R = {
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→ a
I→ b
I → Ιa
I → Ιb}
Utilità della
dervazione in forma
di albero
Deriv. sinistra
App.ripetuta
(E ⇒3E*E
⇒ 1I
*E
⇒10Ib *E
⇒7 ab *E
⇒6 ab*(E)
⇒2 ab*(E+E)
⇒1 ab *(I+E)
⇒7 ab*(a+E)
⇒1 ab*(a+I)
⇒8 ab*(a+b)
43
Derivazione in Forma di albero
(un esempio)
E
App.ripetuta
E
(E ⇒3E*E
I
⇒ 6E
*(E)
⇒2 E * (E+E)
⇒1 E *(E+I)
⇒8 E * (E+b)
⇒1 E * (I+b)
⇒7 E * (a+b)
⇒1 I*(a+b)
⇒10 Ib*(a+b)
⇒7 ab*(a+b)
*
I
a
E
E
(
b
)
E
E
+
E
I
I
a
b
44
Alberi
Struttura costituita da un insieme
di nodi N
Se non vuota si distinguono:
•
•
La radice r
Un partizionamento (S 1,S2,...,Sn)
dei nodi di N \ {r}
dove ogni Si è strutturato ad albero
E
E
*
I
I
a
E
E
(
b
)
E
E
+
E
I
I
a
b
45
Alberi
Struttura costituita da un insieme
di nodi N
Se non vuota si distinguono:
•
•
La radice r
Un partizionamento (S 1,S2,...,Sn)
dei nodi di N \ {r}
dove ogni Si è strutturato ad albero
E
E
*
I
I
a
E
E
(
b
)
E
E
+
E
I
I
a
b
46
Alberi
Struttura costituita da un insieme
di nodi N
Se non vuota si distinguono:
•
•
La radice r
Un partizionamento (S 1,S2,...,Sn)
dei nodi di N \ {r}
dove ogni Si è strutturato ad albero
Grafo connesso T = (N,A)
–
–
–
–
N = insieme dei nodi;
A = insieme degli archi (ni, nj)
|N| = |A|+1
un Nodo n padre di tutti i nodi figli
(ordinati) m1,...,mp, tali che (n, mj) ∈ Α
radice r, livello(r) = 0
Se livello(n) = i
allora m tale che (n,m) ∈ A:
livello(m) = i+1
E
E
*
I
I
a
E
E
(
b
)
E
E
+
E
I
I
a
b
47
Albero di derivazione
Data una grammatica G = (NT,T,R,S)
E
*
E
I
I
a
Rappresentazione gerarchica di una
derivazione:
b
• I nodi sono etichettati con elementi di T
E
E
(
)
E
∪ NT ∪ {ε}
– Nodo radice = S
– Nodo interno (con figli) è un A ∈ NT:
• Se i figli di A sono etichettati X 1...Xn
dove ∀Xi ∈ T ∪ NT, allora deve
esistere in R la regola
A → X1...X n
• Se ε è l'unico figlio di A, allora deve
esistere in R la regola
A→ε
E + E
I
I
a
b
–
Nodi foglia (senza figli) sono simboli
di T ∪ {ε}
48
Albero di derivazione:
Altro esempio
<program>
<stmts>
<stmt>
<expr>
<var>
<term>
<program> ::= <stmts>
<stmts> ::= <stmt>
| <stmt> ; <stmts>
<stmt> ::= <var> = <expr>
<var> ::= a | b | c | d
<expr> ::= <term> + <term>
| <term> - <term>
<term> ::= <var> | const
<term>
<var>
a
=
b
+
const
49
Osserviamo che…
Albero della derivazione uguale
E
Deriv. destra
App.ripetuta
(E ⇒3E*E
⇒ 6E
*(E)
⇒2 E * (E+E)
⇒1 E *(E+I)
⇒8 E * (E+b)
⇒1 E * (I+b)
⇒7 E * (a+b)
⇒1 I*(a+b)
⇒10 Ib*(a+b)
⇒7 ab*(a+b)
E
*
I
I
a
b
E
Deriv. sinistra
E
(
)
E
E + E
I
I
a
b
App.ripetuta
(E ⇒3E*E
⇒ 1I
*E
⇒10Ib *E
⇒7 ab *E
⇒6 ab*(E)
⇒2 ab*(E+E)
⇒1 ab *(I+E)
⇒7 ab*(a+E)
⇒1 ab*(a+I)
⇒8 ab*(a+b)
50
Osserviamo che…
Albero della derivazione uguale
E
Deriv. destra
App.ripetuta
(E ⇒3E*E
E
*
I
I
b
E
(
E
E
Deriv. sinistra
)
App.ripetuta
(E ⇒3E*E
a
E + E
*(E)
⇒ 1I *E
⇒2 E * (E+E)
⇒10Ib *E
I
I
⇒1 E *(E+I)
⇒7 ab *E
⇒8 E * (E+b)
⇒6 ab*(E)
a
b
⇒1 E * (I+b)
⇒2 ab*(E+E)
⇒7 E * (a+b)
⇒1 ab *(I+E)
IMPORTANTE
PER
L’ANALISI
SINTATTICA
DI UN LdP
⇒1 I*(a+b)
⇒7 ab*(a+E)
La
esprime la51
⇒10struttura
Ib*(a+b) dell’albero (attraverso i sottoalberi)
⇒1 ab*(a+I)
stringa
⇒struttura
⇒ ab*(a+b)
7 ab*(a+b) logica che la grammatica assegna alla
⇒ 6E
8
Osserviamo che…
IMPORTANTE PER L’ANALISI SINTATTICA DI UN LdP
La struttura dell’albero (attraverso i sottoalberi) esprime la
struttura logica che la grammatica assegna alla stringa
Grammatica
per descrivere le
Deriv. destra
espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→ a
I→ b
I → Ιa
I → Ιb}
App.ripetuta
(E ⇒2E+E
⇒ 3 E*E
+E
⇒1 I * E +E
⇒7 a * E+ E
⇒1 a * I+E
⇒8 a * b+E
⇒1 a * b + I
⇒7 a* b +a
52
Osserviamo che…
IMPORTANTE PER L’ANALISI SINTATTICA DI UN LdP
La struttura dell’albero (attraverso i sottoalberi) esprime la
struttura logica che la grammatica assegna alla stringa
Deriv. destra
E
E
+
App.ripetuta
E
E * E
I
I
I
a
a
b
(E ⇒2E+E
⇒ 3 E*E
+E
⇒1 I * E +E
⇒7 a * E+ E
⇒1 a * I+E
⇒8 a * b+E
⇒1 a * b + I
⇒7 a* b +a
53
Osserviamo che…
IMPORTANTE PER L’ANALISI SINTATTICA DI UN LdP
La struttura dell’albero (attraverso i sottoalberi) esprime la
struttura logica che la grammatica assegna alla stringa
Deriv. destra
E
E
+
App.ripetuta
E
E * E
I
I
I
a
a
b
(E ⇒2E+E
⇒ 3 E*E
+E
⇒1 I * E +E
⇒7 a * E+ E
⇒1 a * I+E
⇒8 a * b+E
⇒1 a * b + I
⇒7 a* b +a
Moltiplica a per b poi somma a
54
Ambiguità nelle grammatiche
(esempio)
Alberi di derivazione per la stringa a * b + a
E
E
+
E
*
E
E
E
E * E
I
I
E + E
I
I
a
a
I
I
a
b
b
a
Due alberi diversi producono la stessa stringa
55
Ambiguità nelle grammatiche
(esempio)
Alberi di derivazione per la stringa a * b + a
E
E
+
E
*
E
E
E
E * E
I
I
E + E
I
I
a
a
I
I
a
b
b
a
Due alberi diversi producono la stessa stringa
A seconda di come la derivazione è costruita
cambia la precedenza tra i due operatori aritmetici cambia
56
Ambiguità nelle grammatiche
Una grammatica è ambigua se e solo se
essa genera (almeno) una stringa (forma di
frase) che abbia due o più alberi di
derivazione distinti
NB:
ma una stringa può però avere più derivazioni
distinte senza che la grammatica sia ambigua
57
Disambiguità nelle grammatiche
(esempio)
Grammatica AMBIGUA per descrivere
le espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {E ::= I | E+E |E*E |E-E|
-E| (E)
I ::= a| b| Ia |Ib}
Grammatica NON AMBIGUA per
descrivere le espressioni
aritmetiche
G = ({E,T,A,I}, {a,b,+,*,-,(,)}, R’, E)
con
R = {
E ::= T | T + E | T - E
T ::= A | A * T |
A ::= I | -A | ( E )
I ::= a | b | Ia | Ib
58
Disambiguità nelle grammatiche
(esempio)
Grammatica AMBIGUA per descrivere
le espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {E ::= I | E+E |E*E |E-E|
-E| (E)
I ::= a| b| Ia |Ib}
Rappresenta la nozione di
precedenza degli operatori
Grammatica NON AMBIGUA per
descrivere le espressioni
aritmetiche
G = ({E,T,A,I}, {a,b,+,*,-,(,)}, R’, E)
con
R = {
E ::= T | T + E | T - E
T ::= A | A * T |
A ::= I | -A | ( E )
I ::= a | b | Ia | Ib
59
Disambiguità nelle grammatiche
(esempio)
Grammatica AMBIGUA per descrivere
le espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {E ::= I | E+E |E*E |E-E|
-E| (E)
I ::= a| b| Ia |Ib}
Rappresenta la nozione di
precedenza degli operatori
Grammatica NON AMBIGUA per
descrivere le espressioni
aritmetiche
G = ({E,T,A,I}, {a,b,+,*,-,(,)}, R’, E)
con
R = {
E ::= T | T + E | T - E
T ::= A | A * T |
A ::= I | -A | ( E )
I ::= a | b | Ia | Ib
Gli operatori dello stesso
livello di precedenza vengono
associati a destra:
a + b +a ßà a + (b + a)
60
Disambiguità nelle grammatiche
(esempio)
Grammatica AMBIGUA per descrivere
le espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {E ::= I | E+E |E*E |E-E|
-E| (E)
I ::= a| b| Ia |Ib}
Rappresenta la nozione di
precedenza degli operatori
Gli operatori dello stesso
livello di precedenza vengono
associati a destra:
a + b +a ßà a + (b + a)
Grammatica NON AMBIGUA per
descrivere le espressioni
aritmetiche
G = ({E,T,A,I}, {a,b,+,*,-,(,)}, R’, E)
con
R = {
E ::= T | T + E | T - E
T ::= A | A * T |
A ::= I | -A | ( E )
I ::= a | b | Ia | Ib
Osserviamo che:
La disambiguazione della
grammatica è pagata in termini di
complessità
LdP a volte molto contorti
61
Caso dell'istruzione condizionale
Grammatica ambigua per il costrutto
“if” in Java
<istruzione> ::= ... <if-else> | <altra>
<altra> ::= ... <blocco> | <vuota> | <return>
<if-else> ::= if (<espressione>) <istruzione> |
| if (<espressione>) <istruzione> else <istruzione>
62
Caso dell'istruzione condizionale
Grammatica ambigua per il costrutto
“if” in Java
<istruzione> ::= ... <if-else> | <altra>
<altra> ::= ... <blocco> | <vuota> | <return>
<if-else> ::= if (<espressione>) <istruzione> |
| if (<espressione>) <istruzione> else <istruzione>
Quanti alberi per la stringa seguente ?
if (<espressione>) if(<espressione> ) <istruzione> else <istruzione>
63
Caso dell'istruzione condizionale
Grammatica ambigua per il costrutto
“if” in Java
<istruzione> ::= ... <if-else> | <altra>
<altra> ::= ... <blocco> | <vuota> | <return>
<if-else> ::= if (<espressione>) <istruzione> |
| if (<espressione>) <istruzione> else <istruzione>
Quanti alberi per la stringa seguente ?
if (<espressione>) if(<espressione> ) <istruzione> else <istruzione>
if (<espressione>)
if(<espressione>)
<istruzione>
else <istruzione>
if (<espressione>)
if(<espressione>)
<istruzione>
else <istruzione>
64
Caso dell'istruzione condizionale
Grammatica non ambigua per il costrutto
“if” in Java
<istruzione> ::= ... <if> | <if -else> | <altra>
<altra> ::= ... <blocco> | <vuota> | <return>
<no-if-breve> ::= <altra> | <if-else2>
<if> ::= if (<espressione> ) <istruzione>
<if-else> ::= if (<espressione> ) <no-if-breve> else <istruzione>
<if-else2> ::= if (<espressione> ) <no-if-breve> else <no-if-breve>
Il ramo else appartiene all’if più vicino
65
Metodi Formali per
Descrivere la Sintassi
• Grammatiche e riconoscitori
• Backus-Naur Form e Grammatiche libere
da contesto
–
Metodi più diffusi per descrivere la sintassi
dei linguaggi di programmazione
• Extended BNF
–
Migliora la leggibilità e la scrivibilità della BNF
66
Extended BNF
(EBNF)
• Opzionalità
Estensioni della BNF
– Le parti opzionali sono poste tra parentesi quadre [ ]
– <proc_call> ::= ident [(<expr_list>)]
• Disgiunzione
– Le parti destre alternative sono poste tra parentesi tonde () e
separate con barre verticali |
– <term> ::= <term> (+|-) const
• Ripetizione
– Ripetizioni (di 0 o più elementi) sono poste tra parentesi graffe {
}
– <ident> ::= letter {letter | digit}
67
BNF e EBNF
• BNF
<expr> ::= <expr> + <term>
| <expr> - <term>
| <term>
<term> ::= <term> * <factor>
| <term> / <factor>
| <factor>
Grammatica NON AMBIGUA per
descrivere le espressioni
aritmetiche
G = ({E,T,A,I}, {a,b,+,*,-,(,)}, R’, E)
con
R = {
• EBNF
E ::= T | T + E | T - E
T ::= A | A * T |
A ::= I | -A | ( E )
I ::= a | b | Ia | Ib
<expr> ::= <term> {(+ | -) <term>}
<term> ::= <factor> {(* | /) <factor>}
68
Vincoli contestuali
Correttezza di una frase può dipendere dal
contesto nel quale la frase si trova:
–
–
–
–
–
–
Identificatore da dichiarare prima dell'uso
Numero dei parametri effettivi pari al numero di
parametri formali
Espressione nella parte destra di un assegnazione di
tipo compatibile con quello della variabile nella parte
sinistra
Non modificabilità della variabile che controlla
l'istruzione for
Inizializzare ogni variabile prima dell'uso
Metodi sovrascritti da metodi con firma uguale (o
69
compatibile)
Vincoli contestuali
Correttezza di una frase può dipendere dal
contesto in cui la frase si trova:
–
–
–
–
–
–
Identificatore da dichiarare prima dell'uso
NON
Numero dei parametri
effettivi pari al numero di
parametri si
formali
possono esprimere
Espressione nella parte destra di un assegnazione di
con una
tipo compatibile con quello della variabile nella parte
grammatica
sinistra
Non modificabilità
della variabile che controlla
Non Contestuale
l'istruzione for
Inizializzare ogni variabile prima dell'uso
Metodi sovrascritti da metodi con firma uguale (o
compatibile)
70
Grammatiche contestuali e
Vincoli contestuali
Grammatiche contestuali per descrivere i vincoli contestuali
Dovere di cronaca
Le grammatiche contestuali hanno regole di produzione del tipo:
uAv à uwv
con u,v,w ∈ T ∪ NT
Il simbolo non terminale A può essere riscritto come w solo
se appare in un certo contesto (definito da u e v)
71
Grammatiche contestuali e
Vincoli contestuali
Grammatiche contestuali per descrivere i vincoli contestuali
Dovere di cronaca
Le grammatiche contestuali hanno regole di produzione del tipo:
uAv à uwv
con u,v,w ∈ T ∪ NT
Il simbolo non terminale A può essere riscritto come w solo
se appare in un certo contesto (definito da u e v)
Perche tali grammatiche non vengono di fatto utilizzate
• Grammatiche molto pesanti
• Per le quali non esistono tecniche automatiche di generazione d i
traduttori efficienti (che invece esistono per le grammatiche li bere da
contesto)
72
Vincoli contestuali e
semantica statica
La necessità di gestire i vincoli della
sintassi contestuale
porta alla nozione di semantica statica
–
–
ossia verificabile sul testo del programma sorgente
Diversa dalla semantica dinamica
(che riguarda il significato del programma mentre gira)
Es. grammatiche con attributi
Grammatiche libere + vincoli ed azioni
73
Sintassi o semantica?
I vincoli contestuali appartengono alla
sintassi
–
–
–
–
Identificatore da dichiarare prima dell'uso
Numero dei parametri effettivi pari al numero di parametri
formali
Espressione nella parte destra di un assegnazione di tipo
compatibile con quello della variabile nella parte sinistra
......
Tradizionalmente nei LdP si intende
- sintassi: tutto ciò che si descrive mediante BNF
- Semantica: tutto il resto
I vincoli contestuali sono dunque vincoli semantici....
74
Controlli di tipo semantico
Semantica statica
vincoli contestuali determinabili al monento
della compilazione
-
Var A: integer tipo e allocazione di memoria per A
int B[10]
tipo e allocazione di memoria per il vettore B
Float myProgram(float x, integer y) {...} parametri
X=3.5 che tipo è x?
Semantica dinamica
vincoli determinabili in fase di esecuzione del
programma
- z=x/y
- ....
errore se y=0
75
Compilatori
programma sorgente
Tavola
dei simboli
Analisi
Lessicale
lista token
Analisi
Sintattica
albero sintattico
Analisi
Semantica
albero aumentato
Generazione
Forma Intermedia
Gestione
errori
codice intermedio
Ottimizzazione
codice intermedio
Generazione
Codice
codice oggetto
76
Compilazione:analisi lessicale
Detta anche scanning o lexing
Da cui scanner (o lexer) è il (sotto)programma che la implementa
Lettura dei caratteri dal sorgente
(da sinistra a destra in una passata)
e costruzione di una lista di token
(le parole del linguaggio)
es. la stringa a = 12 * indice++; genera 7 token:
• id, assign, const, star, id, incremento,semicolon
77
Compilazione:analisi lessicale
Detta anche scanning o lexing
Da cui scanner (o lexer) è il (sotto)programma che la implementa
Lettura dei caratteri dal sorgente
(da sinistra a destra in una passata)
e costruzione di una lista di token
(le parole del linguaggio)
es. la stringa a = 12 * indice++; genera 7 token:
– id, assign, const, star, id, incremento, semicolon
Per descrivere gli elementi del lessico basta una
sottoclasse delle grammatiche libere detta delle
grammatiche regolari (o lineari)
78
Compilazione:analisi lessicale
(Linguistica) Chomsky:
Detta anche scanning
o lexing
Specifica 4 classi di strumenti
generativi (grammatiche)
Da cui scanner (o lexer) è il (sotto)programma che la implementa
0
Lettura dei caratteri
dal sorgente
4 classi di
1
(da sinistra a destra
passata)
2 in una linguaggi
3
e costruzione di una lista di token
(le parole del linguaggio)
Gram.non-contestualià
sintassi
es. la stringa a =Classe
12 *2indice++;
genera 7 token:
• a, =, 12, *, indice, ++
Classe 3 Gram. Regolarià lessico
Per descrivere gli elementi del lessico basta una
sottoclasse delle grammatiche libere detta delle
grammatiche regolari (o lineari)
79
Analisi lessicale e
Grammatiche regolari
Grammatiche regolari per descrivere il lessico di un LdP
Dovere di cronaca
Le grammatiche regolari hanno regole di produzione del tipo:
A à uB
AàBu
con u ∈ T* e A,B ∈ NT
80
Analisi lessicale e
Grammatiche regolari
Grammatiche regolari per descrivere il lessico di un LdP
Dovere di cronaca
Le grammatiche regolari hanno regole di produzione del tipo:
Grammatica per descrivere le
espressioni aritmetiche
G = ({E,I}, {a,b,+,*,-,(,)}, R, E) con
R = {
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
E→Ι
E → E+E
E → E*E
E → E-E
E → -E
E → (E)
I→ a
I→ b
I → Ιa
I → Ιb}
A à uB
AàBu
con u ∈ T* e A,B ∈ NT
81
Analisi lessicale e
Grammatiche regolari
Grammatiche regolari per descrivere il lessico di un LdP
Dovere di cronaca
Le grammatiche regolari hanno regole di produzione del tipo:
A à uB
AàBu
con u ∈ T* e A,B ∈ NT
Potere espressivo limitato
Es: non è possibile contare un numero arbitrario di caratteri
(bilanciamento parentesi???)
Analisi lessicale: Verifica che la stringa in ingresso possa
essere decomposta in token (ognuno descritto da una
grammatica regolare)
82
Compilatori
programma sorgente
Tavola
dei simboli
Analisi
Lessicale
lista token
Analisi
Sintattica
albero sintattico
Analisi
Semantica
albero aumentato
Generazione
Forma Intermedia
Grammatiche
libere da
contesto con
insieme dei
terminali = lista
dei token
ottenuta
Gestione
errori
codice intermedio
Ottimizzazione
codice intermedio
Generazione
Codice
codice oggetto
83
Compilazione: analisi sintattica
Detta anche parsing
Da cui parser è il (sotto)programma che la implementa
Lettura dei token dalla lista
e costruzione dell'albero di derivazione
(i token sono le foglie)
Stringa non corretta nel linguaggio:
se non si è in grado di costruire l'albero
Spesso lo scanner è un sottoprogramma
chiamato dal parser
(lo scanner restituisce un token ad ogni invocazione del parser)84
Compilatori
programma sorgente
Tavola
dei simboli
Analisi
Lessicale
lista token
Analisi
Sintattica
albero sintattico
Analisi
Semantica
albero aumentato
Generazione
Forma Intermedia
Gestione
errori
codice intermedio
Ottimizzazione
codice intermedio
Generazione
Codice
codice oggetto
85
Compilazione: analisi semantica
Vengono effettuati i controlli dei
vincoli contestuali
(ossia di semantica statica)
L'albero viene aumentato
via via con queste nuove informazioni
es. variabile: tipo, punto di dichiarazione, scope, ...
Per gli identificatori esse sono anche registrate
nella tabella dei simboli
86
Compilatori
programma sorgente
Tavola
dei simboli
Analisi
Lessicale
lista token
Analisi
Sintattica
albero sintattico
Analisi
Semantica
albero aumentato
Generazione
Forma Intermedia
Gestione
errori
codice intermedio
Ottimizzazione
codice intermedio
Generazione
Codice
codice oggetto
87
Compilazione: fasi finali
• Generazione della forma intermedia
–
–
Visita dell'albero per generare codice
Forma intermedia
• Ottimizzabile
• Portabile
• Ottimizzazione
–
Rimozione codice inutile, espansione inline delle
chiamate di sottoprogrammi, fattorizzazione
espressioni, ottimizzazione dei cicli
• Generazione del codice oggetto
–
Segue spesso un'altra fase di ottimizzazione
• es. assegnamento di variabili molto usate a registri
88
Sintassi e Semantica
Sintassi
Complessità
Standardizzazione
Piccola
SI
Semantica Grande
NO
Separate nella descrizione ma intimamente collegate
La sintassi dovrebbe suggerire la semantica
La semantica è guidata dalla sintassi
89
Semantica (dinamica)
Per descrivere il significato dei programmi.
E’ complessa:
• Specifica del linguaggio in modo da bilanciare
–
Esattezza
•
–
(specifica non ambigua, a priori, di cosa ci si debba aspettare
da costrutti sintatticamente corretti,
indipendentemente dall’architettura della macchina che
esegue il programma)
Flessibilità
•
(le molteplici implementazioni del LdP non devono essere
impedite.)
90
Semantica (dinamica)
Per descrivere il significato dei programmi.
E’ complessa:
• Specifica del linguaggio in modo da bilanciare
–
Esattezza
•
–
(specifica non ambigua, a priori, di cosa ci si debba aspettare
da costrutti sintatticamente corretti,
indipendentemente dall’architettura della macchina che
esegue il programma)
Flessibilità
•
(le molteplici implementazioni del LdP non devono essere
impedite.)
Uso di metodi formali
per descrivere
il significato dei programmi
(derivati e adattati dai linguaggi artificiali della logica matematica)
91
Semantica (dinamica)
I metodi formali: due grandi famiglie (ma ce ne sono altre)
Semantica denotazionale
(applicazione ai linguaggi di programmazione di tecniche
sviluppate per la semantica dei linguaggi logico-matematici)
Significato di un programma ßà Uso di funzione: descrive I/O del programma
Dominio e codominio della funzione sono strutture matematiche (I/O, ambienti,
memoria)
92
Semantica (dinamica)
I metodi formali: due grandi famiglie (ma ce ne sono altre)
Semantica denotazionale
(applicazione ai linguaggi di programmazione di tecniche
sviluppate per la semantica dei linguaggi logico-matematici)
Significato di un programma ßà Uso di funzione: descrive I/O del programma
Dominio e codominio della funzione sono strutture matematiche (I/O, ambienti,
memoria)
Semantica operazionale
(specifica del comortamento della macchina astratta, tramite
un formalismo a basso livello: Automi Assiomi algebrico-logici
Stati e transizioni (SOS))
Significato di un programma ßà Uso di formalismo di basso livello: descrive il
comportamento dell’interprete della macchina astratta
93
Semantica operazionale
Ottenuta definendo un interprete del linguaggio L
su di una macchina ospite i cui componenti sono descritti in modo matematico
L’idea alla base:
Dare la semantica di un linguaggio L
mediante
la definizione del comportamento dell’interprete
(della macchina astratta che riconosce L)
in corrispondenza di programmi scritti in linguaggio L
Ricordiamo il nostro obbiettivo:
Descrivere il significato di un programma scritto in linguaggio L
in termini
di cosa ci si debba aspettare dall’uso dei costrutti corretti
del linguaggio L
COSA FA IL PROGRAMMA?
94
Semantica operazionale
Ottenuta definendo un interprete del linguaggio L
su di una macchina ospite i cui componenti sono descritti in modo matematico
L’idea alla base:
Dare la semantica di un linguaggio L
mediante
la definizione del comportamento dell’interprete
(della macchina astratta che riconosce L)
in corrispondenza di programmi scritti in linguaggio L
Utile perché fornisce direttamente un modello di
implementazione
Definibile in modo formale a partire dalla sintassi
(Semantica Operazionale Strutturata)
95
Sintassi astratta per
definire la semantica
Una descrizione sintattica
che evidenzia la struttura sintattica essenziale dei vari costrutti del linguaggio
Alberi di derivazione
che rispettano i vincoli contestuali
Strumento utile per chi pensa a come sia
possibile manipolare un linguaggio
96
Partiamo dalla sintassi
Un semplice linguaggio di programmazione
<Num> ::= 1|2|……
<Var>::= X 1 ,X2……
<AExpr> ::=Num|Var|<AExpr> +<AExpr>| <AExpr> -<AExpr>
<BExpr> ::=tt|ff|<AExpr> ==<AExpr>| ¬<BExpr>|
<BExpr> ∧<BExpr>
<Com> ::= skip |<Var> := <AExpr> | <Com> ; <Com>|
if <BExpr> then <Com> else <Com>|
while <BExpr> do <Com>
La grammatica è ambigua
Ma non importa in questo contesto
97
Semantica Operazionale Srutturata
(SOS)
Definizione della semantica in modo guidato dalla sintassi
Si definiscono delle regole di transizione
che specificano
i passi della computazione di
costrutti complessi del linguaggio
(es: Exp + Exp’)
in termini dei passi della computazione di
costrutti componenti
(es: Exp e Exp’)
98
Semantica Operazionale Srutturata
(SOS)
I costrutti cui siamo interessati modificano una qualche
nozione di stato
(in cui la macchina astratta si trova durante la computazione)
Regole definite su configurazioni del tipo
<Comando, Stato>
Not. 〈C,σ〉
Configurazioni ßà Stati in cui la macchina si trova durante il suo
funzionamento (mentre l’interprete del linguaggio computa)
99
Semantica Operazionale Srutturata
(SOS)
Regole sono definite su configurazioni del tipo…
<Comando, Stato>
Un albero di derivazione
corretto
(sintassi astratta)
(es. una istruzione
corretta e che rispetti i
vincoli contestuali
in un programma scritto
in un LdP)
〈C,σ〉
E’ definito con riferimento al
modello di memoria adottato
(mantiene i valori delle
variabili coinvolte nel
comando)
Una sequenza finita di coppie (X,n):
Stato σ:
“nello stato σ la variabile X ha
valore n”
(tutte le variabili su cui il comando
agisce)
100
Semantica Operazionale Strutturata
(SOS)
Tipi di transizioni tra configurazioni
Forma semplice di una transizione: in un solo passo
<Comando, Stato> → Stato’
〈c,σ〉 → τ
σ: stato di partenza
τ: stato d'arrivo
es. comando nullo:
〈skip, σ〉 → σ
101
Semantica Operazionale Strutturata
(SOS)
Tipi di regole per la specifica di transizioni tra
configurazioni
Forma composta di una transizione:
in tanti piccoli passi
<Comando, Stato> → <Comando’, Stato’>
〈c,σ〉 → 〈c',τ〉
σ: stato di partenza
τ: stato di arrivo
es. Comando “if then else”:
〈if tt then C1 else C2 ,σ〉 → 〈C1,σ〉
102
Semantica Operazionale Strutturata
(SOS)
forma condizionale
premessa
----------------conseguenza
Le premesse sono i prerequisiti della transizione (conseguenza)
〈c1,σ1〉 → 〈c'1,σ'1〉
〈c2,σ2〉 → 〈c'2,σ'2〉
〈c,σ〉 → 〈c',σ'〉
Se c1, partendo dallo stato σ1,
può fare un passo trasformandosi in c'1, nello stato σ'1
e c2 partendo da σ2
può fare un passo trasformandosi in c'2, nello stato σ'2
Allora
il comando c partendo da σ può fare un passo trasformandosi in c' nello
stato σ'
103
Semantica delle
espressioni aritmetiche
Le configurazioni
<Comando, Stato>
〈C,σ〉
Configurazioni ßà Stati in cui la macchina si trova durante il suo
funzionamento
rappresentano gli stati in cui il sistema si trova ad operare
mentre esegue il calcolo di una espressione
104
Semantica delle
espressioni aritmetiche
Le transizioni
<Comando, Stato> → <Comando’, Stato’>
〈C,σ〉 → 〈C',σ'〉
“à” (relazione di transizione),
ovvero come si passa da una configurazione all ’altra
rappresentano il procedere del calcolo stesso
dell’espressione
Una configurazione finale rappresenta il risultato del
105
calcolo
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Come si calcola il valore di una espressione in questo linguaggi o?
In linguaggio naturale:
106
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Come si calcola il valore di una espressione in questo linguaggi o?
In linguaggio naturale:
R1: Il valore di una espressione costituita da un numero n è il valore
rappresentato da n (not. n)
es: il valore di 10 è 2
107
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Come si calcola il valore di una espressione in questo linguaggi o?
In linguaggio naturale:
R1: Il valore di una espressione costituita da un numero n è il valore
rappresentato da n (not. n)
es: il valore di 10 è 2
R2: Il valore di una espressione E + E’ si ottiene sommando n ed m
(dove n è il valore di E ed m è il valore di E’)
108
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Come si calcola il valore di una espressione in questo linguaggi o?
In linguaggio naturale:
R1: Il valore di una espressione costituita da un numero n è il valore
rappresentato da n (not. n)
es: il valore di 10 è 2
R2: Il valore di una espressione E + E’ si ottiene sommando n ed m
(dove n è il valore di E ed m è il valore di E’)
OSSERVIAMO CHE:
R1 ed R2 corrispondono alle due alternative nella definizione si ntattica di <AExpr>
R2 suggerisce il modo per calcolare una espressione complessa:
calcolare il valore delle due espressioni di cui si compone e so mmare i valori
109
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Come si calcola il valore di una espressione in questo linguaggi o?
CALCOLIAMO 10+11 applicando le regole R1 ed R2:
R2: Il valore di 10+11 è n + m, dove n è il valore di 10 ed m è il valore di 11
ABBIAMO RIDOTTO IL PROBLEMA ALLA RICERCA DEI VALORI n ed m
R1: il valore di 10 è 2
R1: il valore di 11 è 3
Sappiamo che la somma di 2 e 3 è 5
Il valore di 10 +11 è 5
110
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Come si calcola il valore di una espressione in questo linguaggio?
Riprendiamo le regole in linguaggio naturale:
R2: Il valore di una espressione E + E’ si ottiene sommando n ed m
(dove n è il valore di E ed m è il valore di E’)
Le transizioni rappresentano il procedere del calcolo
(scrivere Eàn significa dire che il valore di E è il numero naturale rappresentato da n)
111
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Come si calcola il valore di una espressione in questo linguaggio?
Riprendiamo le regole in linguaggio naturale:
R2: Il valore di una espressione E + E’ si ottiene sommando n ed m
(dove n è il valore di E ed m è il valore di E’)
Le transizioni rappresentano il procedere del calcolo
(scrivere Eàn significa dire che il valore di E è il numero naturale rappresentato da n)
R2 è vista come
regola per determinare la transizione
dalla configurazione del tipo E + E’
alla configurazione che rappresenta il valore di E + E’
transizioni: se Eàn e E’àm allora E+E’àk con k = n+m
112
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Come si calcola il valore di una espressione in questo linguaggio?
Riprendiamo le regole in linguaggio naturale:
R1: Il valore di una espressione costituita da un numero n è il val ore rappresentato
da n (not. n)
Le transizioni rappresentano il procedere del calcolo
(scrivere Eàn significa dire che il valore di E è il numero naturale rappresentato da n)
R1 è vista come
regola per determinare il valore n di una espressione semplice n
transizioni: nàn
113
Semantica delle
espressioni aritmetiche
(semplificate)
<AExpr> ::= <AExpr> + <AExpr> | <Num>
Regole di transizioni
n à n
Eàn E’àm k= n+m
E+E’ à k
Le regole sono guidate dalla sintassi
La prima regola definisce le transizioni per configurazioni cost ituite da un
elemento della struttura sintattica <Num>
La seconda regola definisce transizioni per espressioni in cui c ompare +
K=n+m ßà ipotesi di saper calcolare la somma tra numeri naturali (valori)
114
Grammatica delle
espressioni aritmetiche a valori naturale
(semplificata)
<AExpr> ::= <AExpr> + <AExpr> | <AExpr> - <AExpr> | (AExpr) |<Num>
<Num>::= 1|2|…..
La semantica di questo linguaggio è una estensione
Di quello appena visto
115
Semantica delle espressioni aritmetiche
sui numeri naturali
(estensione delle regole precedenti)
n→n
Eàn
Eàn
E’àm
k= n+m
E+E’ à k
E’àm n > m
E-E’ à k
k = n-m
Eàn
(E) à n
In che senso semantica del linguaggio delle espressioni aritmeti che?
Vediamo le configurazioni finali come i valori delle espressioni di partenza
116
Osserviamo che
Siano a questo punto abbiamo fatto una semplificazione:
le transizioni erano determinate come funzioni che associavano
ad una espressione (in termini di struttura astratta) il valore
di questa espressione:
Eàk
Che fine ha fatto il concetto di STATO?
117
Grammatica delle
espressioni aritmetiche a valori naturali
con identificatori
<AExpr> ::=<Num>|<Var>|<AExpr> +<AExpr>|
<AExpr> +<AExpr>
<Num> ::= 1|2|……
<Var>::= X 1……
<AExpr>::= <Var>
consente di scrivere espressioni in cui compaiono nomi
(identificatori)
118
Semantica delle
espressioni aritmetiche a valori naturali
con identificatori
Il significato di una espressione
x+2
dipende dal significato di x (valore associato ad x)
In questo contesto serve una qualche nozione di
STATO
119
Semantica delle
espressioni aritmetiche a valori naturale
con identificatori
Il significato di una espressione
x+2
dipende dal significato di x (valore associato ad x)
In questo contesto serve una qualche nozione di
STATO
Le transizioni sono del tipo
Scrivo:
〈E,σ〉 → n
Leggo: Il valore di E date le associazioni di σ è n
120
Stato
E’ definito con riferimento al
modello di memoria della nostra macchina astratta
(mantiene i valori delle variabili)
Stato σ :
sequenza finita di coppie (X,n)
Nello stato σ la variabile X ha il valore n
(not. n = σ(X))
121
Semantica delle
espressioni aritmetiche
σ(X) = n
<n, σ> → n
<E, σ>àn
<E, σ>àn
<E’, σ> à m
<E +E’,σ> à k
<E’, σ> à m n>m
<E-E’,σ> à k
k= n+m
k= n-m
<E, σ>àn
<(E), σ> à n
122
Semantica delle
espressioni aritmetiche
σ(X) = n
<AExpr> ::=<Var>
<n, σ> → n
<E, σ>àn
<E, σ>àn
<E’, σ> à m
<E+E’,σ> à k
<E’, σ> à m n>m
<E-E’,σ> à k
k= n+m
k= n-m
<E, σ>àn
<(E), σ> à n
123
Esempio Completo
Tramite la seguente grammatica …
<AExpr> ::= <Num>|<Var>|<AExpr> +<AExpr>| <AExpr> -<AExpr>
<Num> ::= 1|2|……
<Var>::= X1 ,X2……
Generiamo la stringa sintatticamente corretta
X1+8 – X2
(con struttura astratta )
<AExpr>
<AExpr>
+
<AExpr>
<Var>
<AExpr>
X1
<Num>
<Var>
8
X2
-
<AExpr>
124
Esempio Completo
Valutiamo la semantica della struttura astratta X1 + 8 -X2 a partire da
uno stato σ che associa a X1 il valore 5 e ad X2 il valore 3
Ricordate che la stringa, in realtà è l’albero di derivazione
<X1 + 8 – X2, σ> à{…} 10
<X1 + 8 –X2, σ> à k
125
Esempio Completo
Valutiamo la semantica della struttura astratta X1 + 8 -X2 a partire da
uno stato σ che associa a X1 il valore 5 e ad X2 il valore 3
Ricordate che la stringa, in realtà è l’albero di derivazione
3:
<E, σ>àn <E’, σ> à m
<E + E’,σ> à k
<X1, σ>àn
k= n+m
<X1 + 8 – X2, σ> à{…} 10
<8-X2, σ> à m
<X1 + 8 –X2, σ> à k
k= n+m
3
126
Esempio Completo
Valutiamo la semantica della struttura astratta X1 + 8 -X2 a partire da
uno stato σ che associa a X1 il valore 5 e ad X2 il valore 3
Ricordate che la stringa, in realtà è l’albero di derivazione
<X1 + 8 – X2, σ> à{…} 10
1: σ(X) = n
1
<X1, σ>à5
<8-X2, σ> à m
<X1 + 8 –X2, σ> à k
k= 5+m
3
127
Esempio Completo
Valutiamo la semantica della struttura astratta X1 + 8 -X2 a partire da
uno stato σ che associa a X1 il valore 5 e ad X2 il valore 3
Ricordate che la stringa, in realtà è l’albero di derivazione
4:
<E, σ>àn <E’, σ> à m n>m
<E-E', σ>àk
1
<X1, σ>à5
<8, σ>àn1
k= n-m <X1 + 8 – X2, σ> à{…} 10
<X2, σ> à m2 n1>m2
<8-X2, σ>àm
<X1+ 8 –X2, σ> à k
m= n1-m2
4:
k= 5+m
3
128
Esempio Completo
Valutiamo la semantica della struttura astratta X1 + 8 -X2 a partire da
uno stato σ che associa a X1 il valore 5 e ad X2 il valore 3
Ricordate che la stringa, in realtà è l’albero di derivazione
<X1 + 8 – X2, σ> à{…} 10
2: <n, σ> → n
1
<X1, σ>à5
2
<8, σ>à8 <X2, σ> à m2
8>m2
m= 8-m2
4:
k= 5+m
<X1 + 8 –X2, σ> à k
3
129
Esempio Completo
Valutiamo la semantica della struttura astratta X1 + 8 -X2 a partire da
uno stato σ che associa a X1 il valore 5 e ad X2 il valore 3
Ricordate che la stringa, in realtà è l’albero di derivazione
<X1 + 8 – X2, σ> à{…} 10
1: σ(X) = n
1
<X1, σ>à5
2
1
<8, σ>à8 <X2, σ> à 3
8>3
<8-X2, σ>à5
<X1+ 8 –X2, σ> à 10
5= 8-3
4:
10= 5+5
3
130
Un semplice L
La sintassi
<Exp> ::= <Const> | <Var> | (<Exp>) | <Exp> <Op>
<Exp> | <!Exp>
<Op> ::= + | - | * | / | % | == | != | < | <= | > | >= | && | ||
<Const> ::= <Num> | <Bool>
<Bool> ::= true | false
<Num> ::= ...
3
131
Semantica delle
espressioni logiche
〈true, σ〉 → tt
〈false, σ〉 → ff
<E, σ>àbv
<E, σ>àbv
Op.elementari
<E’, σ> à bv’
bv’’= bv ∨ bv’
<E || E’,σ> à bv’’
<E’, σ> à bv’ bv‘’= bv ∧ bv’
<E&&E’,σ> à bv’’
secondo la tavola di verità
<E, σ>àbv bv’ = ¬bv
<!E, σ> à bv’
bv indica un valore booleano tt o ff
132
Semantica delle
espressioni logiche
<E, σ>àn
<E’, σ> à m
bv = n rel m
<E rel E’,σ> à bv
Rel indica uno qualunque degli operatori di confronto
133
I comandi
Stato σ :
sequenza finita di coppie (X,n)
Nello stato σ la variabile X ha il valore n
La soluzione ad un problema di programmazione consiste
nella individuazione di una sequenza di azioni che
modifcano lo stato iniziale fino a trasformarlo nello
stato finale desiderato
Modifica di uno stato
σ[X ← v]: nuovo stato simile a σ dove la variabile X
prende il nuovo valore v
134
La sintassi dei comandi
<Com> ::= skip |<Var> := <AExpr> | <Com> ; <Com>|
if <BExpr> then <Com> else <Com>|
while <BExpr> do <Com>
<BExpr> ::=tt|ff|<AExpr> ==<AExpr>| ¬<BExpr>|
<BExpr> ∧<BExpr>
135
Semantica dei comandi
Le transizioni sono del tipo
Scrivo:
〈C,σ〉 → τ
Leggo: Il comando C, date le associazioni di σ, porta nello stato σ‘
136
Semantica dei comandi
〈skip, σ〉 → σ
Com nullo
〈E, σ〉 → n
〈X := E, σ〉 → σ[X ← n]
Com assegnazione
〈c1, σ〉 →σ’ 〈c2, σ’〉→ τ
〈c1 ; c2, σ〉 → τ
Com blocco di istruzioni da
eseguire in ordine
137
Semantica dei comandi
〈E, σ〉 → tt
〈c1, σ〉 → τ
〈if E then c1 else c2, σ〉 → τ
〈E, σ〉 → ff
〈c2, σ〉 → τ
〈if E then c1 else c2, σ〉 → τ
138
Semantica dei comandi
〈E, σ〉 → ff
〈while E do C, σ〉 → σ
〈E, σ〉 → tt
<C, σ>
Se la condizione è falsa lo
stato non viene modificato
(eq. Com nullo)
〈while E do C, σ’〉 → τ
〈while E do C, σ〉 → τ
Se la condizione è vera C viene ripetutamente eseguito
139
Esempio
Valutiamo la semantica della struttura astratta x=2; y=3; x=x-1 a
partire da uno stato σ0 che associa a x e y il valore 0
Ricordate che la stringa, in realtà è l’albero di derivazione
<x=2; y=3; x=x-1, σ0 > à{…} σ 0[xß1, yß3]
<x=2; y=3; x=x -1;, σ0> à σf
140
Esempio
Valutiamo la semantica della struttura astratta x=2; y=3; x=x-1 a
partire da uno stato σ0 che associa a x e y il valore 0
Ricordate che la stringa, in realtà è l’albero di derivazione
〈c1, σ〉 →σ’ 〈c2, σ’〉→ τ
〈c1 ; c2, σ〉 → τ
<x=2;, σ0> à σ1
<x=2; y=3; x=x-1, σ0 > à{…} σ 0[xß1, yß3]
<y=3; x=x-1;, σ1> àσf
<x=2; y=3; x=x -1;, σ0> à σf
141
Esempio
Valutiamo la semantica della struttura astratta x=2; y=3; x=x-1 a
partire da uno stato σ0 che associa a x e y il valore 0
Ricordate che la stringa, in realtà è l’albero di derivazione
〈Ε, σ〉 → n
〈x := Ε, σ〉 → σ[x← n]
<x=2; y=3; x=x-1, σ0 > à{…} σ 0[xß1, yß3]
<2, σ0> à 2
<x=2;, σ0> à σ1 = σ0[xß2]
<y=3; x=x-1;, σ1 = σ0[xß2] > àσf
<x=2; y=3; x=x -1;, σ0> à σf
142
Esempio
Valutiamo la semantica della struttura astratta x=2; y=3; x=x-1 a
partire da uno stato σ0 che associa a x e y il valore 0
Ricordate che la stringa, in realtà è l’albero di derivazione
〈c1, σ〉 →σ’ 〈c2, σ’〉→ τ
〈c1 ; c2, σ〉 → τ
<2, σ0> à 2
<x=2; y=3; x=x-1, σ0 > à{…} σ 0[xß1, yß3]
<y=3; σ1 = σ0[xß2] > àσ2
<x=2;, σ0> à σ1 = σ0[xß2]
<x=x-1; σ2> àσf
<y=3; x=x -1;, σ1 = σ0[xß2] > àσf
<x=2; y=3; x=x -1;, σ0> à σf
143
Esempio
Valutiamo la semantica della struttura astratta x=2; y=3; x=x-1 a
partire da uno stato σ0 che associa a x e y il valore 0
Ricordate che la stringa, in realtà è l’albero di derivazione
〈Ε, σ〉 → n
〈x := Ε, σ〉 → σ[x← n]
<x=2; y=3; x=x-1, σ0 > à{…} σ 0[xß1, yß3]
<3, σ1> à 3
<2, σ0> à 2
<y=3; σ 1 = σ 0[xß2] > àσ 2= σ 0[x=2 yß3] <x=x -1; σ 2> àσ f
<x=2;, σ0> à σ1 = σ0[xß2]
<y=3; x=x -1;, σ1 = σ0[xß2] > àσf
<x=2; y=3; x=x -1;, σ0> à σf
144
Esempio
Valutiamo la semantica della struttura astratta x=2; y=3; x=x-1 a
partire da uno stato σ0 che associa a x e y il valore 0
Ricordate che la stringa, in realtà è l’albero di derivazione
〈Ε, σ〉 → n
〈x := Ε, σ〉 → σ[x← n]
<x=2; y=3; x=x-1, σ0 > à{…} σ 0[xß1, yß3]
σ f= σ 2[xß1]’ =σ 1[yß3] àσ 0[xß1 yß3]
<3, σ1> à 3
<2, σ0> à 2
<x-1, σ2> à 1
<y=3; σ 1 = σ 0[xß2] > àσ 2= σ 0[x=2 yß3] <x=x -1; σ 2> àσ f
<x=2;, σ0> à σ1 = σ0[xß2]
<y=3; x=x -1;, σ1 = σ0[xß2] > àσf
<x=2; y=3; x=x -1;, σ0> à σf
145
Esercizio
Valutiamo la semantica della struttura astratta while x>0 do x=x-1 a
partire da uno stato σ che associa a x il valore 2
146
Computazione
• Sequenza di transizioni concatenate
non ulteriormente estendibile
in cui ogni transizione è premessa di
qualche regola
• Due tipi di computazioni
terminanti: finite
divergenti: infinite (loop)
147
Pragmatica e Implementazione
“a che serve / come
usare un certo un certo
costrutto linguistico ?”
• Connesso alla
realizzazione
pratica dei
• Obiettivo: migliorare il
compilatori
sw
–
• Fattori in evoluzione
–
–
Convenzioni
Stile
• Usare il goto ?
• Modificare le variabili
dei cicli for ?
• Modalità di passaggio di
parametri
• Scelta iterazioni
–
–
“come vengono
implementati ?”
“a quale costo ?”
• Domande di tipo
ingegneristico
148