Sei sulla pagina 1di 34

Corso di Laurea Magistrale in Ingegneria Informatica

A.A. 2010-2011


Linguaggi Formali e Compilatori

Grammatiche context-free


Giacomo PISCITELLI


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


G
GGr
rra
aam
mmm
mma
aat
tti
iic
cch
hhe
ee l
lli
iib
bbe
eer
rre
ee d
dda
aa c
cco
oon
nnt
tte
ees
sst
tto
oo (
((t
tti
iip
ppo
oo 2
22)
))

Una grammatica G libera da contesto (non contestuale o di tipo 2) una
quadrupla (, V, P, S) tale che:
(alfabeto terminale) linsieme dei simboli elementari del linguaggio definito
dalla grammatica, alcune volte detti token
V (alfabeto non terminale) un insieme di metasimboli non terminali, alcune volte
detti variabili sintattiche
P un insieme di regole o produzioni sintattiche della forma A o
S V lassioma o simbolo distintivo della grammatica

Le regole sono coppie
A o
dove A V detto corpo della regola sintattica e o una stringa di simboli terminali
e/o non terminali (o (V )
-
) detta costrutto della regola sintattica.
Se A o
1
,

A o
2
, . . . . A o
n
sono le produzioni di G aventi la stessa parte
sinistra A, esse possono essere raggruppate usando la notazione:
A o
1
| o
2
|. . . . | o
n
oppure A o
1
o
2
. . . . o
n

che abbrevia A o
1
,

A o
2
, . . . . A o
n

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


L
LLi
iin
nng
ggu
uua
aag
ggg
ggi
iio
oo g
gge
een
nne
eer
rra
aat
tto
oo d
dda
aa u
uun
nna
aa g
ggr
rra
aam
mmm
mma
aat
tti
iic
cca
aa

Il linguaggio generato da una grammatica partendo dal non terminale A
(notazione L
A
(G)) linsieme delle stringhe di terminali prodotte da A
L
A
(G) {x
-
| A
+
x}
Il linguaggio generato da una grammatica (notazione L(G)) linsieme delle
stringhe di terminali prodotte dallassioma
L(G) {x
-
| S
+
x}

G ({S, T}, {a, b}, {S aTb, T bSa|ab}, S)

T bSa baTba baabba
T bSa baTba babSaba babaTbaba babaabbaba
S aTb aabb
S aTb abSab abaTbab abaabbab
L
T
(G) {baabba, babaabbaba, . . .}
L(G) {aabb, abaabbab, . . .}

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)



Esempio

T = { (, ), id , + , * , / , -}
V = {E}
E E + E
E E E
E E * E
E E / E
E - E
E ( E )
E id

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


L
LLi
iin
nng
ggu
uua
aag
ggg
ggi
iio
oo l
lli
iib
bbe
eer
rro
oo d
dda
aa c
cco
oon
nnt
tte
ees
sst
tto
oo

Un linguaggio libero dal contesto se esiste una grammatica libera dal contesto
che lo genera.
Esempio di linguaggio context free: quello generato dalla grammatica
G ({S, T}, {a, b}, {S aTb, T bSa, T ab}, S)

Due grammatiche G e G sono debolmente equivalenti se generano lo stesso
linguaggio, cio L(G) L(G)

Esempio:
G ({S}, {a, b}, {S aSb|ab}, S)
G ({S,A, B}, {a, b}, {S ASB|AB,A a, B b}, S)
L(G) L(G) {ab, aabb, aaabbb, . . .} {a
n
b
n
| n 1}

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


D
DDe
eer
rri
iiv
vva
aaz
zzi
iio
oon
nni
ii

Derivazioni
Si dice che la stringa diviene la stringa (o che dalla parola si pu derivare in un
passo la parola ) o che la stringa produce la stringa per una grammatica G e si
scrive

se esiste una produzione (A o) P tale che = A e = o
con , (V )
-


n
( diviene in n passi) se esiste una catena finita di stringhe (o parole) x
1
,
x
2
, . . . .

x
n
tale che = x
0
x
1
. . . x
n-1
x
n
=

-
( diviene riflessivamente e transitivamente ) se
n
per qualche n>0

+
( diviene transitivamente ) se
n
per qualche n 1

({S, T}, {a, b}, {S aTb, T bSa|ab}, S)

aTb abSab
S aTb abSab
S 2 abSab
CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


