Compilatoare

 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)

 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
 Analiza sintactică predictivă pleacă de la notiunea de
derivare stânga:
 S => w
1
=> … => w
n
,
 unde w
i
= x
i
Ao
I
, w
i+1
= x
i
|
i
o
I
,
 cu proprietatea A -> |
i
eP,
 iar x
i
e E
*
şi o
I
e (V
N
E)
*


 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.

Procedura de analiza este
sf = false
repeta
daca (st(ist)eE)A(st(ist)=si(isi))
atunci ist <- ist - 1
isi <- isi + 1
ori st(ist) eV
N

atunci expandez varful stivei cu o productie
având în vedere şi simbolul curent
din şirul de intrare
ori (st(ist)=ε) A (si(isi)= ε)
atunci succes
sf <- true
altfel eroare
sf <- true
pana sf
sf
 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:
 Modelul matematic este automatul finit cu stiva
 AP = <Q, E, I, f, q
0
, z
0
, F> unde
 Q - multimea de stari,
 E - alfabetul automatului,
 I - alfabetul stivei,
 z
0
- simbolul initial al stivei,
 q
0
- stare initiala,
 F - multimea de stari finale,
 f - functia de tranzitie
 f : Q x ( Σ U{ ε }) x I --> P (Q x I
*
)
 - unde P este o multime de perechi

 Starea automatului
 (q, x, ¸), qeQ, x e E
*
, ¸e I
*

 Tranziţie
 (q
1
, ax, z¸) ├ (q
2
, x, o¸) <=> (q
2
, o) e f(q
1
, a, z)

 Un sir w e E
*
este acceptat de către automat
• după criteriul stării vide (q
0
, w, z
0
) ├ (q, ε, ε)
• criteriul starii finale (q
0
, w, z
0
) ├ (q, ε, ¸), q eF


 Fie gramatica :
 E -> E + T | T
 T -> T * F | F
 F -> i | (E)

 Neterminale : V
N
= {E, T, F}
 Terminale : E = {+, *, (, ), i}


 Automatul de analiză sintactică predictivă:
 Q = {q}
 E = {+, *, (, ), i}
 I = {E, T, F, +, *, (, ), i}
 z
0
= E
 q
0
= q
 F = C
 f(q, a, a) = (q, ε) , f(q, ε, A) = (q, o) , oricare A-> o e P
 AP = < {q}, {+, *, (, ), i}, {E, T, F, +, *, (, ), i} , f , q , E , C >
• f(q, a, a) = (q, ε)
• f(q, ε, E) = {(q, E+T), (q, T)}
• f(q, ε, T) = {(q, T*F), (q, F)}
• f(q, ε, F) = {(q,i), q, (E)}
 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)
 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.
 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:

 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:

 Exerciţiu:
 Fie gramatica:




 Analizaţi sintactic propoziţia:


 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
 Configuraţia automatului finit este data de: (s, i, o, |),
 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 j
1
j
2
…j
n

 o - ş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

 (1) stare initiala (q, 1, ε, S)
 (2) expandarea (q, j, o, A|) ├ (q, j, oA
1
, o
1
|) , unde A
1
: A -> o
1
este prima
producţie pentru neterminalul A din vârful stivei St1 (A va fi expandat conform
primei alternative)
 (3) avans (q, j, o, a|) ├ (q, j+1, oa, |), 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, o, i|) ├ (b, j, o, 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, oi, |) ├ (b, j-1, o, 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, oA
i
, o
i
|) ├ (q, j, oA
i+1
, o
i+1
|) , se sare la pasul 3
 (5.3) (b, j, oA
n
, o
n
|) ├ (b, j, o, A|) , se sare la pasul 5.1
 (6) esec (b, j, o, S|) ├ (e, j, o, S|)
 (7) succes (q, n+1, o, ε) ├ (t, n+1, o, ε)
 Ex:
 Fie gramatica:
 (S1) S -> Ab
 (S2) S -> Ac
 (A1) A -> a
 (A2) A -> bAB
 (B1) B -> a
 Analizaţi propoziţia w e E
*
:
1. w = bbaaab
2. w= bbaabab
 Starea initiala : (q, 1, ε, S)

├ (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)


 ├ (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, A) //succes
 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ă.

 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.

 Exemplificăm construcţia funcţiilor necesare
analizei sintactice prin coborâre recursivă
pentru gramatica:

 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.
 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ă.
Structura maşinii de analiză predictivă
MP

