You are on page 1of 123

Teoria Compilarii

Dr
agulici Dumitru Daniel
Facultatea de matematic
a si informatic
a,
Universitatea Bucuresti

2011

Cuprins

1 Analiza sintactica
Algoritmi de parsare top - down
Algoritmul de parsare general top - down
Algoritmi de parsare k-predictivi
Algoritmul de parsare pentru gramatici LL(k) tari

Analiza sintactica

Analiza sintactic
a (parsarea) are ca scop identificarea modului n care tokenii
(furnizati de analizorul lexical) se agreg
a pentru a forma structuri sintactice
(instructiuni si expresii), ncuibate unele n altele, p
an
a ce formeaz
a structura
sintactic
a de la nivelul de v
arf (programul).
Sintaxa limbajelor de programare se defineste si se investigheaz
a folosind
instrumente de limbaje independente de context - de exemplu gramatici
independente de context.

Gramatici independente de context

Definitie:

Gramatici independente de context (GIC):


O GIC este un sistem G = hVN , VT , S, Pi, unde:
VN este o multime finit
a nevid
a (multimea neterminalelor);
VT este o multime finit
a nevid
a (multimea terminalelor);
S VN este simbolul de start;
P VN (VN VT )? este o multime finit
a (multimea productiilor).
Not
am VG = VN VT .

Uneori multimea {A 1 , . . . , A n } a tuturor productiilor ce au n st


anga
neterminalul A VN (i.e. multimea alternativelor) lui A va fi notat
a compact
A 1 | . . . |n .

Gramatici independente de context

Definitie: Pentru o GIC G definim:


relatia de derivare direct
a:

u, v , VG?
, V ? , d.d.
N VN

= uNv
= uv
a..

NP
(deci se obtine din prin nlocuirea unei aparitii a lui N cu , n baza
productiei N );
relatia de derivare st
ang
a direct
a:
, V ? , s d.d. la fel ca la , dar u VT? (i.e. s-a derivat cel
mai din st
anga neterminal);
relatia de derivare dreapt
a direct
a:
, V ? , d d.d. la fel ca la , dar v VT? (i.e. s-a derivat cel
mai din dreapta neterminal).

Gramatici independente de context


Definitie: Pentru o GIC G definim:
?
?
?
relatia de derivare / derivare st
ang
a s / derivare dreapt
a d :
nchiderea reflexiv
a si tranzitiv
a a celei directe
?
(ex: d.d. = sau = 0 , 1 , . . . , k = VG? , k 1,
a.. 0 1 . . . k );
+
cu + n loc de ? (ex: ) not
am nchiderea tranzitiv
a (i.e. n cel putin un
pas) a relatiei directe.
Observatie:
Toate relatiile definite mai sus sunt cazuri particulare ale relatiei de derivare.

Definitie: Pentru o GIC G definim:


o secvent
a de deriv
ari directe 0 n s.n. derivare (a lui n din 0 );
daca este tot timpul s , resp. d , ea s.n. derivare st
ang
a,
resp. dreapt
a.
form
a sentential
a: sir din VG? care apare n cel putin o derivare din S.

Gramatici independente de context

Definitie:
Fiind dat
a o GIC G , un arbore de derivare este un arbore a.. :
nodurile sunt etichetate cu elemente din VG {};
r
ad
acina este etichetat
a cu S;
descendentii directi (fii) ai oric
arui nod, dac
a exist
a, formeaz
a o multime
total ordonat
a;
dac
a fii unui nod etichetat cu N au n ordine etichetele x1 , ..., xn , atunci
N x1 . . . xn P.

Gramatici independente de context


Observatie:
Din definitie rezult
a c
a nodurile neterminale sunt etichetate cu elemente din
VN (doar ele pot ap
area n membrii st
angi ai productiilor prin care se obtin fii
acestora) iar nodurile terminale (frunze) pot fi etichetate cu elemente at
at din
VN c
at si din VT sau cu .
Dac
a w este cuv
antul de pe frontiera arborelui (i.e. cuv
antul obtinut prin
concatenarea etichetelor frunzelor n ordinea dat
a de parcurgerea depth first)
?
atunci S w .
?

Reciproc, dac
a S w VG? , atunci exist
a cel putin un arbore de derivare
care are pe frontier
a w - el arat
a un mod de obtinere a lui w din S.
La r
andul s
au, un arbore de derivare poate fi parcurs n general n mai multe
moduri (aplic
am productiile n alt
a ordine) si fiecare parcurgere defineste c
ate o
derivare a lui w din S. Printre acestea ns
a exist
a o singur
a derivare st
ang
a si o
singur
a derivare dreapt
a.
Deci, pentru o GIC dat
a, exist
a o bijectie ntre arborii de derivare, deriv
arile
st
angi, deriv
arile drepte.

Gramatici independente de context


Definitie: Fie G o GIC.
?
Limbajul generat de G este L(G ) = {w VT? : S w }.
G este ambigu
a d.d. exist
a w L(G ) care are 2 arbori de derivare
distincti, i.e. are 2 deriv
ari st
angi distincte, i.e. are 2 deriv
ari drepte
distincte.
Dou
a gramatici sunt echivalente dac
a genereaz
a acelasi limbaj.

Definitie:
Un limbaj L este independent de context dac
a exist
a cel putin o GIC G a..
L = L(G ).

Observatie:
La fel ca n cazul limbajelor regulate, exist
a si alte caracteriz
ari, echivalente,
ale limbajelor independente de context, de ex. s
a fie recunoscute de automate
stiv
a (push down).
Clasa limbajelor regulate este strict inclus
a n clasa limbajelor independente
de context.

Gramatici independente de context


Exemplu:
Fie GIC G dat
a de:
VN = {S, A}
VT = {a}
simbolul de start S
P = {1 : S AA, 2 : A AA, 3 : A a} (am numerotat productiile).
Fie w = aaa VT? . Atunci w L(G ), iar doi arbori de derivare pentru w
sunt:
S
S

@
@
RA
@

@
A

@
R
@A

Deci G este ambigu


a.

@
RA
@
@
@
RA
@
A
?

Gramatici independente de context


Exemplu:
Primul arbore defineste urm
atoarele deriv
ari ale lui w din S (la fiecare pas
am subliniat neterminalul nlocuit si am notat productia aplicat
a):
S
Productii:
@
1 : S AA

R
@
2 : A AA
A
A
3: Aa
@
A

S
S
S
S
S
S
S
S

RA
@

a?
a? a?
2
3
3
3
AA AAA aAA aaA aaa (derivare st
ang
a)
1
2
3
3
3
AA AAA aAA aAa aaa
1
2
3
3
3
AA AAA AaA aaA aaa
1
2
3
3
3
AA AAA AaA Aaa aaa
1
2
3
3
3
AA AAA AAa aAa aaa
1
2
3
3
3
AA AAA AAa Aaa aaa
1
3
2
3
3
AA Aa AAa aAa aaa
1
3
2
3
3
AA Aa AAa Aaa aaa (derivare dreapt
a).
1

Analiza sintactica
Sintaxa limbajelor de programare se defineste cu GIC neambigue, n care:
- neterminale sunt tipuri de structuri sintactice (program, declaratie,
instructiune, instructiune while, expresie, termen, factor, etc.);
-terminalele sunt tipuri de tokeni 6= spatiu (identificator, ntreg, operator aditiv,
operator multiplicativ, etc.);
- simbolul de start este neterminalul corespunz
ator structurii sintactice de la
nivelul cel mai nalt (program);
- productiile sunt regulile/variantele de definire ale diverselor tipuri de structuri
sintactice (definitia instructiunii while, definitia expresiei, etc.).
Cuvintele-candidat la a fi programe corecte sintactic sunt siruri de tipuri de
token (livrate de scanner).
Analizorul sintactic (parserul) verific
a dac
a acest cuv
ant apartine limbajului
generat de gramatic
a (i.e. este un program corect sintactic) si dac
a da,
construieste arborele s
au de derivare (acesta descrie modul de construire a
programului). Arborele poate fi livrat de ex. sub forma sirului numerelor
productiior aplicate n derivarea st
ang
a (sau dreapt
a) asociat
a.

