Sunteți pe pagina 1din 27

Limbaje formale i translatoare (Compilatoare)

Analiza lexical
detecteaz atomii lexicali care nu aparin
limbajului respectiv
Analiza sintactic
detecteaz dac atomii lexicali sunt scrii
ntr-o ordine eronat
Analiza semantic
se ocup de restul erorilor, i anume de
erorile care privesc sensul atomilor lexicali
- reprezint ultima faz a componentei
front-end a compilatorului
2

Analiza semantic este necesar ca o etap


separat deoarece analiza sintactic nu este
capabil s identifice toate erorile posibile.
Cauza este faptul c unele construcii ale
limbajului sunt dependente de context.
Exemplu:
string a = 1234; a++;
Lex: KW ID OP_EQ CTS SEP_PV ID OP_INC SEP_PV
Yacc: corect din punct de vedere sintactic
Sem: incorect din punct de vedere semantic,
deoarece operatorul incrementare se poate aplica
numai dac variabila este de tip ntreg
3

Analiza semantic const dintr-o serie de verificri care au ca i


scop stabilirea dac secvena de atomi lexicali din arborele
sintactic are sens n contextul existent.
Verificri posibile:
- nu se folosesc identificatori (nume de variabile, nume de
funcii, nume asociate unor constante, nume de tipuri etc.) care
nu au fost definii
Excepie: - non typed variabiles (ASP)
Ex: var x = 10; (dup atribuire x primete tipul int tip stabilit
static, la compilare)
- Anonymous variables (C#)
Ex: var x = 10; (variabila x rmne fr tip chiar i dup
atribuire, n continuare putnd fi folosit pentru a i se atribui
orice alt tip de valoare tip stabilit dinamic, la rulare)

Tipul se deduce astfel din context.

- tipurile identificatorilor folosii n cadrul unei expresii sunt


compatibile
Ex: 5 * ATM
Limbaje strongly typed: o variabil poate fi folosit numai n
conformitate cu tipul cu care a fost definit (C#)
Ex: int a; Console.Writeline({0}, a);
Limbaje weakly typed: o variabil poate fi folosit i altfel de cum
a fost definit (C, C++)
Ex: int a; printf(%c, a);
- identificatorii sunt folosii n conformitate cu structura lor
Ex: a.b (a este un tip compus i are ca i membru pe b)
V[10] (v este o variabil multidimensional)
f(5,ATM) (f este o funcie care accept doi parametrii, primul de
tip ntreg, iar al doilea de tip ir de caractere)
- relaiile de motenire sunt corecte
- clasele, structurile, enumerrile au fost definite o singur dat

- Metodele din cadrul claselor au fost definite o


singur dat
- funciile din afara claselor au fost definite o
singur dat
- identificatorii sunt accesai n conformitate cu
modul de acces declarat
Ex: public/private, const
Toate aceste verificri depind de limbajul pentru
care se face analiza semantic i de aceea nu se
poate elabora un algoritm generic.

Are n vedere potrivirea care trebuie s existe


ntre declaraia unui utilizator i utilizarea
acestuia.
Domeniul de valabilitate al unei variabile
reprezint poriunea din program n care
variabila respectiv este accesibil.
Acelai identificator (acelai nume) se poate referi
la entiti semantice diferite, n poriuni diferite
din program. Singura condiie este ca domeniile
de valabilitate ale acestor entiti identificate cu
acelai nume s nu se suprapun.
Ex: utilizarea aceluiai nume pentru variabile de
tip diferit, pentru variabile i funcii sau metode,
pentru variabile i nume de clase, .a.
7

Un identificator poate avea un domeniu de


valabilitate restrns.
Ex: - variabilele locale unei funcii pot fi
accesate numai n cadrul codului funciei
- n schimb, variabilele globale pot fi accesate
de oriunde din cadrul programului n care au
fost declarate
- atributele i metodele definite ntr-o clas
sunt accesibile numai pentru instanele clasei
respective
8

Domeniul de valabilitate poate fi:


- static depinde numai de textul programului i
nu este influenat de comportamentul din
momentul rulrii
Legtura dintre date i identificator (n cazul
variabilelor), i dintre cod i identificator (n cazul
metodelor i funciilor) este static.
Ex: majoritatea limbajelor de programare
- dinamic depinde de execuia programului
Ex: Lisp, SNOBOL
O variabil cu domeniu de valabilitate dinamic se
refer la cea mai apropiat legtur din execuia
programului.
9

Legturile dintre identificatori i date sau cod


sunt definite de ctre:
- declaraiile claselor (rezult numele claselor)
definiiile
metodelor
(rezult
numele
metodelor)
- declaraiile de variabile (rezult identificatorii
variabilelor)
- parametrii formali din definiiile funciilor
(rezult identificatorii variabilelor locale)
- definiiile atributelor unei clase/structuri
(rezult identificatorii membrilor clasei/structurii)

10

Contextele pstreaz definiiile i declaraiile


curente necesare analizei semantice:
- pentru variabile: numele, tipul, dac au fost
sau nu iniializate, valoarea iniial
- pentru clase/structuri: numele i structura
noilor tipuri
- pentru funcii: numele, tipul datei returnate,
numrul i tipul parametrilor de intrare,
precum i modalitatea de transmitere a
acestora
- .a. n funcie de limbaj
11

Pe msur ce se ntlnesc instruciunile de


declarare
i
definiie
a
variabilelor/tipurilor/funciilor .a. se adaug
contextului curent informaiile despre fiecare
n parte.
La ntlnirea instruciunilor care folosesc
variabile/tipuri/funcii,
se
face
analiza
semantic a acestora pe baza informaiilor
memorate n contextul curent.

12

Contextele sunt implementate prin intermediul


tabelei de simboli.
Cu alte cuvinte, tabela de simboli este cea care
memoreaz legturile curente existente ntre
identificatori i date, respectiv cod.
n general aceasta este o tabel de dispersie asupra
creia se pot realiza urmtoarele operaii:

deschidere context nou,


adugarea unui nou identificator mpreun cu informaiile
de rigoare,
cutarea unui identificator (verificarea dac un identificator
a fost definit n contextul curent),
extragerea informaiilor privind un identificator existent,
nchiderea
unui
context
inclusiv
cu
tergerea
identificatorilor din contextul respectiv.

13

Definiia tipurilor variaz de la limbaj la limbaj, dar


partea comun a acestor definiii este: tipul este un
set de valori mpreun cu operaiile care se pot
efectua asupra acestora.
Clasificare:
- tipuri simple, de baz (int, char, float, double, bool,
union) sunt suportate chiar de ctre procesor nu
au coresponden n lumea real
- tipuri compuse (variabile multidimensionale,
pointeri, structuri, clase) ncearc s ofere o
coresponden cu lumea real
- tipuri complexe (liste, arbori) nu sunt suportate
direct de ctre limbaj, dar pot fi implementate

14

Nu au informaie semantic suplimentar.


Excepie face tipul enum.
Deoarece
sunt
deja
implementate
n
hardware, ele nu trebuie create.
Variabilele declarate pentru un tip de baz
trebuie s aib o referin ctre tipul lor.

15

Pentru fiecare tip compus trebuie salvat o


list de perechi nume-tip care s memoreze
informaiile despre membrii tipului (atribute
i metode).
Aceste informaii sunt salvate ca i context, n
tabela de simboli.

16

Trebuie s se memoreze:
- numele variabile
- tipul variabilei (care poate fi de baz sau
compus)
- dimensiunea/dimensiunile

17

Trebuie memorat:
- numele
- tipul (tip de baz sau compus)

18

Verific dac operaiile folosesc ca i operanzi


tipuri potrivite.
Aceast validitate a tipului versus operaia
curent depinde de fiecare tip n parte, i de
limbaj.
Orice nerespectare n aceast privin va
ridica o eroare de tip.
Dac toate erorile de tip pot fi verificate de
ctre compilator, atunci limbajul este strongly
typed. Altfel, el se numete weakly typed.
19

Verificarea de tip se poate face:


- static, adic la compilare (C, C++)
- dinamic, adic la rularea programului
(variabilele anonime din C#, Perl, Phyton, Ruby)
- fr verificare de tip (limbajul de asamblare)
Pro verificare static:
- descoper foarte multe erori nc n etapa de
compilare
- elimin execuia de cod suplimentar la rulare
Pro verificare dinamic:
- tipurile statice sunt restrictive

20

Verificarea de tip verificarea programelor n


care toate elementele au atribuit un tip
Inferena de tip completarea informaiei
privind tipul, informaie care lipsete, pornind
de la context
Sinteza de tip determinarea tipului unei
construcii (expresii) pe baza tipurilor
membrilor ei
Concepte diferite, dar denumirile lor sunt
adesea folosite interschimbabil.
21

Construciile limbajelor care au asociat un tip


sunt:
- constantele
- variabilele
- funciile
- expresiile
- instruciunile

- condiia lui if, while, do-while n C# trebuie s


aib tipul bool
- valoarea pe care se face switch trebuie s aib un
tip ntreg (C/C++), sau inclusiv string (C#)

22

Formalismul verificrii de tip este reprezentat


de ctre regulile logice ale inferenei.
Regulile de inferen au forma:

Dac Ipoteza este adevrat, atunci i concluzia este


adevrat.

Raionamentul pentru verificarea de tip este:


Dac E1 i E2 au anumite tipuri, atunci E3 are un
anumit tip

Ex:
int a,b=3; a = b + 3.4;

23

Exist tipuri compatibile.


Compatibilitatea n ambele direcii
Compatibilitatea ntr-o singur direcie

vs.

Ex: int este compatibil cu float, dar float nu este


compatibil cu int

Conversii de tip cast


Implicit cast
float a = 3;

Explicit cast
Int a = (int)3/4;

24

Subtipuri un subtip poate fi folosit


totdeauna n locul tipului printe.
Ex:
enumerrile tipul printe este tipul ntreg
Motenirea, polimorfismul

25

Pentru declaraii (variabile i funcii):

Adugarea de informaii n tabela de simboli


Verificarea redefinirii unui identificator
Verificarea definirii tipului folosit n declaraia
respectiv
.a.

Pentru instruciuni:

Verific regulile specifice fiecrei instruciuni n


parte (implic verificarea de tip)

Pentru expresii:

Verificarea de tip, eventual sinteza i/sau inferena


de tip

26

http://cursuri.cs.pub.ro/~cpl/Curs/CPLCurs04.pdf

27

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