5_analiza sintactica descendenta
DESCRIPTION
Compilatore curs.TRANSCRIPT
![Page 1: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/1.jpg)
Limbaje formale şi translatoare (Compilatoare)
1
![Page 2: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/2.jpg)
1. Analiza sintactică predictivă
2. Analiza sintactică descendentă cu reveniri
3. Analiza sintactică prin coborâre recursivă
4. Maşina abstractă de analiză predictivă
5. Analiza sintactică LL(1)
6. Maşina abstractă de analiză LL(1)
2
![Page 3: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/3.jpg)
Analiza sintactică predictivă poate fi modelată prin intermediul unui automat finit cu stivă care lucrează asupra unui şir de intrare.
AF
Si
St
isi
ist
LIFO
Si – şirul de intrare (conţine atomii lexicali obţinuţi în urma etapei de analiză lexicală) isi – indice pentru Si St – stiva (acces LIFO) ist – vârful stivei
3
![Page 4: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/4.jpg)
Analiza sintactică predictivă pleacă de la notiunea de
derivare stânga:
S => w1 => … => wn,
unde wi = xiAI, wi+1 = xiiI,
cu proprietatea A -> i P,
iar xi * şi I (VN)*
4
![Page 5: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/5.jpg)
Algoritmul analizei sintactice predictive pentru un limbaj definit printr-o gramatică generatoare este:
1. Analiza sintactică porneşte de la simbolul de start S, care este introdus în stivă.
2. Se face expandarea vârfului stivei, alegând convenabil o regulă de producţie.
3. Dacă în vârful stivei apare un terminal, acesta este comparat cu simbolul curent din şirul de intrare. Dacă cele două simboluri sunt egale, atunci vârful stivei este scos şi se avansează în şirul de intrare. Altfel, se semnalează eroare.
4. La sfârşit, dacă stiva este goală şi s-a ajuns la sfârşitul şirului de intrare, atunci acesta este corect. Altfel nu este corect.
5
![Page 6: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/6.jpg)
Procedura de analiza este
sf = false
repeta
daca (st(ist))(st(ist)=si(isi))
atunci ist <- ist - 1
isi <- isi + 1
ori st(ist) VN
atunci expandez varful stivei cu o productie
având în vedere şi simbolul curent
din şirul de intrare
ori (st(ist)=ε) (si(isi)= ε)
atunci succes
sf <- true
altfel eroare
sf <- true
pana sf sf
6
![Page 7: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/7.jpg)
Ex:
Fie gramatica generatoare pentru care mulţimea regulilor de producţie este:
Şi fie propoziţia:
Funcţionarea automatului de analiză sintactică predictivă va fi:
7
![Page 8: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/8.jpg)
8
![Page 9: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/9.jpg)
Modelul matematic este automatul finit cu stiva
AP = <Q, , , f, q0, z0, F> unde
Q - multimea de stari,
- alfabetul automatului,
- alfabetul stivei,
z0 - simbolul initial al stivei,
q0 - stare initiala,
F - multimea de stari finale,
f - functia de tranzitie
f : Q x ( Σ U{ ε }) x --> P (Q x *)
- unde P este o multime de perechi
9
![Page 10: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/10.jpg)
Starea automatului
(q, x, ), qQ, x *, *
Tranziţie
(q1, ax, z) ├ (q2, x, ) <=> (q2, ) f(q1, a, z)
Un sir w * este acceptat de către automat
• după criteriul stării vide (q0, w, z0) ├ (q, ε, ε)
• criteriul starii finale (q0, w, z0) ├ (q, ε, ), q F
10
![Page 11: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/11.jpg)
Fie gramatica :
E -> E + T | T
T -> T * F | F
F -> i | (E)
Neterminale : VN = {E, T, F}
Terminale : = {+, *, (, ), i}
11
![Page 12: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/12.jpg)
Automatul de analiză sintactică predictivă:
Q = {q}
= {+, *, (, ), i}
= {E, T, F, +, *, (, ), i}
z0 = E
q0 = q
F =
AP = < {q}, {+, *, (, ), i}, {E, T, F, +, *, (, ), i} , f , q , E , >
f(q, a, a) = (q, ε) ,
f(q, ε, A) = (q, ) , oricare A-> P
f(q, ε, E) = {(q, E+T), (q, T)}
f(q, ε, T) = {(q, T*F), (q, F)}
f(q, ε, F) = {(q,i), q, (E)}
12
![Page 13: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/13.jpg)
Pentru analiza propozitiei i*i+i evolutia automatului este :
(q, i*i+i , E) ├ (q, i*i+i , E+T) ├ (q, i , T)
├ (q, i*i+i , T+T) ├ (q, i , F)
├ (q, i*i+i , T*F+T) ├ (q, i , i)
├ (q, i*i+i , F*F+T) ├ (q, ε, ε)
├ (q, i*i+i , i*F+T)
├ (q, *i+i , *F+T)
├ (q, i+i , F+T)
├ (q, i+i , i+T)
├ (q, +i , +T)
13
![Page 14: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/14.jpg)
Pentru a putea utiliza analiza sintactică predictivă, gramatica generatoare a limbajului ţintă trebuie să îndeplinească condiţiile:
1. Nu se foloseşte recursivitate stânga în regulile de producţie: nu există niciun neterminal A astfel încât A=+>Aα.
Îndeplinirea acestei condiţii asigură faptul că stiva nu se va extinde la infinit, având în vedere că se foloseşte derivarea stânga pentru înlocuirea neterminalelor.
2. Pentru orice neterminal, părţile drepte ale producţiilor sale încep diferit: Nu există două producţii A->αβ şi A->αγ, cu αdiferit de ε.
Această condiţie asigură identificarea uşoară a regulii de producţie care trebuie folosită pentru a expanda un neterminal din vârful stivei, pe baza simbolului curent din şirul de intrare.
14
![Page 15: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/15.jpg)
Eliminarea recursivităţii stânga:
Dacă există reguli de producţie care folosesc recursivitatea stânga, de exemplu:
A->Aα, A->β
Atunci introducem un nou neterminal A’ şi înlocuim regulile în cauză cu:
A->βA’, A’->αA’, A’->ε
Ex:
15
![Page 16: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/16.jpg)
Dacă nu este îndeplinită a doua condiţie, şi gramatica conţine, de exemplu, regulile:
A->αβ, A->αγ
Atunci introducem un nou neterminal A’ şi înlocuim regulile în cauză cu:
A-> αA’, A’->β, A’->γ
Ex:
16
![Page 17: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/17.jpg)
Două exemple mai complexe:
1. Primul exemplu:
A -> Ac
A -> Aa
A -> b
Solutia este
A->bA'
A'->aA'
A'->cA'
A->epsilon
Dupa cum observati a mai aparut o tranzitie pentru A'. Acum avem cate o tranzitie pentru A', pentru fiecare regula a lui A care are recursivitate stanga.
17
![Page 18: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/18.jpg)
Al doilea exemplu:
A -> ab
A -> ac
A -> Aa
Mai întâi se rezolvă problema primelor doua reguli de producţie, obținând:
A->Aa
A -> aA'
A'->b
A'->c
Apoi pentru primele doua reguli de producție aplicam transformarea pentru eliminarea recursivității stânga:
A->aA'A''
A''->aA''
A''->epsilon
A'->b
A'->c
18
![Page 19: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/19.jpg)
Exerciţiu:
Fie gramatica:
Analizaţi sintactic propoziţia:
19
![Page 20: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/20.jpg)
Analiza sintactică prin coborâre recursivă constituie o implementare deterministă a analizei sintactice predictive.
AF
Si
St1 St2
isi
ist2 ist1
Si – şirul de intrare (conţine atomii lexicali obţinuţi în urma etapei de analiză lexicală) isi – indice pentru Si St1 – stiva (acces LIFO) cu frunzele arborelui sintactic ist1 – vârful stivei St1 St2 – stiva de retur Ist2 – vârful stivei St2
20
![Page 21: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/21.jpg)
Configuraţia automatului finit este data de: (s, i, , ),
Unde:
s - starea automatului finit, care poate fi:
◦ - q (stare normala),
◦ - b (stare de revenire),
◦ - e (stare de eroare),
◦ - t (stare de true)
j - indicele sirurului de intrare j1 j2…jn
- şirul din stiva St2, formată din simboluri deja recunoscute în şirul de intrare şi din indicii regulilor de producţie utilizate în derivări
β - şirul din stiva St1, formată din simboluri încă neexpandate
21
![Page 22: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/22.jpg)
(1) stare initiala (q, 1, ε, S)
(2) expandarea (q, j, , A) ├ (q, j, A1, 1) , unde A1: A -> 1 este prima producţie pentru neterminalul A din vârful stivei St1 (A va fi expandat conform primei alternative)
(3) avans (q, j, , a) ├ (q, j+1, a, ), cand în varful stivei St1 se află un terminal identic cu cel din poziţia curentă (j) a şirului de intrare
(4) necoincidenta (q, j, , i) ├ (b, j, , i), cand în vârful stivei St1 se află un terminal care nu este identic cu cel din poziţia curenta (j) a şirului de intrare
(5) revenire in starea de intrare
(5.1) (b, j, i, ) ├ (b, j-1, , i), când în vârful stivei St2 se află un terminal; pasul 5.1 se repetă atâta timp cât se află un terminal în vârful stivei St2
(5.2) (b, j, Ai, i) ├ (q, j, Ai+1, i+1) , se sare la pasul 3
(5.3) (b, j, An, n) ├ (b, j, , A) , se sare la pasul 5.1
(6) esec (b, j, , S) ├ (e, j, , S)
(7) succes (q, n+1, , ε) ├ (t, n+1, , ε)
22
![Page 23: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/23.jpg)
Ex:
Fie gramatica:
(S1) S -> Ab
(S2) S -> Ac
(A1) A -> a
(A2) A -> bAB
(B1) B -> a
Analizaţi propoziţia w *:
1. w = bbaaab
2. w= bbaabab
Starea initiala : (q, 1, ε, S)
23
![Page 24: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/24.jpg)
├ (2) (q, 1, S1, Ab) //expandare (2)
├ (2) (q, 1, S1A1, ab) //st2(ist2)si(isi)
├ (4) (b,1,S1A1, ab) //necoincidenta (4)
├ (5.2) (q, 1, S1A2, bABb) //back (5)
├ (3) (q, 2, S1A2b, ABb) //avans (3)
├ (2) (q, 2, S1A2bA1, aBb) //expandare A1 -> a
├ (4) (b, 2, S1A2bA1, aBb) //necoincidenta
├ (5.2) (q, 2, S1A2bA2, bABBb) //revenire (back)
24
![Page 25: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/25.jpg)
├ (3) (q, 3, S1A2bA2b, ABBb) //avans
├ (2) (q, 3, S1A2bA2bA1, aBBb) //expandare
├ (3) (q, 4, S1A2bA2bA1a, BBb) //avans
├ (2) (q, 4, S1A2bA2bA1aB1, aBb) //expandare
├ (3) (q, 5, S1A2bA2bA1aB1a, Bb) //avans
├ (2) (q, 5, S1A2bA2bA1aB1aB1, ab) //expandare
├ (3) (q, 6, S1A2bA2bA1aB1aB1a, b) //avans
├ (3) (q, 7, S1A2bA2bA1aB1aB1ab, $) //avans
├ (7) (q, 7, S1A2bA2bA1aB1aB1ab, ) //succes
25
![Page 26: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/26.jpg)
Pentru a putea utiliza analiza sintactică cu reveniri, gramatica generatoare a limbajului ţintă trebuie să îndeplinească numai prima condiţie dintre cele cerute pentru analiza sintactică predictivă.
26
![Page 27: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/27.jpg)
Este o implementare a analizei sintactice predictive.
Fiecare neterminal devine un nume de funcţie.
Funcţia pentru un anumit neterminal este responsabilă să verifice dacă se poate găsi la începutul şirului de intrare o derivare care porneşte de la acest neterminal.
Dacă nu este posibil, funcţia trebuie să sară peste ceea ce a găsit şi să semnaleze o eroare.
Există o funcţie principală care lansează funcţia pentru simbolul de start şi verifică dacă intrarea este vidă.
Există o funcţie next care face un avans cu o poziţie în şirul de intrare.
27
![Page 28: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/28.jpg)
Exemplificăm construcţia funcţiilor necesare analizei sintactice prin coborâre recursivă pentru gramatica:
28
![Page 29: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/29.jpg)
29
![Page 30: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/30.jpg)
30
![Page 31: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/31.jpg)
31
![Page 32: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/32.jpg)
32
![Page 33: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/33.jpg)
Exerciţii:
1. Scrieţi funcţiile pentru neterminalele T şi T’ pentru gramatica anterioară
2. Analizaţi propoziţia “(id)”, reprezentând stările stivei de apeluri.
33
![Page 34: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/34.jpg)
Pentru a putea utiliza analiza sintactică prin coborâre recursivă, gramatica generatoare a limbajului ţintă trebuie să îndeplinească aceleaşi condiţii ca şi pentru analiza sintactică predictivă.
34
![Page 35: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/35.jpg)
Structura maşinii de analiză predictivă
MP
Procesor
SI
ISI
ISO
SO ST
VS IMP
35
![Page 36: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/36.jpg)
Procesorul este unitatea centrală virtuală care interpretează programele
şi le execută.
SI este şirul de intrare cu indicele ISI care marchează poziţia
caracterului curent de analizat.
SO este şirul de ieşire cu indicele ISO care marchează ultimul
caracter introdus sir.
ST este o memorie de tip stivă, cu VS vârful stivei
MP este memoria program, accesibilă doar la citire, cu IMP indicele
instrucţiunii curente.
Procesorul citeste programele din MP şi le executa la fel ca şi
procesorul oricărui calculator real. El poate citi un caracter din SI,
poate scrie un caracter în SO şi poate scrie sau citi din varful stivei ST.
36
![Page 37: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/37.jpg)
MAP recunoaşte şi execută patru instrucţiuni:
1.Instructiunea de test (V)
2.Instructiunea de apel cu revenire (A)
3. Instrucţiunea adevărat (T)
4. Instrucţiunea fals (F)
37
![Page 38: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/38.jpg)
1.Instructiunea de test:
V(a),E1,E2
Instrucţiunea de test face verificarea coincidenţei dintre simbolul curent din
SI şi caracterul indicat între paranteze, adică a.
In caz de identitate se scrie caracterul a în şirul SO, se avanseaza în SI şi se
continuă execuţia cu instrucţiunea E1.
În caz contrar se continuă execuţia cu instrucţiunea E2.
Dacă câmpurile E1 si E2 sunt vide, execuţia se continuă cu următoarea instrucţiune din
MP.
E1 şi E2 pot fi etichete ale unor instrucţiuni din MP, sau pot fi una dintre instrucţiunile T
şi F.
38
![Page 39: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/39.jpg)
2.Instructiunea de apel cu revenire
A(E),E1,E2
Permite executia secvenţei de program de la eticheta E.
Înainte de execuţia primei instrucţiuni de la eticheta E, se salvează starea maşinii de
analiză, adică tripletul (ISI,ISO,IMP) în ST.
Daca returul din secvenţă se face cu instrucţiunea adevarat (T), se va executa în
continuare instructiunea E1.
Dacă returul din secvenţă se face cu instrucţiunea fals (F), se va executa în
continuare instrucţiunea E2.
Dacă câmpurile E1 si E2 sunt vide, execuţia se continuă cu următoarea instrucţiune
din MP.
E1 şi E2 pot fi etichete ale unor instrucţiuni din MP, sau pot fi una dintre
instrucţiunile T şi F.
39
![Page 40: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/40.jpg)
Algoritmul MAP este urmatorul:
ISI, ISO,ISt,IMP0
repeta
daca MP(IMP)=A
atunci *A
altfel *V
40
![Page 41: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/41.jpg)
Instrucţiunea V:
k=1
daca MP(IMP+1)=SI(ISI)
atunci
ISIISI+1
SO(ISO)MP(IMP+1)
ISOISO+1
K1IMP+2
altfel
K1IMP+3
41
![Page 42: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/42.jpg)
Continuare instrucţiunea V:
repeta pana cand k=0
daca MP(K1)=blank
atunci IMP=IMP+4 ; k=0
altfel
daca MP(K1) =T
atunci *T
altfel
daca MP(K1)=F
atunci *F
altfel IMP=MP(K1); k=0
42
![Page 43: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/43.jpg)
Instrucţiunea A :
ST(VS)=ISI,ISO,IMP
VS=VS+3
IMPMP(IMP+1)
Instrucţiunea F :
daca VS=0 atunci *esec
altfel IMP=ST(VS)
ISO=ST(VS)
ISI=ST(VS)
K1=IMP+3
• VS=VS-3
•
43
![Page 44: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/44.jpg)
Instrucţiunea T :
daca VS != 0 atunci
IMP=ST(VS)
VS=VS-3
SO(ISO)=MP(IMP+1)
ISO=ISO+1
K1=IMP+2
altfel (daca VS=0) atunci
daca SI(ISI-1) = ε
atunci *succes
altfel *eşec
• •
44
![Page 45: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/45.jpg)
Ex:
Se consideră gramatica:
X Y
Y Z+W
Y Z*W
Y Z
Z -W
Z W
W a
W (Y)
Scrieţi programul de analiză pentru maşina de analiză predictivă.
Analizaţi propoziţia: a+(-a)
45
![Page 46: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/46.jpg)
+ * - a ( )
X Y Y Y
Y Z+W Z*W Z
Z+W Z*W Z
Z+W Z*W Z
Z -W W W
W a (Y)
46
![Page 47: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/47.jpg)
0 X: A(Y) , , F
4 : V(ε) ,T , F
8 Y: A(Z) , , F
12 : V(+) ,Y1,
16 : V() ,Y1, T
20 Y1: A(W), T , F
24 Z: V(-) , ,
28 : A(W), T , F
32 W: V(a) , T ,
36 : V( ( ), , F
40 : A(Y) , , F
44 : V( ) ), T , F
47
![Page 48: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/48.jpg)
SI ISI ISO IMP SO ST
a+(-a)$ 0 0 0 -
a+(-a)$ 0 0 0 - (0,0,0)
a+(-a)$ 0 0 8 - (0,0,0)(0,0,8)
a+(-a)$ 0 0 24 - (0,0,0)(0,0,8)
a+(-a)$ 0 0 28 - (0,0,0)(0,0,8)(0,0,28)
a+(-a)$ 0 0 32 - (0,0,0)(0,0,8)(0,0,28)
a+(-a)$ 1 2 28 aw (0,0,0)(0,0,8)
a+(-a)$ 1 3 8 awz (0,0,0)
a+(-a)$ 1 3 12 awz (0,0,0)
48
![Page 49: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/49.jpg)
SI ISI ISO IMP SO ST
a+(-a)$ 2 4 20 awz+ (0,0,0)
a+(-a)$ 2 4 32 awz+ (0,0,0)(2,2,20)
a+(-a)$ 2 4 36 awz+ (0,0,0)(2,2,20)
a+(-a)$ 3 5 40 awz+( (0,0,0)(2,2,20)
a+(-a)$ 3 5 8 awz+( (0,0,0)(2,2,20)(3,3,40)
a+(-a)$ 3 5 24 awz+( (0,0,0)(2,2,20)(3,3,40)(3,3,8)
a+(-a)$ 4 6 28 awz+(- (0,0,0)(2,2,20)(3,3,40)(3,3,8)
a+(-a)$ 4 6 32 awz+(-(0,0,0)(2,2,20)(3,3,40)(3,3,8)
(4,4,28)
a+(-a)$ 5 8 28 awz+(-aw (0,0,0)(2,2,20)(3,3,40)(3,3,8)
49
![Page 50: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/50.jpg)
SI ISI ISO IMP SO ST
a+(-a)$ 5 9 8 awz+(-awz (0,0,0)(2,2,20)(3,3,40)
a+(-a)$ 5 9 12 awz+(-awz (0,0,0)(2,2,20)(3,3,40)
a+(-a)$ 5 9 16 awz+(-awz (0,0,0)(2,2,20)(3,3,40)
a+(-a)$ 5 10 40 awz+(-awzy (0,0,0)(2,2,20)
a+(-a)$ 6 11 20 awz+(-awzy) (0,0,0)
a+(-a)$ 6 12 0 awz+(-awzy)w -
a+(-a)$ 6 13 4 awz+(-awzy)wy -
50
![Page 51: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/51.jpg)
Analiza LL(k) este un tip de analiză sintactică descendentă care analizează intrarea de la stânga la dreapta (Left to right) şi construieşte o derivare stânga pentru aceasta (Leftmost derivation). De aici denumirea de LL.
Analiza se numeşte LL(k) deoarece în cadrul acesteia decizia de a folosi o anumită producţie pentru a expanda un neterminal se ia după inspectarea în avans a unui număr de k simboluri (atomi lexicali) din şirul de intrare. În consecinţă, analiza nu foloseşte reveniri (backtracking).
Dacă pentru o anumită gramatică generatoare G se poate defini un analizator LL(k), atunci gramatica se numeşte gramatică LL(k). Limbajul definit printr-o astfel de gramatică se numeşte limbaj LL(k).
Cele mai răspândite sunt gramaticile LL(1): analizatorul trebuie să inspecteze doar următorul simbol (atom lexical) din şirul de intrare pentru a putea lua deciziile de analiză.
51
![Page 52: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/52.jpg)
Fie gramatica: 1.1 S->aSAc 1.2 S-> ε 2.1 A->bA
2.1 A-> ε
aabcc
(q, 0, S)├ (q, 0, aSAc)├ (q, 1, SAc) ├ (q, 1, aSAcAc)
├ (q, 2, SAcAc) ├ (q, 2, AcAc) ├ (q, 2, bAcAc) ├
(q, 3, AcAc) ├ (q, 3, cAc) ├ (q, 4, Ac) ├ (q, 4, c) ├ (q, 5, ε)
a b C
S 1.1 sau 1.2 1.1 sau 1.2 1.1 sau 1.2
A 2.1 sau 2.2 2.1 sau 2.2 2.1 sau 2.2
52
![Page 53: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/53.jpg)
Pentru a putea defini un analizator LL(1) pentru o anumită gramatică generatoare G, aceasta trebuie să fie o gramatică LL(1).
Condiţiile necesare şi suficiente pentru ca o gramatică independentă de context să fie o gramatică LL(1) sunt:
AVN , A 1| 2| 3…| n
1. FIRST+ (i) FIRST+ (j) = ,
i j
2. FOLLOW+ (A) FIRST+ (j) = ,
i pentru care i * ε şi j
53
![Page 54: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/54.jpg)
FIRST+(i )={ a | i * a }
Dacă i * ε, atunci trebuie să ţinem cont de ceea ce urmează după A.
FOLLOW+(A)={ a | S * xAY; aFIRST+ (Y), x *}
În cazul metodei LL1 se analizează în avans un singur atom lexical.
54
![Page 55: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/55.jpg)
În gramaticile LL1 nu este permisă recursivitatea stânga.
Demonstratie:
Presupunem A 1| 2| 3…| n .
Presupunem existenţa recursivităţii stânga.
1 * A atunci A * 1* A * 2
FIRST+ (1) FIRST+ (A) FIRST+ (2)
Daca 2 =ε FIRST+ () FIRST+ (2 ) FIRST+ (1)
FIRST+ () FOLLOW(A)
FIRST+ (1) FOLLOW(A)
Deci, dacă gramatica foloseşte recursivitate stânga pentru definirea producţiilor, ea nu îndeplineşte condiţiile necesare şi suficiente pentru a fi o gramatică LL1 şi deci nici nu poate fi construit pentru ea un analizator LL1.
55
![Page 56: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/56.jpg)
Fie gramatica:
E E + T | T
T T F | F
F a | (E)
Gramatica foloseşte recursivitate stânga; ca urmare, trebuie să o modificăm:
1. E TE1 6. T1 ε
2. E1 +TE1 7. F (E)
3. E1 ε 8. F a
4. T FT1
5. T1 FT1
56
![Page 57: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/57.jpg)
Calculăm mulţimile:
D1 = FIRST+ (TE1) = FIRST+ (F) = { ( , a }
D2 = FIRST+ (+TE1) = { +}
D3 = FOLLOW+ (E1) = FOLLOW+ (E) = { ) }
D4 = FIRST+ (FT1) = FIRST+ (F) = { ( , a }
D5 = FIRST+ (*FT1) = { }
D6 = FOLLOW+ (T1) = FOLLOW+ (T) = FIRST+ (E1) FOLLOW+ (E) D6 = { + } { ) }= { +, ) }
D7 = FIRST+ ( (E) ) = { ( }
D8 = FIRST+ ( a ) = { a }
57
![Page 58: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/58.jpg)
Verificăm condiţiile pentru ca gramatica să fie
o gramatică LL1:
D2 D3 =
D5 D6 =
D7 D8 =
Rezultă că gramatica este o gramatică LL1.
58
![Page 59: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/59.jpg)
Pe baza mulţimilor FIRST şi FOLLOW calculate, se generează tabela de analiză sintactică.
Pe baza tabelei de analiză sintactică se poate implementa un analizor sintactic determinist cu structura:
w x
SI
a
Automat finit
ISO
SO
VS
ISI
59
![Page 60: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/60.jpg)
Pe baza mulţimilor FIRST şi FOLLOW calculate, se generează tabela de analiză sintactică astfel:
Simbolul $ reprezintă terminatorul de şir pentru şirul de intrare (SI).
VN
{ $ }
{ $ }
P - pop – scoate un simbol din stivă şi
înaintează în SI
A - accept – propoziţia este corectă
E - error – propoziţia este incorectă
R n - replace – se înlocuieşte VS cu
partea dreaptă a producţiei n, după care se
scrie n în SO
60
![Page 61: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/61.jpg)
Algoritmul de construcţie al tabelei de analiză sintactică este:
Pentru fiecare regulă Rn: A->α
Instrucţiune repetitivă (actualize linie neterminal A) ◦ Pentru fiecare terminal din FIRST+(α), completează celula
din tabelă corepunzătoare coloanei terminalului cu R n
◦ Dacă α =>* ε, atunci pentru fiecare terminal din FOLLOW+(A), completează celula din tabelă corespunzătoare coloanei terminalului respectiv cu R n
Sfârşit instrucţiune repetitivă
61
![Page 62: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/62.jpg)
Pentru exemplul anterior, tabela de analiză sintactică este (celulele goale reprezintă E):
a ( ) + $
E 1 1
E1 3 2 3
T 4 4
T1 6 6 5 6
F 8 7
a P
( P
) P
+ P
P
$ A
62
![Page 63: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/63.jpg)
Algoritm
sf false
repeta pana cand sf = true
daca St(VS) şi St(VS)=SI(ISI) atunci pop şi ISI = ISI + 1
◦ sau St(VS) şi St(VS) =! SI(ISI) atunci error
◦ sau St(VS)=AVN atunci replace n şi SO(ISO) = n şi
ISO = ISO + 1
◦ sau St(VS) = SI(ISI) = $ atunci accept
◦ sf true
altfel error
sf true
63
![Page 64: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/64.jpg)
Modelul matematic al acestui tip de analiză rămâne automatul finit cu stivă, aşa cum a fost definit pe slide-ul al 9-lea, la care se adaugă un element în plus, şi anume şirul de ieşire.
Funcţia de tranziţie:
f(q, a, a) = {(q, ε)} pop
f(q, $, $) = {(a, ε)} accept
f(q, b, A) = {(q, )} replace A b conform tabelei de analiză sintactică
f(q, i, x) = {(e, ε)} error
64
![Page 65: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/65.jpg)
Configuraţia automatului la un moment dat este dată de: (S, x, , y)
S = starea automatului
x = şirul de intrare rămas de analizat
= stiva
y = şirul de iesire, format din indicii producţiilor utilizate în derivări
Stări posibile:
(q, ax, a , y) (q, x, , y) pop
(q, ax, A, y) (q, x, , yi) replace i, conform tabelei de analiză
(q, $, $, y) (a, ε, ε, y) accept
(q, x, i, y) (e, ε, ε, y) error
65
![Page 66: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/66.jpg)
Ex: a a + a
(q,aa+a$, E$, ε) r (q,aa+a$ ,TE1$ ,1) r
r(q,aa+a$, FT1E1$,14) r (q,aa+a$,aT1E1$,148) p
p(q,a+a$,T1E1$,148) r (q,a+a$ ,FT1E1$,1485) p
p(q,a+a$,FT1E1$,1485) r (q,a+a$,aT1E1$,14858)p
p (q,+a$,aT1E1$,14858)r (q,+a$,E1$,148586) r
r(q,+a$,+TE1$,1485862) p (q,a$,TE1$,1485862) r
r(q,a$,FT1E1$,14858624) r (q,a$,aT1E1$,148586248) p
p(q,$,T1E1$,148586248) r(q,$,E1$,1485862486) r
r (q,$,$,14858624863) a (a,$,$,14858624863)
66
![Page 67: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/67.jpg)
<instructiune > -> if <expr-logica> then (<instructiune >) I1
I1 -> else <instructiune >
I1 -> ε
<instructiune > -> repeat <instructiune > until <expr-logica>
<instructiune > -> <factor> := <factor>
<expr-logica> -> <factor> E1
E1 -> < <factor>
E1 -> <= <factor>
<factor> -> i F1
F1 -> (<lista>)
F1 -> ε
<lista > -> i L1
L1 -> , <lista>
L1 -> ε
67
![Page 68: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/68.jpg)
FIRST+ { if } FIRST+ { else } FOLLOW+ { ) until $} FIRST+ { repeat } FIRST+ { i } FIRST+ { i } FIRST+ { < } FIRST+ { <= } FIRST+ { i } FIRST+ { ( }
FOLLOW+(F1) = FOLLOW+(<factor>) = { := } U First(E1) = {:= < <=} U FOLLOW+(E1) U FOLLOW+(<instructiune>) ◦ (pentru ca factor apare ca ultim element al productiilor I -> F := F, deci fallow de F este
Fallow de I) ◦ E1 -> < F, deci fallow de F este Fallow de E1
{ := < <= then ) until $ } FIRST+ { i } FIRST+ { , } FOLLOW+ { ) }
68
![Page 69: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/69.jpg)
(<instructiune>$, propozitia de intrare)
În calculul mulţimilor FIRST şi FOLLOW se merge în adâncime până la nivelul maxim posibil.
69
![Page 70: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/70.jpg)
Structura maşinii de analiză LL(1) corespunde cu structura maşinii de analiză predictivă.
Setul de instrucţiuni al procesorului acestei maşini este format din:
check(a) L – verifică dacă simbolul curent din şirul de intrare este terminalul a; dacă da, se continuă execuţia cu instrucţiunea de la eticheta L; dacă nu se contiuă execuţia cu instrucţiunea următoare
call A – apel cu revenire la eticheta A return – revenire dintr-un call pop - avansare în şirul de intrare accept – încheiere execuţie program, propoziţia este
corectă error - încheiere execuţie program, propoziţia este
incorectă
70
![Page 71: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/71.jpg)
Ex:
Fie gramatica: E→E+T
E→T
T→TF
T→F
F→a
F→a(L)
F→(E)
L→E
L→E,L
• Să se modifice gramatica astfel încât să se obţină o gramatică LL(1).
• Să se construiască tabela de analiză sintactică LL(1).
• Să se construiască automatul de analiză sintactică LL(1).
• Să se scrie programul pentru maşina abstractă de analiză LL(1) pentru gramatica obţinuită.
71
![Page 72: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/72.jpg)
72
![Page 73: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/73.jpg)
73
![Page 74: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/74.jpg)
74
![Page 75: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/75.jpg)
75
![Page 76: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/76.jpg)
76
![Page 77: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/77.jpg)
77
![Page 78: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/78.jpg)
78
![Page 79: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/79.jpg)
Ex: Fie gramatica:
E E+T | E-T | T
T T*F | T/F | F
F a | a(L) | (E)
L E | E,L
a. Sa se modifice gramatica astfel încât să se obţină o gramatică LL(1).
b. Să se scrie programul maşinii abstracte de analiză predictivă LL(1) pentru gramatica obţinută.
79
![Page 80: 5_Analiza Sintactica Descendenta](https://reader031.vdocuments.pub/reader031/viewer/2022013106/577cc0c51a28aba711910c58/html5/thumbnails/80.jpg)
http://homedir.jct.ac.il/~rafi/formcomp.pdf
http://inst.eecs.berkeley.edu/~cs164/sp10/notes/notes.pdf
http://facultate.regielive.ro/cursuri/calculatoare/limbaje_formale_si_translatoare-59028.html
80