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