grammatiche dei linguaggi di programmazionelaneve/html/lez1-sintassi.pdf · definire la grammatica,...
TRANSCRIPT
1
GRAMMATICHE DEI LINGUAGGI DI PROGRAMMAZIONE
Cosimo Laneve
2
argomenti
1. linguaggi di programmazione
2. definizione formale di insiemi infiniti
3. la grammatica e la notazione BNF
4. notazioni alternative e EBNF
5. esempi/esercizi
questa lezione non si trova sul Savitch
3
linguaggi di programmazione
un linguaggio di programmazione è un insieme di frasi (detti “programmi”) per cui esiste un calcolatore che li esegue
osservazione: non tutti gli insiemi di frasi sono “eseguibili” {! matteo è ricco, marco ha la penna, !! ! ! maria mangia, mirella guarda, !! ! ! mirko legge il giornale! ! } !
è un insieme di frasi per cui non esiste un calcolatore che li possa eseguire
4
insiemi finiti e infiniti
problema: come definire formalmente un linguaggio di programmazione? • come definire con precisione l’insieme delle frasi?
osservazione: sappiamo definire con precisione gli insiemi finiti: – cifre = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} – giorni = {lun, mar, mer, gio, ven, sab, dom}
siamo imprecisi sugli insiemi infiniti: – naturali = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, …} – colori = {bianco, rosso, grigio antracite, …}
cosa significano i “…”?
5
sintassi/Backus
John Warner Backus vincitore del 1977 ACM Turing Award for profound, influential, and lasting contributions to the design of practical high level programming systems, notably through his work on FORTRAN, and for publication of formal procedures for the specification of programming languages.
la definizione formale di insiemi infiniti: definire la grammatica, un insieme finito di regole che consentono di derivare solamente ed esattamente gli elementi dell’insieme che stiamo definendo
esempio: i naturali sono tutte le frasi derivabili dalla grammatica cifra = 0 cifra = 1 cifra = 2 cifra = 3 cifra = 4 … cifra = 9 naturale = cifra naturale = cifra naturale
6
grammatica/derivazioni
come derivare il naturale 257 naturale = cifra naturale
= cifra cifra naturale = cifra cifra cifra = 2 cifra cifra = 2 cifra 7 = 2 5 7!
osservazione: una derivazione è una sequenza finita di sostituzioni (o espansioni)
il linguaggio generato dal non-terminale naturale è l’insieme di frasi (= sequenze di simboli terminali) derivabili da esso
7
la notazione BNF -- Backus-Naur Formè una notazione per abbreviare le regole sintattiche anziché scrivere
cifra = 0 ; cifra = 1; cifra = 2 ; cifra = 3 ; cifra = 4 ; cifra = 5 ; cifra = 6 ; cifra = 7 ; cifra = 8 ; cifra = 9 naturale = cifra ; naturale = cifra naturale
conviene scrivere
cifra = 0 ⏐ 1 ⏐ 2 ⏐ 3 ⏐ 4 ⏐ 5 ⏐ 6 ⏐ 7 ⏐ 8 ⏐ 9! naturale = cifra ⏐ cifra naturale
esempio: i numeri interi (= naturali che possono essere prefissati dai segni + oppure –) intero = naturale | + naturale | – naturale
il simbolo | rappresenta !l’alternativa
8
i programmi in C++
programma = #include <iostream>!! ! ! using namespaces std ;! int main(){ ! lista_di_dichiarazioni lista_di_comandi return (0) ; }!
esempio: int main(){ return(0) ; }
(lista_di_dichiarazioni e lista_di_comandi sono vuoti)
9
grammatica/notazione Stoutroup
esempio scrive “:” invece di “=”
mette in colonna invece di usare “|”
10
grammatica/notazione diagrammi sintattici !!!! cifra !
!
! naturale
0
1
9
cifra
ricapitolando • una grammatica è uno strumento linguistico per definire
insiemi infiniti di stringhe in maniera precisa e inequivocabile
• è utilizzata per definire i linguaggi di programmazione esempio: programma = int main(){ lista_di_dichiarazioni lista_di_comandi return(0); }
• le grammatiche sono alla base di molti tool relativi ai linguaggi di programmazione, a partire dal compilatore
• cosa vi chiediamo: 1. data una grammatica, quale linguaggio genera? 2. data una descrizione informale di un linguaggio, sapete formalizzarlo
tramite una grammatica?11
BNF – esercizio 1: dalla grammatica al linguaggio
grammatica: N = NCIFRA | NCARATTERE NCIFRA!
! NCIFRA = CIFRA | CIFRA NCIFRA! ! NCARATTERE = CARATTERE | CARATTERE NCARATTERE! ! CIFRA = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9! ! CARATTERE = a | b | c | d | e | f | … | x | y | z! !!! qual è il linguaggio generato da N?
12
BNF – esercizio 2
grammatica: ! N = NCIFRA | NCARATTERE NCIFRA! ! NCIFRA = CIFRA | CIFRA NCIFRA! ! NCARATTERE = CARATTERE | CARATTERE NCARATTERE! ! CIFRA = 0 | PARI | DISPARI! ! PARI = 2 | 4 | 6 | 8! ! DISPARI = 1 | 3 | 5 | 7 | 9! ! CARATTERE = a | b | c | d | e | f | … | x | y | z! !! qual è il linguaggio generato da N?
13
BNF – esercizio 3: dal linguaggio alla grammatica
linguaggio: insieme delle stringhe composte da un numero dispari di coppie miste (cifra carattere) oppure (carattere cifra) intervallate da “.”
esempi: a4.5b.2c 7s a1.2b.2c.6r.0e !! qual è la grammatica che lo genera?
14
BNF – esercizio 4: dal linguaggio alla grammatica
linguaggio: insieme delle stringhe palindrome su un alfabeto composto solo da “a” e “b” !
a b aa bb aba abba ababa bab !! qual è la grammatica che lo genera?
15
BNF – stringa vuota
il simbolo ε viene usato per indicare la stringa vuota
esempio: N = ε | a N! - genera il linguaggio delle sequenze anche nulle di a cioè
{ ε, a, aa, aaa, ... }
il simbolo ε • consente di definire linguaggi che includono anche la stringa vuota • consente di riscrivere le definizioni di alcuni linguaggi in modo più
compatto • ricordarsi dell’assioma (σ è una frase): σ ε = ε σ = σ
16
BNF – esercizio 5: stringa vuota
la grammatica dell'Esercizio 1: !
N = NCIFRA | NCARATTERE NCIFRA! ! NCIFRA = CIFRA | CIFRA NCIFRA! ! NCARATTERE = CARATTERE | CARATTERE NCARATTERE! ! CIFRA = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9! ! CARATTERE = a | b | c | d | e | f | … | x | y | z !
!come si può semplificare usando il simbolo ε ?
!
17
BNF – esercizio 6: stringa vuota
la grammatica dell'Esercizio 4: !
N = a | b | aa | bb | a N a | b N b!!!!
come si può semplificare usando il simbolo ε ? !
18
EBNF
EBNF: estendono le grammatiche BNF con dei simboli aggiuntivi per la definizioni di parti opzionali o ricorrenti: parentesi tonde, quadre e graffe. !
la sintassi del linguaggio C+o- è espressa con grammatiche EBNF
19
EBNF – parentesi tonde
parentesi tonde ( ) : indicano una sola occorrenza, tipicamente si usano per alternative annidate:
! N = (a|b) c
!produce stringhe della forma ac oppure bc equivale alla grammatica
N = M c! ! ! ! ! ! M = a | b
20
EBNF – parentesi quadre
parentesi quadre [ ] : indicano 0 o 1 occorrenza esempio: N = [a] c produce stringhe della forma c oppure ac
equivale alla grammatica N = M c!
M = ε | a
anche nelle parentesi quadre possiamo inserire alternative annidate N = [a | b] c produce stringhe della forma c oppure ac oppure bc equivale alla grammatica ! N = M c M = ε | a | b
21
EBNF – parentesi graffe
parentesi graffe { } : indicano 0, 1 o più occorrenze: N = {a} c
● produce stringhe della forma c, ac, aac, aaac...!● equivale alla grammatica N = M c!
M = ε | a M
anche con le parentesi graffe possiamo esprimere alternative annidate:
! ! ! ! ! N = {a | b} c
● produce stringhe della forma c, ac, bc, abc, bac, abac...
● equivale alla grammatica N = M c! M = ε | a M | b M
22
EBNF – esercizio 7
riprendiamo la grammatica BNF dell'Esercizio 1: !
N = NCIFRA | NCARATTERE NCIFRA! !! NCIFRA = CIFRA | CIFRA NCIFRA! !! NCARATTERE = CARATTERE | CARATTERE NCARATTERE! !! CIFRA = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9! !! CARATTERE = a | b | c | d | e | f | … | x | y | z!
!come la si può semplificare usando le parentesi?
23
EBNF – esercizio 8
la grammatica dell'Esercizio 3: ! N = COPPIA | COPPIA . COPPIA . N! !!COPPIA = CIFRA CARATTERE | CARATTERE CIFRA! !!CIFRA = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9! !!CARATTERE = a | b | c | d | e | f | … | x | y | z! !come la si può semplificare usando le parentesi?
24
EBNF – esercizio 9
la grammatica dell'Esercizio 4: ! N = a | b | aa | bb | a N a | b N b! !!
come si può semplificare usando le parentesi?
25
EBNF – Altri esercizi
quali linguaggi generano le seguenti grammatiche? 1. N = {a|b}!
2. N = {a}|{b}!
3. N = {a}{b}!
4. N = {a[b]}
26
27
grammatica/esercizi 1. la definizione dei naturali consente di derivare sequenze di cifre
del tipo 0000 oppure 001 – dare una definizione dei naturali in cui non è possibile derivare sequenze
come quelle di sopra – dare una definizione degli interi in cui non è possibile derivare +0 oppure –
0
2. un identificatore è una sequenza di lettere minuscole o maiuscole ed il simbolo “_” (underscore) e che non inizia con “_”
– definire la grammatica degli identificatori
3. un numero razionale è un numero con un punto “.” Con o senza segno e con o senza una parte decimale. La parte decimale è una sequenza di cifre.
– definire la grammatica dei numeri razionali