Sunteți pe pagina 1din 23

Curs 12- plan

Analiza sintactic descendent


Parser (Analizor de sintax) descendent
general
Gramatici LL(1)
Definiie
Caracterizare
FIRST, FOLLOW
Tabela de parsare
Algoritmul de analiz sintactic LL(1)

Gh. Grigoras 1
Analizor sintactic(Parser) descendent (top-down)

Intrare

a1 ai an #

Stiva

TABELA
X1 CONTROL DE
PARSARE
X2

.
.
p1 p2

#
Ieire

Gh. Grigoras 2
Configuraie, Tranziii
O configuraie este o triplet (u#, #, ),
unde:
u# este cuvntul rmas de analizat
# este coninutul stivei, cu primul simbol
din n top-ul stivei (dac = x1x2xn, x1 este
top-ul stivei)
este coninutul benzii de ieire: dac =
p1p2 pk, pn n acest moment s-au
aplicat produciile din n aceast ordine.
Gh. Grigoras 3
Configuraie, Tranziii
Dac C este mulimea configuraiilor atunci C C
este relaia de tranziie definit astfel:

(u#, A#, ) (u#, #, r), unde r = A P. (aplicare


regul, expandare)
(uv#, u#, ) (v#, #, ). (potrivire)
( #, #, ) este configuraie de acceptare dac .
O configuraie c pentru care nu exist c astfel ca
c c (n sensul 1, 2) spunem c produce eroare.

Configuraii iniiale: (w#, S#, ) unde w T*


Gh. Grigoras 4
Exemplu
1. E E+T Pasul Intrare Stiva Ieire
2. ET 1 a+a*a# E#
3. T T*F 2 a+a*a# E+T# 1
3 a+a*a# T+T# 12
4. TF 4 a+a*a# F+T# 124
5. F (E) 5 a+a*a# a+T# 1246
6 a*a# T# 1246
6. Fa
7 a*a# T*F# 12463
8 a*a# F*F# 124634
9 a*a# a*F# 1246346
w = a+a*a 10 a# F# 1246346
11 a# a# 12463466
12 # # 12463466

Gh. Grigoras 5
Corectitudinea analizorului sintactic
Fie + nchiderea tranzitiv a relaiei definite.
Teorema (Corectitudinea analizorului sintactic)
Se consider gramatica redus G = (N, T, S, P) i w T*.
Atunci, are loc (w#, S#, ) + (#, #, ) (acceptare) dac i
numai dac w L(G) i este o analizare sintactic stng
a cuvntului w.

Lema 1 Dac n analizorul sintactic descendent ataat gramaticii


G = (N, T, S, P) are loc calculul (uv#, #, ) + (v#, #, ),
atunci n gramatica G are loc derivarea st u, oricare
ar fi u, v T*, , *, P*.

Lema 2 Dac n gramatica G are loc derivarea st u i


1: V {} atunci n parserul descendent are loc calculul:
(uv#, #, ) + (v#, #, ), v T*.
Demonstraii: inducie dup lungimea lui
Gh. Grigoras 6
Parserul este nedeterminist

Exist clase de gramatici pentru care este


determinist?

Construirea unei Tabele de parsare

Gh. Grigoras 7
Gramatici LL(k)
LL(k): Parsing from Left to right using Leftmost derivation and k symbols
lookahead.
Intuitiv, o gramatic este LL(k) dac tranziia de tip aplicare producie n
parser se face cu o unic regul A determinat prin inspectarea a k
simboluri care urmeaz n banda de intrare.
Definim:
k: = if || k then else 1, unde = 1, |1| = k,
:k = if || k then else 2, unde = 2, |2| = k.

Defininiie O gramatic independent de context redus este gramatic LL(k),


k 1, dac pentru orice dou derivri de forma:

S uA u1 ux
* *

st st st

S uA u2 uy
* *

st st st

unde u, x, y T*, pentru care k:x = k:y, are loc 1 = 2.

Gh. Grigoras 8
Teorema Orice gramatic LL(k) este neambigu.

Teorema Dac G este o gramatic stng recursiv,


atunci nu exist nici un numr k astfel nct G s fie
LL(k).

Teorema Clasele de limbaje LL(k) formeaz o ierarhie


infinit:
LL(0) LL(1) LL(2) LL(k) LL(k+1)

Lema Exist limbaje care nu sunt LL(k) pentru nici o


valoare k N.
L = {ancbn | n 1 } {andb2n | n 1 }.
Gh. Grigoras 9
O caracterizare a gramaticilor LL(1)
FIRST() = {a|a T, au } if ( ) then { } else .
*

st
*

st

FOLLOW(A) = {a|a T { }, S uA, a FIRST () }


*

st

FIRST(L) = L FIRST()

Teorem O gramatic G = (N, T, S, P) este gramatic


LL(1) dac i numai dac pentru orice A N i pentru
orice dou producii A 1 | 2 are loc:
FIRST (1FOLLOW (A)) FIRST (2FOLLOW (A)) =

Gh. Grigoras 10
Tabela de analiz sintactic LL(1)
G = (V, T, S, P);
M : V (T { # }) {(, p) |p = A P } {eroare}

S aSa | bSb | c
M a b c #

S (aSa, 1) (bSb, 2) (c, 3) eroare

S aSa | bSb | a | b | c |
M a b c #

S (aSa, 1) (bSb, 2) (c, 5) (,6)


(a, 3) (b, 4)
(,6) (,6)
Tabela de parsare LL(1)
M : N (T { # }) {(, p) |p = A P } {eroare}
1. for(A N )
2. for( a T { # })
3. M(A, a) = ;
4. for (p = A P) {
5. for(a FIRST()-{})
6. M(A, a) = M(A, a) {(, p)} ;
7. if( FIRST()){
8. for(b FOLLOW(A)){
9. if(b == )M(A, #) = M(A, #) {(, p)};
10. else M(A, b) = M(A, b) {(, p)};
}//endfor
}//endif
}//endfor
11. for(A N)
12. for( a T { # })
13. if(M(A, a) = ) M(A, a) = {eroare} ;
Gh. Grigoras 12
Analizorul sintactic (Parserul) LL(1)
configuraie iniial tripleta (w#, S#, ) unde w
este cuvntul de analizat, iar tranziiile sunt:

1.(u#, A#, ) (u#, #, r) dac M(A, 1:u#) =


(, r). (operaia expandare)
2.(uv#, u#, ) (v#, #, ). (operaia potrivire)
3.(#, #, ) acceptare dac .
4.(au#, b#, ) eroare dac a b.
5.(u#, A#, ) eroare dac M(A, 1:u#) = eroare.

Gh. Grigoras 13
Exemplu
1. SE X FIRST(X) FOLLOW(X)
2. SB S a begin end ;
3. E E end ;
B a begin end ;
4. Ba
C ; end
5. B begin SC end
6. C ;SC
7. C

M a begin end ; #
S (B, 2) (B, 2) (E, 1) (E, 1) (E, 1)
E eroare eroare (, 3) (, 3) (, 3)
B (a, 4) (begin SC end, 5) eroare eroare eroare
C eroare eroare (, 6) (;SC, 7) eroare

Gh. Grigoras 22
M a begin end ; #
S (B, 2) (B, 2) (E, 1) (E, 1) (E, 1)
E eroare eroare (, 3) (, 3) (, 3)
B (a, 4) (begin SC end, 5) eroare eroare eroare
C eroare eroare (, 6) (;SC, 7) eroare

PAS INTRARE STIVA OPERAIE IEIRE


1 begin a;;a end# S# expandare
2 begin a;;a end# B# expandare 2
3 begin a;;a end# begin SC end# potrivire 5
4 a;;a end# SC end# expandare
5 a;;a end# BC end# expandare 2
6 a;;a end# aC end# potrivire 4
7 ;;a end# C end# expandare
8 ;;a end# ;SC end# potrivire 7
9 ;a end# SC end# expandare
10 ;a end# EC end# expandare 1
11 ;a end# C end# expandare 3
12 ;a end# ;SC end# potrivire 7
13 a end# SC end# expandare
14 a end# BC end# expandare 2
15 a end# aC end# potrivire 4
16 end# C end# expandare
17 end# end# potrivire 6
18 # # acceptare
Proiectarea compilatoarelor 23
M a begin end ; #
S (B, 2) (B, 2) (E, 1) (E, 1) (E, 1)
E eroare eroare (, 3) (, 3) (, 3)
B (a, 4) (begin SC end, 5) eroare eroare eroare
C eroare eroare (, 6) (;SC, 7) eroare

PAS INTRARE STIVA OPERAIE IEIRE


1 begin aa end# S# expandare
2 begin aa end# B# expandare 2
3 begin aa end# begin SC end# potrivire 5
4 aa end# SC end# expandare
5 aa end# BC end# expandare 2
6 aa end# aC end# potrivire 4
7 a end# C end# eroare

24
Eliminarea recursiei stngi
E E+T |E - T |-T |T
T T*F | T/ F | F
F (E) | a

E TE | -TE
E +T E|-TE |
T FT
T *FT | /FT |
F (E) | a

Gh. Grigoras 17
X FIRST(X) FOLLOW(X)
E ( a - )
E + - )
T ( a + - )
T * / + - )
F ( a */+ - )

M a + - * / ( ) #
E (TE, 1) eroare (-TE, 2) eroare eroare (TE, 1) eroare eroare
E eroare (+TE,3) (-TE, 4) eroare eroare eroare (, 5) (, 5)
T (FT, 6) eroare eroare eroare eroare (FT, 6) eroare eroare
T eroare (, 9) (, 9) (*FT,7) (/FT,8) eroare (, 9) (, 9)
F (a, 11) eroare eroare eroare eroare ((E), 10) eroare eroare

27
Analizorul sintactic LL(1) - implementare
Intrare: Gramatica G = (N, T, S, P), Tabela de analiz LL(1) notat M, Cuvntul de intrare w#.
Ieire: Analiza sintactic stng a lui w dac w L(G), eroare n caz contrar.
Metoda: Sunt implementate tranziiile 1 5 folosind o stiv St.
1. St.push(#),St.push(S)// St = S#
2. a = getnext(), = ;
3. do {
4. X = St.pop();
5. if(X == a)
6. if(X != #) a = getnext();
7. else{
8. if ( != ){write(acceptare); exit(0);}
9. else {write(eroare); exit(1);}
} //endelse
10. else{
11. if(XT){write(eroare); exit(1);}
12. else{
13. if(M(X,a) == eroare)
14. {write(eroare); exit(1);}
15. else {
// M(X,a)=(,r), r=X , =Y1Y2Yn
// inlocueste pe X in stiva
16. for(k = n; k>0; --k) push(Yk);
17. write(r); //se adauga r la
} //endelse
} //endelse
} //endelse
} while(1);

28
Factorizare la stnga

Factorizarea este o transformare care se face


asupra unei gramatici pentru a obine o gramatic
echivalent, eventual LL(1)
Ideea de baz: dac exist produciile
A 1, A 2 cu || > 1
(deci gramatica nu este LL(1)), acestea se
nlocuiesc cu A A, A un nou neterminal, i
produciile A 1 i A 2. Metoda de
transformare se numete factorizare la stnga
Factorizare la stnga: Exemplu
Fie gramatica
S if E then S | if E then S else S | a
Eb
S observm c putem aplica factorizarea la stnga: =
if E then S este factor n primele dou producii.
Obinem gramatica echivalent:
S if E then S S | a
S else S |
Eb
S construim pentru aceast nou gramatic tabela de
analiz LL(1):
Factorizare la stnga: Exemplu
M a b if then else #

S (a, 2) eroare (if E then S S, 1) eroare eroare eroare

S eroare eroare eroare eroare (else S,3) (, 4)

(, 4)
E eroare (b, 5) eroare eroare eroare eroare

Prin factorizare nu este sigur c obinem o gramatic LL(1).


Ambiguitatea n aceast situaie ar putea fi rezolvat prin
alegerea produciei S else S n M(S, else ). Aceast alegere
ar corespunde asocierii lui else pentru acel if precedent cel
mai apropiat de el, soluie adoptat de majoritatea limbajelor
de programare.
Corectitudinea parserului LL(1)

Teorema de corectitudine a parserului


descendent general mpreun cu teorema de
caracterizare LL(1), a modului n care s-a
definit tabela M, dovedesc corectitudinea
parserului LL(1).

Gh. Grigoras 23

S-ar putea să vă placă și

  • Lfac 8
    Lfac 8
    Document23 pagini
    Lfac 8
    Ionel Popescu
    Încă nu există evaluări
  • Lfac 4
    Lfac 4
    Document23 pagini
    Lfac 4
    Ionel Popescu
    Încă nu există evaluări
  • Lfac 4
    Lfac 4
    Document23 pagini
    Lfac 4
    Ionel Popescu
    Încă nu există evaluări
  • Lfac 7
    Lfac 7
    Document23 pagini
    Lfac 7
    Ionel Popescu
    Încă nu există evaluări