Sunteți pe pagina 1din 86

1

ANALIZA SINTACTICA
DESCENDENTA
TOP DOWN
Note de curs 2010-2011
Diana Stefanescu,
Diana.Stefanescu@ugal.ro
2
Analiza sintactica top-down
1. Cu revenire (backtracking)
2. Predictiva fara reveniri
2.a. Descendent recursiva
2.b. Descendent nerecursiva
2.3. Gramatici LL(k), LL(1)
3. Tratarea erorilor
3
Analiza sintactica top-down
verifica daca un program respecta regulile de sintaxa
ale limbajului sursa.
intrarea analizorului sintactic - sirul codurilor lexicale
furnizate de analizorul lexical.
In metodele de analiza sintactica prezentate in
continuare, analizorul lexical este apelat de catre cel
sintactic ori de cate ori este necesar un nou atom.
Regulile de sintaxa pe care analizorul sintactic trebuie
sa le cunoasca sunt descrise fie prin intermediul
gramaticilor BNF, fie prin diagrame de sintaxa.
4
BNF, (EBNF)
TipStruct := record ListaCamp end
Diagrama sintaxa
5
Analiza sintactica top-down
Se porneste de la simbolul de start
Se construieste derivarea stanga
Cheie: gasirea productiilor adecvate pentru
fiecare neterminal!
operatia de construire a arborilor de
derivare pornind de la radacina si
adaugind subarbori de derivare intr-o
ordine prestabilita.
6
1. ANALIZA SINTACTICA TOP-DOWN
CU REVENIRE (BACKTRACKING)
7
8
Backtracking EX
9
Exemplul 1
10
Exemplul 2
11
Ex. 2(cont.)
12
Ex. 2(cont)
13
Ex. 2(cont)
14
Ex. 2(cont)
15
Ex. 2(cont)
16
Ex. 2(cont)
17
Ex. 2(cont)
18
Ex. 2(cont)
19
Ex. 2(cont)
Implementarea utiliz.
backtracking;
Daca gramatica este
recursiva stinga algoritmul
poate conduce la aparitia
unui ciclu infinit.
Problema: care regula
trebuie aplicata din mai
multe posbilie????
Dezavantajul abordarii:
necesitatea revenirilor ->
complicarea algoritmilor si a
structurilor de date implicate
(deoarece automatul push
down corespunzator cazului
general este nedeterminist).
20
2. ANALIZA SINTACTICA TOP-DOWN
PREDICTIVA
21
2. ANALIZA SINTACTICA TOP-
DOWN PREDICTIVA
2.1. Analiza sintactica top-down
predictiva cu descendenti recursivi
2.2. Analiza sintactica top-down
predictiva cu descendenti nerecursivi
2.3. Gramatici LL(1), LL(k)
Alternativa ptr backtracking
Utila ptr instructiunile din lbj progr
22
2. ANALIZA SINTACTICA
PREDICTIVA (2)
Alternativa ptr backtracking
Utila ptr instructiunile din lbj progr
Restrictii asupra gramaticii:
Eliminarea recursivitatii stanga
Pentru a nu conduce la apeluri recursive infinite
Factorizare stanga
Pentru a nu conduce la ambiguitati
23
2. ANALIZA SINTACTICA
PREDICTIVA (3)
Idee ptr analizoarele predictive: identificarea
primelelor simboluri care pot fi generate in partea
dreapta a unei productii.
Simbolul curent de pe BI (lookahead) ghideaza
selectia regulii care va fi aplicata.
24
2. ANALIZA SINTACTICA TOP-DOWN
PREDICTIVA
2.1. CU DESCENDENTI RECURSIVI
2.1.1. Procedeul de analiza sintactica
predictiva cu descendenti recursivi
2.1.2. Analizoare sintactice predictive cu
descendenti recursivi
2.2. CU DESCENDENTI NERECURSIVI
2.3. GRAMATICI LL(1), LL(k)
25
2.1.1. Principii ale analizei
sintactice predictive cu
descendenti recursivi
Analizorul cu descendenti recursivi = colectie de
proceduri care se apeleaza intre ele, recursiv.
Ptr fiecare neterminal o procedura
Derivari succesive ale neterminalelor, pornind cu
simbolul start.
Selectia ramurii de derivare pentru un neterminal
oarecare A trebuie sa fie unic determinata de
simbolul curent din sirul de intrare
26
arborele sintactic nu apare explicit (ca o structura de date), ci poate fi
vazut mai degraba ca un arbore al apelurilor de proceduri (corespunzatoare
neterminalelor)
27
Procesul de analiza consta in derivari succesive
ale neterminalelor, incepand cu radacina.
Derivarile se materializeaza prin apelarea
procedurilor corespunzatoare simbolurilor ce
apar pe o anumita ramura de derivare. Selectia
ramurii de derivare pentru un neterminal
oarecare A, trebuie sa fie unic determinata de
simbolul curent din sirul de intrare (altfel
metoda cu descendenti recursivi nu se poate
aplica) si ea decurge astfel:
28
Procedeul an. sint. predictiva cu
descendenti recursivi
29
2.1.2. Analizoare sintactice
predictive cu descendenti recursivi
Fiecare diagrama de sintaxa se implementeaza
printr-o procedura, aplicand urmatoarele reguli:
1. Daca in diagrama apare o tranzitie spre un
neterminal, se va prevedea un apel la rutina
corespunzatoare acelui neterminal.
2. Daca in diagrama apare o tranzitie spre un
terminal, se testeaza daca atomul curent din
sirul de intrare este identic cu cel trecut in
diagrama:
a) DA: se face un apel la analizorul lexical;
b) NU: se va semnala eroare.
30
Regulile de sintaxa - descrise prin:
BNF (EBNF)
diagrame de tranzitie (sintaxa).
Abordare indicata pentru diagramele
deterministe
31
Functionarea analizorului
Se incepe cu st. initiala pentru simb. de start al gramaticii.
Analizor: in starea s, arc etichetat cu a spre o stare t si
simb. curent din sirul de intr. este a, atunci analizorul se
deplas. pe sirul de intr. cu o poz. la dreapta si trece in st. t.
St. s, arc etichetat cu neterm. A spre st. t, atunci analizorul
poate sa treaca in st. initiala coresp. neterminalului A, fara
sa avanseze pe sirul de intrare. Daca se reuseste sa se
ajunga la st. finala pentru A, se va trece in starea t ( se
observa ca in acest caz s-a "citit" A din sirul de intrare).
Daca din st. s exista o -tranzitie spre starea t, atunci
analizorul poate trece direct in starea t, fara sa se faca nici
o deplasare pe sirul de intrare.
32
Exemplu:
33
Exemplu:
34
Observatii
Abordarea presupune utilizarea unor proceduri
recursive.
Se poate implementa o abordare nerecursiva,
prin utilizarea unei stive, adica prin simularea
explicita a unui automat pushdown.
Dezavantajul analizei predictive: se poate pierde
semnificatia productiilor, ceea ce poate complica
pana la imposibil procesul de generare de cod.
35
Exemplul 2
36
Exemplul 2
37
Metoda pentru parserele predictive
38
Metoda pentru parserele predictive
39
Metoda pentru parserele predictive
40
2. ANALIZA SINTACTICA TOP-DOWN
PREDICTIVA
2.1. CU DESCENDENTI RECURSIVI
2.1.1. Procedeul de analiza sintactica
predictiva cu descendenti recursivi
2.1.2. Analizoare sintactice predictive cu
descendenti recursivi
2.2. CU DESCENDENTI NERECURSIVI
2.3. GRAMATICI LL(1), LL(k)
41
2.2. Analiz. sintactice predictive cu
descendenti nerecursivi
Acelasi principiu ca si in cazul analizorului cu
descendenti recursivi:
procesul de analiza se realizeaza prin derivari succesive ale
neterminalelor, incepand cu radacina
implementare diferita: derivarile nu se transpun ca secvente de
cod, ci se bazeaza pe structuri de date in care se indica ramurile
de derivare.
Structurile de date folosite sunt:
o tabela de analiza, ale carei intrari contin cate o productie a
gramaticii (dupa care se face derivarea la un moment dat).
o stiva de analiza in care se introduc simboluri ale gramaticii.
Abordarea nerecursiva, prin utilizarea unei stive,
simuleaza explicit un automat pushdown.
42
Modelul analizorului sintactic
predictiv cu descendenti nerecursivi
43
Algoritmul de analiza
(analiza LL(1))
Gramatica LL(1) (neambigue, nerecursive stinga
si factorizate)
Analiza sintactica top-down predictiva
Ptr un neterminal A, simbolul lookahead determina
unic productia care va fi aplicata
Tabela de analiza (matrice):
neterminale X terminale productii
IDEE: Incercarea permanenta de a identifica
simbolul curent de pe BI cu inceputul unei
productii pentru simbolul neterminal (din stanga
productiei) curent cel din varful stivei.
44
Tabela de analiza memoreaza functia
a unui APD.
Ptr APD determinist:
sirul de analizat - urmat de $
Initial - stiva contine S (in vf) si $.
La momentul t stiva contine o secventa de
simboluri terminale si neterminale.
Tabela de analiza linii-neterm, col-term sau $

