Documente Academic
Documente Profesional
Documente Cultură
Limbaje de tipul 3
Gramatici regulate
Automate finite
Deterministe
Nedeterministe
Expresii regulate
a, a , ,
E1.E2, E1|E2, E1*, (E1)
Istoric
Paii compilrii
Analiza lexical
Descriere lexical
Interpretare
Interpretare orientat dreapta
Descriere lexical bine format
Lex
Uniti
lexicale
Caractere
Cod
surs
Analizor
lexical
Arbore
sintactic
Analizor
sintactic
Analizor
semantic
Arbore
sintactic
decorat
Generator
de cod
Cod main
Asamblare
Cod
intermediar
Interpretare
litera a | b ||z
cifra 0 | 1 || 9
identificator litera (litera| cifra)*
semn + | numar (semn | ) cifra+
operator + | -| * | / | < | > | <= | >= | < >
asignare :=
doua_puncte :
cuvinte_rezervate if| then|else
paranteze ) | (
Ai
An
Ao
q0
Aa
Ad
Ac
Ap
liter, cifr
liter
1
cifr
cifr
cifr
#o
operator {+,-}
#o
:
5
#n
+,-
),(
#i sau #c
6
7
#a
#d
#p
Cod surs C
executabil
lex.yy.c
lex ll fisier.l
a.out
gcc lex.yy.c
Declaraiile conin
Declaraii C, ntre secvenele rezervate %{, %}
Definiii Lex pentru segmentul de reguli
cifra [0-9]
litera [a-zA-Z]
Simbol
Descriere
secven escape
negaie
a|b
a sau b
()
grupare de caractere
a+b
literalul"a+b
[]
clasa de caractere
Expresia
abc
abc*
abc+
a(bc)+
a(bc)?
[abc]
[a-z]
[a\-z]
[-az]
[A-Za-z0-9]+
[ \t\n]+
[^ab]
[a^b]
[a|b]
a|b
Candidai ce se potrivesc
abc
ab abc abcc abccc ...
abc abcc abccc ...
abc abcbc abcbcbc ...
a abc
unul dintre caracterele: a, b, c
orice liter mic
unul din caracterele: a, -, z
unul din caracterele: -, a, z
unul sau mai multe caractere alfanumerice
spaii
orice cu excepia caracterelor: a, b
unul din caracterele : a, ^, b
unul din caracterele : a, |, b
unul din caracterele : a, b
Seciunea de reguli
exp_1
exp_2
.
.
.
exp_n
{Aciune_1}
{Aciune_2}
{Aciune_n}
Nume
Descriere
int yylex(void)
char *yytext
yyleng
yylval
FILE *yyout
fiierul de ieire
FILE *yyin
fiierul de intrare
%{
int yylineno;
%}
%%
^(.*)\n printf("%4d\t%s", ++yylineno, yytext);
%%
int main(int argc, char *argv[]) {
yyin = fopen(argv[1], "r");
yylex();
fclose(yyin);
}
letter [A-Za-z]
digit [0-9]
%{
int count;
%}
%%
{letter}({letter}|{digit})* {count++;}
.{}
%%
int main(void) {
yylex();
printf("number of identifiers = %d\n", count);
return 0;
}
%{
int nchar, nword, nline;
%}
%%
\n { nline++; nchar++; }
[^ \t\n]+ { nword++, nchar += yyleng; }
. { nchar++; }
%%
int main(void) {
yylex();
printf("%d\t%d\t%d\n", nchar, nword, nline);
return 0;
}
%{
# include <stdio.h>
%}
litera [a-zA-Z]
cifra [0-9]
cifre ({cifra})+
semn [+-]
operator [+*/<>=-]
spatiu [' \t\n]
%%
"if" | "then" | "else
({litera})({litera}|{cifra})*
{cifre}|({semn})({cifre})
{operator}
\:\=
\:
(\()|(\))
{spatiu}
.
%%
int main( ){
yylex( );
return 0;
}
{printf("%s
{printf("%s
{printf("%s
{printf("%c
{printf("%s
{printf("%c
{printf("%c
{}
{printf("%c
Curs 9
Paii compilrii
Analiza lexical
Descriere lexical
Interpretare
Interpretare orientat dreapta
Descriere lexical bine format
Lex
Gramatici de tipul 2
Uniti
lexicale
Caractere
Cod
surs
Analizor
lexical
Arbore
sintactic
Analizor
sintactic
Analizor
semantic
Arbore
sintactic
decorat
Generator
de cod
Cod main
Asamblare
Cod
intermediar
Interpretare
litera a | b ||z
cifra 0 | 1 || 9
identificator litera (litera| cifra)*
semn + | numar (semn | ) cifra+
operator + | -| * | / | < | > | <= | >= | < >
asignare :=
doua_puncte :
cuvinte_rezervate if| then|else
paranteze ) | (
Gramatici LR(k)
Definiie
Proprieti
Gramatici LR(0)
Teorema de caracterizare LR(0)
Automatul LR(0)
a1
X1
...
ai
...
an
Tabela de
parsare
Control
X1
...
#
p1
p2
...
configuraie de acceptare.
Parsere de deplasare/reducere.
Teorema 1
Teorema 3
Teorema 4
Definiie
Definiie
AbAb
AaAa
AbAb
SAaAaabAba
SAaAaabAbaabaAaba
SAaAaabAbaabbAbba
SA
AbAb
Ac
SA
SAbAb
SAc
Lema
Fie G o gramatic i A1B2 un articol valid
pentru prefixul viabil . Atunci, oricare ar fi
producia B, articolul B este valid pentru .
Teorema
Fie G = (V, T, S, P) o gramatic independent de context. Mulimea
prefixelor viabile pentru gramatica G este limbaj regulat.
Demonstraie
G este G la care se adaug SS.
M = (Q, , , q0, Q), unde:
S S, S aSa |bSb | c
Cazul 1: || ||
=12, v=2u, 2T*. Din (1) avem A articol
valid pentru i din (2) avem A12 articol
valid pentru . Dac 2= atunci contrazic (1) iar
altfel contrazic (2).
Cazul 2: || > ||
t = t ; flag = true;
while( flag ) {
flag = false;
for (AB t ) {
for (B P )
if (Bt ) {
t = t{B};
flag = true;
}//endif
}//endforB
}//endforA
}//endwhile
return t;
S S, S aSa | bSb | c
S aAd | bAB, A cA | c, B d
Curs 10-11
Gramatici LR(k)
Definiie
Proprieti
Gramatici LR(0)
Teorema de caracterizare LR(0)
Automatul LR(0)
a1
X1
...
ai
...
an
Tabela de
parsare
Control
X1
...
#
p1
p2
...
S S, S aSa | bSb | c
Gramatici LR(1)
Gramatici LALR(1)
if(A == S)
else // reducere
} //endif
else exit(eroare);
}//endelse
}//endwhile
S S S E$ E E+T T (E) E T T a
S S S E$ E E+T T (E) E T T a
Stiva
Intrare
Aciune
0
05
03
02
027
0274
02745
02743
02748
027487
0274875
0274879
02748
02748'10'
0279
02
026
01
a+(a+a)$#
+(a+a)$#
+(a+a)$#
+(a+a)$#
(a+a)$#
a+a)$#
+a)$#
+a)$#
+a)$#
a)$#
)$#
)$#
)$#
$#
$#
$#
#
#
deplasare
reducere
reducere
deplasare
deplasare
deplasare
reducere
reducere
deplasare
deplasare
reducere
reducere
deplasare
reducere
reducere
deplasare
reducere
acceptare
Ieire
Ta
ET
Ta
ET
Ta
E E+T
T (E)
E E+T
S E$
Definiie
st
* uA, a
1.for(X )
2.if(X T)FIRST(X)={X} else FIRST(X)=;
3.for(Aa P)
4.FIRST(A)=FIRST(A){a};
5.FLAG=true;
6.while(FLAG){
7.FLAG=false;
8.for(A X1X2Xn P){
9.i=1;
10.if((FIRST(X1) FIRST(A)){
11.FIRST(A)=FIRST(A) (FIRST(X1);
13.}//endif
14.while(i<n&&Xi st * )
12.FLAG=true;
15.if((FIRST(Xi+1) FIRST(A)){
16.FIRST(A)=FIRST(A) FIRST(Xi+1);
17.FLAG=true;i++;
}//endif
}//endwhile
}//endfor
}//endwhile
for(A N)
if(A st * )FIRST(A)=FIRST(A) {};
Fie gramatica:
S E | B, E , B a | beginSC end,
C | ; SC
FIRST(S) = {a, begin, } FIRST(E) = {}
FIRST(B) = {a, begin} FIRST(C) = {;, }.
FIRST(SEC) = {a, begin, ;, },
FIRST(SB)= {a, begin},
FIRST(;SC)= {;}.
FOLLOW(S).
Dac A BX P i + , atunci FIRST(X) {} FOLLOW (B).
1. for(A )FOLLOW(A)=;
2.FOLLOW(S)={};
3.for(A X1X2Xn){
4.i=1;
5.while(i<n){
6.while(Xi N)++i;
7.if(i<n){
8.FOLLOW(Xi)= FOLLOW(Xi)
(FIRST(Xi+1Xi+2Xn)-{});
9.++i;
}//endif
}//endwhile
}//endfor
10.FLAG=true;
11.while(FLAG){
12.FLAG=false;
13.for(A X1X2Xn){
14.i=n;
15.while(i>0 && Xi N){
16.if(FOLLOW(A) FOLLOW(Xi)){
17.FOLLOW(Xi)=FOLLOW(Xi) FOLLOW(A);
18.FLAG=true;
19.}//endif
20.if(Xi + )--i;
21.else continue;
22.}//endwhile
23.}//endfor
24.}//endwhile
Fie gramatica:
S E | B, E , B a | begin SC end,
C | ; SC
FOLLOW(S)=FOLLOW(E)=FOLLOW(B) ={, ; , end}
FOLLOW(C) = {end}.
Definiie
Intrare:
Gramatica G = (N, T, S, P) augmentat cu S S;
Automatul M = (Q, , g, t0, Q );
Mulimile FOLLOW(A), AV
Ieire:
Tabela de analiz SLR(1) compus din dou pri:
ACIUNE(t, a), t Q, a T { # },
GOTO(t, A), t Q, A N.
for(t Q)
for (a T) ACTIUNE(t, a) = eroare;
for (A V) GOTO(t, A) = eroare;
for(t Q}{
for(A a t)
ACTIUNE(t,a)=D g(t, a);//deplasare in g(t, a)
for(B t ){// acceptare sau reducere
if(B == S) ACTIUNE(t, a) = acceptare;
else
for(a FOLLOW(B)) ACTIUNE(t,a)=R B;
}// endfor
for (A N) GOTO(t, A) = g(t, A);
}//endfor
Intrare:
Gramatica G = (N, T, S, P) care este SLR(1) ;
Tabela de parsare SLR(1) ( ACTIUNE, GOTO);
Cuvntul de intrare w T*.
Ieire:
Analiza sintactic (parsarea) ascendent a lui w
dac w L(G);
eroare, n caz contrar.
FOLLOW(S)={#}, FOLLOW(E)={#,+,)}
Stiva
Intrare
Actiune
Iesire
a*(a+a)#
deplasare
05
*(a+a)#
reducere
6.F a
03
*(a+a)#
reducere
4.T F
02
*(a+a)#
deplasare
027
(a+a)#
deplasare
0274
a+a)#
deplasare
02745
+a)#
reducere
6.F a
02743
+a)#
reducere
4.T F
02742
+a)#
reducere
2.E T
02748
+a)#
deplasare
Stiva
Intrare
Actiune
Iesire
027486
a)#
deplasare
0274865
)#
reducere
6.F a
0274863
)#
reducere
4.T F
0274869
)#
reducere
1.E E+T
02748
)#
deplasare
02748(11)
reducere
5.F (E)
027(10)
reducere
3.T T*F
02
reducere
2.E T
01
acceptare
Definiie
Fie G = (V, T, S, P) o gramatic redus. Un articol LR(1)
pentru gramatica G este o pereche (A , a), unde A
este un articol LR(0), iar a FOLLOW(A) (se pune # n loc de
).
Definiie
Articolul (A 12, a) este valid pentru prefixul viabil
1dac are loc derivarea
S dr*Au 12u
iar a = 1:u (a = # dac u = ).
Teorema
O gramatic G = (V, T, S, P) este gramatic LR(1) dac i
numai dac oricare ar fi prefixul viabil , nu exist dou
articole distincte, valide pentru , de forma(A , a), (B
, b) unde a FIRST( b).
flag= true;
while( flag) {
flag= false;
for ( (A B, a) I) {
for B P)
for( b FIRST(a)){
if( (B , b) I) {
I = I{(B , b)};
flag= true;
}//endif
}//endforb
}//endforB
}//endforA
}//endwhile
return I;
t0 = nchidere((S
for( (A X ,a) t )
t = t {(B X ,a) | (B B X,a) t};
if( t ){
t = nchidere( t );
if( tT) {
T= T { t };
marcat( t ) = false;
}//endif
g(t, X) = t;
} //endif
} //endfor
marcat( t ) = true;
} // endwhile
Teorema
L=R|R, L
*R|a, R
Curs 12
Definiie
Fie G = (V, T, S, P) o gramatic redus. Un articol LR(1)
pentru gramatica G este o pereche (A , a), unde A
este un articol LR(0), iar a FOLLOW(A) (# n loc de ).
Definiie
Articolul (A 1 2, a) este valid pentru prefixul viabil
1dac are loc derivarea
S dr*Au 12u
iar a = 1:u (a = # dac u = ).
Teorema
O gramatic G = (V, T, S, P) este gramatic LR(1) dac i
numai dac oricare ar fi prefixul viabil , nu exist dou
articole distincte, valide pentru , de forma(A , a), (B
, b) unde a FIRST(b).
flag= true;
while( flag) {
flag= false;
for ( (A B, a) I) {
for B P)
for( b FIRST(a)){
if( (B , b) I) {
I = I {(B , b)};
flag = true;
}//endif
}//endforb
}//endforB
}//endforA
}//endwhile
return I;
t0 = nchidere((S S,#));T={t0};marcat(t0)=false;
while( tT&& !marcat(t)){ // marcat(t) = false
for( X ) {
t = ;
for( (A X ,a) t )
t = t {(B X ,a) | (B B X,a) t};
if( t ){
t = nchidere( t );
if( tT) {
T= T { t };
marcat( t ) = false;
}//endif
g(t, X) = t;
} //endif
} //endfor
marcat( t ) = true;
} // endwhile
Teorema
S L=R|R, L *R|a, R L
for(t T)
for (a T) ACTIUNE(t,
for (A V) GOTO(t, A)
for(t T}{
for((A a, L) t)
ACTIUNE(t,a)=D g(t,
for((B , L) t ){//
a) = eroare;
= eroare;
a);//deplasare in g(t, a)
acceptare sau reducere
for(c L) {
if(B == S) ACTIUNE(t, a) = acceptare;
else ACTIUNE(t,c)=R B;//reducere cu B
}//endfor
}// endfor
for (A N) GOTO(t, A) = g(t, A);
}//endfor
Fie cuvintele
***a
a=**a
*a=**a
Analiza LR(1)?
Definiie
Fie t o stare n automatul LR(1) pentru G. Nucleul
acestei stri este mulimea articolelor LR(0) care
apar ca prime componente n articolele LR(1) din t.
Defininiie
Dou stri t1 i t2 ale automatului LR(1) pentru
gramatica G sunt echivalente dac au acelai
nucleu.
Definiie
Fie G gramatic LR(1) i M = (Q, , g, t0, Q) automatul
LR(1) corespunztor. Spunem c gramatica G este
LALR(1) ( Look Ahead LR(1)) dac oricare ar fi perechea
de stri echivalente t1, t2 din automatul LR(1), starea
t1t2 este liber de conflicte.
Curs 13
Gramatici LL(1)
Definiie
Caracterizare
FIRST, FOLLOW
Tabela de parsare
Algoritmul de analiz sintactic LL(1)
Stiv
Ieire
a+a*a#
E#
a+a*a#
E+T#
a+a*a#
T+T#
12
a+a*a#
F+T#
124
a+a*a#
a+T#
1246
a*a#
T#
1246
a*a#
T*F#
12463
a*a#
F*F#
124634
a*a#
a*F#
1246346
a#
F#
1246346
a#
a#
12463466
12463466
Lema 1
Lema 2
Definiie
k: reprezint primele k simboluri din (sau dac ||<k)
:k reprezint ultimele k simboluri din (sau dac ||<k)
Defininiie
O gramatic independent de context redus este
gramatic LL(k), k1, dac pentru orice dou
derivri de forma:
S*stuAstu1*stux
S*stuAstu2*stuy
unde u, x, yT*, pentru care k:x = k:y, are loc 1 = 1.
Teorema
Teorema
Teorema
Lema
Teorem
O gramatic G = (N, T, S, P) este gramatic LL(1)
dac i numai dac pentru orice AN i pentru
orice dou producii A1|2 are loc:
FIRST (1 FOLLOW (A))FIRST (2 FOLLOW (A)) =
1.for(AN)
2.for(aT{#})
3.M(A,a)=;
4.for(p=AP){
5.for(aFIRST()-{})
6.M(A,a)=M(A,a){(,p)};
7.if(FIRST()){
8.for(bFOLLOW(A)){
9.if(b== ) M(A,#)=M(A,#){(,p)};
10.else M(A,b)=M(A,b){(,p)};
}//endfor
}//endif
}//endfor
11.for(AN)
12.for(aT{#})
13.if(M(A,a)=) M(A,a)={eroare};
S aSa | bSb | c
M
(aSa, 1)
(bSb, 2)
(c, 3)
eroare
S aSa | bSb | a | b | c |
M
(aSa, 1)
(a, 3)
(, 6)
(bSb, 2)
(b, 4)
(, 6)
(c, 5)
(, 6)
1. S E, 2. S B, 3. E , 4. B a, 5. B
begin SC end, 6. C , 7. C ;SC
Intrare
Stiv
Aciune
Ieire
S#
expandare
B#
expandare
begin SC end#
potrivire
a;;a end#
SC end#
expandare
a;;a end#
BC end#
expandare
a;;a end#
aC end#
potrivire
;;a end#
C end#
expandare
;;a end#
;SC end#
potrivire
;a end#
SC end#
expandare
;a end#
EC end#
expandare
;a end#
C end#
expandare
;a end#
;SC end#
potrivire
a end#
SC end#
expandare
a end#
BC end#
expandare
a end#
aC end#
potrivire
end#
C end#
expandare
end#
end#
potrivire
acceptare
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
Fie gramatica
S if E then S | if E then S else S | a
Eb