P. 1
Analiza lexicala

Analiza lexicala

|Views: 504|Likes:
Published by Flashh

More info:

Published by: Flashh on Aug 26, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PPT, PDF, TXT or read online from Scribd
See more
See less

11/14/2013

pdf

text

original

Analiza lexicala

Analiza lexicala

clasa operatorilor. analizorul lexical va crea un atom lexical care sa o descrie. Clasele sunt pentru o anumita implementare. multimi finite. drept clase vom gasi: . ³LESS´ si ³LT´. Totusi. In majoritatea limbajelor de programare.clasa constante reale . De exemplu. toate trei vor conduce la crearea aceluiasi atom lexical. . daca in clasa operatorilor intra de obicei putini operatori (10 ± 20). de cele mai multe ori limitarae aparand in urma implementarii si nu datorita definitiei limbajului. daca consideram ca reprezentari posibile pentru operatorul relational ³mai mic´ pe ³<´.clasa constante intregi . In momentul in care o secventa de caractere a fost identificata ca o aparitie a unui simbol de baza. vazut ca un sir de caractere.clasa identif. intr-un sir de simboluri numite atomi lexicali (tokeus). .Analiza lexicala transforma programul sursa. Un atom lexical poate fi privit ca un reprezentant al unei clase de siruri de caractere cu reguli de formare precise. in clasa identificatorilor sau constantelor vom gasi un numar reletiv mare de elemente.

De exemplu. atom lexical Clasa Valoare 1 zona sirurilor beta .Sarcina analizorului lexical (scanner) este sa detecteze in sirul de caractere al PS. sa clasifice aceste subsiruri si sa le traduca in atomi lexicali. adica in informatii codificate ce vor pastra esentialul : clasa fiecarui subsir si eventual. subsiruri ce respecta regulile de formare ale atomilor lexicali. atomul lexical va contine un cod numeric. reprezentand clasa si un indicator spre zona in care se gaseste memorat sirul de caractere. sa zicem 1. in cazul unui subsir clasificat ca identificator. modul de regasire al subsirului.

in atomul lexical se plaseaza un indicator spre intrarea din TS corespunzatoare identificatorului. atributele sale. care este un ³dictionar´ al tuturor identificatorilor si constantelor din program. iar in loc de indicator spre sir. In acest scop.In mod curent. sau ce reprezinta el in general. compilatorul mentine o zona rezervata pentru Tabela de Simboluri (TS). indicatia (valoarea) este prelucrata spre a servi altor scopuri. atom lexical Clasa Valoare Nume/ valoare Atribute 1 beta Zona sirurilor . De exemplu: pentru fiecare identificator ne intereseaza daca el apare pentru prima data in program. In aceasta tabela trebuie cautat identificatorul depistat in sirul de intrare.

Construirea unui analizor lexical presupune parcurgerea urmatoarelor etape: Stabilirea simbolurilor de baza Stabilirea modului de recunoastere. De regula. Pentru exemplificare sa consideram caracterul ³:´ care in limbajul Pascal este un simbol de baza. Delimitatorii (cuvintele cheie. Reprezentarea si structura acestor simboluri de baza poate fi modificata fara a altera puterea de exprimare a limbajului. . In acest caz s-a depistat sfarsitul sirului iar in capul de citire a benzii de intrare este pozitionat pe urmatorul caracter. Implementarea analizorului lexical. Sarcina unui analizor lexical este sa extraga urmatorul sibol de baza din textul de intrare. Proiectarea atomului finit pentru fiecare symbol de baza. determinand sfarsitul simbolului in timpul cautarii. pornind de la simbolurile de baza pot fi construite automate finite care sa le accepte. Stabilirea modului de tratare a erorilor. caracterele speciale precum si combinatiile de caractere speciale) impreuna cu identificatorii si constantele reprezinta simbolurile de baza ale unui program sursa. extragere si reprezentare a simbolurilor de baza. In momentul in care un analizor Pascal ajunge in starea finala corespunzatoare acestuia se poate opri si poate accepta simbolul. nefiind inceputul unui alt simbol de baza.

Daca atomul se opreste intr-o stare finala. In caz contrar. dar este inceputul simbolului ³:=´. Exemplu: Presupunem ca un limbaj are urmatoarele simboluri de baza: identificatori. analizorul trebuie sa avanseze dincolo de el pentru a vedea ce urmeaza. O reprezentare a gramaticilor pentru aceste simboluri poate fi urmatoarea: . asigurandu-se astel o pozitie de intoarcere. Pentru reprezentare se pot folosi diagramele de tranzitie. De aceea. succesiuni de caractere speciale. a alfabetului de intrare si a functiei de tranzitie. se reface textul de la intrare in pozitia ultimei stari finale intalnite. Proiectarea automatului finit pentru determinarea unui anumit simbol de baza (atom lexical) presupune determinarea starilor automatului.Caracterul ³:´ este de asemenea un simbol de baza Pascal. Se semnaleaza eroare lexicala doar in cazul in care nu s-a trecut printr-o stare finala in timpul parcurgerii sirului. constante caractere speciale. procesul de obtinere a unui nou simbol de baza se incheie. cuvinte cheie. Automatul trebuie deci sa retina informatii referitoare la cea mai recenta stare finala intalnita.

