Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end#...

23
Curs 9 1

Transcript of Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end#...

Page 1: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Curs 9

1

Page 2: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Analiza sintactică descendentă ◦ Parser (Analizor de sintaxă) descendent general

Gramatici LL(1) ◦ Definiţie

◦ Caracterizare

◦ FIRST, FOLLOW

◦ Tabela de parsare

◦ Algoritmul de analiză sintactică LL(1)

2

Page 3: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

O configuraţie (u#, γ#,π) este interpretată în felul următor: ◦ –γ# este conţinutul stivei cu simbolul # la

bază.

◦ –u# este conţinutul intrării.

◦ –π este conţinutul ieşirii.

3

Page 4: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Dacă C este mulţimea configuraţiilor atunci ⊢⊆CxC este relaţia de tranziţie definită astfel: ◦ (u#, Aγ#,π) ⊢ (u#, βγ#,πr), unde r = A→β∈P. (aplicare

regulă, expandare)

◦ (uv#, uγ#, π) ⊢ (v#, γ#,π). (potrivire)

◦ –( #, #, π) este configuraţie de acceptare dacă π≠ε.

◦ –O configuraţie c pentru care nu există c’ astfel ca c⊢c’ produce eroare.

◦ Configuraţii iniţiale: (w#, S#, ε) unde w∈T*

4

Page 5: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

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

Intrare Stivă Ieşire

a+a*a# E#

a+a*a# E+T# 1

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

5

Page 6: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Teorema (de corectitudine a analizorului) ◦ Fie 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 derivare exrem stângă a cuvântului w.

Lema 1 ◦ Dacă în analizorul sintactic descendent ataşat gramaticii

G=(N,T,S,P) are loc calculul (uv#,uγ#,ε)⊢+(v#,ψ#,π), atunci în gramatica G are loc derivarea γπ⇒stuψ, oricare ar fi u,v∈T*, γ, ψ∈Σ*, π∈P*.

Lema 2 ◦ Dacă în gramatica G are loc derivarea γπ⇒stuψ şi 1:ψ∈N∪{ε}

atunci în parserul descendent are loc calculul: (uv#,uγ#,ε)⊢+(v#,ψ#,π), ∀v∈T*.

Demonstraţii: inducţie după lungimea lui π

6

Page 7: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Parserul este nedeterminist

Există tipuri de gramatici pentru care este determinist?

Construirea unei tabele de parsare

7

Page 8: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

LL(k): Parsing from Left to right using Leftmost derivation and k symbols lookahead.

Informal, o gramatică este LL(k) dacă tranziţia de tip “aplicare producţie” din parser se face cu o unică regulă A→β determinată prin următoarele k simboluri de la intrare.

Definiţie

◦ k:α reprezintă primele k simboluri din α (sau α dacă |α|<k)

◦ α:k reprezintă ultimele k simboluri din α (sau α dacă |α|<k)

8

Page 9: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Defininiţie ◦ O gramatică independentă de context redusă este

gramatică LL(k), k≥1, dacă pentru orice două derivări de forma:

S⇒*stuAγ⇒stuβ1γ⇒*stux

S⇒*stuAγ⇒stuβ2γ⇒*stuy

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

9

Page 10: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Teorema ◦ Orice gramatică LL(k) este neambiguă.

Teorema ◦ Dacă G este o gramatică stâng recursivă, atunci nu

există nici un număr k astfel încât G să fie LL(k).

Teorema ◦ Clasele de limbaje LL(k)formează o ierarhie infinită: ℒℒ(0)⊂ℒℒ(1)⊂ℒℒ(2)⊂…⊂ℒℒ(k)⊂ℒℒ(k+1)⊂…

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

valoare k∈N.

10

Page 11: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Teoremă ◦ O gramatică G = (N, T, S, P) este gramatică LL(1)

dacă şi numai dacă pentru orice A∈N şi pentru orice două producţii A→β1|β2 are loc:

◦ FIRST (β1 FOLLOW (A))∩FIRST (β2 FOLLOW (A)) = ∅

11

Page 12: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

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};

12

Page 13: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

S → aSa | bSb | c

S → aSa | bSb | a | b | c | ε

M a b c #

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

M a b c #

S (aSa, 1) (a, 3) (ε, 6)

(bSb, 2) (b, 4) (ε, 6)

(c, 5)

(ε, 6)

13

Page 14: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Configuraţia iniţială: (w#, S#, ε)

Tranziţii

◦ (u#, Aγ#,π) ⊢ (u#, βγ#,πr), dacă M(A, 1:u#)=(β, r), (expandare)

◦ (uv#, uγ#,π) ⊢ (v#, γ#,π) (potrivire)

◦ (#, #,π) ⊢ acceptare, dacă π ≠ ε (acceptare)

◦ (au#, bγ#,π) ⊢ eroare dacă a ≠ b

◦ (u#, Aγ#,π) ⊢ eroare dacă M(A, 1:u#)=eroare

14

Page 15: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

1. S → E, 2. S → B, 3. E → ε, 4. B → a, 5. B →

begin SC end, 6. C → ε , 7. C → ;SC

15

Page 16: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Intrare Stivă Acţiune Ieşire

begin a;;a end# S# expandare 2

begin a;;a end# B# expandare 5

begin a;;a end# begin SC end# potrivire

a;;a end# SC end# expandare 2

a;;a end# BC end# expandare 4

a;;a end# aC end# potrivire

;;a end# C end# expandare 7

;;a end# ;SC end# potrivire

;a end# SC end# expandare 1

;a end# EC end# expandare 3

;a end# C end# expandare 7

;a end# ;SC end# potrivire

a end# SC end# expandare 2

a end# BC end# expandare 4

a end# aC end# potrivire

end# C end# expandare 6

end# end# potrivire

# # acceptare 16

Page 17: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Fie G = (N, T, S, P) o gramatică în formă redusă

Fie A∈N imediat recursiv

Fie A→Aα1|Aα2|… Aαk|β1|β1|… toate regulile care încep cu A. Fie PA mulţimea acestor reguli.

Gramatica G’ unde A nu este recursiv imediat

◦ G’=(N∪{A’}, T, S, P’)

◦ P’=P-PA ∪ {A’→α1A’|α2A’|…αkA’|, A→β1A’|β2A’|…}

17

Page 18: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

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

18

Page 19: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

19

Page 20: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Factorizarea este o transformare aplicată asupra unei gramatici pentru a obţine o gramatică echivalentă, eventual LL(1)

Dacă există producţiile

◦ A→αβ1, A→αβ2 cu |α| > 1

(deci gramatica nu este LL(1)), acestea se înlocuiesc cu A→αA’, A’ un nou neterminal, şi producţiile A’→β1 şi A’→β2. Metoda de transformare se numeşte factorizare la stânga

20

Page 21: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Fie gramatica ◦ S → if E then S | if E then S else S | a

◦ E → b

factorizarea la stânga: α = if E then S

Gramatica echivalentă va fi ◦ S → if E then S S’ | a

◦ S’ → else S | ε

◦ E → b

21

Page 22: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Prin factorizare nu este sigur că obţinem o gramatică LL(1).

Putem rezolva ambiguitatea alegând regula S’→else S în M(S’, else). Această alegere ar corespunde asocierii lui else pentru acel if precedent cel mai apropiat de el, soluţie adoptată de majoritatea limbajelor de programare.

22

Page 23: Curs 9 - profs.info.uaic.rootto/LFAC2017-18/LFAC10.pdf · Curs 9 1 Analiza ... a end# SC end# expandare 2 a end# BC end# expandare 4 a end# aC end# potrivire end# C end# expandare

Este dovedită pe baza

◦ Teoremei de corectitudine a parserului descendent

general,

◦ Teoremei de caracterizare a gramaticilor LL(1)

◦ Modului în care a fost construită tabela de parsare

23