Procesor
SI
ISI
ISO
SO
ST
VS IMP
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.

 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)
 1.Instructiunea de test:
 V(a),E
1
,E
2
 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 E
1
.
 În caz contrar se continuă execuţia cu instrucţiunea E
2
.
 Dacă câmpurile E
1
si E
2
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.
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 E
1.

 Dacă returul din secvenţă se face cu instrucţiunea fals (F), se va executa în
continuare instrucţiunea E
2
.
 Dacă câmpurile E
1
si E
2
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.
Algoritmul MAP este urmatorul:

ISI, ISO,ISt,IMP÷0
repeta
daca MP(IMP)=A
atunci *A
altfel *V



 Instrucţiunea V:
 k=1
 daca MP(IMP+1)=SI(ISI)
 atunci
 ISI÷ISI+1
 SO(ISO)÷MP(IMP+1)
 ISO÷ISO+1
 K
1
÷IMP+2
 altfel
 K
1
÷IMP+3
 Continuare instrucţiunea V:
 repeta pana cand k=0
 daca MP(K
1
)=blank
 atunci IMP=IMP+4 ; k=0
 altfel
 daca MP(K
1
) =T
 atunci *T
 altfel
 daca MP(K
1
)=F
 atunci *F
 altfel IMP=MP(K
1
); k=0

Instrucţiunea A :
ST(VS)=ISI,ISO,IMP
VS=VS+3
IMP÷MP(IMP+1)
Instrucţiunea F :
daca VS=0 atunci *esec
altfel IMP=ST(VS)
ISO=ST(VS)
ISI=ST(VS)
K
1
=IMP+3


VS=VS-3



Instrucţiunea T :
daca VS != 0 atunci
IMP=ST(VS)
VS=VS-3
SO(ISO)=MP(IMP+1)
ISO=ISO+1
K
1
=IMP+2
altfel (daca VS=0) atunci
daca SI(ISI-1) = ε
atunci *succes
altfel *eşec



 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)

+ * - 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)
 0 X: A(Y) , , F
 4 : V(ε) ,T , F
 8 Y: A(Z) , , F
 12 : V(+) ,Y
1
,
 16 : V(-) ,Y
1
, T
 20 Y
1
: 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
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)
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)
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 -
 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ă.
 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
 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:
 ¬ AeV
N
, A÷ o
1
| o
2
| o
3
…| o
n

 1. FIRST
+
(o
i
) · FIRST
+
(o
j
) =C ,
 ¬ i = j
 2. FOLLOW
+
(A) · FIRST
+
(o
j
) = C,
 ¬ i pentru care o
i
*
¬ ε şi ¬ j
 FIRST
+
(o
i
)={ aeE | o
i
*¬ a¸ }
 Dacă o
i
*¬ ε, atunci trebuie să ţinem cont de ceea ce
urmează după A.
 FOLLOW
+
(A)={ a eE | S *¬ xAY; aeFIRST
+
(Y), x
eE *}


 În cazul metodei LL1 se analizează în avans un singur
atom lexical.
 În gramaticile LL1 nu este permisă recursivitatea stânga.
 Demonstratie:
 Presupunem A÷ o
1
| o
2
| o
3
…| o
n .


Presupunem existenţa recursivităţii stânga.
 o
1
*¬ A| atunci A
*
¬ o
1
*

¬ A|
*
¬ o
2
|
 FIRST
+
(o
1
) _ FIRST
+
(A) _FIRST
+
(o
2
) =C
 Daca o
2
=ε ¬ FIRST
+
(|) c FIRST
+
(o
2
|) c FIRST
+
(o
1
)
 FIRST
+
(|) c FOLLOW(A)
 FIRST
+
(o
1
) · FOLLOW(A)=C

 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.
 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 ÷ TE
1
6. T
1
÷ ε
 2. E
1
÷ +TE
1
7. F ÷ (E)
 3. E
1
÷ ε 8. F ÷ a
 4. T ÷ FT
1

 5. T
1
÷ -FT
1

 Calculăm mulţimile:
 D
1
= FIRST
+
(TE
1
) = FIRST
+
(F) = { ( , a }
 D
2
= FIRST
+
(+TE
1
) = { +}
 D
3
= FOLLOW
+
(E
1
) = FOLLOW
+
(E) = { ) }
 D