R
RRi
iic
cco
oor
rrs
ssi
iio
oon
nne
ee e
ee l
lli
iin
nng
ggu
uua
aag
ggg
ggi
ii f
ffi
iin
nni
iit
tti
ii/
//i
iin
nnf
ffi
iin
nni
iit
tti
ii

Una derivazione ricorsiva se, partendo da un non terminale, produce in almeno
un passo una stringa che contiene lo stesso non terminale, cio se della forma
A
+
A
E ricorsiva sinistra se = ; ricorsiva destra se = .
Il non terminale A detto ricorsivo.
G ({S}, {a, b}, {S aSb|ab}, S)
S aSb

Per decidere se una grammatica ha delle ricorsioni basta esaminare la chiusura
transitiva della relazione binaria fra non terminali definita da:
A produce B se la grammatica contiene una produzione della forma A B.

La grammatica ha delle ricorsioni solo se la chiusura transitiva di questa relazione ha
dei cicli.

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


P
PPr
rro
ood
ddu
uuz
zzi
iio
oon
nni
ii,
,, d
dde
eer
rri
iiv
vva
aaz
zzi
iio
oon
nni
ii e
ee a
aal
llb
bbe
eer
rri
ii s
ssi
iin
nnt
tta
aat
ttt
tti
iic
cci
ii

Possiamo rappresentare produzioni e derivazioni mediante alberi:
G ({S}, {a, b}, {S aSb|ab}, S)





CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


P
PPa
aar
rrs
sse
ee t
ttr
rre
eee
ee

Un parse tree o albero sintattico di una grammatica descrive graficamente come
lassioma S della grammatica deriva una stringa nel linguaggio da essa sotteso.

Formalmente, data una grammatica non contestuale, il suo albero sintattico avr le
seguenti caratteristiche:
la radice dellalbero avr come etichetta lassioma;
ogni nodo non terminale dellalbero corrisponder ad un elemento dellalfabeto
V;
ogni nodo terminale (foglia) dellalbero corrisponder ad un elemento
dellalfabeto ;
da ogni nodo non terminale dellalbero derivano nodi terminali e/o non
terminali;
come caso particolare, da un nodo non terminale pu derivare un nodo
terminale costituito dal simbolo vuoto .

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


A
AAl
llb
bbe
eer
rri
ii s
ssi
iin
nnt
tta
aat
ttt
tti
iic
cci
ii e
ee a
aam
mmb
bbi
iig
ggu
uui
iit
tt


Una frase ambigua se essa generata dalla grammatica con due alberi sintattici
distinti. In tal caso anche la grammatica detta ambigua.
G ({S}, {a, b}, {S SbS|a}, S)


Il grado di ambiguit di una frase il numero dei suoi alberi sintattici distinti.
Non decidibile se una grammatica ambigua.

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


A
AAm
mmb
bbi
iig
ggu
uui
iit
tt


Per poter costruire un parser, la grammatica non deve essere ambigua.
Le ambiguit nella grammatica devono essere eliminate durante il progetto del
compilatore.

Grammatica non ambigua unica selezione nellalbero sintattico per una frase.

stmt if expr then stmt | if expr then stmt else stmt | otherstmts

if E1 then if E2 then S1 else S2


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


A
AAm
mmb
bbi
iig
ggu
uui
iit
tt


Noi assumiamo il secondo albero sintattico (else corrisponde allif pi vicino).

Di conseguenza dobbiamo eliminare lambiguit con tale obbiettivo.

La grammatica non-ambigua sar:

stmt matchedstmt | unmatchedstmt
matchedstmt if expr then matchedstmt else matchedstmt | otherstmts
unmatchedstmt if expr then stmt |
if expr then matchedstmt else unmatchedstmt

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


A
AAm
mmb
bbi
iig
ggu
uui
iit
tt

P
PPr
rre
eec
cce
eed
dde
een
nnz
zza
aa d
dde
eeg
ggl
lli
ii o
oop
ppe
eer
rra
aat
tto
oor
rri
ii
Grammatiche ambigue possono essere rese non-ambigue in accordo con le
precedenze degli operatori e con le regole di associativit degli operatori.
Lassociativit esprime a quali operandi si applica un operatore: nella stragrande
maggioranza dei linguaggi di programmazione, i 4 operatori aritmetici (+, -, *, /)
associano verso sinistra, nel senso che un operando con lo stesso operatore
aritmetico alla sua sinistra e alla sua destra, associato con loperatore a sinistra.
Loperatore di esponenziazione (^) associa verso destra.
In presenza di operatori diversi, la precedenza regola lordine di applicazione degli
operatori.
precedenze: ^ (right to left)
* / (left to right)
+ - (left to right)
La grammatica risultante :
E E+T | E-T | T
T T*F | T/F | F
F G^F | G
G id | (E)
CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


