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 aceluia i 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 ma in sau un limbaj apropiat de limbajul calculatorului, translatorul se nume te compilator. Programul utilizatorului se nume te program surs, iar programul n cod ma in ob&inut se nume te program obiect. 'ntre cele dou programe trebuie s existe o rela&ie de ec!ivalen& n ceea ce prive te 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 stabile te care text este corect din punct de vedere gramatical, iar semantica stabile te 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 u or 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$. Instruciunile Instruciunile limbajului Translator limbajului surs 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

6 diagram " pentru un translator general este de forma) Numele translatorului Limbajul gazd de implementare a translatorului 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 ma in, care poate fi executat direct. %e obicei liniile individuale ale programului surs corespund cu o instruc&iune la nivel ma in. .olul asamblorului este deci s converteasc reprezentrile simbolice ale instruc&iunilor n configura&ii de bi&i, reprezent/nd ec!ivalentele n cod-ma in 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 ma in, care poate fi executat direct. Liniile individuale din programul surs corespund de obicei cu mai multe instruc&iuni la nivel ma in. 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 obi nuit. - 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 ma ini. - 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 ma inii 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 ma in cu adrese fixe, ci o form cunoscut sub numele de :semicompilat:, :simbolic binar: sau form relocatabil. .utinele astfel

Limbaj surs

Limbaj destinaie

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 cod relocabil L2

!rogram 'n limbaj surs L1

*ibliotec de programe

Cod relocabil L2

LIN($%&% Limbajul gazd de implementare a editorului de legturi

!#O)$%&%

6bserva&ie. 0n compilator nu necesit un limbaj &int #de asamblare sau limbaj ma in$ real. %e exemplu, compilatoarele ;ava genereaz cod pentru o ma in 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 ma in, n timp ce a doua depinde puternic de ma ina destina&ie. 'n cadrul acestei structuri exist componente mai mici sau faze, a a 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 fi ierelor variaz de la sistem la sistem, aceast faz este de obicei dependent de ma in 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+. Ace tia 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.

Cod surs

)estiune caractere

0az analitic -0ront end/

"nalizor le,ical -.canner/

"nalizor sintactic -!arser/

)estiune tabele

"nalizor semantic

#aportare erori

)enerator de cod intermediar

0az sintetic -*ac2 end/

Optimizator de cod

)enerator de cod 1inal

Cod obiect

Anali#orul sintactic ) arser+ are ca scop gruparea atomilor rezulta i 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 opera iile 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) nota ia 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. -eneratorul de cod final este faza cea mai important din sec&iunea :bac7 end: . 'n aceast faz se preia ie irea 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, instruc iunile 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 folose te 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 %e i 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 cite te programul surs, sau ie irea unei treceri anterioare, face unele transformri i scrie ie irea sa ntr-un fi ier intermediar care va fi citit de o trecere ulterioar. Aceste treceri pot fi gestionate de diferite pr&i integrate n acela i 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 fi iere, dar se pot face i mai multe treceri folosind acela i cod surs original. 8umrul trecerilor depinde de o varietate de factori. 0nele limbaje necesit cel pu&in dou treceri pentru a genera mai u or 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 converte te 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 ma inii &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 interpretor. 9nterpretorul :execut: algoritmul original prin simularea unei ma ini virtuale pentru care codul intermediar numit i pseudocod este efectiv codul ma in. %istinc&ia dintre codul ma in i pseudocod este ilustrat n figura urmtoare) Instruciunile limbajului surs %tapa 1 Cod intermediar -pseudocod/ %tapa 2 Instruciuni 'n cod main

-'ncrcat/

-'ncrcat/ %,ecuie

Interpretor

%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 ma in care poate fi lansat n execu&ie independent. %esigur, orice ma in 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 ma in real aceast execu&ie este realizat prin !ard2are, deci mult mai rapid. 1e poate conclude c se pot scrie programe care permit unei ma ini reale s emuleze orice alt ma in real, cu dezavantajul vitezei reduse. Aceste programe sunt numite emulatoare i sunt uzual folosite n proiectarea de noi ma ini 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 ma in: 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 nsu i. - 0n interpretor pentru limbajul P-code scris n Pascal. 9nterpretorul a servit n principal ca model pentru scrierea unor programe similare pentru alte ma ini, n scopul emulrii unei ma ini 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$ a clasa 6aloare 1 adresa tabela de simboluri a 24 clasa 6aloare 2 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 Obser aii >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 #include #include #include #include <stdio.h> <ctype.h> <stdlib.h> <string.h> / "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 fardup/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*4F4C 4CG4C)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! 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

1M