Analiza sintactica

Exemplu:
TODO

Analiza sintactica
Verificarea faptului c
a un cuv
ant format din terminale apartine limbajului
generat de o gramatic
a se face folosind un algoritm de analiz
a sintactic
a
(algoritm de parsare). In caz afirmativ, algoritmul produce si o informatie din
care s
a se poat
a reconstitui arborele de derivare al cuv
antului, de ex. sirul
numerelor productiior aplicate ntr-o derivare st
ang
a (sau dreapt
a) a acestuia
din simbolul de start.
Exist
a algoritmi de parsare:
- top - down: ncearc
a construirea arborelui de derivare de sus n jos (de la
r
ad
acin
a spre frontier
a);
- bottom - up: ncearc
a construirea arborelui de derivare de jos n sus (de la
frontier
a spre r
ad
acin
a).
Pentru o GIC oarecare (f
ar
a propriet
ati suplimentare) n ambele cazuri
algoritmii sunt exponentiali. Ad
aug
and gramaticii propriet
ati suplimentare,
putem obtine algoritmi mai buni, chiar liniari. Astfel sunt gramaticile de tip LL,
LR, de precedent
a, etc. (toate sunt GIC cu propriet
ati suplimentare, care
permit elaborarea unor algoritmi de parsare liniari).

Cuprins

1 Analiza sintactica
Algoritmi de parsare top - down
Algoritmul de parsare general top - down
Algoritmi de parsare k-predictivi
Algoritmul de parsare pentru gramatici LL(k) tari

Algoritmi de parsare top - down

Algoritmii de parsare top - down ncearc


a construirea arborelui de derivare de
sus n jos (de la r
ad
acin
a spre frontier
a).

Cuprins

1 Analiza sintactica
Algoritmi de parsare top - down
Algoritmul de parsare general top - down
Algoritmi de parsare k-predictivi
Algoritmul de parsare pentru gramatici LL(k) tari

Algoritmul de parsare general top - down


Algoritmul de parsare general top - down nu necesit
a propriet
ati suplimentare
ale GIC.
Pentru a lucra organizat, se numeroteaz
a productiile si la fiecare pas se
ncearc
a aplicarea n ordine a acestora, pentru a g
asi descendentii corecti ai
celui mai din st
anga nod neprocesat (n sensul parcurgerii depth first). Odat
a
g
asit
a productia corect
a, se retine num
arul acesteia.
Astfel, dac
a cuv
antul parsat apartine limbajului generat de gramatic
a, se obtine
n final o derivare st
ang
a a sa.
Constat
am totodat
a c
a partea finalizat
a (format
a numai din terminale) din
st
anga frontierei creste progresiv, iar n final ea trebuie s
a coincid
a cu cuv
antul
parsat.
De aceea, pentru a eficientiza c
autarea, la ncercarea fiec
arei productii se
verific
a dac
a terminalele generate de ea n st
anga portiunii nefinalizate din
frontier
a coincid cu terminalele aflate n st
anga portiunii neconsultate nc
a din
cuv
ant, iar dac
a nu, se respinge productia respectiv
a (nu are sens s
a construim
arborele n continuare dup
a aceast
a alegere).
Constat
am totodat
a c
a cuv
antul parsat este consultat de la st
anga la dreapta.

Algoritmul de parsare general top - down

Dac
a pentru un nod neterminal s-au ncercat f
ar
a succes toate productiile
posibile, se revine la nodul anterior (n parcurgere depth first) pentru a se
ncerca acolo productia urm
atoare.
Astfel, algortimul general top - down efectueaz
a backtracking, fiind deci
exponential.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
RT
F ? @

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
RT
F ? @
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
RT
F ? @
?

B
B
B
B
B
B
Ba

a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
RT
F ?h @
B
?
B
a
B
B
B
B
B
B
B
B
B
B
B
B
HH
Ba
H +h
a
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
RT
F ? @
?

B
B
B
B
B
B
Ba

a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
RT
F ? @
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
RT
F ? @

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
@E
F
T + R
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

@
?

RT
@
?
F

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

@
?

RT
@
?
F
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

@
?

RT
@
?
F
?

@
@
@
@

@a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

@
?

RT
h@
?
F
A
?
A
a
A
@
A
@
A
@
A
@
@a A h
+

a
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

@
?

RT
@
?
F
?

@
@
@
@

@a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

@
?

RT
@
?
F
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

@
?

RT
@
?
F

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

A
A
A
A

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T +h @
?

B
B
B

B
B

A
A

B
A
A

B
Bh

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

A
A
A
A

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
@
?
?
RE
F
T + @
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

@
?

R
@T
?
F

F
a

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

@
?

RT
@
?
F

F
a

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

@
?

RT
@
?
F

F
a

A
A
A
AA

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

@
?

RT
@
h
?
F
A
?
A
a
A
A
A
A
A
A
A
AA
A h
a

a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

@
?

RT
@
?
F

F
a

A
A
A
AA

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

@
?

RT
@
?
F

F
a

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
?

@
?

RT
@
?
F

F
a

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
F

?
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
F

?
?
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Exemplu:
Fie G GIC dat
a de: VN = {E , T , F }, VT = {a, +, ?}, simbolul de start: E ,
P: 1 : E T + E 2 : E T
3:T F ?T
4:T F
5:F a
(am numerotat productiile). Pentru w = a + a avem succesiv:
E

H
 ?HH

HH

jE
+
T
F

?
?
?

a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.

Algoritmul de parsare general top - down


Observatie:
Dac
a n exemplul de mai sus am fi avut productia 1 : E E + T n loc de
1 : E T + E , am fi intrat n recursie infinit
a:
E

@
?R
@

@
?@
R

@
?@
R

@
?@
R
+

T
E

...

@
?@
R
+

@
R
?@
+

Deci gramatica trebuie s


a aib
a propriet
ati suplimentare, pentru a evita
recursivitatea la st
anga. Vom vedea ns
a c
a cer
and aceste propriet
ati nu
restr
angem generalitatea, deoarece orice GIC poate fi transformat
a a.. s
a le
aib
a.

Algoritmul de parsare general top - down


Fie G = hVN , VT , S, Pi o GIC cu L(G ) 6= .

Definitie:
A VG este inaccesibil dac
a nu exist
a nici o derivare de forma
?
S A cu , VG? .
A VG este neutilizat dac
a nu exist
a nici o derivare de forma
?
?
S A cu , , VT? .

Propozitie:
G este echivalent
a cu o GIC G 0 = hVN0 , VT0 , S 0 , P 0 i f
ar
a simboluri inaccesibile.
Algoritm (A): Eliminarea simbolurilor inaccesibile
1) V0 {S}; i 1;
2) Vi Vi1 {X : A X P, A Vi1 };
3) if Vi 6= Vi1 then begin i i + 1; goto 2 end;
4) VN0 VN Vi ; VT0 VT Vi ; S 0 S;
P 0 multimea productiilor din P cu ambii membri din Vi? .

Algoritmul de parsare general top - down


Propozitie:
G este echivalent
a cu o GIC G 00 = hVN00 , VT , S, P 00 i a..
?
00
.
A VN VT? a.. A
G 00
Algoritm (B):
1) V0 ; i 1;
2) Vi Vi1 {A : A P, (Vi1 VT )? };
3) if Vi 6= Vi1 then begin i i + 1; goto 2 end;
4) VN00 Vi ; P 00 multimea productiilor din P cu membrul st
ang din Vi , si
membrul drept din (Vi VT )? .
Observatii:
Ca un corolar, rezult
a c
a e decidabil dac
a L(G ) 6= . Intr-adev
ar, aplic
am
algoritmul (B) si n final verific
am dac
a S Vi .
Dac
a nu ceream de la nceput L(G ) 6= , la aplicarea algoritmului (B) putea
rezulta VN00 = , deci s
a nu avem nici simbol de start, n contradictie cu
definitia GIC.
Aceast
a cerint
a nu este un impediment, deoarece gramaticile ce definesc
sintaxa limbajelor de programare genereaz
a limbaje nevide.