45
Simularea APD determinist
Intrare: cuvant w si tabela de analiza M
pentru gramatica G.
Iesire:
daca w apartine L(G) derivarea stinga,
altfel - mesaj de eroare.
Configuratia initiala:
w$ pe banda de intrare
S$ in stiva.
46
Operatiile APDN
Inlocuieste neterminalul X din vf stivei
cu un sir care repr. p. dr. a unei A-
productii (expandare)
Sterge simbolul din vf. stivei cand
acesta coincide cu cel de pe BI
Avans pe BI
Criteriul de acceptare: al stivei vide.
47
Alg analiza LL(1)
initializeaza vf stivei si pozitie curenta pe BI
REPETA
fie X vf st si a car. curent de pe BI
DACA X este simb. terminal sau $
ATUNCI
DACA X = a ATUNCI descarca stiva si actualizeaza poz. cta pe BI
ALTFEL eroare si exit
ALTFEL /* X este un simbol neterminal */
DACA M[X,a] contine X --> Y1 Y2 ... Yk
ATUNCI
inlocuieste X din virful stivei cu Y1 Y2 ... Yk
afiseaza productia X --> Y1 Y2 ... Yk
ALTFEL eroare
PANA CAND X = $ /* stiva este goala */
48
Construirea tabelei de analiza
GRAMATICA
TABELA DE ANALIZA
PREDICTIVA
?
S -> ES
S -> |+S
E -> a|(S)