-pbufJJ = c! else state = ()! brea.! 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

digit

2 digit

not-digit/

+J

2+

letter

23

not-letterNdigit/

24J

letterNdigit 1M sp 11 sp 14 1$ @ 1; 1B 7 1A 1L K 2M 21 = 22 not-sp/ 12J 1+ / 13

2$

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$ 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 .$ G={N, T, , !"5 unde N5 T5 !5 . au semni1icaiile menionate5

Deci5 c6adruplul8 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

1+

L-)/ K G s N s TJ i . sH 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 recunoa terea unei propozi&ii dintr-un limbaj, este necesar ca arborele asociat s fie unic. 'n caz contrar, gramatica care genereaz limbajul se nume te 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 Produc&ia Grest of integerH e se nume te producie vid. 'n general, dac pentru un ir este valabil o derivare de forma B, atunci se nume te simbol anulabil. 0n neterminal este anulabil dac exist o produc&ie a crei defini&ie #parte dreapt$ este anulabil.
define te Grest of integerH ca o secven& de K sau mai multe cifre.

!.2. Aspecte pri ind 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

14

P nume clas sintacticQ 88 K de1iniie 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 cre te 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

1;

digit 88K UMV N U1V N U2V N RN ULV$ !.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
b 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 a

YM

Y1

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 u or 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
id5 const5 op5 del5 com id5 const5 op5 del5 com 11 12 lit5 ci1 "218 lit 211 12 ci1 ci1 221 2+2 @ 2++ J K "2+8 2+1 P 2+4 Q 2+A K 2+L 2+3 K Q 2+; 2+B 222

"1 8

"228

1L

"238

= 231 blanc 23+ altce6a 232

"248

241

242

24+

243

/ 244

altce6a +12 " +1+ M +2+ +22

* "+18

1 "+28

+11 R [ +12B

+21 R L +21M

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

"21 "22 "+1 "2+ "+1 "+ "2 "23 "24 "M "1 "1

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 p a 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 p a 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 a a b 0igura 1 Din 1iecare stare iese o singur sgeat etic9etat cu un simbol de intrare$ pentru acest automat este8 a YM Y1 Y1 Y1 b YM YM atricea de tranziii

YM

Y1

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 a

1 b

b b

2 a

0igura 2

>nei stri i unui simbol de intrare nu 'i mai corespunde o stare ci o mulime5 e6entual 6id de stri$

23

atricea de tranziii pentru acest automat este8


a M 1 2 + GM51H 77 G2H 77 b 77 G25+H G+H 77 G2H 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
i _ 1

7 !entru a - un simbol oarecare al al1abetului surs/8


i a 1

!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$ 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/$

24

7 !entru 01102
i N-#1/

0igura +

N-#2

"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
i 0igura 3

N-#1/

N-#2/

"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*
i N-#1/ 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 $ A-lica2ie8 .e consider e,presia regulat # K -aba/Jaa $ "utomatul construit pas cu pas5 pornind de la aceast e,presie este8

2;


2 a + b 3

B 4 ; A a L a 1

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 D stri 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 -en&r) 1iecare a exec)&

2B

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 s53r6i& A.(,A./

"lgoritmul de calcul pentru 1uncia -7nc+i(ere este8 5)nc2ia 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 s53r6i& 7'nc9idere- 0 /

2A

%xe,-l)8 0ie "0N din 1igura B$ Limbajul acceptat este8 Ga5 b5 ab5 abab5 RH$

a b

2 4

a 3 b

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 " * C D %

-25 45 B/ K -;5 B/ K

-15 +5 B/ K -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 77 % 77 b C D 77 77 D

a a
" C *

0igura 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 s i 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 s53rsi& 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

a a b a b

"

* a

0igura L

.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 " 7a7> *5 * 7a7> *5 C 7a7> *5 D 7a7> *5 prin urmare simbolul a nu di6izeaz mulimea$ Considerm acum b8 " 7b7> C5 * 7b7> D5 C 7b7> C5 D 7b7> %5 aceste tranziii 6or partiiona mulimea 'n {"5 *5 C} i 'n {D}$ nou K -{"5 *5 C} {D} {%}/ {"5 *5 C} 7a7> {*5 *5 *} {"5 *5 C} 7b7> {C5 D5 C} Deoarece D este 'n alt partiie5 obinem8 nou K -{"5 C} {*} {D} {%}/ {"5 C} 7a7> {*5 *} {"5 C} 7b7> {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

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 -'zi2ii$$ "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 poz$ 1

b 2

a +

b 3

b 4

C ;

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

N2 N3 N; NA J N N1+ b 2 NL NB a +

N1 N+ C ; b 4

N4 b 3

N1M N11

a 1 N 12

*.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 3rimapoz n! 5 Ultimapoz n!5 3ozurm i!5 unde n este identi1icatorul nodului$ "0D se 6a obine din 1uncia 3ozurm i!5 !rimele + 1uncii sunt de1inite de nodurile arborelui sintactic i se 1olosesc 'n calculul lui 3ozurm i!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 3ozurm i! 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 3rimapoz n! K G15 25 +H5 Ultimapoz n! 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$ 1$

Nodul n 0runz cu etic9eta

Anulabil n! true

3rimapoz n!

Ultimapoz n!

2$

0runz eti7 c9etat cu i

1alse

GiH

GiH

+$ c1

1 c2

Anulabil c*! sa) Anulabil c,!