Algoritmul de parsare general top - down


Algoritm (C): Eliminarea simbolurilor neutilizate
Aplic
am (B), apoi (A).

Exemplu:
S
a elimin
am simbolurile neutilizate pentru GIC dat
a de:
VN = {S, A, B, C }, VT = {a, b}, S,
P: S A|B, A aB|bS|b, B AB|Ba, C AS|b
algoritmul (B): V : | {z }
pas 0
Retinem: VN = {S, A, C },

A, C , |{z}
S
| {z }
pas 1 pas 2
VT = {a, b}, S, P: S A, A bS|b, C AS|b

algoritmul (A): V : |{z}


S ,
A ,
b
|{z}
|{z}
pas 0 pas 1
pas 2
Retinem: VN = {S, A}, VT = {b}, S, P: S A, A bS|b.

Algoritmul de parsare general top - down

Fie G = hVN , VT , S, Pi o GIC.

Definitie:
-productie: productie de forma A .
redenumire: productie de forma A B (A, B VN ).

Propozitie:
G este echivalent
a cu o GIC G 0 = hVN0 , VT0 , S 0 , P 0 i a..:
dac
a 6 L(G ) atunci G 0 nu are -productii.
dac
a L(G ) atunci singura -productie a lui G 0 este S 0 , iar S 0 nu
apare n membrul drept al nici unei productii.

Algoritmul de parsare general top - down


Algoritm (C): Eliminarea -productiilor
+
1) cu un algoritm asem
an
ator lui (A) sau (B) construim N = {A : A };
mai exact, folosim regulile:
V0 {A : A P}
?
Vi Vi1 {A : A P, Vi1
}
totodat
a, initializ
am P 0 ;
2) Fie A 0 B1 . . . k1 Bk k P cu k 0 si pentru orice i avem Bi N
iar i nu contine simboluri din N ;
if k = 0 then begin P 0 P 0 {A 0 } \ {A }; goto 4 end;
3) P 0 P 0 {A 0 X1 . . . k1 Xk k : Xi {Bi , } pt. orice i} \ {A };
4) P P \ {A 0 B1 . . . k1 Bk k };
if P 6= then goto 2;
5) if S N then G 0 hVN {S 0 }, VT , S 0 , P 0 {S 0 S|}i
else G 0 hVN , VT , S, P 0 i.

Algoritmul de parsare general top - down


Exemplu:
S
a elimin
am -productiile pentru G dat
a de: S aSbS|bSaS|
(neterminalele sunt litere mari, terminalele litere mici, simbolul de start
este S, restul se deduce din context).
N : | {z
S }
pas 0
productia S aSbS introduce n G 0 : S aSbS|abS|aSb|ab
productia S bSaS introduce n G 0 : S bSaS|baS|bSa|ba
productia S nu introduce nimic n G 0
cum S N , n G 0 apare si S 0 S|, cu S 0 simbol de start nou
Asadar, gramatica G 0 va fi dat
a de:
Neterminalele: S, S 0
Terminalele: a, b (aceleasi ca n G )
Simbolul de start S 0 (simbol nou)
Productiile: S aSbS|abS|aSb|ab|bSaS|baS|bSa|ba, S 0 S|

Algoritmul de parsare general top - down


Propozitie:
G este echivalent
a cu o GIC G 0 f
ar
a redenumiri.
Algoritm (D): Eliminarea redenumirilor
?
1) Pentru orice A VN construim RA = {B VN : A B} astfel:
a) R0 {A}; i 1;
b) Ri Ri1 {C VN : B C P, B Ri1 };
c) if Ri 6= Ri1 then begin i i + 1; goto b end;
d) RA Ri ;
Initializ
am P 0 ;
2) Fie B P;
if VN then goto 4;
3) P 0 P 0 {A : B RA };
4) P P \ {B };
if P 6= then goto 2;
5) G 0 se obtine din G nlocuind P cu P 0 .

Algoritmul de parsare general top - down


Exemplu:
S
a elimin
am redenumirile pentru G dat
a de:
E E + T |T , T T ? F |F , F (E )|a
(cu aceleasi conventii de notare, simbolul de start fiind E ).
RE : | {z
E }, | {z
T }, | {z
F }
pas 0 pas 1 pas 2
RT : | {z
T }, | {z
F }
pas 0 pas 1
RF : | {z
F }
pas 0

productia E E + T genereaz
a E E +T
productia T T ? F genereaz
a E T ? F, T T ? F
productia F (E ) genereaz
a E (E ), T (E ), F (E )
productia F a genereaz
a E a, T a, F a
(restul productiilor din G sunt redenumiri si nu genereaz
a nimic)
P 0 este format doar din productiile generate, deci avem:
P 0 : E E + T |T ? F |(E )|a, T T ? F |(E )|a, F (E )|a.

Algoritmul de parsare general top - down

Definitie:
O GIC G este proprie dac
a este f
ar
a simboluri neutilizate, f
ar
a -productii si
f
ar
a redenumiri.

Propozitie:
Orice GIC G cu L(G ) 6= este echivalent
a cu o GIC proprie.
Algoritm: Aplic
am n ordine (B), (A), (C), (D).

Algoritmul de parsare general top - down

Fie G = hVN , VT , S, Pi o GIC.

Definitie:
A VN este recursiv la st
anga (resp. imediat recursiv la st
anga) dac
a
+
A A (resp. A A) cu 6= .
G este recursiv
a la st
anga dac
a are cel putin un neterminal recursiv la
st
anga.

Algoritmul de parsare general top - down


Algoritm: Eliminarea recursivit
atii imediate la st
anga
for [fiecare A VN ] do begin
Not
am alternativele lui A: A A1 | . . . |Am |1 | . . . |n ,
unde i 6= si i nu ncepe cu A, pt. orice i;
Introducem A0 neterminal nou;
Elimin
am productiile A A1 | . . . |Am |1 | . . . |n ;
Introducem productiile A 1 | . . . |n |1 A0 | . . . |n A0
si A0 1 | . . . |m |1 A0 | . . . |m A0
end
Observatii:
Productiile de forma A A pot fi eliminate nainte, cu algoritmul de
eliminare a redenumirilor.
Prin aplicarea algoritmului de mai sus pot ap
area neterminale recursive la
dreapta.

Algoritmul de parsare general top - down


Algoritm: Eliminarea recursivit
atii la st
anga
Presupunem c
a G este f
ar
a -productii si f
ar
a redenumiri.
Not
am VN = {A1 , . . . , An }, S = A1 (simbolul de start).
for i := 1 to n do begin
for j := 1 to i 1 do begin
for [fiecare Ai Aj P] do begin
if [Aj 1 | . . . |k sunt alternativele lui Aj ] then
Introducem Ai 1 | . . . |k ;
Elimin
am Ai Aj
end
end;
Elimin
am recursivitatea imediat
a la st
anga pentru Ai
end
Obs: Algoritmul ncearc
a s
a transforme gramatica a.. din orice Ai VN s
a nu
se poat
a deriva dec
at cuvinte care ncep cu terminale sau cu neterminale Aj
cu j > i. Faptul c
a gramatica nu are -productii si nici redenumiri elimin
a riscul
ca un prefix al lui s
a se deriveze n , expun
and n st
anga un neterminal Aj
cu j i, si elimin
a existenta unei ciclicit
ati A . . . A, A VN , ceea ce ar
mpiedica eliminarea recursivit
atii imediate la st
anga pentru A.

Algoritmul de parsare general top - down