4
= FIRST
+
(FT
1
) = FIRST
+
(F) = { ( , a }
 D
5
= FIRST
+
(*FT
1
) = { - }
 D
6
= FOLLOW
+
(T
1
) = FOLLOW
+
(T) = FIRST
+
(E
1
)
FOLLOW
+
(E) ¬ D
6
= { + } { ) }= { +, ) }
 D
7
= FIRST
+
( (E) ) = { ( }
 D
8
= FIRST
+
( a ) = { a }

 Verificăm condiţiile pentru ca gramatica să fie
o gramatică LL1:
 D
2
· D
3
= C
 D
5
· D
6
= C
 D
7
· D
8
= C
 Rezultă că gramatica este o gramatică LL1.

 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
 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).


V
N


E

{ $ }
E { $ }
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
 Algoritmul de construcţie al tabelei de analiză
sintactică este:

 Pentru fiecare regulă R
n
: 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ă
 Pentru exemplul anterior, tabela de analiză
sintactică este (celulele goale reprezintă E):

a ( ) +
-
$
E 1 1
E
1
3 2 3
T 4 4
T
1
6 6 5 6
F 8 7
a P
( P
) P
+ P
-
P
$ A


 Algoritm
 sf ÷ false
 repeta pana cand sf = true
 daca St(VS) eE şi St(VS)=SI(ISI) atunci pop şi ISI = ISI + 1
◦ sau St(VS) eE şi St(VS) =! SI(ISI) atunci error
◦ sau St(VS)=AeV
N
atunci replace n şi SO(ISO) = n şi
ISO = ISO + 1
◦ sau St(VS) = SI(ISI) = $ atunci accept
◦ sf ÷ true
 altfel error
 sf ÷ true
 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, o)} replace A ÷ bo conform
tabelei de analiză sintactică
 f(q, i, x) = {(e, ε)} error

 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, o¸, yi) replace i, conform tabelei de analiză
 (q, $, $, y)  (a, ε, ε, y) accept
 (q, x, i, y)  (e, ε, ε, y) error
 Ex: a - a + a
(q,a-a+a$, E$, ε) 
r
(q,a-a+a$ ,TE
1
$ ,1) 
r

r
(q,a-a+a$, FT
1
E
1
$,14) 
r
(q,a-a+a$,aT
1
E
1
$,148) 
p

p
(q,-a+a$,T
1
E
1
$,148) 
r
(q,-a+a$ ,-FT
1
E
1
$,1485) 
p

p
(q,a+a$,FT
1
E
1
$,1485) 
r
(q,a+a$,aT
1
E
1
$,14858)
p

p
(q,+a$,aT
1
E
1
$,14858)
r
(q,+a$,E
1
$,148586) 
r

r
(q,+a$,+TE
1
$,1485862)


p
(q,a$,TE
1
$,1485862) 
r

r
(q,a$,FT
1
E
1
$,14858624) 
r
(q,a$,aT
1
E
1
$,148586248) 
p

p
(q,$,T
1
E
1
$,148586248) 
r
(q,$,E
1
$,1485862486) 
r

r
(q,$,$,14858624863) 
a
(a,$,$,14858624863)
 <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 -> ε
 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
+
{ ) }
 (<instructiune>$, propozitia de intrare)

 În calculul mulţimilor FIRST şi FOLLOW se
merge în adâncime până la nivelul maxim
posibil.
 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ă
 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ă.
 Ex:
 Fie gramatica:
 E  E+T | T
 T  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ă.

 http://homedir.jct.ac.il/~rafi/formcomp.pdf
 http://inst.eecs.berkeley.edu/~cs164/sp10/n
otes/notes.pdf
 http://facultate.regielive.ro/cursuri/calculato
are/limbaje_formale_si_translatoare-
59028.html

  


 

1. 2. 3. 4. 5. 6.

Analiza sintactică predictivă Analiza sintactică descendentă cu reveniri Analiza sintactică prin coborâre recursivă Maşina abstractă de analiză predictivă Analiza sintactică LL(1) Maşina abstractă de analiză LL(1)

Analiza sintactică predictivă poate fi modelată prin intermediul unui automat finit cu stivă care lucrează asupra unui şir de intrare.
Si
isi

Si – şirul de intrare (conţine atomii lexicali obţinuţi în urma etapei de analiză lexicală)
isi – indice pentru Si

St ist AF

St – stiva (acces LIFO)
LIFO

ist – vârful stivei

    unde wi = xiAI. Analiza sintactică predictivă pleacă de la notiunea de derivare stânga: S => w1 => … => wn. iar xi  * şi I  (VN)* . wi+1 = xiiI. cu proprietatea A -> i P.