4 2 3 c . succesiune_caractere_speciale ´:=´| ³<>´. cuvant_cheie ¶and¶|¶begin¶. constante cifra. caracter_special ¶:¶| µ. Automatele finite corespunzatoare sunt urmatoarele: l 1 l.c 0 A1 c A2 0 : A3 0 . cifra ¶0¶|«|¶9¶.¶.indetificator -> litera (litera|cifra) litera ¶A¶|«|¶Z¶.

astfel: A1 1 l : 3 4 A3 . Pentru a reprezenta analizorul lexical se construieste un automat global pentru recunoasterea simbolurilor de baza ale limbajului. Acesta se realizeaza prin cuplarea celor 4 automate pe starea initiala 0.= : A4 0 < 7 > 8 5 6 unde l reprezinta litera iar c cifra. 0 c : < 5 = > 7 6 8 A4 2 A2 .

se va introduce cate o actiune semantica pentru tratarea acesteia.in cazul tuturor tranzitiilor care provin din automatele A1 si A2 se va introduce o actiune care va concatena caracterul curent de la intrare la un sir dat. .in caz de eroare.Pentru a extrage simbolul de baza care incepe dupa o pozitie p in sirul de intrare trebuie sa recunoastem si sa stergem caracterele nesemnificative ± ca de exemplu spatiile albe (blanc) si comentariile (/* orice sir format din caractere diferite de * si /) ± trebuie sa folosim automatul pentru a citi simbolul si sa fixam pozitia finala p¶. Eliminarea caracterelor nesemnificative se poate face astfel: Spatiu alb orice car inafara de * si / / * * 0 9 10 11 / Analizorul lexical trebuie sa tina seama de urmatoarele cerinte: .pentru fiecare tranzitie intr-o stare finala se introduce o actiune semantica care va codifica corespunzator atomul lexical. . .

indetificator litera (litera | cifra)* litera ¶a¶ | µA¶ «|¶Z¶.¶cifra+ [scara] scara µe¶ [µ+¶ | µ-µ] constanta_intreaga. -constante intregi -caracterele speciale µ:¶ si µ. -constante reale.Problema rezolvata Sa se implementeze un analizor lexical care sa recunoasca: -identificatori. Se va folosi o structura de date de tip inregistrare care va contine urmatoarele campuri: codul atomului lexical si valoarea sa. Se vor construi.¶ -secventa de aractere speciale ³:=´ -cuvintele cheie ³begin´. constanta_reala cifra+ scara | cifra+ ¶. cifra µ0¶ |«|¶9¶. .constanta_intreaga cifra+ 3. dupa modelul anterior urmatoarele gramatici: 1. ³end´. 2.

daca ch este litera atunci | .repeta | | * adauga caracterul ch la nume | | citeste ch | | pana ch este diferit de litera sau cifra | | .daca * nume este cuvant cheie atunci | | *codifica corespunzator | | astfel | | * atomul este identificator | | altfel daca ch este cifra atunci | .Algoritmul in pseudocod: * initializeaza nume=´ ³ -cat_timp ch este spatiu alb repeta |citeste ch .repeta | | * adauga caracterul ch la nume | | citeste ch | | pana ch este diferit de cifra | | .

daca ch este µ+¶ sau µ-µ atunci | | | * adauga semnul in nume | | | citeste ch | | - .|* atomul este constanta intreaga | .repeta | | | | * adauga caracterul ch la nume | | | | citeste ch | | | | pana ch este diferit de cifra | | | | | | | .daca ch este µe¶ sau µE¶ atunci | | * atomul este constanta reala | | * adauga caracterul la nume | | citeste ch | | .¶ atunci | | * atomul este constanta reala | | * adauga caracterul la nume | | citeste ch | | .daca ch este cifra atunci | | .daca ch este µ.

| | .daca ch este cifra atunci | | | .¶ | citeste ch | altfel | * atom necunoscut | citeste ch - .¶ | * Caracterul special µ.repeat | | | | * adauga caracterul ch la nume | | | | citeste ch | | | | pana ch este diferit de cifra | | | | | | | altfel daca ch este µ:¶ atunci | * adauga ch la nume | citeste ch | .daca ch este µ=¶ atunci | | * secventa ³:=´ | | citeste ch | | altfel | | * Caracterul special µ:¶ | | altfel daca ch este µ.

/*Initializare atom */ atom.h> #include <conio.h> #include <string.cend. FILE *f.ceof }tipAtom .nume[0]=0. } atom.Programul C este: #include <stdio. atom.h> #include <ctype.cbad. struct {tipAtom cod.nume[*k]=ch.creal.cod=cbad.cint.cpv. void Adauga(int *k){ if(*k < dim-1) { atom. (*k)++. int ch.h> #define dim 25 typedef enum {cid. atom. } } void Analex(void){ static int k.h> #include <stdlib.nume[*k+1]=0. /*Elimina spatiile*/ while(isspace(ch)) ch=getc(f).catrib. /*Daca este litera */ .cdpct.cbegin. char nume[dim].

nume. /*Retine partea fractionara */ . /*Atomul este constanta intreaga */ atom. ch=getc(f). else atom.cod=cbegin. Adauga(&k). } if(!strcmp(atom. }while(isdigit(ch)). ch=getc(f).nume.cod=cint."end")) atom. do{ Adauga(&k). else if(!strcmp(atom. } /*Daca este cifra */ else if(isdigit(ch)){ k=0.cod=cend.cod=cid. ch=getc(f). while(isalnum(ch)){ Adauga(&k).if(isalpha(ch)){ k=0."begin")) atom.

} } /*Retine exponentul */ if(ch=='e' || ch=='E'){ /*Atomul este constanta reala */ atom. }while(isdigit(ch)). if(ch=='+' || ch=='-'){ Adauga(&k). if(isdigit(ch)){ do{ Adauga(&k). ch=getc(f). } if(isdigit(ch)){ do{ Adauga(&k). ch=getc(f).if(ch=='. ch=getc(f).cod=creal.cod=creal.'){ /*Atomul este constanta reala */ atom. Adauga(&k). } } . Adauga(&k). ch=getc(f). ch=getc(f). }while(isdigit(ch)).

cod=cdpct.nume[0]=ch. atom. ch=getc(f).nume[1]=0. ch=getc(f). else{ /*Este caracter ilegal */ atom. if(ch=='='){ Adauga(&k).cod=catrib. atom. }/*Daca este sfarsit de fisier */ else if(ch==-1) atom. Adauga(&k)./*Avanseaza la urmatorul caracter */ } } .cod=cpv.cod=ceof. atom. atom.cod=cbad. ch=getc(f). atom.'){ k=0. ch=getc(f). Adauga(&k).} /*Daca este doua puncte*/ else if(ch==':'){ k=0. } } /*Daca este punct si virgula */ else if(ch=='.

scanf("%s". if((f=fopen(fisier. printf("%5d %-15s\n". printf("\nDati numele fisierului care se analizeaza ").){ Analex(). for(. } return 0.fisier). } ch=' '."rt"))==NULL){ fprintf(stderr.cod.int main(void){ char fisier[17].atom."Cannot open input file \n")."*NUME*******"). printf("%5s %-15s\n".cod !=ceof.atom. } ."*COD*".atom.nume). // clrscr(). exit(1).

Pentru a vea imaginea completa. De aceea. In diferite faze ale compilarii exista sarcini comune ale tratarii erorilor.Modelul analizorului lexical Sintaxa atomilor lexicali se prezinta sub forma unei gramatici regulate sau a unui GIC care genereaza un limbaj regulat. Se va pune in evidenta modul in care se face detectarea erorilor in analizorul lexical. completata cu problema codificarii atomilor lexicali si cu probelma semnalarii si tratarii erorilor. In acest din urma caz exista metode simple de a transforma gramatica intr-o gramatica regulata echivalenta. A N. In cazul unui limbaj regulat. ca o problema de decizie: sa stabileasca despre sirul de caractere daca este sau nu atom lexical. este ca niciun neterminal sa nu fie autocontinut. Odata stabilit tipul atomilor lexicali si avand o gramatica pentru acest limbaj. numai un tip de recursivitate: la stanga sau la dreapta. in primul rand. in continuare. . In general. problema de decizie trebuie. Modelul va fi completat in momentul proiectarii cu alte facilitati pentru a raspunde ami bine nevoilor analizei lexicale. adica: + pentru orice A. daca este posibil. problema analizei lexicale apare. iar problema apartenentei la un limbaj este decidabila. modulul formal folosit in conceperea cuvintelor din limbaj este automatul finit. in primul rand necesitatii de generare a atomilor lexicali. A A [( = sau = ] O solutie simpla pentru a obtine aceasta conditie este ca in productiile gramaticii sa se foloseasca. restrictia impusa GIC pentru a putea fi transformata. Automatul finit poate fi considerat modelul de baza al analizorului lexical. se obisnuieste ca toate aspectele legate de tratarea erorilor sa se rezolve printr-o colectie proceduri comune tuturor fazelor. instrumentul matematic.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->