3rimapoz c*! 3rimapoz c,!

Ultimapoz c*! Ultimapoz c,!

n 3$ c1

Anulabil c*! c2 6i Anulabil c,! (ac Anulabil c*! (ac Anulabil c,! a&)nci 3rimapoz c*! a&)nci Ultimapoz c,!

3rimapoz c,! Ultimapoz c*!


al&5el 3rimapoz c*! Ultimapoz c,!

al&5el

4$

true

3rimapoz c*!

Ultimapoz c*!

c1

+;

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 Anulabil c*! 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 Ultimapoz n!5 calculate pentru e,emplul precedent sunt8

G1525+H G1525+H G1525+H G1525+H G152H G152H NA G152H G152H G152H a 1 G3H G+H J N G4H

G;H

N1 N2 N3 NB b 3 a +

-aNb/JabbC 12 +34;

N; NL N1M N11 b 2

N+ C G;H G;H N4 ; b G4H G4H 4 G3H G+H G3H

G+H

G152H N12

N1+

#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 Ultimapoz n! calculate5 se determin 3ozurm i!"
Nod N1+ N12 N11 N1M NL NA NB N; N4 N3 N+ N2 N1 !oziie 2 1 7 J + b 3 b 4 b ; b b "nulabil 1alse 1alse 1alse true 1alse true 1alse 1alse 1alse 1alse 1alse 1alse 1alse !rimapoz G2H G1H G 152 H G152 H G+H G 152 H G3H G 1525+ H G4H G 1525+ H G;H G 1525+ H G 1525+ H >ltimapoz G2H G1H G152 H G 152 H G+H G 152 H G3H G+H G4H G3H G;H G4H G;H 7 G3H 7 G4H 7 G;H 7 7 7 !ozurm G 1525+ H G 1525+ H

.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
G1525+H G1525+H G3H G4H G;H 7

1 2 + 3 4 ;

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 3ozurm i!"

+A

a a b 3 b C 4 ;

1 a 2 b

+ a

"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 a Jadaug tranziia 0 U la Dtranz 4 4 s53r6i& 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

)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$
.peci1icare de intrare )enerator Tabela de tranziii

.imulatorul citete tamponul de intrare i pe baza tabelei de tranziie identi1ic le,emele$


Tamponul de intrare Le,em .imulatorul automatului 1init Ieire

Tabela de tranziii

"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 r i5 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$
N-r1/ $ $ $ N-rn/

sM

.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 {} aJb@ {} "utomatele pariale corespunztoare celor + e,presii sunt8


a a b

1 +

2 4 b ;

a b

A a

Combinarea automatelor pariale 'n automatul general este8


M 1 2 b b b

+ a

.e 6a analiza irul de intrare aa:a ulimea strilor de start8 M515+5B


M 1 + B a 2 3 B a B b A b terminare

tipar 1

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 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=

stare

%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$
Tabela de simboluri

!rogram surs

"nalizor le,ical

atom citire atom

"nalizor sintactic

arbore

#estul prg$cod de 1ront7end

cod

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+

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 a

)8

!e baza acestui "0N se poate construi gramatica8 "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 a 2 se creaz 'n gramatic o construcie de 1orma "i a"j !entru 1iecare tranziie i !entru 1iecare tranziie i 2 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 *% CD D aNb % aNb Dac irul din intrare este UabV5 atunci pentru aceast propoziie se pot 1orma doi arbori8

34

. " D a * % % * % a

. C % D

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 . i4 N .. )28 . i4 N i4. L-)1/KL-)2/KGi42 N 2QK1H )1 este ambigu deoarece de e,emplu pentru i14 a6em dou deri6ri st<nga8 . .. ... i4.. i1M. i14 . .. i4. i4.. i1M. i14 '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 @ % id % % id % id % @ % J % 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 @ T 0 id T J 0 id

