Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G =...

52
Curs 8 1 Limbaje formale, automate şi compilatoare

Transcript of Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G =...

Page 1: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Curs 8

1

Limbaje formale, automate şi

compilatoare

Page 2: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Recapitulare

2

Paşii compilării

Analiza lexicală

Descriere lexicală

Interpretare

Interpretare orientată dreapta

Descriere lexicală bine formată

Page 3: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Cuprins

3

Analiza sintactică ascendentă

Parser ascendent general

Analiză LR

LR(0)

SLR(1)

FIRST

FOLLOW

Page 4: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Compilare

4

Cod sursă

Analizor lexical

Analizor sintactic

Analizor semantic

Caractere Unități lexicale

Arbore sintactic

Generator de cod

Arbore sintactic decorat

Asamblare Interpretare

Cod maşină Cod intermediar

Page 5: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Parser ascendent general

5

Control Tabela de parsare

a1 ... ai ... an #

X1

X1

...

#

p1 p2 ...

Page 6: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Configuraţii

6

O configuraţie ( #γ, u#, π) este interpretată

în felul următor:

–#γ este conţinutul stivei, cu simbolul # la baza.

–u# este conţinutul intrării.

–π este conţinutul ieşirii.

C0= {(#, w#, ε)|w ∈ T*} mulţimea

configuraţiilor iniţiale.

Page 7: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Tranziţii

7

Parserul ascendent ataşat gramaticii G este perechea (C0, ⊢) unde C0 este mulţimea configuraţiilor iniţiale, iar ⊢ este o relaţie de tranziţie definită astfel:

(# γ, au#, π) ⊢(# γa, u#, π) (deplasare) pentru orice γ ∈ Σ*, a ∈ T, u ∈ T*, π ∈ P*.

(#αβ, u#, π) ⊢(#αA, u#, πr) dacă r = A→β (reducere).

Configuraţia (#S, #, π) unde π ≠ ε, se numeşte configuraţie de acceptare.

Orice configuraţie, diferită de cea de acceptare, care nu este în relaţia ⊢ cu nici o altă configuraţie este o configuraţie eroare.

Parsere de deplasare/reducere.

Page 8: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

8

Fie gramatica S → aSb| ε. Tranziţiile sunt:

(#γ, u#, π) ⊢(#γS, u#, π2)

(#γaSb, u#, π) ⊢(#γS, u#, π1)

(#γ, au#, π) ⊢(#γa, u#, π)

(#γ, bu#, π) ⊢(#γb, u#, π)

O succesiune de tranziţii se numeşte calcul

(#, #, ε) ⊢(#S, #, 2)

(#, aabb#, ε) ⊢ (#a, abb#, ε) ⊢ (#aa, bb#, ε) ⊢ (#aaS, bb#, 2) ⊢

(#aaSb, b#, 2) ⊢ (#aS, b#, 21) ⊢ (#aSb, #, 21) ⊢ (#S, #, 211)

Page 9: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Conflicte

9

Parserul este nedeterminist:

Pentru o configuraţie de tipul (#αβ, au#, π), S→β, există

două posibilităţi (conflict deplasare/reducere):

(#αβ, au#, π) ⊢ (#αS, au#, πr) (reducere cu S→β)

(#αβ, au#, π) ⊢ (# αβa, u#, π) (deplasare)

Pentru o configuraţie (#γ, u#, π) cu γ=α1β1=α2β2 şi

A→β1, B→β2, reguli (conflict reducere/reducere)

(#α1β1, u#, π) ⊢ (# α1A, au#, πr1)

(#α2β2, u#, π) ⊢ (# α2B, au#, πr2)

Page 10: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Corectitudine

10

Spunem că un cuvânt wεT* este acceptat de un parser

ascendent dacă există măcar un calcul de forma

(#, w#, ε) ⊢+(#S, #, π)

Pentru ca parserul descris să fie corect, trebuie ca el să

accepte toate cuvintele din L(G) şi numai pe acestea.

Teorema

Parserul ascendent general ataşat unei gramatici G este corect: pentru orice w ∈ T*, w ∈ L(G) dacă şi numai dacă

în parser are loc calculul (#, w#, ε) ⊢+(#S, #, π).

Page 11: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Analiza sintactică LR

11

Gramatici LR(k):Left to right scanning of the input,

constructing a Rightmost derivation in reverse, using k

symbols lookahead

Definiţie

O gramatică G se numeşte gramatică LR(k), k≥0, dacă

pentru orice două derivări de forma:

S’⇒ S dr⇒* αAu dr⇒ αβu = δu

S’⇒ S dr⇒* α’A’u’ dr⇒ α’β’u’ = αβv = δv

pentru care k:u = k:v, are loc α=α’, β=β’, A=A’

Page 12: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Analiza sintactică LR

12

Teorema 1

Dacă G este gramatică LR(k), k≥0, atunci G este neambiguă.

Un limbaj L este (în clasa) ℒℛ(k) dacă există o gramatică

LR(k) care îl generează

Teorema 2

Orice limbaj ℒℛ(k) este limbaj de tip 2 determinist.

Teorema 3

Orice limbaj de tip 2 determinist este limbaj LR(1).

Teorema 4

Pentru orice limbaj ℒℛ(k), k≥1, există o gramatică LR(1) care

generează acest limbaj, adică LR(0) ⊂ LR(1) = LR(k), k≥1.

Page 13: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Gramatici LR(0)

13

Definiţie

Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul ∙ nu este în Σ. Un articol pentru gramatica G este o producţie A→γ în care s-a adăugat simbolul ∙ într-o anume poziţie din γ. Notăm un articol prin A→α∙β dacă γ = αβ. Un articol în care ∙ este pe ultima poziţie se numeşte articol complet.

Definiţie

Un prefix viabil pentru gramatica G este orice prefix al unui cuvânt αβ dacă S dr⇒* αAu dr⇒ αβu . Dacă β= β1β2şi φ= αβ1spunem că articolul A → β1∙β2 este valid pentru prefixul viabil φ.

Page 14: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

14

Exemplu S → A, A → aAa | bAb | c | ε.

Articole: S→∙A, S→A∙, A→∙aAa, A→a∙Aa, A→aA∙a,

A→aAa∙, A→∙bAb, A→b∙Ab, A→bA∙b, A→bAb∙,

A→∙c, A→c∙, A→ ∙.

Articole valide pentru prefixe viabile:

Prefixul viabil Articole valide Derivarea corespunzătoare

ab A→b∙Ab

A→∙aAa

A→∙bAb

S⇒A⇒aAa⇒abAba

S⇒A⇒aAa⇒abAba⇒abaAaba

S⇒A⇒aAa⇒abAba⇒abbAbba

ε S→∙A

A→∙bAb

A→∙c

S⇒A

S⇒A⇒bAb

S⇒A⇒c

Page 15: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Gramatici LR(0)

15

Lema

Fie G o gramatică şi A→β1∙Bβ2 un articol valid pentru

prefixul viabil γ. Atunci, oricare ar fi producţia B→β,

articolul B→∙β este valid pentru γ.

Teorema (caracterizare LR(0))

Gramatica G este gramatică LR(0) dacă şi numai dacă,

oricare ar fi prefixul viabil γ, sunt îndeplinite condiţiile:

1.nu există două articole complete valide pentru γ.

2.dacă articolul A→β∙ este valid pentru γ, nu există nici un articol B→β1∙aβ2, a ∈ T, valid pentru γ.

Page 16: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Gramatici LR(0)

16

Teorema

Fie G = (V, T, S, P) o gramatică independentă de context. Mulţimea

prefixelor viabile pentru gramatica G este limbaj regulat.

Demonstraţie

G’ este G la care se adaugă S’→S.

M = (Q, Σ, δ, q0, Q), unde:

Q este mulţimea articolelor gramaticii G’,

Σ = V∪T, q0= S’→∙S

δ:Qx(Σ ∪ {ε})→2Q definită astfel:

δ(A →α∙Bβ, ε) = {B →∙ γ | B → γ ∈ P}.

δ(A →α∙Xβ, X) = { A →αX∙β}, X ∈ Σ.

δ(A →α∙aβ, ε) = ∅, ∀a ∈ T.

δ(A →α∙Xβ, Y) = ∅, ∀ X,Y ∈ Σ cu X ≠Y.

Se arată că are loc:

(A →α∙β ∈ δ (q0, γ ) ⇔ γ este prefix viabil şi A →α∙β este valid pentru γ.

Page 17: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

17

S’ → S, S → aSa |bSb | c

Page 18: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Automatul LR(0)

18

Algoritmul 1(procedura închidere(t))

Intrare:

Gramatica G = (V , T, S, P);

Mulţimea t de articole din gramatica G;

Ieşire: t’=închidere( t)={q∈Q|∃p∈t, q∈δ(p,ε)} = δ(t,ε)

Page 19: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Automatul LR(0)

19

t’ = t ; flag = true;

while( flag ) {

flag = false;

for (A→α∙Bβ ∈ t’ ) {

for (B→γ ∈ P )

if (B→∙γ∉t’ ) {

t’ = t’∪{B→∙γ};

flag = true;

}//endif

}//endforB

}//endforA

}//endwhile

return t’;

Page 20: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Automatul LR(0)

20

Algoritmul 2 Automatul LR(0)

Intrare: Gramatica G = (N, T, S, P) la care s-a adăugat

S’ → S;

Ieşire: Automatul determinist M = (T, Σ, g, t0, T)

echivalent cu M.

Page 21: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

21

t0=închidere(S’ →∙ S); T={t0}; marcat(t0)=false;

while(∃ t ∈ T && !marcat(t)) { // marcat(t) = false

for( X ∈ Σ) {// Σ = N ∪T

t’ = ∅;

for(A→α∙Xβ ∈ t)

t’ = t’ ∪ {B→αX∙β | A→α∙Xβ ∈t};

if( t’≠∅){

o t’ = închidere( t’ );

o if( t’∉T ) {

• T = T∪{ t’ };

• marcat( t’ ) = false;

o }//endif

g(t, X) = t’;

}//endif

}//endfor

}//endfor

marcat( t ) = true;

}// endwhile

Page 22: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Automatul LR(0) - Exemplu

22

S’ → S, S → aSa | bSb | c

Page 23: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Test LR(0)

23

Definiţie Fie G o gramatică şi M automatul LR(0) ataşat lui G. Spunem că o stare a lui M are un conflict reducere/reducere

dacă ea conţine două articole complete distincte A→α∙, B→β∙.

Spunem că o stare a lui M are un conflict deplasare/reducere dacă ea conţine un articol complet A→α∙ şi un articol cu terminal după punct de forma B→β∙aγ.

Spunem că o stare este consistentă dacă ea nu conţine conflicte şi este inconsistentă în caz contrar.

Teorema Fie G o gramatică şi M automatul său LR(0). Gramatica G este LR(0) dacă şi numai dacă automatul M nu conţine stări inconsistente

Page 24: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

24

S → aAd | bAB, A → cA | c, B → d

Page 25: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Algoritmul de analiză LR(0)

25

Tabela de parsare coincide cu automatul LR(0), M.

Configuraţie: (σ, u#, π) unde σ ∈ t0T*, u ∈ T*, π ∈ P*.

Configuraţia iniţială este (t0, w#, ε),

Tranziţiile:

Deplasare: (σt, au#, π) ⊢(σtt’, u#, π) dacă g(t, a) = t’.

Reducere: (σtσ’t’, u#, π) ⊢( σtt’’, u#, πr) dacă A → β∙∈t’, r = A → β, | σ’t’ | = | β | şi t’’= g (t, A).

Acceptare: (t0t1, #, π) este configuraţia de acceptare dacă S’ → S∙ ∈ t1, π este parsarea acestuia.

Eroare: o configuraţie căreia nu i se poate aplica nici o tranziţie

Page 26: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Algoritmul de analiză LR(0)

26

char ps[]= “w#”; //ps este sirul de intrare w

i = 0; // pozitia in sirul de intrare

STIVA.push(t0); // se initializeaza stiva cu t0

while(true) { // se repeta pana la succes sau eroare

t = STIVA.top();

a = ps[i] // a este simbolul curent din intrare

if( g(t, a)≠∅ { //deplasare

STIVA.push(g(t, a));

i++; //se inainteaza in intrare

}

else {

if(A → X1X2…Xm ∙ ∈ t){

if(A == „S”)

if(a == „#”)exit( “acceptare”);

else exit(“eroare”);

else // reducere

for( i = 1; i <= m; i++) STIVA.pop();

o STIVA.push(g(top(STIVA), A));

} //endif

else exit(“eroare”);

}//endelse

}//endwhile

Page 27: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

27

S’ → S S → E$ E → E+T T →(E) E → T T → a

Page 28: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

28

S’ → S S → E$ E → E+T T →(E) E → T T → a Stiva Intrare Acţiune Ieşire

0 a+(a+a)$# deplasare

05 +(a+a)$# reducere T → a

03 +(a+a)$# reducere E → T

02 +(a+a)$# deplasare

027 (a+a)$# deplasare

0274 a+a)$# deplasare

02745 +a)$# reducere T → a

02743 +a)$# reducere E → T

02748 +a)$# deplasare

027487 a)$# deplasare

0274875 )$# reducere T → a

0274879 )$# reducere E → E+T

02748 )$# deplasare

02748'10' $# reducere T → (E)

0279 $# reducere E → E+T

02 $# deplasare

026 # reducere S → E$

01 # acceptare

Page 29: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Corectitudinea parserului LR(0)

29

Lema 1, 2 Fie G = (N, T, S, P) o gramatică LR(0), t0σ,

t0τ drumuri în automatul LR(0) etichetate cu φ respectiv γ şi u, v T*. Atunci, dacă în parserul LR(0)

are loc (t0σ, uv#, ε) ⊢+(t0τ, v#, π), atunci în G are loc

derivarea φ dr⇒πu şi reciproc.

Page 30: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Corectitudinea parserului LR(0)

30

Teoremă Dacă G este gramatică LR(0) atunci, oricare

ar fi cuvântul de intrare w ∈ T*, parserul LR(0)

ajunge la configuraţia de acceptare pentru w, adică

(t0σ, uv#, ε) ⊢+(t0τ, v#, π) dacă şi numai dacă φ dr⇒πu

Page 31: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Mulţimile FIRST şi FOLLOW

31

FIRST(α) = {a|a ∈ T, α st⇒* au } ∪

if (α st ⇒* ε) then {ε} else ∅.

FOLLOW(A) = {a|a ∈ T ∪ {ε}, S st ⇒* uAγ,

a ∈ FIRST (γ) }

Page 32: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Determinare FIRST

32

1.for(X ∈ Σ)

2.if(X ∈ T)FIRST(X)={X} else FIRST(X)=∅;

3.for(A→aβ ∈ P)

4.FIRST(A)=FIRST(A)∪{a};

5.FLAG=true;

6.while(FLAG){

7.FLAG=false;

8.for(A → X1X2…Xn ∈ P){

9.i=1;

10.if((FIRST(X1) ⊈ FIRST(A)){

11.FIRST(A)=FIRST(A) ∪(FIRST(X1)-{ε});

12.FLAG=true;

13.}//endif

14.while(i<n && Xi st ⇒* ε)

15.if((FIRST(Xi+1) ⊈ FIRST(A)){

o 16.FIRST(A)=FIRST(A)∪ FIRST(Xi+1);

o 17.FLAG=true;i++;

}//endif

}//endwhile

}//endfor

}//endwhile

for(A ε N)

if(A st ⇒* ε)FIRST(A)=FIRST(A) ∪{ε};

Page 33: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Determinare FIRST

33

Intrare: Gramatica G=(N,T,S,P).

Mulţimile FIRST(X),X ∈ Σ.

α =X1X2…Xn, Xi ε Σ,1≤i≤n.

Ieşire: FIRST(α).

1.FIRST(α)=FIRST(X1)-{ε};i=1;

2.while(i<n && Xi ⇒+ ε){

3.FIRST(α)=FIRST(α)∪(FIRST(Xi+1)-{ε});

4.i=i+1;

}//endwhile

5.if(i==n && Xn ⇒+ ε)

6.FIRST(α)=FIRST(α) ∪ {ε};

Page 34: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

34

Fie gramatica:

S → E | B, E → ε, B → a | begin SC 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)= {;}.

Page 35: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Determinarea FOLLOW

35

ε ∈ FOLLOW(S).

Dacă A → αBβXγ ∈ P şi β ⇒+ ε, atunci FIRST(X) -{ε} ⊆ FOLLOW (B).

S ⇒* α1A β1 ⇒ α1αBβXγβ1 ⇒* α1αBXγβ1 şi atunci rezultă FIRST(X)-{ε} ⊆ FOLLOW (B).

Dacă A → αBβ ∈ P atunci FIRST(β)-{ε} ⊆ FOLLOW (B).

Dacă A → αBβ ∈ P şi β ⇒+ ε, atunci FOLLOW(A) ⊆ FOLLOW(B).

Page 36: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Determinarea FOLLOW

36

1. for(A ∈ Σ)FOLLOW(A)=∅;

2.FOLLOW(S)={ε};

3.for(A → X1X2…Xn){

4.i=1;

5.while(i<n){

6.while(Xi ∉ N)++i;

7.if(i<n){

8.FOLLOW(Xi)= FOLLOW(Xi)∪ (FIRST(Xi+1Xi+2…Xn)-{ε});

9.++i;

}//endif

}//endwhile

}//endfor

Page 37: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Determinarea FOLLOW

37

10.FLAG=true;

11.while(FLAG){

12.FLAG=false;

13.for(A → X1X2…Xn){

14.i=n;

15.while(i>0 && Xi ∈ N){

16.if(FOLLOW(A) ⊄ FOLLOW(Xi)){

o 17.FOLLOW(Xi)=FOLLOW(Xi) ∪ FOLLOW(A);

o 18.FLAG=true;

19.}//endif

20.if(Xi ⇒+ ε)--i;

21.else continue;

22.}//endwhile

23.}//endfor

24.}//endwhile

Page 38: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

38

Fie gramatica:

S → E | B, E → ε, B → a | begin SC end, C → ε |

; SC

FOLLOW(S)=FOLLOW(E)=FOLLOW(B) ={ε, ; , end}

FOLLOW(C) = {end}.

Page 39: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Gramatici SLR(1)

39

Definiţie

Fie G o gramatică pentru care automatul LR(0) conţine

stări inconsistente (deci G nu este LR(0)). Gramatica G

este gramatică SLR(1)dacă oricare ar fi starea t a automatului LR(0) sunt îndeplinite condiţiile:

–Dacă A→α∙, B → β∙ ∈ t,

atunci FOLLOW(A)∩FOLLOW(B) = ∅;

–Dacă A→α∙, B → β∙aγ ∈ t atunci a ∉ FOLLOW(A).

Page 40: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Gramatici SLR(1)

40

Definiţie Fie G o gramatică pentru care automatul LR(0) conţine stări

inconsistente (deci G nu este LR(0)). Gramatica G este gramatică SLR(1)dacă oricare ar fi starea t a automatului LR(0) sunt îndeplinite condiţiile:

–Dacă A→α∙, B → β ∙ ∈ t atunci FOLLOW(A) ∩FOLLOW(B) = ∅;

–Dacă A→α∙, B → β ∙aγ ∈ t atunci a ∉ FOLLOW(A).

Analiza sintactică SLR(1) este similară cu cea LR(0); tabela de analiză sintactică are două componente: –Prima, numită ACŢIUNE, determină dacă parserul va face

deplasare respectiv reducere, în funcţie de starea ce se află în topul stivei şi de simbolul următor din intrare

–Cea de a doua, numită GOTO, determină starea ce se va adăuga în stivă în urma unei reduceri.

Page 41: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Construcţia tabelei de parsare SLR(1)

41

Intrare:

Gramatica G = (N, T, S, P) augmentată cu S’ → S;

Automatul M = (Q, Σ, g, t0, Q );

Mulţimile FOLLOW(A), A∈V

Ieşire:

Tabela de analiză SLR(1) compusă din două părţi:

ACŢIUNE(t, a), t ∈ Q, a ∈ T ∪ { # },

GOTO(t, A), t ∈ Q, A ∈ N.

Page 42: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Construcţia tabelei de parsare SLR(1)

42

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, #) = “acceptare”;

else

for(a ∈ FOLLOW(B)) ACTIUNE(t,a)=“R B→γ”;

}// endfor

for (A ∈ N) GOTO(t, A) = g(t, A);

}//endfor

Page 43: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Parsarea SLR(1)

43

Deplasare: (σt, au#, π)⊢(σtt’, u#, π) dacă ACTIUNE(t, a)=Dt’;

Reducere: (σtσ’t’, u#, π)⊢( σtt’’, u#, πr) ACTIUNE(t, a) = Rp unde p=

A → β, |σ’t’| = |β| şi t’’= GOTO(t, A);

Acceptare: (t0t, #, π) dacă ACTIUNE(t,a) = “acceptare”; Analizorul

se opreşte cu acceptarea cuvântului de analizat iar π este parsarea

acestuia (şirul de reguli care s-a aplicat, în ordine inversă, în derivarea extrem dreaptă a lui w).

Eroare: (σ t, au#, π) ⊢ eroare dacă ACTIUNE(t,a) = “eroare”;

Analizorul se opreşte cu respingerea cuvântului de analizat.

Page 44: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Parsarea SLR(1)

44

Intrare:

Gramatica G = (N, T, S, P) care este SLR(1) ;

Tabela de parsare SLR(1) ( ACTIUNE, GOTO);

Cuvântul de intrare w ∈ T*.

Ieşire:

Analiza sintactică (parsarea) ascendentă a lui w dacă w ∈

L(G);

eroare, în caz contrar.

Se foloseşte stiva St pentru a implementa tranziţiile deplasare/reducere

Page 45: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Parsarea SLR(1)

45

char ps[] = “w#”; //ps este cuvantul de intrare w

int i = 0; // pozitia curenta in cuvantul de intrare

St.push(t0); // se initializeaza stiva cu t0

while(true) { // se repeta pana la succes sau eroare

t = St.top();

a = ps[i] // a este simbolul curent din intrare

if(ACTIUNE(t,a) == “acceptare”) exit(“acceptare”);

if(ACTIUNE(t,a) == “Dt‟”){

St.push(t‟);

i++; // se inainteaza in w

}//endif

else {

if(ACTIUNE(t,a) == “R A → X1X2…Xm”){

for( i = 1; i ≤m; i++) St.pop();

St.push(GOTO(St.top, A));

} //endif

else exit(“eroare”);

}//endelse

}//endwhile

Page 46: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Exemplu

46

0.S → E, 1.E → E+T, 2.E → T, 3.T → T*F, 4.T → F, 5.F →(E), 6.F → a

Page 47: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Tabela de tranziţie a automatului LR(0)

47

Page 48: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Tabela de analiză SLR(1)

48

Page 49: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Test SLR(1)

49

G nu este LR(0) stările 1, 2, 9 conţin conflict de

deplasare/reducere

FOLLOW(S)={#}, FOLLOW(E)={#,+,)}

Gramatica este SLR(1) pentru că:

în starea 1: + ∉ FOLLOW(S);

în starea 2: * ∉ FOLLOW(E);

în starea 9: * ∉ FOLLOW(E).

Page 50: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Stiva Intrare Actiune Iesire

0 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

50

Page 51: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

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

51

Page 52: Limbaje formale, automate şiotto/LFAC2019-20/LFAC08.pdf · Gramatici LR(0) 13 Definiţie Fie G = (V, T, S, P) o gramatică independentă de context redusă. Să presupunem că simbolul

Bibliografie

52

A. V. Aho, M. S. Lam, R. Sethi, and J. D. Ullman,

Compilers: Principles, Techniques, and Tools, Second

Edition. Addison-Wesley, 2007

G. Grigoraş, Construcția compilatoarelor. Algoritmi

fundamentali, Editura Universității “Alexandru Ioan

Cuza”, Iaşi, 2005