Exemplu:
S
a elimin
am recursivitatea la st
anga pentru G dat
a de:
E E + T |T , T T ? F |F , F (E )|a
(simbolul de start este E , ordinea neterminalelor este: F , T , E ).
pentru F : p
astr
am F (E )|a;
pentru T : elimin
am T F si introducem T (E )|a;
avem deci T T ? F |(E )|a;
elimin
am recursivitatea imediat
a la st
anga pentru T :
introducem neterminalul nou T 0 ;
nlocuim T T ? F |(E )|a cu
T (E )|a|(E )T 0 |aT 0 ,
T 0 ?F | ? FT 0 ;
pentru E : elimin
am E T si introducem E (E )|a|(E )T 0 |aT 0 ;
avem deci E E + T |(E )|a|(E )T 0 |aT 0 ;
elimin
am recursivitatea imediat
a la st
anga pentru E :
introducem neterminalul nou E 0 ;
nlocuim E E + T |(E )|a|(E )T 0 |aT 0 cu
E (E )|a|(E )T 0 |aT 0 |(E )E 0 |aE 0 |(E )T 0 E 0 |aT 0 E 0 ,
E 0 +T | + TE 0 ;
0
0
pentru T si E nu avem nimic de transformat.

Algoritmul de parsare general top - down


Exemplu:
Rezult
a gramatica dat
a de:
E (E )|a|(E )T 0 |aT 0 |(E )E 0 |aE 0 |(E )T 0 E 0 |aT 0 E 0 ,
E 0 +T | + TE 0 ,
T (E )|a|(E )T 0 |aT 0 ,
T 0 ?F | ? FT 0 ,
F (E )|a
(simbolul de start este tot E ).

Algoritmul de parsare general top - down


Observatie:
Algoritmul de mai sus elimin
a recursivitatea la st
anga dar introduce
recursivitate la dreapta, ceea ce schimb
a asociativitatea regulilor.
In contextul exemplului anterior, cuv
antul a + a + a este generat de ambele
gramatici (initial
a si transformat
a), dar arborele s
au de derivare n gram.
a este: E
initial
a este: E iar n gram. transformat

@
E

+ @T

@
E

+ @T

@
@E 0
@
+ T @E 0
@
a
+ @T
a

a
Intr-adev
ar, faptul c
a dou
a gramatici sunt echivalente nseamn
a c
a
genereaz
a aceleasi cuvinte, dar nu este obligatoriu ca si arborii lor de
derivare s
a arate la fel.

Algoritmul de parsare general top - down


Observatie:
Primul arbore de mai sus corespunde ordinii de calcul (a + a) + a, n timp
ce al doilea corespunde ordinii de calcul a + (a + a). In cazul lui + nu este
afectat
a semantica (operatia matematic
a de adunare fiind asociativ
a), dar
n cazul lui sau / ar fi.
O solutie este introducerea de neterminale suplimentare pentru a forta
modul de asociere si precedenta dorit
a.

Algoritmul de parsare general top - down

Algoritmul de parsare general top - down se poate formaliza astfel:


Intrare: G = hVN , VT , S, Pi o GIC f
ar
a simboluri neutilizate si nerecursiv
a
la st
anga, cu productiile numerotate 1, ..., |P|;
w = a1 . . . an VT+ (deci n 1);
Iesire: dac
a w L(G ), atunci o analiz
a st
ang
a a lui w (i.e. sirul numerelor
productiilor folosite ntr-o derivare st
ang
a a sa din S);
dac
a w 6 L(G ), atunci eroare.

Algoritmul de parsare general top - down

Notatii: pentru fiecare A VN index


am alternativele lui A, adic
a consider
am
o ordine a productiilor care au pe A n st
anga: A 1 , ..., A kA ;
vom nota cu Ai indexul productiei A i ;
lucr
am cu configuratii (descrieri instantanee) de forma (s; i; ; ),
unde:
- s {q, r , t, e} reprezint
a starea algoritmului (stare curent
a,
revenire, terminare, resp. eroare);
- i este pozitia curent
a n w ; se consider
a si un delimitator $ aflat pe
pozitia n + 1;
a cu v
arful la dreapta, ce retine alternativele si
- este o stiv
drumurile parcurse pe ele;
- este o stiv
a cu v
arful la st
anga, ce retine forma sentential
a
curent
a.

Algoritmul de parsare general top - down


Configuratia initial
a este: (q, 1, , S$).
Trecerea de la o configuratie la alta se face n baza urm
atoarelor reguli (n
fiecare moment se poate aplica cel mult una dintre ele):
1. (q; i; ; A) ` (q; i; A1 ; 1 ), dac
a A1 este indexul productiei A 1 ca
prim
a alternativ
a a lui A;
2. (q; i; ; a) ` (q; i + 1; a; ), dac
a a = ai , 1 i n;
3. (q; i; ; a) ` (r ; i; ; a), dac
a a VT , a 6= ai , 1 i n + 1;
4. (q; n + 1; ; $) ` (t; n + 1; ; $) si STOP; avem w L(G ) iar o analiz
a
st
ang
a pentru w se obtine aplic
and lui morfismul de monoizi
(i.e. extinderea la siruri) generat de functia g (a) = , dac
a a VT , si
g (Ai ) = m, dac
a Ai este indexul ca alternativ
a a lui A a productiei
cu num
arul m (n numerotarea initial
a de la 1 la |P|);
5. (r ; i; a; ) ` (r ; i 1; ; a), dac
a a VT ;
6a. (r ; i; Aj ; j ) ` (q; i; Aj+1 ; j+1 ), dac
a j + 1 kA ;
6b. (r ; i; Aj ; j ) ` (e; n + 1; Aj ; ), dac
a i = 1, A = S, j = kS ;
6c. (r ; i; Aj ; j ) ` (r ; i; ; A), altfel.

Algoritmul de parsare general top - down

Propozitie:
?

(q; 1; ; S$) ` (t; n + 1; ; $) d.d. S s w , unde = g ().

Obs: cu s am notat relatia de derivare st


ang
a prin aplicarea succesiv
aa
productiilor cu numerele din .

Algoritmul de parsare general top - down


Exemplu:
S
a aplic
am algoritmul pentru aceeasi gramatic
a si cuv
ant ca n exemplul
ilustrat grafic mai devreme:
Fie G GIC dat
a de: VN = {E , T , F }
VT = {a, +, ?}
simbolul de start: E
P: 1 : E T + E (E1 )
2:E T
(E2 )
3 : T F ? T (T1 )
4:T F
(T2 )
5:F a
(F1 )
(am scris n st
anga num
arul ca productie si n dreapta
num
arul ca alternativ
a).
Fie w = a + a (am notat dedesubt pozitiile simbolurilor n cuv
ant).
12 3
Atunci vom avea (am notat deasupra fiec
arei ` num
arul regulii aplicate):

Algoritmul de parsare general top - down


Exemplu:
1 : E T + E (E1 ),
2:E T
(E2 ),

3 : T F ? T (T1 ),
4:T F
(T2 )

(q; 1; ; E $) `
1

(q; 1; E1 ; T + E $) `
1

(q; 1; E1 T1 ; F ? T + E $) `
2

(q; 1; E1 T1 F1 ; a ? T + E $) `
3

(q; 2; E1 T1 F1 a; ?T + E $) `
5

(r ; 2; E1 T1 F1 a; ?T + E $) `
6c

(r ; 1; E1 T1 F1 ; a ? T + E $) `
6a

(r ; 1; E1 T1 ; F ? T + E $) `
1

(q; 1; E1 T2 ; F + E $) `
2

(q; 1; E1 T2 F1 ; a + E $) `
2

(q; 2; E1 T2 F1 a; +E $) `
1

(q; 3; E1 T2 F1 a+; E $) `

5 : F a (F1 ),

w=a + a
1 2 3

Algoritmul de parsare general top - down


Exemplu:
1 : E T + E (E1 ),
2:E T
(E2 ),

3 : T F ? T (T1 ),
4:T F
(T2 )