0 id

"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 N5T5 35.Q5 unde \) KN > T este 6ocabularul gramaticii$ >n simbol \) este inutil dac nu e,ist nici o deri6are de 1orma8 . KJQ u 6 KJQ u , 6 unde u5,56 TJ #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 %%@TNT TTJ0N0 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 ""cN.dN "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$ 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 PinstrQ

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 recunoa terea 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 %

" 0ig$ 1

b % d

"

e 0ig$ 2

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 % d % e " 0ig$ +

" b % d % e " 0ig$ 3 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$ .

b"e bd"e bdde


s s s

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 e ec #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 e ec, se revine la situa&ia intrrii de la sf/r itul 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 u or 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 "7Q 1N 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 bloc $

4B

bloc

CON.T

id

K 5

nr

\"#

id 5

!#OC%D>#%

id

bloc

instructiune

instructiune

id C"LL *%)IN

8K

e,presie id instructiune = %ND

I0 TEIL%

conditie conditie

TE%N DO

instructiune instructiune

conditie

ODD e,presie

e,presie K <> < <= > >= e,presie

4A

e,presie

@ 7 @

termen 7

termen

1actor

1actor

identi1icator numar e,presie /

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 num8Kid=

4L

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/= 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= else i1 clKnumar t9en anle, -J lipseste nume simbolic J/

;M

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/= anle,=

;1

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 begin

;2

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$ Oe ".!N e tabela de ".!N 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$ tampon de intrare ieire

sti6a

;+

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
Neterm$ITerm

% %Z T TZ 0

.imbol de intrare id @ %7QT%Z 7 7 %Z7Q@T%Z T7Q0TZ 7 7 TZ7Q 07Qid 7

J 7 7 7 TZ7QJ0TZ 7

%7QT%Z 7 T7Q0TZ 7 07Q-%/

/ 7 %Z7Q 7 TZ7Q 7

e 7 %Z7Q 7 TZ7Q 7

Trasarea algoritmului pentru irul de intrare8 id @ id J id !&i;a e% e%V T e%V TV 0 e%V TV id e%V TV e%V e%V T@ e%V T e%V TV 0 e%V TV id e%V TV e%V TV 0J e%V TV 0 e%V TV id e%V TV e%V e in&rare id@idJide id@idJide id@idJide id@idJide @idJide @idJide @idJide idJide idJide idJide Jide Jide Ide ide e e e iesire %7QT%V T7Q0TV 07Qid TV7Q %V 7Q@T%V T7Q0TV 07Qid TV 7QJ0TV 07Qid TV 7Q %V7Q 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 prim 4! 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

;4

1$ dac & este terminal atunci prim-&/KG&H -iniializare/ 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-f 2/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 regula %V7Q -5 id regula T7Q0TV regula TV7Q -5 id regula %7QT%V .e poate construi apoi urmtorul tabel8 id @ J prim -%/ true 1alse 1alse prim -%V/ 1alse true 1alse prim -T/ true 1alse 1alse prim -TV/ 1alse 1alse true prim -0/ true 1alse 1alse true 1alse true 1alse true / 1alse 1alse 1alse 1alse 1alse 1alse true 1alse true 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 @ regula %V 7Q @T %V / regula 07Q-%/ J regula TV 7Q J 0 TV e5/ regula %7QT%V e5/ regula %V 7Q @T %V e5/5@ regula T7Q0TV e5/5@ regula T7Q0TV e5/ e5/ @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 urm -%/ urm -%V/ urm -T/ urm -TV/ urm -0/ id 1alse 1alse 1alse 1alse 1alse @ 1alse 1alse true true true J 1alse 1alse 1alse 1alse true 1alse 1alse 1alse 1alse 1alse / true true true true true e true true true true true

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

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

;B

Ne&er,inal % %Z T TZ 0

!i,:'l (e in&rare id @ %7QT%Z 7 7 %Z7Q@T%Z T7Q0TZ 7 7 TZ7Q 07Qid 7

J 7 7 7 TZ7QJ0TZ 7

%7QT%Z 7 T7Q0TZ 7 07Q-%/

/ 7 %Z7Q 7 TZ7Q 7

e 7 %Z7Q 7 TZ7Q 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 Neterminal PinstrQ PalternQ Pe,prQ 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$ simbol terminal a PinstrQ7Qa b else 2 Pe,prQ7Qb i1 1 t9en e PalternQ7Q

;A

De5ini2ie8 O gramatic independent de conte,t este LL-1/ dac pentru orice neterminal al gramaticii sunt 'ndeplinite urmtoarele dou condiii8 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 acela i 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/$