atunci vârful stivei este scos şi se avansează în şirul de intrare. atunci acesta este corect. . Se face expandarea vârfului stivei. 3. se semnalează eroare. La sfârşit. Analiza sintactică porneşte de la simbolul de start S. Altfel. 2.     Algoritmul analizei sintactice predictive pentru un limbaj definit printr-o gramatică generatoare este: 1. Dacă cele două simboluri sunt egale. Dacă în vârful stivei apare un terminal. alegând convenabil o regulă de producţie. Altfel nu este corect. dacă stiva este goală şi s-a ajuns la sfârşitul şirului de intrare. acesta este comparat cu simbolul curent din şirul de intrare. care este introdus în stivă. 4.

Procedura de analiza este sf = false repeta daca (st(ist))(st(ist)=si(isi)) atunci 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 altfel pana sf succes ist <.1 isi <.true .ist .isi + 1 sf <.true eroare sf <.

  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:  .

.

 .unde P este o multime de perechi . q0 .stare initiala.multimea de stari finale. f.functia de tranzitie f : Q x ( Σ U{ ε }) x  --> P (Q x *)        .    Modelul matematic este automatul finit cu stiva AP = <Q. . f . . z0 . F> unde Q .alfabetul stivei.simbolul initial al stivei. z0. q0.multimea de stari.  . F .alfabetul automatului.

