Documente Academic
Documente Profesional
Documente Cultură
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:
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.
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.
S uA u1 ux
* *
st st st
S uA u2 uy
* *
st st st
Gh. Grigoras 8
Teorema Orice gramatic LL(k) este neambigu.
st
*
st
st
FIRST(L) = L FIRST()
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 | bSb | a | b | c |
M a b c #
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
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
(, 4)
E eroare (b, 5) eroare eroare eroare eroare
Gh. Grigoras 23