Sunteți pe pagina 1din 24

Limbaje formale i translatoare (Compilatoare)

Scopul analizei lexicale este transformarea irului


de caractere care formeaz codul surs, ntr-o
secven de grupuri sintactice nume atomi
lexicali.
Dac lipsete etapa de reconstrucie a liniilor,
analizorul lexical trebuie s elimine i separatorii
din codul surs.
Poate elimina comentariile din codul surs, caz n
care operaia respectiv nu va mai trebui
realizat n etapa de preprocesare; n cazul n
care limbajul n care a fost scris codul surs nu
necesit celelalte operaii din preprocesare,
aceast etap poate fi eliminat complet.

1. Cuvintele rezervate ale limbajului de programare n care este scris codul surs
Ex: n C int, long, float, double, unsigned, void, if, else, for, while, do, switch,
default, case, struct

n C++ class, inline, virtual

A. Nume de variabile
B. Nume de funcii
C. Nume de constante

A. Aritmetici
Ex: n C +,-,*,/,%,
B. Logici
Ex: n C &,|,!

2. Identificatorii

3. Constante
Ex: ntregi (12, +3, 0), reale (12.0, +3.2, 0.0), caracter (a, \n), ir de caractere
(, la facultate), bool (true, false), hexazecimale (0x45, 0xFA), .a.
4. Operatori

5. Semne de punctuaie (simboli sau grupuri de simboli cu rol delimitativ)


Ex: n C spaiu, punct i virgul
6. Comentariile
Ex: n C liniile care ncep cu //, sau irurile de caractere dintre /* i */

Fiecare atom lexical poate fi reprezentat prin dou


elemente: tipul i valoarea.
Tipul atomului lexical este dat de clasa de atomi lexicali
din care face parte.
Valoarea unui atom lexical este reprezentat de
succesiunea de caractere care formeaz atomul lexical
respectiv.
Ex: identificator, NumeVariabil
mprirea se bazeaz pe faptul c n analiza sintactic
care urmeaz nu este important care atom lexical
urmeaz, ci mai ales ce tip de atom lexical urmeaz.
Ex: pentru instruciunea int a1; este important c dup
cuvntul cheie int urmeaz un identificator; nu are
importan c acest identificator este a1.

n etapa de analiz lexical se genereaz i se


completeaz tabela de simboli; aceasta se
bazeaz pe urmtoarele structuri:
1. Tabela de identificatori: cuprinde numele
identificatorului, tipul acestuia, i n funcie
de tip, o serie de informaii semantice.
2. Tabela de constante: cuprinde tipul
constantei i valoarea acesteia.
3. Tabela de cuvinte rezervate.

Dup relaia dintre analizorul lexical i cel


sintactic:
1. Analizor lexical independent de analizorul
sintactic
Analizorul lexical este lansat pentru analiza ntregul
program: genereaz ntreaga secven de atomi
lexicali i completeaz n mod corespunztor tabela
de simboli i structurile asociate.
Aciunea analizorului sintactic este succesiv
aciunii analizorului lexical.

2. Analizor lexical
analizorul sintactic

comandat

de

ctre

Analizorul lexical este implementat sub forma unei


proceduri (funcii) care la fiecare apel ntoarce un
atom lexical
Poate fi implementat pentru a fi utilizat n dou
modaliti:
Prin apel direct: Analizorul sintactic cere urmtorul
atom lexical care poate fi extras din codul surs
Prin apel indirect: Analizorul sintactic cere un anumit
atom lexical

Dup structura analizorului lexical:


Analizor lexical monobloc (unipas): primete ca i
intrare secvena de caractere care formeaz codul
surs i returneaz secvena de atomi, fr a trece
prin etape intermediare.
Analizor lexical structurat (multipas): mparte codul
surs n atomi lexicali prin parcurgerea mai multor
etape:
1. Transliterarea
2. Exploatarea
3. Selectarea

Analiza lexical este partea cea mai critic pentru un


compilator, din punct de vedere al performanelor.
De
exemplu,
dac
analizorul
lexical
este
implementat n forma comandat de ctre analizorul
sintactic, atunci el va fi apelat pentru fiecare atom
lexical din codul surs.
Rezult deci c aceast component trebuie s fie
foarte eficient.
Cutarea liniar sau utilizarea unei succesiuni foarte
lungi de instruciuni if la procesarea unui atom
lexical trebuie evitate.
n acest sens toate tabele care vor fi construite vor fi
implementate prin tabele de dispersie (tabele hash)
sau prin tabele indexate.

O tabel hash este o structur de date care utilizeaz o


