1. LFC
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Linguaggi formali e compilazione
Corso di Laurea in Informatica
A.A. 2008/2009
2. LFC
Linguaggi formali e compilazione
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Formalismi generativi
Espressioni e linguaggi regolari
Grammatiche libere
Altri tipi di grammatiche
3. LFC
Linguaggi formali e compilazione
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Formalismi generativi
Espressioni e linguaggi regolari
Grammatiche libere
Altri tipi di grammatiche
4. LFC
Linguaggi regolari
Formalismi
generativi
Espressioni regolari
Un linguaggio L su un alfabeto Σ = {a1 , . . . , an } si Grammatiche libere
Altri tipi di grammatica
dice regolare se può essere espresso mediante
composizione finita di operazioni di concatenazione,
unione e chiusura riflessiva a partire dai linguaggi
elementari (detti anche unitari) {a1 }, . . . , {an }.
Ogni linguaggio finito è chiaramente regolare mentre
ci sono abbondanti esempi di interessanti linguaggi
infiniti che non sono regolari.
Come vedremo, i linguaggi regolari giocano un ruolo
importante nella definizione del lessico di un
programma scritto in linguaggio ad alto livello, oltre
che in svariati altri campi dell’Informatica.
5. LFC
Esempi di linguaggi regolari
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Sia Σ l’alfabeto ASCII e sia X = X1 X2 . . . Xn una Altri tipi di grammatica
generica stringa di Σ∗ . Il linguaggio {X } è regolare in
quanto esprimibile come concatenazione dei
linguaggi unitari {X1 }, {X2 }, . . . , {Xn }.
Il linguaggio {X , Y , Z }, dove X , Y e Z sono stringhe
generiche sull’alfabeto ASCII è regolare perché
esprimibile come unione dei linguaggi regolari
{X }, {Y }, e {Z }.
Generalizzando l’esempio precedente si dimostra
come ogni linguaggio finito sia esprimibile come
unione di concatenzazioni di linguaggi unitari.
6. LFC
Altri esempi
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Il linguaggio L5 = {an bm |n, m ≥ 0} è regolare in
quanto esprimibile nel modo seguente
L5 = {a}∗ {b}∗ .
I seguenti linguaggi, introdotti nel gruppo di lucidi
introduttivi, sono tutti regolari:
R
{ab, c}2 , {ab, c}3 , {ab, c}∗ , {ab, c}+ , {ab, c}2
Il linguaggio L6 = {an bn |n ≥ 0} non è regolare.
Il linguaggio L10 = {an |n primo} non è regolare.
7. LFC
Espressioni regolari
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Le espressioni regolari su un alfabeto Σ sono un Altri tipi di grammatica
formalismo che riflette (e semplifica) le costruzioni
delineate sopra per la definizione di linguaggi
regolari.
Più precisamente, le espressioni regolari (e.r.)su Σ
sono definite ricorsivamente nel modo seguente:
Base. Φ è un’espressione regolare che
denota l’insieme vuoto;
per ogni a ∈ Σ, a è un’e.r. che denota
l’insieme {a};
8. LFC
Espressioni regolari
Formalismi
Segue definizione di e.r. generativi
Espressioni regolari
Grammatiche libere
Concatenazione Se E ed F sono e.r., la scrittura EF è Altri tipi di grammatica
un’e.r. che denota l’insieme di stringhe che
possono essere scritte concatenando una
stringa dell’insieme denotato da E (più
brevemente diremo “una stringa di E”) con
una stringa di F;
Unione Se E ed F sono e.r., la scrittura E + F è
un’e.r. che denota l’unione di E e di F.
Chiusura Se E è un’e.r., la scrittura E ∗ è un’e.r. che
denota l’insieme delle stringhe ottenute
concatenando stringhe di E un numero
arbitrario i ≥ 0 di volte.
9. LFC
Espressioni regolari
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Un’ulteriore regola
Parentesi. Se E è un’e.r., la scrittura (E) è un’e.r.
equivalente alla prima, cioè che denota lo
stesso insieme di stringhe
serve a forzare un ordine di composizione delle
espressioni diverso da quello standard (in base al quale
chiusura precede concatenazione che precede unione).
10. LFC
Esempi
L’espressione regolare 0 + 1∗ 10 su B (interpretabile Formalismi
generativi
come 0 + ((1∗ )10), in base alle regole di Espressioni regolari
Grammatiche libere
precedenza) denota il linguaggio Altri tipi di grammatica
R1 = {0, 10, 110, 1110, . . .}.
Il linguaggio R1 è chiaramente differente dal
linguaggio R2 su B definito dall’espressione regolare
(0 + 1)∗ 10, che consiste di tutte le stringhe binarie
che terminano con 10.
Posto Σ = {a, b, c}, l’espressione regolare
a(b + c)∗ a denota il linguaggio R3 su Σ costituito
dalle stringhe che iniziano e terminano con il
carattere a e che non contengono altri caratteri a.
La scrittura (1 + 01)∗ (0 + 1 + 01) denota il linguaggio
delle stringhe su B di lunghezza maggiore di zero
che non contengono due caratteri 0 consecutivi.
11. LFC
Abbreviazioni di uso pratico
Formalismi
generativi
Poiché { } = Φ∗ , si può utilizzare il simbolo
Espressioni regolari
per Grammatiche libere
Altri tipi di grammatica
indicare l’insieme { }.
La scrittura [E] si può utilizzare al posto della e.r. E+
e l’operatore [ ] prende il nome di opzione.
Se è definito un ordinamento fra i caratteri di Σ,
allora si possono utilizzare convenzioni specifiche
per denotare intervalli di caratteri. Ad esempio, la
scrittura [a − f] denota i caratteri compresi fra a ed f
(opzione su un intervallo).
Poiché L+ = LL∗ , l’operatore di chiusura (non
riflessiva) è ammesso nelle e.r. dove si intende che
E + = EE ∗ .
12. LFC
Abbreviazioni di uso pratico
Formalismi
n generativi
Espressioni regolari
Poiché Ln =LL . . . L, l’operatore di elevamento a Grammatiche libere
Altri tipi di grammatica
potenza è ammesso nelle e.r. e si intende che
n
En =EE . . . E.
La scrittura [E]ji si può utilizzare al posto della e.r.
E i + E i+1 + . . . + E j .
Per alcuni insiemi di caratteri di particolare
importanza (cifre, lettere, caratteri alfanumerici,
caratteri di spaziatura, ...) si possono usare
espressioni specifiche, come ad esempio
(prendendo a prestito la notazione dalle espressioni
riconosciute dal comando grep di Linux):
[: digit :], [: alpha :], [: alnum :], [: space :], . . .
13. LFC
Esempi di interesse nel contesto dei
linguaggi di programmazione
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Osserviamo dapprima che nel contesto della Altri tipi di grammatica
definizione della sintassi dei linguaggi di
programmazione il simbolo + è spesso rimpiazzato
da |.
L’espressione regolare [1 − 9][: digit :]∗ denota
l’insieme delle stringhe che rappresentano (nella
consueta rappresentazione in base 10) i numeri
interi positivi.
L’espressione regolare
[: alpha :]([: alpha :]|[: digit :])∗ denota l’insieme degli
identificatori legali in alcuni linguaggi di
programmazione (soprattutto fra i più vecchi).
14. LFC
Esercizi proposti
Scrivere un’e.r. per il seguente linguaggio Formalismi
generativi
sull’alfabeto {a, b, c}: Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
E1 = {an bm ck |m = 0 ⇒ k = 3}
Scrivere un’e.r. per il linguaggio E2 , sull’alfabeto
{a, b}, delle stringhe contenenti al più due a.
Scrivere un’e.r. per il linguaggio E3 , sull’alfabeto
{a, b}, delle stringhe contenenti un numero dispari di
b.
Scrivere un’e.r. per il linguaggio E4 , sull’alfabeto
{a, b}, definito ricorsivamente nel modo seguente:
1. ∈ E4 ;
2. Se x ∈ E4 allora anche abax ∈ E4 e xaa ∈ E4 .
Inoltre, solo le stringhe ottenibili in questo modo
appartengono a E4 .
15. LFC
Esercizi proposti
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Scrivere un’e.r. per il linguaggio E5 , sull’alfabeto Altri tipi di grammatica
{a, b, c}, costituito dalle stringhe in cui ogni
occorrenza di b è seguita da almeno un’occorrenza
di c.
Descrivere nel modo più semplice possibile, in
Italiano, il linguaggio corrispondente alla seguente
espressione regolare: ((a|b)3 )∗ (a|b).
Si dica qual è la stringa più corta che non appartiene
al linguaggio descritto dall’espressione regolare
a∗ (ab)∗ b∗ .
16. LFC
Linguaggi formali e compilazione
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Formalismi generativi
Espressioni e linguaggi regolari
Grammatiche libere
Altri tipi di grammatiche
17. LFC
Grammatiche formali
Formalismi
Come le espressioni regolari, anche le grammatiche generativi
Espressioni regolari
formali sono uno strumento per la descrizione di Grammatiche libere
Altri tipi di grammatica
linguaggi.
Sono un formalismo generativo perché il linguaggio è
definito come l’insieme delle stringhe che possono
essere “generate” usando le regole della
grammatica.
Le grammatiche libere (Context-Free Grammar o
semplicemente CFG) sono un particolare tipo di
grammatica formale che trova ampio uso nella
definizione dei linguaggi di programmazione.
Solo per fare un esempio, la struttura a blocchi dei
programmi scritti in Pascal (C, C++, Java, ...) viene
descritta mediante grammatiche libere.
18. LFC
Definizione formale di grammatica
Una grammatica G è una quadrupla di elementi: Formalismi
generativi
G = (N , T , P, S), Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
dove
N è un insieme di simboli, detti non terminali;
T è un insieme di simboli terminali, N ∩ T = Φ;
P è l’insieme delle produzioni;
S ∈ N è il simbolo iniziale (o assioma).
Conviene anche definire l’insieme V = N ∪ T come il
vocabolario della grammatica.
La forma delle produzioni è ciò che caratterizza il
“tipo” di grammatica.
In una grammatica libera le produzioni hanno la
seguente forma
A→α
dove A ∈ N e α ∈ V ∗
19. LFC
Un primo esempio di grammatica libera
Formalismi
N {E}
= generativi
Espressioni regolari
T {(, ), +, ∗, id}
= Grammatiche libere
Altri tipi di grammatica
S E
=
P {E → E+E,
=
E → E∗E,
E → (E),
E → id
}
Si noti la presenza, nella definizione di una
grammatica, dei cosiddetti metasimboli, simboli cioè
che non sono terminali ne’ non terminali.
Esempi di metasimboli sono le parentesi graffe (che
hanno il solito significato di descrizione di insieme) e
la freccia orientata a destra (→).
20. LFC
Derivazioni
Formalismi
generativi
Le grammatiche sono formalismi generativi perchè Espressioni regolari
consentono di “generare” stringhe di caratteri tramite Grammatiche libere
Altri tipi di grammatica
il meccanismo delle derivazioni.
Una derivazione è il processo mediante il quale, a
partire dall’assioma ed applicando una sequenza di
produzioni, si arriva a scrivere una stringa di T ∗ .
Al riguardo le produzioni sono anche dette regole di
riscrittura.
Una produzione del tipo
E → E+E
si legge infatti nel seguente modo: Il simbolo E può
essere “riscritto” come E+E.
21. LFC
Derivazioni (continua)
Formalismi
Sia α = βAγ, dove A ∈ N e β, γ ∈ V ∗ e sia A → δ generativi
Espressioni regolari
una produzione di G. Grammatiche libere
Altri tipi di grammatica
Applicare la produzione A → δ alla stringa α
consente di sostituire (“riscrivere”) il non terminale A
con il lato destro δ della produzione, ottenendo la
stringa βδγ.
Si dice che α deriva direttamente la stringa βδγ e si
scrive
α ⇒G βδγ
Se α1 ⇒G α2 ⇒G . . . ⇒G αk , k ≥ 1, allora si dice
che α1 deriva αk e si scrive α1 ⇒∗ αk .
G
Qualora non possano sorgere ambiguità eviteremo di
indicare la grammatica nella notazione ⇒G .
22. LFC
Esempi
Formalismi
Chiamiamo G1 la grammatica precedentemente generativi
Espressioni regolari
introdotta. Allora: Grammatiche libere
Altri tipi di grammatica
E+E ⇒G1 id+E tramite l’applicazione della
produzione E → id alla prima occorrenza di E.
E+E ⇒∗ 1 id + id tramite l’applicazione della
G
produzione E → id ad entrambe le occorrenze di E.
E ⇒∗ 1 id + (E) in quanto
G
E ⇒G1 E+E ⇒G1 E+(E) ⇒G1 id + (E).
E ⇒∗ 1 id + (id), in quanto E ⇒G1 E+E ⇒G1
G
E+(E) ⇒G1 id + (E) ⇒G1 id + (id).
Una derivazione alternativa per id + (id) è E ⇒G1
E+E ⇒G1 id+E ⇒G1 id + (E) ⇒G1 id + (id).
23. LFC
Frasi e linguaggio generato da una
grammatica
Formalismi
generativi
Espressioni regolari
Sia G = (N , T , P, S) una grammatica. Grammatiche libere
Altri tipi di grammatica
Si chiama forma di frase di G una qualunque stringa
α di V ∗ tale che S ⇒∗ α.
G
Se α ∈ T ∗ allora si dice che α è una frase di G.
Il linguaggio generato da G (che indicheremo spesso
con la notazione L(G)) è l’insieme delle frasi di G.
Dagli esempi precedenti possiamo conlcudere che le
stringhe id + (E) e id + (id) sono forme di frase di
G1 ; id + (id) è anche una frase e dunque è nel
linguaggio L(G).
Se la grammatica è libera da contesto allora anche il
linguaggio viene detto libero (da contesto).
24. LFC
Esempi
Formalismi
generativi
La grammatica G1 genera il linguaggio delle Espressioni regolari
Grammatiche libere
espressioni aritmetiche composte da +, *, (, ) e id. Altri tipi di grammatica
Le stringhe più corte in L(G1 ) sono
id, id + id, id ∗ id, (id).
Il linguaggio {ab, c}∗ è libero perché generato da
S → SS, S → ab, S → c, S →
Il linguaggio L11 su {a, b} costituito da tutte le
stringhe α palindrome (cioè tali che αR = α) è libero
in quanto generabile dalla grammatica
S → aSa, S → bSb, S → a, S → b, S →
25. LFC
Un esempio più complesso: le e.r. come
linguaggio libero
Formalismi
generativi
Espressioni regolari
La grammatica G2 così definita Grammatiche libere
Altri tipi di grammatica
N {E, T , F , A}
=
T {0, 1, (, ), +, ∗, Φ, }
=
S E
=
P {E → T , E → T +E,
=
T → F , T → FT ,
F → (E), F → (E)* ,
F → A, F → A* ,
A → 0, A → 1
}
genera tutte le stringhe sull’alfabeto
0, 1, (, ), +, ∗, Φ, che sono espressioni regolari ben
formate.
26. LFC
Esempio
La stringa (epressione regolare) 0(0+1)∗ Formalismi
appartiene a L(G2 ) causa la derivazione: generativi
Espressioni regolari
Grammatiche libere
⇒G2
E T Altri tipi di grammatica
⇒G2 Usando T → FT
FT
⇒G2 Usando T → F
FF
⇒G2 Usando F → A
AF
A(E)∗ Usando F → (E)∗
⇒G2
0(E)∗
⇒G2 Usando A → 0
0(T + E)∗
⇒G2 Usando E → T + E
0(T + T )∗
⇒G2 Usando E → T
0(F + T )∗
⇒G2 Usando T → F
0(F + F )∗
⇒G2 Usando T → F
0(A + F )∗
⇒G2 Usando F → A
0(A + A)∗
⇒G2 Usando F → A
0(0 + A)∗
⇒G2 Usando A → 0
0(0 + 1)∗
⇒G2 Usando A → 1
27. LFC
Linguaggio generato da una grammatica
(continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Per dimostrare formalmente che una data Altri tipi di grammatica
grammatica G genera un dato linguaggio L (cioè per
provare che L = L(G)) si procede solitamente per
induzione.
Dapprima si formula una congettura sulla forma delle
frasi di L(G), di solito provando alcune semplici
derivazioni.
Dopodiché si dimostra separatamente (per
induzione) che:
se X è generata dal linguaggio, allora X ha quella
particolare forma;
se X è una stringa con quella particolare forma,
allora è generabile dal linguaggio.
28. LFC
Esempio
Si consideri laseguente grammatica: Formalismi
generativi
Espressioni regolari
Grammatiche libere
N {A, B}
= Altri tipi di grammatica
T {a, b}
=
S A
=
P {A → aA,
=
A → B,
B → bB,
B→
}
Vogliamo dimostrare che
L(G) = L5 = {an bm |n, m ≥ 0}.
Dimostriamo che, se X ∈ L(G), allora X = an bm , per
opportuni valori di n ed m. La dimostrazione procede
per induzione sulla lunghezza k delle derivazioni.
29. LFC
Esempio (continua)
Preliminarmente, osserviamo che una derivazione
Formalismi
lunga k (k ≥ 1) genera, a partire da B, la stringa generativi
bk −1 (anche questa è una semplice induzione). Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Per tornare a L(G), la base dell’induzione è costituita
dall’unica derivazione lunga 2 (la più corta):
A ⇒ B ⇒ , che genera una stringa della forma
voluta (con n = m = 0).
Dimostriamo ora che la tesi è vera per derivazioni
lunghe k > 2.
Per una tale derivazione possiamo scrivere
A ⇒ aA ⇒∗ X ,
oppure
A ⇒ B ⇒∗ X ,
L’applicazione ad X dell’ipotesi induttiva (nel primo
caso) o del risultato preliminare (secondo caso)
porta agevolmente alla tesi.
30. LFC
Esempio (continua)
Formalismi
generativi
Espressioni regolari
Dimostrare che ogni stringa della forma an bm Grammatiche libere
Altri tipi di grammatica
appartiene al linguaggio è ancora più semplice.
an bm è infatti generabile dalla seguente derivazione
di lunghezza n + m + 2
A ⇒∗ an A ⇒ an B ⇒∗ an bm B ⇒ an bm
costituita da
n applicazioni della regola A → aA;
una applicazione di A → B;
m applicazioni di B → bB;
una applicazione di B → .
31. LFC
Equivalenza
Formalismi
Due grammatiche G e G si dicono equivalenti se generativi
Espressioni regolari
generano lo stesso linguaggio. Grammatiche libere
Altri tipi di grammatica
In alcuni testi, la sola coincidenza dei linguaggi
generati viene detta equivalenza debole.
In seguito vedremo diverse trasformazioni delle
grammatiche che conservano il linguaggio.
Un primo semplice esempio è costituito dalla
grammatica G1 e dalla seguente grammatica:
→ E+T | T
E
→ T ∗F | F
T
→ id | (E)
F
che risultano essere (debolmente) equivalenti.
32. LFC
Convenzioni notazionali
I simboli non terminali, detti anche variabili Formalismi
sintattiche, verranno spesso espressi (come nel caso generativi
Espressioni regolari
della grammatica appena introdotta) usando lettere Grammatiche libere
Altri tipi di grammatica
maiuscole in corsivo.
La scrittura
E → E+E | E∗E | (E) | id
verrà utilizzata come abbreviazione per
→ E+E,
E
→ E∗E,
E
→ (E),
E
→ id
E
Il metasimbolo | (barra verticale) indica dunque
alternativa.
33. LFC
Descrizione succinta di una grammatica
Formalismi
generativi
Se si conviene di elencare per prime le produzioni Espressioni regolari
relative al simbolo iniziale, una grammatica può Grammatiche libere
Altri tipi di grammatica
essere espressa semplicemente tramite le
produzioni (in realtà abbiamo già usato questa
convenzione).
Ad esempio, la grammatica G2 che descrive le
espressioni regolari su {a, b} può essere
semplicemente descritta come
→ T | T +E
E
→ F | FT
T
→ (E) | (E)∗ | A | A∗
F
A → 0|1
34. LFC
Backus-Naur Form (BNF)
Nella descrizione della sintassi dei linguaggi di Formalismi
generativi
programmazione le variabili sintattiche vengono Espressioni regolari
Grammatiche libere
rappresentate mediante un identificatore descrittivo Altri tipi di grammatica
racchiuso fra parentesi angolate.
Esempio
→ if espressione booleana then
comando if
lista di comandi
endif |
if espressione booleana then
lista di comandi
else
lista di comandi
endif
35. LFC
Altri esempi
Formalismi
generativi
Nella BNF, la grammatica G1 viene descritta dalle Espressioni regolari
Grammatiche libere
seguenti produzioni Altri tipi di grammatica
→ espressione + espressione |
espressione
→ espressione ∗ espressione |
espressione
→ ( espressione ) | id
espressione
Una grammatica per le chiamate di procedura in Java
→ id( parametri-opzionali )
chiamata
→ lista-di-parametri |
parametri-opzionali
→ lista-di-parametri , parametro |
lista-di-parametri
parametro
36. LFC
Altre convenzioni
Elementi opzionali possono essere inclusi fra i meta Formalismi
generativi
simboli [ e ]. Espressioni regolari
Grammatiche libere
Ad esempio, potremo usare la scrittura Altri tipi di grammatica
→ if espressione booleana then
comando if
lista di comandi
[ else
lista di comandi ]
endif
Elementi ripetitivi possono essere inclusi fra i
metasimboli { e }.
Ad esempio
→ comando { ; comando }
list di comandi
37. LFC
Altre convenzioni (continua)
Formalismi
Più recentemente, nella BNF i simboli terminali (detti generativi
anche token name) vengono scritti in grassetto. Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
In questo modo diventa possibile sopprimere l’uso
delle parentesi angolate intorno alle variabili
sintattiche, migliorando la leggibilità complessiva. Le
variabili sintattiche continuano ad essere scritte in
corsivo.
Ad esempio, potremo scrivere
→ if espressione booleana then
comando if
lista di comandi
[ else
lista di comandi ]
endif
38. LFC
Altre convenzioni (continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Nel caso in cui possano sorgere ambiguità, i simboli
terminali vengono racchiusi fra doppi apici.
Un esempio è costituita dal caso di simboli terminali
coincidenti con qualche metasimbolo.
Esempio (tratto dalla sintassi del C):
comando composto → { { dichiarazione } { comando } }
39. LFC
Esercizi proposti
Formalismi
Fornire una grammatica libera per l’insieme delle generativi
Espressioni regolari
stringhe costituite da parentesi correttamente Grammatiche libere
Altri tipi di grammatica
bilanciate (ad esempio, ()(()) e (()) devono far parte
del linguaggio, mentre ())( non deve farne parte).
Fornire una grammatica libera per il linguaggio
L12 = {an b2n |n > 0} sull’alfabeto {a, b}.
Si consideri la seguente grammatica GI
S → I | A,
I → if B then S | if B then S else S,
A → a, B → b
e si fornisca una derivazione per la stringa
if b then if b then a else a
40. LFC
Alberi di derivazione (parse tree)
Un parse tree illustra graficamente il processo di Formalismi
generativi
derivazione di una stringa a partire dal simbolo Espressioni regolari
Grammatiche libere
iniziale (o, più genericamente, da un non terminale). Altri tipi di grammatica
Formalmente, un parse tree per una grammatica
libera G = N , T , P, S è un albero radicato ed
etichettato che soddisfa le seguenti proprietà:
i nodi interni sono etichettati con simboli di N e, in
particolare, la radice è etichettata con l’assioma;
le foglie sono etichettate con simboli di T o con il
simbolo ;
se A ∈ N etichetta un nodo interno e X1 , . . . , Xk sono
le etichette dei figli di (il nodo con etichetta) A, con
Xi ∈ V, allora deve esistere in P la produzione
A → X1 X2 . . . Xk ;
Se A ∈ N etichetta un nodo interno il cui unico figlio
è un nodo con etichetta , allora deve esistere in P la
produzione A → .
41. LFC
Esempi
Formalismi
generativi
Parse tree per la stringa id ∗ (id + id) nella Espressioni regolari
Grammatiche libere
grammatica G1 Altri tipi di grammatica
E
E E
*
(
id E )
+
id id
42. LFC
Esempi
Formalismi
Parse tree per la stringa generativi
Espressioni regolari
if b then if b then a else a Grammatiche libere
Altri tipi di grammatica
nella grammatica GI
S
I
if then else
B S S
b I a
if then
B S
b a
43. LFC
Alberi di derivazione (parse tree)
Un parse tree impone una struttura sintattica alle Formalismi
generativi
frasi e questo è generalmente il primo passo per Espressioni regolari
attribuire ad esse un significato. Grammatiche libere
Altri tipi di grammatica
La struttura sintattica può essere vista in maniera
ricorsiva come composizione della struttura di
(sotto)frasi corrispondenti a sottoalberi del parse
tree.
In particolare, il sottoalbero radicato in un nodo con
etichetta A ∈ N fornisce la struttura della frase
derivata a partire da A.
Nel caso del parse tree relativo alla frase
id ∗ (id + id), il sottoalbero radicato nel nodo indicato
dalla freccia fornisce la struttura sintattica
dell’espressione fra parentesi e l’albero nella sua
interezza mostra la struttura della frase come
composizione di espressioni.
44. LFC
Parse tree e derivazioni
Formalismi
generativi
Un risultato fondamentale afferma che α è una frase Espressioni regolari
Grammatiche libere
di una grammatica G (cioè può essere derivata in G Altri tipi di grammatica
a partire dal simbolo iniziale) se e solo se esiste in G
un parse tree per α.
In generale, una frase di una grammatica può essere
ottenuta mediante più di una derivazione (si
rammenti l’esempio di id + (id) nella grammatica G1 ).
In particolare, ad un dato parse tree per α possono
corrispondere più derivazioni.
Per definire con precisione il comportamento di un
parser (come vedremo) è conveniente eliminare
questa “ridondanza” limitandoci a considerare solo
particolari derivazioni.
45. LFC
Derivazioni canoniche
Formalismi
Si dice che S ⇒∗ α è una derivazione canonica generativi
G Espressioni regolari
sinistra della frase α in G, se in essa ad ogni passo Grammatiche libere
Altri tipi di grammatica
viene riscritto il simbolo non terminale più a sinistra.
Analoga definizione vale per la derivazione canonica
destra.
Delle due derivazioni viste per id + (id) in G1 , la
seconda è una derivazione canonica sinistra, mentre
la prima non è una derivazione canonica.
Se α ∈ V ∗ (cioè se α è una forma di frase) e S ⇒∗ α G
mediante una derivazione canonica sinistra (destra),
si dice che α è una forma di frase sinistra (destra); il
termine inglese utilizzato è left/right sentential form.
Considerare derivazioni canoniche può non essere
sufficiente ad eliminare ambiguità.
46. LFC
Esempio
La frase id + id + id di G1 può essere ottenuta
Formalismi
mediante due differenti derivazioni canoniche destre, generativi
Espressioni regolari
e precisamente Grammatiche libere
Altri tipi di grammatica
⇒G1
E E+E
⇒G1 E+E+E
⇒G1 E+E+id
⇒G1 E+id+id
⇒G1 id + id + id
e
⇒G1
E E+E
⇒G1 E+id
⇒G1 E+E+id
⇒G1 E+id+id
⇒G1 id + id + id
(dove i simboli non terminali sottolineati sono quelli
che verranno espansi al passo successivo).
47. LFC
Ambiguità
Abbiamo visto che ad una frase può corrispondere Formalismi
generativi
più di una derivazione cononica. Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Tuttavia, per un dato un parse tree esiste una sola
derivazione canonica sinistra e una sola derivazione
canonica destra. (NB. D’ora in avanti, ci riferiremo
alle derivazioni canoniche destre semplicemente
come alle derivazioni canoniche.)
Diciamo quindi che una grammatica è ambigua se
esistono frasi per le quali esistono differenti parse
tree (equivalentemente, differenti derivazioni
canoniche sinistre o destre).
L’ambiguità è un ostacolo alla realizzazione di un
parser e di norma o viene eliminata alla radice
(utilizzando grammatiche non ambigue) oppure
utilizzando opportune regole per la disambiguazione.
48. LFC
Esempio
Formalismi
La grammatica GI è ambigua in quanto alla frase generativi
Espressioni regolari
if b then if b then a else a Grammatiche libere
Altri tipi di grammatica
corrisponde un altro parse tree, e precisamente
S
I
if then
B S
b I
if then else
B S S
b a a
49. LFC
Aspetti problematici per il parsing
Ci sono alcune caratteristiche delle grammatiche libere
Formalismi
che possono ostacolare il processo di parsing, o anche generativi
solo un “certo tipo” di parsing (come vedremo). Ne Espressioni regolari
Grammatiche libere
elenchiamo brevemente alcune: Altri tipi di grammatica
ambiguità;
presenza di simboli non terminali che generano
linguaggi vuoti;
simboli non terminali che non compaiono in nessuna
forma di frase;
presenza di cicli (derivazioni del tipo A ⇒+ A) o
comunque di left recursion (derivazioni del tipo
A ⇒+ Aα, con α = );
presenza di produzioni A → , dove A = S;
presenza di prefissi comuni a due o più produzioni
relative allo stesso non terminale, ad esempio
A → αβ1 e A → αβ2 .
50. LFC
Esempi
La grammatica Formalismi
generativi
Espressioni regolari
Grammatiche libere
S → Sa | b Altri tipi di grammatica
presenta una ricorsione immediata a sinistra in
quanto S → Sa.
La grammatica
S → A|b
A → Aa | Sa
presenta una ricorsione a sinistra in quanto
S ⇒+ Sa.
La grammatica GI (oltre ad essere ambigua)
presenta un prefisso comune alla due produzioni che
riscrivono il simbolo I.
51. LFC
Esempi
Nella grammatica
Formalismi
generativi
S → SA Espressioni regolari
Grammatiche libere
A → a| Altri tipi di grammatica
c’è una produzione A → e questa provoca il ciclo
S ⇒+ S.
Nella grammatica
S → aS
A→a
il non terminale A è irraggiungibile da S.
Nella grammatica
S → aS | a | A
A → Aa
il non terminale A genera il linguaggio vuoto.
52. LFC
Scrittura di una grammatica per il parsing
Terminiamo questa parte del corso sulle CFG Formalismi
presentando una serie di algoritmi per la “rimozione” generativi
Espressioni regolari
degli aspetti problematici cui abbiamo fatto cenno. Grammatiche libere
Altri tipi di grammatica
Ci serve qualche definizione.
Raggiungibilità Un non terminale è raggiungibile se
può comparire in una forma di frase.
Buona definizione Un non terminale è ben definito
se non genera il linguaggio vuoto.
Pulizia Si dice che una grammatica è pulita se
non contiene cicli e ogni non terminale
è raggiungibile e ben definito.
Annullabilità Un non terminale A è annullabile se
A ⇒+ .
Prefissi comuni Presenza di coppie di produzioni del
tipo A → αβ1 e A → αβ2 .
Ricorsione sinistra Presenza di derivazioni del tipo
A ⇒+ Aα.
53. LFC
Rimozione dei non terminali non ben definiti
Formalismi
Per eliminare i simboli non terminali che generano un generativi
Espressioni regolari
linguaggio vuoto si calcola dapprima l’insieme Grammatiche libere
Altri tipi di grammatica
complemento, costituito dai non terminali ben definiti,
mediante un algoritmo di chiusura.
Chiameremo D tale insieme.
La base dell’algoritmo pone in D tutti quei terminali A
per i quali esiste una produzione A → α, con α ∈ T ∗ .
Il passo ricorsivo consiste nell’aggiungere a D quei
simboli non terminali A per i quali esiste una
produzione A → α in cui α contiene simboli terminali
o simboli già in D.
Quando il passo ricorsivo non aggiunge nulla a D,
l’algoritmo termina e l’insieme dei non terminali non
ben definiti è N D.
54. LFC
Esempio
Si consideri la grammatica G così definita: Formalismi
generativi
Espressioni regolari
S → aA b | bDEa Grammatiche libere
Altri tipi di grammatica
A→ | aA | D
B → b | bC
C → cE
D → dA
→ eC
E
→ fD
F
L’insieme D viene calcolato inserendo dapprima i
simboli A e B (passo base), quindi S e D, infine F .
Ne consegue che C ed E sono non ben definiti.
Come “effetto collaterale” è possibile eliminare quelle
produzioni inutili che, come S → bDEa, contengono
a destra simboli non ben definiti.
55. LFC
Esempio (continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Dopo l’eliminazione dei non terminali non ben definiti
e delle produzioni inutili si ottiene la grammatica G ,
equivalente a G:
S → aA b
A→ | aA | D
B→b
D → dA
→ fD
F
56. LFC
Rimozione dei non terminali non raggiungibili
Formalismi
Il problema dell’eliminazione dei simboli non generativi
Espressioni regolari
raggiungibili può essere visto come una semplice Grammatiche libere
Altri tipi di grammatica
istanza del problema della raggiungibilità in un grafo
orientato.
Data una CFG G si costruisce un grafo orientato
G = (V , E) nel seguente modo: l’insieme V dei
vertici contiene un elemento corrispondente ad ogni
non terminale di G; l’insieme E contiene una coppia
(arco orientato) A, B se e solo se esiste una
produzione A → αBβ, α, β ∈ V ∗ .
L’esecuzione dell’algoritmo BFS consente di stabilire
i nodi raggiungibili dal nodo (corrispondente ad) S.
Si può quindi procedere all’eliminazione dei non
terminali corrispondenti ai vertici non raggiunti.
57. LFC
Esempio (continua)
Eseguendo la BFS sul grafo corrispondente a G Formalismi
generativi
Espressioni regolari
A D Grammatiche libere
Altri tipi di grammatica
S
F
B
si scopre che B ed F non sono raggiungibili da S.
La loro eliminazione porta alla grammatica
equivalente G :
S → aA b
A→ | aA | D
D → dA
È ora facile vedere che il linguaggio generato da G
è a(a|d)∗ b.
58. LFC
Eliminazione dei non terminali annullabili
Formalismi
generativi
Espressioni regolari
Grammatiche libere
L’algoritmo calcola l’insieme E dei simboli non Altri tipi di grammatica
terminali a partire dai quali è possibile derivare .
E ← {A ∈ N |A → ∈ P}
1:
while ∃A → A1 . . . Ak t.c. Ai ∈ E & A ∈ E do
2:
E ← E ∪ {A}
3:
end while
4:
Elimina da P le produzioni del tipo A →
5:
Elimina i non terminali di E dalle restanti
6:
produzioni in tutti i modi (combinatorialmente)
possibili
59. LFC
Esempio
Formalismi
generativi
Si consideri la grammatica: Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
S → A|
A → aAC | SB
B → bB | b |
C→c
Inizialmente si pone E = {S, B}, poiché S e B sono
immediatamente annullabili.
Poiché esiste la produzione A → SB, al secondo
passo il non terminale A viene inserito in E.
Nessun altro non terminale può essere aggiunto a E.
Risulta quindi E = {S, A, B}.
60. LFC
Esempio (continua)
Dopo l’eliminazione delle produzioni del tipo: A →
Formalismi
generativi
S→A Espressioni regolari
Grammatiche libere
A → aAC | SB Altri tipi di grammatica
B → bB | b
C→c
dopo la cancellazione dei non terminali in E in tutti i
modi combinatorialmente possibili:
S→A
A → aAC | aC | SB | S | B
B → b | bB
C→c
La grammatica modificata è equivalente alla
grammatica di partenza, salvo che non può generare
la stringa vuota.
61. LFC
Esempio (continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Per rendere del tutto equivalenti le grammatiche Altri tipi di grammatica
possiamo aggiungere un nuovo assioma S con le
produzioni S → S | .
La grammatica “completa” diviene quindi:
→ S|
S
S→A
A → aAC | aC | SB | S | B
B → b | bB
C→c
62. LFC
Eliminazione dei cicli
I cicli, cioè derivazioni del tipo A ⇒+ A, sono non
Formalismi
solo inutili ma anche dannosi, in quanto danno generativi
origine ad ambiguità. Espressioni regolari
Grammatiche libere
Un algoritmo per eliminare i cicli elimina più in Altri tipi di grammatica
generale le produzioni che danno origine a
derivazioni del tipo A ⇒+ B.
Si suppone che non ci siano non terminali annullabili.
In una tale grammatica, la possibilità che risulti
A ⇒+ B può essere solo conseguenza di una catena
di cosiddette produzioni singole:
A → A1
→ A2
...
→ Ak
→B
che sono facili da individuare.
63. LFC
Eliminazione dei cicli (continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Si consideri ora una generica coppia A, B tale che Altri tipi di grammatica
A ⇒+ B; se
B → α1 | . . . | αr
sono le produzioni (non singole) di B, allora si
aggiungono alla grammatica le produzioni
A → α1 | . . . | αr
Al termine, si eliminano tutte le produzioni singole.
64. LFC
Esempio
Si consideri ancora la grammatica: Formalismi
generativi
Espressioni regolari
→ S|
S Grammatiche libere
Altri tipi di grammatica
S→A
A → aAC | aC | SB | S | B
B → b | bB
C→c
È facile vedere che risulta: S ⇒+ S, S ⇒+ A,
S ⇒+ B, S ⇒+ A, S ⇒+ B, S ⇒+ S, A ⇒+ B.
Le produzioni che vanno aggiunte sono quindi
→ aAC | aC | SB | b | bB
S
S → aAC | aC | SB | b | bB
A → b | bB
65. LFC
Esempio (continua)
La grammatica risultante (priva di cicli) è: Formalismi
generativi
Espressioni regolari
→ aAC | aC | SB | b | bB |
S Grammatiche libere
Altri tipi di grammatica
S → aAC | aC | SB | b | bB
A → aAC | aC | SB | b | bB
B → b | bB
C→c
Una grammatica equivalente ma più semplice (e
sempre senza cicli) è:
→ S|
S
S → aSC | aC | SB | b | bB
B → b | bB
C→c
66. LFC
Eliminazione delle ricorsioni sinistre
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Si può assumere che la grammatica in input non Altri tipi di grammatica
contenga non terminali annullabili ne’ cicli.
Sia A1 , . . . , An un ordinamento (arbitrario) dei simboli
non terminali.
L’idea dell’algoritmo è di far sì che ogni produzione
del tipo Ai → Aj α abbia sempre i < j.
L’algoritmo consta di due cicli annidati:
1. Nel ciclo esterno (con iteratore i) vengono eliminate
le ricorsioni immediate Ai → Ai α;
2. Nel ciclo interno (con iteratore j) vengono modificate
quelle produzioni del tipo Ai → Aj α in cui j < i.
67. LFC
Eliminazione delle ricorsioni sinistre
(continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Per eliminare tutte le produzioni del tipo A → Aαr , Altri tipi di grammatica
r = 1, 2, . . . , t (per qualche t ≥ 1), si considerano le
altre produzioni relative al non terminale A
A → β1 | β2 | . . . | βm
in cui nessuna stringa βs inizia per A.
Le produzioni per A vengono quindi sostituite nel
modo seguente
A → β1 A | β2 A | . . . | βm A
→ α1 A | α2 A | . . . | αt A |
A
68. LFC
Eliminazione delle ricorsioni sinistre
(continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Per eliminare una produzione del tipo Ai → Aj α si
considerano le altre produzioni relative al non
terminale Aj
Aj → β1 | β2 | . . . | βp
in cui nessuna stringa inizia per Aq , q ≤ j.
La produzione Ai → Aj α viene quindi sostituita nel
modo seguente
→ β1 α | β2 α | . . . | βm α
Ai
69. LFC
Eliminazione delle ricorsioni sinistre
(continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
L’algoritmo completo è il seguente
1: Disponi i non terminali in ordine A1 , . . . , An
2: for i = 1 to n do
for j = 1 to i − 1 do
3:
Sostituisci le produzioni del tipo Ai → Aj α
4:
end for
5:
Sostituisci le produzioni del tipo Ai → Ai α
6:
7: end for
70. LFC
Esempio
Formalismi
generativi
Espressioni regolari
Consideriamo ancora la grammatica G1 per le Grammatiche libere
Altri tipi di grammatica
espressioni
→ E + E | E ∗ E | (E) | id
E
che contiene solo ricorsioni immediate (anche
perché contiene un solo non terminale).
Le produzioni vengono sostituite nel modo seguente,
con l’introduzione di un non terminale E
→ (E) E | id E
E
→ +E E | ∗ E E |
E
71. LFC
Esempio
Consideriamo la grammatica così definita:
Formalismi
generativi
A → Bb | a Espressioni regolari
Grammatiche libere
B → Bb | Ac Altri tipi di grammatica
che consente la derivazione A ⇒+ Acb.
Se nell’ordinamento dei non terminali A si fa
precedere a B diviene necessario eliminare la
produzione B → Ac.
Questo comporta l’introduzione delle due produzioni
B → Bbc | ac.
La successiva eliminazione delle ricorsioni
immediate (B → Bb | Bbc) porta alla seguente
grammatica modificata
A → Bb | a
B → acB
→ bB | bcB |
B
72. LFC
Eliminazione delle ambiguità
Formalismi
generativi
Da un punto di vista algoritmico il problema è Espressioni regolari
Grammatiche libere
notevolmente più complicato. Altri tipi di grammatica
Addirittura, se non si fanno restrizioni di altro tipo
sulla grammatica libera G in input, il problema di
stabilire se G è ambigua non ammette algoritmo
(problema indecidibile).
Gli algoritmi esistono per sottoclassi delle
grammatiche libere.
Nella pratica la soluzione consiste nel “progettare” la
grammatica in modo che essa sia non ambigua
(piuttosto che verificarlo a posteriori) evitando una
serie di errori che possono generare ambiguità.
Esamineremo alcuni degli accorgimenti da utilizzare
73. LFC
Ambiguità delle frasi condizionali
Formalismi
generativi
Nel contesto dei linguaggi di programmazione è Espressioni regolari
consuetudine interpretare la frase ambigua della Grammatiche libere
Altri tipi di grammatica
grammatca GI
if cond then if cond then stmt else stmt
nel seguente modo:
if cond then
begin
if cond then stmt else stmt
end
associando cioè ogni else con il più vicino then non
ancora associato.
Questa regola di solito viene implementata dai
parser ma non viene forzata dalle produzioni.
74. LFC
Ambiguità delle frasi condizionali (continua)
Volendo modificare la grammatica, si introducono
Formalismi
due tipologie di istruzione condizionale, che generativi
Espressioni regolari
chiameremo chiusa e aperta Grammatiche libere
Altri tipi di grammatica
S → O|C
C → if B then C else C | A
O → if B then S |
if B then C else O
dove A indica un generico altro comando.
Se ora riconsideriamo la frase
if b then if b then a else a
dove b ed a indicano, rispettivamente, condizioni
logiche e comandi generici (non condizionali)
vediamo che all’interpretazione
if b then begin if b then a end else a
non corrisponde nessuna derivazione.
75. LFC
Esempio
Consideriamo il seguente frammento di grammatica, Formalismi
generativi
nella quale, rispetto al caso precedente, abbiamo Espressioni regolari
Grammatiche libere
inserito anche un’istruzione iterativa Altri tipi di grammatica
S → O|C
C → if B then C else C | I | A
O → if B then S |
if B then C else O
I → while B do S
Con questa grammatica la stringa
if b then while b do if b then a else a
è ambigua, come dimostrano i due possibili alberi di
derivazioni mostrati nelle successive trasparenze (la
soluzione è lasciata come esercizio)
76. LFC
Esempio (continua)
S
Formalismi
generativi
Espressioni regolari
C Grammatiche libere
Altri tipi di grammatica
if then else
B C C
b I A
while do
B S a
b O
if then
B S
b C
A
a
77. LFC
Esempio (continua)
S
Formalismi
generativi
Espressioni regolari
O Grammatiche libere
Altri tipi di grammatica
if then
B S
b C
I
while do
B S
b C
if then else
B C C
b A A
a a
78. LFC
Ambiguità legata alla ricorsione
Se una grammatica ammette (per almeno un simbolo
Formalismi
non terminale raggiungibile) risorsioni bilaterali, cioè generativi
sia ricorsioni a sinistra che a destra, allora la Espressioni regolari
Grammatiche libere
grammatica è ambigua. Altri tipi di grammatica
In generale, supponiamo che una data grammatica
consente una derivazione del tipo A ⇒+ AαA, con
α ∈ V ∗.
Sono quindi possibili le seguenti due derivazioni
della stringa α1 α2 α3 α4 α5 , dove αi ∈ T è derivabile
da A, i = 1, . . . , 5.
A A
A A A A
α4 α2
A A A A
α2 α5 α1 α4
α1 α3 α3 α5
79. LFC
Ambiguità legate all’unione di linguaggi
Formalismi
generativi
Se G e G generano i linguaggi L e L , allora un Espressioni regolari
Grammatiche libere
modo immediato per generare il linguaggio Altri tipi di grammatica
L = L ∪ L è di usare una grammatica siffatta
S → S |S
→ . . . Produzioni di G
S
→ . . . Produzioni di G
S
assumendo che S ed S siano gli assiomi
rispettivamente di G e G e che le due grammatiche
non abbiano simboli non terminali comuni.
Tuttavia se L ∩ L = Φ allora la grammatica risulta
ambigua.
80. LFC
Esempio
Sia G la grammatica (già vista) che genera il
Formalismi
linguaggio L11 , delle palindrome sull’alfabeto {a, b}: generativi
Espressioni regolari
P → aPa | bPb | a | b | Grammatiche libere
Altri tipi di grammatica
Sia G la grammatica (anch’essa già vista) che
genera il linguaggio L5 , delle stringhe an bm :
A → aA | B, B → bB |
Poiché l’intersezione dei due linguaggi non è vuota
(contiene stringhe del tipo an e bm ), la grammatica
S → P|A
P → aPa | bPb | a | b |
A → aA | B, B → bB |
è ambigua.
Ad esempio, la frase aa ammette le due seguenti
derivazioni canoniche: S ⇒ aPa ⇒ aa e
S ⇒ A ⇒ aA ⇒ aaA ⇒ aaB ⇒ aa.
81. LFC
Ambiguità legate al concatenamento di
linguaggi
Formalismi
generativi
Espressioni regolari
Se G e G generano i linguaggi L e L , allora un Grammatiche libere
Altri tipi di grammatica
modo immediato per generare il linguaggio L = L L
è di usare una grammatica siffatta
S → SS
→ . . . Produzioni di G
S
→ . . . Produzioni di G
S
assumendo che S ed S siano gli assiomi
rispettivamente di G e G e che le due grammatiche
non abbiano simboli non terminali comuni.
Se G può generare le stringhe α1 α2 e α1 e G può
generare le stringhe α2 α3 e α3 , allora la stringa
α1 α2 α3 ammette due derivazioni canoniche.
82. LFC
Esempio
Il linguaggio L8 (delle stringhe del tipo an bm ck ) può Formalismi
generativi
essere ottenuto come concatenazione dei linguaggi Espressioni regolari
{an bm } e {bn cm }, e dunque dalla grammatica:
Grammatiche libere
Altri tipi di grammatica
S → AC
A → aA | B, B → bB |
C → bC | D, D → cD |
che però risulta ambigua, a causa della capacità di
entrambe le grammatiche “componenti” di generare
le stringhe bn .
Ad esempio, per la stringa abc si possono dare le
seguenti due derivazioni canoniche: S ⇒ AC ⇒
AD ⇒ AcD ⇒ Ac ⇒ aAc ⇒ aBc ⇒ abBc ⇒ abc e
S ⇒ AC ⇒ AbC ⇒ AbD ⇒ AbcD ⇒ Abc ⇒
aAbc ⇒ aBbc ⇒ abc.
83. LFC
Precedenza degli operatori
Formalismi
La grammatica G1 fornisce un esempio di ambiguità generativi
Espressioni regolari
legata alla presenza di produzioni bilaterali Grammatiche libere
Altri tipi di grammatica
→ E+E | E∗E
E
In questo caso è facile eliminare la ricorsione
bilaterale immediata, introducendo un nuovo simbolo
non terminale E
→ E+E | E∗E | E
E
→ id | (E)
E
La nuova grammatica non è più ambigua ma, come
G1 , presenta un problema legato alla precedenza
degli operatori.
84. LFC
Precedenza degli operatori (continua)
Si osservi l’albero di derivazione della stringa Formalismi
id + id ∗ id generativi
Espressioni regolari
E Grammatiche libere
Altri tipi di grammatica
E * E’
id
E + E’
id
E’
id
Esso suggerisce che l’interpretazione debba essere
(id + id) ∗ id, che non coincide con l’interpretazione
che universalmente si dà alla stringa in Matematica.
85. LFC
Precedenza degli operatori (continua)
Formalismi
generativi
La “usuali” precedenze di operatore possono essere Espressioni regolari
Grammatiche libere
forzate introducendo differenti simboli non terminali Altri tipi di grammatica
per i diversi livelli di precedenza.
Ad esempio, nel caso di somma e prodotto possiamo
introdurre due livelli di precedenza, rappresentati dai
non terminali E e T , oltre ad un simbolo (useremo F )
per la catogoria delle espressioni di base (nel nostro
caso identificatori ed espressioni tra parentesi):
→ E+T | T
E
→ T ∗F | F
T
→ id | (E)
F
86. LFC
Precedenza degli operatori (continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
La grammatica precedente (con le ovvie estensioni)
“gestisce” senza ambiguità anche il caso degli
operatori di divisione e sottrazione, inseriti nelle
giuste categorie sintattiche:
→ E+T | E−T | T
E
→ T ∗F | T /F | F
T
→ id | (E)
F
87. LFC
Precedenza degli operatori (continua)
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Volendo inserire anche l’operatore di Altri tipi di grammatica
esponenziazione (che ha precedenza maggiore), è
necessario prevedere un’ulteriore variabile sintattica
e ricordarsi che l’operatore di esponenziazione (qui
useremo il simboloˆ) è associativo a destra:
→ E+T | E−T | T
E
→ T ∗P | T /P | P
T
P → FˆP | F
→ id | (E)
F
88. LFC
Esercizi
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Si consideri il linguaggio La>b delle stringhe su Altri tipi di grammatica
{a, b} che contengono più a che b. Si dica,
giustificando la risposta, se la seguente grammatica
libera genera La>b
S → a | aS | Sa | abS | aSb | Sab |
baS | bSa | Sba
Si formisca una grammatica libera per il linguaggio
su B contenente tutte e sole le stringhe con un
diverso numero di 0 e 1.
89. LFC
Esercizi
Quali sono le produzioni inutili nella seguente
Formalismi
grammatica? (R. Backhouse) generativi
Espressioni regolari
A → aDbb | CH Grammatiche libere
Altri tipi di grammatica
B → BaH | B
C→D
D → C|
→ cEd | b
E
→ BF
F
H → CD | a
Si dica se la grammatica
S → aA
A → AB | B
B→b
è ambigua.
90. LFC
Esercizi
Si considerino le seguenti grammatiche per i Formalismi
linguaggi L8 ed L9 : generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
→ DC
S
D → aDb |
C → cC |
e
→ AE
S
→ bEc |
E
A → aA |
Si dica quale linguaggio genera la grammatica
ottenuta “unendo” le due grammatiche per L8 ed L9 ,
con la produzione iniziale S → S | S , e se la
grammatica stessa è ambigua.
91. LFC
Linguaggi formali e compilazione
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Formalismi generativi
Espressioni e linguaggi regolari
Grammatiche libere
Altri tipi di grammatiche
92. LFC
Grammatiche lineari
Se le produzioni di una grammatica G sono tutte del Formalismi
tipo A → XB o A → X , dove X ∈ T ∗ e B ∈ N , allora generativi
Espressioni regolari
la grammatica è detta lineare destra. Grammatiche libere
Altri tipi di grammatica
Allo stesso modo, se le produzioni sono del tipo
A → BX o A → X , G è detta lineare sinistra.
Grammatiche lineari (destre o sinistre) sono dette
regolari.
Si può dimostrare che le espressioni regolari e le
grammatiche regolari sono formalismi equivalenti; in
altri termini, un linguaggio è regolare se e solo se è
generabile da una grammatica regolare.
Inoltre, poichè le grammatiche regolari sono anche
libere, ogni linguaggio regolare è anche libero.
Il viceversa non è vero; infatti il linguaggio
L6 = {an bn |n ≥ 0} non è regolare ma generabile
dalla grammatica libera S → aSb | .
93. LFC
Esempi
Formalismi
generativi
1)∗
Il linguaggio 0(0 + è regolare in quanto Espressioni regolari
Grammatiche libere
generabile dalla seguente grammatica lineare destra Altri tipi di grammatica
A → 0B | 0, B → 0 | 1 | 0B | 1B
Il linguaggio L5 è regolare in quanto generabile dalla
seguente grammatica lineare destra (come abbiamo
già visto):
S → aS | B, B → bB |
Il linguaggio {ab, c}∗ è generabile dalla seguente
grammatica
S → abS | cS |
94. LFC
Grammatiche dipendenti dal contesto
Se la forma generale delle produzioni è del tipo:
Formalismi
generativi
α→β Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
dove α, β ∈ V ∗ e |α| ≤ |β|, allora la grammatica è
detta dipendente dal contesto (in inglese,
context-dependent o context-sensitive o, ancora più
brevemente, CSG).
Alternativamente, le produzioni possono essere del
tipo
αAγ → αβγ
dove α, β, γ ∈ V ∗ , β = e A ∈ N .
Si può dimostrare che le due forme sono equivalenti
(cioè generano gli stessi linguaggi).
Tuttavia, la seconda forma “spiega” meglio il nome di
queste grammatiche: il simbolo A può essere riscritto
come β solo se appare nel contesto α − γ.
95. LFC
Linguaggi dipendenti dal contesto
Sono così detti i linguaggi generabili da grammatiche Formalismi
generativi
dipendenti dal contesto. Espressioni regolari
Grammatiche libere
Poiché la forma generale delle produzioni di una Altri tipi di grammatica
CSG sono più generali di quelle di una CFG,
l’insieme dei linguaggi dipendenti dal contesto
“contiene” l’insieme dei linguaggi liberi.
(Si noti che la stringa vuota può essere sempre
aggiunta prevedendo la produzione S → , dove
l’assioma S non compare nella parte destra di
alcuna produzione.)
Viceversa, ci sono linguaggi dipendenti dal contesto
che non sono liberi.
Un esempio è il linguaggio
L13 = {an bn cn |n ≥ 0}
96. LFC
Classificazione di Chomsky
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Le grammatiche (e i corrispondenti linguaggi) sono Altri tipi di grammatica
stati raggruppati in 4 classi, in dipendenza della
“potenza” delle produzioni.
Al livello più basso abbiamo le grammatiche regolari
(o di tipo 3), quindi le grammatiche libere (tipo 2) e
quelle dipendenti dal contesto (tipo 1).
Le grammatiche più generali, di tipo 0, sono dette
grammatiche a struttura di frase, in cui le produzioni
sono come quelle delle grammatiche di tipo 1 senza
la restrizione |α| ≤ |β|.
97. LFC
Costrutti non liberi nei linguaggi di
programmazione
Formalismi
generativi
Espressioni regolari
Grammatiche libere
Altri tipi di grammatica
Alcuni aspetti della sintassi dei linguaggi di
programmazione non sono catturabili da produzioni
di grammatiche libere.
Ad esempio, il fatto che il numero di argomenti in una
chiamata di procedura debbe coincidere con il
numero di parametri formali nella corrispondente
definizione non è esprimibile con una CFG.
Tale caratteristica è catturata dal cosiddetto
linguaggio delle repliche (che non è libero):
LR = {αα|α ∈ T ∗ }.