z0) ├ (q. Starea automatului  (q. ε) • criteriul starii finale (q0. w. ). )  f(q1. ax. x. a. ε. w.  *  Tranziţie  (q1. z)  Un sir w  * este acceptat de către automat • după criteriul stării vide (q0. q F . ε. ) <=> (q2. z0) ├ (q. z) ├ (q2. qQ. x. ). x  *.

 Fie gramatica :   E -> E + T | T T -> T * F | F  F -> i | (E)   Neterminale : VN = {E. T. F} Terminale :  = {+. ). (. i} . *.

(. T*F). {+. F) = {(q. F.  > • f(q. F. (q.        Automatul de analiză sintactică predictivă: Q = {q}  = {+. A) = (q. +. T) = {(q. (.i). E) = {(q. ε. (E)} . T. q. *. a. E . ε) • f(q. f(q. E+T). a) = (q. {E. (q. i} . ε. ) . ). ). ). F)} • f(q. ). oricare A->   P  AP = < {q}. ε) . (. *. ε. *. q . T. T)} • f(q. i}. i} z0 = E q0 = q F= f(q. i}  = {E. a. (. *. +. ε. a) = (q. f .

E+T) ├ (q. i*i+i . *i+i . i*i+i . F)      ├ (q. ε)     ├ (q. i . *F+T) ├ (q. i*i+i . i*i+i . Pentru analiza propozitiei i*i+i evolutia automatului este : (q. i . i . i*F+T) ├ (q. T) ├ (q. ε. +T) . i) ├ (q. i+i . T+T) ├ (q. F*F+T) ├ (q. i*i+i . +i . E) ├ (q. i+T) ├ (q. i*i+i . F+T) ├ (q. T*F+T) ├ (q. i+i .

pe baza simbolului curent din şirul de intrare. 2. . gramatica generatoare a limbajului ţintă trebuie să îndeplinească condiţiile: 1. părţile drepte ale producţiilor sale încep diferit: Nu există două producţii A->αβ şi A>αγ. Nu se foloseşte recursivitate stânga în regulile de producţie: nu există niciun neterminal A astfel încât A=+>Aα. Pentru orice neterminal. Această condiţie asigură identificarea uşoară a regulii de producţie care trebuie folosită pentru a expanda un neterminal din vârful stivei. având în vedere că se foloseşte derivarea stânga pentru înlocuirea neterminalelor. Îndeplinirea acestei condiţii asigură faptul că stiva nu se va extinde la infinit.     Pentru a putea utiliza analiza sintactică predictivă. cu αdiferit de ε.

A’->αA’. de exemplu:  A->Aα. A’->ε Ex: .    Eliminarea recursivităţii stânga: Dacă există reguli de producţie care folosesc recursivitatea stânga. A->β Atunci introducem un nou neterminal A’ şi înlocuim regulile în cauză cu:  A->βA’.

A->αγ Atunci introducem un nou neterminal A’ şi înlocuim regulile în cauză cu:  A-> αA’. A’->β.   Dacă nu este îndeplinită a doua condiţie. şi gramatica conţine. de exemplu. A’->γ Ex: . regulile:  A->αβ.

  Exerciţiu: Fie gramatica:  Analizaţi sintactic propoziţia: .

 Analiza sintactică prin coborâre recursivă constituie o implementare deterministă a analizei sintactice predictive. Si isi St1 ist1 AF ist2 St2 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 .

i.e (stare de eroare).şirul din stiva St2. care poate fi: ◦ .starea automatului finit. ◦ .b (stare de revenire). . ◦ .   Unde: s .t (stare de true)   j . ◦ . formată din simboluri încă neexpandate  .q (stare normala). Configuraţia automatului finit este data de: (s. ).şirul din stiva St1. formată din simboluri deja recunoscute în şirul de intrare şi din indicii regulilor de producţie utilizate în derivări β .indicele sirurului de intrare j1 j2…jn  .

j+1. se sare la pasul 5. j-1. 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. n+1. ε. cand în varful stivei St1 se află un terminal identic cu cel din poziţia curentă (j) a şirului de intrare (4) necoincidenta (q. A) . . . j. j. i) ├ (b. j. i+1) . pasul 5. . j. Ai+1.3) (6) esec (b. 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. S)     (7) succes (q. . i. S) ├ (e. 1) . An. j. . n+1. i) ├ (q. . a.1) (b. j. j.    (1) stare initiala (q. a) ├ (q. . i). j. se sare la pasul 3 (b. j. A) ├ (q. S) (2) expandarea (q. j. . 1.2) (5. . j. când în vârful stivei St2 se află un terminal. ) ├ (b. ε) .1 (b. Ai. ). j. ε) ├ (t. A1. . n) ├ (b.1 se repetă atâta timp cât se află un terminal în vârful stivei St2 (5.

 Ex:    Fie gramatica: (S1) (S2) S -> Ab S -> Ac    (A1) (A2) (B1) 1. A -> a A -> bAB B -> a  Analizaţi propoziţia w  *: w = bbaaab w= bbaabab  Starea initiala : (q. 1. S) . 2. ε.

2. Ab) (q.2) (q. S1A2bA1. 1. S1A2b. 1. ab) (q. S1A2bA1.S1A1. 2. aBb) (q. S1A2. S1A2bA2. S1A1. 2. ABb) (q. 2. bABBb) //expandare (2) //st2(ist2)si(isi) //necoincidenta (4) //back (5) //avans (3) //expandare A1 -> a //necoincidenta //revenire (back) .1. 1. S1. ab) (b.├ ├ ├ ├ ├ ├ ├ ├ (2) (2) (4) (5. aBb) (b. bABb) (q.2) (3) (2) (4) (5.

) //avans //expandare //avans //expandare //avans //expandare //avans //avans //succes . aBBb) (q. S1A2bA2bA1. S1A2bA2bA1aB1aB1. S1A2bA2bA1aB1. 7. aBb) (q. 3. BBb) (q. 7. ab) (q. S1A2bA2bA1a. S1A2bA2bA1aB1a. S1A2bA2bA1aB1aB1a. ABBb) (q. 4. S1A2bA2bA1aB1aB1ab. S1A2bA2bA1aB1aB1ab. 5. 3. 5. 6. S1A2bA2b. 4. $) (q.         ├ ├ ├ ├ ├ ├ ├ ├ ├ (3) (2) (3) (2) (3) (2) (3) (3) (7) (q. b) (q. Bb) (q.

. gramatica generatoare a limbajului ţintă trebuie să îndeplinească numai prima condiţie dintre cele cerute pentru analiza sintactică predictivă. Pentru a putea utiliza analiza sintactică cu reveniri.

Fiecare neterminal devine un nume de funcţie.      Este o implementare a analizei sintactice predictive. 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. Există o funcţie principală care lansează funcţia pentru simbolul de start şi verifică dacă intrarea este vidă. . funcţia trebuie să sară peste ceea ce a găsit şi să semnaleze o eroare. Dacă nu este posibil. Există o funcţie next care face un avans cu o poziţie în şirul de intrare.

 Exemplificăm construcţia funcţiilor necesare analizei sintactice prin coborâre recursivă pentru gramatica: .

.

.

.

.

Scrieţi funcţiile pentru neterminalele T şi T’ pentru gramatica anterioară 2. Exerciţii: 1.   . reprezentând stările stivei de apeluri. Analizaţi propoziţia “(id)”.

 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ă.