5 : F a (F1 ),

(q; 3; E1 T2 F1 a + E1 ; T + E $) `
1

(q; 3; E1 T2 F1 a + E1 T1 ; F ? T + E $) `
2

(q; 3; E1 T2 F1 a + E1 T1 F1 ; a ? T + E $) `
3

(q; 4; E1 T2 F1 a + E1 T1 F1 a; ?T + E $) `
5

(r ; 4; E1 T2 F1 a + E1 T1 F1 a; ?T + E $) `
6c

(r ; 3; E1 T2 F1 a + E1 T1 F1 ; a ? T + E $) `
6a

(r ; 3; E1 T2 F1 a + E1 T1 ; F ? T + E $) `
1

(q; 3; E1 T2 F1 a + E1 T2 ; F + E $) `
2

(q; 3; E1 T2 F1 a + E1 T2 F1 ; a + E $) `
3

(q; 4; E1 T2 F1 a + E1 T2 F1 a; +E $) `
5

(r ; 4; E1 T2 F1 a + E1 T2 F1 a; +E $) `
6c

(r ; 3; E1 T2 F1 a + E1 T2 F1 ; a + E $) `

w=a + a
1 2 3

Algoritmul de parsare general top - down


Exemplu:
1 : E T + E (E1 ),
2:E T
(E2 ),

3 : T F ? T (T1 ),
4:T F
(T2 )
6c

(r ; 3; E1 T2 F1 a + E1 T2 ; F + E $) `
6a

(r ; 3; E1 T2 F1 a + E1 ; T + E $) `
1

(q; 3; E1 T2 F1 a + E2 ; T $) `
1

(q; 3; E1 T2 F1 a + E2 T1 ; F ? T $) `
2

(q; 3; E1 T2 F1 a + E2 T1 F1 ; a ? T $) `
3

(q; 4; E1 T2 F1 a + E2 T1 F1 a; ?T $) `
5

(r ; 4; E1 T2 F1 a + E2 T1 F1 a; ?T $) `
6c

(r ; 3; E1 T2 F1 a + E2 T1 F1 ; a ? T $) `
6a

(r ; 3; E1 T2 F1 a + E2 T1 ; F ? T $) `
1

(q; 3; E1 T2 F1 a + E2 T2 ; F $) `
2

(q; 3; E1 T2 F1 a + E2 T2 F1 ; a$) `
4

(q; 4; E1 T2 F1 a + E2 T2 F1 a; $) `

5 : F a (F1 ),

w=a + a
1 2 3

Algoritmul de parsare general top - down


Exemplu:
1 : E T + E (E1 ),
2:E T
(E2 ),

3 : T F ? T (T1 ),
4:T F
(T2 )

5 : F a (F1 ),

(t; 4; E1 T2 F1 a + E2 T2 F1 a; $) accept
= g (E1 T2 F1 a + E2 T2 F1 a) = 145245.

w=a + a
1 2 3

Algoritmul de parsare general top - down

Observatie:
Dac
a am fi numerotat productiile n ordinea:
1 : E T + E (E1 ),
2:E T
(E2 ),

3:T F
(T1 ),
4 : T F ? T (T2 ),

5 : F a (F1 )

am fi ajuns la succes dup


a mai putini pasi (exercitiu).
In forma prezentat
a ns
a algoritmul nu determina o numerotare optim
aa
productiilor (numerotarea se d
a de la nceput). Determinarea unei
numerot
ari mai bune ar ad
auga ns
a complexitate suplimentar
a
algoritmului.

Cuprins

1 Analiza sintactica
Algoritmi de parsare top - down
Algoritmul de parsare general top - down
Algoritmi de parsare k-predictivi
Algoritmul de parsare pentru gramatici LL(k) tari

Algoritmi de parsare k-predictivi


In algoritmul general top-down acceptarea unei productii s-a bazat pe
consultarea simbolurilor aflate n st
anga portiunii r
amase din cuv
ant si a formei
sententiale curente.
Backtrackingul ar putea fi eliminat dac
a la fiecare pas consultarea unui num
ar
de k terminale aflate n st
anga portiunii r
amase din cuv
ant si a simbolului din
st
anga formei sententiale curente ar desemna direct, n mod unic, actiunea
potrivit
a: productia potrivit
a care trebuie aplicat
a, finalizarea cu succes,
finalizarea cu esec, etc.;
Cu alte cuvinte, ar fi bine dac
a am avea o tabel
a (numit
a tabel
a k-predictiv
a)
care pentru orice cuv
ant din terminale de lungime < k sau prefix de lungime k
al unui cuv
ant mai lung si pentru orice simbol care ar putea ap
area n st
anga
unei forme sententiale ar asocia actiunea respectiv
a.
Obtinem astfel un algoritm de parsare de tip top-down f
ar
a revenire, numit
algoritm de parsare k-predictiv, care este liniar.

Algoritmi de parsare k-predictivi


Fie G = hVN , VT , S, Pi o GIC.

Definitie:
Pentru orice VG? not
am:
?
Firstk () = {w VT? : (|w | < k si w )
?
sau (|w | = k si x VG? a.. wx)}.
In particular, First0 () = {}.
?
Followk () = {w VT? : x, VG? a.. S x si w Firstk ()}.
Deci:
Firstk () este multimea sirurilor de k terminale care pot ap
area la nceputul
unui sir derivat din , sau a sirurilor de < k terminale ce se pot deriva integral
din .
Followk () este multimea sirurilor de k sau < k terminale ca mai sus care
pot ap
area dup
a ceva derivat din , n cadrul unui sir derivat din S.

Algoritmi de parsare k-predictivi

Algoritm de calcul pentru Firstk (), VG? :


1) for [orice a VT ] do Firstk (a) {a};
2) for [orice A VN ] do Firstk (A) ;
repeat

for [orice A P] do Firstk (A) Firstk (A) Firstk ()


unde : Firstk () = {}

Firstk (X1 . . . XS
n ) = Firstk (Firstk (X1 ) . . . Firstk (Xn )), Xi G

Firstk ()
iar pt. M VG? : Firstk (M) =
M

until [multimile Firstk (A), A VN , nu se mai schimb


a];
3) In general, pentru VG? vom avea:
dac
a = , atunci Firstk () = {};
dac
a = X1 . . . Xn , Xi VG , atunci Firstk () = Firstk (Firstk (X1 ) . . . Firstk (Xn )).

Algoritmi de parsare k-predictivi

Algoritm de calcul pentru Followk (A), A VN :


for [orice A VN \ {S}] do Followk (A) ;
Followk (S) {};
repeat
for [orice A B P, cu B VN si , VG? ] do
Followk (B) Followk (B) Firstk (Firstk () Followk (A));
until [multimile Followk (A), A VN , nu se mai schimb
a];

Algoritmi de parsare k-predictivi

Algoritmul de parsare k-predictiv se formalizeaz


a astfel:
Fie G = hVN , VT , S, Pi o GIC cu productiile numerotate de la 1 la |P|.
Vom numi extensia sa GIC G 0 = hVN {S 0 }, VT {$}, S 0 , P {S 0 S$}i,
unde S 0 si $ sunt simboluri noi.
(i)
(0)
Pt. orice i NI not
am VT = {w VT? : |w | = i}; n particular, VT = {}.
Presupunem defint
a o aplicatie (numit
a tabel
a de parsare k-predictiv
a)
k1
S (i)
(k)
M : ((
VT ){$} VT ) (VG {$})
i=0

{accept, delete, error } {(, i) : i : A P}


astfel nc
at:
M(a, a) = delete, pentru orice a VT ;
M($, $) = accept.

Algoritmi de parsare k-predictivi

Algoritmul de parsare k-predictiv construit pe baza lui M este:


Se lucreaz
a cu configuratii de forma (w $; $; ), unde w VT? , VG? ,
{1, . . . , |P|}? ;
Configuratia initial
a este (w $; S$; ), unde w este cuv
antul de analizat;
Trecerea de la o configuratie la alta se face n baza urm
atoarelor reguli:
1. (; A; ) ` (; ; i), dac
a M(Firstk (), A) = (, i), i : A ;
2. (a; a; ) ` (; ; ), a VT (corespunde cazului M(a, a) = delete,
a VT );
3. ($; $; ) ` accept (corespunde cazului M($, $) = accept);
4. (; ; ) ` error , altfel (corespunde cazurilor c
and M(., .) = error ).

Algoritmi de parsare k-predictivi

Definim funct
a M : VT?

{1, . . . , |P|}? prin:


ia partial
?

,
dac
a (w $; S$; ) ` ($; $; ) ` accept
M (w ) =
?
nedefinit
a, dac
a (w $; S$; ) ` error .
?

(prin ` am notat nchiderea reflexiv


a si tranzitiv
a a relatiei `).

Definitie:
Spunem c
a (, M) este un algoritm de parsare k-predictiv valid pentru G
si c
a M este o tabel
a de parsare valid
a pentru G , dac
a
?

L(G ) = {w VT? : a.. (w $; S$; ) ` ($; $; ) (i.e. M (w ) = )}.

Obs: In acest caz va rezulta si c


a S s w .

Algoritmi de parsare k-predictivi

Nu pentru orice GIC se poate construi o tabel


a de parsare k-predictiv
a.
O asemena tabel
a se poate construi pentru gramatici de tip LL(k) sau LL(k)
tari.

Cuprins

1 Analiza sintactica
Algoritmi de parsare top - down
Algoritmul de parsare general top - down
Algoritmi de parsare k-predictivi
Algoritmul de parsare pentru gramatici LL(k) tari

Alg. de parsare pt. gramatici LL(k) tare


G = hVN , VT , S, Pi o GIC.

Definitie:
G este de tip LL(k), k NI, dac
a pentru orice derivare st
ang
a
?
S s wA (w VT? , A VN , VG? )
si pentru orice productii A , A P a..
?
S s wA s w s wx
(x, y VT? )
?
S s wA s w s wy
cu Fistk (x) = Firstk (y ), avem = .
G este de tip LL dac
a exist
a k NI a.. G este de tip LL(k).
Observ
am deci c
a pentru o gramatic
a de tip LL, la orice pas al unei deriv
ari
st
angi, sirul de terminale generat p
an
a la momentul curent w , neterminalul
curent A si primele k terminale care urmeaz
a n cuv
antul analizat (acele
Firstk , care contin fiecare doar c
ate 1 element) determin
a n mod unic
productia care se aplic
a din A, adic
a ce doream.
Denumirea LL (left-left) provine de la faptul c
a n algoritmul de parsare
cuv
antul analizat este parcurs de la st
anga la dreapta (primul left), iar n
final se obtine o derivare st
ang
a a sa (al doilea left).

Alg. de parsare pt. gramatici LL(k) tare

Definitie:
Un limbaj este de tip LL(k), k NI, dac
a exist
a o gramatic
a de tip LL(k)
care l genereaz
a.
Un limbaj este de tip LL dac
a exist
a k NI a.. limbajul este de tip LL(k).

Alg. de parsare pt. gramatici LL(k) tare


G = hVN , VT , S, Pi o GIC.

Definitie:
G este de tip LL(k) tare, k NI, dac
a pt. orice productii A , A P
cu 6= avem Firstk (Followk (A)) Firstk (Followk (A)) = .

Propozitie:
Dac
a G nu are simboluri neutilizate si este de tip LL,
atunci G este neambigu
a.
Dac
a G nu are simboluri neutilizate si este recursiv
a la st
anga,
atunci G nu este de tip LL.
Pentru orice k NI, dac
a G este de tip LL(k), atunci G este de tip LL(k + 1).
Pentru orice k NI, dac
a G este de tip LL(k) tare, atunci G este de tip LL(k).
Dac
a G nu are simboluri neutilizate, atunci G este de tip LL(1) tare d.d.
G este de tip LL(1).
(Caracterizare) G f
ar
a simboluri neutilizate este LL(k), k 1, d.d.
?
pentru orice derivare st
ang
a S s wA cu w VT?
si orice productii A , A P
avem Firstk () Firstk () = .

Alg. de parsare pt. gramatici LL(k) tare

Exemplu:
S
a verific
am, cu proprietatea de caracterizare, c
a urm
atoarea gramatic
a
este LL(1): S aAS|b, A bSA|a.

First1 (aAS) = {a}
?
?
,
Dac
a S s wS, w VT , atunci avem
First1 (b) = {b}
deci First1 (aAS) First1 (b) = . 
First1 (bSA) = {b}
?
Dac
a S s wA, w VT? , atunci avem
,
First1 (a) = {a}
deci First1 (bSA) First1 (a) = .
Exercitiu: verificati aceeasi proprietate folosind definitia.

Alg. de parsare pt. gramatici LL(k) tare


Pentru o GIC G = hVN , VT , S, Pi de tip LL(k) tare, k NI putem construi o
tabel
a de parsare k-predictiv
a astfel:
Numerot
am productiile sub forma i : A , i {1, . . . , |P|}.
Consider
am extensia G 0 = hVN {S 0 }, VT {$}, S 0 , P {S 0 S$}i a lui
G , unde S 0 si $ sunt simboluri noi.
Definim M : ((

k1
S
i=0

(i)

(k)

VT ){$} VT ) (VG {$})

{accept, delete, error } {(, i) : i : A P}


astfel:
pentru orice productie i : A P si orice u Firstk (Followk (A)),
definim M(u, A) = (, i);
M(a, a) = delete, pentru orice a VT ;
M($, $) = accept;
M(., .) = error , n rest;
(multimile Firstk , Followk sunt calculate relativ la G 0 ).

Alg. de parsare pt. gramatici LL(k) tare


Observatie:
In cazul k = 1, prima proprietate din definitia lui M se poate nlocui cu:
pentru orice i : A P efectu
am urm
atoarele:
pentru orice a First1 () \ {} definim M(a, A) = (, i);
dac
a First1 (), atunci pentru orice b Follow1 (A) definim
M(b, A) = (, i).
Pentru o GIC G oarecare (nu neap
arat LL(k) tare) constructia lui M de
mai sus ar putea s
a nu se fac
a corect, n sensul c
a regulile indicate ar putea
da mai multe valori diferite pentru un acelasi M(., .) (i.e. M s
a aib
a intr
ari
multiple). Asemenea intr
ari multiple se mai numesc si conflicte.
Pericol este doar n cazurile M(u, A), A VN , deoarece pentru un u si A
fixate ar putea exista mai multe productii A cu u Firstk (Followk (A)).
Vom prezenta mai t
arziu c
ateva tehnici de transformare a unei GIC a..
s
a nu mai apar
a conflicte.

Alg. de parsare pt. gramatici LL(k) tare

Propozitie:
Pentru o GIC G tabela M construit
a ca mai sus nu are intr
ari multiple d.d. G
este de tip LL(k) tare.
Dac
a G este de tip LL(k) tare, atunci algoritmul de parsare k-predictiv
construit pe baza tabelei M construit
a ca mai sus este valid pentru G .

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
Aplicatie pentru o GIC f
ar
a simboluri neutilizate n cazul LL(1) (i.e. LL(1)
tare):
Fie GIC urm
atoare (care defineste expresii aritmetice):
1 : E TX
2 : X +TX
3:X

4 : T FY
5 : Y ?FY
6:Y

7 : F (E )
8:F a

(deci VN = {E , T , X , F , Y }, VT = {+, ?, (, ), a}, simbol de start este E si am


numerotat productiile).
S
a aplic
am algoritmul pentru a parsa cuv
antul w = (a ? a).
Incepem prin a construi tabela de parsare 1-predictiv
a M.
Conform observatiei anterioare, avem nevoie s
a calcul
am
First1 (), pentru orice productie A
Follow1 (A), pentru orice neterminal A.
In acest scop, vom aplica algoritmii de calcul pentru Firstk , Followk
prezentati mai nainte, pentru GIC extins
a (not
am noul simbol de start E 0 ).
In loc de First1 , Follow1 vom scrie prescurtat Fi, resp. Fo.

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX

3:X
4 : T FY

5 : Y ?FY
6:Y

7 : F (E )
8:F a

9 : E0 E$

Mai nt
ai calcul
am Fi(), pentru orice productie A .
In tabelul urm
ator, liniile corespund terminalelor, neterminalelor si
membrilor drepti ai productiilor, iar coloanele corespund pasilor din
algoritm.
In celula corespunz
atoare liniei si coloanei i scriem ce se adaug
a la pasul i
n Fi().
Coloanele se construiesc succesiv spre dreapta p
an
a nu se mai adaug
a nimic
pe nici o linie.
In final, pe linia fiec
arui vom g
asi elementele lui Fi().

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX

+
?
(
)
a
$
E0
E
X
T
F
Y
TX
+TX

FY
?FY
(E )
E$

3:X
4 : T FY
pas 1
+
?
(
)
a
$

pas 2

5 : Y ?FY
6:Y
pas 3

pas 4

7 : F (E )
8:F a
pas 5

(, a
(, a
+,
(, a
(, a
?,
(, a
+

(, a
?
(
(, a

9 : E0 E$

pas 6

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX

3:X
4 : T FY

5 : Y ?FY
6:Y

In final retinem:
Fi(TX ) = {(, a}
Fi(+TX ) = {+}
Fi() = {}
Fi(FY ) = {(, a}
Fi(?FY ) = {?}
Fi((E )) = {(}
Fi(a) = {a}
Fi(E $) = {(, a}
Vom avea ns
a nevoie si de:
Fi(E ) = {(, a}
Fi(X ) = {+, }
Fi(Y ) = {?, }

7 : F (E )
8:F a

9 : E0 E$

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX

3:X
4 : T FY

5 : Y ?FY
6:Y

7 : F (E )
8:F a

9 : E0 E$

Acum calcul
am Fo(A), pentru orice neterminal A.
La Fo(E ) se adaug
a la fiecare pas:
Fi(Fi())Fo(F )) = {)} (cf. prod. F (E ))
Fi(Fi($)Fo(E 0 )) = {$} (cf. prod. E 0 E $)
La Fo(X ) se adaug
a la fiecare pas:
Fi(Fi()Fo(E )) = Fo(E ) (cf. prod. E TX )
Fi(Fi()Fo(X )) = Fo(X ) (cf. prod. X +TX ) - este
nerelevant
La Fo(T ) se adaug
a la fiecare pas:
Fi(Fi(X )Fo(E )) = Fi({+, }Fo(E )) = {+} Fo(E )
(cf. prod. E TX )
Fi(Fi(X )Fo(X )) = Fi({+, }Fo(X )) = {+} Fo(X )
(cf. prod. X +TX )

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX

3:X
4 : T FY

5 : Y ?FY
6:Y

7 : F (E )
8:F a

9 : E0 E$

La Fo(F ) se adaug
a la fiecare pas:
Fi(Fi(Y )Fo(T )) = Fi({?, }Fo(T )) = {?} Fo(T )
(cf. prod. T FY )
Fi(Fi(Y )Fo(Y )) = Fi({?, }Fo(Y )) = {?} Fo(Y )
(cf. prod. Y FY )
La Fo(Y ) se adaug
a la fiecare pas:
Fi(Fi()Fo(T )) = Fo(T ) (cf. prod. T FY )
Fi(Fi()Fo(Y )) = Fo(Y ) (cf. prod. Y ?FY ) - este
nerelevant
Fo(E 0 ) r
am
ane {} (ca la initializare).

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX

3:X
4 : T FY

5 : Y ?FY
6:Y

7 : F (E )
8:F a

9 : E0 E$

In tabelul urm
ator, liniile corespund neterminalelor iar coloanele pasilor;
tabel(N, i) contine ce se adaug
a la Fo(N) la pasul i; coloanele se
completeaz
a spre dreapta, iar algoritmul se opreste c
and nu se mai adaug
a
nimic pe nici o linie (atunci pe linia fiecr
arui N vom g
asi elementele lui
Fo(N)):
Neterminal
E0
E
X
T
F
Y

pas 1

pas 2
), $
), $
+, ), $
?, +, ), $
+, ), $

pas 3

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX

3:X
4 : T FY

In final retinem:
Fo(E 0 ) = {}
Fo(E ) = {), $}
Fo(X ) = {), $}
Fo(T ) = {+, ), $}
Fo(F ) = {?, +, ), $}
Fo(Y ) = {+, ), $}

5 : Y ?FY
6:Y

7 : F (E )
8:F a

9 : E0 E$

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX

3:X
4 : T FY

5 : Y ?FY
6:Y

7 : F (E )
8:F a

9 : E0 E$

Acum construim tabela de parsare 1-predictiv


a M : ({$} VT ) (VG {$})
{acc, del, err } {(, i) : i : A productie n G }
Pentru 1 : E TX avem Fi(TX Fo(E )) = {(, a} (deoarece Fi(TX ) = {(, a}),
deci M((, E ) = (TX , 1), M(a, E ) = (TX , 1).
Asem
an
ator:
Pentru 2 : X +TX avem Fi(+TX Fo(X )) = {+}.
Pentru 3 : X avem Fi(Fo(X )) = {), $}.
Pentru 4 : T FY avem Fi(FY Fo(T )) = {(, a} (deoarece Fi(FY ) = {(, a}).
Pentru 5 : Y ?FY avem Fi(?FY Fo(Y )) = {?}.
Pentru 6 : Y avem Fi(Fo(Y )) = {+, ), $}.
Pentru 7 : F (E ) avem Fi((E )Fo(F )) = {(}.
Pentru 8 : F a avem Fi(aFo(F )) = {a}.

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
1 : E TX
2 : X +TX
Pentru
Pentru
Pentru
Pentru
Pentru
Pentru
Pentru
Pentru

1
2
3
4
5
6
7
8

:
:
:
:
:
:
:
:

E
X
X
T
Y
Y
F
F

3:X
4 : T FY

5 : Y ?FY
6:Y

7 : F (E )
8:F a

9 : E0 E$

TX avem Fi(TX Fo(E )) = {(, a}.


+TX avem Fi(+TX Fo(X )) = {+}.
avem Fi(Fo(X )) = {), $}.
FY avem Fi(FY Fo(T )) = {(, a}.
?FY avem Fi(?FY Fo(Y )) = {?}.
avem Fi(Fo(Y )) = {+, ), $}.
(E ) avem Fi((E )Fo(F )) = {(}.
a avem Fi(aFo(F )) = {a}.

Obtinem tabela (nu am mai trecut intr


arile err ):
E
$
+
?
(
)
a

X
, 3
+TX , 2

TX , 1

FY , 4

(E ), 7

, 3
TX , 1

Y
, 6
, 6
?FY , 5

a, 8

$
acc

del
del
del

, 6
FY , 4

del
del

S
a analiz
am cuv
antul w = (a ? a) (la fiecare tranzitie am subliniat prefixele
care devin argumente pentru functia M):

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
E
$
+
?
(
)
a

X
, 3
+TX , 2

TX , 1

FY , 4

(E ), 7

, 3
TX , 1

Y
, 6
, 6
?FY , 5

a, 8

((a ? a)$; E $; ) `
((a ? a)$; T X $; 1) `
((a ? a)$; F YX $; 14) `
((a ? a)$; (E )YX $; 147) `
(a ? a)$; E )YX $; 147) `
(a ? a)$; T X )YX $; 1471) `
(a ? a)$; F YX )YX $; 14714) `
(a ? a)$; aYX )YX $; 147148) `
(?a)$; Y X )YX $; 147148) `
(?a)$; ?FYX )YX $; 1471485) `
(a)$; F YX )YX $; 1471485) `
(a)$; aYX )YX $; 14714858) `
()$; Y X )YX $; 14714858) `

del
del
del

, 6
FY , 4

del
del

$
acc

Alg. de parsare pt. gramatici LL(k) tare


Exemplu:
E
$
+
?
(
)
a

X
, 3
+TX , 2

TX , 1

FY , 4

(E ), 7

, 3
TX , 1

Y
, 6
, 6
?FY , 5

del
del
del

, 6
FY , 4

a, 8

()$; X )YX $; 147148586) `


