Professional Documents
Culture Documents
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.
Definitie:
= 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).
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.
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.
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.
@
@
RA
@
@
A
@
R
@A
@
RA
@
@
@
RA
@
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
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
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.
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
@
?
RT
F ? @
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
@
?
RT
F ? @
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
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.
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.
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.
H
?HH
HH
jE
+
T
@
?
RT
F ? @
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
@
?
RT
F ? @
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
H
?HH
HH
jE
+
T
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
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.
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.
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.
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.
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.
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.
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.
H
?HH
HH
jE
+
T
F
?
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
F
?
?
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
H
?HH
HH
jE
+
T
F
?
?
?
a
a
+
Am scris cu rosu elementele nou ad
augate, cu albastru potrivirile, cu
verde+ncercuire nepotrivirile.
@
?R
@
@
?@
R
@
?@
R
@
?@
R
+
T
E
...
@
?@
R
+
@
R
?@
+
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? .
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
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.
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.
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).
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.
@
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.
Propozitie:
?
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
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
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
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
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 )
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
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.
Firstk (X1 . . . XS
n ) = Firstk (Firstk (X1 ) . . . Firstk (Xn )), Xi G
Firstk ()
iar pt. M VG? : Firstk (M) =
M
Definim funct
a M : VT?
,
dac
a (w $; S$; ) ` ($; $; ) ` accept
M (w ) =
?
nedefinit
a, dac
a (w $; S$; ) ` error .
?
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
?
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
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).
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).
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 () = .
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.
k1
S
i=0
(i)
(k)
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 .
4 : T FY
5 : Y ?FY
6:Y
7 : F (E )
8:F a
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().
+
?
(
)
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
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$
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 )
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).
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
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$
3:X
4 : T FY
5 : Y ?FY
6:Y
7 : F (E )
8:F a
9 : E0 E$
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$
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):
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
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
del
del
$
acc
AX
A XYZ
se nlocuiesc cu:
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).
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.