Sunteți pe pagina 1din 79

1.

Introducere Curs1 LFT


Limbajele de nivel nalt au o serie de avantaje n raport cu limbajele de asamblare.
Pentru a putea ns folosi limbaje de nivel nalt, trebuie s existe posibilitatea de a converti
programele scrise n aceste limbaje ntr-o form binar. Aceast necesitate a dus la dezvoltarea
translatoarelor sau compilatoarelor programe care accept o reprezentare textual a unui
algoritm exprimat printr-un program surs i care produc o reprezentare a aceluiai algoritm
exprimat ntr-un alt limbaj, limbajul obiect sau un limbaj ec!ivalent.
"ranslatorul este deci un program care traduce programele scrise de utilizator #ntr-un
limbaj$ n programe ec!ivalente #ntr-un alt limbaj$. %ac acestea din urm sunt programe n cod
main sau un limbaj apropiat de limbajul calculatorului, translatorul se numete compilator.
Programul utilizatorului se numete program surs, iar programul n cod main ob&inut se
numete program obiect. 'ntre cele dou programe trebuie s existe o rela&ie de ec!ivalen& n
ceea ce privete efectul lor asupra calculatorului.
(xecu&ia unui program n limbaj simbolic are loc n dou faze)
*aza +. ,ompilarea) Program surs ,ompilator Program obiect
*aza -. (xecu&ia propriu-zis) %ate ini&iale ale programului Program obiect .ezultate
'n faza de translatare, calculatorul execut programul compilator, iar n faza de execu&ie
propriu-zis, calculatorul execut programul obiect, adic citirea datelor ini&iale, prelucrarea lor i
memorarea sau tiprirea rezultatelor.
Pentru scrierea unui compilator, trebuiesc foarte bine definite at/t limbajul surs, c/t i
limbajul &int. Aceasta nseamn c ambele limbaje trebuie s fie formale.
0n limbaj are dou aspecte) sintax i semantic. 1intaxa stabilete care text este corect
din punct de vedere gramatical, iar semantica stabilete modul n care se deriv semnifica&ia unui
text corect din punct de vedere gramatical.
(xist numeroase formalisme i instrumente soft2are pentru descrierea sintaxei unui
limbaj formal. Pentru descrierea semanticii ns, formalismele i instrumentele existente nu sunt
at/t de simple i uor de utilizat ca i specifica&iile de sintax.
2. Clasificarea i structura translatoarelor
0n translator poate fi definit formal ca o func&ie av/nd domeniul de defini&ie limbajul surs
i mul&imea valorilor func&iei limbajul obiect sau un limbaj ec!ivalent #destina&ie$.
Translator
Instruciunile
limbajului surs
Instruciunile
limbajului
destinaie
'n dezvoltarea translatoarelor, sunt implicate cel pu&in trei limbaje) limbajul surs de
translatat, limbajul obiect sau destina&ie i limbajul gazd folosit la implementarea translatorului.
%ac translatarea are loc n mai multe etape, pot exista i alte limbaje intermediare. %esigur,
limbajul gazd i limbajul obiect nu sunt cunoscute de utilizatorul limbajului surs.
2.1. Diagrame T
Pentru descrierea programelor i n particular a compilatoarelor, exist o reprezentare
sc!ematic consacrat, numit diagram ", introdus de 3ratman n +45+.
6 diagram " pentru un program general este de forma)
Numele programului
Limbajul de
implementare
Date de intrare Date de ieire
1
6 diagram " pentru un translator general este de forma)
Numele translatorului
Limbajul gazd de
implementare a
translatorului
Limbaj surs Limbaj destinaie
2.2. Clasificarea translatoarelor.
- Asamblorul. "ermenul de asamblor este asociat cu translatoarele care transform
instruc&iuni scrise n limbaj de nivel cobor/t n cod main, care poate fi executat direct. %e
obicei liniile individuale ale programului surs corespund cu o instruc&iune la nivel main.
.olul asamblorului este deci s converteasc reprezentrile simbolice ale instruc&iunilor n
configura&ii de bi&i, reprezent/nd ec!ivalentele n cod-main ale instruc&iunilor.
- Macroasamblorul este un asamblor care permite utilizarea macrodefini&iilor. (l utilizeaz o
prim trecere i pentru colectarea macrodefini&iilor.
.ezultatul asamblrii este un text n form binar n care doar referin&ele externe sunt
pstrate n form simbolic n tabele asociate sec&iunilor. ,odul binar al sec&iunilor este nso&it de
informa&ii ce indic locul referin&elor relocabile pentru ca, n momentul ncrcrii, valorile acestora
s se poat transforma n referin&e absolute.
,ombinarea acestor sec&iuni ntr-un program executabil se face prin rezolvarea referin&elor
externe #nlocuirea numelor simbolice cu adrese de memorie$ i adugarea eventual a rutinelor
din bibliotecile standard, i ele pstrate sub form relocabil. Aceste opera&ii sunt deobicei fcute
de un editor de legturi # lin7age editor$. Programul furnizat de acesta este adus n memorie de
ncrctor #loader$.
- Compilatorul este de obicei un translator care traduce instruc&iuni de nivel nalt n cod
main, care poate fi executat direct. Liniile individuale din programul surs corespund de
obicei cu mai multe instruc&iuni la nivel main.
- reprocesorul este un translator care traduce dintr-un superset al unui limbaj de nivel nalt
n limbajul de nivel nalt original, sau care face simple substituiri de text nainea procesului
de translatare propriu-zis. %e exemplu, exist numeroase preprocesoare de *6.".A8
structurat care traduc din versiuni structurate ale *6.".A8-ului n *6.".A8 obinuit.
- Translatorul de ni!el "nalt este un translator care traduce un limbaj de nivel nalt ntr-un alt
limbaj de nivel nalt, pentru care exist deja compilatoare sofisticate pentru un numr mare
de maini.
- Interpretorul este un program care, primind un program surs, l prelucreaz n prealabil
pentru a-l aduce ntr-o form mai simpl, dup care l execut simul/nd execu&ia n limbaj
surs. *orma intermediar executat de de interpretor este de fapt un alt limbaj mai simplu,
mai apropiat de limbajele de asamblare. Principalul avantaj al folosirii unui interpretor este
portabilitatea foarte simpl a unui limbaj, prin implementarea mainii virtuale pe un nou
!ard2are. 'n plus, deoarece instruc&iunile sunt interpretate i executate n timpul rulrii, pot fi
implementate limbaje foarte flexibile.
- Compilatoarele incrementale mbin calit&ile compilatoarelor cu cele ale interpretoarelor.
Programul surs este divizat de compilator n mici por&iuni numite incremente. Acestea
prezint o oarecare independen& sintactic i semantic fa& de restul programului.
9ncrementele sunt traduse de compilator. (xecu&ia are loc interpretativ, permi&/ndu-se
interven&ia utilizatorului at/t n timpul compilrii c/t i n timpul execu&iei.
- Decompilatorul sau de#asamblorul sunt tremeni care se refer la translatoare care au ca
intrare un cod obiect i regenereaz codul surs ntr-un limbaj de nivel mai nalt. 'n timp ce
acest lucru se poate realiza destul de bine pentru limbaje de asamblare, este mult mai dificil
de implementat pentru limbaje de nivel nalt cum ar fi ,, Pascal.
,ele mai multe compilatoare nu produc cod main cu adrese fixe, ci o form cunoscut
sub numele de :semicompilat:, :simbolic binar: sau form relocatabil. .utinele astfel
2
compilate sunt legate cu ajutorul unor programe numite editoare de legturi, lin7er, care pot fi
privite ca ultima etap n procesul de translatare. Limbajele care permit compilarea separat
a pr&ilor unui program depind esen&ial de existen&a acestor editoare de legturi.
%iagramele " pot fi combinate pentru a arta interdependen&a translatoarelor, editoarelor
de legturi etc.
CO!IL"TO#$%&%
Limbajul gazd de
implementare a
compilatorului
!rogram 'n
limbaj surs L1
!rogram 'n cod
relocabil L2
LIN($%&%
Limbajul gazd de
implementare a
editorului de legturi
Cod relocabil L2 !#O)$%&%
*ibliotec de
programe
6bserva&ie. 0n compilator nu necesit un limbaj &int #de asamblare sau limbaj main$
real. %e exemplu, compilatoarele ;ava genereaz cod pentru o main virtual numit :;ava
<irtual =ac!ine: #;<=$. 9nterpretorul ;<= interpreteaz apoi instruc&iunile ;<= fr nici o
translatare ulterioar.
2.$. Fa#ele transla%iei.
"ranslatoarele sunt programe complexe, care necesit o abordare sistematic. 9maginea
unui translator este cea a unui ir de transformri n cascad a programului surs n reprezentri din
ce n ce mai apropiate de limbajul destina&ie.
Procesul de transla&ie se divide ntr-o serie de faze. & fa# este o operaie unitar de
transformare a programului surs dintr-o reprezentare n alta.
,ea mai simpl descriere mparte procesul de translatare ntr-o faz analitic urmat de o
faz sintetic.
- 'n fa#a analitic se analizeaz programul surs pentru a determina dac el corespunde
cu restric&iile sintactice i static semantice impuse de limbajul surs.
- 'n fa#a sintetic se genereaz efectiv codul obiect n limbajul destina&ie.
,omponentele translatorului care ndeplinesc aceste faze majore se mai numesc :front end: i :bac7
end:. Prima este total independent de main, n timp ce a doua depinde puternic de maina
destina&ie.
'n cadrul acestei structuri exist componente mai mici sau faze, aa cum se prezint n
figura urmtoare)
- 1ec&iunea de gestionare caractere este cea care comunic cu lumea exterioar, prin sistemul
de operare, pentru citirea caracterelor care formeaz textul surs. ,um setul de caractere i
gestiunea fiierelor variaz de la sistem la sistem, aceast faz este de obicei dependent de
main sau de sistem de operare.
- Anali#orul le(ical )*canner+ preia textul surs sub forma unei secvene de caractere i le
grupeaz n entiti numite atomi )to,ens+. Acetia sunt simboluri ca identificatori, iruri,
constante numerice, cuvinte c!eie cum ar fi while i if, operatori ca <= etc. Atomilor li se
atribuie coduri le(icale, astfel c, la ieirea acestei faze, programul surs apare ca o secven
de asemenea coduri.
+
)estiune caractere
"nalizor le,ical
-.canner/
"nalizor semantic
"nalizor sintactic
-!arser/
#aportare erori
Cod surs
)estiune tabele
0az analitic
-0ront end/
)enerator de cod
intermediar
Optimizator de cod
)enerator de cod
1inal
Cod obiect
0az sintetic
-*ac2 end/
- Anali#orul sintactic )arser+ are ca scop gruparea atomilor rezultai n urma analizei lexicale
n structuri sintactice. 6 structur sintactic poate fi vzut ca un arbore ale crui noduri
terminale reprezint atomi, n timp ce nodurile interioare reprezint iruri de atomi care
formeaz o entitate logic. (xemple de structuri sintactice) expresii, instruciuni, declaraii etc.
- Pe durata analizei sintactice, de obicei are loc i o anali# semantic, adic efectuarea unor
verificri legate de compatibilitatea tipurilor datelor cu operaiile n care ele sunt implicate, de
respectarea regulilor de vizibilitate impuse de limbajul surs.
- -eneratorul de cod intermediar este o faz sintetic care, n practic, poate fi integrat n faze
anterioare ori poate fi omis n cazul translatoarelor foarte simple. 'n aceast faz are loc
transformarea arborelui sintactic ntr-o secven de instruciuni simple, similare
macroinstruciunilor unui limbaj de asamblare. %iferena dintre codul intermediar i un limbaj
de asamblare este n principal aceea c, n codul intermediar nu se specific registrele utilizate
n operaii. (xemple de reprezentri pentru codul intermediar) notaia postfix, instruciunile cu
trei adrese etc. ,odul intermediar prezint avantajul de a fi mai uor de optimizat dec/t codul
main.
- &ptimi#atorul de cod este o faz opional cu rolul de a modifica poriuni din codul
intermediar generat, astfel nc/t programul rezultat s satisfac anumite criterii de performan
viz/nd timpul de execuie i>sau spaiul de memorie ocupat.
3
- -eneratorul de cod final este faza cea mai important din sec&iunea :bac7 end: . 'n aceast
faz se preia ieirea de la faza precedent i se genereaz codul obiect, prin decizii privind
loca&iile de memorie pentru date, generarea de coduri de acces pentru aceste date, selectarea
registrelor pentru calcule intermediare i indexare etc. Astfel, instruciunile din codul intermediar
#eventual optimizat$ sunt transformate n instruciuni main #sau de asamblare$.
- 0nele translatoare continu cu o faz numit .peep/ole optimi#er. n care se fac ncercri de
reducere a unor opera&ii inutile prin examinarea n detaliu a unor secven&e scurte din codul
generat.
- 0n translator folosete inevitabil o structur de date complexe, numit tabela de simboluri.
Aceast tabel memoreaz informaii despre simbolurile folosite n programul surs i asociaz
propriet&i acestor simboluri #tipul lor, spa&iul de memorie necesar pentru variabile sau valoarea
lor pentru constante$. ,ompilatorul face referire la aceast tabel aproape n toate fazele
compilrii.
- Tratarea erorilor. 0n compilator trebuie s fie capabil s recunoasc anumite categorii de erori
care apar n programul surs. "ratarea unei erori presupune detectarea ei, emiterea unui mesaj
corespunztor i revenirea din eroare, adic, pe c/t posibil, continuarea procesului de compilare
p/n la epuizarea textului surs, astfel nc/t numrul de compilri necesare eliminrii tuturor
erorilor dintr-un program s fie c/t mai mic. Practic, exist erori specifice fiecrei faze de
compilare.
2.0. Translatoare cu mai multe treceri
%ei conceptual procesul de translatare este divizat n faze, deseori translatoarele sunt
divizate n treceri, n care fazele pot fi combinate ori ntre&esute.
"radi&ional, o trecere citete programul surs, sau ieirea unei treceri anterioare, face unele
transformri i scrie ieirea sa ntr-un fiier intermediar care va fi citit de o trecere ulterioar.
Aceste treceri pot fi gestionate de diferite pr&i integrate n acelai compilator, sau pot fi
gestionate prin rularea a dou sau mai multe programe separate.
"recerile pot comunica folosind forme specializate ale propriului lor limbaj intermediar, sau
pot folosi structuri de date interne n loc de fiiere, dar se pot face i mai multe treceri folosind acelai
cod surs original.
8umrul trecerilor depinde de o varietate de factori. 0nele limbaje necesit cel pu&in dou
treceri pentru a genera mai uor codul obiect. ,ompilatoarele cu mai multe treceri folosesc de obicei
mai pu&in memorie i sunt mai performante n optimizarea codului i raportarea de erori, dar sunt
mai lente dec/t cele cu o singur trecere.
'n practic, cel mai des sunt folosite compilatoare cu dou treceri, n care prima trecere este
un translator de nivel nalt care convertete programul surs n limbaj de asamblare, sau c!iar ntr-un
alt limbaj de nivel nalt pentru care exist deja un translator eficient.
2.1. Interpretoare2 compilatoare incrementale2 emulatoare
,ompilatoarele descrise mai sus au c/teva propriet&i comune)
- Produc cod obiect care poate rula cu viteza complet a mainii &int.
- 0zual compileaz o secven& ntreag de cod nainte de orice execu&ie.
'n unele medii interactive, exist necesitatea rulrii unor pr&i ale aplica&iei fr a fi necesar
pregtirea aplica&iei n ansamblu, ori se permite utilizatorului modificarea din mers a ac&iunii
urmtoare.
Astfel de sisteme folosesc deseori un interpretor. 9nterpretorul este un translator care
accept efectiv un program surs i l execut direct, fr a produce aparent nici un cod obiect.
9nterpretorul preia din programul surs instruc&iunile una c/te una, le analizeaz i le :execut: una
c/te una. (vident, pentru ca un astfel de scenariu s poat func&iona, este necesar impunerea unor
restric&ii severe programului surs. 8u pot fi folosite structuri complexe de program, cum ar fi de
exemplu proceduri imbricate dar prezint avantajul unor interogri on-line pentru baze de date etc.
,ompilatoarele incrementale mbin calit&ile compilatoarelor cu cele ale interpretoarelor.
Programul surs este divizat de compilator n mici por&iuni numite incremente care prezint o
oarecare independen& sintactic i semantic fa& de restul programului. ,ompilatorul produce
un cod incremental care este suficient de simplu pentru a satisface restric&iile impuse de un
4
interpretor. 9nterpretorul :execut: algoritmul original prin simularea unei maini virtuale pentru
care codul intermediar numit i pseudocod este efectiv codul main.
%istinc&ia dintre codul main i pseudocod este ilustrat n figura urmtoare)
%,ecuie
Instruciuni 'n
cod main
Cod intermediar
-pseudocod/
%tapa 1
Instruciunile
limbajului surs
%tapa 2
-'ncrcat/
Interpretor
-'ncrcat/
%ac se parcurge numai etapa + de compilare, pseudocodul este intrare n interpretor. %ac
se parcurge i etapa -, rezultatul este un program obiect cu instruc&iuni n cod main care poate fi
lansat n execu&ie independent.
%esigur, orice main real poate fi vzut ca un interpretor specializat care preia din
programul surs instruc&iunile una c/te una, le analizeaz i le :execut: una c/te una. 'ntr-o main
real aceast execu&ie este realizat prin !ard2are, deci mult mai rapid. 1e poate conclude c se
pot scrie programe care permit unei maini reale s emuleze orice alt main real, cu dezavantajul
vitezei reduse. Aceste programe sunt numite emulatoare i sunt uzual folosite n proiectarea de noi
maini i a soft2are-ului care va rula pe acestea.
0na din cele mai cunoscute aplica&ii de compilator incremental portabil este :PascalP:
#?uric! +4@+$ care const din A componente)
- 0n compilator Pascal, scris ntr-un subset foarte complet al limbajului, numit Pascal-P. 1copul
acestui compilator este translatarea programelor surs Pascal-P ntr-un limbaj intermediar foarte
bine definit i documentat, numit P-code, care este :codul main: pentru un calculator ipotetic
bazat pe stiv, calculator numit P-mac!ine.
- 6 versiune compilat a primului compilator, astfel nc/t primul obiectiv al compilatorului este
compilarea lui nsui.
- 0n interpretor pentru limbajul P-code scris n Pascal. 9nterpretorul a servit n principal ca model
pentru scrierea unor programe similare pentru alte maini, n scopul emulrii unei maini
ipotetice P-mac!ine.
3. Analiza lexical (scanner) C2
%ste prima 1az a procesului de compilare i are rolul de a trans1orma programul surs5 6zut ca
un ir de caractere 'ntr7un ir de simboluri numite atomi le,icali -tokens/$
ulimea tuturori atomilori le,icali detectabili 'n programul surs se 'mparte 'n clase de atomi8
- clasa identi1icatorilor
- clasa constantelor 'ntregi -numerelor 'ntregi/
- clasa numerelor reale
- clasa operatorilor
- clasa cu6intelor c9eie$
:n urma analizei le,icale5 1iecare atom le,ical identi1icat primete o codi1icare intern5 iar
programul surs se trans1orm 'ntr7un ir de coduri aranjate 'n ordinea detectrii atomilor$
Dei rolul principal al analizei le,icale este detectarea atomilor le,icali5 putem 6orbi de operaii
cone,e analizei le,icale5 cum sunt8 eliminarea spaiilor i comentariilor5 numrarea liniilor surs -pentru
raportarea de erori/ etc$
3.1. Descriere
3.1.1. Analiza lexical ca etap specific a compilrii
"naliza le,ical este o inter1a 'ntre programul surs i analizorul sintactic -parser/$
#olul analizorului le,ical este asemntor cu cel al analizorului sintactic8
- identi1icarea con1orm anumitor reguli a unitilor distincte 'n cadrul programului
- semnalarea de erori 'n cazul abaterii de la aceste reguli
;
- codi1icarea unitilor identi1icate etc$
0unciile analizorului le,ical ar putea 1i preluate de analizorul sintactic$
Cu toate acestea5 'n majoritatea cazurilor5 se pre1er separarea celor dou acti6iti 'n 1aze distincte
din urmtoarele moti6e8
a/ analizorul le,ical este mare consumator de timp deoarece necesit preluarea 'nregistrare cu
'nregistrare a te,tului de pe suportul e,tern5 acesul la 1iecare caracter5 comparaii ale atomilor le,icali cu
mulimi de caractere cunoscute 'n 6ederea clasi1icrii5 cutari 'n tabele etc$ De aceea5 pentru a obine un
analizor le,ical mai e1icient se recomand implementarea analizorului 'n limbaj de asamblare5 spre
deosebire de celelalte 1aze 'n care implementarea se 1ace 'n limbaje de ni6el 'nalt$
b/ te,tul rezultat 'n urma analizei le,icale5 deci cel primit de analizorul sintactic este mai simplu5
adic sunt eliminate spaiile i comentariile5 numrul atomilor le,icali este mult mai mic dec<t numrul
caracterelor din te,tul surs$
"nalizorul le,ical preia ast1el sarcina analizei unor construcii di1icile care ar complica i mai mult
procesul de analiz sintactic$
c/ sinta,a atomilor le,icali este mai simpl dec<t a construciilor gramaticale de limbaj5 se poate
e,prima prin gramatici regulate i se poate analiza cu ajutorul automatelor 1inite5 e,ist<nd te9nici mai
simple dec<t pentru analiza sintactic=
d/ prin separarea 1azelor5 compilatorul poate 1i scris modular5 deci realizat 'n ec9ip=
e/ separarea crete portabiliatatea compilatorului 'n sensul c pentru o 6ersiune nou a limbajului
6a 1i necesar s 1acem modi1icri doar la analiza le,ical5 nu i la analiza sintactic$
3.1.2. Modele de comunicare analizor lexical-analizor sintactic.
Din punct de 6edere al interaciunii dintre analizorul le,ical i cel sintactic e,ist + posibiliti8
1$ "nalizorul le,ical proceseaz te,tul surs 'ntr7o trecere separat5 'nainte de a 'ncepe analiza
sintactic= 'n acest caz5 cu6intele sunt e,trase din programul surs i depuse 'ntr7un 1isier sau 'ntr7un tablou
de mari dimensiuni 'n memorie$
2$ "nalizorul sintactic apeleaz analizorul le,ical ori de c<te ori acesta are ne6oie de un nou
cu6<nt= este 6arianta pre1erat5 deoarece nu este necesar construirea unei 1orme interne a programului
surs 'nainte de analiza sintactic$ >n alt a6antaj al metodei const 'n 1aptul c pentru aceleai limbaj pot 1i
construite analizoare le,icale multiple5 'n 1uncie de suportul de stocare a te,tului surs$
+$ Cele dou analizoare 1uncioneaz 'n regim de corutin5 adic cele 2 1aze sunt simultan acti6e5
trans1er<nd controlul una alteia atuci c<nd este necesar$
odelul ales 'n continuare este cel de analizor sintactic care apeleaz analizorul le,ical -2/$
3.2. Noiuni specifice analizorului lexical.
3.2.1. Codificarea atomilor lexicali
ulimea atomilor detectabili este organizat 'n clase de atomi$ 0iecare atom detectat 'n
programul surs primete o codi1icare intern -ir de in1ormaii/ care descrie complet atomul respecti68
- clasa 1iecarui atom
- 6aloarea sa -dac este un numr/ sau adresa unde poate 1i gsit dac este un ir de caractere$
Codul lexical este un numr 'ntreg ce identi1ic atomul i care este asociat 'n 1elul urmtor8
dac atomul le,ical aparine unei clase cu numr cunoscut de elemente -clasa operatorilor5
clasa cu6intelor c9eie/5 1iecrui atom al clasei i se asociaz un numr distinct$ De e,emplu8
pentru ?@?codul 1;= pentru ?7? codul 1A= etc$ "st1el5 prin acest numr intern5 atomul 1i
identi1icat complet$
clasei cu un numr nedeterminat de elemente -posibil in1init/ i se asociaz un unic cod intern=
distincia dintre atomii ce aparin unei asemenea clase se 1ace prin suplimentarea codului
clasei cu alte in1ormaii$ "st1el5 la codul intern se adaug adresa din tabela de simboluri5 'n
timp ce 'n tabela de simboluri se memoreaz un identi1icator$
De e,emplu8
7 un simbol a 6a primi ca i codi1icare codul clasei simbolurilor i o adres care pointeaz spre
tabela de simboluri
7o constant 6a primi ca i codi1icare codul clasei constantelor i 6aloarea constantei$
B
a clasa 1 tabela de simboluri 24 clasa 2
6aloare adresa a 6aloare 24
identi1icator 6aloare
In1ormaiile suplimentare ataate codului clasei atomului le,ical se numesc atribute$ :n majoritatea
cazurilor5 ca i 'n cel de sus5 este su1icient un singur atribut8 6aloarea constantei -numere 'ntregi5 reale/ sau
6aloarea adresei din tabela de simboluri$
"6antajul codi1icrii atomilor le,icali const 'n preluarea unitar de ctre analizorul sintactic a
datelor 1urnizate de analizorul le,ical5 'n sensul c analizorul sintactic nu 6a prelua atomii le,icali -iruri de
caractere de lungime 6ariabil/5 ci numere5 codi1icri ale atomilor$
Exemplu: Deseori5 un atom -to2en/ are structura din sec6ena urmtoare8
Ci1nde1 L%&DE
Cde1ine L%&DE
tFpede1 enum G N"%5 N>*%#5 L*#"C%5 #*#"C%5 L!"#%N5 #!"#%N5 "..I)N5
.%ICOLON5 !L>.5 IN>.5 %##O# H TO(%NT=
tFpede1 struct
G
TO(%NT tFpe=
union G
int 6alue= IJ tFpe KK N>*%# JI
c9ar 1arJ name= IJ tFpe KK N"% JI
Hin1o=
H TO(%N=
e,tern TO(%N lex(); /*1unctial le,-/ e de1inita altunde6a/JI
Cendi1 L%&DE
0uncia le,-/ este cea care returneaz urmtorul atom din te,tul surs$
3.2.2 Obseraii
>nele limbaje de programare 5 'ndeosebi cele 6ec9i5 conin unele particulariti care 'ngreuneaz
procesul de analiz le,ical$ De e,emplu 0O#T#"N i CO*OL impun o anumit structur a programului
surs pe mediul de intrare$ Limbajele moderne au 'n e,clusi6itate 1ormatul liber pe 1iierul de intrare5
aranjarea instruciunilor pe linii 1iind 1cut pe criterii de claritate i lizibilitate$ :n "L)OL ;A5 spaiile sunt
nesemni1icati6e5 ceea ce duce la 'ngreunarea identi1icrii atomilor 'n anumite instruciuni$
%,ist limbaje de programare 'n care cu6intele c9eie nu sunt rezer6ate -!LII/5 urm<nd ca
analizorul le,ical s deosebeasc din conte,t cu6intele c9eie de cele rezer6ate$
3.3. Construirea unui analizor lexical.
!entru construirea analizorului le,ical se au 'n 6edere urmtoarele aspecte8 recunoaterea atomilor
le,icali -cu genererarea codurilor de eroare 'n caz de eec/5 1urnizarea ctre analizorul sintactic a unei ieiri
ce codi1ic atomii le,icali i introducerea 'n tablele compilatorului a datelor obinute 'n aceast 1az
-identi1icatori 5 constante/$
>n analizor le,ical poate 1i construit manual sau cu ajutorul unui generator de analizoare le,icale$
7 Construirea manual a analizorului le,ical 'nseamn scrierea programului propriu zis pe baza
unor diagrame realizate 'n prealabil5 care precizeaz structura atomilor din te,tul surs$ Te9nica manual
asigur creerea unor analizoare le,icale e1iciente5 dar scrierea programului e monoton5 prezint riscul unor
erori5 mai ales dac e,ist un numr mare de stri$
.ec6ena urmtoare prezint o implementare manual simpl a unui scanner8
#include <stdio.h>
A
#include <ctype.h>
#include <stdlib.h>
#include <string.h> /
#include "lex.h"
static int state = !
#define "#$%&' ()*
static char buf+"#$%&',!
static char -pbuf!
static char -to.en/na0e+, =
1
"2#"3"4 "2&"%35"4 "6%5#73"4 "5%5#73"4
"68#532"4 "58#532"4 "#99:;2"4 "93":7<6<2"4
"86&9"4 "":2&9"4 "355<5"
=!
static ><?32 to.en!
char far- dup/str !
/- #cest cod nu e co0plet. 2u se testea@a depasirea bufferului4 etc-/
><?32 -lexAB
1
char c!
while ACB
switchAstateB
1
case D /- pentru unul din C4E4*4F4C4CG4C)4CH4CI4(C4(G -/
pbuf = buf!
c = getcharAB!
if AisspaceAcBB
state = CC!
else if AisdigitAcBB
1
-pbufJJ = c! state = (!
=
else if AisalphaAcBB
1
-pbufJJ = c! state = (E!
=
else switchAcB
1
case K1KD state = )! brea.!
case K=KD state = H! brea.!
case KAKD state = I! brea.!
case KBKD state = CE! brea.!
case KJKD state = C*! brea.!
case KLKD state = CF! brea.!
case K=KD state = (! brea.!
case K!KD state = ((! brea.!
defaultD
state = II! brea.!
=
brea.!
case (D
c = getcharAB!
if AisdigitAcBB
-pbufJJ = c!
else
state = G!
L
brea.!
case GD
to.en.info.Malue= atoiAbufB!
to.en.type = 2&"%35!
ungetcAc4stdinB!
state = ! return Nto.en!
brea.!
case )D
to.en.type = 6%5#73!
state = ! return Nto.en!
brea.!
case HD
to.en.type = 5%5#73!
state = ! return Nto.en!
brea.!
case ID
to.en.type = 68#532!
state = ! return Nto.en!
brea.!
case CCD
c = getcharAB!
if AisspaceAcBB
!
else
state = C(!
brea.!
case C(D
ungetcAc4stdinB!
state = !
brea.!
case CED
to.en.type = 58#532!
state = ! return Nto.en!
brea.!
case C*D
to.en.type = 86&9!
state = ! return Nto.en!
brea.!
case CFD
to.en.type = ":2&9!
state = ! return Nto.en!
brea.!
case (D
to.en.type = #99:;2!
state = ! return Nto.en!
brea.!
case ((D
to.en.type = 93":7<6<2!
state = ! return Nto.en!
brea.!
case (ED
c = getcharAB!
if AisalphaAcBOOisdigitAcBB
-pbufJJ = c!
else
state = ()!
brea.!
1M
case ()D
-pbuf = AcharB!
dup/str= strdupAbufB! /-aloca spatiu-/
to.en.info.na0e =dup/str!
to.en.type = 2#"3!
ungetcAc4stdinB!
state = ! return Nto.en!
brea.!
case IID
if Ac==3<'B
return !
fprintfAstderr4"7aracter ilegalD PKQcPKPn"4cB!
to.en.type = 355<5!
state = ! return Nto.en!
brea.!
defaultD
brea.! /- 2u se poate inta0pla -/
=
=
int 0ainAB
1
><?32 -t!
while AAAt=lexABBR=BB
1
printfA"Qs"4to.en/na0e+tL>type,B!
switchAtL>typeB
1
case 2#"3D
printfA"DQsPn"4t L>info.na0eB!
brea.!
case 2&"%35D
printfA"DQdPn"4t L>info.MalueB!
brea.!
defaultD
printfA"Pn"B!
brea.!
=
=
return !
=
0lu,ul procedurii le,-/ se poate reprezenta prin diagramele de tranziii din 1igura urmtoare$
11
22 2M 1;
B
13 12J
1 2
+J
digit not-digit/
digit
24J
letter not-letterNdigit/
letterNdigit
2+ 23
4
G
3
H
;
L
-
A
sp not-sp/
sp
1M 11
1A
7
1B
@
14
/
1+
K
1L
=
21
1$ La preluarea unui nou atom -de e,emplu la intrarea 'n le,-/ / 1olosim starea special state M pentru a
reprezenta 1aptul c nu am decis 'nc ce diagram s urmm$ "legerea e 1cut pe baza urmtorului
caracter de intrare >neori5 de e,emplu pentru atomul L*#"C% atomul e recunoscut imediat prin
scanarea ultimului caracter din atom$ !entru ali atomi 'ns5 de e,emplu pentru N>*%#5 cunoatem
lungimea atomului numai dup citirea unui e,tracaracter care nu aparine numrului -stri notate cu J/$
:n acest caz5 caracterul 'n plus trebuie returnat la intrare$
2$ Dac citim un caracter care nu corespunde cu o sec6en acceptat5 se returneaz atomul special
%##O#$
Diagramele de tranziie sunt gra1uri orientate i etic9etate 'n care nodurile simbolizeaz strile5 iar
arcele trecerea -tranziia/ dintr7o stare 'n alta$
- )enerarea automat a analizorului le,ical presupune conceperea unui program de traducere
-un 1el de compilator/ care primete la intrare 'ntr7un limbaj de speci1icare5 at<t structura
atomilor le,icali5 c<t i e6entualele aciuni semantice care trebuiesc realizate 'mpreun cu
analiza le,ical$ Ieirea unui ast1el de compilator 6a 1i un program de analiz le,ical$ >n
ast1el de compilator poate 1i aplicat unei clase mai largi de limbaje$
!. Noiuni "enerale de limba#e formale.
C3
Limbajele de programare sunt modelate matematic 'n cadrul limbajelor 1ormale$ .tudiul
modelrii limbajelor de programare are 'n 6edere 'n primul r<nd5 structurile 1inite care permit
dez6oltarea de limbaje cu un numr in1init de 1raze$
Calea uzual de descriere 1ormal a unui limbaj este de a 1olosi o gramatic pentru acel
limbaj$
O gramatic G este de1init de 3 componente8
- O mulime 1init T de simboluri care pot apare 'n 1razele limbajului5 numite simboluri
terminale5 sau primiti6ele limbajului$
- O mulime in1init N de simboluri neterminale5 sau categorii sintactice5 care sunt
utilizate pentru descrierea limbajului5 dar nu apar 'n 1razele acestuia$ Deci5 mulimile
T i N sunt disjuncte$
- O mulime ! de reguli de generare sau producii care descriu aspectele constructi6e
ale acestuia
12
- >n simbol neterminal special . care apare doar 'ntr7o singur producie din mulimea
! i care se numete simbol iniial5 simbol de start sau a,ioma gramaticii$ !roduciile
sau regulile de generare din ! arat cum pot 1i construite toate 1razele limbajului
pornind de la simbolul neterminal .$
Deci5 c6adruplul8 G={N, T, , !"5 unde N5 T5 !5 . au semni1icaiile menionate5
constituie o gramatic$
Un alfabet A reprezint o mulime 1init i ne6id de simboluri$ >n simbol din " este
reprezentat printr7o liter5 ci1r sau semn5 uneori printr7un ir 1init de litere5 ci1re sau semne$
Se noteaz cu A* mul&imea aranjamentelor cu repeti&ie ale simbolurilor din A, n
care unele pot aprea de mai multe ori.
%,emplu8 !entru "1KG-5/H5 urmtoarele iruri sunt elemente din "1J8
# , $ ## ### ##$$ #$ etc.
:n "J e,ist un ir care nu conine nici un simbol din "$ "cest simbol5 numit ir vid 'l
notm cu $
0n limbaj L peste alfabetul A este o submul&ime a lui AB. 6rice ir din AB care
apar&ine i lui L este un simbol sau cuv/nt al limbajului L.
%6ident5 mulimea "J este in1init5 deci i limbajul L poate reprezenta o mulime in1init$
"cest lucru 'nltur orice abordare de tip enumerati6 'n de1inirea limbajului5 1iind necesar o
reprezentare 1init a mulimii in1inite$
.e disting dou categorii de ast1el de reprezentri8
- reprezentarea finit! sintetic care genereaz toate cu6intele limbajului i
corespunde noiunii de gramatic$
- reprezentarea finit! analitic care permite recunoaterea apartenenei sau
nonapartenenei unei construcii la limbajul considerat5 reprezentare care corespunde
noiunii de automat sau analizor$
Cu notaile de1inite se construiesc mulimile8 " K N T i "
@
K "J 7 GH$
#euniunea " K N T reprezint alfabetul sau vocabularul gramaticii"
O producie p ! din gramatica ) reprezint o trans1ormare de 1orma8

unde "
@
i "J $
0iind date i dou iruri oarecare din "J se poate de1ini relaia 8

care speci1ic trans1ormarea irului concaternat 'n irul pe baza regulii de generare
e,istent 'n mulimea ! a produciilor$
#elaia notat cu ?? e,prim doar o singur trans1ormare de la un ir la altul 'n cadrul
gramaticii )5 dar ea poate 1i e,tins pentru a e,prima o 'ntreag succesiune de trans1ormri5 sub
una din 1ormele8
1 J 2 2 sau 1 @2 2
"st1el se speci1ic c irul 2
este deri6at -dedus/ succesi6 din irul 1 prin aplicarea unei serii de trans1ormri5 derivare #n k
pai! prin utilizarea irului nul -relaia J 2/ sau prin neutilizarea acestui ir -relaia @ 2/$
.e poate de1ini un limbaj L generat de gramatica ) ca 1iind alctuit din acele simboluri
terminale din )5 numite propoziii5 care deri6 din simbolul iniial .8
L-)/ K G s N s TJ i . sH
1+
O propozi$ie5 notat mai sus cu s conine 'n e,clusi6itate simboluri terminale$
Orice ir de simboluri terminale i neterminale deri6at din a,ioma . este numit form
propozi$ional"
%derivarea canonic st&nga 7 este un ir de trans1ormri 'n care neterminalul care se
e,pandeaz este 'ntotdeauna cel mai din st<nga neterminal al 1ormei propoziionale
%derivarea canonic dreapta 7 este un ir de trans1ormri 'n care neterminalul care se
e,pandeaz este 'ntotdeauna cel mai din dreapta neterminal al 1ormei propoziionale
Operaia in6ers deri6rii se numete reducere$
>n limbaj se poate descrie prin mai multe gramatici di1erite$
Dou gramatici se spune c sunt ec'ivalente dac i numai dac limbajele generate de
1iecare din acestea sunt identice$
O gramatic se numete recursi dac permite deri6ri de 1orma8
u
@
u 5 unde u N iar 5 "J
O gramatic este8
- recursi la st$n"a dac8 u
@
u O
- recursi la dreapta dac8 u
@
O u
(xemplu)
,onsiderm o gramatic care descrie un set restr/ns de opera&ii algebrice
C D E8, ", P, 1F
N K G.5 Pe,prQ5 PtermQ5 P1actQH
T K Ga5 b5 c5 75 J H
! K G. Pe,prQ
Pe,prQ P termQ N Pe,prQ 7 PtermQ
PtermQ P1actorQ N PtermQJP1actorQ
P1actorQ a N b N c H
1 ncercm s vedem dac expresia a-bBc apar&ine sau nu gramaticii.
1 GexprH GexprH-GtermH GfactH - GtermH a - GtermH a- GtermHBGfactorH
a - GfactorHB GfactorH a - bB GfactH a - b B c
1e observ c propozi&ia a 3 b 4 c s-a ob&inut n urma a ++ derivri, substituind la fiecare
pas c/te un simbol n forma propozi&ional curent.
!.1. %ipuri de "ramatici &i limba#e
%up forma produc&iilor, 8. ,!oms7I a mpr&it gramaticile n J mari clase)
gramatici de tip M 7 este 1orma cea mai general de gramatic5 1ra restricii5 de tipul
celei prezentate mai sus$
gramatici de tip 1 7 sunt gramatici dependente de context -sensibile la conte,t/= ele au
producii de 1orma u 5 adic producia u se poate aplic doar dac u
apare 'n conte,tul u $ )ramaticile dependente de conte,t genereaz limbaje
dependente de conte,t$
gramatici de tipul 2 7 sunt gramatici independente de context de 1orma u 5 adic
deri6area are loc independent de conte,tul 'n care se a1l u$
13
gramatici de tipul + 7 se numesc gramatici regulate5 'n care prile drepte ale
produciilor 'ncep cu un terminal$ Clasa mulimilor regulate peste al1abetul "
reprezint clasa limbajelor regulate L+-"/$
Not<nd cu )i clasa gramaticilor de tipul i5 N$ C9oms2F a ademonstrat c e,ist
urmtoarele relaii de incluziune 'ntre gramatici8
)M )1 )2 )+
iar pentru limbaje incluziunile sunt stricte 8 LM L1 L2 L+$
%intre cele J tipuri de gramatici, doar gramaticile regulate i cele independente de
context i-au gsit o aplicabilitate practic n construirea limbajelor de programare. ,elelalte dou
tipuri de gramatici prezint un interes pur teoretic.
Cramaticile regulate sunt un caz particular al gramaticilor independente de context. %e
aceea se spune c limbajele formale independente de context modeleaz limbaje de programare.
>n limbaj poate 1i generat de o gramatic regulat dac el poate 1i recunoscut de un automat 1init$
Dac 'n produciile gramaticii independente de conte,t se 1olosete un singur tip de recursi6itate la
st<nga sau la dreapta5 ea de6ine o gramatic regulat$
1intaxa unei propozi&ii ntr-un limbaj independent de context se poate reprezenta printr-o
structur de arbore, numit arbore de derivare #sau deduc&ie$. Pentru recunoaterea unei propozi&ii
dintr-un limbaj, este necesar ca arborele asociat s fie unic. 'n caz contrar, gramatica care
genereaz limbajul se numete ambiguu.
0n limbaj este inerent ambiguu dac nu poate fi generat dec/t de o gramatic ambigu.
(xist posibilitatea ca prin modificarea setului de produc&ii ale unei gramatici ambigue s
se poat elimina ambiguit&ile existente, fr ca limbajul generat s sufere vreo modificare.
'roducii ide
Partea dreapt a unei produc&ii con&ine un ir de terminale sau neterminale.
0neori este util s se genereze un ir vid, adic un ir ce nu con&ine nici un simbol.
Acest ir este notat cu e.
%e exemplu, gramatica
Punsigned integerQ PdigitQ Prest o1 integerQ
Prest o1 integerQ PdigitQPrest o1 integerQ N
PdigitQ M N 1 N RNL
definete Grest of integerH ca o secven& de K sau mai multe cifre.
Produc&ia Grest of integerH e se numete producie vid.
'n general, dac pentru un ir este valabil o derivare de forma
B
, atunci se
numete simbol anulabil. 0n neterminal este anulabil dac exist o produc&ie a crei
defini&ie #parte dreapt$ este anulabil.
!.2. Aspecte priind definirea limba#elor de pro"ramare
!entru descrierea unui limbaj de programare este necesar adoptarea unui limbaj de
descriere corespunztor5 numit metalimbaj$ "ceast idee aparine lui So9n *ac2us i notaia
introdus de el este cunoscut sub numele de #N$ -*ac2us Naur 0orm/$
O producie de1inete o clas sintactic -simbol neterminal/ sub 1orma general8
P nume clas sintacticQ 88 K de1iniie
14
- Notaia 88 K are semni1icaia 8 ?de1init prin?
- clasa sintactic5 denumit i partea st<ng5 corespunde unui simbol neterminal i este
inclus 'ntre paranteze ung9iulare$
- partea de de1iniie este denumit i partea dreapt
.imbolurile terminale nu sunt incluse 'n perec9ea de paranteze ung9iulare i ele apar 'n
propoziiile limbajului$
*N0 utilizeaz un set restr<ns de metasimboluri - N P Q 88 K/ i un set -speci1ic limbajului/ de
simboluri terminale$
0ormalismul *N0 impune nite restricii asupra regulilor de generare8
- 1iecare clas sintactic -simbol neterminal/ trebuie s apar 'n partea st<ng a unei
singure producii=
- simbolul de start nu trebuie s apar 'n partea st<ng a nici unei producii=
>lterior s7au utilizat 6ariante i completri la notaia *N0 pentru a se descrie di1erite
limbaje de programare$
Pentru a crete lizibilitatea nota&iilor, s-au adoptat prescurtri inspirate de
metasimbolurile folosite pentru expresii regulate.
Aceste nota&ii extinse au denumirea de forma 3ac7us 8aur extins 567F.
%e exemplu pentru urmtoarea gramatic de descriere a ntregilor cu semn)
PintegerQ PsignQ Punsigned integerQ
Punsigned integerQ PdigitQ Punsigned integerQ
PsignQ @ N 7 N
1olosind %*N0 se 6a rescrie8
Punsigned integerQ PdigitQ -PdigitQ/J
sau mai restrans8
PintegerQ -@ N 7 N /PdigitQ -PdigitQ/J
%x&ensii in&r'()se (e *ir&+
:n de1inirea limabjelor !ascal i odula725 1LBB5 Tirt9 a introdus c<te6a e,tensii la
1orma original de notaie5 obtin<nd o 1orm e,tins care a de6enit larg utilizat8
neterminale 7 sunt scrise cu litere italice instructiune
terminale 7 litere drepte i 'ntre apostro1uri UbeginV
N -/ 7 au semni1icaia din notaia original
WX 7 semni1ic aparitia opional a irului dintre paranteze
GH 7 denot repetiia de M sau mai multe ori a irului
$ 7 marc9eaz s1<ritul 1iecrei producii
-J J/ 7 simboluri pentru comentarii
7 se 'nlocuiete cu WX
%xe,-l)8 unsigned integer 88K digit GdigitH
digit 88K UMV N U1V N U2V N RN ULV$
1;
!.3. Automate de recunoa&tere. (ia"rame de tranziie.
!e baza gramaticii limbajului stabilit pentru atomi5 analizorul le,ical are sarcina s decid
apartenena la limbaj a atomilor detectai 'n 1iierul de intrare$ !entru gramatici regulate5
problema apartenenei la limbaj este decidabil$
!roblema deciziei trebuie completat cu sarcina codi1icrii atomilor le,icali5 cu cea a
semnalrii i tratrii erorilor$
)ramaticile de descriere a atomilor le,icali o1er analizorului le,ical tiparele pentru
identi1icarea atomilor$ !e baza acestor gramatici5 implementarea procesului de recunoatere a
atomilor se 1ace 1olosind un model matematic5 numit automat de recunoatere sau automat finit$
odelul 1izic al unui automat 1init este o ?main? cu operaii 1oarte simple care are un
cap de citire5 o unitate de comand i opional o memorie$ aina citete c<te un caracter de pe
banda de intrare i unitatea de comand decide 'n ce stare trece automatul pe baza caracterului
citit$ "utomatul se poate a1la 'ntr7un numr 1init de stri$
:n momentul 'n care automatul 'ncepe citirea unui caracter5 acesta se a1l 'n starea numit
starea de start$ "utomatul are un numr de stri numite5 stri 1inale$ >n ir x este acceptat de
automat dac pornind din starea de start5 dup citirea tuturor caracterelor din irul de intrare5
automatul ajunge 'ntr7o stare 1inal$ Cu alte cu6inte5 irul aparine limbajului acceptat de automat$
odelul matematic de reprezentare a automatului 1init este acela al diagramelor de
tranziii$
- .imbolurile care etic9eteaz arcele indic caracterul la citirea cruia automatul 6a
trece din starea de la care pornete arcul 'n starea 'n care ajunge arcul respecti6$
- .geata etic9etat cu cu6<ntul ?start? indic nodul de start al diagramei de tranziii5
ori poate 1i o sgeat de intrare neetic9etat$
- !entru a indica orice alt caracter care poate urma la ieirea unei stri5 'n a1ara celor
deja trecute pe arcele care ies din starea respecti65 se 6a utiliza o etic9et special
?altce6a?$
- Diagramele de tranziii sunt deterministe5 adic acelai simbol nu poate etic9eta
dou sau mai multe tranziii care ies din aceeai stare$
- >nei tranziii5 pe l<ng simbol i se pot asocia i anumite aciuni care se 6or e,ecuta 'n
momentul c<nd 1lu,ul de comand trece prin tranziia respecti6$
%,emplu8
Y1
b
YM
a
a
b
:n general analizorul le,ical este 1ormat din mai multe ast1el de diagrame de tranziii care pornesc
din aceeai stare de start i recunosc grupe de atomi$ Dac parcurg<nd o anumit diagram se semnaleaz
eec5 se re6ine 'n starea de start i se trece la urmtoarea diagram$ #e6enirea 'n starea de start presupune i
re6enirea capului de citire 'n poziia anterioar 'ncercrii nereuite$ #eaducerea capului de citire se poate
1ace memor<nd adresa locaiei cu citirea creia a 'nceput ultima recunoatere$ Dac prin parcuregerea
1B
sec6enial a tuturor diagramelor de tranziii$ se 6a semnala eec la toate5 'nseamn c s7a gasit o eroare
le,ical i se 6a apela rutina de tratare a erorii$
>n alt aspect al analizei le,icale 'l constituie comunicarea datelor detectate de analizorul
le,ical analizorului sintactic5 generearea erorilor le,icale i5 dac este necesar5 introducerea
datelor 'n tabel$ !entru realizarea acestor sarcinci5 diagramele de tranziii se completeaz cu
proceduri semantice asociate cu tranziiile din diagram$ "ceste proceduri semnatice 1ie
genereaz ieiri ctre analizorul sintactic5 realiz<nd i gestionarea tabelelor5 1ie trateaz erorile
le,icale$
!.!. )xemplu de "ramatic a atomilor lexicali &i dia"rame de tranziii
:n cele ce urmeaz5 dm notaia *N0 a unei gramatici a atomilor le,icali5 reprezentati6e
pentru majoritatea limbajelor de programare$ Notam )M aceast gramatic$
1$ P ir atomiQ88KPatomQ N Pir atomiQ P atomQ
2$ P atomQ88K PidQ N PconstQ N PopQ N PdelQ N PcomQ
+$ PidQ 88KPlitQ N PidQ PlitQ N PidQPci1Q
3$ PconstQ88K Pci1Q N PconstQ N Pci1Q
4$ PopQ88K @ N J N P N PK N Q N QK N K N PQ
;$PdelQ88K = Nblanc
B$ PcomQ88K -J P orice ir de caractere ce nu conine grupul ZJ/ZQ J/
A$ PlitQ88K " N $$$ N [
L$ Pci1Q88K M N $$$ N L
Cramatica CK nu este regulat dar poate fi transformat uor ntr-o gramatic
regulat mrind numrul produc&iilor i al neterminalelor. Proced/nd astfel ns,
gramatica se complic i procesul de proiectare al analizorului se poate lungi.
De e,emplu5 produciile 3 se pot scrie8
PconstQ88K M N $$$ N LN PconstQM N N PconstQ1N RN PconstQL
.e pre1er o simpli1icare a gramaticii prin ?strati1icarea? gramaticii )M 'ntr7o ierar9ie de
gramatici mai simple5 care 1iecare 'n parte este regulat5 sau se trans1orm 'n gramatic regulat$
!entru 1iecare din aceste gramatici se 6a construi diagrama de tranziie5 iar 'n 1inal se asambleaz
diagramele ast1el 'nc<t limbajul 'n ansamblu rm<ne acelai$
.e partioneaz mulimea de neterminale i se stabilete o ierar9ie 'ntre elementele
partiiei$ :n e,emplul dat5 o asemenea partiionare este8
N1KGPsir atomiQ5 PatomQH
N2KGPidQ5 PconstQ5 PopQ5 PdelQ5 PcomQH
N+KGPlitQ5 Pci1QH
0ormm5 'n jurul celor trei mulimi5 gramatici plec<nd de la produciile lui )M$
!entru 1iecare gramatic 6om considera ca terminale5 pe l<ng terminalele lui )M i
neterminalele din grupul imediat in1erior din ierar9ie$
Noile gramatici sunt8
-)1/ 8P ir atomiQ88KPatomQ N Pir atomiQ P atomQ
P atomQ88K id N const N op N del N com
-)21/ 8PidQ 88Klit N PidQ lit N PidQci1
-)22/ 8PconstQ88K ci1 N PconstQ N ci1
-)2+/ 8PopQ88K @ N J N P N PK N Q N QK N K N PQ
-)23/ 8PdelQ88K = Nblanc
-)24/8 PcomQ88K -J P orice ir de caractere ce nu conine grupul ZJ/ZQ J/
1A
-)+1/ 8PlitQ88K " N $$$ N [
-)+2/8 Pci1Q88K M N $$$ N L
)ramaticile sunt regulate cu e,cepia lui )1 i )24$
)ramatica )1 se poate rescrie 'ntr7o 1orm %*N08
-)1/ 8P ir atomiQ88K-id N constN opN delN com/ N -id N constN opN delN com/J
)24 s7ar putea i ea rescrie 'ntr7un mod asemntor5 dar se pre1er construirea automatului
direct din aceast 1orm intuiti6$
:n 1igura urmtoare se prezint diagramele de tranziii ale automatelor 1inite ec9i6alente
cu gramaticile )15 )2i - i K 15 R5 4/ )+j -j K 152/8
12 11
id5 const5 op5
del5 com
"18
id5 const5 op5
del5 com
12 211
lit
"218
lit5 ci1
222 221
ci1
"228
ci1
2+;
"2+8
2+1
2+2
2++
2+3
2+4
2+A
2+B
2+L
@
J
K
P
Q
K
Q
K
1L
232 231
=
"238
23+
blanc
244
241
- "248
altce6a
242
J
24+ 243
J /
altce6a
"+18
+11
+12
+1+
+12B
"
R
[
*
"+28
+21
+22
+2+
+21M
M
R
L
1
Din analiza diagramelor5 obser6m c e1ectul strati1icrii const 'n e,istena unor tranziii
condiionate de terminale care pe ni6elul in1erior reprezint diagrame de tranziii$ "cest lucru
'nseamn c nu putem acti6a o asemenea tranziie pe ni6elul superior dec<t dac diagrama de
tranziie respecti6 de pe ni6elul in1erior a 1ost parcurs din starea iniial 'ntr7o stare 1inal$
Deci5 un automat a1lat pe un ni6el in1erior trebuie s transmit ni6elului superior
in1ormaia de acceptare a irului inspectat$
\om a6ea deci o asamblare a automatelor ca 'n 1igura urmtoare8
2M
"+1
"+1
"21
"22
"2+
"23
"24
"1
"M
"1 "2
"+
Cuplarea automatelor "15 "25 "+ se 1ace 'n serie5 ieirea unuia 1iind intrarea celuilalt$
!entru a putea descrie 1uncionarea automatului "M printr7un limbaj de programare5 trebuiesc
'ndeplinite dou condiii8
- "utomatele rezultate din di1erite cuplri trebuie s 1ie deterministe
- Orice simbol primit la intrarea unui automat i care nu acti6eaz nici o tranziie
trebuie s duc la o situaie de neacceptare sau de eroare$
Obser6aie8
%,ist situaii 'n care5 pentru identi1icarea unui simbol5 un automat consum un simbol
care aparine atomului urmtor$ .oluiile de implementare constau 1ie 'n re6enirea 'n irul de
intrare cu un simbol5 1ie 'n generalizarea a6ansului pentru toate strile 1inale$
Completarea dia"ramei de tranziii cu proceduri semantice.
:n proiectarea analizorului le,ical5 automatul de recunoatere are un rol orientati6$ %l
arat care sunt sarcinile analizorului 'n identi1icarea atomilor le,icali$
!entru semnalarea erorilor i emiterea unor ieiri5 se 1olosesc proceduri semantice
asociate tranziiilor automatului de recunoatere$
!rocedurile semantice lucreaz cu cu structuri de date pe care le utilizeaz 'n luarea
deciziilor i pe care5 e6entual5 le modi1ic$ "ceste structuri de date alctuiesc baza de date a
analizorului le,ical i controlul conte,tului acti6itii lui$
Controlul conte,tului are ca scop restabilirea ] la s1<ritul analizei unui atom le,ical ] a
unui conte,t adec6at cutrii urmtorului atom5 emiterea unei ieiri corecte care s reprezinte
atomul analizat i semnalarea erorilor$
!.*. 'robleme specifice implementarii unui analizor lexical
!.*.1. +estionarea tampoanelor de intrare
Te,tul surs parcurs i analizat de analizorul le,ical este citit de pe suportul de intrare$
!entru e1ectuarea acestei operaii se recomand utilizarea a 2 zone tampon din urmtoarele
moti6e8
- !oate crete 6iteza prin umplerea unui tampon c<nd analizorul lucreaza cu cellalt
- .e poate trata simplu cazul 'n care un atom se continu dintr7un tampon 'n altul$
21
.oluiile concrete de gestiune ale tampoanelor depind de modul de implementare al
analizorului8
1$ >tilizarea unui generator de analizoare le,icale8 rutinele pentru gestiune sunt incluse
in generator5 i nu se a1l sub controlul programatorului$
2$ "nalizorul se scrie intr7un limbaj de ni6el inalt$ !osibilitile de gestionarea
tampoanelor sunt cele speci1ice limbajului$
+$ "nalizorul se scrie 'n limbaj de asamblare$ Tampoanele se pot gestiona 'n modul
e,plicit la cel mai sczut ni6el$
%1iciena i e1ectul cresc de la 1 la +

Notm cu n dimensiunea tamponului= ea corespunde lungimii dimensiunii 1izice -linie5 articol/
pe mediul de intrare$ 0iecare tampon se umple printr7o singur comand de citire iar s1<ritul
te,tului este marcat de %O0
!entu localizarea atomului le,ical -le,emei curente/ 'n tampoane se utilizeaz pointeri
numii pointeri de inceput -i i pointeri de anticipare -a$
La 'nceput5 ambii pointeri indic primul caracter al le,emei curente5 apoi pa a6anseaza
p<n c<nd analizorul gsete corespondena cu un tipar$ ^irul de caractere dintre cei doi pointeri
reprezint urmtorul atom le,ical$
Dup detectarea unui atom le,ical5 pointerul de anticipare poate sa rm<n ori pe ultimul
caracter al le,emei curente ori pe primul caracter al le,emei urmtoare$ Din moti6e de
uni1ormitate se pre1er a doua situaie$
Dup prelucrarea le,emei curente5 pi este adus 'n aceeai poziie cu pointerul de
anticipare5 situaie 'n care se poate trece la analiza unui nou atom$
Trecerea pointerului pi din primul tampon 'n al doilea trebuie precedat de umplerea
-citirea/ celui de7al doilea tampon5 operaie care se poate des1asura 'n paralel cu analiza propriu
zis c<nd sistemul de calcul i limbajul permite acest lucru$ "nalog5 trecerea pointerului pa din al
doilea tampon 'n primul 'n mod circular5 trebuie precedat de umplerea -citirea/ tamponului 1$
"ceast te9nic poate 1i aplicat atunci c<nd lungimea ma,im a unei le,eme nu poate depi 2n5
ceea ce este o limitare rezonabil$
"lgoritmul de a6ans al lui pa pentru situaia de mai sus este urmtorul8
i1 J pa este la s1irsitul tamponului 1 t9en
begin
J incarca tamponul 2=
pa8K pa @1=
end
else i1 J pa este la s1irsitul tamponului 2 t9en
begin
J incarca tamponul1=
pa8K1=
end
else pa8K pa @1
!rincipalul deza6antaj al acestui algoritm 'l reprezint 1aptul c pentru 1iecare caracter
-e,cept<nd s1<ritul tamponului 15 a6ansul pointerului de anticipare este precedat de 2 teste$
Cele dou teste se pot reduce la unul singur dac se marc9eaz s1<ritul 1iecrui tampon
cu un caracter special numit santinel5 care s 1ie acelai cu cel de s1<rit %.$ $
"lgoritmul se modi1ic ast1el8
pa K pa @1=
i1 pa K %.$ t9en
i1J pa este la s1irsitul tamponului 1 t9en begin
Jincarca tapon2
22
pa8K pa @1
end
else
i1 J pa este la s1irsitul tamponului 2 t9en begin
Jincarca tampon 1
pa 8K1
end
else Jtermin analiza le,ical$
.e mai remarc i 1aptul c acelai unic test de s1<rit de tanpon rezol6 i testul de
s1<rit al te,tului surs necesar pentru 'nc9eierea analizei le,icale$
!.*.2. ,crierea codului pentru dia"ramele de tranziii
Din punct de 6edere al programrii5 o sec6en de diagrame de tranziii poate 1i
implementat 1ie prin case 1ie prin succesiune de i1$ !entru aceasta 1iecrei stari i se asociaz o
poriune de program distinct$
7 Dac starea nu este 1inal5 adic e,ist arce care ies din acea stare5 atunci poriunea de program
se 'nc9eie cu citirea unui caracter pe baza cruia se pot selecta tranziii spre stare urmtoare5 dac
e,ist arc de ieire etic9etat cu acel caracter$ Citirea unui caracter se poate 1ace cu o procedur
care gestioneaz tamponul de intrare5 a6anseaz pointerul de anticipare i returneaz urmtorul
caracter$
- Dac e,ist arc pornind din starea curent etic9etat cu caracterul citit se 6a trans1era
controlul la sec6ena de program pentru noua stare$
- Dac nu e,ist un ast1el de arc i starea curent nu este 1inal5 se 6a apela o
procedur eec care returneaz pointerul de 'nceput al atomului le,ical i asigur
saltul la urmtoarea diagram$ :n cazul c<nd s7au epuizat toate posibilitile5 se 6a
apela procedura de eroare$
Dac limbajul nu are case5 acesta poate 1i simulat printr7un tablou -inde,at prin codul caracterului
de la intrare/$ 0iecare element al tabloului corespunde unei stri noi i reprezint un pointer spre o sec6en
de cod ce trebuie e,ecutat atunci c<nd caracterul curent corespunde indicelui$ !oriunea de
corespunztoare 1iecrei stri se 6a 'nc9eia 1ie cu luarea 'n considerare a strii urmtoare5 1ie cu salt la
tabloul corespunztor urmtoarei diagrame$
*. Construirea automat a analizoarelor lexicale C!
>n generator de analizoare le,icale pornete de la e,presiile regulate care descriu toi atomii
limbajului surs i obine diagrama de tranziie corespunztoare5 sub 1orma unei tabele de analiz$
"ceast tabel5 'mpreun cu procedura de analiz alctuiesc analizorul le,ical$
*.1.Obinerea tabelei de analiz pe baza expresiilor re"ulate
%,ist dou metode de trans1ormare a e,presiilor regulate 'n automate 1inite deterministe$
Metoda - "ceast metod presupune parcurgerea urmtoarelor etape8
a$Construirea unui automat 1init nedeterminist -"0N/ pornind de la e,presiile
regulate -%#/$
2+
b$Trans1ormarea automatului nedeterminist -"0N/ 'n automat 1init determinist
-"0D/$
c$inimizarea numrului de stri ale automatului determinist$
Metoda II Aceast metod presupune parcurgerea urmtoarelor
etape:
a$Construirea arborelui binar corespunztor %#$
b$Construirea "0D pe baza arborelui$
*.1.1. Construirea unui automat finit nedeterminist din expresii re"ulate
:n diagramele de tranziii 1olosite p<n acum5 am implementat automate 1inite deterministe5
-"0D/de genul celui din 1igura urmtoare8
Y1
b
YM
a
a
b
0igura 1
Din 1iecare stare iese o singur sgeat etic9etat cu un simbol de intrare$ atricea de tranziii
pentru acest automat este8
Y1
a b
YM
Y1
Y1
YM
YM
Dac renunm la unele restricii i permitem ca dintr7un nod s ias mai multe sgei etic9etate cu
acelai simbol de intrare5 precum i sgei etic9etate cu 7 care 6or reprezenta tranziii independente de
intrare ] obinem un automat 1init nedeterminist$ -"0N/5 prezentat 'n 0igura 2$
+

a
b
M 1
2
a
b
b
a 0igura 2
23
>nei stri i unui simbol de intrare nu 'i mai corespunde o stare ci o mulime5 e6entual 6id de
stri$
atricea de tranziii pentru acest automat este8
1
a
77
M
GM51H
G25+H
G2H
G+H G2H
77 77
77
b

2
+ 77 77 77
%6ident5 "0D este un caz particular al "0N$
!ornind de la e,presii regulate5 se pot construi automate 1inite nedeterministe$
0ie o e,presie regulat # peste un al1abet $ "lgoritmul de mai jos 6a genera un automat
1init nedeterminist N5 care 6a accepta limbajul de1init de #$
.e descompune e,presia # 'n componentele sale elementare -simboluri i operatori/$ .e
6or construi automate elementare pentru 1iecare simbol5 dup care5 1olosind aceste automate5 se
6or construi automatele pentru e,presiile compuse$ "utomatele pentru e,presiile compuse se
construiesc inducti65 pentru 1iecare operaie 8 reuniune5 concatenare5 inc9idere$ "lgoritmul de
construcie introduce la 1iecare pas cel mult 2 stri noi5 prin urmare5 automatul rezultat 6a a6ea
cel mult de 2 ori at<tea stari c<te simboluri si operaii are e,presia regulat$
Al/'ri&,)l l)i T+',s'n prezentat 'n continuare5 nu este cel mai e1icient -un algoritm
mai per1ormant ar genera un "0N cu mai puine stri pentru aceeai e,presie regulat/$ "re 'ns
a6antajul simplitii5 iar dup trans1ormarea din automat nedeterminist 'n automat determinist5
e,ist posibilitatea reducerii numrului de stri ale automatului 1init determinist obinut$
0olosim urmtoarele notaii8
i 7 stare iniial
f 7 stare 1inal
()i! 7 automatul corespunztor e,presiei regulate #i$
7 !entru -simbolul 6id notat i / se genereaz8
1 i
_
7 !entru a - un simbol oarecare al al1abetului surs/8
1 i
a
!entru 1iecare "0N elementar construit5 strile 6or 1i notate cu nume -numere/ distincte= dac un
acelai simbol al al1abetului apare de mai multe ori 'n %#5 se 6a construi pentru 1iecare apariie a sa c<te un
"0N separat5 cu stri notate distinct$
:n continuare5 se conecteaz 'ntre ele "0N elementare construite5 corespunztor operatorilor
aplicai asupra primiti6elor din %#5 compun<ndu7se ast1el5 din aproape 'n aproape -prin inducie/
"0N 1inal$
24
Descompunerea %# 'n componente elementare5 respecti6 compunerea acestora se 1ace
aduc<nd %# la 1orma post1i,5 tin<nd cont c operatorii se e6alueaz 'n ordinea urmtoare8
parantezele5 'nc9iderea - J /5 concatenarea si selecia -N/$
7 !entru 01102
1 i
N-#1/


N-#2

0igura +
"utomatul corespunztor e,presiei #1 N #25 este N-#1 N#2/5 obinut prin creerea a 2 stri noi8
o stare iniial5 di1erit de strile iniiale ale automatelor N-#1/ i N-#2/ i o stare 1inal di1erit de
strile 1inale din N-#1/ i N-#2/5 care 'i pierd proprietatea de satre iniial i 1inal$
Limbajul corespunztor e,presiei regulate #1 N#2 este8 L-#1/ L-#2/$
7 !entru 0102
1 i N-#1/

N-#2/
0igura 3
"utomatul corespunztor e,presiei #1#2 este N- #1#2/ pentru care starea iniial este starea
se start a automatului N-#1/ iar starea 1inal este cea a automatului N-#2/$ .tarea 1inal a automatului
N-#1/ se identi1ic cu starea se start a automatului N-#2/$
>n drum 'ntre i i f 6a tra6ersa mai 'nt<i automatul N-#1/5 dup care 6a trece prin
automatul N-#2/$ !rin urmare5 irul de simboluri recunoscut 6a 1i un ir din limbajul e,presiei #1
urmat de un ir al limbajului e,presiei #2$ :n consecin5 limbajul modelat de automat este8
L-#1/L-#2/$
7 !entru 01*
1 i N-#1/

0igura 4
"utomatul are 2 stri noi i ne putem deplasa din starea iniial i 'n starea 1inal f5 1ie direct
prin tranziia 5 1ie prin automatul N-#1/5 de un numr oarecare de ori$
>n automat obinut pe baza algoritmului lui T9omson are urmtoarele proprieti8
7"0N 1inal 6a a6ea o singur stare de start i o singur stare 1inal$
7 0iecare stare a automatului are cel mult o tranziie etic9etat cu un simbol din
al1abet sau cel mult 2 tranziii etic9etate cu $
2;
A-lica2ie8 .e consider e,presia regulat # K -aba/
J
aa $ "utomatul construit pas cu pas5 pornind de
la aceast e,presie este8
1
i

1
2 + 3
4 ;
B A L

a a
a
a
b

0igura ;
*.1.2. %ransformarea A.N /n A.(
>n "0N se poate trans1orma 'ntr7un automat 1init determinist -"0D/ care s accepte acelai
limbaj ca i "0N$
Notm cu s0 starea iniial a "0N$ O stare a "0D 6a 1i compus dintr7o mulime de stri Gs*+ s,+"""+ sn
H ale "0N$
Noiunea de 7'nc9idere se de1inete pentru 1iecare mulime de stri T ale unui automat8
este mulimea strilor 'n care se poate trece din strile mulimii T pentru un simbol de intrare$
%,emplu8 !entru automatul din 0igura 25 prin tranziii 6ide5 7'nc9idere-M/ K GM52H5 7
'nc9idere-1/ K G1H5 7'nc9idere-M5 +/ K GM525+H etc$
Notm8 al1abetul limbajului surs
Ds&ri mulimea strilor "0D
D&ranz mulimea tranziiilor
!entru implementarea algoritmului putem 1olosi ca structuri de date dou sti6e i un ir
de ci1re binare inde,at de strile automatului$ :ntr7una din sti6e se ine e6idena mulimii curente
a strilor nedeterministe iar a doua sti6 se utilizeaz pentru calculul mulimii de stri urmtoare$
\ectorul de ci1re binare 'nregistreaz dac o stare este prezent 'n sti65 pentru a se e6ita dublarea
ei$ Organizarea acestei structuri ca 6ector are a6antajul timpului de cutare constant al unei stri$
Dup 'nc9eierea procesului de calcul a mulimii de stri urmtoare5 rolul sti6elor se in6erseaz$
.e iniializeaz strile "0D cutat Dstri cu un singur element -o stare/5 i anume cu
mulimea strilor 'n care se poate ajunge din starea s- a "0N numai prin tranziii 6ide -de 1apt 7
'nc9idere-Gs-H/5 care 6a 1i notat cu 7'nc9idere-Gs-H/$
La 'nceput aceast stare e nemarcat$ Totodat5 mulimea tranziiilor este 6id$
!entru 1iecare stare nemarcat din Dstri i pentru 1iecare simbol din al1abet se caut strile 'n
care se poate ajunge 'n "0N pentru simbolul respecti6$ "daug aceste stri la Dstri dac ele nu sunt
deja incluse 'n aceast mulime5 adaug tranziia la Ditranz i marc9eaz starea testat din Dstri$
"lgoritmul de obinere a "0D este8
-r'ce()ra A.(,A./ es&e
Jiniializeaz Dstri cu 7'nc9idere-Gs-H/
Jla 'nceput strile din Dstri sunt nemarcate
Dtranz K
c3& &i,- mai e,ist 'n Dstri o stare x K Gs*+ s,+" " "+ sn H nemarcat exec)&
Jmarc9eaz x
2B
-en&r) 1iecare a exec)&
J1ie 0 K mulimea strilor din "0N pentru care o tranziie etic9etat cu a de la o
stare si x=
1 K 7'nc9idere-0/=
(ac 1 Dstri a&)nci
Jadaug 1 la Dstri5 1 7 nemarcat
Jadaug tranziia x 1 la Dtranz5 dac nu e,ist deja
4
4
4
s53r 6 i& A.(,A./
"lgoritmul de calcul pentru 1uncia -7nc+i(ere este8
5)nc 2ia 7'nc9idere- 0 / es&e
Jpune toate strile din 0 'ntr7o sti6
Jiniializeaz 7'nc9idere- 0 / cu 0
c3& &i,- sti6a nu e 6id exec)&
Je,trage starea s din 6<r1ul sti6ei
-en&r) 1iecare stare t pentru care s t pentru simbolul exec)&
(ac t 7'nc9idere- 0 / a&)nci
Jadaug t la 7'nc9idere- 0 /
Jpune t 'n sti6
4
4
4
s5 3 r 6 i& 7'nc9idere- 0 /
2A
%xe,-l)8 0ie "0N din 1igura B$ Limbajul acceptat este8 Ga5 b5 ab5 abab5 RH$
B
M

1 2 +
3
4
;

b
a b

a

0igura B
"plicm algoritmul A.(,A./ pe diagrama de tranziii$
Dstri K G-M5153/H Dtranz K
.e marc9eaz cu J starea -M515 3/
7 !entru simbolul a construim mulimea G25 4H i calculm 7'nc9idere -G25 4H/ K G25 45 BH
Dstri K G-M5153/J 5 -25 45 B/H Dtranz K G-M5153/-25 45 B/ cu simbolul aH
7 !entru simbolul b construim mulimea G;Hi calculm 7'nc9idere -G;H/ K G;5 BH
Dstri K G-M5153/J 5 -25 45 B/5 -;5 B/H Dtranz K G-M5153/-25 45 B/ cu a= -M5153/-;5B/ cu b H
.e marc9eaz cu J starea -25 45 B/
7 !entru simbolul a nu a6em tranziii
7 !entru simbolul b construim mulimea G+Hi calculm 7'nc9idere -G+H/ K G15 +5 BH
2L
Dstri K G-M5153/J 5 -25 45 B/J5 -;5 B/5 -15 +5 B/H
Dtranz K G-M5153/-25 45 B/ cu a= -M5153/-;5B/ cu b = -25 45 B/ -15 +5 B/ cu bH
.e marc9eaz cu J starea -;5B/
7 !entru simbolul a nu a6em tranzitii
7 !entru simbolul b nu a6em tranziii
Dstri K G-M5153/J 5 -25 45 B/J5 -;5 B/J5 -15 +5 B/H
Dtranz K G-M5153/-25 45 B/ cu a= -M5153/-;5B/ cu b = -25 45 B/ -15 +5 B/ cu bH
.e marc9eaz cu J starea -15 +5 B/
7 !entru simbolul a construim mulimea G2Hi calculm 7'nc9idere -G2H/ K G2H
Dstri K G-M5153/J 5 -25 45 B/J5 -;5 B/J5 -15 +5 B/J5 -2/H
Dtranz K G-M5153/-25 45 B/ cu a= -M5153/-;5B/ cu b = -25 45 B/ -15 +5 B/ cu b= -15 +5 B/ -2/ cu a H
7 !entru simbolul b nu a6em tranziii
.e marc9eaz cu J starea -2/
7 !entru simbolul a nu a6em tranziii
7 !entru simbolul b construim mulimea G+Hi calculm 7'nc9idere -G+H/ K G15 +5 BH5 dar ea e,ist$
Dstri K G-M5153/J 5 -25 45 B/J5 -;5 B/J5 -15 +5 B/J5 -2/JH
.trile pot 1i redenumite5 de e,emplu8
-M5153/ K "
-25 45 B/ K *
-;5 B/ K C
-15 +5 B/ K D
-2/ K %
atricea i diagrama de tranziii pentru "0D parial de1init sunt cele din 0igura A$
.e obser6 c "0D obinut accept e,act limbajul Ga5 b5 ab5 abab5 RH acceptat de "0N
iniial$
+M
.trile acceptoare -1inale/ ale "0D obinut 6or 1i acele stri x care 6or conine cel puin o
stare acceptoare a "0N$ .tarea de start a "0D este cea 1ormat din s0 'mpreun cu toate strile la
care se poate ajunge din s0 doar prin simbolul $
"lgoritmul de mai sus este important pentru c d soluia pentru simularea unui "0N$
.imularea direct este di1icil5 deoarece trebuie simulat calculul ?'n paralel? al di1eritelor
traiectorii ce pot 1i urmate 'n "0N$ 0olosind algoritmul5 se determin mai 'nt<i "0D ec9i6alent i
apoi se simuleaz "0D$ "ceast simulare este ec9i6alent cu construirea analizorului limbajului
generat de gramatic$
*
a
C
"
*
D 77
b
C
D % 77
%
77 77
77 D
D
"
b
a
0igura A
*
CC
b
%
a
*.1.3. Al"oritm pentru simularea comportrii unui automat finit nedeterminist
.e consider un automat N construit dintr7o e,presie regulat prin metoda T9omson$ .e
prezint algoritmul de simulare care 6a decide dac automatul N recunoate sau nu un ir de
intrare x$ #spunsul automatului 6a 1i `daa 'n cazul recunoaterii i `nua alt1el$
7 "lgoritmul citete intrarea simbol cu simbol -carurm/
7 Calculeaz pentru 1iecare mulime de stri T mulimea strilor 'n care se poate trece din
strile din T numai prin tranziii 6ide$ - 'nc9idere/$
7 \eri1ic dac se poate ajunge 'ntr7o stare acceptoare$
.8K 7 'nc9idere-.M/=
a8K carurm=
O9ile a eo1 do
begin
.8K 7 'nc9idere-.5a/=
a 8K carurm=
end=
i1 .0 {} t9en genereaz-`daa/
else genereaz-`nua/=
!entru implementarea algoritmului putem 1olosi ca structuri de date dou sti6e i un ir
de ci1re binare inde,at de strile automatului$ :ntr7una din sti6e se ine e6idena mulimii strilor
curente5 iar a doua sti6 se utilizeaz pentru calculul mulimii de stri urmtoare$ \ectorul de
ci1re binare 'nregistreaz dac o stare este prezent 'n sti65 pentru a se e6ita dublarea ei$
Organizarea acestei structuri ca 6ector are a6antajul timpului de cutare constant al unei stri$
Dup 'nc9eierea procesului de calcul a mulimii de stri urmtoare5 rolul sti6elor se in6erseaz$
*.1.!. Minimizarea numrului de stri ale unui A.(
"utomatul 1init determinist obinut din automatul 1init nedeterminist nu este 'ntotdeauna
cel mai simplu posibil pentru irul de intrare dat$ >neori este posibil reducerea numrului de
stri ale "0D ast1el obinut$
.e prezint un algoritm care5 'n caz c este posibil5 reduce numrul de stri ale unui "0D$
+1
O stare s a unui "0N este o stare important dac are cel puin o tranziie etic9etat cu un
simbol di1erit de $ De e,emplu5 'n algoritmul de con6ersie "0N7"0D5 strile importante au 1ost
cele care au determinat creerea unei noi stri 'n "0D$
Consider<nd mulimile de stri din "0N corespunztoare la 2 stri din "0D5 2
submulimi sunt identice dac8
1$ ele au aceleai stri importante
2$ ambele 1ie includ5 1ie e,clud stri acceptoare
Al/'ri&,)l (e ,ini,izare 8
Considerm c a6em un "0D notat 5 a6<nd mulimea strilor notat cu .5 iar
reprezint mulimea de simboluri de intrare$ !resupunem c 1iecare stare are o tranziie pentru
1iecare simbol de intrare$ Dac "0D nu 'ndeplinete aceast condiie5 6om crea o stare 1icti65
numit `stare de blocaja5 m din care 6om trasa arce spre el 'nsui pentru 1iecare simbol de intrare$
!entru toate strile care nu au tranziii pentru toate simbolurile5 tranziiile lips se 6or completa
cu arce spre starea m"
Iniial di6izm mulimea strilor "0N 'n 2 submulimi5 una conin<nd strile care nu sunt
1inale5 celalat conin<nd mulimea strilor 1inale$ "lgoritmul 6a partiiona aceste mulimi ast1el
'nc<t dou stri din aceeai mulime 6or trece 'n aceeai mulime de stri pentru orice simbol de
intrare$
Considerm ! o partiie obinut la un moment dat 'n procesul de partiionare5 .K{s15s25
R5s2} una din mulimile partiiei i un simbol de intrare a$ Cutm pentru 1iecare stare si starea 'n
care trece pentru simbolul a$ Dac strile urmtoare obinute aparin la mulimi di1erite din !5
mulimea . se 6a 'mpri 'n submulimi ale cror elemente duc 'n aceeai submulime din !$
!rocesul de di6izare se repet p<n c<nd nu mai gsim grupuri ce trebuiesc di6izate$
i/ .e realizeaz o partiionare ! a multimii Dstari 'n dou grupuri de stri8 0Ksetul de stri
acceptoare i Dstari 7 0 K setul de stri non7acceptoare$ !rintr7o procedur5 care se 6a da mai jos5 se
'ncearc e1ectuarea unei noi partiionri5 !nou5 prin descompunerea grupurilor lui ! 'n subgrupuri$
Dac !nou !5 se 'nlocuiete ! cu !nou i se repet procedura de descompunere$ Dac !nou !5
'nseamn c partiionarea nu se mai poate 1ace$
-r'ce()ra partiionare es&e
-en&r) 1iecare grup ) ! exec)&
J descompune ) 'n subgrupuri a$'$ 2 stri s i t din ) s se a1le 'n acelai subgrup dac
i numai dac5 pentru toate simbolurile a 5 s si t tranziteaz 'n stri aparin<nd
aceluiai subgrup
J subgrupurile obinute se pun 'n !nou

s53r s i& partitionare
ii/ Din 1iecare grup al partiiei obinute 'n pasul anterior5 se alege c<te o stare oarecare -stare
reprezentant/$ "cestea 6or 1i strile "0D minimizat$ .tarea iniial 6a 1i starea reprezentant a
grupului ce conine starea initial s05 iar strile 1inale 6or 1i reprezentantele subgrupurilor pro6enite
din 0$
iii/ Toate tranziiile dintre strile automatului iniial se trans1orm 'n tranziii 'ntre
reprezentanii grupelor respecti6e$ Dac "0D minimizat conine o stare de bloca2 m5 adic o stare
care nu este 1inal i care tranziteaz 'n ea 'nsi pentru toate simbolurile a aceast stare se
elimin$ .e 6or elimina5 de asemenea5 strile care nu pot 1i atinse plec<nd din starea iniial$
Tranziiile spre strile de blocaj dinspre alte stri de6in nede1inite$
%,emplu8 1ie automatul din 1igura L8
+2
%
b
a
b
" *
C
a
b
a
b
0igura L
D
b
a
a
.K{"5*5C5D5%}
!rima partiie8 K {"5*5C5D} {%}
!entru a construi nou5 considerm mulimea {%}= aceast mulime nu se mai poate
di6iza5 deci o includem in noua partiie$
Considerm acum {"5*5C5D}i cutm tranziiile pentru simbolul a8 " 7
a
7> *5 * 7
a
7> *5 C
7
a
7> *5 D 7
a
7> *5 prin urmare simbolul a nu di6izeaz mulimea$
Considerm acum b8 " 7
b
7> C5 * 7
b
7> D5 C 7
b
7> C5 D 7
b
7> %5 aceste tranziii 6or partiiona
mulimea 'n {"5 *5 C} i 'n {D}$
nou K -{"5 *5 C} {D} {%}/
{"5 *5 C} 7
a
7> {*5 *5 *} {"5 *5 C} 7
b
7> {C5 D5 C}
Deoarece D este 'n alt partiie5 obinem8
nou K -{"5 C} {*} {D} {%}/
{"5 C} 7
a
7> {*5 *} {"5 C} 7
b
7> {C5 C}
nou K -{"5 C} {*} {D} {%}/
:n acest moment nou K 5 deci automatul minimizat 6a a6ea strile {"5 C} {*} {D} {%}$
Din mulimea {"5 C} alegem satrea " ca stare reprezentati6$ Toate tranziiile spre C 6or de6eni
tranziii spre "5 iar celelalte tranziii le copiem din automatul iniial$ Deci5 'n acest caz s7a reuit
minimizarea numrului de stri cu o stare$
*.1.*. Construirea arborelui binar corespunztor )1
C*
a$ 9n ar:'re (e (eri;are -parse tree/ 'ntr7o gramatic )KGN5 T5 !5 .H este un arbore
orientat5 etic9etat5 cu urmtoarele proprieti8
- rdcina arborelui este etic9etat cu .=
- nodurile interioare sunt etic9etate cu neterminalele gramaticii5 iar 1runzele cu neterminale sau
terminale=
- pentru orice nod interior etic9etat cu " a6<nd descendeni direci etic9etai 'n ordine de la st<nga
la dreapta cu simbolurile din "8 &15 &25 R &2 -2 1/ e,ist 'n ! o producie8 " &1 &2 R &2 $
^irul simbolurilor care etic9eteaz 1runzele arborelui scrise 'n ordine de la st<nga la dreapta
se numete frontiera arborelui$
.e poate arta c oricrei 1orme propoziionale din ) 'i corespunde cel puin un arbore de
deri6are 'n ) care are ca 1rontier pe $ %l se numete arborele de derivare #n G al lui " $
0ie gramatica8 )KGG%H5 Gi5 @5 JH5 !5 %H
cu ! K G % % @ %
% % J %
++
% -%/
% i H$
!ropoziia8 iJ-i@i/ are urmtoarea deri6are canonic st<nga8
% % J % i J % i J -%/ i J - % @ %/ i J - i @ % / i J - i @ i /
:n 1igura urmtoare se prezint arborele de deri6are al acestei propoziii$ Construcia urmrete
deri6area canonic st<ng8 1rontierele arborilor construii reproduc 1ormele propoziionale din
deri6area canonic st<ng$
%
%
%
J
i
-
/
%
%%
%
@
i i
b$ Ar:'rele c'res-)nz&'r %0 este un ar:'re :inar care are c<te un nod terminal pentru
1iecare simbol ce apare 'n %# i c<te un nod interior pentru 1iecare operator aplicat -c'nca&enare5
7nc+i(ere5 sa)/$ :n prealabil %# 6a 1i modi1icat5 'n sensul c la s1<ritul ei 6a 1i concatenat un
simbol special5 notat cu <5 care 6a ser6i drept marcator de s1<rit al %#$ O asemenea %# modi1icat
se numete %0 a)/,en&a&$
:n 1uncie de operatorul 'nmagazinat 'ntr7un nod5 nodul se 6a numi nod7cat dac operatorul
este concatenare5 nod7sau dac operatorul este sau5 nod7stea$
:n automatul "0D corespunztor %# augmentate5 orice stare de la care 6a e,ista o tranziie
etic9etat cu Z<Z 6a 1i stare acceptoare$
0iecare simbol din %# 6a 1i numerotat5 'n ordinea te,tual a apariiei sale 'n %#$ Dac
acelai simbol apare de mai multe ori5 1iecare apariie 6a a6ea un numr distinct$ Deci5 unui simbol
din al1abet 'i pot corespunde mai multe numere de poziie dac el este repetat 'n cadrul e,presiei$
Numerele atribuite 'n acest mod se numesc -'zi 2ii$$
"rborele se obine aduc<nd %# la 1orma post1i, $
%,emplu8
0ie %# 8 - a N b /J a b b
%# augmentat este8 - a N b /J

a b b C
a b a b b C
poz$ 1 2 + 3 4 ;
0iecare nod al arborelui primete c<te un identi1icator unic5 pentru a putea 1i localizat$ :n
1igura urmtoare5 identi1icatorii nodurilor au 1ost notai cu Ni5 iK1$ $1+$ "rborele corespunztor 6a 1i
cel din 1igura urmtoare$
+3
C
;
b
4
b
3
a
+
J
N
b a

1
2
N1
N2
N+
N3 N4
N; NB
NA NL
N1M
N11
N12

N1+
*.1.*. Obinerea A.( din arborele binar
.e 1olosete %# augmentat5 se construiete arborele sintactic -ca 'n e,emplul anterior/ i se
aplic o metod de analiz sintactic$ .e poate demonstra c strile importante din "0N ec9i6alent
%# sunt ec9i6alente cu poziia 1runzelor din arborele sintactic corespunztor %#$ De aceea5 metoda
obine direct un "0D5 iar strile lui 6or 1i mulimi de poziii din arborele sintactic$
!rin tra6ersri peste arborele construit5 pentru 1iecare nod n din arbore5 se 6or determina 3
1uncii notate8 Anulabil n!5 3rimapozn! 5 Ultimapozn!5 3ozurmi!5 unde n este identi1icatorul
nodului$ "0D se 6a obine din 1uncia 3ozurmi!5 !rimele + 1uncii sunt de1inite de nodurile
arborelui sintactic i se 1olosesc 'n calculul lui 3ozurmi!5 care este de1init numai de poziia din
arbore$
0uncia 'ozurm2i3 7 unde i este o poziie din arborele %#7 reprezint mulimea poziiilor #
care pot urma poziiei i 'n arbore$
!entru e,presia regulat din e,emplul precedent5 3ozurm*! K G15 25 +H$
!oziia 1 corespunde primului a din %#$ Dup acesta poate s urmeze8
- un nou a din aceeai poziie datorit aplicrii operatorului J
- un b din poziia 2 din acelai moti65 consider<nd i 1aptul c operatorul este sau
- un a de pe poziia + cu care 'ncepe irul 1inal abb
!entru a calcula 3ozurmi! trebuie s se cunoasc ce poziii pot 1i puse 'n coresponden cu
primul sau cu ultimul simbol al unui ir generat de o anumit sube,presie din %#$
Dac e,presia este rJ atunci 1iecare poziie care poate 1i prima 'n r poate urma dup 1iecare
poziie care poate 1i ultima 'n r$
Dac e,presia este rs atunci 1iecare poziie care poate 1i prima 'n s poate urma dup 1iecare
poziie care poate 1i ultima 'n r$
0uncia 'rimapoz2n3 este mulimea poziiilor corespunztoare cu primul simbol al tuturor
irurilor generate de sube,presiile cu rdcina 'n n$ "nalog5 4ltimapoz2n3 este mulimea poziiilor
corespunztoare cu ultimul simbol dintr7un ast1el de ir$
!entru e,presia regulat din e,emplul precedent5 dac n este rdcina arborelui5
3rimapozn! K G15 25 +H5 Ultimapozn! K G;H$
!entru calculul acestor 1uncii este necesar s se determine acele noduri care sunt rdcini
ale unor subarbori ce pot genera irul 6id$ "semenea noduri se numesc anulabile$ \om de1ini o
1uncie Anulabil2n3 care 6a returna 6aloarea logic &r)e dac n este un nod anulabil5 i 5alse 'n caz
contrar$
+4
%,ist 2 reguli de baz i + reguli inducti6e pentru cei + operatori$ !e baza acestor reguli5
parcurg<nd arborele de la 1runze spre rdcin5 se pot determina 6alorile celor + 1uncii$
#egulile de calcul sunt urmtoarele8
Nr$ Nodul n Anulabil n! 3rimapoz n! Ultimapoz n!
1$ 0runz cu
etic9eta true
2$ 0runz eti7
c9etat cu i 1alse GiH GiH
+$ Anulabilc*! 3rimapozc*! Ultimapozc*!
sa) Anulabilc,! 3rimapozc,! Ultimapozc,!
3$ Anulabilc*! (ac Anulabilc*! (ac Anulabilc,!
6i Anulabilc,! a&)nci 3rimapozc*! a&)nci Ultimapozc,!
3rimapozc,!
Ultimapozc*!
al&5el 3rimapozc*! al&5el
Ultimapozc,!
4$ true 3rimapoz c*! Ultimapoz c*!
+;
n 1
c
1
c
2

c
1
c
2
n
c
1
* n
Obser6aii8
- !entru 4ltimapoz regulile sunt similare cu cele de la 'rimapoz5 doar c se 'nlocuiete 'rimapoz
cu 4ltimapoz i se intersc9imb c1 cu c2 -unde este cazul/$
- #egula 4 pentru Anulabil n! arat c dac nodul n este 'nc9iderea e,presiei prin J atunci
Anulabil n! este true5 deoarece 'nc9iderea e,presiei prin J genereaz un limbaj care include cu
certitudine pe $
- #egula 3 pentru !rimapoz arat c dac 'n e,presia rs5 r genereaz pe -adic Anulabilc*! K
true/ atunci 3rimapoz s! ?se 6ede? prin r i se include 'n 3rimapoz n!$ :n caz contrar5 3rimapoz
n! 6a conine 3rimapoz r!$
0unciile 3rimapoz n! i Ultimapozn!5 calculate pentru e,emplul precedent sunt8
C
;
b
4
b
3
a
+
J
N
b a

1
2
-aNb/JabbC
12 +34;
G1525+H G;H
G1525+H G4H
G1525+H G3H
G4H G4H
G;H G;H
G3H G3H
G+H G+H
N1
N2
N+
N3
N4
N;
NB
N1M
NA
G152H G152H
G152H G152H N11
N12
G1525+H
G+H

NL
N1+
G152H G152H
#egulile pentru calculul lui 'ozurm2i3 sunt8
i/ Dac n este un nod7concatenare -b/5 cu 1iul st<ng c1 i cu 1iul drept c2 i
i4ltimapoz2c135 atunci se include 'rimapoz2c23 'n 'ozurm2i3$
ii/ Dac n este un nod7'nc9idere -J/ i i4ltimapoz2n35 atunci se include
'rimapoz2n3 'n 'ozurm2i3$
+B
:n e,emplul dat5 a6<nd 1unciile 3rimapoz n! i Ultimapozn! calculate5 se determin
3ozurmi!"
Nod !oziie "nulabil !rimapoz >ltimapoz !ozurm
N1+ 2 1alse G 2 H G 2 H G 1525+ H
N12 1 1alse G 1 H G 1 H G 1525+ H
N11 7 1alse G 152 H G152 H
N1M J true G152 H G 152 H 7
NL + 1alse G + H G + H G 3 H
NA b true G 152 H G 152 H 7
NB 3 1alse G 3 H G 3 H G 4 H
N; b 1alse G 1525+ H G + H 7
N4 4 1alse G 4 H G 4 H G ; H
N3 b 1alse G 1525+ H G 3 H 7
N+ ; 1alse G ; H G ; H
N2 b 1alse G 1525+ H G 4 H 7
N1 b 1alse G 1525+ H G ; H 7
.e parcurge arborele5 lu<nd 'n considerare numai nod7cat i nod7stea8
N2 este 1iu st<nga 5 N+ este dreapta5 deci includem ; 'n 3ozurm pentru 4$
N3 este 1iu st<nga 5 N4 este dreapta5 deci includem 4 'n 3ozurm pentru 3$
N; este 1iu st<nga 5 NB este dreapta5 deci includem 3 'n 3ozurm pentru +$
NA este 1iu st<nga 5 NL este dreapta5 deci includem + 'n 3ozurm pentru 1 i 2$
N1M este nod7stea5 deci includem G 152 H 'n 3ozurm pentru 1 i 2$
Deci8
!oz$
Pozur
m
1 G1525+H
2 G1525+H
+ G3H
3 G4H
4 G;H
; 7
0uncia 3ozurm se poate reprezenta ca un gra1 orientat5 a6<nd c<te un nod pentru 1iecare
poziie i un arc orientat de la i la j5 dac j este 'n 3ozurmi!"
+A
a
1
a
2
b
a b
+ 3 4
;
a
b b
C
"cest gra1 este un "0N 1r pentru %# dat5 dac sunt 'ndeplinite condiiile8
- Toate poziiile din 3rimapoz rad! de6in stri de start G1525+H
- 0iecare arc orientat -i5j/ este etic9etat cu simbolul din poziia j
- .tarea asociat cu C este singura stare acceptoare
Not<nd cu rad nodul rdcin al arborelui i prelu<nd notaiile D&ranz i Ds&ri de la cursul anterior5
algoritmul de trans1ormare a arborelui %# 'n "0D este8
-r'ce()ra E),A./ es&e
Jiniializeaz Dstri cu 3rimapoz rad!
Jla 'nceput strile din Dstri sunt nemarcate
c3& &i,- e,ist stare nemarcat 0 'n Dstri exec)&
Jmarc9eaz 0
-en&r) 1iecare a exec)&
J1ie UK3ozurm p!5 unde p 0 i simbolul din poziia p este a
(ac U i U Dstri a&)nci
Jadaug U ca stare nemarcat la Dstri
4
Jadaug tranziia 0 U la Dtranz
4
4
s53r 6 i& E),A./
%tapele care se parcurg pentru obinerea "0D pe baza arborelui unei %# sunt8
I$.e determin 'rimapoz i 4ltimapoz pentru 1iecare nod al arborelui$
II$.e calculeaz 'ozurm pentru 1iecare poziie5 parcurg<nd arborele de sus 'n jos$
III$.e e,ecut procedura E),A./$
*.2. -mplementarea "eneratorului automat de analizor lexical
.peci1icarea de intrare pentru un generator o reprezint e,presiile regulate care descriu
atomii le,icali5 'nsoite de speci1icaii semantice$ "ciunile semantice sunt sec6ene de program
care se e,ecut atunci c<nd 'n irul de intrare se identi1ic o le,em corespunztoare tiparului cu
care este asociat aciunea$
r1 {aciune 1 }
r2 {aciune 2 }
r+ {aciune + }
R
rn {aciune n }
+L
a
)eneratorul este un program care pe baza speci1icaiilor de intrare produce tabela de
tranziii a automatului$ "nalizorul le,ical 6a 1i 1ormat dintr7un simulator pentru automat5
'mpreun cu tabela de tranziii generat$
)enerator .peci1icare de
intrare
Tabela de
tranziii
.imulatorul citete tamponul de intrare i pe baza tabelei de tranziie identi1ic le,emele$
Ieire
Le,em
Tamponul de intrare
Tabela de
tranziii
.imulatorul
automatului
1init
"utomatul generat la ieire poate 1i nedeterminist sau determinist5 'n 1uncie de
implementarea dorit$
:n continuare 6om analiza c<te6a probleme de proiectare speci1ice pentru cele 2 6ariante de
automate$
a. Genera&'r care i,-le,en&eaz A$N
Considerm tiparele reprezentate prin ri5 iK15n pentru care se 6or construi automatele
nedeterministe N-ri/$ "utomatele pariale obinute se combin 'ntr7un automat general5 5 numit
"0N combinat ast1el8 se introduce o nou stare de start de la care pleac tranziii spre toate cele
n automate$
sM
N-r1/

N-rn/

$
$
$
.imularea automatului combinat se bazeaz pe o 6ariant a algoritmului iniial5 care
recunoate cel mai lung cu6<nt din intrare$ "ceasta 'nseamn c de 1iecare dat c<nd automatul
ajunge la o mulime de stri care conine o stare acceptoare5 6a reine poziia din intrare i tiparul
ri asociat cu acea stare5 dar simularea continu p<n 'n momentul 'n care se ajunge 'n situaia de
terminare5 adic din mulimea de stri curent nu e,ist nici o tranziie pentru simbolul din
intrare$ La atingerea condiiei de terminare5 pointerul de a6ans al intrrii se 6a retrage la poziia
corespunztoare ultimei stri acceptoare marcate$ Tiparul memorat pentru aceast poziie
identi1ic atomul gsit5 iar le,ema recunoscut se gsete 'ntre cei doi pointeri$ Dac nu e,ist
stare acceptoare5 se poate genera un mesaj de eroare$
%,emplu8
.e consider urmtoarele tipare8
3M
a {}
abb {}
a
J
b
@
{}
"utomatele pariale corespunztoare celor + e,presii sunt8
2 1
a
; +
a
3 4
b b
A
a
B
b
b
Combinarea automatelor pariale 'n automatul general este8
A
a
B
b
b

M + 3 4
a b b
1
;
2

a
.e 6a analiza irul de intrare aa:a
ulimea strilor de start8 M515+5B
b a a
B
2
3
B
A
b
terminare
tipar 1
M
1
+
B
tipar +
ulimea de stri iniial este M515+5B$ La intrare a6em simbolul a5 deci se 6a trece 'n
mulimea 2535B$ :ntruc<t starea 2 este stare 1inal5 se reine poziia 2 'n irul de intrare i tiparul 1
asociat cu cu6<ntul recunsocut$ .e continu simularea i pe baza celui de7al doilea a din intrare se
trece 'n starea B5 apoi 'n starea A care este stare 1inal$ !ointerul este acum pe simbolul b din
intrare deci se 6a memora poziia lui b i tiparul + asociat cu irul aab" .e continu simularea
pentru ultimul a la care s7a ajuns i din acest punct nu mai a6em tranziii5 :n consecin5 se re6ine
la ultima coresponden recunosc<nd le,ema aab corespunztoare celui de7al treilea tipar$
Dac e,presiile regulate ar a6ea asociate aciuni semantice5 acestea s7ar e,ecuta 'n
momentul recunoaterii unui tipar$ "ceast operaie nu se 6a 1ace 'n mod automat de 1iecare dat
31
c<nd analizorul ajunge 'ntr7o stare acceptoare corespunztoare unui tipar5 ci numai atunci c<nd
tiparul se do6edete a 1i tiparul care realizeaz cea mai lung coresponden$
:. Genera&'r care i,-le,en&eaz A$D
Dac generatorul 1urnizeaz la ieire un "0D5 programul de simulare este asemntor cu
cel pentru "0N din capitolul anterior5 adic se 6a cuta le,ema de lungime ma,im$
!roblema care apare este c s7ar putea ca prin trans1ormarea "0N7> "0D5 mulimea de
stri din "0N corespunztoare unei stri din "0D s conin mai multe stri acceptoare$ Trebuie
s decidem care stare din cele acceptoare se 6a alege pentru a determina tiparul asociat$ #egula
este c se 6a alege acea stare care corespunde e,presiei regulate a1late mai 'n 1a5 'n ordinea
introducerii e,presiilor$
%,emplu8 "plicm algoritmul de con6ersie automatului generalizat de mai sus8
stare a b tiparul
anunat
M515+5B 2535B A nimic
2535B B 45A a
A 7 A aJb@
B B A nimic
45A 7 ;5A aJb@
;5A 7 A abb
:n mulimea de stri {;5A} ambele stri sunt 1inale$ Deoarece starea ; este stare terminal
pentru o e,presie regulat care apare 'naintea e,presiei regulate pentru starea 1inal A -ordinea de
introducere a 1ost a5 abb5 aJb@/5 se 6a alege starea ; ca stare acceptoare$
!entru irul de intrare aaba5 algoritmul de simulare 6a genera aceleai puncte de marcare
ca i la simularea "0N$
=. Analiza sin&ac&ic C=
%ste etapa din construcia compilatorului 'n care se recunosc construciile sintactice ale
programului$ #egulile care descriu structura sintactic a programelor corecte pentru un anumit limbaj
de programare se e,prim 'n mod uzual prin gramatici independente de conte,t scrise de e,emplu 'n
notaia *N0$ >tilizarea gramaticilor pentru descrierea limbajelor de programare are urmatoarele
a6antaje8
a$ gramatica reprezint o notaie precis a unui limbaj5 relati6 uor de reinut=
b$ s7au elaborat metode de construcie manual sau automat de analizoare sintactice
e1iciente pentru limbaje descrise prin gramatici= aceste metode permit i punerea 'n
e6iden a unor ambiguiti sintactice care ar trece neobser6ate 'n 1aza de de1iniie a
limbajului sau la 'nceputul proiectrii compilatorului
c$ descrierea limbajului printr7o gramatic corect 1a6orizeaz procesul de detectare a
erorilor i de traducere a programului surs 'n cod obiect
d$ dac limbajul e6olueaz 'n timp5 i apar construcii de limbaj noi -completri la sinta,/
care trebuie s e1ectueze sarcini noi -completari la semantic/5 construciile noi se pot
aduga mai uor limbajului iniial5 iar modi1icrile implicate 'n compilator sunt mai
simple
:n cele ce urmeaz5 se 6or prezenta principalele metode de analiz sintactic utilizate 'n
compilatoare$ .e 6or studia conceptele generale ]operaii cu gramatici5 trans1ormri aplicate
gramaticilor75 te9nici de implementare manual a analizoarelor sintactice precum i te9nici de
generare automat a analizoarelor sintactice$ etodele prezentate se 6or completa cu te9nici speci1ice
de re6enire 'n caz de eroare$
=.1. 0'l)l analizei sin&ac&ice
32
"nalizorul sintactic primete ca intrare de la analizorul le,ical un ir de atomi le,icali i are
sarcina de a 6eri1ica dac irul respecti6 poate 1i generat de gramatic$ :n caz de eroare 6a trebui s
semnaleze c<t mai clar at<t poziia c<t i cauza erorii i s apeleze rutine de tratare i re6enire din
erori pentru a putea continua analiza$
atom
!rogram arbore cod cod
surs citire atom
Ieirea analizorului sintactic este o reprezentare a arborelui sintactic corespunztor irului
de atomi 1urnizat de analizorul le,ical$ :n di1erite cazuri practice5 arborele sintactic poate s nu 1ie
construit e1ecti6 ca o structur de date real5 c9iar dac el apare implicit 'n timpul analizei$ :n a1ara
construirii arborelui sintactic5 analiza sintactic are i alte sarcini8 colectarea de in1ormaii despre
atomi i depunerea lor 'n tabela de simboluri5 e,ecutarea 6eri1icrilor de tip5 analiza de domeniu5 alte
6eri1icri semantice merg<nd p<n la generare de cod intermediar$
%,ist + tipuri de analizoare sintacice bazate pe gramatici8
7universale8 pot analiza orice gramatic dar sunt practic ine1iciente
7analiz'are sin&ac&ice (escen(en&e -&'--('>n -arsin/ denumite i analizoare LL/
7analiz'are sin&ac&ice ascen(en&e -:'&&',-)- -arsin/ denumite i analizoare L#/
Cele mai e1iciente analizoare sintactice ascendente respecti6 descendente 1uncioneaz pentru
subclase de gramatici5 aceste subclase conin 'ns majoritatea construciilor de limbaj uzuale$
etodele bazate pe clasele de gramatici analizabile LL sunt utilizate 'n analizoare sintactice
implementate manual5 iar cele pentru gramatici L# sunt mai generale i utilizate 'n metodele de
generare automat$
=.1.1. Tra&area er'ril'r sin&ac&ice
>n compilator trebuie s localizeze cu precizie o eroare5 s identi1ice natura erorii i s
asigure continuarea analizei$ O prim di1icultate pro6ine din 1aptul c de1iniiile limbajelor de
programare nu cuprind i tratarea erorilor5 reacia 1iind lsat 'n totalitate 'n sarcina proiectantului
compilatorului$
!lani1icarea erorilor de la 'nceputul proiectrii compilatorului poate s simpli1ice structura
acestuia i s 'mbuntaeasc reacia compilatorului la erori$ !rogramele pot conine erori la di1erite
ni6ele8 le,ical5 sintactic5 semantic i logic$ Cele mai multe erori detectabile 'n 1aza de compilare sunt
erorile sintactice5 iar metodele de analiz sintactic dispun de te9nici per1ormante de detectare de erori
care 'n anumite situatii garanteaz cu certitudine detecia tuturor erorilor$ !entru erorile semantice i
logice nu e,ist metode de detecie at<t de precise$
La 'nt<lnirea unei erori5 analizorul sintactic trebuie s raporteze clar i precis eroarea i s
aplice o metod de re6enire din eroare$ Toate aceste sarcini trebuie ast1el implementate 'nc<t s nu
reduc semni1icati6 6iteza de prelucrare a programelor corecte$ O tratare complet i detaliat a
tuturor acestor probleme este di1icil de realizat 'n practic$ De obicei se pre1er mecanisme mai simple
de tratare a erorii care se bazeaz pe ideea c majoritatea erorilor de compilare care apar sunt simple i
uor de detectat$
etodele de analiz sintactica LL i L# au proprietatea de pre1i, 6iabil5 adic sesizeaz
apariia unei erori imediat ce apare la intrare un pre1i, care nu corespunde nici unui ir din limbaj5
moti6 pentru care sunt considerate metode rapide din punct de 6edere al deteciei erorilor$ La
raportarea unei erori se indic de obicei locul 'n care s7a detectat eroarea5 1r a e,ista certitudinea c
3+
"nalizor
le,ical
"nalizor
sintactic
#estul prg$ de
1ront7end
Tabela de simboluri
acela este locul erorii$ %,ist totui probabilitatea ca eroarea s 1ie c9iar 'n acel loc sau 'n imediata lui
6ecinatate5 cel mult c<ti6a atomi mai 'n 1a$ Natura erorii se precizeaz prin mesaje de eroare5 dac
e,ist o probabilitate mare de estimare corect se genereaza un mesaj e,act5 de e,emplu `lipsete=a5
dac nu5 este de pre1erat un mesaj mai 6ag8 asinta, errora$
:n ceea ce pri6ete metodele de re6enire din eroare5 e,ist c<te6a metode generale$ :n
principiu5 compilarea nu poate 1i abandonat dec<t la erori gra6e5 iar analiza trebuie reluat dintr7un
punct c<t mai apropiat de locul erorii cu condiia ca prin re6enire s nu se introduc erori noi$
=.1.2. !&ra&e/ii (e re;enire (in er'ri
%,ist + strategii acceptate8
a$ ,'()l (e -anic ] este metoda cel mai 1rec6ent 1olosit i cel mai uor de implementat$
:n momentul detectrii unei erori se elimin din intrare unul sau mai multe simboluri
p<n c<nd se ajunge la un atom special de sincronizare5 iar din acest punct al intrrii
analiza se poate relua$ etoda are a6antajul c se ajunge 'ntotdeauna la s1<ritul sirului
de intrare i nu pot aprea cicluri in1inite 'n analiz$ Ca i atomi de sincronizare se aleg
di1erii delimitatori speci1ici limbajului$
b$ re;enirea la ni;el (e -r'-'zi2ie ] la detectarea unei erori5 analizorul 'ncearc s 1ac
corecii locale 'n irul de intrare5 de genul8 'nlocuirea unui simbol cu altul5 tergerea sau
inserarea unui simbol$ !rin aceste modi1icri urmrete s construiasc un pre1i, corect al
intrrii 'n locul celui eronat$ La aceast metod e,ist pericolul ciclului in1init -de
e,emplu la inserarea repetat a unuia i aceluiai simbol5 1r a se putea continua
analiza/$ Deza6antajul principal al metodei este c nu permite corecii adec6ate 'n cazul
'n care eroarea este 'nainte de punctul de detecie$
c$ )&ilizarea -r'()c2iil'r (e er'are ] este o metoda care impune cunoaterea precis a
tipurilor de eroare ce se pot 'nt<lni i practic5 numrul erorilor posibile nu este 1oarte
mare$ !entru aceast metod se suplimenteaz gramatica limbajului cu producii care s
genereze i construcii eronate5 iar analizorul sintactic se construiete pe baza acestei
gramatici e,tinse$ Dac pe parcursul analizei se utilizeaz o producie de eroare5 aciunile
asociate cu acea producie nu 6or conduce la traducere ci la un mesaj de eroare$
d$ e5ec&)area (e c'rec2ii /l':ale ] este o metod teoretic care compar programul , cu un
program F obinut printr7un numr minim de trans1ormri5 presupus a 1i cel `intenionat
de programatora$
=.2. r'iec&area )nei /ra,a&ici !entru a 1i analizat sintactic5 un limbaj 6a 1i descris 'n continuare
printr7o gramatic independent de conte,t$
O gramatic independent de conte,t nu poate descrie 'ns complet sinta,a unui limbaj de
programare5 deoarece e,ist i constructii dependente de conte,t i acestea 6or trebui tratate 'n 1azele
urmtoare de analiz -de e,emplu cerina ca un identi1icator s 1ie declarat 'nainte de utilizare/$ O alt
problem care se pune este 1aptul c 1iecare metod de analiz poate trata numai gramatici de o
anumit 1orm i de aceea este uneori necesar ca gramatica iniial s 1ie trans1ormat pentru a o 1ace
analizabil prin metoda aleas$ :n acest subcapitol se 6or trata acele trans1ormri care 1ac o gramatic
potri6it pentru metode descendente de analiz8 eliminarea ambiguitii din gramatic5 eliminarea
simbolurilor inutile5 eliminarea recursi6itii de st<nga5 1actorizarea la st<nga/$
=.2.1. C',-ara2ie8 ex-resii re/)la&e-/ra,a&ici in(e-en(en&e (e c'n&ex&
!<n acum5 pentru descrierea atomilor le,icali5 s7au 1olosit 'n principal e,presiile regulate$
#egulile le,icale sunt simple i descrierea lor nu necesit un 1ormalism at<t de puternic ca i cel o1erit
de gramatici$
%,presiile regulate5 1a de gramatici o1er urmtoarele a6antaje8
a$ pentru structuri simple de limbaj reprezint notaii mai precise i mai clare dec<t
gramaticile
b$ analizorul le,ical realizat pe baza e,presiilor regulate are structura mai simpl i poate 1i
mai uor generat automat$
33
Observa$ie8 0iecare construcie e,primabil printr7o e,presie regulat se poate descrie i
printr7o gramatic independent de conte,t5 respecti6 orice automat 1init nedeterminist se poate
trans1orma 'ntr7o gramatic care generaz acelai limbaj$
%,emplu$ 0ie e,presia regulat8 -aNb/Jabb$ %i 'i corespunde un "0N di 1igura urmtoare8
+
a
b
M 1 2
a
b
b
!e baza acestui "0N se poate construi gramatica8
)8 "M a"M N b"M N a"1
"1 b"2
"2 b"+
"+
etoda de trans1ormare este8
- !entru 1iecare stare i din automat se creaz un neterminal "i
- !entru 1iecare tranziie 2 i
a
se creaz 'n gramatic o construcie de 1orma "i a"j
- !entru 1iecare tranziie 2 i

se include 'n gramatic o construcie de 1orma "i "j


- !entru 1iecare stare 1inal i se include 'n gramatic c<te o producie "i
- .imbolul corespunztor strii de start de6ine simbol de start al gramaticii$
Nu e,ist reguli 1i,e de di6izare a unui limbaj 'n parte le,ical i nele,ical$ De obicei se
descriu prin e,presii regulate i se trateaz la e,presii regulate construciile simple ale unui limbaj8
identi1icatori5 numere5 iruri de caractere5 iar 'n 1aza de analiz sintactic se trateaz construciile mai
comple,e care se e,prim prin relaii recursi6e8 instruciuni5 declaraii5 e,presii etc$
=.2.3. Gra,a&ici a,:i/)e. %xe,-l) (e &rans5'r,are a )nei /ra,a&ici a,:i/)e 7n&r-' /ra,a&ic
nea,:i/) ec+i;alen&
"nalizorul sintactic pentru un limbaj genereaz implicit sau e,plicit arborele sintactic pentru
irul de intrare dat$ Din aceast cauz este important ca arborele care se asociaz s 1ie unic$
Considerm urmtoarea gramatic 8
. "*N*C
" D
* %
C D
D aNb
% aNb
Dac irul din intrare este UabV5 atunci pentru aceast propoziie se pot 1orma doi arbori8
34
.
" *
%
D %
a b
.
* C
%
% D
a b
De5ini2ie8 O )IC se numeste ambigu dac 'n limbajul generat e,ist o propoziie care admite mai
mult dec<t un arbore sintactic5 obinut prin deri6ri dinstincte= 'n caz contrar gramatica este
neambigu$ Cu toate c gramaticile ambigue reprezint o descriere mai compact i mai clar a unui
limbaj5 ele sunt 'n general o piedic5 un incon6enient 'n plus$
!entru acelai limbaj5 pot e,ista at<t gramatici ambigue c<t i gramatici neambigue care s7l genereze$
Exemplu8 )18 . i
4
N ..
)28 . i
4
N i
4
.
L-)1/KL-)2/KGi
42
N 2QK1H
)1 este ambigu deoarece de e,emplu pentru i
14
a6em dou deri6ri st<nga8
. .. ... i
4
.. i
1M
. i
14
. .. i
4
. i
4
.. i
1M
. i
14
'n timp ce )2 este neambigu$
De5ini2ie8 >n limbaj se numete inerent ambiguu dac orice gramatic care7l genereaz este ambigu$
%,emplu de trans1ormare a unei gramatici ambigue 'ntr7o gramatic ec9i6alent neambigu$
Considerm urmtoarea gramatic a e,presiilor matematice8
)1K P G%H5 G@5J5-5/5idH5 3*5 % Q
3*8 % %@% N %J% N -%/ N id
"plic<nd produciile gramaticii5 e,presiei id@idJid 'i corespund urmtorii arbori sintactici8
%
%
%
@
id %
%
J
id id
%
%
%
J
id
%
%
@
id
id
"mbiguitatea se poate rezol6a dac stabilim care dintre operatorii UJV i U@V este mai prioritar$
!entru primul arbore operatorul mai prioritar este UJV iar pentru al doilea este U@V$ odi1ic<nd
gramatica ast1el8
)2K P G%5T50H5 G@5J5-5/5idH5 3,5 % Q
3,8 % %@TNT
T TJ0 N 0
0 -%/ N id
Obinem pentru e,presie un arbore unic8
3;
%
%
T
@
id
T
0
J
id
id 0
T
0
"mbiguitatea s7a eliminat prin 1i,area prioritii mai mari pentru operatorul de UJV 1a de
operatorul U@V$ :n general eliminarea ambiguitii implic mrirea numrului de neterminale$
:n teoria limbajelor 1ormale se demomstreaz urmatoarele teoreme8
1$ Limbajele regulate din clasa L+ sunt neambigue$
2$ O reuniune a unui numr 1init de limbaje neambigue disjuncte 2 c<te 2 reprezint de
asemenea un limbaj neambiguu$
Teorema 2 permite ca studierea ambiguitii s se 1ac pentru pri ale limbajului5 c9iar pentru un set
mic de producii$
.7a demonstrat 1aptul c nu e,ist un algoritm care accept<nd orice )IC s determine 'n timp
1init dac aceasta este sau nu ambigu$ %,ist doar un set de condiii care dac sunt satis1acute de
gramatic atunci este cert c gramatica nu este ambigu$ "ceste condiii sunt su1iciente dar nu i
necesare5 adic o gramatic poate 1i neambigu i 1r s respecte aceste condiii$
=.2.?. %li,inarea si,:'l)ril'r in)&ile (in&r-' /ra,a&ic
0ie gramatica ) K P N5T535.Q5 unde \) KN > T este 6ocabularul gramaticii$ >n simbol \) este
inutil dac nu e,ist nici o deri6are de 1orma8
. K
J
Q u 6 K
J
Q u , 6 unde u5,56 T
J
#elaia de mai sus descrie dou tipuri de simboluri inutile8
a$ simboluri inaccesi:ile 8 sunt acele simboluri care nu pot 1i generate prin nici o deri6are pornind de
la simbolul de start ] nu apar 'n nici o propoziie generat de gramatic= este simbol inaccesibil
b$ simboluri ne5inaliza&e 8 sunt acele simboluri care nu se pot trans1orma 'ntr7un ir e,clusi6 de
simboluri terminale5 oric<te deri6ri s7ar aplica
:n timp ce simbolurile inaccesibile pot 1i at<t terminale c<t i neterminale5 cele ne1inalizate pot 1i
doar neterminalele gramaticii$
.e poate demonstra c pentru orice )IC cu limbajul generat L-)/ e,ist o gramatic
ec9i6alent cu ea -deci genereaz acelai limbaj/ care nu are simboluri inutile$
%liminarea simbolurilor inutile din gramatic se poate 1ace 'n doi pai8
1$ se caut i se elimin toate simbolurile ne1inalizate precum i relaiile care le conin
2$ se determin i se elimin toate simbolurile inaccesibile i relaiile corespunztoare lor
)ramaticile care descriu limbajele de programare sunt obligatoriu 1r simboluri inutile$
=.2.@. %li,inarea rec)rsi;i&2ii (e s&3n/a (in&r-' /ra,a&ic
3B
O gramatic este recursi6 la st<nga dac are cel puin un neterminal " pentru care e,ist o
deri6are de 1orma8 " K
@
Q " unde este un ir oarecare$ :n mod similar se de1inete recursi6itatea la
dreapta a unei gramatici $
etodele de analiz sintactic descendent nu pot trata gramaticile recursi6e la st<nga
-analizorul intr 'n ciclu in1init/ rezult<nd deci c pentru a 1ace o gramatic analizabil prin aceast
metod este necesar s se elimine acest tip de recursi6itate$ Cazul cel mai simplu 'l constituie acela 'n
care gramatica are producii de 1orma8
""5 ceea ce 'nseamn recursi6itate de st<nga imediat$ "cest tip de recursi6itate se rezol6 simplu
'n 1elul urmtor8
"6<nd produciile " " N unde nu 'ncepe cu neterminalul "5 se introduce un nou neterminal "V
iar produciile se modi1ic 'n 1elul urmtor8
" "V
"V "V N
.e poate arta uor c limbajul generat de noua gramatic nu s7a sc9imbat$
%,emplu8
% % @ T N T
T T J 0 N 0
0 -%/ N id
!roduciile recursi6e sunt cele pentru % i T$
KQ % T %V %V @ T %V N
T 0 TV TV J 0 TV N
0 -%/ N id
Al/'ri&, (e eli,inare a rec)rsi;i&2ii s&3n/a i,e(ia&e
La modul general5 recursi6itatea st<nga imediat pentru un simbol " se poate elimina prin
urmtoarea metod8
7 se grupeaz produciile pentru "
" " 1 N " 2 N RN " m N 1 N RN n
ast1el 'nc<t nici un i nu 'ncepe cu "
7se 'nlocuiesc produciile pentru " prin urmtoarele producii ec9i6alente8
" 1 "V N 2 "V NRN n "V
"V 1 "VN 2 "VN RN m "V N
etoda elimin orice caz de recursi6itate imediat cu condiia ca nici un i s nu 1ie $
%liminarea recursi6itatii de st<nga s7a obinut prin trans1ormarea ei 'n recursi6itate de dreapta care
'ns nu deranjeaz 'n procesul de analiz descendent$
#ecursi6itatea de st<nga poate s nu 1ie imediat$ De e,emplu pentru gramatica8
. " a N b
" " c N . d N
"t<t pentru . c<t i pentru " e,ist producii recursi6e5 pentru . recursi6itatea ne1iind imediat$
.e prezint un algoritm care elimin complet recursi6itatea st<nga cu condiia ca gramatica s
nu aib cicluri - "K
@
Q "/ i s nu aib producii 6ide -"/$ !roblema ciclului i a produciilor 6ide
poate 1i rezol6at anterior aplicrii algoritmului de mai jos5 prin trans1ormri speci1ice$
Al/'ri&, (e eli,inare a rec)rsi;i&2ii s&3n/a
1$ se aranjeaz neterminalele gramaticii 'ntr7o anumit ordine i se numeroteaz "15 "25 R"n
2$ 1or i8K1 to n do begin
1or j8K1 to i71 do begin
J inlocuiete 1iecare producie de 1orma "i "j prin producia
3A
"i 1 N R N 2 unde "j 1 N R N 2 reprezint toate produciile corespunztoare
lui "j
J elimin recursi6itatea st<nga imediat pentru "i5 dac este cazul
end=
end=
"lgoritmul 1uncioneaz corect deoarece 'nainte de iteraia i oarecare orice producie de
1orma "2 "l cu 2P i are 'n mod obligatoriu l Q2$ Ca rezultat5 la urmtoarea iteraie -i/5 ciclul
interior -cu j/ 6a ridica progresi6 limita in1erioar m 'n orice producie "i "m p<n c<nd m i$
%limin<nd acum recursi6itatea imediat pentru "i5 rm<ne m Q i5 adic poate 'ncepe urmtoarea
iteraie$
Trasarea algoritmului pentru gramatica anterioar8 -c9iar dac e,ist producie 6id pentru "5 pentru
gramatica dat nu deranjeaz/
1$ ordonm produciile pentru . i "
2$ pentru iK1 bucla pentru j nu are e1ect -neterminalul ./
pentru iK2 adic neterminalul "
" "c N "ad N bd N
Introducem un neterminal nou "V i obinem
" bd"V N "V
"V c"V N ad"V N
s7a obinut gramatica
. "a N b
" bd"V N "V
"V c"V N ad"V N
=.2.=. $ac&'rizarea la s&3n/a
Dac pentru un neterminal " e,ist mai multe alternati6e care 'ncep cu acelai simbol sau
acelai grup de simboluri5 'n procesul de analiz top7doOn nu se poate decide care alternati6 s 1ie
aleas$ 0actorizarea 'nt<rzie luarea deciziei p<n 'n momentul 'n care parcurg<nd su1iciente simboluri
din intrare e,ist su1icient in1ormaie pentru a lua o decizie de e,pandare corect$ Din acest moti6
este necesar introducerea unei etape intermediare de 1actorizare a produciilor de acest gen$
PinstrQ i1 Pe,presieQ t9en PinstrQ else PinstrQ
i1 Pe,presieQ t9en PinstrQ N altce6a
Pe,presieQ b
Dac 'n intrare apare i15 nu se poate ti care din 6ariante s se utilizeze pentru e,pandarea
neterminalului PinstrQ$ :n general se poate nota " 1 N 2 cu $ 0actorizarea const 'n
introducerea unui neterminal "V i trans1ormarea gramaticilor ast1el8 " "V5 "V 1 N 2$
"lgoritmul de trans1ormare8
J pentru 1iecare neterminal " se caut cel mai lung pre1i, comun la dou sau mai multe
alternati6e ale lui "$ Dac atunci toate produciile de 1orma
" 1 N 2 N R N 2 N 5 unde reprezint produciile care nu au pe ca pre1i,/ se 6or
'nlocui cu " "V N 5 "V 1 N 2 N R N 2
J se repet acest procedeu p<n nu mai e,ist neterminale cu alternati6e a6<nd pre1i, comun
PinstrQ i1 Pe,presieQ t9en PinstrQ PinstrprimQ N altce6a
PinstrprimQ else PinstrQ N
Pe,presieQ b
%xe,-l) de eliminarea recursi6itii st<nga dintr7o gramatic
3L
0ie gramatica8
. C* N a= * .a N b= C *b N Cba
"lgoritmul se bazeaz pe ordonarea neterminalelor urmat de prelucrarea produciilor ast1el 'nc<t
s nu apar producii de 1orma "i "j cu j i$
Ordonm neterminalele8
"1 K .5 "2 K *5 "+ K C
)ramatica cu producii numerotate de6ine8
1$ "1 "+ "2 2$ "1 a
+$ "2 "1 a 3$ "2 b
4$ "+ "2 b ;$ "1 "+ ba
!roducia + este 'nlocuit cu8
+Z5 +? "2 "+"2 aN aa
!roducia 4 este 'nlocuit cu8
4Z5 4?5 4?Z "+ "+"2 abN aab N bb
!roduciile 4Z5 4?5 4?Z i ; se 'nlocuiesc datorit recursi6itii st<ngi imediate a lui "+ cu8
"+ aab "Z N bb "Z i "Z "2 ab "ZN ba "Z N
#enumerot<nd produciile5 gramatica de6ine8
M$ "Z "2 ab "Z 1$ "Z ba "Z 2$ "Z
+$ "1 "+ "2 3$ "1 a
4$ "2 "+"2 a ;$ "2 aa B$ "2 b
A$ "+ aab "Z L$ "+ bb "Z
CA
%xe,-l) de eliminarea recursi6itii st<nga dintr7o gramatic
0ie gramatica8
. C* N a= * .a N b= C *b N Cba
"lgoritmul se bazeaz pe ordonarea neterminalelor urmat de prelucrarea produciilor ast1el 'nc<t
s nu apar producii de 1orma "i "j cu j i$
Ordonm neterminalele8
"1 K .5 "2 K *5 "+ K C
)ramatica cu producii numerotate de6ine8
1$ "1 "+ "2 2$ "1 a
+$ "2 "1 a 3$ "2 b
4$ "+ "2 b ;$ "1 "+ ba
!roducia + este 'nlocuit cu8
+Z5 +? "2 "+"2 aN aa
!roducia 4 este 'nlocuit cu8
4Z5 4?5 4?Z "+ "+"2 abN aab N bb
!roduciile 4Z5 4?5 4?Z i ; se 'nlocuiesc datorit recursi6itii st<ngi imediate a lui "+ cu8
"+ aab "Z N bb "Z i "Z "2 ab "ZN ba "Z N
#enumerot<nd produciile5 gramatica de6ine8
M$ "Z "2 ab "Z 1$ "Z ba "Z 2$ "Z
+$ "1 "+ "2 3$ "1 a
4$ "2 "+"2 a ;$ "2 aa B$ "2 b
A$ "+ aab "Z L$ "+ bb "Z
4M
Ti-)ri (e analiz'are sin&ac&ice
.olul analizei sintactice este transformarea irului de atomi lexicali ntr-o
descriere structural a irului n cazul n care acesta e corect, sau ntr-un mesaj de
eroare, n cazul n care irul nu e corect. %escrierea structural este de obicei un
ec!ivalent al arborelui de derivare.
a$ :n principiu5 e,ist dou strategii de construire a arborelui de deri6are8 strategia
descendent5 'n care arborele este construit de la rdcin spre 1runze i strategia ascendent5 'n
care arborele este construit de la 1runze spre rdcin$
:n ambele cazuri5 construcia e g9idat de irul de la intrare$
Corespunztor acestor strategii5 e,ist analizoare sintactice descendente i5 respecti65
analizoare sintactice ascendente$ etodele de analiz sintactic descendent sunt simple
comparati6 cu cele ascendente i permit construirea manual uoar de analizoare sintactice
destul de e1iciente$ "nalizoarele sintactice ascendente sunt mai generale5 adic permit tratarea
unor clase mai largi de limbaje$
b$ O alt clasi1icare a analizoarelor sintactice este dat de e,istena re6enirilor$
>n analizor sintactic cu re6eniri permite prin program posibilitatea 'ncercrii tuturor
alternati6elor de continuare a analizei5 'n situaia 'n care unui neterminal 'i corespund mai multe
alternati6e dintre care nu se poate alege 'n mod uni6oc una e,act la un moment dat al analizei$
"bandonarea unei alternati6e necesit re6enirea la situaia anterioar 'ncercrii ei$
Dac se asigur 'n orice moment o singur posibilitate de continuare a analizei sintactice
se pot realiza analizoare sintactice 1r re6eniri5 care sunt mai e1iciente$
A. Analiza sin&ac&ic (escen(en&
"naliza sintactic descendent const 'n 'ncercarea de a gsi o succesiune de deri6ri
st<nga5 pornind de la simbolul de start5 p<n se obtine irul dat la intrare$ %a este ec9i6alent cu
'ncercarea de a construi arborele sintactic pentru irul respecti65 pornind de la rdcin spre
1runze5 construind nodurile 'n preordine$
A.1. Analiza sin&ac&ic (escen(en& c) re;eniri
Construcia arborelui sintactic 'ncepe de la rdcin5 principalele operaii ale
analizorului sintactic 1iind8
- :nlocuirea unui neterminal " din 6<r1ul sti6ei cu un ir ce reprezint o parte dreapt a
produciilor gramaticii pentru simbolul neterminal respecti65 operaie ce se numete
e,pandare$ La nodul curent etic9etat cu " se selecteaz una din produciile pentru "
i se construiesc 1iii nodului etic9etai cu simbolurile din partea dreapt a produciei5
iar apoi se caut urmtorul nod pentru care se 6a construi subarborele$
- ^tergerea unui terminal din 6<r1ul sti6ei 'n cazul 'n care el coincide cu terminalul
curent de la intrare5 operaie numit a6ans$
"st1el5 analizorul sintactic propune di6erse alternati6e de rescriere pentru 1iecare
neterminal -e,pandare/$ 0iecare alternati6 se constituie 'ntr7un obiecti6 care trebuie demonstrat
i reprezint o structur posibil pentru urmtorul simbol de la intrare$ Dac structura nu e
regsit 'n irul de la intrare5 analizorul 6a propune o alt alternati6 $a$m$d$
Dac urmtorul obiecti6 este un simbol terminal i el e acelai cu simbolul de la intrare5
analizorul e1ectueaz o operaie de a6ans consider<nd obiecti6ul 'ndeplinit$
"rborele sintactic se construiete prin baleierea irului din intrare i cutarea produciei a
crei parte dreapt 'ncepe cu simbolul curent din intrare sau poate 1i dez6oltat ast1el 'nc<t s
corespund cu acesta$ "tomul curent baleiat la intrare se numete si,:'l (e an&ici-are$
41
Iniial5 simbolul de anticipare este cel mai din st<nga atom din irul de intrare$
%xe,-l)l 1.
0ie gramatica )1 cu produciile8
. b"e
" d N d"
i cu6<ntul de intrare8 bdde din limbajul generat de gramatic$
*aleierea irului de intrare5 concomitent cu construcia arborelui decurge 'n 1elul urmtor8
Deoarece obiecti6ul iniial al analizorului este .5 'n primul pas al analizei se propune ca
obiecti6 singura structur posibil5 b"e5 care conduce la arborele de deri6are din 1ig$1$ Operaia
este de e,pandare$ Obiecti6ul iniial5 .5 este ast1el 'nlocuit de structura 1ormat din trei obiecti6e
succesi6e8 b5 "5 e5 care sunt etic9etele descendenilor imediai pentru nodul etic9etat cu .$
6biectivul imediat urmtor este dat de frunza cea mai din st/nga, etic!etat cu terminalul
b. %eoarece este un terminal, el trebuie regsit ca simbol curent n irul de intrare. Pentru
exemplul dat este adevrat i analizorul sintactic face o opera&ie de avans i se propune
recunoaterea unei structuri a lui A din irul de intrare nc neanalizat. 1e ncearc o expandare
cu prima alternativ a lui A) d i se ob&ine arborele din figura -.
.
" b
%
e
0ig$ 1
.
"
b
%
e
0ig$ 2 d
Obiecti6ul " este 'nlocuit cu obiecti6ul d5 terminal care trebuie gsit 'n irul de intrare$
Deoarece urmtorul simbol de intrare este d5 analizorul 1ace un a6ans la obiecti6ul e$ :n acest
moment nu se mai poate a6ansa5 deoarece primul caracter al irului neanalizat este d -nu e/5
analizorul sintactic sesizeaz o eroare 'n luarea deciziilor i se 'ntoarce la cel mai recent obiecti6
propus i depit5 adic " i propune o alt alternati68 d"$
Datorit acestei 'ntoarceri5 are loc o re6enire 'n irul de la intrare p<n la punctul 'n care
se a1la analizorul c<nd a propus prima alternati6 de e,pandare pentru "5 adic dde$
%,pandarea lui " cu d" conduce la arborele din 1ig$ +$ .e 'nlocuiete ast1el obiecti6ul "
cu dou obiecti6e d i "$ >rmtorul obiecti6 imediat este regsirea lui d 'n irul dde5 ceea ce
permite a6ansul i trecerea la obiecti6ul "$ Din nou analizorul propune e,pandarea cu prima
alternati6 d5 urmat de a6ansul cu d5 conduc<nd la arborele din 1ig$ 3$
.
"
b
%
e
0ig$ +
d
%
"
.
"
b
%
e
0ig$ 3
d
%
"
d
%
42
"st1el5 ultimul obiecti6 " este rezol6at i se raporteaz succes obiecti6ului de pe ni6elul
superior5 care este tot " i care 'n acest moment este rezol6at$ >rmtorul obiecti6 de6ine e$
Deoarece irul de la intrare este c9iar e5 se 1ace un a6ans raport<ndu7se succes pentru e i apoi
pentru .$
Coincidena dintre raportarea succesului pentru . i epuizarea irului de intrare este
ec9i6alent cu acceptarea$
.e obser6 c deri6area st<nga a lui . 'n bdde este ec9i6alent cu construirea arborelui de
deri6are a irului$
.

s
b"e

s
bd"e

s
bdde
Dac irul de intrare ar 1i 1ost bddb5 la 'ncercarea de a6ans cu e s7ar 1i 'nregistrat eec5
ceea ce ar 1i dus la re6eniri succesi6e ast1el8 'nt<i o 'ncercare cu o alt alternati6 pentru
neterminalul "$ Deoarece nu mai e,ist o ast1el de alternati65 se re6ine la obiecti6ul b5 care este
cel mai din st<nga descendent a lui .$ Dar acesta este un terminal5 se raporteaz eec pentru
'ntreaga alternati6 b"e$ Deoarece aceasta este singura alternati6 pentru .5 se raporteaz eec
pentru .5 iar acesta 1iind nodul rdcin5 situaia este ec9i6alent cu neacceptarea irului bddb$
Implementarea unui asemenea proces necesit5 pentru e6entualele re6eniri5 memorarea
drumului parcurs 'n arbore5 precum i a punctelor din irul de la intrare 'n care s7a 'nceput
e,pandarea neterminalelor$
%eoarece revenirile se fac strict n ordine invers fa& de cea a axpandrilor i
avansurilor, mecanismul de implementare va fi cel de stiv.
.ti6a poate 1i implementat e,plicit sau implicit5 1olosind mecanismul de implementare al
recursi6itii e,istent 'n multe limbaje de programare$
Observa$ie$ Dac produciile gramaticii ar 1i de 1orma8 " "d N d5 analizorul sintactic ar
e,ecuta 7 pentru orice ir de intrare ] un ciclu in1init$ :ntr7ade6r5 dup a6ansul peste b5 obiecti6ul
urmtor de6ine "5 care se e,pandeaz 'n prima sa alternati65 adic "d5 ceea ce 1i,eaz ca
obiecti6 tot pe " $a$m$d$ O soluie ar 1i s lsm analiza lui "d ultima i s 'ncercm mai 'nt<i cu
d5 dar atunci ciclul in1init ar apare pentru iruri incorecte5 de e,emplu be$ Deci o gramatic
recursi6 la st<nga poate determina ca un analizor sintactic descendent recursi65 c9iar i pentru
6arianta cu re6eniri s intre 'ntr7un ciclu in1init$ "ceast situaie apare atunci c<nd e,pand<nd un
neterminal recursi6 ajungem din nou la e,pandarea sa5 1r s a6ansm 'n irul de intrare$
%xe,-l) (e i,-le,en&are. 0ie gramatica8
) K PG.5"H5 Ga5b5c5dH 5 !5.Q5 unde ! conine produciile8
. c"d
" ab N a
i 1ie O K cad irul de intrare$
.e d un e,emplu de implementare prin scrierea unei 1uncii pentru 1iecare neterminal5
analiz<nd pe r<nd alternati6ele de e,pandare ale neterminalului$ Trecerea la o nou alternati6 are
loc dac 'ncercarea alternati6ei precedente a euat$ "ceast trecere trebuie s restabileasc
indicatorul irului de la intrare$ Dac toate alternati6ele au euat5 se 'ntoarce 6aloarea logic 1als$
Dac o alternati6 e satis1ctoare5 se 'ntoarce 6aloarea logic ade6rat$
"naliza unei alternati6e 'nseamn propunerea pe r<nd ca obiecti6e a simbolurilor
succesi6e ce 1ormeaz alternati6a$ Dac este 6orba de terminal5 se 6eri1ic 1aptul c el coincide cu
simbolul de intrare5 iar dac e neterminal se 6eri1ic dac apelul 1unciei asociate 'ntoarce
6aloarea logic ade6rat$
typedef 32&" 1false4 true= %<<6!
><?32 -tokens; /*iesire de la scanner-/
><?32- to.en ! /-ato0ul curent -/
4+
%<<6 sintax/9AB
/-anali@a sintactica deriMata din 9 -/
1 /-incearca alternatiMa 9 L> c#d -/
if A-to.en ==KcKB1
JJto.en!
if Asintax/#ABB
if A-to.en ==KdKB1
JJto.en!
return true!
=
=
return false!
=
%<<6 sintax/#AB
/-anali@a sintactica deriMata din # -/
><?32 save; /pentru bac.trac.ing -/
saMe = to.en!
1 /-incearca alternatiMa # L> ab -/
if A-to.en ==KaKB1
JJto.en!
if A-to.en ==KbKB1
JJto.en!
return true!
=
=
to.en = saMe! /-esec4 bac.trac.ing -/
1 /-incearca alternatiMa # L> a -/
if A-to.en ==KaKB1
JJto.en!
return true!
=
to.en = saMe! /-esec4 bac.trac.ing -/
/- nu 0ai sunt alternatiMe4 esec -/
return false!
=
Be&'(a -rezen&a& are (') (eza;an&aCe8
- Nu se poate aplica unei gramatici recursi6e la st<nga
- *ac2trac2ing este di1icil de implementat5 deoarece toate aciunile compilatorului
p<n 'n punctul de re6enire -de e,emplu actualizarea tabelei de simboluri/ trebuiesc
terse$ .oluia ar 1i aplicarea analizorului sintactic asupra unor gramatici pentru care
nu mai este necesar procedeul de bac2trac2ing$
(liminarea recursivit&ii st/nga se poate face cu algoritmul prezentat la 5.-.L.
(xamin/nd exemplul dat, se observ c, pentru evitarea procedeului de bac7trac7ing, ar
trebui ca decizia asupra alternativei corecte s poat fi luat doar pe baza urmtorului
simbol de la intrare.
5(emplu de factori#are st8nga a unei gramatici.
43
.evenind la exemplul +, un ir de intrare bdde este respins pentru ordinea de
ncercare d urmat de dA. Astfel, dup avansul lui b i expandarea cu d a lui A, se
avanseaz cu d i se verific existen&a lui e la intrare, ceea ce conduce la eec
#urmtorul simbol este d, nu e$. Acest lucru se datoreaz faptului c d este un prefix al
lui dA i se raporteaz succes la expandarea cu d a lui A at/t n cazul n care alternativa
d este corect, c/t i n cazul n care structura intrrii este dA.
1olu&ia pentru aceast problem este ordonarea alternativelor de tip i
astfel nc/t s l precead pe . Aceast ordonare permite o optimizare) %ac pentru
analiza conform cu se ob&ine succes, se memoreaz starea intrrii i se analizeaz
conform cu . %ac se raporteaz eec, se revine la situa&ia intrrii de la sf/ritul lui i
se raporteaz succes.
=ai general, problema se pune pentru alternativele care ncep la fel. %e
exemplu, A + M - . 9mplementarea prezentat ar fi ncercat + i apoi - . 1e
observ c s-ar fi ncercat de dou ori.
Pentru evitarea acestei situa&ii se recurge la factorizare st/nga)
A AN
AN + M -
*olosind aceast metod, pentru A exist o singur posibilitate, iar alternativele
lui AN difer cu primul simbol, deci este uor de recunoscut alternativa corect fa& de
irul curent de la intrare. Aceast idee st la baza analizei sintactice descendente fr
reveniri. Aceasta ns nu se poate implementa pentru orice tip de gramatic
independent de context. 1e pune problema determinrii unei astfel de gramatici.
A.2. Analiza sin&ac&ic (escen(en& 5r re;eniri
9.2.1. Anali#or sintactic descendent recursi! de tip predicti!

"nalizoarele sintactice cu re6eniri se caracterizeaz printr7un timp mare de analiz5 din
acest moti6 'n practic sunt rar 'nt<lnite$ Dac dintr7o gramatic se elimin recursi6itatea de
st<nga i se aplica 1actorizare la st<nga5 gramatica de6ine analizabil prin metode de analiz
sintactic descendent5 1r s 1ie necesare re6eniri$ >n ast1el de analizor sintactic de numete
analiz'r sin&ac&ic (escen(en& rec)rsi; (e &i- -re(ic&i;.
:n cazul unui analizor sintactic predicti65 pentru un simbol de intrare Ua U i un neterminal
" care urmeaz s 1ie e,pandat5 trebuie s se poat decide care din alternati6ele "7Q1N 2 NRN n
este unica alternati6 din care pot deri6a iruri care s 'nceap cu UaV$ Cu alte cu6inte5 trebuie s
se aleag alternati6a corect cercet<nd doar simbolul curent din intrare -un singur simbol din
intrare/ i a6<nd acces la un singur simbol 'n arbore$
:n majoritatea limbajelor de programare construciile sintactice -instruciuni5 declaraii5
etc$/ 'ncep cu un cu6<nt c9eie tocmai 'n scopul de a 1acilita analiza$ Cu6intele c9eie 1iind distincte
de la o construcie la alta5 pe baza lor se poate alege producia corect pe parcursul analizei
sintactice$
>n analizor sintactic de tip recursi6 se compune tot din proceduri recursi6e5 c<te una
pentru 1iecare neterminal al gramaticii$ .pre deosebire de cazul analizorului cu re6eniri5 unde5
dac alegerea unei alternati6e se do6edete a 1i greit se selecteaz urmtoarea alternati65 'n
acest caz alegerea alternati6ei se 1ace e,clusi6 pe baza simbolului de intrare$ Odat aleas o
alternati65 euarea analizei este ec9i6alent cu neacceptarea intrrii$
.imbolului de anticipare selecteaz uni6oc procedura care trebuie apelat la un moment
dat$ .ec6ena de apeluri pentru prelucarea unui ir de intrare dat de1inete implicit arborele
sintactic corespunztor intrrii$
44
%,emplu$ 0ie produciile unei gramatici8
tip 7Q simplu N cid N arraF WsimpluX o1 tip
simplu 7Q integer N c9ar N num pp num
"nalizorul sintactic se 6a compune din 2 proceduri corespunztoare neterminalelor tip i
simplu precum i dintr7o procedur suplimentar notat coresp care 6a a6ansa simbolul de
anticipare la urmtorul caracter din intrare dup ce 6eri1ic corespondena dintre simbolul de
anticipare i argument$
!rocedure coresp-t8atom/=
*egin
I1 saKt t9en sa8Kurmatorul
%lse eroare-/=
%nd=
!rocedure tip=
*egin
I1 sa 'n Winteger5c9ar5numX t9en simplu
%lse i1 sa K dcd t9en begin
Coresp-UcV/= coresp-id/=
%nd
%lse
I1 saKarraF t9en begin
Coresp-arraF/= coresp-UWU/=
.implu= -J trateaza tipul indicelui J/
Coresp-UXV/= coresp-o1/=
Tip=
%nd
%lse eroare-/=
%nd= GtipH
!rocedure simplu=
*egin
I1 saKinteger t9en coresp-integer/
%lse i1 saKc9ar t9en coresp-c9ar/
%lse i1 saKnum t9en begin
Coresp-num/= coresp-pp/= coresp-num/=
%lse eroare-/=
%nd=
"naliza sintactic propriu7zis -programul principal/ 'ncepe cu un apel la procedura
pentru neterminalul de start al gramaticii -'n acest caz tip/$
Consider<nd analiza irului de intrare arraF W num pp numX o1 integer5 6om a6ea iniial sa
K arraF -simbolul de anticipare/$ :n procedura tip se 6a e,ecuta a treia ramur corespunztoare
celei de7a treia alternati6e din produciile pentru tip$
:n principiu 1iecare neterminal din partea dreapt a produciei care se regsete 'n
construcia procedurii respecti6e 6a determina un apel la procedura pentru acel neterminal iar
1iecare terminal 6a 1i pus 'n coresponden cu simbolul de anticipare$ .a g9ideaz -decide/
selecionarea produciei ce trebuie aplicat$ Dac partea drepat a produciei 'ncepe c9iar cu un
terminal5 acea productie se 6a aplica dac sa coincide cu terminalul$ Dac partea dreapt a
produciei 'ncepe cu un neterminal -e,8 tip 7Q simplu/ atunci 6a 1i selectat acea producie dac
din neterminalul respecti6 pot s deri6eze iruri care s 'nceap cu simbolul de anticipare$
4;
#ezult c analiza sintactic predicti6 se bazeaz pe in1ormaii despre simbolurile care
pot s 1ie primele 'n irul deri6at din partea dreapt a produciei$ Not<nd cu partea dreapt a
unei producii5 se de1inete ca !#I-/ mulimea tuturor simbolurilor terminale care pot s apar
pe prima poziie 'n cel puin un ir deri6at din $ Dac K sau poate genera 5 atunci se include
i 'n !#I-/$
%,emplu8 !#I-cid/KGcH
!#I-simplu/KGinteger5 c9ar5 numH
Dac prile drepte 'ncep cu un terminal -de e,emplu cu6<nt c9eie/ acel terminal este
singurul element al mulimii !#I i determinarea se 1ace 'ntr7un singur pas$
Considerm producia " 7Q N cu dou alternati6e pentru neterminalul "$ "naliza
sintactic descendent recursi6 de tip predicti6 cere ca !#I-/ i !#I-/ s 1ie disjuncte$
Dac aceast cerin nu este 'ndeplinit se poate 'ncerca rezol6area ei prin 1actorizare la st<nga$
>tilizarea produciilor 6ide -/
!roduciile cu 'n partea dreapt impun o tratare special 'n sensul c analizorul sintactic
descendent recursi6 utilizeaz implicit o producie 6id atunci c<nd nu se poate utiliza nici o alt
producie$
Instr 7Q begin corpDinstr end$
CorpDinstr 7Q listaDinstr N
"tunci c<nd se trateaz corpul instruciunii5 dac sa nu este 'n !#I -listaDinstr / nu se
6a e1ectua nici o acti6itate - dar nici nu se d eroare/ presupun<ndu7se c s7a selectat producia $
"cest alternati6 este corect numai dac sa este end5 'n caz contrar se 6a ajunge totui la eroare5
dar 'n procedura care trateaza instr$
A.2.2. r'iec&area )n)i analiz'r)l sin&ac&ic -re(ic&i;
CD
"nalizorul sintactic predicti6 este un program ce const dintr7o procedur pentru 1iecare
neterminal$ 0iecare procedur 6a e,ecuta dou aciuni8
a$ pe baza simbolului de anticipare decide care producie se 6a utiliza=
- dac sa este 'n !#I-/ se 6a utiliza producia cu partea dreapt
- dac e,ist un con1lict -ambiguitate/ 'ntre 2 pri drepte pentru acelai sa5 atunci
gramatica nu poate 1i analizat prin aceast metod$
- dac sa-!#I-// pentru nici o parte dreapt5 se 6a selecta producia cu 'n partea
dreapt -dac e,ist o ast1el de producie/$
b$ acti6itatea procedurii 6a urmri partea dreapt a produciei alese$ >n neterminal 'n partea
dreapt 6a determina apelul procedurii corespunzatoare acelui neterminal5 iar un
neterminal care corespunde simbolului de anticipare determin citirea urmtorului
atom$ :n cazul 'n care atomul din partea dreapt a produciei nu corespunde cu sa se
6a semnala eroare de sinta,$
B$2$+$ %,emplu de analizor sintactic complet realizat prin metoda de analiza cu descendeni recursi6i
)ramatica limbajului este urmtoarea8
program $
4B
bloc
bloc CON.T id K nr =
5
\"# id =
5
!#OC%D>#% = =
instructiune 8K
C"LL
*%)IN %ND
=
I0 TE%N
TEIL% DO
conditie ODD
K
<>
<
<=
>
>=
4A
id e,presie
id
instructiune
e,presie
e,presie
conditie instructiune
id bloc
conditie
instructiune
instructiune
e,presie
1actor identi1icator
e,presie
numar
e,presie @
7
@ 7
termen 1actor
J I
- /
Obser6aie8 J Numerele se consider a 1i de un singur 1el iar 1elul identi1icatorilor nu intereseaz
!rogram analDsintactic=
Label LL= Gabandonarea compilariiH
Const nrcu6c9eieK11=
T,ma,K1MM= Glungimea tabelei de simboluriH
idlungK1M=
TFpe codle, K-nede15 ident5 numar5 plus5 minus5 inm5 impr5 oddcl5 eY5 ne5 ge5 gt5 le5 lt5 prDstg5 prDdr5
6irgula5 punct5 punctD6irg5 atrib5 begincl5 endcl5 i1cl5 t9encl5 O9ilecl5 docl5 callcl5 constcl56arcl5
proccl/=
ObiectK-constanta56ariabila5procedura/=
\ar cl8codle,=
Id8stringW1MX= Gultimul identi1 citit de "L%&H
Num8integer= Gse considera doar nunere intregiH
c98c9ar=
cc5ll8integer=
linie8 Gtamponul de intrareH
c9eie8 arraFW1$$nrcu6c9eieX o1 codle,=
clsing8arraFWc9arX o1 codle,=
ts8 arraFWM$$tma,X o1 record
nume8stringW1MX=
1el8obiect=
%nd=
!rocedure initDanDle,RR
!rocedure eroareR$
!rocedure eroaregra6aR$$
!rocedure carurmR$
!rocedure anle,R$$
!rocedure bloc-t,8integer/=
!rocedure intrare-18obiect/= IIobiect8constante5proceduri5 6ariabile
*egin
t,8Kt,@1= IIe6entual se poate 6eri1ica depasirea indicelui T.
Oit9 tsWt,X do
begin
4L
termen
num8Kid=
1el8K1=
end=
end=
IIcauta id in tab de simb
1unction pozitie-id8stringW1MX/8integer=
6ar i8integer=
begin
tsWMX$nume8Kid= i8Kt,=
O9ile-tsWiX$numePQid/ do dec-i/=
pozitie8Ki=
end=
procedure declconst=
begin
i1 clKident t9en
begin
anle,=
i1 clKeY t9en
begin
anle,=
i1 clKnumar t9en
begin
intrare-constanta/=
anle,=
end=
else eroare-A/= -Jlipseste 6aloare pentru decl de constanteJ/
end=
else eroare-L/= -Jlipseste UKV in decl$ de const J/
end=
else eroare-1M/= -Jlipseste nume constanta J/
end=
procedure decl6ar=
begin
i1 clKident t9en
begin
intrare-6ariabila/=
anle,=
end=
else eroare-11/= -J lipseste nume simbolic J/
end=
procedure instructiune=
6ar i8integer=
procedure e,presie=
procedure termen=
procedure 1actor=
6ar i8integer=
begin
i1 clKident t9en
begin
i8Kpozitie-id/=
i1 iKM t9en eroare-12/
else i1 tsWiX$1elKprocedura t9en eroare-1+/=
anle,=
end=
;M
else i1 clKnumar t9en anle,
else i1 clKprstinga t9en
begin
anle,=
e,presie=
i1 clKprdreapta t9en anle,=
else eroare-13/=
end
else eroare-14/= -J eroare de 1actor J/
end= -J 1actor J/
begin -J termen J/
1actor=
O9ile cl in Winm5imprX do
begin
anle,=
1actor=
end=
end=
begin -Je,presieJ/
i1 cl in Wplus5minusX t9en anle,=
termen=
O9ile cl in Wplus5minusX do begin
anle,=
termen=
end=
end= -Je,presieJ/
procedure conditie=
begin
i1 clKoddcl t9en begin
anle,=
e,presie=
end
else begin
e,presie=
i1 not-cl in WeY5ne5lt5le5gt5geX/t9en eroare-1;/=
else begin
anle,=
e,presie=
end=
end=
end=
begin -JinstructiuneJ/
i1 clKident t9en begin
i8Kpozitie-id/=
i1 iKM t9en eroare-12/= -Jid nedeclaratJ/
i1 tsWiX$1el PQ6ariabila t9en eroare-1B/=
anle,=
i1 clKatrib t9en anle, else eroare-1A/=
e,presie=
end
else i1 clKcallcl t9en begin
anle,=
i1 clPQident t9en aroare-1L/ else begin
i8Kpozitie-id/=
i1 iKM t9en eroare-12/
else i1 tsWiX$1elPQprocedura t9en eroare-2M/=
;1
anle,=
end=
end
else -Jnot callclJ/
i1 clKbegincl t9en begin
anle,=
instructiune=
O9ile clKpunct6irg do begin
anle,=
instructiune= -J descendenta recursi6aJ/
end=
i1 clKendcl t9en anle, else eroare-21/=
end
else i1 clKi1cl t9en begin
anle,=
conditie=
i1 clKt9encl t9en anle, else eroare-22/=
instructiune= -J descendenta recursi6aJ/
i1 clKelsecl t9en begin
anle,=
instructiune=
end=
end
else i1 clKO9ilecl t9en begin
anle,=
conditie=
i1 clKdocl t9en anle, else eroare-2+/=
instructiune=
end
else eroare-23/=
end= -J instructiune J/
begin -J bloc J/
i1 clKconstcl t9en
begin
anle,=
declconst=
O9ile -clK6irgula/ do
begin
anle,=
declconst=
end=
i1 clKpunct6irg t9en anle, else eroare-24/=
end=
i1 clK6arcl t9en
begin
anle,=
decl6ar=
O9ile -clK6irgula/ do
begin
anle,=
decl6ar=
end=
i1 clKpunct6irg t9en anle, else eroare-24/=
end=
O9ile clKprocedurecl do
;2
begin
anle,=
i1 clKident t9en
begin
intrare-procedura/=
anle,=
end
else eroare-2;/=
i1 clKpunct6irg t9en anle, else eroare-24/=
bloc-t,/=
i1 clKpunct6irg t9en anle, else eroare-24/=
end -JO9ileJ/
instructiune=
end= -JblocJ/
begin -Jprogram mainJ/
initale,=
anle,=
bloc-M/=
i1 clPQpunct t9en eroare-2B/=
LL8 Oriteln-U1atal errorV/=
end$

A.2. ?. Analiz'r sin&ac&ic -re(ic&i; nerec)rsi; CE
>n algoritm recursi6 poate 1i trans1ormat 'ntr7unul nerecursi6 prin gestiunea e,plicit a unei
sti6e de lucru$ !roblema esenial de rezol6at pentru un analizor sintacti6 predicti6 nerecursi6 -".!N/
este de a alege 'n mod unic producia pentru e,pandarea unui neterminal$
:n 6arianta nerecursi6 aceasta se realizeaz prin cutarea 'ntr7o tabel de analiz sintactic$
Din acest punct de 6edere metoda este dirijat de tabele$
tampon de intrare
sti6a ieire

- Tamponul de intrare conine iruri care se 'nc9eie cu e


- .ti6a conine simboluri gramaticale -terminale i neterminale/$ Iniial conine simbolul
de start al gramaticii5 urmat de simbolul e$
;+
e
O e
".!N
tabela de ".!N
- Tabela de ".!N are liniile etic9etate cu neterminalele gramaticii i coloanele etic9etate
cu simbolurile terminale$ O intrare 'n tabela este de 1orma8 W"5aX5 unde " este
neterminal5 a este terminal5 iar W"5aX poate 1i o producie sau poate 1i intrare 6id$
- UIeireV reprezint aciunile ce se e,ecut la recunoaterea unei producii5 iar aceste
aciuni pot 1i mesaje de eroare 'n cazul intrrilor 6ide5 arbori sintactici5 cod 6irtual5 etc$
"nalizorul 6a semnala la ieire recunoaterea irului din intrare$
A.2.@. $)nc2i'narea )n)i A!N
Not<nd cu U&V simbolul din 6<r1ul sti6ei i cu UaV simbolul din intrare5 1uncionarea unui
".!N poate 1i 1ormulat ast1el8
J dac &KaKe5 analiza se 'nc9eie cu succes
J dac &KaPQe se e,trage & din sti6 i se a6anseaz pointerul din intrare= 'n acest caz s7a analizat cu
succes simbolul din intrare
J dac & este neterminal5 se analizeaz elementul W&5aX i 'n 1uncie de 6aloarea lui5 se e,ecut urmtoarele aciuni8
a$ W&5aX K &7Q>\T se elimin & din sti6 i 'n locul lui se introduce T\> ast1el 'nc<t >
sa apar 'n 6<r1
b$ W&5aX K 6id5 se apeleaz procedura pentru tratarea i re6enirea din erori
Algoritmul de analiz sintactic predictiv nerecursiv:
intrare 8 irul O i tabela de analiz corespunztoare unei gramatici )
ieire 8 dac O L-)/ atunci irul de deri6ri st<nga pentru O5 'n caz contrar un mesaj de eroare
sti6a 8 iniial conine simbolul e iar 'n 6<r1 simbolul de start al gramaticii .
.
e
tamponul de intrare 8 conine irul din intrare terminat de simbolul e
O e
J se poziioneaz pointerul 'n intrare pe primul simbol din O
repeat
J 1ie F simbolul din 6<r1ul sti6ei i a simbolul curent din intrare
J i1 F este un terminal sau G t9en
J i1 F Ka t9en e,trage F din sti6 i a6anseaz pointerul 'n intrare
else eroare-/
else
i1 WF5aXKGF7QH1 H2 ... HIH t9en
begin
J e,trage F din sti6a
J introdu 'n sti6a HI,...H2,H1
J tipareste producia F7QH1 H2 ... HI
end
else
eroare-/=
until FKG=
i1 simbolul de intrarePQG t9en eroare-/$
Exemplu: 0ie gramatica8
)K-G%5 %Z5 T5 TZ5 0H5 Gid5 @5 J5 -5/H5 !5 %/5 unde produciile ! sunt8
% 7Q T %Z
%V 7Q @T %V N
T 7Q 0 TV
TV 7Q J 0 TV N
0 7Q -%/ N id
;3
!resupunem cunoscut tabela de analiz sintactic predicti6 nerecursi6 pentru gramatica dat8
.imbol de intrare
Neterm$ITerm
id @ J - / e
% %7QT%Z 7 7 %7QT%Z 7 7
%Z 7 %Z7Q@T%Z 7 7 %Z7Q %Z7Q
T T7Q0TZ 7 7 T7Q0TZ 7 7
TZ 7 TZ7Q TZ7QJ0TZ 7 TZ7Q TZ7Q
0 07Qid 7 7 07Q-%/ 7 7
Trasarea algoritmului pentru irul de intrare8 id @ id J id
!&i;a in&rare iesire
e% id@idJide
e%V T id@idJide %7QT%V
e%V TV 0 id@idJide T7Q0TV
e%V TV id id@idJide 07Qid
e%V TV @idJide TV7Q
e%V @idJide %V 7Q@T%V
e%V T@ @idJide
e%V T idJide T7Q0TV
e%V TV 0 idJide 07Qid
e%V TV id idJide
e%V TV Jide TV 7QJ0TV
e%V TV 0J Jide
e%V TV 0 Ide 07Qid
e%V TV id ide
e%V TV e TV 7Q
e%V e %V7Q
e e succes
"ciunile analizorului materializate prin producii tiprite urmresc o deri6are st<nga a irului
de intrare$ .imbolurile de intrare care au 1ost deja baleiate5 urmate de simbolurile gramaticale din sti6
-de la 6<r1 spre baz/ sunt 1orme propoziionale st<nga din deri6are$
A.2.=. $)nc2iile -ri, 6i )r,
Dup cum rezult din paragra1ul anterior5 algoritmul de ".!N nu este di1icil$ !roblema
di1icil este construirea tabelului 5 'n con1ormitate cu o gramatic )$ >n pas intermediar 'n aceast
construcie o constituie calculul mulimilor -ri, i )r,. :n plus mulimile )r, sunt 1olosite la
stabilirea erorilor de sincronizare la modul panic$
ulimea -ri,() conine mulimea simbolurilor terminale care pot apare la 'nceputul unui
ir terminal deri6at din 5 inclusi6 dac poate 1i deri6at 'n irul 6id$ - poate 1i terminal sau
neterminal/$
ulimea )r,(A) conine mulimea simbolurilor terminale care pot urma dup un ir deri6at
din neterminalul " 'n terminal$ >n terminal aurm-"/ dac i numai dac e,ist o deri6are .KQJ
"a unde i sunt iruri oarecare de simboluri$ Dac " este simbolul cel mai din dreapta al unei
1orme propoziionale atunci urm -"/$
Calc)l)l 5)nc2iei -ri,()8
J calculul este precedat de calculul prim4! unde 4 este terminal sau neterminal al gramaticii
J calculul se realizeaz prin aplicarea 'n mod repetat a urmtoarelor reguli p<n c<nd nu se mai pot
aduga terminale noi sau la nici o multime prim
1$ dac & este terminal atunci prim-&/KG&H -iniializare/
;4
2$ dac & poate 1i deri6at 'n atunci prim-&/K
+$ dac & este un neterminal i &7Qf1f2$$ f25 atunci5 prim-f1/ se include cu certitudine 'n
prim-&/ mai puin e6entual $ Dac prim-f1/ atunci se include 'n prim-&/ i prim-f2/5etc$5 alt1el
calculul se oprete$
ulimile -ri, pentru neterminalele gramaticii pe baza regulilor de mai sus sunt8
prim-%/KG id 5 - H
prim-%V / KG @ 5 H
prim-T/ K G id 5 - H
prim-TV / K G J 5 H
prim-0/ K G id5 - H
%tapele construirii acestei mulimi sunt8
% %V T TV 0
@ J -5 id iniializare

-5 id

regula %V7Q
regula T7Q0TV
regula TV7Q
-5 id regula %7QT%V
.e poate construi apoi urmtorul tabel8
id @ J - /
prim -%/ true 1alse 1alse true 1alse 1alse
prim -%V/ 1alse true 1alse 1alse 1alse true
prim -T/ true 1alse 1alse true 1alse 1alse
prim -TV/ 1alse 1alse true 1alse 1alse true
prim -0/ true 1alse 1alse true 1alse 1alse
Calculul mulimii )r, pentru neterminalele gramaticii se realizeaz prin aplicarea repetat a
urmtoarelor reguli p<n c<nd nu se mai pot adauga noi simboluri$
1 arcajul e al sirului de intrare se adauga la urm-./$ -iniializare/
2 Dac 'n gramatica e,ist o producie de 1orma " 7Q *5 atunci simbolurile din prim-/ mai putin
aparin lui urm-*/
+$Dac 'n gramatica e,ist o producie de 1orma " 7Q * sau o producie " 7Q * cu prim-/5
atunci adaug urm-"/ la urm-*/$
!entru e,emplul dat a6em urmtoarele etape ale construirii acestei mulimi8
% %V T TV 0
e iniializare
/
@
J
regula %V 7Q @T %V
regula 07Q-%/
regula TV 7Q J 0 TV
e 5 /
e 5 /
e5/5@
e5/5@
regula %7QT%V
regula %V 7Q @T %V
regula T7Q0TV
regula T7Q0TV
e 5 / e 5 / @5e5/ e5/5@ J5e 5 /5@ 0inal
- "daug e la urm-%/ deoarece % este simbolul de start
- Deooarece %V 7Q @T %V 5 prim-%V / mai puin se include 'n urm-T/5 adic @
- Deoarece 0 7Q -%/ 5 se include / 'n urm-%/
- Deoarece TV 7Q J 0 TV 5 se include prim-TV/ mai puin 'n urm-0/5 adic J
- Deoarece % 7Q T %Z se adaug urm-%/ la urm-%Z/5 adic e i /
- Deoarece prim-%Z/ i %V 7Q @T %V se adaug urm-%Z/ la urm-T/5 adic / i e
- Deoarece T 7Q 0 TV 5 se adaug urm-T/ la urm TZ5 adic e5/5@
;;
- Deoarece prim-TZ/ i TV 7Q J 0 TV se adaug urm-TZ/ la urm 05 adic e5/5@
.e poate construi apoi urmtorul tabel8
id @ J - / e
urm -%/ 1alse 1alse 1alse 1alse true true
urm -%V/ 1alse 1alse 1alse 1alse true true
urm -T/ 1alse true 1alse 1alse true true
urm -TV/ 1alse true 1alse 1alse true true
urm -0/ 1alse true true 1alse true true
urm-% / K G e 5 / H urm-TV / K G @ 5 / 5 e H
urm-%V/ K G e 5 / H urm-0 / K G J 5 @5 / 5 e H
urm-T / K G @ 5 / 5 e H
A.2.A. C'ns&r)irea &a:el)l)i A!N
Dup cum s7a aratat deja5 tabelul de analiz5 W"5aX 6a conine8
- 1ie o producie care este 1olosit pentru e,pandarea neterminalului " din 6<r1ul sti6ei atunci c<nd
'n intrare apare simbolul a
- 1ie W"5aX este 6id5 adic starea -"5a/ nu poate apare pentru un ir de intrare corect$
Algoritm pentru construirea tabelului A53("
Jla intrare a6em o gramatic )5 iar la ieire se obine tabela pentru ".!N
1$ !entru 1iecare producie a gramaticii de 1orma "7Q se aplic paii 2 i +
2$ !entru simbolul a prim-/5 intrrile W"5aX de6in " 7Q
+$ Dac prim-/5 atunci pentru b urm-"/ se completeaz W"5bX cu producia "7Q $
Dac prim-/ i e urm-"/ atunci W"5eX 6a conine "7Q
3$ Intrrile rmase necompletate 'n urma pailor 2 i + reprezint intrri de eroare -6or 1i
6ide/$
Adic:
!entru 1iecare "7Q e,ecut8
!entru 1iecare a prim-"/ adaug "7Q la W"5aX
i1 prim-/ t9en
!entru 1iecare b urm-"/ adaug "7Q la W"5bX
Intrrile rmase necompletate 6or 1i 6ide i reprezint intrri de eroare$
Ideea de baz a algoritmului este 8 se 6a e,panda neterminalul " 'n irul dac a prim-/
sau dac K -e6entual KJQ / i a urm-"/ sau dac a K e urm-"/$
0olosind 1unciile prim i urm deja teterminate8
prim-%/KG id 5 - H
prim-%V/ KG @ 5 H
prim-T/ K G id 5 -H
prim-TV / K G J5 H
prim-0/ K G id5 - H
urm-% / K G e 5 / H
urm-%V / K G e 5 / H
urm-T / K G @ 5 / 5 e H
urm-TV / K G @ 5 / 5 e H
urm-0 / K G J 5 @5 / 5 e H
% 7Q T %Z
%V 7Q @T %V N
T7Q 0 TV
TV 7QJ0TVN
0 7Q -%/ N id
\om obine abela de ".!N construit pe baza regulilor enunate8
!i,:'l (e in&rare
;B
Ne&er,inal id @ J - / e
% %7QT%Z 7 7 %7QT%Z 7 7
%Z 7 %Z7Q@T%Z 7 7 %Z7Q %Z7Q
T T7Q0TZ 7 7 T7Q0TZ 7 7
TZ 7 TZ7Q TZ7QJ0TZ 7 TZ7Q TZ7Q
0 07Qid 7 7 07Q-%/ 7 7
W%5idX K %7QT%V 5 W%5-X K %7QT%V prin urmare UidV i U-U aparin lui prim-T/
A.2.D. Gra,a&ici JJ(1) (in(e-en(en&e (e c'n&ex&) analiza:ile c) A!N
:n principiu5 algoritmul de construire a tabelei se poate aplica pentru orice gramatic$ !entru
unele gramatici 'ns5 tabela poate a6ea intrri multiplu de1inite -mai multe producii pentru acelai
element al gramaticii/$
Dac gramatica este recursi6 la st<nga sau este ambigu5 atunci tabela 6a conine cel puin o
intrare multiplu de1init$
De e,emplu5 pentru instructiunea i18
PinstrQ 7Q i1 Pe,presieQ t9en PinstrQ PalternQ N a
PalternQ 7Q else P instrQ N
Pe,prQ 7Q b
Tabela de
".!N8
simbol terminal
Neterminal a b else i1 t9en e
PinstrQ PinstrQ7Qa 1
PalternQ 2 PalternQ7Q
Pe,prQ Pe,prQ7Qb
unde8
1K PinstrQ 7Q i1 Pe,prQ t9en PinstrQ PalternQ
2KPalternQ 7Q else PinstrQ
PalternQ 7Q
%lementul WPalternQ5 elseX este dublu de1init deoarece >rm-PalternQ/KGelse5eH$ Cauza este
ambiguitatea gramaticii mani1estat la alegerea produciei ce trebuie aplicat 'n momentul apariiei lui
else 'n intrare5 cunoscut ca problema atarii lui else$ !entru a ataa else cu cel mai apropiat t'en care
'l precede alegem producia PalternQ 7Q else PinstrQ$
De5ini2ie8 )ramaticile independente de conte,t care permit o analiz descendent 1r re6eniri
1olosindu7se e6entual de urmtoarele 2 simboluri din intrare se numesc gramatici LL-2/$
!rimul L semni1ic 1aptul c preluarea simbolului din intrare se 1ace de la st<nga la dreapta5
iar al doilea L 1aptul c la analiz se dorete reconstituirea unei deri6ri st<nga$ :n practic se utilizeaz
de obicei cazul c<nd 2K15 caz 'n care pentru analiz se 1olosete un singur simbol din intrare5 cel
curent$
Observa$ie: "plic<nd algoritmul de ".!N prezentat pentru o gramatic LL-1/5 nu rezult intrri
multiplu de1inite$
"plic<nd algoritmul de construire a tabelei pentru ".!N 'n cadrul gramaticii LL-1/ rezult o
singur tabel care 6a recunoate 1orme propoziionale corecte din gramatica L-)/ i doar pe acestea5
deci metoda este corect i complet$ Nici o gramatic ambigu sau recursi6 la st<nga nu poate 1i
LL-1/$
Considerm produciile " 7Q 1 N 2 N $ Nn dintr7o gramatic$
De5ini2ie8 O gramatic independent de conte,t este LL-1/ dac pentru orice neterminal al gramaticii
sunt 'ndeplinite urmtoarele dou condiii8
;A
prim-i/ prim-j/ K mulimea 6id5 oricare ar 1i i5j 'n inter6alul W15nX cu iPQj=
adic) lu/nd n considerare oricare dou pr&i drepte, nu se pot deriva din ambele iruri care
ncep cu acelai terminal, sau eventual
dac prim-i/ oricare ar 1i i 'n inter6alulW15nX5 atunci urm-"/prim-j/ este mulimea
6id5 unde 1PKjKPKn5 iPQj= cu alte cu6inte8 dac dintr7o anumit parte dreapt se poate
deri6a irul 6id5 atunci din oricare din celelalte pri drepte nu se pot deri6a iruri care s
'nceap cu un terminal$
Dac gramatica respect cele dou condiii5 atunci este LL-1/$
.e pune 'ntrebarea8 cum trebuie procedat dac la construirea tabelei de analiz apar intrri
multiplu de1inite$ !rima soluie este de a trans1orma gramatica prin eliminarea recursi6itii de st<nga
i a ambiguitii$ %,ist 'ns gramatici neambigue i nerecursi6e la st<nga -i1/ care nu sunt LL-1/$ :n
ast1el de cazuri se pot introduce reguli euristice pentru alegerea produciilor corecte 'n cazul intrrilor
multiplu de1inite$ :n e,emplul anterior s7a ales 'n mod arbitrar 6arianta WPalternQ5 elseX K PalternQ 7Q
else PinstrQ$
:n general nu e,ist reguli uni6ersale prin care intrrile multiplu de1inite din tabela se pot
reduce la o singur 6aloare 1r a a1ecta limbajul recunsocut de analiz$ :n concluzie5 principala
di1icultate 'n utilizarea ".!N const 'n scrierea gramaticii pentru limbajul surs ast1el 'nc<t s se poat
construi tabela de analiz$
Dei eliminarea recursi6itii de st<nga i 1actorizarea la st<nga sunt uor de realizat5 aceste
operaii complic at<t gramatica c<t i aplicarea gramaticii 'n traducere$ De asemenea gramatica
recunoscut pierde din acuratee$ Din punct de 6edere practic5 instruciunile sunt analizate prin metoda
".!N iar e,presiile 6or 1i analizate prin alte metode5 de obicei cele bazate pe precedena operatorilor$
A.2.E. 0e;enirea (in er'ri 7n caz)l A!N
"naliza sintactic 'ncearc o punere 'n coresponden a simbolurilor -terminale i
neterminale/ din sti6 cu simbolurile din intrare$ O eroare sintactic poate apare 'n urmtoarele dou
cazuri8
- simbolul terminal din 6<r1ul sti6ei nu coincide cu simbolul din intrare
- simbolul neterminal din 6<r1ul sti6ei 'mpreun cu simbolul din intrare selecteaz 'n tabela
de ".!N o intrare 6id
#e6enirea din eroare 'n modul panic8
!rincipial5 metoda se bazeaz pe eliminarea de simboluri din intrare p<n la apariia unui atom
dintr7o mulime de atomi de sincronizare$ Calitatea tratrii erorilor depinde de alegerea mulimii de
sincronizare$
)egulile pentru construirea mulimii atomilor de sincronizare sunt8
1$ ulimea atomilor de sincronizare pentru " este iniializat cu urm-"/5 aceasta 'nseamn c
se 6or elimina succesi6 din intrare simboluri p<n la apariia unui simbol din urm-"/5 'n continuare se
elimin " din 6<r1ul sti6ei i e,ist posibilitatea de a continua 'n mod normal analiza
2$ 0i,area mulimii atomilor de sincronizare pe urm-"/ nu este su1icient 'n cazul limbajelor
'n care U=V este terminator -C5!ascal/$ :n acest caz5 la atomii de sincronizare pentru neterminalele
corespunzatoare e,presiilor5 se adaug mulimea cu6intelor c9eie cu care 'ncep instruciunile$ "lt1el5
absena lui U=V poate duce la omiterea cu6intelor c9eie cu care 'ncepe instruciunea urmtoare5 ceea ce
'nseamn c o posibil re6enire din erori 6a 1i tardi6$
0iecare limbaj are o structur ierar9ic a construciilor potri6it creia se includ e,presiile 'n
instruciuni5 etc$ De aceea5 o soluie este ca la mulimea atomilor de sincronizare pentru construciile
in1erioare s se adauge simbolurile cu care 'ncep construciile superioare -de e,emplu pentru e,presii
se adaug terminalele cu care 'ncep instruciunile/$
+$ :n situaia 'n care 'n mulimea atomilor de sincronizare pentru neterminalul " se includ
simbolurile din prim-"/5 analiza s7ar putea relua c9iar cu " 'n 6<r1ul sti6ei - nu se mai e,trage " din
sti6/$
3$ dac neterminalul din 6<r1ul sti6ei poate genera irul 6id atunci producia din care deri6
se poate aplica implicit 'n caz de eroare iar prin e,pandarea neterminalului respecti6 la irul 6id el 6a 1i
;L
e,tras din sti6$ !roced<nd ast1el se 6a 'nt<rzia detectarea erorilor 1r a se omite cu6intele c9eie$ !rin
aceast regul se 6a reduce numrul de neterminale care trebuie considerate la tratarea erorilor$
4$ dac terminalul din 6<r1ul sti6ei nu coincide cu terminalul din intrare se elimin terminalul
din 6<r1ul sti6ei i se a1ieaz un mesaj de eroare$ !rin urmare5 mulimea atomilor de sincronizare
pentru terminale este 1ormat din toate celelalte terminale$
si,:'l (e in&rare
Ne&er,i-
nale
i( K * ( ) G
% %V7QT%V 7 7 %7QT%V 7 .inc
%V 7 %V7Qe T%V 7 7 %V 7Q %V 7Q
T T7Q0TV sinc 7 T7Q0TV sinc .inc
TV 7 TV 7Q TV7QJ0TV 7 TV 7Q TV 7Q
0 07QId sinc sinc 07Q-%/ sinc .inc
Intrrile de sincronizare au 1ost completate aplic<nd regula 1 pe baza simbolurilor din mulimea
urmtoare$
"naliza sintactic 'n caz de eroare decurge ast1el8
1$ 'n 6<r1ul sti6ei se a1l neterminalul "8
J se 6a cuta dac W"5aX este 6id5 atunci se 6a omite simbolul curent din intrare5 a
Jdac W"5aX conine atom de sincronizare atunci se 6a e,trage " din 6<r1ul sti6ei i a6ansm
'n intrare p<n c<nd simbolul curent este prezent 'n mulimea sinc
2$ dac 'n 6<r1ul sti6ei este un terminal care nu coincide cu simbolul de intrare curent5 atunci
se 6a omite simbolul din 6<r1ul sti6ei5 con1orm regulii 4
:n toate situaiile5 dup e1ectuarea operaiilor de mai sus se 6a relua analiza$
0ie irul de intrare / id J @ id
!&i;a Ln&rare c'ncl)zii
e% /idJ@ide W%5/XK6id KQerrorg
e% idJ@ide
e%V T idJ@ide
e%V TV0 idJ@ide
e%V TV id idJ@ide
e%V TV J@ide
e%V TV 0J J@ide
e%V TV 0 @ide W05@X KQ sinc KQ errorg
e%V TV @ide intrarea 'l conine pe @5 rm<ne intrare cu @
e%V @ide
e%V T@$$$ @ide
"naliza de mai sus a neglijat problema mesajelor de eroare5 care rm<ne totui important
pentru proiectarea compilatorului i trebuie i ea tratat$
>n alt mod de tratare a erorilor care se poate aplica este re6enirea la ni6el de propoziie$
:n acest caz intrrile 6ide din tabela de analiz se completeaz cu pointeri spre rutine de
tratare a erorilor$ "ceste rutine acioneaz de obicei asupra simbolului curent din intrare i 'n principiu
pot sc9imba simbolul curent din intrare cu altul5 'l terg sau insereaz un simbol nou -cerut de situaia
din sti6/ i emit 'n paralel i un mesaj de eroare$ .e pot concepe rutine de tratare care s acioneze i
asupra sti6ei5 cu precizarea c eliminarea sau inserarea unui simbol 'n sti6 stric procesul de deri6are
i poate s conduc la situaii 'n care irul 1inal nu corespunde nici unei porpoziii sau deri6ri din
limbaj$ De asemenea5 e,ist pericolul de a intra 'n ciclu in1init$ "cesta se poate e6ita cu certitudine
dac se adopt msura ca 'n urma oricrei aciuni de re6enire s se a6anseze cel puin un simbol 'n
intrare5 iar dac intrarea s7a epuizat5 atunci s se a6anseze 'n sti6$
BM
D. Analiza sin&ac&ic ascen(en&. rezen&are /eneral
C1M
.e 6a prezenta un tip general de analizor numit `cu deplasare i reducerea$ "cesta 'ncearc s
construiasc arborele sintactic pentru irul de intrare 'ncep<nd de la 1runze spre rdcin -ascendent/$
- !rocesul poate 1i pri6it ca o reducere a unui ir de terminale la simbolul de start al gramaticii$
- :n 1iecare pas al reducerii se caut 'n 1orma propoziional curent localizarea unui subir
care s corespund prii drepte a unei producii$ "cest subir se 'nlocuiete cu partea st<ng
a produciei respecti6e$ Dac subirul este corect ales5 la 1iecare pas se 6a parcurge 'n sens
in6ers o deri6are dreapta$
Exemplu 8 1ie gramatica8
. 7Qa"*e
"7Q"bcNb
*7Qd
!entru irul de intrare abbcde a6em urmtoarea parcurgere 'n sens in6ers a unei deri6ri dreapta8
abbcde 7Q a"bcde 7Q a"de 7Q a"*e 7Q .
#educerile corespund parcurgerii 'n sens in6ers a urmtoarei deri6ri drepte8
. 7Q a"*e 7Q a"de 7Q a"bcde 7Q abbcde
D.1. Ca-e&e
>n ca-& al unui ir este un subir care corespunde prii drepte a unei producii i a crui
'nlocuire cu neterminalele din partea st<ng a produciei reprezint un pas 'n parcurgerea 'n sens in6ers a
unei deri6ri dreapta$
Nu toate subirurile care sunt pri drepte ale unei producii "7Q i care pot 1i localizate ca
subiruri ale unei 1orme propoziionale sunt 'n acelasi timp i capete pentru c este posibil ca prin
reducerea lui la " procesul de reducere s se bloc9eze 1r s se poat 1ace reducerea la simbolul de start
al gramaticii$
Exemplu8 dac se aplic reducerea a"bcde 7Q a""cde procesul se 6a bloca$
#ezult c trebuie dat o (e5ini2ie ,ai ri/)r'as noiunii de capt8
.iind dat o form propozi$ional ++ un capt al su const:
- dintr%o produc$ie A%6 i
- dintr%o propozi$ie #n #n care poate fi localizat irul astfel #nc&t prin #nlocuirea cu A se
ob$ine forma propozi$ional anterioar a unei derivri dreapta a lui "
Exemplu8 .KJQ " KQ = captul este 1ormat din producia "7Q i din propoziia care urmeaz
lui $
Observa$ie8 irul 5 situat 'n dreapta captului conine numai terminale$
:n cazul 'n care gramatica este ambigu5 irul s7ar putea obine prin mai multe deri6ri
dreapta$ #ezult c el ar putea s conin mai multe capete -deci ambiguitatea e o problem/$
Dac gramatica nu este ambigu5 captul corespunztor unei anumite 1orme propoziionale este
unic$ )ra1ic5 procesul de reducere al unui capt se poate reprezenta ast1el8
.
a " * e
" * c
Captul reprezint cel mai din st<ng subarbore complet5 1ormat dintr7un nod i toi 1iii si$
!rintele -'n cazul nostru "/ este nodul cel mai de jos i cel mai din st<nga a6<nd toi 1iii prezeni 'n arbore
B1
sub 1orm de 1runze$ #educerea unui capt la partea st<ng a produciei respecti6e se numete 5as'narea
ca-&)l)i i const din 'ndeprtarea 1iilor lui " din arborele sintactic$
Exemplu8 1ie gramatica ambigu
% 7Q % @ %
% 7Q % J %
% 7Q -%/
% 7Q id
pentru irul de intrare8 id@ id J id
-1/ % KdQ % @ % KdQ % @ % J % KdQ % @ % J id+ KdQ % @ id2 J id+ KdQ id1 @ id2 J id+
1e observ c irurile situate n dreapta unui capt con&in exclusiv simboluri terminale.
Cramatica dat fiind ambigu exist i urmtoara derivare dreapta distinct de prima)
-2/ % KdQ % J % KdQ % J id+ KdQ % @ % J id+ KdQ % @ id2 J id+ KdQ id1 @ id2 J id+
:n e,emplul dat e,ist 2 capete5 corespunztoare primei i respecti6 celei de7a doua deri6ri
dreapta prezentate$ %,istena celor 2 deri6ri dreapta semni1ic prioriti relati6e di1erite ale operatorilor UJV
i U@V$ La primul model de deri6are este mai prioritar UJV$
D.2. $as'narea ca-e&el'r
0asonarea capetelor se poate considera i ca procesul de parcurgere 'n sens in6ers a unei deri6ri
dreapta$ .e pornete de la un ir de analizat$ Dac aparine limbajului descris de gramatica dat5
atunci el se poate obine dintr7un pas oarecare n al unei deri6ri dreapta 'nc necunsocute5 dar care are
urmtoarea 1orm8
. KdQ M KdQ 1 KdQ R KdQ n KdQ
#econstituirea 'n sens in6ers a acestei deri6ri const 'n localizarea 'n 1orma propoziional n a
unui capt n i 'nlocuirea lui cu partea st<ng a produciei$ "n 7Q n5 obin<ndu7se ast1el 1orma
propoziional n71$ "poi se continu procedeul cu n71 etc$ Dac 'n 1inal s7a ajuns la simbolul de start al
gramaticii5 'nseamn c procesul de analiz s7a 'nc9eiat cu succes$
Exemplu8 Considerm din nou gramatica din e,emplul precedent8
% 7Q % @ % N % 7Q % J % N % 7Q -%/ N % 7Q id
cu irul de intrare8 id1 @ id2 J id+
.ec6ena de reduceri prezentat 'n continuare reprezint in6ersul sec6enei din prima deri6are
-unde J este mai prioritar8 % KdQ % @ % KdQ % @ % J % KdQ % @ % J id+ KdQ % @ id2 J id+ KdQ id1 @ id2 J
id+/
1orma propoziional dreapta capt producie pentru reducere
id1 @ id2 J id+ id1 % 7Q id
% @ id2 J id+ id2 % 7Q id
% @ % J id+ id+ % 7Q id
% @ % J % % J % % 7Q % J %
% @ % % @ % % 7Q % @ %
D.3. L,-le,en&area c) s&i; a analizei sin&ac&ice (e &i- (e-lasare-re()cere
!entru implementarea analizei sintactice bazat pe 1asonarea capetelor trebuiesc rezol6ate dou
probleme8
1$ Localizarea subirului care urmeaz s 1ie redus 'n 1orma propoziional curent
2$ :n cazul 'n care gramatica are mai multe producii cu aceeai parte dreapt5 trebuie s decidem care
este producia ce se 6a aplica$
Ca structur de date de baz se poate utiliza o sti6 'n care se 6or deplasa simbolurile gramaticale
din tamponul de intrare i se 6or localiza capetele$
- Tamponul de intrare conine irul de analizat $
B2
- *aza sti6ei i respecti6 e,tremitatea dreapt a irului de intrare 6or 1i marcate printr7un simbol
special UeV$
- La 'nceput sti6a este goal5 conine doar simbolul UeV iar la intrare irul este e$
- La 1iecare pas al analizei5 analizorul deplaseaz 'n sti6 M sau mai multe simboluri de intrare5
p<n 'n momentul 'n care 'n 6<r1ul sti6ei apare un capt 5 apoi se reduce la partea st<ng a
produciei respecti6e i se continu ciclic aceste operaii5 1ie p<n c<nd sti6a conine doar
simbolul de start i intrarea este goal5 1ie p<n c<nd se detecteaz o eroare$
- :n con1iguraia 1inal5 sti6a 6a conine Ue.V iar 'n intrare 6om a6ea simbolul UeV$ Dac se
ajunge 'n aceast con1iguraie 1r eroare5 se 6a semnala terminarea cu succes a analizei$
Exemplu:
s&i;a in&rare ac&i)ne
e id1 @ id2 J id+ e deplasare
e id1 @ id2 J id+ e reducere %7Qid
e % @ id2 J id+ e deplasare
e % @ id2 J id+ e deplasare
e % @ id2 J id+ e reducere % 7Q id
e % @ % J id+ e deplasare
e % @ % J id+ e deplasare
e % @ % J id+ e reducere % 7Q id
e % @ % J % e reducere % 7Q % J %
e % @ % e reducere % 7Q % @ %
e % e succes
Din acest e,emplu rezult c analizorul e,ecut urmtoarele 3 aciuni
1 Deplasare8 simbolul de intrare curent este introdus 'n sti6
2 #educere8 se realizeaz 'n situaia 'n care e,tremitatea dreapt a unui capt se a1l 'n 6<r1ul sti6ei=
analizorul trebuie s localizeze e,tremitatea s st<ng5 s stabileasc neterminalul cu care trebuie
'nlocuit captul i s realizeze e1ecti6 reducerea lui$
+ "cceptare8 analizorul semnaleaz terminarea cu succes a analizei
3 %roare8 se apeleaz o rutin de eroare dac s7a detectat un caz de eroare
Observa$ie8 utilizarea sti6ei ajut la localizarea captului pentru c el 6a 1i situat 'ntotdeauna 'n 6ar1ul
sti6ei$
odalitatea concret a alegerii uneia dintre aciuni depinde de tipul concret de analiz5 care poate 1i de
mai multe 1eluri8
7 bazat pe precedena operatorilor
7 de tipul le1t7rig9t
D.?. re5ixe ;ia:ile
ulimea pre1i,elor 1ormelor propoziionale dreapta care pot s apar 'n sti6a unui analizor
sintactic cu deplasare i reducere se numesc pre1i,e 6iabile$
"lt1el spus5 un pre1i, 6iabil este un pre1i, al unei 1orme propoziionale dreapta care nu continu
dincolo de e,tremitatea dreapt a celui mai din dreapta capt al acelei 1orme propoziionale$
Consecina acestei de1iniii este aceea c 'ntotdeauna este posibil s se adauge simboluri
terminale la e,tremitatea unui pre1i, 6iabil pentru a obine o 1orm propoziional dreapta$
!e parcursul analizei sintactice nu 6a apare nici o eroare at<ta timp c<t poriunea de intrare 6zut
p<n la un anumit punct poate 1i redus la un pre1i, 6iabil$
D.@. C'n5lic&e 7n &i,-)l analizei sin&ac&ice c) (e-lasare 6i re()cere
B+
- %,ist gramatici independente de conte,t la care nu se poate aplica analiza sintactic cu
deplasare i reducere$ !entru o ast1el de gramatic5 analizorul poate ajunge 'ntr7o con1iguraie
'n care5 cunosc<nd 'ntreg coninutul sti6ei i urmtoarele simboluri din intrare5 nu se poate
decide dac trebuie e1ectuat o deplasare sau o reducere$ "cest tip de con1lict se numete
con1lict (e-lasare-re()cere$
- :n alte situaii analizorul nu poate decide ce reducere s e1ectueze dintre mai multe posibile$
%ste cazul con1lictelor re()cere-re()cere$
Observa$ie: 7 )ramaticile 'n care nu pot apare ast1el de con1licte se numesc gramatici L#$
7 Clasa gramaticilor pentru care pot s apar ast1el de con1licte nu se incadreaz 'n clasa
L#$
%,emplu8
)ramatica instruciunii i1 5 care este ambigu nu este L#$
PinstructiuneQ 7Q i1 Pe,prQ t9en PinstrQ N
i1 Pe,prQ t9en PinstrQ altce6a
sti6a intrare
i1 Pe,prQ t9en PinstrQ else R e
!entru con1iguraia dat5 nu se poate decide dac 6<r1ul sti6ei este un capt sau nu$ "6em deci un
con1lict deplasare7reducere5 'ntruc<t 'n 1uncie de ceea ce urmeaz 'n intare5 poate 1i corect s se reduc i1
Pe,prQ t9en PinstrQ la PinstrQ sau ar putea 1i corect s se deplaseze else din intrare 'n sti6 5 urmat de
cutarea unei alte PinstrQ5 pentru ramura de else$
Deoarece nu se poate lua decizia pe baza unui singur simbol de anticipare5 se spune c gramatica
nu este L#1$
:n general5 nici o gramatic ambigu -ca cea de sus/ nu poate s 1ie L#25 oricare ar 1i 2 NJ$
"nalizorul sintactic cu deplasare7reducere poate 1i uor adaptat pentru a analiza i gramatici
ambigue ca cea de mai sus prin decizia ca orice con1lict de tipul deplasare7reducere s se rezol6e 'n
1a6oarea deplasrii$ .e obser6 c lu<nd aceast decizie 'n situaia de mai sus5 analiza decurge corect$
O alt situaie pentru gramaticile non L# este atunci c<nd se localizeaz cu certitudine un capt5
dar coninutul sti6ei i simbolul curent din intrare nu sunt su1iciente pentru a determina care producie
trebuie utilizat pentru reducere -con1lict reducere7reducere/$
Exemplu: dispunem de un analizor le,ical care 1urnizeaz atomul le,ical id pentru orice
identi1icator5 indi1erent de utilizarea acestuia -cazul normal/$ !resupunem c 'n limbajul ales apelurile de
proceduri pe de o parte i re1erirea elementelor de tablou pe de alt parte5 au aceeai 1orm sintactic5 adic
un nume i argumentele 'ntre paranteze$ Deoarece din punct de 6edere semantic traducerea indicilor 'n
re1erine de tablou di1er substanial de traducerea argumentelor la apelurile de proceduri i 1uncii5 trebuie
s utilizm producii di1erite pentru a genera listele de indici i respecti6 listele de argumente5 ca 'n
gramatica urmtoare8
-1/ PinstrQ 7Q id -PlistaDparamQ/
-2/ PinstrQ 7Q Pe,presieQ 8KPe,presieQ
-+/ PlistaDparamQ 7Q PlistaDparamQ5PparametruQ
-3/ PlistaDparamQ 7Q PparametruQ
-4/ PparametruQ 7Q id
-;/ Pe,presieQ 7Q id -PlistaDe,prQ/
-B/ Pe,presieQ 7Q id
-A/ PlistaDe,prQ 7Q PlistaDe,prQ5Pe,presieQ
-L/ PlistaDe,prQ 7Q Pe,presieQ
Considerm o instruciune care 'ncepe cu a-i5j/ i presupunem c am ajuns 'n situaia 'n care
primii trei atomi au 1ost trans1erai 'n sti6$
sti6a intrare
R - id id /R e
B3
%ste e6ident c id din 6<r1ul sti6ei trebuie redus5 dar nu se tie care dintre producii trebuie
utilizat$
Dac UaV este procedura5 ar trebui aleas pentru reducere producia -4/5 iar dac a este element de
tablou5 trebuie aplicat producia -B/$
!entru a lua o decizie5 ar trebui consultat tabela de simboluri -dac acolo in1ormaiile sunt
completate/$
O soluie pur sintactic la aceast situaie const 'n modi1icarea analizorului le,ical ast1el 'nc<t s
1urnizeze un atom distinct -procid/ c<nd UaV este un nume de procedur$
Cu modi1icarea propus5 pentru cazul c<nd 'n situaia de mai sus este un apel de procedur5
coninutul sti6ei i al intrrii este urmtorul8
sti6a intrare
procid - id 5 id / R e
"st1el5 de6ine clar c reducerea lui id se 1ace prin -4/$
Observa$ie:
7 Decizia pri6ind reducerea este luat pe baza simbolului al treilea de sub 6<r1ul sti6ei
-procid/ care nici mcar nu particip la reducere$
7 #ezol6area con1lictelor reducere7reducere pe baza modi1icrilor de gramatic este metoda
general de rezol6are a acestei situaii
-1/ PinstrQ 7Q procid - PlistaDparamQ/
D.=. Analiza sin&ac&ic :aza& -e -rece(en2a '-era&'ril'r
"cest tip de analiz sintactic se poate aplica doar la o clas redus de gramatici5 dar este
important datorit rsp<ndirii ei i are a6antajul c analizorul se poate construi uor manual$
!rintre alte cerine eseniale5 gramatica la care se aplic acest tip de analiz5 trebuie s aib
urmatoarele dou proprietai8
1$ . nu aib producii 6ide
2$ :n nici o producie s nu e,iste o parte dreapt care s conin dou neterminale adiacente$
)ramaticile care respect condiia 2 se numesc /ra,a&ici (e '-era&'ri
% 7Q %"% N -%/ N 7% N id
unde " poate 1i8
" 7Q @ N 7 N J N I N c
Dac se substituie " atunci se obine
% 7Q % @ % N % ] % N % J % N % I % N % c % N -%/ N 7% N id
"cest mod de trans1ormare este general i se 6a urmri cu precdere$
O gramatic de operatori nu trebuie neaprat s 1ie o gramatic de e,presii$
etoda are i importante dezavanta2e
- sunt di1icil de prelucrat atomi care au 2 precedene di1erite -de e,$ semnul U7U/
- #elaia dintre analizor i gramatic nu este 'ntotdeauna biuni6oc= este posibil ca analizorul s
accepte iruri -consider<ndu7le corecte/5 care nu 1ac parte din limbajul gramaticii -deci nu se
semnaleaz toate erorile/$
- Clasa de gramatici acceptate este redus
Datorit simplitii ei5 aceast te9nic s7a utilizat 'n multe compilatoare e,istente pentru analiza
e,presiilor5 'n timp ce instruciunile limbajului i celelalte construcii de ni6el 'nalt sunt analizate prin alte
metode -de e,emplu cu descendeni recursi6i/$ %,ist totui i compilatoare bazate complet pe aceast
te9nic$
D.=.1. De5inirea rela2iei (e -rece(en2
:n analiza sintactica bazat pe precedena operatorilor se de1inesc + relaii de preceden disjuncte8
P5 K5 Q care se stabilesc 'ntre anumite perec9i de terminale ale gramaticii$ !e baza acestor relaii se
selecteaz captul 1ormei propoziionale 'n sti6a analizorului$ .emni1icaia lor este urmtoarea8
rela&ia se,ni5ica2ia
a P b a cedeaz precedena lui b
B4
a K b a are aceeai preceden cu b
a Q b a are preceden 1a de b
"ceste relaii se deosebesc 'n esen 1a de relaiile similare din algebr8
- au cu totul alt semantic dec<t precedena algebric
- este posibil ca 'ntre 2 terminale s nu e,iste nici o relaie de preceden
- este posibil ca 'ntre 2 terminale s e,iste 2 relaii de preceden
.tabilirea relaiei de preceden 'ntre terminale se poate 1ace pe 2 ci8
1$ Intuiti65 pornind de la semni1icaia algebric a operatorilor i in<nd cont de asociati6itatea lor8
JQ @5 @ P J
!rin introducerea acestor dou relaii se rezol6 i ambiguitatea gramaticii e,presiilor5 1r s mai 1ie
necesar trans1ormarea ei
2$ :n mod automat5 aplic<nd un algoritm adec6at= pentru aceast 6ariant trebuie eliminat 'n prealabil
ambiguitatea din gramatic ast1el 'nc<t ea s re1lecte corect asociati6itatea i precedena operatorilor$
D.=.2. 9&ilizarea rela2iil'r (e -rece(en2 a '-era&'ril'r
.copul introducerii relaiilor de preceden este acela de a determina captul 'n 1orma
propoziional dreapta curent$ "st1el5 simbolul N marc9eaz e,tremitatea st<ng a captului5 = interiorul
unui capt5 iar O marc9eaz e,tremitatea dreapt a captului$
!entru detalii5 considerm o 1orm propoziional dreapta a unei gramatici de operatori$ Deoarece
prile drepte ale produciilor nu conin dou neterminale adiacente5 rezult c 'n nici o 1orm
propoziional dreapt nu pot apare 2 neterminale adiacente$
La modul general5 o 1orm propoziional dreapta de acest 1el poate 1i notat ast1el8 M a1 1 an n
unde 1iecare i este 1ie , 1ie un singur neterminal i 1iecare ai este un singur terminal$
:ntr7o ast1el de 1orm propoziional dreapta5 se caut relaia de preceden 'ntre perec9i de
terminale 6ecine5 presupun<ndu7se c 'ntre ele e,ist o unic relaie de preceden$
%,tremitile irului de analizat5 se marc9eaz cu e i se introduc relaiile de preceden8 e Na
i aOe$
:n continuare5 se elimin neterminalele din ir iar 'n irul rmas -conin<nd numai terminale i e/
se introduc relaiile de preceden corecte5 N5=5O$
Captul se determin prin urmtorul procedeu8
1$ .e baleiaz irul cu relaia de preceden introdus din e,tremitatea s st<ng p<n la 'nt<lnirea
primului O= acesta 6a reprezenta marginea dreapt a captului$
2$ .e baleiaz irul 'napoi5 omi<nd e6entualele simboluri K p<n se 'nt<lnete primul marcaj P5 acesta 6a
1i marginea st<ng a captului$
+$ .e consider ca 1iind capt5 irul de simboluri gramaticale dintre cele 2 marcaje5 inclusi6 neterminalele
care apar ca incluse5 sau 'nconjoar terminalele dintre marcaje$ Considerarea neterminalelor
'nconjurtoare este necesar pentru a asigura c nu 6or apare dou neterminale adiacente 'n 1orma
propoziional urmtoare$
%,emplu8 se consider irul de intrare e id @ id J id e i matricea de relaii de preceden redus de mai jos8
id @ J e
id Q Q Q
@ P Q P Q
J P Q Q Q
e P P P
B;
:n tabel5 operatorul de adunare este asociati6 la st<nga5 'n timp ce operatorul de 'nmulire
asociati6 la dreapta
^irul iniial5 cu relaiile de preceden introduse este urmtorul8
e N d O @ N id O J N id O e e % @ % J % e
capt e N @ N J O e % 7Q % J %
e % @ id J id e e % @ % e
e N @ N id O J N id O e e N @ O e
e % @ % J id e e % e KQ s1arsit
e N @ N J N id O e
Observa$ie: deoarece neterminalele nu in1luieneaz analiza5 nu trebuie 1cut distincie 'ntre ele$
:n sti6a analizorului este su1icient s se in un singur marcaj reprezentati6 pentru orice 1el de
terminal pentru a marca doar locul din sti6 corespunzator acelui neterminal5 1olosit pentru a 'nregistra
atributele semantice corespunztoare neterminalului respecti6$
"parent5 din e,emplul de mai sus s7ar putea deduce c pentru determinarea captului ar 1i necesar
baleierea 'ntregii 1orme propoziionale sau5 'n orice caz5 a unei mari poriuni din ea$ "cest lucru nu este 'ns
necesar5 deoarece implementarea concret se 1ace tot pe baza mecanismului de analiz sintactic cu
deplasare i reducere5 iar relaiile de preceden sunt utile doar pentru a dirija aciunile analizorului
-deplasare sau reducere/$ "ciunile analizorului sunt cele cunoscute 8
1$ /eplasare8 c<t timp nu s7a gsit e,tremitatea dreapt a captului5 adic5 'ntre simbolul terminal cel mai
apropiat de 6<r1ul sti6ei i simbolul curent din intrare este 6alabil una din realaiile8 N sau =$
2$ )educere8 c<nd s7a gsit e,tremitatea dreapt a captului5 adic 'ntre terminalul cel mai propiat din
6<r1ul sti6ei i simbolul de intrare e,ist relaia O5 se baleiaz 'n sens in6ers sti6a p<n la 'nt<lnirea
primului marcaj P, dup care se 1ace reducere$
+$ Acceptare8 c<nd ambele simboluri care se compar - adic 6<r1ul sti6ei i simbolul curent din intrare/
sunt UeV
3$ Eroare8 dac se compar 2 simboluri 'ntre care nu e,ist relaie de preceden$
"ceste idei pri6ind mecanismul de analiz sintactic bazat pe precedena operatorilor sunt cuprinse 'n
urmtorul algoritm8
"lgoritmul primete la intrare irul > de analizat i matricea relaiilor de preceden$ Dac O este
corect5 se 6a obine la ieire un sc9elet al arborelui su sintactic5 'n caz contrar un mesaj de eroare5
datorit substituirii intermediare a neterminalului5 moti6 pentru care nodurile interioare 6or 1i
uni1orme$
sti6a intrare
e Oe
-1/ J se poziioneaz pointerul de intrare pe primul simbol din O
-2/ repeat 1ore6er
i1 Jat<t simbolul din 6<r1ul sti6ei c<t i simb$ curent de intrare sunt e t9en return
else
begin
J1ie UaV simbolul terminal cel mai apropiat de 6<r1ul sti6ei5
UbU simbolul curent din intrare
i1 -a N b/ or - aKb/ t9en
begin 7deplasare8
J introdu b 'n sti6
J a6anseaz cu o poziie pointerul de intrare
end
else i1 -a Ob/ t9en 7reducere8
repeat
J e,trage din sti6
until Jterminalul din 6<r1ul sti6ei este 'n relaie N cu terminalul cel mai
recent e,tras
BB
else Jeroare
end=
D.=.3. De()cerea in&)i&i; a rela2iei (e -rece(en2 (in as'cia&i;i&a&ea 6i -ri'ri&a&ea al/e:ric a
'-era&'ril'r
.ingura cerin care trebuie a6ut 'n 6edere este aceea ca relaia de preceden s conduc la
analiza corect a limbajului de1ninit de gramatic$
hin<nd cont de 1aptul c analiza sintactic bazat pe precedena operatorilor se aplic la gramatici
pentru e,presii5 sau gramatici similare cu acestea5 iar 'ntre operatorii din e,presii e,ist reguli de prioritate
i asociati6itate riguroase care rezol6 e6entualele ambiguiti5 aceste reguli pot reprezenta baza pentru
stabilirea relaiei de preceden$
!entru cazul operatorilor binari5 notai cu 5 15 2 relaiile de preceden pot 1i deduse ast1el8
1$ dac 1 este mai prioritar algebric dec<t 25 se introduc 'n tabel relaiile
1 O 2 i 2 N 1$
2$ dac 1 i 2 au prioritate algebric egal -inclusi6 c<nd reprezint acelai operator/ apar
urmtoarele 2 situaii8
a$ 1 i 2 sunt asociati6i la st<nga
1 O 2 i 2 O 1
b$ 1 i 2 sunt asociati6i la dreapta
1 N 2 i 2 N 1
+$ pentru orice operator e,ist urmtoarele relaii de preceden cu celelalte terminale8

id - i /
N id O /
id O / O
N - O e
- N e O e
!entru a asigura reducerea la % a lui id i a lui -%/5 'ntre terminalele care nu sunt operatori se
introduc urmtoarele relaii8
- K / e N - e id
- N - id O e / N e
- N id id O / / O /
Exemplu:
.e consider gramatica8
% 7Q % @ % N % ] % N % J % N % I % N % c % N - % / N id
Operatorii au urmtoarele proprieti8
c cel mai prioritar5 asociati6 la st<nga
J5I asociati6i la st<nga
@$7 cea mai mic prioritate5 asociati6i la st<nga
!e baza relaiilor de preceden de mai sus5 rezult urmtoarea matrice de precedene8
@ 7 J I c id - / e
BA
@ Q Q P P P P P Q Q
7 Q Q P P P P P Q Q
J Q Q Q Q P P P Q Q
I Q Q Q Q P P P Q Q
c Q Q Q Q P P P Q Q
id Q Q Q Q Q Q Q
- P P P P P P P K
/ Q Q Q Q Q Q Q
e P P P P P P P
-
BL

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