49
Construirea tabelei de analiza
Cum poate fi generata automat, pornind de
la o gram, tabela de analiza predictiva?
Functiile FIRST, FOLLOW
50
Constructia tab. analiza
51
Functia FIRST (1)
52
Functia FIRST (2)
53
Functia FIRST (3)
54
Functia FIRST - Exemple
55
Functia FOLLOW
$
56
Functia FOLLOW - Exemple
57
Algoritm de constr. a tab. de analiza:
INTRARE: gram;
IESIRE: tabela de analiza M
58
Tabela de analiza
59
Tabela de analiza - EXEMPLE
60
Tabela de analiza - EXEMPLE
match a; scoate a din stiva ($); avans pe BI ($)
.................... ACCEPTARE (crit. stivei vide)
a$ a$
aplica A a$ Aa$
match b; scoate b din stiva (Aa$); avans pe BI (a$) ba$ bAa$
aplica A bA ba$ Aa$
match c; scoate c din stiva (Aa$); avans pe BI (ba$) cba$ cAa$
aplica A cA cba$ cAa$
match b; scoate b din stiva (Aa$); avans pe BI (cba$) bcba$ bAa$
aplica B b bcba$ BAa$
aplica S BAa bcba$ S$
Actiune Intrare Stiva
61
Tabela de analiza - EXEMPLE
62
Tabela de analiza - EXEMPLE
a + a * a
63
2. ANALIZA SINTACTICA TOP-DOWN
PREDICTIVA
2.1. CU DESCENDENTI RECURSIVI
2.1.1. Procedeul de analiza sintactica
predictiva cu descendenti recursivi
2.1.2. Analizoare sintactice predictive cu
descendenti recursivi
2.2. CU DESCENDENTI NERECURSIVI
2.3. GRAMATICI LL(1), LL(k)
64
2.3. GRAMATICI LL(1), LL(k)
65
Gramatici si parsere LL(k)
Ptr analizoarele sintactice top-down exista
clasa de gramatici LL(k) ptr care se poate
construi un translator PD determinist.
Gramaticile regulate constr. AFD LL(0)
GIC ptr care un simbol lookahead
(APD) LL(1): FIRST(), FOLLOW()
GIC - ptr care k simboluri lookahead
(APD) LL(k)
OBS: O gram LL(k) este si LR(k).
66
67
Gramatici si limbaje LL(1)
O GIC pentru care in tabela de analiza nu exista
intrari multiple (cu mai multe alternative) se
numeste gramatica LL(1).
Denumire
O gramatica LL(1) este:
neambigua
nerecursiva stanga (factorizata)
gramatica pentru expresii aritmetice este LL(1)
gramatica pentru instructiunea if nu este LL(1).
68
Gramatici si limbaje LL(1) (cont)
Un limbaj este LL(1) daca poate fi generat
de o gramatica LL(1).
69
Gramatici si limbaje LL(1) (cont)
70
Gramatici si limbaje LL(k)
Gramatici LL(k) - folosesc tab. de anal. LL(k)
Tabele de analiza LL(k):
linii etichetate cu neterminale
coloane etichetate cu o secventa de k terminale.
k-simboluri lookahead - decizie asupra regulii
Observatii:
Gramaticile LL(k) rar utilizate in practica.
O gram LL(k) este si LR(k)!!!!
Proprietati gram LL(k):
O gramatica LL(k) este si gramatica LL(k+1), ptr orice k>=1
Pentru orice k>=1, daca G este LL(k), atunici G este neambigua.
71
O posibilitate de analiza sintactica predictiva
determinista este cea a analizei LL care foloseste
un subset al gramaticilor independente de
context - gramaticile LL(k) respectiv LL(k) tari.
Studiul compilatoarelor a relevat faptul ca de
cele mai multe ori limbajele de programare pot fi
derivate de o gramatica LL(1), eventualele
exceptii fiind rezolvate prin tratarea lor ca si
cazuri speciale.
72
3. ERORI DE SINTAXA IN
ANALIZA PREDICTIVA
73
Tratarea erorilor
Compilatorul:
Detecteaza programele invalide
Le translateaza in progr valide
Tipuri de erori
Faza testare executie
Verif. tipului int x; y=x(20); semantica
An. sintactic 2 * % 3 sintactica
An. lexical $ lexicala
Detectata de Exemplu Tip eroare
74
Tratarea erorilor de sintaxa
Raportarea erorilor (clar, cu acuratete)
Recuperare rapida
Sa nu incetineasca procesul de
compilare
Dificil!!!
75
Abordari in tratarea erorilor
De la simplu la complex
Panic mode
Erori ale productiilor
Corectii automate locale sau globale
Nu toate aceste moduri de tratare a
erorilor sunt prezente in toate
generatoarele de analizoare lexicale!!!
76
3.1. PANIC MODE
Simpla, cea mai populara metoda
La intalnirea unei erori:
Neglijeaza atomul pana cand intalnesti un nou
atom cu rol clar
Continua de aici
Astfel de atomi s.n. atomi de sincronizare
De obicei sunt terminatori de instr sau expr.
77
3.2. Erori ale productiilor
Ideea: se specifica in gramatica erorile
cele mai des intalnite
Ex: 5a (pentru 5*a)
Se adauga productia: S --> | SS
Dezavantaj: complicarea gramaticii
78
3.3. Corectii locale si globale
Ideea: de a gasi un program corect, cat mai
apropiat
Se incearca inserari si stergeri ale atomilor
Cautari exhaustive
Dezavantaje:
Greu de implementat
Incetinire down parsing
De multe ori, progr obtinut nu este cel vizat
Panic-mode suficient!!!!
79
3.4. Panic mode in analiza predictiva
Eroare:
in virful stivei se gaseste un terminal care
nu coincide cu terminalul curent de pe
banda de intrare
daca pentru neterminalul din virful stivei
(fie el A) si terminalul curent de pe banda
de intrare (fie el a), in tab. M nu exista o
prod. (M[A, a] = ).
80
3.4. Panic mode in analiza predictiva
(cont)
metoda continuare in caz de eroare:
ignorarea de pe banda de intrare a simbolilor
care urmeaza pina la intalnirea unui simbol
dintr-o multime numita multime de
sincronizare.
Alegerea multimii de sincronizare:
astfel incit analizorul sa poata face o revenire rapida
pentru erorile cele mai frecvente.
se aplica euristici.
81
3.4. Panic mode in analiza predictiva
(cont)
Euristici pentru construirea multimii de sincronizare
(sinc):
Pentru neterm. A din in virful stivei, sinc va contine simb.
din FOLLOW(A).
sinc pentru o structura sintactica va contine simbol.
corespunzatoare structurilor superioare.
se adauga simbol. din FIRST(A) la sinc pentru A
Utilizand functiile FIRST si FOLLOW, se
completeaza tabela M cu informatiile referitoare la
multimea simbolilor de sincronizare.
82
3.4. Panic-mode (cont.)
Un analizor predictiv incearca sa
potriveasca neterminalele si terminalele din
vf stivei cu intrarea ramasa.
Pot aparea 2 tipuri de conflicte:
T-conflicte: terminalul b din vf stivei nu se
potriveste cu urmatorul atom de intrare.
N-conflicte: ptr. neterminalul B din vf stivei si
atomul lookahead b de pe BI, intrarea M[B, b]
din tabela de analiza este goala.
83
3.4. Panic-mode (cont.)
Rezolvarea conflictelor
Rez. T-confl.: SKIP (ignora si avanseaza) atomul din
sirul de intrare.
Rez. N-confl.:
Skip ( = ignora si avanseaza) atomul b de pe BI
Daca M[B, b] este vida, etichetata sinc, atunci skip (pop si
ignora) neterm B.
Skip atomii din sirul de intrare pana cand este descoperit un
element din FIRST(B), apoi continua analiza normal. Multimea
de sincronizare este aici FIRST(B).
Skip atomii din sirul de intrare pana cand este descoperit un
element din FOLLOW(B), atunci skip B si continua analiza
normal (variatiune a met panic-mode)
Delimitatorii ca ; in C pot fi adaugati la cele 2 mult de
sincronizare anterioare.
84
Panic-mode - EXEMPLU
Utilizind fct FIRST si FOLLOW se completaza M cu inf. despre
simbolurile de sincronizare.
| a | + | * | ( | ) | $ | sinc |
----+--------+--------+--------+------+--------+--------+------|
E |E -> TE'| | |E->TE'| sinc | sinc | ) $ |
----+--------+--------+--------+------+--------+--------+------|
E' | |E'->+TE'| | |E' --> ?|E' --> ?| ) $ |
----+--------+--------+--------+------+--------+--------+------|
T |T -> FT'| sinc | |T->FT'| sinc | sinc |+ ) $ |
----+--------+--------+--------+------+--------+--------+------|
T' | |T'--> ? |T'->*FT'| |T' --> ?|T' --> ?|+ ) $ |
----+--------+--------+--------+------+--------+--------+------|
F | F --> a| sinc | sinc |F->(E)| sinc | sinc |+*)$ |
---------------------------------------------------------------+
85
Panic-mode EXEMPLU (2)
DACA M[A,a] nu contine nici o valoare
ATUNCI avanseaza peste simbolul curent (a).
DACA M[A,a] = sinc
ATUNCI descarca vf stivei ptr a continua analiza cu ce
urmeaza dupa simb. din virful stivei.
DACA terminalul din virful stivei nu se potriveste cu
term de la intrare
ATUNCI se descarca terminalul din virful stivei.
86
Panic-mode EXEMPLU (2)

S-ar putea să vă placă și