()$; )YX $; 1471485863) `
($ ; Y X $; 1471485863) `
($ ; X $; 14714858636) `
($ ; $ ; 147148586363) `
accept
Analiza rezultat
a este: 147148586363.
Observ
am c
a parsarea s-a f
acut f
ar
a revenire.
Exercitiu: desenati arborele de derivare.

del
del

$
acc

Alg. de parsare pt. gramatici LL(k) tare


Am v
azut c
a pentru GIC oarecare, dac
a ncerc
am s
a construim tabela de
parsare k-predictiv
a M ca mai sus, pot ap
area intr
ari multiple (conflicte), dac
a
gramatica nu este de tip LL(k) tare.
Riscul s
a apar
a conflicte exist
a doar la intr
arile M(u, A), cu A neterminal anume pentru un u si un A fixate ar putea exista mai multe productii A
a.. u Firstk (Followk (A)).
Uneori ns
a conflictele pot fi rezolvate - gramatica poate fi transformat
a
ntr-una echivalent
a de tip LL(k) tare.
Prezent
am n continuare tipurile posibile de conflicte si c
ateva metode de
rezolvare a lor. Vom ilustra doar pentru cazul k = 1.
Am v
azut c
a n acest caz
u First1 () \ {}
sau
u Firstk (Followk (A))

First1 () si u Follow1 (A)

Alg. de parsare pt. gramatici LL(k) tare


Conflicte First/First:
Presupunem c
a avem dou
a productii i1 : A 1 , i2 : A 2 , 1 6= 2 , si
u (First1 (1 ) First1 (2 )) \ {}.
Atunci n M(u, A) ajunge si (1 , i1 ) si (2 , i2 ).
O solutie: factorizarea la st
anga
Exemplu:
productiile:

AX
A XYZ

se nlocuiesc cu:

A XA0 (A0 neterminal nou)


A0
A0 YZ

Alg. de parsare pt. gramatici LL(k) tare


Conflicte First/Follow :
Exemplu:
1 : S Aab
2:Aa
(S si A neterminale, a si b terminale).
3:A

a a First1 (a)
(a, 2), pentru c
sau
atunci M(a, A) poate fi:

(, 3), pentru c
a First1 () si a Follow1 (A)

Dac
a avem productiile:

O solutie: substitutia
Exemplu:
Inlocuim productiile 1, 2, 3 cu:

S aab
(dispare A).
S ab

Obs. c
a n urma substitutiei pot ap
area conflicte First/First - atunci facem n
S aA
continuare factorizare la st
anga si nlocuim aceste productii cu: A ab
Ab
(reapare A, dar productiile sunt altele).

Alg. de parsare pt. gramatici LL(k) tare


Recursivitatea la st
anga:
Am spus c
a o GIC G = hVN , VT , S, Pi este recursiv
a la st
anga dac
a exist
a
+
A VN a.. A A cu 6= .
Recursivitatea la st
anga genereaz
a conflicte First/First cu toate alternativele
neterminalului recursiv.
Exemplu:
i0 : E E + T
i1 : E 1
Dac
a avem productiile:
i2 : E 2

atunci pentru orice j si orice u First1 (j ) \ {} avem u First1 (E + T ), deci


n intrarea M(u, E ) va ajunge si (j , ij ) si (E + T , i0 ).
Solutia: eliminarea recursivit
atii la st
anga (am prezentat algoritmul mai
devreme).

Analiza sintactica
Exercitii seminar:
La exercitiile 1 - 6 neterminalele sunt litere mari, terminalele litere mici,
simbolul de start este S; multimile neterminalelor, terminalelor, resp.
productiilor se deduc din context.
1. Eliminati simbolurile neutilizate pentru urm
atoarele GIC:
a) S AB|CA, A a, B BC |AB, C aB|b;
b) S AB|a, A bB|cC , B SA|A, C aA|bB|S;
c) S SS|AAa, A aAB|aS|b.
2. Determinati dac
a L(G ) = pentru urm
atoarele GIC:
a) S AS|A, A aB|bA;
b) S ABC , A BB|;
c) B CC |a, C AA|b.
3. Eliminati -productiile pentru urm
atoarele GIC:
a) S ABC , A BB|, B CC |a, C AA|b
b) S aSb|bSa|SS|.
4. Eliminati redenumirile si apoi simbolurile inaccesibile pentru urm
atoarea
GIC: S A, A bS|b.

Analiza sintactica
Exercitii seminar:
5. Caracterizati gramaticile de tip LL(0).
6. Ar
atati c
a GIC: S aAaa|bAba, A b|
este LL(2) dar nu LL(2) tare.
7. Aplicati algoritmul de parsare pentru gramatici LL(1) (tare) pentru GIC:
1 : S F , 2 : S (S + F ), 3 : F 1
si cuv
antul w = (1 + 1).

Analiza sintactica
Teme laborator:
1. Scrieti un program care citeste o GIC, apoi construieste si afisaz
a GIC
proprie si f
ar
a recursivitate la st
anga echivalent
a cu ea.
Algoritmii componenti (B), (A), (C), (D), eliminarea recursivit
atii la st
anga vor
fi implementati ca proceduri/functii separate, care vor primi gramaticile surs
a si
destinatie ca parametri.
2. Implementati algoritmul de parsare general top - down.
Programul va citi o GIC (presupus
a a fi f
ar
a simboluri neutilizate si nerecursiv
a
la st
anga), apoi ntr-un ciclu va citi diverse cuvinte si va determina dac
a fac
parte din limbajul generat de gramatic
a; n caz afirmativ, va afisa si productiile
aplicate ntr-o derivare st
ang
a a sa.
3. Implementati algoritmul de parsare general top - down folosind o
procedur
a/functie recursiv
a, care la fiecare apel s
a fac
a o derivare. Celelalte
detalii sunt ca la problema 2.

Analiza sintactica
Teme laborator:
4. Implementati algoritmul de parsare pentru gramatici de tip LL(1) (tare).
Detaliile sunt asem
an
atoare celor din problema 2.
5. Implementati o variant
a recursiv
a a algoritmului de parsare pentru gramatici
de tip LL(k) tare, pentru o gramatica fixat
a prin cod:
Pentru fiecare neterminal A se asociaz
a o procedur
a/functie, care consult
ak
simboluri din cuv
antul de intrare ncep
and de la pozitia curent
a (retinut
a ntr-o
variabil
a global
a sau transmis
a ca parametru), determin
a (unic) productia lui A
care trebuie aplicat
a, i afisaz
a num
arul, iar pentru fiecare simbol din membrul
s
au drept, dac
a e terminal avanseaz
a pozitia curent
a n cuv
antul de intrare, iar
dac
a e neterminal apeleaz
a procedura/functia acestuia. Tabela de parsare este
implementat
a prin codul acestor proceduri/functii.
Alternativ, se poate folosi o singur
a procedur
a/functie recursiv
a, care
primeste neterminalul ca parametru. De asemenea, gramatica poate s
a nu fie
fixat
a prin cod, ci programul s
a o citeasc
a, s
a construiasc
a tabela de parsare
ntr-o structur
a de date (de ex. o matrice), iar procedura/functia unic
a s
a fie
un cod general, care lucreaz
a pe aceast
a structur
a de date.
Alte detalii sunt asem
an
atoare celor din problema 2.

You might also like