funcie de hash pentru a mapa valorile de identificare
(numite chei), de exemplu numele unui identificator la
valorile asociate, de exemplu tipul acestuia, valoarea i
domeniul de valabilitate.
Funcia hash permite transformarea cheii ntr-un index al
unui element dintr-un vector n care se afl valorile
corespunztoare.
Este de preferat ca funcia de hash s permit maparea
fiecrei chei la un index unic n vectorul de valori. n
practic ns nu se poate gsi ntotdeauna o astfel de
funcie. De aceea se utilizeaz listele de coliziuni: listele
de valori pentru cheile care au aceeai valoare hash,
implementate prin liste simplu/dublu nlnuite.
Cutarea n listele de coliziuni va fi o cutare secvenial.

10

11

Analizorul lexical ar trebui s ofere i o bun


diagnosticare a erorilor care survin la analiz,
precum i un mecanism eficient de tratare a
acestora.
Ex:
Dac a fost folosit o constant numeric cu valoarea
mai mare dect valoarea maxim acceptat de ctre
limbaj, atunci analizorul lexical ar trebui s emit un
mesaj n acest sens i s nlocuiasc valoarea constantei
cu valoarea maxim.
Dac a fost folosit un ir de caractere cu o lungime mai
mare dect lungimea maxim acceptat, atunci
analizorul lexical trebuie s emit un mesaj n acest sens
i s trunchieze irul la lungimea acceptat.

12

n vederea generrii de mesaje de eroare sau


de atenionare ct mai utile, analizorul lexical
trebuie s pstreze i informaii privind
locaia n codul surs a fiecrui atom lexical.
Informaiile de poziie sunt completate n
cmpuri
special
create
din
tabela
corespunztoare.

13

A scrie un analizor lexical nseamn a scrie un


program care este capabil s recunoasc i s
extrag toate cuvintele (secvenele de caractere)
care aparin limbajului supus analizei.
Cum putem defini un limbaj?

n plus:

Expresii regulate
Automate finite: maini abstracte capabile s recunoasc
limbaje
Automate finite deterministe: pot fi foarte uor
convertite n programe

Putem translata orice expresie regulat ntr-un AF


Pentru orice AF putem construi un AFD echivalent
Orice AFD poate fi tradus ntr-un program

14

Fie sirul : while a-b>0 do b:=b+7

1. Sirul transliterat

c.l c.l c.l c.l c.l c.b c.l c.o c.l c.o c.c c.b c.l c.l c.l c.o c.o c.l c.o c.c

2. Sirul explorat

Clasa

Valoare

3. Sirul selectat

identif
while

id

op id op identif id atrib id op cif


-

>

b >

do

:=

Clasa while id operat id operat cifra do id operat id operat Cifra


Valoare - 108
112
>
2
- 112 := 112
+
4

TS

TS

TC

TS

TS

TC

15

Fie gramatica de atomi lexicali :

G1: 8. <atom> -> <id> | <const> | <op> | <delimitator> |


<comentariu>

G2: 7. <id> -> <lit> | <id><lit> | <id><cifra>

6. <const> -> <cifra> | <const><cifra>

5. <op> -> + | * | < | <= | >= | > | = | <>

4. <delimitator> -> ; | blk | <delimitator> blk

3. <comentariu> -> */ blk/*

G3 : 2. <litera> -> A| | Z
1. <cifra> -> 0 | | 9
Gramatica se poate transforma in 3 gramatici regulate la care
intrarea uneia este iesirea alteia G1 , G2 ,G3

16

x din {A,..,Z}

(lit, x)

blk

(bl, blk)

(pv, ;)

y din {0, ,9}

(cif, y)

(pl, +)

(mul, *)

(sl, /)

<

(ls, <)

>

(gt, >)

(eq, =)

17

lit

lit,cif

cif

iesire (id, -)

cif

iesire (const, -)

pl

iesire (op, pl)

sl

altceva
mul

eq

sl

orice orice

pv
blk

iesire (op,mul)
iesire (com, -)
iesire (op,eq)
iesire (op,pv)

blk

iesire (bel, blk)

ls

iesire (op, ls)


eq

iesire (op, le)

gt

iesire (op, ne)

gt

iesire (op,gt)
eq

iesire (op,ge)
18

del

zona de selectie

pv

(dl, pv)

SEL
blk
com

op
const
id

(op,{mul,pl...})
CAUTC

CAUT CVR

(const, pointer TC)


id

(id, pointer TS)

if

(if, -)

begin

(begin, -)

ATOMI LEXICALI
19

Automatul
finit
expresiei regulate:

nedeterminist

echivalent

este:

20

21

Automatul finit determinist echivalent celui


anterior (nedeterminist) este:

# nseamn: n cazul oricrei alte intrri,


mergi la starea 25.

22

23

http://inst.eecs.berkeley.edu/~cs164/sp10/n
otes/notes.pdf
http://msdn.microsoft.com/enus/library/system.collections.hashtable.aspx

24

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