Structura maşinii de analiză predictivă SI ISI VS Procesor IMP ISO ST SO MP .

SO este şirul de ieşire cu indicele ISO care marchează ultimul caracter introdus sir. El poate citi un caracter din SI. Procesorul . Procesorul citeste programele din MP şi le executa la fel ca şi procesorul oricărui calculator real. poate scrie un caracter în SO şi poate scrie sau citi din varful stivei ST. cu IMP indicele instrucţiunii curente. accesibilă doar la citire. SI este şirul de intrare cu indicele ISI care marchează poziţia caracterului curent de analizat. ST este o memorie de tip stivă. cu VS vârful stivei MP este memoria program.este unitatea centrală virtuală care interpretează programele şi le execută.

     MAP recunoaşte şi execută patru instrucţiuni: 1.Instructiunea de apel cu revenire (A) 3.Instructiunea de test (V) 2. Instrucţiunea adevărat (T) 4. Instrucţiunea fals (F) .

E1 şi E2 pot fi etichete ale unor instrucţiuni din MP.  . se avanseaza în SI şi se continuă execuţia cu instrucţiunea E1.Instructiunea de test:  V(a). adică a.    În caz contrar se continuă execuţia cu instrucţiunea E2. execuţia se continuă cu următoarea instrucţiune din MP.E2 Instrucţiunea de test face verificarea coincidenţei dintre simbolul curent din SI şi caracterul indicat între paranteze.  In caz de identitate se scrie caracterul a în şirul SO. 1.E1. sau pot fi una dintre instrucţiunile T şi F. Dacă câmpurile E1 si E2 sunt vide.

sau pot fi una dintre instrucţiunile T şi F. adică tripletul (ISI. se va executa în continuare instructiunea E1.  Daca returul din secvenţă se face cu instrucţiunea adevarat (T).2.  Înainte de execuţia primei instrucţiuni de la eticheta E.E1.ISO.  .  E1 şi E2 pot fi etichete ale unor instrucţiuni din MP. execuţia se continuă cu următoarea instrucţiune din MP.  Dacă returul din secvenţă se face cu instrucţiunea fals (F).E2 Permite executia secvenţei de program de la eticheta E.  Dacă câmpurile E1 si E2 sunt vide.Instructiunea de apel cu revenire A(E).IMP) în ST. se va executa în continuare instrucţiunea E2. se salvează starea maşinii de analiză.

Algoritmul MAP este urmatorul: ISI.ISt.IMP0 repeta daca MP(IMP)=A atunci *A altfel *V . ISO.

         Instrucţiunea V: k=1 daca MP(IMP+1)=SI(ISI) atunci ISIISI+1 SO(ISO)MP(IMP+1) ISOISO+1 K1IMP+2 altfel  K1IMP+3 .

k=0 . 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).

