Analizor sintactic LL(1)
S A { a a 1 i-1 a i Algoritm liniar
LL(k) L = left (secvența este parcursă de la stânga la dreapta L = left (se folosesc derivări de stânga) Predicția are lungimea k S A { Principiu LL(k) In orice moment al analizei, acțiunea este unic determinată de: Partea închisă (a 1 a i ) Simbolul curent A Predicția a i+1 a i+k (lungime k) a a 1 i-1 a i a i+1 a i+k
FIRST k primele k simboluri terminale care se pot genera din α Definiție: rivări succesive dintr-o anumită formă propoziţională: FIRST k :(N [ ß)! P(ß k ) FIRST k (Æ) ={u u 2 ß k, Æ ) ux, u = k sau Æ ) u, u k} (primele k simboluri ale lui )
Definiție O gic este de tip LL(k) dacă pentru oricare două derivări de stânga: 1. S ) waæ ) st wøæ ) wx; st 2. S ) waæ ) st w Æ ) wy; st astfel încât FIRST k (x) =FIRST k (y) avem că: Ø =. st st
Teoremă Condiția necesară și suficientă pentru ca o gramatică să fie de tip LL(k) este ca pentru orice pereche de producții distincte ale aceluiași neterminal (A β, A γ,β γ) să fie verificată condiția: FIRST k (βα) FIRST k (γα)= Φ, α astfel încât S => uaα *
FOLLOW A ε S A { Ø FOLLOW k (A) următoarele k simboluri care se generează / urmează după A a a 1 i-1 a i Pentru aceasta se introduce o nouă funcţie [AU73]: FOLLOW :(N [ ß)! P(ß) FOLLOW(Ø) ={w 2 ß S ) ÆØ,w 2 FIRST( )} Pentru a construi un analizor sintactic LL(1) avem ne
Analizor sintactic LL(1) Predicția de lungime 1 Pași: 1) construire FIRST, FOLLOW 2) Construire tabel de analiză LL(1) 3) Analiza secvenței de baza tranzițiilor între configurații! Se execută 1 dată Teorema 3.2. [Şer87] O gramatică este de tip LL(1) dacă şi numai dacă pentru fiecare neterminal A cu producţiile A! Æ 1 Æ 2... Æ n, FIRST k (Æ i ) \FIRST k (Æ j )=; şi dacǎ Æ i ),FIRST(Æi )\FOLLOW(A) =;, 8i, j = 1,n,i6= j.
Construcție FIRST ØFIRST 1 notat FIRST ØObservații: Concatenare de lungime 1 Dacă L 1,L 2 sunt două limbaje peste alfabetul ß, atunci: L 1 L 2 = {w x 2 L 1,y 2 L 2,xy = w, w 1 sau xy = wz, w =1} ş i FIRST(ÆØ) =FIRST(Æ) FIRST(Ø) FIRST(X 1...X n )=FIRST(X 1 )... FIRST(X n )
Construcție tabel de analiză LL(1) Acțiuni posibile în funcție de: Simbolul curent N Σ Predicția posibilă Σ Se adaugă un caracter special $ ( N Σ) marcaj de stivă vidă = > tabel: Câte o linie pentru fiecare simbol N Σ {$} Câte o coloană pentru fiecare simbol Σ {$}
Reguli tabel LL(1) 1. M(A, a) =(Æ,i), 8a 2 FIRST(Æ),a 6=,A! Æ producţie în P cu numărul i; M(A, b) =(Æ,i), dacă 2 FIRST(Æ), 8b 2 FOLLOW(A),A! Æ producţie în P cu numărul i; 2. M(a, a) =pop, 8a 2 ß; 2 3. M($, $) = acc; 4. M(x,a)=err (eroare) în celelalte cazuri. Pentru gramatica din exemplul precedent, c
Observație O gramatică este de tip LL(1) dacă tabelul de analiză LL(1) nu conține conflicte (nu există mai mult de o valoare într-o celulă de tabel M(A,a)
Definire configurații și tranziții INPUT: Gramatica limbajului G = (N, Σ, P,S) Tabel de analiză LL(1) Secvența de analizat w =a 1 a n OUTPUT: Dacă (w L(G)) atunci șir de producții altfel locația erorii
Configurații LL(1) (α, β, π) Unde: α = stiva de intrare β = stiva de lucru π = banda de ieșire (rezultat) Configurația inițială: (w$,s$,ε) Configurația finală: ($, $, π)
Tranziții 1. Push punere în stivă (ux, AÆ$, º) ` (ux, ØÆ$, ºi), dacǎ M(A, u) =(Ø,i); (se scoate A și se pun simbolurile din β) de fapt, în stiva de lucru se efectuează următoarele op 2. Pop scoatere din stivă (din ambele stive) (ux, aæ$, º) ` (x, Æ$, º), dacă M(a,u)=pop 3. Acceptare tranziţia de acceptare, dacă s-a obţinut co ($, $, º) ` acc 4. Eroare - altfel în celelalte caz
Algoritml de analiză sintactică LL(1) aici