P
PPr
rro
ood
ddu
uuz
zzi
iio
oon
nni
ii,
,, d
dde
eer
rri
iiv
vva
aaz
zzi
iio
oon
nni
ii e
ee a
aal
llb
bbe
eer
rri
ii s
ssi
iin
nnt
tta
aat
ttt
tti
iic
cci
ii

Il lavoro dei linguisti nell'ambito della grammatica generativa vede spesso tale albero
di derivazioni come un oggetto di studio fondamentale.
Secondo questo punto di vista, una frase non semplicemente una stringa di parole,
ma piuttosto un albero con rami subordinati e sopraordinati connessi a dei nodi.
Sostanzialmente, il modello ad albero funziona in qualche modo come il seguente
esempio (si considerata una frase semplice), nel quale F una frase (sentence), Det
un articolo determinativo (determiner), N un sostantivo (noun), V un verbo
(verb), SN un sintagma nominale (noun phrase) e SV sintagma verbale (verb
phrase).

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


P
PPr
rro
ood
ddu
uuz
zzi
iio
oon
nni
ii,
,, d
dde
eer
rri
iiv
vva
aaz
zzi
iio
oon
nni
ii e
ee a
aal
llb
bbe
eer
rri
ii s
ssi
iin
nnt
tta
aat
ttt
tti
iic
cci
ii
F
/ \
/ \
/ \
/ \
/ \
SN SV
/ \ / \
/ \ / \
/ \ / \
Det N V SN
Il cane rode / \
Det N
l' osso

Questo diagramma ad albero anche chiamato un indicatore sintagmatico (phrase
marker).
Esso pu essere rappresentato pi convenientemente in forma testuale, sebbene il
risultato sia meno facilmente leggibile.

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


P
PPr
rro
ood
ddu
uuz
zzi
iio
oon
nni
ii,
,, d
dde
eer
rri
iiv
vva
aaz
zzi
iio
oon
nni
ii e
ee a
aal
llb
bbe
eer
rri
ii s
ssi
iin
nnt
tta
aat
ttt
tti
iic
cci
ii

In forma testuale la suddetta frase sarebbe resa nel modo seguente:

[
F
[
SN
[
Det
Il ] [
N
cane ] ] [
SV
[
V
rode ] [
SN
[
Det
l' ] [
N
osso ] ] ] ]

Comunque Chomsky ha affermato che anche le grammatiche a struttura sintagmatica
(phrase structure grammars) sono inadeguate per descrivere i linguaggi naturali. Per
far fronte a questa necessit, egli formul allora il sistema pi complesso della
grammatica trasformazionale.

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


F
FFo
oor
rrm
mma
aa n
nno
oor
rrm
mma
aal
lle
ee d
ddi
ii C
CCh
hho
oom
mms
ssk
kky
yy

Data una grammatica, si possono costruire delle grammatiche equivalenti che abbiano
particolari forme delle produzioni, dette forme normali.
Una grammatica in forma normale di Chomsky se le sue regole sono solo
caratterizzate dalle seguenti propriet:
1. le regole sono omogenee binarie: cio esse sono della forma
A BC con B, C V
la stringa perci formata da due non terminali;

2. le regole sono terminali unitarie: cio esse sono della forma
A a con a
la stringa formata da un terminale;

3. la regola S si applica solo se il linguaggio contiene .

La forma normale di Chomsky caratterizzata da un albero sintattico binario.
Data una grammatica qualsiasi, si pu dimostrare che esiste un semplice algoritmo
per costruire una grammatica equivalente in forma normale di Chomsky.


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


D
DDe
eer
rri
iiv
vva
aaz
zzi
iio
oon
nni
ii L
LLe
eef
fft
tt-
--M
MMo
oos
sst
tt e
ee R
RRi
iig
ggh
hht
tt-
--M
MMo
oos
sst
tt