IMP VS=VS+3 IMPMP(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 .ISO.Instrucţiunea A : ST(VS)=ISI.

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 • • .

  Analizaţi propoziţia: a+(-a) .   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ă.

+ X Y * Y Z+W Z*W Z -W a Y Z+W Z*W Z W a ( Y Z+W Z*W Z W (Y) ) Z W .

. F : A(W).F .T .F     32 W: V(a) . 0 X: A(Y) . T . T Z: V(-) .F        4 8 12 16 24 28 36 40 44 : V(ε) . 20 Y1: A(W). . F : V(+) .F .Y1. T . F : V( ( ). T . : A(Y) . Y: A(Z) . F . T .Y1. : V( ) ). : V() . .

0.0) (0.0.SI ISI 0 0 0 0 0 0 1 1 1 ISO 0 0 0 0 0 0 2 3 3 IMP 0 0 8 24 28 32 28 8 12 SO aw awz awz ST a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ (0.0)(0.8)(0.0.0)(0.8)(0.0.0.0) (0.0.0.0.28) (0.0.0)(0.0)(0.8) (0.8) (0.0)(0.0) .8) (0.0.0.0.28) (0.0.0.0.

20) (0.20)(3.0)(2.40)(3.2.8) .0)(2.20) (0.0)(2.8) (0.3.2.20)(3.40)(3.4.2.28) (0.2.0.SI a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ ISI 2 2 2 3 3 3 4 4 5 ISO 4 4 4 5 5 5 6 6 8 IMP 20 32 36 40 8 24 28 32 28 SO awz+ awz+ awz+ awz+( awz+( awz+( awz+(awz+(awz+(-aw ST (0.3.20) (0.20)(3.3.0.3.0)(2.2.3.2.40)(3.0)(2.0.0) (0.2.3.2.3.20)(3.8) (0.0)(2.0.0.0)(2.0)(2.0.3.20)(3.40)(3.0.8) (4.40) (0.0.3.0.

20)(3.3.0.3.0.0.20) (0.0)(2.40) (0.20)(3.SI a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ a+(-a)$ ISI 5 5 5 5 6 6 6 ISO 9 9 9 10 11 12 13 IMP 8 12 16 40 20 0 4 SO awz+(-awz awz+(-awz awz+(-awz awz+(-awzy awz+(-awzy) awz+(-awzy)w awz+(-awzy)wy ST (0.0.20)(3.40) (0.2.0) - .40) (0.0)(2.2.0)(2.3.2.0)(2.2.0.

De aici denumirea de LL. analiza nu foloseşte reveniri (backtracking). 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.    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). Dacă pentru o anumită gramatică generatoare G se poate defini un analizator 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ă. atunci gramatica se numeşte gramatică LL(k). În consecinţă.

SAcAc) ├ (q.1 sau 1. 3. SAc) ├ (q. 1. 3.1 A->bA 2.1 A-> ε a S 1.2 A 2. c) ├ (q.1 S->aSAc 1. 0. 0. ε) .1 sau 1. 4. 2. aSAcAc) ├ (q.1 sau 1.2 S-> ε 2. bAcAc) ├ (q.2   aabcc (q. 1. S)├ (q. aSAc)├ (q.2 2.2 b 1. 2. 5. 2. AcAc) ├ (q. Ac) ├ (q.1 sau 2.2 2.1 sau 2.2 C 1. 4. AcAc) ├ (q.1 sau 2.     Fie gramatica: 1. cAc) ├ (q.

 i pentru care i * ε şi  j . A 1| 2| 3…| n 1. FIRST+ (i)  FIRST+ (j) = . ij 2.  Pentru a putea defini un analizator LL(1) pentru o anumită gramatică generatoare G. Condiţiile necesare şi suficiente pentru ca o gramatică independentă de context să fie o gramatică LL(1) sunt:       AVN . FOLLOW+ (A)  FIRST+ (j) = . aceasta trebuie să fie o gramatică LL(1).

. aFIRST+ (Y). atunci trebuie să ţinem cont de ceea ce urmează după A.  FIRST+(i )={ a | i * a } Dacă i * ε. x  *}  În cazul metodei LL1 se analizează în avans un singur atom lexical.  FOLLOW+(A)={ a  | S * xAY.

dacă gramatica foloseşte recursivitate stânga pentru definirea producţiilor. Demonstratie: Presupunem A 1| 2| 3…| n .  . 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. Presupunem existenţa recursivităţii stânga.        În gramaticile LL1 nu este permisă recursivitatea 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.

ca urmare. E1  +TE1 3. T1  ε 7. T  FT1 5. E1  ε 4. Fie gramatica:    EE+T|T TTF|F F  a | (E)  Gramatica foloseşte recursivitate stânga. F  a      . F  (E) 8. trebuie să o modificăm: 1. T1  FT1 6. E  TE1 2.

      Calculăm mulţimile: D1 = FIRST+ (TE1) = FIRST+ (F) = { ( . ) } D7 = FIRST+ ( (E) ) = { ( }   D8 = FIRST+ ( a ) = { a } . 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 = { + }  { ) }= { +.

 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.     .

  Pe baza mulţimilor FIRST şi FOLLOW calculate. Pe baza tabelei de analiză sintactică se poate implementa un analizor sintactic determinist cu structura: w SI a ISI VS x Automat finit ISO SO . se generează tabela de analiză sintactică.

.error – propoziţia este incorectă R n .replace – se înlocuieşte VS cu partea dreaptă a producţiei n. se generează tabela de analiză sintactică P . după care se scrie n în SO  Simbolul $ reprezintă terminatorul de şir pentru şirul de intrare (SI). Pe baza mulţimilor FIRST şi FOLLOW calculate.accept – propoziţia este corectă E .pop – scoate un simbol din stivă şi astfel:  {$} înaintează în SI VN   {$} A .

 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ă corespunzătoare coloanei terminalului respectiv cu R n    Sfârşit instrucţiune repetitivă . atunci pentru fiecare terminal din FOLLOW+(A). completează celula din tabelă corepunzătoare coloanei terminalului cu R n ◦ Dacă α =>* ε.

 Pentru exemplul anterior. tabela de analiză sintactică este (celulele goale reprezintă E): E E1 T T1 F a ( ) +  $ a 1 4 8 P ( 1 4 6 7 P P P P A 6 5 6 ) 3 + 2  $ 3 .

 Algoritm    sf  false repeta pana cand sf = true daca ◦ ◦ sau sau St(VS)  şi St(VS)=SI(ISI) atunci pop şi ISI = ISI + 1 St(VS)  şi St(VS) =! SI(ISI) atunci error St(VS)=AVN atunci replace n şi SO(ISO) = n şi ISO = ISO + 1 ◦ ◦  sau St(VS) = SI(ISI) = $ atunci accept sf  true altfel error  sf  true .

ε)} f(q. $. b. a) = {(q. la care se adaugă un element în plus. Funcţia de tranziţie: f(q. şi anume şirul de ieşire. a. aşa cum a fost definit pe slide-ul al 9-lea. ε)} pop accept     f(q. i. x) = {(e. ε)} error  . A) = {(q. $) = {(a. )} replace A  b conform tabelei de analiză sintactică f(q. Modelul matematic al acestui tip de analiză rămâne automatul finit cu stivă.

ax. x. y)  (e. Configuraţia automatului la un moment dat este dată de: (S. y) (q. i. x. $. x. A. ε. . ε. . y)    S = starea automatului x = şirul de intrare rămas de analizat  = stiva    y = şirul de iesire. ax. y) (q. yi) replace i. y) pop accept error    (q. . ε. x. conform tabelei de analiză . y)  (a. format din indicii producţiilor utilizate în derivări Stări posibile: (q. y) (q. $. y) (q. ε. a .

1485862) p (q.14858624863) (q.14858624) r (q.14858)p p (q.$.148586248) r(q.E1$.1485) r (q. Ex: a  a + a E$.1485862) r r(q. .$.T1E1$.a+a$ .$.a+a$.$.aT1E1$.+a$. ε) r (q.$.+a$.1485) p p(q.14) r (q.+TE1$.aT1E1$.14858624863) a (a.148) p p(q.1) r r(q.aT1E1$. FT1E1$.1485862486) r r (q.aT1E1$.aa+a$.14858)r (q.TE1$.$.aa+a$.a+a$.TE1$ .148) r (q.T1E1$.a$.148586248) p p(q.aa+a$ .FT1E1$.FT1E1$.a+a$.FT1E1$.+a$.E1$.148586) r r(q.aa+a$.a$.a$.

<lista> L1 -> ε .              <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 -> .

           FIRST+ { if } FIRST+ { else } + FOLLOW { ) until $} FIRST+ { repeat } FIRST+ {i} + FIRST {i} FIRST+ {<} + FIRST { <= } FIRST+ {i} FIRST+ {(} +(F1) = FOLLOW+(<factor>) = { := } U First(E1) = {:= < <=} U FOLLOW+(E1) FOLLOW 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 FIRST+ FIRST+ FOLLOW+     { { { { := < <= then ) until $ } i} .} )} .

 . propozitia de intrare) În calculul mulţimilor FIRST şi FOLLOW se merge în adâncime până la nivelul maxim posibil. (<instructiune>$.

avansare în şirul de intrare accept – încheiere execuţie program. propoziţia este corectă error . dacă da.încheiere execuţie program. 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 .        Structura maşinii de analiză LL(1) corespunde cu structura maşinii de analiză predictivă. se continuă execuţia cu instrucţiunea de la eticheta L. 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. propoziţia este incorectă .

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 scrie programul pentru maşina abstractă de analiză LL(1) pentru gramatica obţinuită. Să se construiască automatul de analiză sintactică LL(1).  Ex: Fie gramatica:          E→E+T E→T T→TF T→F F→a F→a(L) F→(E) L→E L→E.

.

.

.

.

    Ex: Fie gramatica: E  E+T | T T  T*F | F   a. F a | a(L) | (E) L  E | E.L Sa se modifice gramatica astfel încât să se obţină o gramatică LL(1). . Să se scrie programul maşinii abstracte de analiză predictivă LL(1) pentru gramatica obţinută. b.

   http://homedir.html .eecs.pdf http://inst.edu/~cs164/sp10/n otes/notes.berkeley.pdf http://facultate.jct.ro/cursuri/calculato are/limbaje_formale_si_translatoare59028.regielive.ac.il/~rafi/formcomp.

Sign up to vote on this title
UsefulNot useful