5 - Linguaggi
5 - Linguaggi
Obiettivo:
produrre programmi corretti, leggibili, efficienti, modificabili,
riusabili (generali), portabili, robusti.
IL PUNTO DI PARTENZA
Principi base:
• La “macchina”... ma non la macchina hardware!
• procedere per livelli di astrazione
• Occorre un livello di • garantire al programma strutturazione e modularità
astrazione adeguato
Macchina
Due metodologie di sviluppo:
Linguaggio di • metodologia TOP-DOWN
Hardware
alto livello
• metodologia BOTTOM-UP
1 2
3 4
LINGUAGGI LINGUAGGI DI PROGRAMMAZIONE
Dal dizionario: Un linguaggio di programmazione è una notazione formale
per descrivere algoritmi.
Un linguaggio è un insieme di parole e di metodi di
combinazione delle parole usate e comprese da una PROGRAMMA
comunità di persone.
È la descrizione di un algoritmo in un particolare linguaggio
È una definizione poco precisa, perché: di programmazione.
• non evita le ambiguità tipiche dei linguaggi naturali
• Quali “parole chiave” ?
• non si presta a descrivere processi computazionali • Quali meccanismi di combinazione ?
meccanizzabili
• non aiuta a stabilire proprietà su cui poter effettuare
ragionamenti
SINTASSI e SEMANTICA
Ogni linguaggio è caratterizzato da:
Ci serve una nozione di linguaggio più precisa: • sintassi: l’insieme di regole formali per la scrittura di
programmi in quel linguaggio, che dettano le modalità
LINGUAGGIO come SISTEMA MATEMATICO
per costruire frasi corrette nel linguaggio stesso.
in modo da poter rispondere a domande come:
• quali sono le frasi lecite? • semantica: l’insieme dei significati da attribuire alle
frasi (sintatticamente corrette) costruite nel linguaggio.
• si può stabilire se una frase appartiene al linguaggio?
• come si stabilisce il significato di una frase?
• quali elementi linguistici primitivi occorrono per poter Una frase può essere sintatticamente corretta
esprimere la soluzione a qualsiasi problema (risolubile)? e tuttavia non aver alcun significato!
5 6
Linguaggio L su un alfabeto V
SEMANTICA
È un sottoinsieme di V*.
La semantica è esprimibile:
a parole → poco precisa e ambigua ESEMPIO
mediante azioni (sem. operazionale) Sia V = { if, el3e, ==, A, 0, =, +, 1, 2, (, ) }
mediante funzioni matematiche (sem. denotazionale)
Allora V* = {
mediante formule logiche (sem. assiomatica) Non tutte queste
if (A == 0) A = A + 2,
if el3e A, frasi faranno parte
del linguaggio!
do =A,
...
}
7 8
LINGUAGGI e GRAMMATICHE LINGUAGGI e GRAMMATICHE (segue)
Come specificare il sottoinsieme di V*
che definisce il linguaggio? Una Grammatica BNF definisce quindi un linguaggio
sull’alfabeto terminale mediante un meccanismo di
Specificando il modo formale e preciso la sintassi delle derivazione o riscrittura.
frasi del linguaggio.
DERIVAZIONE
GRAMMATICA FORMALE
Sia G una grammatica e , due stringhe, cioè due
Una Grammatica è una notazione matematica per elementi dell’universo linguistico (VNVT)*
esprimere in modo rigoroso la sintassi di un linguaggio.
Si dice che deriva direttamente da (e si scrive → )
se le stringhe si possono decomporre in:
Una Grammatica BNF è una quadrupla VT,VN,P,S dove:
=A =
• VT è un insieme finito di simboli terminali ed esiste la produzione A::= .
Alfabeto
• VN è un insieme finito di simboli non terminali
• P è un insieme finito di produzioni, ossia di regole di Si dice che deriva da se esiste una sequenza di
riscrittura derivazioni dirette che da possono infine produrre :
= → → → → n =
• S è un particolare simbolo non-terminale detto
simbolo iniziale o scopo della grammatica.
LINGUAGGIO GENERATO DA UNA
GRAMMATICA
Una Grammatica BNF è una grammatica le cui regole di
produzione hanno la forma: Data una grammatica G, si dice
X ::= A linguaggio LG generato da G
dove l’insieme delle frasi di V derivabili dal simbolo iniziale S,
• X VN è un simbolo non terminale, e applicando le produzioni P.
• A è una stringa, ossia una sequenza di simboli ciascuno
appartenente all’alfabeto V = VN VT. Le frasi di un linguaggio di programmazione vengono dette
programmi di tale linguaggio.
9 10
ESEMPIO
G = VT,VN,P,S ESEMPIO DI DERIVAZIONE (LEFT-MOST)
VT = { il, gatto, topo, sasso, mangia, beve } A partire dallo scopo della grammatica, si riscrive sempre il
simbolo non-terminale più a sinistra.
VN = { <frase>, <soggetto>, <verbo>, <compl-oggetto>,
<articolo>, <nome> }
<frase>
S = <frase>
→ <soggetto> <verbo> <compl-oggetto>
P = { → <articolo> <nome> <verbo> <compl-oggetto>
<frase> ::= <soggetto> <verbo><compl-oggetto> → <articolo> <nome> <verbo> <compl-oggetto>
<soggetto> ::= <articolo><nome> → il gatto <verbo> <compl-oggetto>
<articolo> ::= il
→ il gatto mangia <compl-oggetto>
<nome> ::= gatto | topo | sasso
<verbo> ::= mangia | beve → il gatto mangia <articolo><nome>
<compl-oggetto> ::= <articolo> <nome> → il gatto mangia <articolo> <nome>
} → il gatto mangia il topo
11 12
EXTENDED BNF ESEMPIO 2: LA SINTASSI DEI NUMERI INTERI
Introduce alcune notazioni compatte per alleggerire la Numeri interi di lunghezza qualsiasi, con o senza segno
scrittura delle produzioni.
Scelta: non si permettono numeri che iniziano per 0, a
Forma EBNF BNF equivalente significato eccezione di 0 stesso (ad esempio, 03 non è ammesso).
a può comparire
X ::= [a] B X ::= B | aB
0 o 1 volta
X ::= B | aB | …| a B a può comparire
n V = { 0,1,2,3,4,5,6,7,8,9, +, -}
X ::= {a}n B
da 0 a n volte
a può comparire 0 N = { <intero>, <intero-senza-segno>, <cifra>,
X ::= {a} B X ::= B | aX <cifra-non-nulla>}
o più volte
S = <intero>
NOTARE che la produzione X ::= B | aX è ricorsiva.
P= {
<intero> ::= [+|-] <intero-senza-segno>
Per raggruppare categorie sintattiche: <intero-senza-segno> ::= 0 | <cifra-non-nulla> {<cifra>}
<cifra>::= 0 | <cifra-non-nulla>
Forma EBNF BNF equivalente significato <cifra-non-nulla> ::= 1|2|3|4|5|6|7|8|9
}
X ::= (a | b ) D | c X ::= a D | b D | c raggruppa categorie
sintattiche
13 14
NB:
poiché X ::= {a} B equivale a X ::= B | aX, <intero>::= <intero-senza-segno>
-
la forma X ::= C {a} equivale a X ::= C | Xa,
+
e la regola:
<intero-senza-segno> ::= <cifra-non-nulla> {<cifra>} <intero-senza-segno>::= 0
equivale a:
<intero-senza-segno> ::= <cifra-non-nulla>
<cifra-non-nulla> | <intero-senza-segno> <cifra>
<cifra>
<identificatore>::= <lettera>
<intero>
<lettera>
- <intero-senza-segno>
<cifra>
<intero-senza-segno> <cifra
<intero-senza-segno> <cifra 7
<intero-senza-segno> <cifra 5
<cifra-non-nulla> 4
15 16
GRAMMATICHE, LINGUAGGI e MACCHINE PER RICONOSCERE LINGUAGGI
MACCHINE PER RICONOSCERE LINGUAGGI
Per i linguaggi generati da grammatiche di tipo 1
Grammatiche di diversa struttura comportano (e quindi anche di tipo 2 e tipo 3, che sono casi particolari)
linguaggi con diverse proprietà, e implicano esiste un procedimento effettivo (algoritmo) per
macchine di diversa “potenza computazionale” decidere se una frase appartiene al linguaggio.
per riconoscere tali linguaggi.
Un tale procedimento non esiste invece per grammatiche
di tipo 0.
CLASSIFICAZIONE DELLE GRAMMATICHE
SECONDO CHOMSKY
A ogni tipo di grammatica corrisponde un tipo di
Le grammatiche vengono classificate in base alla struttura macchina astratta capace di riconoscerne le frasi:
delle regole di produzione.
• tipo 1 (grammatica dipendente dal contesto)
→ Macchina di Turing
Tipo 0:
Generalità
• tipo 2 (grammatica libera dal contesto)
nessuna restrizione sulle produzioni
→ Macchina a stack
Tipo 1 (dipendenti dal contesto): • tipo 3 (grammatiche regolari)
Generalità
Tipo 3 (regolari):
17 18