Il parser pu lavorare, come vedremo, in una variet di modi i pi comuni sono il
metodo top-down (nel quale lordine con cui il parse tree viene costruito procede
dalla radice dellalbero sintattico fino alle foglie) e quello bottom-up (nel quale
lordine procede dalle foglie alla radice) ma in quasi tutti esso processa linput da
sinistra a destra, un simbolo alla volta, applicando una left-most derivation.
Si dice, in sostanza, che le grammatiche si prestano per lo pi allL parsing.

Left-Most Derivation
Una left-most derivation una derivazione nella quale durante ogni passo solo il
non-terminale pi a sinistra sostituito.
E -E -(E) -(E+E) -(id+E) -(id+id)

Right-Most Derivation
Una right-most derivation una derivazione nella quale durante ogni passo solo il
non-terminale pi a destra sostituito.
E -E -(E) -(E+E) -(E+id) -(id+id)


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


L L p pa ar rs se er r

Effettuare il riconoscimento di una stringa rispetto ad una grammatica
unoperazione intrinsecamente nondeterministica.

Questo comporta in generale tempi esponenziali per risolvere il problema del
riconoscimento, e quindi dellanalisi sintattica.

Tuttavia, lanalizzatore sintattico deve essere molto efficiente.

In particolare:
1. tipicamente si richiede allanalizzatore sintattico di operare in tempi lineari rispetto
alle dimensioni della stringa di input
2. inoltre, si richiede allanalizzatore di costruire lalbero sintattico leggendo pochi
simboli al di l dellultimo carattere del lessema in esame della stringa di input
(tipicamente un solo simbolo, detto simbolo di lookahead)

A questo scopo, necessario che la grammatica (in particolare, le regole di
produzione) abbia delle caratteristiche che la rendono adatta allanalisi sintattica.

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


L L p pa ar rs se er r

Le frasi
- possono essere analizzate da sinistra a destra (L parser),
- possono essere costruite con derivazioni left-most (LL(k) parser) o right-most
(LR(k) parser) utilizzando k symboli di lookahead.

LL pi comunemente impiegata nei top-down parser.
LR pi comunemente impiegata nei bottom-up parser.

Per ragioni pratiche k deve essere piccolo.

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Analisi sintattica (parser)


L L p pa ar rs se er r
Per un compilatore auspicabile luso di grammatiche che possano essere analizzate
in modo deterministico con al pi k symboli di lookahead.
Lassenza di ambiguit condizione necessaria per unanalisi deterministica.

Consideriamo ad esempio un bottom up parser per abbcde generato dalla seguente
grammatica con assioma S, eseguendo un approccio left-most matches First.

S aAcBe
A Ab|b
B d


abbcBe applicando B d
aAbcBe applicando A b
aAcBe applicando A Ab
S applicando S aAcBe

a
b
A1
A2
B3
b
c
d
e
S4

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 2 di 34
R
RRi
iic
cco
oor
rrs
ssi
iio
oon
nne
ee s
ssi
iin
nni
iis
sst
ttr
rra
aa (
((L
LLe
eef
fft
tt R
RRe
eec
ccu
uur
rrs
ssi
iio
oon
nn)
))

Una grammatica left recursive se ha un non terminale A tale che
A A per qualche stringa

Le tecniche di parsing Top-down non possono gestire grammatiche left-recursive,
perch ne potrebbe derivare un loop infinito.
Una grammatica left-recursive deve essere convertita in una non left-recursive.
La ricorsione sinistra pu comparire in un singolo passo della derivazione (immediate
left-recursion), o pu comparire in pi che un passo.

Immediate Left-Recursion
A A | dove A e (V T)*

A A
A A | grammatica equivalente

In generale
A A
1
| ... | A
m
|
1
| ... |
n
dove
i
A e (V T)*

A
1
A | ... |
n
A
A
1
A | ... |
m
A | grammatica equivalente


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 3 di 34
A
AAl
llg
ggo
oor
rri
iit
ttm
mmo
oo g
gge
een
nne
eer
rra
aal
lle
ee p
ppe
eer
rr l
ll
e
eel
lli
iim
mmi
iin
nna
aaz
zzi
iio
oon
nne
ee d
dde
eel
lll
lla
aa r
rri
iic
cco
oor
rrs
ssi
iio
oon
nne
ee s
ssi
iin
nni
iis
sst
ttr
rra
aa

- Ordinare i non-terminali A
1
... A
n

- for i from 1 to n do {
- for j from 1 to i-1 do {
sostituire ogni produzione
A
i
A
j

con
A
i

1
| ... |
k

dove A
j

1
| ... |
k

}
- eliminare la ricorsione sinistra nelle produzioni di A
i

}

CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 4 di 34
A
AAl
llg
ggo
oor
rri
iit
ttm
mmo
oo g
gge
een
nne
eer
rra
aal
lle
ee p
ppe
eer
rr l
ll
e
eel
lli
iim
mmi
iin
nna
aaz
zzi
iio
oon
nne
ee d
dde
eel
lll
lla
aa r
rri
iic
cco
oor
rrs
ssi
iio
oon
nne
ee s
ssi
iin
nni
iis
sst
ttr
rra
aa

Esempio
S Aa | b
A Ac | Sd | f
- Ordiniamo i non-terminali: S, A
per S: non ce una ricorsione sinistra diretta.
per A: sostituiamo A Sd con A Aad | bd
cos avremo A Ac | Aad | bd | f
- Eliminiamo la ricorsione sinistra in A
A bdA | fA
A cA | adA |
- Avremo la grammatica non ricorsiva equivalente:
S Aa | b
A bdA | fA
A cA | adA |



CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 5 di 34
A
AAl
llg
ggo
oor
rri
iit
ttm
mmo
oo p
ppe
eer
rr l
ll
e
eel
lli
iim
mmi
iin
nna
aaz
zzi
iio
oon
nne
ee d
dde
eel
lll
lla
aa r
rri
iic
cco
oor
rrs
ssi
iio
oon
nne
ee s
ssi
iin
nni
iis
sst
ttr
rra
aa

Altro esempio
S Aa | b
A Ac | Sd | f
- Ordiniamo i non-terminali: A, S
per A: eliminamo la ricorsione sinistra in A
A SdA | fA
A cA |
per S: sostituiamo S Aa con S SdAa | fAa
cos avremo S SdAa | fAa | b
- Eliminiamo la ricorsione sinistra in S
S fAaS | bS
S dAaS |
- Avremo la grammatica non ricorsiva equivalente:
S fAaS | bS
S dAaS |
A SdA | fA
A cA |


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 6 di 34
L
LLe
eef
fft
tt-
--F
FFa
aac
cct
tto
oor
rri
iin
nng
gg (
((f
ffa
aat
ttt
tto
oor
rri
iiz
zzz
zza
aaz
zzi
iio
oon
nne
ee s
ssi
iin
nni
iis
sst
ttr
rra
aa)
))

Un parser top down o predittivo richiede una grammatica left-factored, una
grammatica, cio, che consenta, quando la scelta tra due produzioni alternative non
sia chiara, di posticipare tale decisione a quando sia stata acquisita una parte
dellinput sufficiente per effettuare la giusta scelta.

La fattorizzazione richiede dunque la trasformazione della grammatica in una
grammatica equivalente.

Per esempio, se abbiamo le seguenti due produzioni:
istr if (expr ) istr else istr |
if (expr) istr
non possiamo dire, riconoscendo il primo if, quale produzione verr impiegata per
derivare istr.
In generale, se:
A
1
|
2

dove (V T)* - {},
1
(V T)* - {},
2
(V T)* -{} e
1

2

possiamo riscrivere la grammatica come segue
A A
A 1 | 2
CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 7 di 34
A
AAl
llg
ggo
oor
rri
iit
ttm
mmo
oo d
ddi
ii L
LLe
eef
fft
tt-
--F
FFa
aac
cct
tto
oor
rri
iin
nng
gg

Per ogni non-terminale A con due o pi alternative (produzioni) con una parte non
vuota comune
A
1
| ... |
n
|
1
| ... |
m

diventa
A A |
1
| ... |
m

A
1
| ... |
n



Esempio
A abB | aB | cdg | cdeB | cdfB

A aA | cdg | cdeB | cdfB
A bB | B

A aA | cdA
A bB | B
A g | eB | fB


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 8 di 34
A
AAl
llg
ggo
oor
rri
iit
ttm
mmo
oo d
ddi
ii L
LLe
eef
fft
tt-
--F
FFa
aac
cct
tto
oor
rri
iin
nng
gg

Altro esempio
A ad | a | ab | abc | b

A aA | b
A d | | b | bc

A aA | b
A d | | bA
A | c


istr if (expr ) istr else istr |
if (expr) istr
istr if (expr ) istr X
X else istr
X c


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 9 di 34
F
FFo
oor
rrm
mme
ee s
sse
een
nnt
tte
een
nnz
zzi
iia
aal
lli
ii