;L

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 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 i( K %V7QT%V 7 T7Q0TV 7 07QId 7 %V7Qe T%V sinc TV 7Q sinc

Ne&er,inale % %V T TV 0

* 7 7 7 TV7QJ0TV sinc

( %7QT%V 7 T7Q0TV 7 07Q-%/

) 7 %V 7Q sinc TV 7Q sinc

G .inc %V 7Q .inc TV 7Q .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 e% e% e%V T e%V TV0 e%V TV id e%V TV e%V TV 0J e%V TV 0 e%V TV e%V e%V T@$$$ Ln&rare /idJ@ide idJ@ide idJ@ide idJ@ide idJ@ide J@ide J@ide @ide @ide @ide @ide c'ncl)zii W%5/XK6id KQerrorg

W05@X KQ sinc KQ errorg intrarea 'l conine pe @5 rm<ne intrare cu @

"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

BM

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$ 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 " " * * c e

B1

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 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 % K dQ % @ % KdQ % @ % J % KdQ % @ % J id+ KdQ % @ id2 J id+ KdQ id1 @ id2 J id+/ 1orma propoziional dreapta id1 @ id2 J id+ % @ id2 J id+ % @ % J id+ %@%J% %@% capt id1 id2 id+ %J% %@% producie pentru reducere % 7Q id % 7Q id % 7Q id % 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$

B2

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 $ - *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 e e id1 e% e%@ e % @ id2 e%@% e%@%J e % @ % J id+ e%@%J% e%@% e% in&rare id1 @ id2 J id+ e @ id2 J id+ e @ id2 J id+ e id2 J id+ e J id+ e J id+ e id+ e e e e e ac&i)ne deplasare reducere %7Qid deplasare deplasare reducere % 7Q id deplasare deplasare reducere % 7Q id reducere % 7Q % J % reducere % 7Q % @ % succes

1 2 + 3

Din acest e,emplu rezult c analizorul e,ecut urmtoarele 3 aciuni Deplasare8 simbolul de intrare curent este introdus 'n sti6 #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 %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$

B+

D.@. C'n5lic&e 7n &i,-)l analizei sin&ac&ice c) (e-lasare 6i re()cere %,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$ 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

Observa$ie:

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 i1 Pe,prQ t9en PinstrQ intrare 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/ -2/ -+/ -3/ -4/ -;/ -B/ -A/ -L/ PinstrQ 7Q id -PlistaDparamQ/ PinstrQ 7Q Pe,presieQ 8KPe,presieQ PlistaDparamQ 7Q PlistaDparamQ5PparametruQ PlistaDparamQ 7Q PparametruQ PparametruQ 7Q id Pe,presieQ 7Q id -PlistaDe,prQ/ Pe,presieQ 7Q id PlistaDe,prQ 7Q PlistaDe,prQ5Pe,presieQ PlistaDe,prQ 7Q Pe,presieQ

B3

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 %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

B4

:n analiza sintactica bazat pe precedena operatorilor se de1inesc + relaii de preceden disjuncte8 P 5 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 a P b aKb a Q b se,ni5ica2ia a cedeaz precedena lui b a are aceeai preceden cu 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 J Q @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 N a i a Oe$ :n continuare5 se elimin neterminalele din ir iar 'n irul rmas -conin<nd numai terminale i e/ se introduc relaiile de preceden corecte5 N 5=5 O$ 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 P 5 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

B;

id id @ J e P P P

@ Q Q Q P

J Q P Q P

e Q Q Q

: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 capt e % @ id J id e e N @ N id O J N id O e e % @ % J id e e N @ N J N id O e e%@%J%e e N @ N J O e % 7Q % J % e%@%e e N @ O e e % e KQ s1arsit

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

BB

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 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 N id id O N - N - i / O / / O O e 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/ - N - N id e N id O e id O / e id / N e / O /

Exemplu: .e consider gramatica8 % 7Q % @ % N % ] % N % J % N % I % N % c % N - % / N id Operatorii au urmtoarele proprieti8

BA

c J5I @$7

cel mai prioritar5 asociati6 la st<nga asociati6i la st<nga cea mai mic prioritate5 asociati6i la st<nga !e baza relaiilor de preceden de mai sus5 rezult urmtoarea matrice de precedene8 @ Q Q Q Q Q Q P Q P 7 Q Q Q Q Q Q P Q P J P P Q Q Q Q P Q P I P P Q Q Q Q P Q P c P P P P P Q P Q P id P P P P P P P P P P P P P P / Q Q Q Q Q Q K Q e Q Q Q Q Q Q Q

@ 7 J I c id / e

BL

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