Linsieme delle forme sentenziali di G linsieme delle parole su ( V)
-
derivabili a
partire da S, cio le parole su ( V)
-
tali che
-
.
Il linguaggio definito dalla grammatica G linsieme delle forme sentenziali che sono
parole su (vale a dire, non contengono simboli non terminali).

Esempi:
G ({a} , {A} , A, {A Aa, A })
- A
- A Aa a
- A Aa Aaa aa
Il linguaggio generato da questa grammatica { , a, aa, aaa, . . .}

G ({a, b} , {A, B} , A, {A Ba, B Ab, A , B })
- A
- A Ba Aba ba
- A Ba Aba Baba Ababa baba
Il linguaggio generato da questa grammatica { , a, ba, aba, baba, . . .}
CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 10 di 34
R
RRa
aap
ppp
ppo
oor
rrt
tto
oo t
ttr
rra
aa s
sst
ttr
rri
iin
nng
ggh
hhe
ee,
,, f
ffo
oor
rrm
mme
ee s
sse
een
nnt
tte
een
nnz
zzi
iia
aal
lli
ii e
ee s
sse
een
nnt
tte
een
nnz
zze
ee



CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 11 di 34
F
FFo
oor
rrm
mme
ee s
sse
een
nnt
tte
een
nnz
zzi
iia
aal
lli
ii

Altri esempi:
G ({0 . . . 9} , {A} , A, {A 0A, A 1A, A 2A, . . . ,A 9A,
A 0, A 2, A 4, . . .})
- A 2A 23A 230
- A 0A 00
- A 1A 11A 113A 1132
Questa grammatica genera notazioni decimali dei numeri pari.

G ({_, a . . . z, A . . . Z, 0 . . . 9} , {A, B} , A,
{A _B, A aB, A bB, . . . ,B B, B aB, B bB, . . .
. . . ,B 0B, B 1B, . . . ,B })
Questa grammatica genera gli identificatori del C.
Infatti come prima produzione siamo costretti a usare una produzione su A, che
aggiunge un carattere iniziale non numerico. Dopo, le produzioni su B ci lasciano
proseguire con qualunque sequenza di caratteri.
CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 12 di 34
S
SSi
iin
nnt
tta
aas
sss
ssi
ii c
cco
oon
nnt
tte
eex
xxt
tt-
--f
ffr
rre
eee
ee

Sintassi context-free
La sintassi costituita da un insieme di regole che definiscono le frasi formalmente
corrette e allo stesso tempo permettono di assegnare ad esse una struttura che
rappresenta graficamente il processo di derivazione (albero sintattico).
Considerata la seguente grammatica:
G ({S, T}, {a, b}, {S aTb, T bSa, T ab}, S)
linsieme delle sue regole pu essere rappresentato graficamente tramite il seguente
albero:
S
a T b
S a b b a


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 13 di 34
S
SSi
iin
nnt
tta
aas
sss
ssi
ii c
cco
oon
nnt
tte
eex
xxt
tt-
--f
ffr
rre
eee
ee

Se, analogamente, si vuole rappresentare graficamente la struttura di una frase del
linguaggio italiano, che ha come costituenti un Soggetto, un Predicato Verbale e
un Complemento Oggetto, ecc. , si potr ricorrere al seguente albero sintattico:
frase
Soggetto Predicato
Verbale
Complemento
Oggetto
Articolo
Sostantivo
mangia il gatto
Articolo
il topo
Sostantivo


CdL Magistrale Ing. Informatica Linguaggi Formali e Compilatori Grammatiche context free


Politecnico di Bari G. Piscitelli pag. 14 di 34
S
SSi
iin
nnt
tta
aas
sss
ssi
ii c
cco
oon
nnt
tte
eex
xxt
tt-
--f
ffr
rre
eee
ee

Se, ancora, si vuole rappresentare la struttura di un programma in un linguaggio di
programmazione, si dovr costruire, come in seguito esamineremo, un albero
sintattico dal quale si evinca che un programma ha come costituenti le parti
dichiarative e quelle esecutive.
Le parti dichiarative definiscono i dati usati dal programma. Le parti esecutive si
articolano nelle istruzioni, che possono essere di vari tipi. I costituenti del livello pi
basso sono gli elementi lessicali gi considerati, che dalla sintassi sono visti come
atomi indecomponibili. Infatti la loro definizione spetta al livello lessicale.

Potrebbero piacerti anche