Sunteți pe pagina 1din 217

RCAI

404

Seria

nvmnt la Distan

UNIVERSITATEA DIN CRAIOVA Facultatea de Matematic i Informatic


CENTRUL DE CERCETARE N INTELIGENA ARTIFICIAL

AUTOMATE, LIMBAJE I COMPILATOARE

ION IANCU

EDITURA SITECH

CRAIOVA, 2008

Refereni tiinifici:
Prof. univ. dr. NICOLAE NDREANU, Prof. univ. dr. ALEXANDRU DINC, Facultatea de Matematic i Informatic Universitatea din Craiova

Automate, limbaje i compilatoare

Titular: Prof. dr. Ion Iancu Tutore: Prof. dr. Ion Iancu

Automate, limbaje i compilatoare

Algoritmi genetici

Despre Curs
Scurt descriere a cursului. Cursul are dou pri: prima se ocupa de Limbaje formale i automate iar a doua de Proiectarea compilatoarelor. n prima parte se studiaz noiunile de gramatic i limbaj formal, automat finit i automat pushdown. Se definesc aceste noiuni, se arat cum se utilizeaz n reprezentarea limbajelor i se demonstreaz echivalena limbajelor acceptate de automate finite i respectiv pushdown cu limbajele generate de de gramaticile regulate i respectiv independente de context. Se asemenea, se studiaz algoritmi de simplificare a gramaticilor independente de context i clase speciale de astfel de gramatici. Acest studiu este necesar deoarece gramaticile independente de context sunt utilizate n specificarea sintaxei limbajelor de programare. Un compilator se construiete traducnd, n mai multe etape, textul surs n cod obiect. De aceea, partea a doua ncepe cu un studiu al metodelor de traducere. n continuare se studiaz fiecare etap ce trebuie parcurs pentru a proiecta un compilator, prezentndu-se metode, algoritmi, exemple. Obiectivele cursului. - Cunoaterea modelelor matematice (gramatici i automate) folosite n reprezentarea limbajelor, n general, i a celor de programare, n special. - Cunoaterea pailor ce trebuie parcuri n vederea proiectrii unui compilator i a unor metode de a realiza aceti pai. Necesar Hardware i software pentru desfurarea cursului. Calculator i soft adecvat (limbaj C, Java, etc)

Despre Curs

Automate, limbaje i compilatoare

Automate, limbaje i compilatoare

Despre Curs Curs 1 : Gramatici i automate finite.. 9 Curs 2 : Limbaje independente de context. 25 Curs 3 : Gramatici independente de context i automate pushdown.. 39 Curs 4: Clase speciale de gramatici independente de context (I). 49 Curs 5 : Clase speciale de gramatici independente de context (II) 63 Curs 6 : Teoria traducerii, analiz lexical 81 Curs 7 : Algoritmi generali de analiz sintactic............................ 101 Curs 8 : Analiza sintactic LL, LR i de preceden. 115 Curs 9 : Analiza semantic. 129 Curs 10 : Generarea codului intermediar.. 145 Curs 11 : Optimizarea codului 163 Curs 12 : Generarea codului obiect... 177 Curs 13 : Tabela de simboluri ... 193 Curs 14 : Tratarea erorilor.. 207 Apendice A ........................................................................................................ Apendice B ........................................................................................................ Bibliografie ........................................................................................................ 217 Note Aditionale .................................................................................................

Cuprins

Automate, limbaje i compilatoare

Automate, limbaje i compilatoare

I. LIMBAJE FORMALE I AUTOMATE Curs 1 Gramatici i automate finite


Descriere General: Se studiaz noiunile de gramatic, automat finit i legtura dintre ele din punct de vedere al limbajului Obiective: - nsuirea noiunilor: gramatic formal, limbaj formal, automat finit - cunoaterea clasificrii Chomsky, a metodei de construire a gramaticii care genereaz un limbaj ce conine cuvntul vid, a verificrii recursivitii - cunoaterea funcionrii unui automat finit i a minimizrii acestuia - echivalarea limbajelor regulate cu limbajele acceptate de automate finite

Curs 1 Durata:

2 ore

Cuprins I.1. Clasificarea gramaticilor dup Chomsky I.2. Automate finite I.3. Relaia dintre automate finite i limbaje regulate

Coninut Curs

I.1. Clasificarea gramaticilor dup Chomsky


Definiia 1.1. Fie V o mulime finit i nevid numit alfabet. Pentru
k N notm V * =
kN

U V k . Orice cuvnt ( w1 ,L, wk ) V k

l notm cu w1 L wk ,

iar numrul k este lungimea cuvntului. Mulimea V 0 are un singur element,


numit cuvntul vid i notat cu . Orice submulime L V * se numete limbaj formal sau pe scurt limbaj.

Pentru descrierea limbajelor sunt folosite urmtoarele metode: - enumerarea elementelor, cnd limbajul este finit

Automate, limbaje i compilatoare

- folosirea noiunii de gramatic, atunci cnd limbajul este infinit.


Definiia 1.2. O gramatic este un sistem G = ( N ,, P, S ) unde:

- N este un alfabet ale crui elemente se numesc neterminale i se noteaz cu litere mari. - este un alfabet ale crui elemente se numesc terminale i se noteaz cu litere mici. - P ( N ) N ( N ) ( N ) este mulimea regulilor de producie.
* * *

Definiia gramaticii

- S N este simbolul iniial .

Convenim ca orice element (u , v ) P s-l notm u v , specificnd astfel c se nlocuiete cuvntul u cu cuvntul v . Pentru orice producie u v exist cel puin o variabil n cuvntul
u,

deoarece

(u, v ) (N )* N (N )* (N )* .
Definiia 1.3. Pe mulimea cuvintelor se definete relaia binar

astfel: w (se citete w deriveaz direct pe ) dac i) dac ,u, astfel nct w = u unde , u , ( N ) ,
*

Relaia de derivare

ii) exist o descompunere = v , v (N ) i u v P .


*

Aceast relaie nu este neaprat reflexiv i tranzitiv.


Definiia 1.4. nchiderea reflexiv i tranzitiv a relaiei o notm cu

i o definim astfel:
Z 0 ,L, Z k (N )
*

w1 w2 dac

w1 = w2 sau

exist

k 1

astfel nct w1 = Z 0 Z 1 L Z k = w2 . nchiderea


+

tranzitiv o notm cu i se definete eliminnd din relaia w1 = w2 .

Derivarea n k pai o notm cu .

Definiia 1.5. Se numete limbaj generat de o gramatic mulimea:

L(G ) = w * S w}. Dou gramatici care genereaz acelai limbaj se generat de o


G

Limbaj gramatic

numesc echivalente.

Automate, limbaje i compilatoare

10

Impunnd anumite restricii produciilor unei gramatici, Chomsky a introdus trei tipuri de gramatici:

1. Gramatici dependente de context: orice producie (u v) P satisface


condiia u v (gramatici de tipul 1), unde x este lungimea lui x . 2. Gramatici independente de context (GIC): orice producie (u v) P satisface condiia u = 1 , u N , v (gramatici de tipul 2).
Clasificarea Chomsky

3. Gramatici regulate: orice producie (u v) P satisface condiia


u N , v * * N

,v

(gramatici de tipul 3); dac v N ,

gramatica se numete n form redus.

4. Gramatici care nu au nici un fel de restricii impuse asupra produciilor


(gramatici de tipul 0). Dac se noteaz cu L i , i { 0 , 1, 2 , 3} familia limbajelor generate de gramatica de tip i atunci L 3 L 2 L1 L 0 .
Teorema 1.1. Pentru orice gramatic de tip i { , 2, 3}, exist o 1

gramatic de acelai tip astfel nct simbolul iniial S s nu apar n membrul drept al nici unei producii.
Demonstraie. Fie G = ( N , , P, S ) o gramatica de tipul i { , 2, 3} i 1
S1 N . Considerm gramatica G1 = (N 1 , 1 , P1 , S1 ) unde N 1 = N {S1 } ,
1 = , P1 = P {S1 w / (S w) P} . Evident, cele dou gramatici sunt de

acelai

tip.

Fie

w L(G ) ;

atunci,

G,

exist

derivarea

S w1 L wk = w . Din (S w1 ) P rezult c exist (S1 w1 ) P1 ,


Cum P P1 , nseamn c toate derivrile wi wi +1 din G au loc i n G1 . Deci, n G1 exist derivarea S1 w , adic w L(G1 ) . Invers, fie w L(G1 ) . nseamn c n
*

(S

w1 ) P1 rezult c (S w1 ) P , de unde obinem c w1 nu conine pe

G1

are loc derivarea

S1 w1 L wk = w . Din

S1 ; deci, n gramatica G exist derivarea S w1 . Prin inducie dup i se arat

c niciun w nu conine pe S1 , deci toate derivrile wi wi +1 din G1 au loc i n


G . Deducem c n G

are loc derivarea S w1 L wk = w ; deci

w L(G ) .

Teorema 1.2. Dac L este un limbaj de tipul i { , 2, 3} atunci exist o 1

Automate, limbaje i compilatoare

11

gramatic G = ( N , , P, S ) care genereaz limbajul L { } astfel nct 1) simbolul iniial S nu apare n membrul drept al niciunei producii din G 2) n mulimea P exist producia S 3) gramatica G1 = ( N , , P1 , S ) , unde P1 = P \ {S } , este de tipul i { , 2, 3} 1 i genereaz limbajul L .
Demonstraie. Din teorema anterioar rezult existena gramaticii
G1 = ( N , , P1 , S ) de tipul i { , 2, 3}, care genereaz limbajul L iar simbolul 1

iniial S nu apare n membrul drept al niciunei producii din G1 . Adugnd mulimii P1 producia S rezult c L(G ) = L { }. Spunem c limbajul L peste alfabetul este recursiv daca exist un algoritm care pentru orice secven w * determin dac w L .
Teorema 1.3. Limbajele de tip 1 sunt recursive. Demonstraie. Se utilizeaz Algoritmul REC

Intrare: gramatica G = ( N , , P, S ) de tipul 1 i secvena w * de lungime l Ieire: mesajul DA dac w L(G ) i mesajul NU n caz contrar. Metoda:
P1. Dac l > 0 , mergi la P3. P2. Dac (S ) P atunci tiprete DA
Testarea recursivitii

altfel tiprete NU STOP.


P3. M 0 = {S }, i := 0 P4. M i +1 = M i ( N ) / l i M i cu
*

P5. Dac M i +1 M i atunci i := i + 1 i mergi la P4. P6. Dac w M i atunci tiprete DA

altfel tiprete NU STOP.

I.2. Automate finite


Un automat finit are dou componente principale: banda de intrare i unitatea central. Banda de intrare este infinit la dreapta i este mprit n

Automate, limbaje i compilatoare

12

celule, n fiecare putnd fi nscris un simbol din alfabetul de intrare . Unitatea central se poate afla ntr-un numr finit de stri. n funcie de starea curent i de simbolul citit de pe banda de intrare ea i poate schimba starea.
Definiia 2.1. Se numete automat finit un sistem A = (Q, , , q0 , F )

unde : - Q este mulimea strilor automatului - este alfabetul de intrare - : Q P( Q) este funcia de tranziie - q0 este starea iniial - F este mulimea strilor finale.
Funcionarea automatului se descrie cu ajutorul configuraiilor.
Definiia 2.2. O configuraie a automatului este o pereche (q, ) unde q

Definiia automatului finit.

Configuraie

este starea curent iar este secvena de pe banda de intrare, rmas de citit. Configuraia iniial este (q0 , w) iar configuraia final (q, ) , unde q F .
Funcionarea automatului se realizeaz prin pai. Un pas reprezint trecerea de la o configuraie la alta: (q, a ) cu , ,

( p, ) dac p (q, a ) . Notm


Limbaj acceptat de un automat finit

nchiderea tranzitiv , nchiderea reflexiv i tranzitiv i

respectiv trecerea n i pai.


Definiia 2.3. Limbajul acceptat de un automatul finit A este mulimea
L( A) = {w * (q0 , w)
( p, ), p F } .

Descrierea i funcionarea unui automat finit A = (Q, , , q0 , F ) pot fi urmrite mai uor dac i se asociaz un graf G , astfel: - mulimea vrfurilor lui G este mulimea Q a strilor - dac p, q Q , a i q ( p, a ) atunci se traseaz un arc de la vrful p la vrful q , care va fi etichetat cu a - fiecare stare va fi scris ntr-un cerc - starea iniial va fi precedat de iar strile finale vor fi scrise ntr-un cerc dublu. Un exemplu de astfel de reprezentare este graful din figura 2.1

Automate, limbaje i compilatoare

13

q0

q1

qf

Figura 2.1
Definiia 2.4. Automatul finit A = (Q, , , q0 , F ) se numete - determinist, dac ( q , a ) 1, q Q , a - complet determinist, dac ( q , a ) = 1, - nedeterminist, n caz contrar.
q Q , a

Este clar c este mult mai convenabil s se lucreze cu automate finite complet deterministe. De aceea urmtoarea teorem este foarte important din punct de vedere practic.
Teorema 2.1. Pentru orice automat finit nedeterminist A = (Q, , , q0 , F )

exist un automat finit complet determinist A' astfel nct L(A) = L( A' ) .
Demonstraie. Construim automatul A' astfel A' = (Q' , , ' , q' 0 , F ' ) : -

Q' = P( Q) q' 0 = {q 0 }
F ' = {S Q / S F }
Construirea automatului finit complet determinist

- ': Q' Q' , ' ( X , a ) = q Q / q U ( p, a ) p X Este evident c automatul A' este complet determinist. Prin inducie dup i se arat c

( X , w)

(Y , ) Y = {q Q / p X , ( p, w)
x L( A' ) ({q 0 }, x )

(q, ) }

unde i = w . Folosind aceast echivalen, pentru x * , x = i , rezult

(Y , )

i Y F '

q Y F i (q 0 , x )
deci L( A) = L( A' ) .

(q, ) x L( A) ,

Automate, limbaje i compilatoare

14

Este de dorit ca un automat finit s aib o structur ct mai simpl; o prim posibilitate const n eliminarea strilor inaccesibile.
Definiia 2.5. Fie A = (Q, , , q0 , F ) un automat finit i q Q . Spunem

c starea q este accesibil dac exist x * astfel nct (q 0 , x ) Altfel, starea q se numete inaccesibil. Determinarea strilor accesibile se face cu urmtorul algoritm
Algoritmul ACC

(q, ) .

Stare accesibil

Intrare: automatul finit A = (Q, , , q0 , F ) Ieire: mulimea Qa a strilor accesibile ale automatului A Metoda:
P1. Q0 = {q 0 }, i := 0 P2. Qi +1 = Qi {p Q / q Qi i a cu p (q , a )} P3. Dac Qi +1 Qi atunci i := i + 1 i mergi la P2. P4. Qa = Qi , STOP. Teorema 2.2. Fiind dat automatul A = (Q, , , q 0 , F ) , exist un

automat

Aa = (Qa , , a , q0 , Fa )

care

are

toate

strile

accesibile

L( A) = L( Aa ) .
Demonstraie. Componentele automatului Aa se obin astfel: -

Qa se calculeaz cu algoritmul ACC Fa = F Qa Eliminarea strilor inaccesibile se poate face pentru orice automat finit

- a : Qa P( Qa ) este restricia funciei -

(determinist sau nu). n continuare vom presupune ca automatele finite cu care lucrm sunt complet deterministe si au numai stri accesibile.
Definiia 2.6. Fie A = (Q, , , q 0 , F ) un automat finit, q1 , q 2 Q i

x * . Spunem c secvena x distinge strile q1 i q 2 dac (q1 , x )

( p1 , ) ,

(q 2 , x )

( p 2 , ) i exact una din strile

p1 i p 2 este stare final.

Automate, limbaje i compilatoare

15

Definiia 2.7. Spunem c strile q1 i q 2 sunt k -echivalente i notm

q1 q 2 dac nu exist nicio secven x , cu x k , care s disting q1 i q 2 . Strile q1 i q 2 se numesc echivalente i se noteaz q1 q 2 dac sunt k echivalente pentru orice numr natural k .
k

Stri echivalente

Este evident c i sunt relaii de echivalen. Secvena vid distinge strile q1 i q 2 dac i numai dac exact una dintre ele este stare final. Deci, dou stri sunt 0-echivalente dac i numai dac sunt ambele finale sau niciuna nu este final. De asemenea, din q1 q 2 rezult q1 q 2 .
Teorema 2.3. Fie
q1 k
k
k +1 k

q2

dou stri ale automatului finit numr natural. Atunci

A = (Q, , , q0 , F )
k +1

un

q1 q 2 a , (q1 , a ) (q 2 , a ) .

Demonstraie. Fie q1 q 2 ; presupunem c a astfel nct starea

k +1

p1 = (q1 , a ) nu este k -echivalent cu starea p 2 = (q 2 , a ) . nseamn c exist

x *

cu

x k

care distinge

p1

p 2 , adic

( p1 , x )

( p'1 , ) ,

( p2 , x)

( p' 2 , )

i p '1 F , p ' 2 Q \ F (sau invers). Pentru secvena ax , cu

ax = x + 1 k + 1 , avem

(q1 , ax ) (q 2 , ax )

( p1 , x ) ( p2 , x)

( p'1 , ) ( p' 2 , ) .
k +1

Rezult c strile q1 i q 2 nu sunt n relaia , care este o contradicie; deci presupunerea fcut este fals. Implicaia reciproc se demonstreaz n mod analog.
Definiia 2.8. Automatul finit A este redus dac toate strile sunt

accesibile i nu are stri distincte echivalente.


Teorema 2.4.

Pentru

orice

automat

finit

complet

determinist

A = (Q, , , q0 , F ) exist un automat finit redus A' astfel nct L( A) = L( A' ) .


Demonstraie. Presupunem c automatul A are toate strile accesibile.

Automatul redus se construiete cu algoritmul urmtor.

Automate, limbaje i compilatoare

16

Algoritmul RED

Intrare: automatul finit complet determinist A = (Q, , , q 0 , F ) cu Q = Qa . Ieire: automatul finit redus A' astfel nct L( A) = L( A' ) Metoda:
P1. Q' = Q / = {[q ] / q Q} P2. F ' = {[q ] / q F } P3. ': Q' Q' , ' ([q ] , a ) = [ (q , a )], [q ] Q' , a P4. A' = (Q' , , ' , [q 0 ], F ')
Construirea automatului redus

Pornind de la Q
1 2

= {F , Q F } i utiliznd teorema anterioar se construiesc


k k +1 k

relaiile , , , = i se ia = ; n acest moment se termin pasul P1. Folosind definiia lui ' rezult uor c automatul A' este redus. S artm c cele dou automate sunt echivalente. Fie x * . Dac x L( A) atunci

(q0 , x )
Rezult

(q, ) n

A i q F . A' i [q ] F ' ;

([q0 ] , x )
deci x L( A' ) . Dac x L( A) atunci

([q ] , ) n

(q0 , x )
Rezult

(q, ) n
([q ] , ) n

A i q F . A' i [q ] F ' ,

([q0 ], x )

adic x L( A' ) ; deci, x L(A' ) implic x L( A) .

I.3. Relaia dintre automate finite i limbaje regulate


Vom arta c familia limbajelor regulate coincide cu cea a limbajelor acceptate de automate finite.
Teorema 3.1. Pentru orice automat finit A exist o gramatic regulat
G astfel nct L( A) = L(G ) .

Demonstraie. Fie automatul A = (Q, , , q0 , F ) ; considerm gramatica

Automate, limbaje i compilatoare

17

G = (Q, , P, q 0 ) , unde produciile P sunt de forma 1) dac p, q Q, a i q ( p, a ) atunci ( p aq ) P 2) dac q F atunci (q ) P Este evident c gramatica este regulat, n forma redus. Fie w = a1 a 2 L a n L( A) ;atunci

(q0 , w) = (q0 , a1 a 2 L a n ) (q1 , a 2 L a n ) ... (q n1 , a n ) (q n , ) 1 cu q n F . Din qi (qi 1 , ai ) rezult c qi 1 ai qi pentru i { ,2, L , n} din q n F rezult c (q n ) P . Deci, n G, au loc derivrile
q 0 a1 q1 a1 a 2 q 2 L a1 L a n q n a1 L a n = w

iar

Deci w L(G ) i L( A) L(G ) . Relund demonstraia n sens invers, rezult c L(G ) L( A) , adic L( A) = L(G ) .
Teorema 3.2. Orice limbaj regulat este acceptat de un automat finit

determinist.
Demonstraie. Fie G = ( N ,, P, S ) o gramatic regulat n form redus.

Fie X N i definim automatul nedeterminist AN = ( N {X }, , , {S }, F )


{A N ( Y xA ) P } {X } (Y , x ) = {A N ( Y xA ) P } dac Y X , ( Y x ) P dac Y X ,( Y x ) P dac Y = X
Relaia dintre automate finite i gramatici regulate

{S , X } F = { X }

dac

( S ) P

n caz contrar

Fie w L(G ) , w , w = x1 x 2 L x n ; rezult c S x1 A1 x1 x 2 A2 L x1 L x n 1 An 1 x1 L x n . Considerm strile s1 = S , s 2 = A1 , L , s n = An 1 , s n +1 = X . Avem


s 2 = A1 (S , x1 ) = (s1 , x1 )

................................................... s n = An 1 ( An 2 , x n 1 ) = (s n 1 , x n 1 ) s n +1 = X ( An 1 , x n ) = (s n , x n ) . Cum s1 S i s n +1 F , rezult c w L( A) . Fie w = x1 L x n L( A) , n 1 (deci w ). Rezult c exist strile


s1 {S } = S , s 2 (s1 , x1 ) , ...., s n +1 (s n , x n ) F .

Exist produciile

Automate, limbaje i compilatoare

18

S = s1 x1 s 2 = x1 A1

.................................. s n (s n 1 , x n 1 ) deci s n 1 x n 1 s n , adic An 2 x n 1 An 1 ; s n +1 F deci s n +1 = S sau s n +1 = X . Dac s n +1 = S atunci s n x n S ; dar S nu apare n membrul drept al produciilor, deci s n +1 = X . Din X (s n , x n ) = ( An 1 , x n ) rezult An 1 x n . Am obinut S x1 A1 x1 x 2 A2 L x1 L x n 1 An 1 x1 L x n , deci w L( G ) . Dac

(S ) P , F = {S , X }, {S } F L( A ) . Invers, dac L( A ) atunci (S ) P , w = L( G ) .


w = L( G ) atunci

deci

Acest automat finit nedeterminist poate fi transformat, conform Teoremei 2.1, ntr-un automat finit determinist care accept acelai limbaj.

Automate, limbaje i compilatoare

19

Teme Curs

Teste Autoevaluare 1. Fie gramatica G = ({S }, { x, y}, {S xy, S xSy}, S ) . Precizai forma

elementelor care aparin lui avem L(G ) . ....... 2 puncte


2. Considerm gramatica G cu produciile:

S AB B aB/CB Aa bC/CaB CB Ac/bAc bA ba/AAB a) De ce tip este gramatica 0.5 puncte b) Folosind algoritmul REC, precizai dac w=bac aparine sau nu lui
3. Considerm automatul A = ({q 0 , q1 , q f }, {a, b}, q 0 , {q f }) cu
L(G ) ................................................................. 4 puncte

(q 0 , a ) = {q1 } , (q 0 , b) = {q0 } , (q1 , a) = {q f },


(q1 , b) = {q 0 } , (q f , a) = {q f }, (q f , a) = {q f }.
Verificai c w = abaab aparine lui L( A) . .....1.5 puncte
4. Ce relaie exist ntre q1 q 2 i q1 q 2 ? ... 0.5 puncte 5. Ce relaie exist ntre automatele finite si limbajele regulate?.....0.5 puncte 6. Oficiu.............................. 1 punct
k +1 k

Automate, limbaje i compilatoare

20

Rspunsuri 1. L(G ) = x n y n / n = 1, 2, ... . 2. a) gramatica este de tipul 1

b) Aplicnd Algoritmul REC, obinem succesiv:

P1. mergi la P3 P3 . L0 := {S}, i:=0 P4. L1=L0 {AB} P5. i=1, mergi la P4 P4. L2= L1 {AaB,ACB} P5. i=2, mergi la P4 P4. L3= L2 {bCB,AAc} P5. i=3, mergi la P4 P4. L4= L3 {bAc} P5. i=4, mergi la P4 P4. L5= L4 {bac} P5. i=5, mergi la P4 P4. L6=L5 P5. P6. DA
Stop Rspuns: 3. Avem wL(G).

(q0 , abaab)
k +1

(q0 , aab )
k

(q1 , ab )

(q , b)
f

(q

,)

deci abaab L( A) .
4. q1 q 2 implic q1 q 2 5. Un limbaj este reprezentabil ntr-un automat finit dac i numai dac el

este regulat.

Rezumat: s-au definit noiunile de gramatic, limbaj generat de o gramatic,

automat finit, limbaj acceptat de un automat finit, relaia dintre automate finite i gramatici, minimizarea automatelor finite.

Automate, limbaje i compilatoare

21

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar
Se vor implementa algoritmi care realizeaz: verificarea apartenenei unui cuvnt la limbajul generat de o gramatic, determinarea strilor accesibile n vederea simplificarii structurii automatului, funcionarea unui automat finit.
Teme Laborator/Seminar

1. Scriei un program care s implementeze algoritmul REC. 2. Scriei un program care s determine strile accesibile ale unui automat finit. 3. Scriei un program care s simuleze funcionarea unui automat finit.
Rezumat: Implementarea unor algoritmi care s aprofundeze lucrul cu

gramatici i automate finite

Automate, limbaje i compilatoare

22

Notaii

Automate, limbaje i compilatoare

23

Automate, limbaje i compilatoare

24

Curs 2 Limbaje independente de context


Descriere General

Curs 2 Durata:

2 ore

Se studiaz proprieti de derivare n gramaticile independente de context, arbori de derivare (la stnga sau la dreapta) simplificare a acestor gramatici.
Obiective - cunoaterea unor proprieti cu privire la derivare

i mai muli algoritmi de

nelegerea diferenei dintre derivarea la stnga i cea la dreapta i a - cunoaterea principalilor algoritmi de simplificare a formei gramaticilor

semnificaiei arborelui de derivare independente de context

Cuprins

I.4. Generaliti referitoare la gramaticile independente de context I.5. Simplificri ale gramaticilor independente de context I.5.1 Eliminarea -produciilor I.5.2. Eliminarea redenumirilor I.5.3. Eliminarea simbolurilor inutilizabile

Coninut Curs

I.4. Generaliti referitoare la gramaticile independente de context


Gramaticile independente de context sunt folosite n descrierea

structurii sintactice a limbajelor de programare, gramaticile regulate neputnd s acopere gama tuturor construciilor sintactice admise de diverse limbaje de programare. Vom pune n eviden cteva proprieti importante ale acestor gramatici.
Teorema 4.1. Fie G = ( N , , P , S ) o gramatic independent de context.

Dac

Automate, limbaje i compilatoare

25

1 2 L n

atunci
= 1 2 L n i i i , i { , 2 , L , n} 1

Proprietate de derivare

iar produciile folosite n cele dou derivaii sunt aceleai.


Demonstraie. Se procedeaz prin inducie dup lungimea k a derivaiei.

Pentru k = 1 nseamn c exist i = ' A" i producia A ; deci se ia

i = ' " i j = j pentru j i . Presupunem afirmaia adevarat pentru


derivaii de lungime k i considerm una de lungime k + 1 :
1 2 L n .
k +1

Ultima derivaie se scrie


1 2 L n .
k

Conform ipotezei de inducie

= 1 L n i i i , i { , 2 , L , n} ; 1
n plus, derivaiile din
1 2 L n
k

sunt aceleai cu cele din


i i , i { , 2 , L , n} . 1

Din
1 2 L n ,

conform cazului k = 1 , rezult

= 1 2 L n i i i , i { , 2 , L , n} 1
iar produciile folosite n aceste derivaii sunt aceleai cu cele din 1 2 L n . n final rezult concluzia din teorem.
Definiia 4.1. Un arbore orientat i ordonat este un graf orientat cu

proprietile: 1) Exist un vrf r , numit rdcin, care nu are predecesori 2) Fiecare vrf diferit de rdcin are exact un predecesor 3) Exist un drum de la r la fiecare vrf diferit de rdcin 4) Pe mulimea succesorilor fiecrui vrf este definit o relaie de ordine total. Automate, limbaje i compilatoare
26
Arbore generator (de derivare)

Definitia 4.2. Un arbore generator n gramatica independent de context

G = ( N , , P , S ) este un arbore T orientat i ordonat, cu proprietile: 1) etichetele nodurilor aparin mulimii N {} 2) eticheta oricrui nod interior este un neterminal al gramaticii 3) dac n este nod interior cu eticheta A iar descendenii lui, n ordine de la stnga la dreapta, sunt n1 , n2 , L , nk i au respectiv, A1 , A2 , L , Ak atunci ( A A1 A2 L Ak ) P 4) dac un nod are eticheta atunci el este unicul descendent al printelui su.
Dac n definiia anterioar rdacina este etichetat cu A atunci T se va numi A -arbore. Un arbore generator se mai numete arbore de derivare. O importan deosebit au S -arborii care au nodurile terminale etichetate cu elemente din mulimea {} .
Teorema 4.2. n gramatica independent de context G = ( N , , P , S )
Relaia dintre derivare i

etichetele, arbore

exist derivarea A dac i numai dac exist un A -arbore care produce pe


.

Demonstraie. Se utilizeaz inducia dup lungimea derivaiei si respectiv

dup numrul nodurilor interioare i se ine seama de definiia arborelui generator. Se lucreaz cu derivaii la stnga sau la dreapta. Spunem c deriveaz la stnga (dreapta) n dac de fiecare dat neterminalul care deriveaz este cel mai din stnga (dreapta). Unei derivaii i se asociaz un arbore generator; totui, este posibil ca o derivaie s aib mai muli arbori generatori.
Definiia 4.3. O gramatic independent de context G este neambigu

dac orice secven w L( G ) admite o singur derivaie la stnga (deci un singur arbore generator); n caz contrar gramatica este ambigu.

Gramaticile independente de context utilizate pentru a defini sintaxa limbajelor

Automate, limbaje i compilatoare

27

de programare trebuie s fie neambigue.

I.5. Simplificri ale gramaticilor independente de context


Se urmrete modificarea formei produciilor gramaticii astfel

nct s se elimine elementele redundante sau inutile sau s se obin forme care avantajeaz algoritmii de analiz sintactic.
I.5.1 Eliminarea -produciilor

producie

este

producie

de

forma

A.

Prezena

produciilor poate duce la derivaii de lungime mare sau poate mpiedica

folosirea unor algoritmi de analiz sintactic. Dac limbajul generat de gramatic conine cuvntul vid, va fi pstrat doar producia S .
Definiia 5.1. Fie G = ( N , , P , S ) o gramatic independent de context.

Simbolul A N este anulabil dac exist o derivaie de forma A .

Simbolurile anulabile se determin cu


Algoritmul ANL

Intrare: gramatica G = (N , , P , S ) independent de context Ieire: mulimea N anl a simbolurilor anulabile Metoda:
P1. M 0 = {A N / ( A ) P}, i := 0 P2. M i +1 = M i A N / M i astfel nct ( A ) P P3. Dac M i +1 M i atunci i := i + 1 i mergi la P2. P4. N anl = M i , STOP. Teorema 5.1. Pentru orice gramatic independent de context

G = ( N , , P , S ) exist o gramatic independent de context G' astfel nct


L( G' ) = L( G ) {}.

Demonstraie. Folosind algoritmul ANL se determin mulimea N anl a

simbolurilor anulabile. Fie

(A ) P,

, = 1 A1 2 L k Ak k +1 .

Automate, limbaje i compilatoare

28

Se nlocuiete fiecare producie A 1 A1 2 L k Ak k +1 cu producii de forma

A 1 X 1 2 L k X k k +1
unde

X i {Ai , } dac Ai N anl


i

Eliminarea simbolurilor anulabile

X i = Ai n caz contrar.
obinut, gramatica G' este G' = (N anl , , P' , S ) . Apoi, se elimin din P toate produciile. Notnd cu P' mulimea astfel

Ca o consecin, rezult urmtoarea teorem, care a mai fost discutat anterior.


Teorema 5.2. Pentru orice gramatic independent de context G exist

o gramatic independent de context G' ' echivalent cu G i care nu conine


producii, exceptnd eventual pe S ' ( S ' fiind simbolul iniial al

gramaticii G' ' ), caz n care S ' nu apare n membrul drept al niciunei producii din G' ' .
Demonstraie. Fie G' gramatica construit n teorema anterioar. Dac
L(G )

atunci

se

ia

G" = G' .

Dac

L(G )

atunci

se

ia

G" = ( N {S ' }, , S ' , P' {S ' S / }) .

I.5.2. Eliminarea redenumirilor

O redenumire (sau producie singular) a unei gramatici independente de context este o producie de forma A B .
Teorema 5.3. Pentru orice gramatic independent de context fr
producii exist o alt gramatic de acelai tip i fr redenumiri,

echivalent cu ea.
Demonstraie. Fie G = ( N , , P , S ) gramatica iniial, astfel nct S nu

apare n membrul doi al nici unei producii. Pentru fiecare A N definim


+ mulimea V ( A ) = B N / A B . Deoarece G nu are producii, toi G

termenii derivrii A B1 L Bk = B au lungimea egal cu 1. Presupunnd c simbolurile B1 , L , Bk sunt distincte, rezult c derivaia A B este de

Automate, limbaje i compilatoare

29

lungime mai mic dect N ; deci, mulimile V ( A ) se pot calcula printr-un proces iterativ n cel mult N 1 pai. Construim mulimea de producii P' n Algoritmul de felul urmtor: 1) eliminm din P toate redenumirile 2) fie (B ) P o producie singular; adugm la P' toate produciile de forma A pentru B V ( A ) . n final lum G' = ( N , , P' , S ) , care este independent de context i fr redenumiri. Este evident c L(G ' ) L(G ) , iar incluziunea invers se demonstreaz uor. Acum se poate demonstra echivalena gramaticilor regulate cu cele n forma redus.
Teorema 5.4. Pentru orice gramatic de tipul 3, G = ( N , , P , S ) , exist o
eliminare a redenumirilor

gramatic de acelai tip G1 = ( N1 ,1 , P1 , S1 ) echivalent cu G i avnd proprietatea c orice producie u v satisface condiia v 1 1 N1 ; o astfel de gramatic se numete n form redus.
Demonstraie.

Conform

teoremei

anterioare

exist

gramatic

G' = ( N , , P' , S ) de acelai tip cu G , echivalent cu ea i fr redenumiri.

Produciile gramaticii G' fiind de forma u v cu v * * N , pentru fiecare producie de forma


X a1 ...a nY , cu a1 ,...,an , X ,Y N i n 2 ,

introducem variabilele A1 , ..., An 1 , distincte i verificnd condiia Ai N pentru orice i { , 2 , ..., n 1} . Adugm mulimii N aceste variabile, iar n P' 1 n locul produciei
X a1 ...a nY

introducem produciile
X a1 A1 , A1 a 2 A2 , .., An 1 a nY .

Echivalarea gramaticilor regulate cu cele n form redus

Procednd astfel pentru toate produciile i apoi i pentru cele de forma


X a1 ...an cu a1 ,...,an , X N i n 2 ,

n acest caz avnd An 1 a n n loc de An1 a nY , obinem o mulime de neterminale N1 i o mulime de producii P1 . Gramatica G1 = ( N1 ,1 , P1 , S1 = S ) este de acelai tip cu G' , deci i cu G .

Automate, limbaje i compilatoare

30

I.5.3. Eliminarea simbolurilor inutilizabile Definiia 5.2. Fie G = ( N , , P , S ) o gramatic independent de context.

Simbolul X N se numete utilizabil dac exist o derivaie de forma


S X w ; altfel X este inutilizabil.

Calitatea de simbol utilizabil poate fi verificat n dou etape, conform definiiilor urmtoare.
Definiia 5.3. Fie G = ( N , , P , S ) o gramatic independent de context.

Simbolul A N se numete productiv dac exist o derivaie de forma A w ; altfel simbolul se numete neproductiv.
Definiia 5.4. Fie G = ( N , , P , S ) o gramatic independent de context.

Simbolul X N se numete accesibil dac exist o derivaie de forma


S X ; altfel simbolul se numete inaccesibil.

Teorema 5.5. Fie G = ( N , , P , S ) o gramatic independent de context.

Exist o gramatic G' independent de context i echivalent cu G , care are toate simbolurile neterminale (exceptnd eventual S ) productive.
Demonstraie. Simbolurile productive se determin cu Algoritmul PROD

Intrare: gramatica G = (N , , P , S ) independent de context Ieire: mulimea N prod a simbolurilor productive Metoda:
P1. M 0 = A N / x , astfel nct ( A x ) P , i := 0 P2. M i +1 = M i A N / (M i ) astfel nct ( A ) P P3. Dac M i +1 M i atunci i := i + 1 i mergi la P2. P4. N
prod

}
Algoritm de determinare a simbolurilor productive

Fie G' = (N prod S , , P' , S ) , unde mulimea P' conine produciile din P formate numai cu simboluri din din N
prod

= M i , STOP.

{S } .

Automate, limbaje i compilatoare

31

Din P' P rezult L(G ' ) L(G ) . Apoi, deoarece orice derivaie S w
G

folosete numai producii din P' , rezult L(G ) L(G' ) si deci L(G ) = L(G' ) .
Consecina 5.1. Dac G = ( N , , P , S ) este o gramatic independent de

context atunci L(G ) dac i numai dac S este simbol productiv.

Deoarece exist un algoritm pentru determinarea simbolurilor productive, nseamn c problema mulimii vide pentru limbaje independente de context este rezolvabil algoritmic.
Teorema 5.6. Pentru orice gramatic independent de context G exist

o gramatic independent de context G" , cu toate simbolurile accesibile i echivalent cu G .


Demonstraie. Mulimea simbolurilor accesibile se determin cu Algoritmul ACS

Intrare: gramatica G = (N , , P , S ) independent de context Ieire: mulimea N acs a simbolurilor accesibile Metoda:
P1. M 0 = {S }, i := 0 P2. M i +1 = M i {X N / A M i N astfel nct ( A X ) P} P3. Dac M i +1 M i atunci i := i + 1 i mergi la P2. P4. N
acs

Algoritm de determinare a simbolurilor

= M i , STOP.

Gramatica G" este G " = N N acs , N acs , P" , S , unde P " conine toate produciile din P formate numai cu simboluri accesibile.
Teorema 5.7. Fie G = (N , , P , S ) o gramatic independent de context

accesibile

cu L(G ) . Atunci exist o gramatic G1 independent de context i fr simboluri inutilizabile echivalent cu G .


Demonstraie. Fie G' = ( N' , , P' , S ) gramatica echivalent cu G , care nu

conine simboluri neproductive i G " = (N" , " , P" , S ) gramatica echivalent cu


G' i care are toate simbolurile accesibile. Rezult c L(G ) = L(G ' ) = L(G " ) i

rmne de artat c G" are toate simbolurile utilizabile. Deoarece orice A N"

Automate, limbaje i compilatoare

32

este accesibil pentru G" , exist derivaia S A . Cum toate simbolurile din
G"

secvena A sunt productive pentru gramatica G' , nseamn c exist derivaia

A w . Toate simbolurile din ultimele dou derivaii sunt accesibile


G'

pentru G" i S A w ; deci simbolul A este utilizabil n G" .


G" G"

Automate, limbaje i compilatoare

33

Teme Curs Teste Autoevaluare 1. Fie gramatica cu produciile


S AB
A aAb /

B Bc /

Construii un S-arbore de derivare asociat............................. 1 punct .


2. Considerm gramatica cu produciile
E E +T / T T T* F / F

F ( E )/ a

i secvena w = a (a + a ) . Construii o derivare la stnga pentru w ............................... 1 punct


3. Fie gramatica G = ( N , , P , S ) cu produciile
S SaSb / SbSa / .

Precizai dac gramatica este sau nu ambigu. Justificai rspunsul. .1 punct


4. Fie gramatica cu produciile

S aSb | aA | b , A bA , B bS | b | c

Care este mulimea simbolurilor productive? .... 2 puncte


5. Care sunt simbolurile accesibile ale gramaticii anterioare?......... 2 puncte 6. Fie gramatica cu produciile

S aAB | AC A bA | CC B SB | b C aCb | Determinai mulimea simbolurilor anulabile..2 puncte


7. Oficiu1 punct

Automate, limbaje i compilatoare

34

Rspunsuri

1. Un exemplu de S-arbore este cel din figura urmtoare

S r

n1 A
n3
a

n2

n4
A

n5
b

n6

. 2. O derivaie la stnga a lui w este


E T T F F F a F a (E ) a (E + T ) a (T + T ) a (F + T ) a (a + T ) a (a + F ) a (a + a )

3. Gramatica este ambigu. Secvena w abab L(G ) admite doi arbori generator diferii

4. M0={S,B}, M1=M0, N Pr od ={S,B} 5. M0={S}, M1={S,a,b}, M2=M1, N acs ={S,a,b} 6. M0 = {C}, M1 ={C,A}, M2 ={C,A,S}, M3 =M2. Prin urmare N anl = {S,A,C}
Rezumat: S-a descris relaia dintre derivare i arborele generator asociat i

s-au studiat algoritmi de simplificare a gramaticilor independente de context

Automate, limbaje i compilatoare

35

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar

Se urmrete echivalarea unei gramatici independente de context cu una care a fost simplificat.
Teme Laborator/Seminar 1. Scriei un program care s echivaleze o gramatic independent de

context cu una fr simboluri productive.


2. Scriei un program care s echivaleze o gramatic independent de

context cu una care are toate simbolurile accesibile.


3. Scriei un program care s echivaleze o gramatic independent de

context cu una fr producii vide.


4. Scriei un program care s echivaleze o gramatic independent de

context cu una care are toate simbolurile utilizabile.

Rezumat: Aplicaiile urmresc trecerea de la o gramatic independent de

context la una n form mai simpl; se poate simplifica n cascad, la fiecare pas simplificnd gramatica de la pasul anterior.

Automate, limbaje i compilatoare

36

Notaii

Automate, limbaje i compilatoare

37

Automate, limbaje i compilatoare

38

Curs 3 Automate pushdown i gramatici independente de

Curs 3 Durata:

context
Descriere General

2 ore

Se definesc noiunile de automat pushdown, configuraie, limbaj acceptat. Se demonstreaz echivalena dintre limbajul acceptat cu memoria vid i cel acceptat dup criteriul strii finale. Se demonstreaz echivalena limbajului acceptat de un automat pushdown cu cel generat de o gramatic independent de context
Obiective

- cunoaterea structurii i a modului de funcionare a unui automat pushdown - stabilirea relaiei dintre automate pushdown i gramatici independente de context

Cuprins

I.6. Funcionarea automatelor i relaia cu limbajele independente de context

Coninut Curs

I.6. Funcionarea automatelor i relaia cu limbajele independente de context


Automatele pushdown sunt mecanisme de recunoatere a limbajelor independente de context. Numele este dat de organizarea memoriei auxiliare sub form de stiv.
Definiia 6.1.

Se

numete

automat

pushdown

un

sistem

P = ( Q , , , , q 0 , Z 0 , F ) unde: - Q este mulimea strilor automatului - este alfabetul de intrare - este alfabetul intern (pushdown) - : Q ( {}) Pf Q *

este

funcia de tranziie, unde Pf

este

Automate, limbaje i compilatoare

39

mulimea prilor finite. - q0 Q este starea iniial - Z 0 este simbolul intern iniial - F Q este mulimea strilor finale.
Definiia 6.2. Funcionarea automatului este dictat de funcia de

tranziie i se definete cu ajutorul configuraiei ( q , w, ) , q Q , w * , * . Configuraia iniial este ( q0 , w, Z 0 ) .

Trecerea

de

la

configuraie

la

alta

se

face

prin ,

pai: ,

( q ,aw, Z )

( q1 , w, ) dac ( q1 , ) ( q , a , Z ) . Notm cu

nchiderea tranzitiv , nchiderea reflexiv i tranzitiv i respectiv trecerea n i pai.


Definiia 6.3. Limbajul acceptat de automatul pushdown P dup criteriul Limbaj
( p , , ) }.
acceptat

benzii vide este: L( P ) = {w * ( q 0 , w, Z 0 ) este: L( P ) = w * ( q0 , w, Z 0 )

Limbajul acceptat de automatul pushdown P dup criteriul strrii finale

( p , , ), p F }.

Teorema 6.1. Fie L un limbaj independent de context. Atunci exist un

automat pushdown M astfel nct L = L ( M ) .


Demonstraie. Fie G = ( N , , P , S )
M = (q , , N , , q , S , ) unde:

astfel nct L = L( G ) . Construim


Construirea unui automat pushdown cu memoria vid care accept un limbaj

t1) (q , , A) = {(q , ) ( A ) P} t2) (q , a , a ) = {(q , )} a . t3) (q , b , Z ) = n toate celelalte cazuri. Tranziiile t1) produc pe banda pushdown derivaii la stnga din gramatica G iar

tranziiile t2) permit trecerea la simbolul urmtor, pe benzile de intrare si independent de pushdown, n cazul coincidenei dintre simbolurile citite de pe cele dou benzi. context Fie A N i w ; trebuie stabilit echivalena (1)
A w (q , w, A)

(q ,, )

Demonstraia de la stnga la dreapta se face prin inducie dup lungimea k a

Automate, limbaje i compilatoare

40

derivaiei. Pentru k = 1 , A w nseamn ( A w) P i w = a1 a 2 L a p . Folosind t1) rezult

(q , w) (q , , A) ,
deci

(q , w, A)
1

(q , w, w) = (q , a1 L a p , a1 L a p ) .
p

Folosind p tranziii de tipul t2 rezult

(q , a L a

, a1 L a p )

(q ,, ) ,

deci

(q , w, A)
dect k i fie A w . nseamn c
k

(q ,, ) .

Presupunem implicaia adevrat pentru derivaii de lungime mai mic

A = 1 A1 2 L r Ar r +1 w , unde i , Ai N

Rezult descompunerea
w = 1 w1 2 L r wr r +1 cu Ai wi , i { , 2 , L , r} i k1 + k 2 + L + k r = k 1 . 1
ki

Conform ipotezei de inducie, (2)

(q , wi , Ai )

(q ,, ) ,

i { , 2, L , r} 1

Folosind t1), t2) i (2) rezult

(q , w, A)

(q , w, ) = (q ,1 w1 2 L wr r +1 ,1 A1 2 L Ar r +1 ) (q , w1 2 L wr r +1 , A1 2 L Ar r +1 ) (q , 2 L wr r +1 , 2 L Ar r +1 ) (q , r +1 , r +1 ) (q ,, )

Implicaia invers se demonstreaz prin inducie dup numrul de pai din

(q , w, A)

(q ,, ) . Dac (q , w, A) (q ,, ) ,
w = i A w .

se aplic t1; deci

( A ) P ,
(3)

Presupunem implicaia adevrat pentru un numr de pai mai mic dect k i fie

(q , w, A)

(q ,, ) n k

pai

La primul pas din (3) se folosete t1. Aceast trecere se descompune n

(q , w, A)

(q , w, ) = (q , w,1 A1 2 L Ar r +1 )

(q ,, )

unde ultima trecere are loc n k 1 pai i

(A =

A1 2 L Ar r +1 P .

Automate, limbaje i compilatoare

41

Rezult w = 1 z1 i (4)

(q , z ,
1 1

A1 2 L Ar r +1

(q , z1 , A1 2 L Ar r +1 )

(q ,, ) .

Fie w1 prefixul lui z1 care se consum de pe banda de intrare pn cnd coninutul benzii pushdown devine pentru prima dat mai mic dect
A1 2 L Ar r +1 ; deci

(5)

z1 = w1 y1 , (q , w1 , A1 )

(q ,, ) n

k1 k 1 pai i A1 w1

Din (4) i (5) rezult

(q , y1 , 2 L Ar r +1 )
Repetnd raionamentul se obine
w = 1 w1 2 L r wr r +1 ,

(q ,, ) .
n k i k 1 pai i conform

(q , wi , Ai )

(q ,, )

ipotezei de inducie Ai wi . n final, Lund A = S n (1), rezult w L(G ) L (M ) .


A = 1 A1 L r Ar r +1 1 w1 L r wr r +1 = w .

Teorema 6.2. Pentru orice automat pushdown M , L (M ) este limbaj

independent de context.
Demonstraie.

Fie

M = (Q , , , , q 0 , Z 0 , ) .

Construim

G = ( N , , P , S ) astfel
N = {[ p , X , q ] / p , q Q , x } {S } , S ( N ) fiind simbol nou iar produciile sunt de forma

1. S q0 , Z 0 , q pentru orice q Q 2. Dac (q , X 1 L X r ) ( p , a , Z ) i r > 0 atunci pentru orice p1 ,L , p r Q

Limbajul acceptat cu memoria pushdown vid este independent de context

[ p , Z , pr ] a[q , X 1 , p1 ][ p1 , X 2 , p2 ]L[ pr 1 , X r , pr ]

3. Dac (q , ) ( p , a , Z ) atunci [ p , Z , q ] a . Evident, G este

independent de

context. Pentru

a stabili egalitatea

L(G ) = L (M ) se arat c are loc echivalena

(1) [ p , X , q ] w ( p , w, X )

(q ,, ) , p , q Q , X

i w

Implicaia " " se demonstreaz prin inducie dup lungimea derivaiei iar cea invers, prin inducie dup numrul de pai.

Automate, limbaje i compilatoare

42

Fie w L (M ) ; rezult

(q

, w, Z 0

(q ,, ) cu q Q .
Conform produciilor de tipul 1, avem

Din (1) rezult

[q0 , Z 0 , q] w .

S [q 0 , Z 0 , q ] w , adic w L(G ) . Fie acum w L(G ) , adic S w . Primul

pas n aceast derivare este de forma S [q0 , Z 0 , q ] w . innd seama de (1), rezult q 0 , w, Z 0

(q ,, ) , adic

w L (M ) .

Am lucrat cu automate care se opresc dup criteriul benzii pushdown vide. Acestea sunt, ns, echivalente, din punct de vedere al limbajului acceptat, cu automate care se opresc dup criteriul strii finale. Teoremele urmtoare demonstreaz aceast echivalen.
Teorema 6.3. Pentru orice automat pushdown P exist un automat

pushdown P' astfel nct L (P ) = L(P' ) .


Demonstraie.

Fie finale

P = (Q , , , , q 0 , Z 0 , ) ;

am luat

F = ,

deoarece

P' = Q q' 0 , q f , , {X }, ' , q' 0 , X , q f

strile

nu

intervin

{ })

funcionare.

Definim

unde q' 0 i q f sunt stri noi iar X este simbol nou. Funcia de tranziie este difinit prin t1) ' (q' 0 , , X ) = {(q0 , Z 0 X )} t2) ' (q , a , Z ) = (q , a , Z ) q Q , a {}, Z t3) ' (q , , X ) = q f ,

{(

)}

t4) ' ia ca valoare n celelalte cazuri. Tranziia t1) aduce automatul P' n configuraia iniial a automatului P , avnd n plus simbolul X la baza stivei. Tranziiile t2) permit automatului P' s simuleze automatul P . Dac, n urma simulrii, automatul P' rmne doar cu simbolul X pe banda pushdown (ceea ce corespunde golirii benzii pushdown a a lui P ) atunci P' trece, prin tranziia t3), n starea final q f . Dac, n plus, a fost citit toat banda de intrare, atunci P' este ntr-o configuraie de acceptare.
Teorema 6.4. Pentru orice automat pushdown P exist un automat 6.4 pushdown P' astfel nct L(P ) = L (P' ) . demonstreaz
Teoreme 6.3 i

Automate, limbaje i compilatoare

43

Demonstraie.

Fie

P = (Q , , , , q 0 , Z 0 , F ) .

Construim echivalena
dintre limbajul

M ' = (Q {q' 0 , q }, , {X }, ' , q' 0 , X , ) , unde q i q 0 ' dou stri distincte , acceptat dup criteriul strii care nu apartin lui Q , iar X . Funcia de tranziie ' este definit astfel

t1) ' ( q' 0 , , X ) = {( q 0 , Z 0 X )} t2) ' (q , a , Z ) (q , a , Z ) pentru q Q , a {} i Z t3) ' ( q , , Z ) {( q , )} pentru q F i Z t4) ' ( q , , Z ) = {( q , )} pentru Z {X } t5) ' ia valoarea n rest. Tranziia t1) aduce automatul P' n configuraia iniial a lui P , cu deosebire c la baza benzii pushdown se afl simbolul X . Rolul lui X este de a evita golirea simultan a benzilor de intrare i pushdown fr ca automatul s fie n stare final. Tranziiile t2) permit automatului P' s simuleze funcionarea lui P . Dac

finale i cel acceptat cu memoria vid

P' ajunge ntr-o stare final atunci el poate efectua fie tranziii de tipul t2) fie
poate intra n faza de golire a benzii pushdown prin tranziii de tipul t3). Tranziiile t4) permit golirea benzii pushdown.
Consecina 6.1. Pentru orice limbaj L , urmtoarele afirmaii sunt

echivalente 1) L este independent de context pushdown vide 3) L este acceptat de un automat pushdown dup criteriul strii finale.
Definiia 6.4. Automatul pushdown
Sinteza curs

2) L este acceptat de un automat pushdown dup criteriul benzii teoremelor din

P = (Q , , , , q0 , Z 0 , F ) este

determinist dac 1) (q , a , Z ) 1, q Q , a {}, Z 2) q Q , Z , (q , , Z ) a , (q , a , Z ) .

Automat pushdown determinist

ntre automatele pushdown nedeterministe i deterministe nu exist o relaie similar cu cea din cazul automatelor finite. Justificarea acestei afirmaii este urmtoarea: se verific uor c limbajele
L2 = 0 n12 n / n 1 L1 = 0 n1n / n 0

sunt independente de contexe, deci i L = L1 L2 este

independent de context. nseamn c exist un automat pushdown care accept pe


L ; totui, s-a demonstrat c, nu exist automate pushdown deterministe care s

accepte pe L .

Automate, limbaje i compilatoare

44

Teme Curs Teste Autoevaluare

1. Care sunt componentele unui automat pushdown?........................ 2 puncte 2. Definii noiunea de configuraie.... 1 punct 3. Care sunt criteriile dup care este acceptat un limbaj?....................2 puncte 4. Ce legatur exist ntre cele dou moduri de acceptare...... 1 punct 5. Definii noiunea de automat pushdown determinist.. 2 puncte 6. Definii relaia dintre automate pushdown i gramatici independente de

context................................................................1 punct
7. Oficiu 1 punct

Automate, limbaje i compilatoare

45

Rspunsuri 1. - Q este mulimea strilor automatului

- este alfabetul de intrare - este alfabetul intern (pushdown) mulimea prilor finite. - q0 Q este starea iniial - Z 0 este simbolul intern iniial - F Q este mulimea strilor finale.
2.

- : Q ( {}) Pf (Q * ) este funcia de tranziie, unde Pf este

( q , w , ) , q Q , w * , *
L( P ) = w * ( q 0 , w, Z 0 )

3. criteriul benzii vide este:

( p , , ) }. ( p , , ), p F } .

criteriul strrii finale este:


L( P ) = w * ( q 0 , w, Z 0 )

4. Un limbaj este acceptat de un automat pushdown dup criteriul strii finale

dac i numai dac este acceptat dup criteriul benzii vide


5.

Automatul pushdown P = (Q , , , , q0 , Z 0 , F ) este determinist dac 1) (q , a , Z ) 1, q Q , a {}, Z 2) q Q , Z , (q , , Z ) a , (q , a , Z ) .

6. Pentru orice limbaj L , urmtoarele afirmaii sunt echivalente

1) L este independent de context 2) L este acceptat de un automat pushdown dup criteriul benzii pushdown vide 3) L este acceptat de un automat pushdown dup criteriul strii finale

Rezumat: S-a definit noiunea de automat pushdown, s-a demonstrat

echivalena dintre cele dou moduri de acceptare, i dintre automate pushdown i limbaje independente de context.

Automate, limbaje i compilatoare

46

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar

Se va nsui, pe baza unui program, modul de funcionare al unui automat pushdown n vederea acceptrii unui cuvant.
Teme Laborator/Seminar 1. S se scrie un program care s simuleze funcionarea unui automat

pushdown determinist; analizai cele dou criterii.


Rezumat: Funcionarea automatelor pushdown

Automate, limbaje i compilatoare

47

Notaii

Automate, limbaje i compilatoare

48

Curs 4 Clase speciale de gramatici independente de context

Curs 4 Durata:

(I)
Descriere General

2 ore

Se echivaleaz o gramatic independent de context cu alta: 1) n forma normal Chomsky 2) fr recursie la stnga 3) factorizat la stnga Se stabilete condiia necesar i suficient ca o gramatic independent de context s fie LL
Obiective

cunoaterea

metodei

de

trecere

de

la o gramatic independent

de context arbitrar la una n forma normal Chomsky - cunoaterea algoritmului de nlturare a recursivitii la stnga i a celui de factorizare la stnga - familiarizarea cu noiunea de gramatic LL(k) i nsuirea metodei de verificare a condiiei LL

Cuprins

I.7.1 Gramatici n forma normal Chomsky I.7.2. Gramatici nerecursive la stnga I.7.3. Gramatici factorizate la stnga I.7.4. Gramatici LL(k)

Coninut Curs

I.7.1 Gramatici n forma normal Chomsky


Una din simplificrile de baz aduse produciilor unei gramatici independente de context este enunat ntr-o teorem dat de Chomsky. Orice gramatic ale crei producii satisfac aceast teorem se numete n form normal Chomsky.

Automate, limbaje i compilatoare

49

Teorema 7.1.

Orice limbaj independent de context care nu conine

cuvntul vid poate fi generat de o gramatic n care toate produciile sunt de forma X YZ sau X a , unde X , Y , Z sunt neterminale iar a este terminal.
Demonstraie. Conform teoremei 1.14 este suficient s lucrm cu

gramatici independente de context fr redenumiri. Fie G = ( N , , P , S ) o astfel de gramatic i X Y1 ...Ym o producie a lui G . Dac m = 1 , atunci Y1 este terminal i aceast producie satisface forma normal Chomsky. Dac m 2 , atunci fiecare terminal Yi , 1 i m , din producie este nlocuit cu un nou simbol
Z i diferit de toate simbolurile din N i de simbolurile introduse anterior.

Reinem i producia Z i Yi , care satisface forma normal Chomsky. Transformnd astfel toate regulile obinem mulimea de producii P1 i o nou producie de forma X A1 ...An , cu n > 2 , din gramatica G1 , se introduc n 2 simboluri B1 , ..., Bn2 i produciile (1) X A1 B1 , B1 A2 B2 , , Bn 2 An1 An . Procedm aa cu fiecare producie care are cel puin trei simboluri n membrul al doilea i adugm la mulimea neterminalelor simbolurile noi. nlocuim, apoi, producia X A1 ...An , cu n > 2 , cu produciile (1). Obinem o nou gramatic
Echivalarea unei gramatici de context cu una in form Chomsky

gramatic G1 = ( N {Z i }, , P1 , S ) echivalent cu G . Apoi, pentru fiecare independente

G' = ( N' , , P' , S ) independent de context, aflat n form normal Chomsky;


G' este echivalent cu G1 i deci i cu G .

I.7.2. Gramatici nerecursive la stnga


Definiia 7.1. Fie GIC G = ( N , , P , S ) . Neterminalul

X se numete
*

recursiv la stnga dac X recursie stng.

X pentru un anumit ( N ) . Dac G

conine cel puin un neterminal recursiv la stnga, gramatica se numete cu

Recursivitatea direct, ce apare pentru un neterminal A sub forma produciilor


A 1 / 2 / ... / n / A 1 / ... / A m ,

unde 1 , 2 ,..., n nu se Echivalarea

pot scrie sub forma A , se elimin nlocuind aceste producii cu

unei gramatici independente de context cu

Automate, limbaje i compilatoare

50

A 1 A' / 2 A' / ... / n A' A' 1 A' / 2 A' / ... / m A' /

una fr recursie la stnga

unde A este un neterminal nou. Aceast procedur nu elimin, ns, recursivitatea stng generat de derivri n doi sau mai muli pai. n acest caz trebuie folosit urmtorul algoritm:
Algoritmul NREC - de eliminare a recursiei la stnga

'

Intrare : gramatica G , fr cicluri i fr - producii Ieire

: o gramatic echivalent cu G , dar fr recursie stng

Metoda :
P1. ordoneaz neterminalele n ordinea A1 , A2 ,..., An P2. for i := 1 to n do
Algoritmul de eliminare a recursiei

for j := 1 to i 1 do - nlocuiete fiecare producie de forma


Ai A j cu produciile Ai 1 / 2 / ... / m dac A j 1 / ... / m sunt toate A j - produciile

- elimin recursivitatea stng direct a lui Ai dac este cazul.

I.7.3. Gramatici factorizate la stnga


Dac A 1 / 2 sunt dou A -producii, iar cuvntul de la intrare ncepe cu , nu tim dac trebuie fcut o expandare a lui A cu 1 sau cu
2 . Regulile de acest fel vor fi modificate astfel nct alternativele pentru

expandare s difere ncepnd cu primul simbol.


Algoritmul FACT - de factorizare la stnga

Intrare : o GIC G Ieire : o gramatic echivalent, factorizat la stnga Metoda : Pentru fiecare neterminal A se determin cel mai lung prefix

comun la dou sau mai multe alternative. Se nlocuiesc

A -produciile
Factorizarea la stnga

A 1 / 2 / ... / n / , unde reprezint toate alternativele ce nu ncep cu

, cu
A A' / A' 1 / 2 / ... / n

Automate, limbaje i compilatoare

51

unde A' este un neterminal nou. Se repet aceast transformare pn cnd nu mai exist, pentru nici-un neterminal, alternative care s aib un prefix comun.
Exemplul 7.1. Factorizarea stng a gramaticii cu produciile
S aEbS / aEbScS / d , E e

este
S aEbSS ' / d S ' dS / E e

I.7.4. Gramatici LL(k)


Fie
G = (N , ,P ,S ) o gramatic neambigu i w = a1a 2 ...a n L( G ) .
pi

Atunci exist o unic derivare la stnga p0 p1 ... p m 1 astfel nct S = 0 , i i +1 ;


0 i < m i m = w . Dac i = a1 ...a j A , dorim ca secvena i +1 s poat fi

determinat cunoscnd primele j simboluri (partea din cuvntul de intrare citit pn n acel moment), urmtoarele k simboluri a j +1 ...a j + k ( pentru un anumit

k =) i neterminalul A . Dac aceste trei cantiti determin n mod unic producia

folosit pentru expandarea lui A , vom spune c gramatica G este LL(k ) . n continuare vom considera c neterminalul care deriveaz este cel mai din stnga.
Definiia 7.2.
*

Fie

G = (N , ,P ,S ) o GIC , k un numr natural i

( N ) . Definim funcia PRIM kG ( ) astfel :


PRIM kG ( ) = w * / w < k si sau w = k si

wx pentru un anumit x}

Am notat cu x lungimea secvenei x . Dac nu exist pericol de confuzie vom renuna s mai precizm gramatica G .
Definiia 7.3. Fie G = ( N , , P , S ) o GIC. Spunem c G este LL(k )

dac: (1) S
wA

wx

Automate, limbaje i compilatoare

52

(2) S

wA

wy
Definiia gramaticii LL

(3) PRIM k ( x ) = PRIM k ( y ) implic = . O gramatic este de tip LL dac ea este LL(k ) pentru un anumit k .
Teorema 7.2. Fie G = (N , ,P ,S ) o GIC . Atunci G este LL(k ) dac i

numai dac este adevrat condiia : A N astfel nct exist derivarea S wA i pentru orice
PRIM k ( ) PRIM k ( ) =

i A

producii distincte, rezult

Demonstraie.

,,

'' Fie G o gramatic LL( K ) . Presupunem prin reducere la absurd c


A N astfel nct pentru orice derivaie S

wA

( A ) P,( A ) P, i PRIM k ( ) PRIM k ( ) .

Fie u PRIM k ( ) PRIM k ( ) ; rezult u PRIM k ( ) , deci

Condiia necesar i suficient ca o gramatic s fie LL

x i u = PRIM k ( x )
*

i u PRIM k ( ) , deci Am obinut 1) S 2) S 3)


wA

y i u = PRIM k ( y ) .
*

wx , x *

wA

wy , y *

PRIM k ( x ) = PRIM k ( y )

i totui ; deci gramatica nu este LL( k ) . Ajungem la o contradicie , deci presupunerea fcut este fals. ,, '' Presupunem prin absurd c G nu este LL( K ) ; deci sunt adevrate condiiile 1) , 2) , 3) din definiia 1.31 i totui . Condiia 1) implic existena derivaiei i din 3) obinem
PRIM k ( x ) = PRIM k ( y ) PRIM k ( ) PRIM k ( ) ,

x * ; analog, 2) implic

y * . De aici

deci PRIM k ( ) PRIM k ( ) , contradicie. Rezult c presupunerea fcut este fals, deci G este LL(k ) .
Definiia 7.4. Fie G = ( N , ,P ,S ) o GIC ; definim funcia URM k ( ) ,

Automate, limbaje i compilatoare

53

unde k este un ntreg pozitiv iar ( N ) astfel:


*

URM k ( ) = {w S

i w PRIM k ( ) } .

Vom da un algoritm care s verifice dac o gramatic este LL(k ) , deoarece teorema 7.2 este dificil de utilizat.
Definiia 7.5.

Fie

un alfabet i

L1 , L2 * . Definim

L1 k L2 = { w / x L1 si y L2 astfel nct a) w = xy dac xy k i b) w este format din primele k simboluri din xy , n caz contrar} .

innd seama de definiia de mai sus rezult uor c


PRIM k ( ) = PRIM k ( ) k PRIM k ( ) , ( N )* .

Acum, condiia ca o gramatic s fie LL(k ) se reformuleaz astfel : G este


LL(k )

dac

numai

dac

( ) A N , ( S

wA )

astfel

nct

( A ) P , ( A ) P , implic

(PRIM k ( ) k L ) (PRIM k ( ) k L ) =

, unde L = PRIM k ( ) .

Algoritmul TEST-LL - de testare a condiiei LL(k )

Intrare : o GIC G = ( N , , P , S ) i un numr ntreg pozitiv k Ieire : ,,da dac gramatica este LL(k ) i ,,nu n caz contrar Metoda :

Se consider c toate neterminalele sunt nemarcate. Pasul 1. Pentru orice


A N , nemarcat , pentru care exist cel puin dou A -

producii distincte calculeaz


( A ) = L * k S

wA

i L = PRIM k ( )

}
Algoritmul de testare a condiiei LL

Pasul 2. calculeaz

Dac

A i

A sunt

dou A - producii distincte ,

f ( L ) = (PRIM k ( ) k L ) (PRIM k ( ) k L )

pentru orice L ( A ) . Dac f ( L ) , rspunde ,,nu i oprete algoritmul. Dac

f ( L ) = pentru orice

L ( A ) , repet pasul

pentru toate

perechile distincte de A - producii i la sfrit marcheaz pe A . Pasul 3. Repet paii 1 i 2 pentru toate neterminalele nemarcate din N . Pasul 4. Rspunde ,,da dac toate neterminalele au fost marcate; n caz contrar

Automate, limbaje i compilatoare

54

se merge la pasul 1. Pentru a putea aplica acest algoritm trebuie calculate funciile PRIM k i .
Algoritmul PRIM. - de calculare a funciei PRIM
G = ( N , ,P ,S )

Intrare

o GIC
*

un numr ntreg pozitiv i

= X 1 ...X n ( N ) ,n 1

Ieire : PRIM k ( ) Metoda : innd seama de descompunerea PRIM k ( ) = PRIM k ( X 1 ) k ... k PRIM k ( X n ) rezult c este suficient s

calculm PRIM k ( x ) cu x N ; dac x {} atunci PRIM k ( x ) = {x} . Calculm recursiv mulimile Fi ( x ) pentru x N i i 0 Pasul 1. F i ( a ) = {a}: a { }, i 0 Pasul 2.
x * k / ( A x ) P F0 ( A ) = unde fie x = k fie x < k si =
Calcularea valorilor funciei PRIM

Pasul 3. Presupunem c mulimile orice A N . Atunci :

F 0 , F1 , ..., F i 1 au fost calculate pentru

x / x Fi 1 ( y1 ) k ... k Fi 1 ( y n ), Fi ( A) = Fi 1 ( A) ( A y1 ... y n ) P

Pasul 4. Dac pentru A N avem Fi 1 ( A ) = Fi ( A ) lum


PRIM k ( A ) = Fi ( A ) i oprim algoritmul; altfel se merge la pasul 3.
Teorema 7.3.

Algoritmul PRIM calculeaz corect valorile funciei

PRIM k .
Demonstraie : Deoarece Fi ( A ) * k rezult c mulimile Fi ( A ) , cu

A fixat i i = 0,1,... sunt n numr finit . Cum Fi ( A ) Fi +1 ( A ) , exist un n

astfel nct Fn1 ( A ) = Fn ( A ) . Apoi pentru orice j > n avem Fn ( X ) = F j ( X ) i deci Fn ( A ) = U Fi ( A ) . Este suficient s artm c PRIM k ( A ) = U Fi ( A ) .
i =0 i =0

,, ''

Fie

x PRIM k ( A ) . Atunci, exist un r astfel nct

y i

Corectitudinea algoritmului

x = PRIM k ( y ) . Artm prin inducie dup r c x Fr 1 ( A ) . Pentru r = 1 este PRIM

trivial, deoarece x F0 ( A ) . S fixm pe r i s presupunem c ipoteza este

Automate, limbaje i compilatoare

55

verificat pentru valori mai mici dect r . Atunci

Y1 ...Yn

unde

y = y1 y 2 ...y n

i Y p

yp

pentru 1 p n . Evident rp < r i conform

ipotezei de inducie, PRIM k ( yi ) Fri 1 ( Yi ) Fr 2 ( Yi ) . Obinem


x = PRIM k ( y ) = PRIM k ( y1 ... y n ) = PRIM k ( y1 ) k ... k PRIM k ( y n )

Fr 2 ( Y1 ) k ... k Fr 2 ( Yn ) Fr 1 ( A ) .

,, '' Artm c Fr ( A ) PRIM k ( A ) prin inducie dup r . Pentru r = 0 este evident. Presupunem afirmaia adevrat pentru valori mai mici dect r i s o demonstrm pentru r . Fie x Fr ( A ) ; dac x Fr 1 ( A ) rezult c x PRIM k ( A ) , conform ipotezei de inducie. Dac

(A y ...y ) P
1 p

x Fr 1 ( y1 ) k ... k Fr 1 ( y p ) ,

avem

x PRIM k ( y1 ) k ... k PRIM k ( y p ) = PRIM k ( y1 ... y p ) PRIM k ( A) .


Pentru ultima incluziune am folosit proprietatea urmtoare

implic

PRIM k ( ) PRIM k ( ) ,

a crei demonstraie este

evident.
Algoritmul URM1 - de calculare a funciei

Intrare : o GIC G = ( N , , P , S ) i k un numr ntreg nenegativ Ieire : ( A ) pentru A N Metoda : Pentru A, B N calculm
( A,B ) = L L * k ,( A

wB ) i L = PRIM k ( )} Pentru aceasta construim

Pasul 1: fie 0 ( A, B ) = {L k / ( A wB ) P i L = PRIM k ( )} Pasul 2: presupunem c mulimile i 1 ( A,B ) au fost calculate pentru orice
A, B N i definim i ( A,B ) astfel :
Calculul valorilor funciei

mulimile i ( A, B ) pentru A, B N i i = 0 ,1,... astfel:

(a) dac L i 1 ( A,B ) atunci L i ( A,B ) (b) dac exist producia A X 1 ...X n i pentru un j , 1 j n , exist o mulime L' i 1 ( X j , B ) , atunci include n i ( A, B ) pe
L = L' k PRIM k X j +1 ...X n

Pasul (2).

3:

dac

pentru

orice

A, B N

exist

un

astfel

nct

i ( A, B ) = i 1 ( A, B ) lum ( A, B ) = i ( A, B ) ; n caz contrar se merge la pasul

Automate, limbaje i compilatoare

56

Pasul 4: pentru orice A N se ia ( A ) = ( S , A ) .


Teorema 7.4. Algoritmul URM1 calculeaz corect valorile funciei . Demonstraie.
*

Se arat c L ( A ) dac i numai dac exist


wA i L = PRIM k ( ) . Demonstraia

w * i ( N ) astfel nct S

este similar cu cea din teorema precedent.

Automate, limbaje i compilatoare

57

Teme Curs Teste Autoevaluare Testul 1 1. Considerm gramatica G = ({S , A, B}, {a , b}, P , S ) cu produciile
S aAB , S BA , A BBB , A a , B AS , B b .

se

construiasc

gramatica

echivalent

aflat

forma

normal

Chomsky............................................................ 2 puncte
2. Fie gramatica cu produciile

S Aa / b,A Ac / Sd / e
a) S se arate c este recursiv la stnga...................................... 1 punct b) S se construiasc o gramatic echivalent, fr recursie la stnga....................................................................................... 2 puncte
3. Fie L1 = { , abb} i L2 = {b , bab} . Calculai
L1 2 L2 ...1 .punct

4. Considerm gramatica G = ({S ,A,B}{a ,b},P ,S ) cu produciile ,


S aAaB / bAbB A a / ab B aB / a

Folosind definiiile calculai PRIM 3 ( S ) i ( A ) ... 3 puncte


5. Oficiu . 1 punct

TESTUL 2

Se consider gramatica G = ({S ,A,B}{a ,b},P ,S ) cu produciile ,


S aAaB / bAbB A a / ab B aB / a

a) Folosind

algoritmul

PRIM,

se

calculeze

valorile

funciei

PRIM 3 ................................................... .3 puncte


b) Folosind algoritmul s se calculeze valorile funciei ... .3 puncte c) S se verifice c gramatica este LL( 3 ) .......................................3 puncte Oficiu.1 punct

Automate, limbaje i compilatoare

58

Rspunsuri la Testul 1 1. Gramatica


G' = ({S , A, B , C , D , E}, {a , b}, P' , S )

cu

produciile

P' ={ S CD , D AB , C a , S BA , A BE , E BB ,
A a , B AS , B b } este n form normal Chomsky i este

echivalent cu G
2. a) Neterminalul S este recursiv la stnga deoarece S
Aa Sda

b)

Considernd c ordinea neterminalelor este

S , A , gramatica

echivalent are produciile

S Aa / b A bdA' / eA' A' cA' / adA' /


unde A' este neterminal nou
3.
L1 2 L2 = {b , ba , ab} ( A ) = {{aa , aaa}, {ba , baa}}

4. PRIM 3 ( S ) = {aaa , aab , bab}

Raspunsuri la Testul 2

a) PRIM 3 ( A ) = {a , ab}

PRIM 3 ( S ) = {aaa , aab , bab} PRIM 3 ( B ) = {a , aa , aaa}


( S ) = ( S , S ) = ( A ) = ( S , A ) = {{aa , aaa}, {ba , baa}} ( B ) = ( S , B ) = {{}}

b)

c) ( S ) = , deci L = , f ( L ) = i se marcheaz S Pentru neterminalul A


( A ) = {{aa ,aaa}{ba ,baa}} ,

Pentru produciile A a , A ab i L = {aa , aaa} avem


f (L ) = {aaa} {aba} =

pentru produciile A a , A ab i L = {ba , baa} avem


f ( L ) = {aba} {abb} = i se marcheaz S .

Pentru neterminalul B :
( B ) = {{}}

Automate, limbaje i compilatoare

59

pentru produciile B aB , i B a i L = {{}} avem


f ( L ) = {aa ,aaa} {a} = i se marcheaz neterminalul B

Rezumat: S-a echivalat o gramatic independent de context cu altele, utile

n anumite tipuri de analiz sintactic. S-a prezentat o metod de verificare a faptului c o gramatic este sau nu de tipul LL .

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar

Teme Laborator/Seminar 1. S se scrie un program care sa construiasc forma normal Chomsky 2. S se implementeze algoritmul de eliminare a recursiei la stnga 3. S se implementeze algoritmul de calculare a valorilor funciei PRIM

Rezumat: Se echivaleaz o gramatic independent de context cu

gramatici care vor simplifica analiza sintactic. Se implementeaz algoritmul PRIM folosit la testarea condiiei LL.

Automate, limbaje i compilatoare

60

Notaii

Automate, limbaje i compilatoare

61

Automate, limbaje i compilatoare

62

Curs 5 Clase speciale de gramatici independente de context

Curs 5 Durata: 2 ore

(II)
Descriere General Se definete noiunea de gramatic LR apoi se demonstreaz condiia necesar i suficient ca o gramatic s fie LR i se d un algoritm de verificare. Se definesc gramaticile de preceden simpl i slab, relaiile de preceden Wirth-Weber i se explic modul de construire a lor. Obiective cunoaterea metodei de verificare c o gramatic este LR cunoaterea metodei de verificare c o gramatic este de preceden simpl sau slab

Cuprins I.7.5. Gramatici LR(k) I.7.6. Gramatici de preceden

Coninut Curs

I.7.5. Gramatici LR(k)


Gramaticile LR au fost introduse n 1965 de ctre Knuth iar clasa limbajelor generate de ele este clasa limbajelor independente de context deterministe. Analiza LR prezint avantajul generalitii, toate limbajele de programare ce accept o definiie sintactic BNF fiind analizabile LR . Pentru construirea arborelui de derivare se dispune de urmtoarele Formularea informaii: cerinelor LR

i1 ) o poziie iniial n cuvntul de analizat pe care o notm cu p ,

i2 ) ntregul context stnga al cuvntului surs, adic a1a2 ...a p ,


i3 ) urmtoarele k simboluri ale sursei situate dup poziia p , adic
a p +1 a p+2 ...a p +k ,

Automate, limbaje i compilatoare

63

i4 ) la fiecare pas, neterminalul care deriveaz este cel mai din dreapta .
Gramatica G trebuie s aib astfel de proprieti nct informaiile
i1 ) i4 ) s ne asigure urmtoarele:

1) dac p indic sau nu limita dreapt a prii reductibile, 2) dac p indic limita dreapt a prii reductibile atunci i1 ) i4 ) determin i limita din stnga, 3) dac a fost determinat partea reductibil, i1 ) i4 ) determin i producia ce va fi utilizat pentru reducere. Fie G = ( N , , P , S ) i w L( G ) . Pentru A N vrem s determinm irul
0 ,1 ,..., m

astfel

nct:

S = 0

.....

m = w .

Fie

i 1 = Ax i i = x ; informaiile i1 ) i4 ) trebuie s determine n mod unic producia A folosit n derivarea i 1 tipul derivrii. Cele de mai sus pot fi unificate sub forma conceptului formal de gramatic i . n cazul gramaticilor LR

toate derivrile sunt la dreapta; pentru simplificarea scrierii nu vom mai specifica

LR( k ) .
Definiia 7.6. Fie G = ( N , ,P ,S ) o GIC. Se numete gramatic extins a

lui G, gramatica G' = ( N { S' }, ,P { S' S },S' ) unde S' N . Producia


S' S o vom numerota cu 0 iar celelalte cu 1, 2, ... , p .

Definiia 7.7. Fie G = ( N , ,P ,S ) o GIC i G' = ( N' , ,P' ,S' ) gramatica

sa extins. G este LR( k ) , k 0 , dac: 1) S'


Aw

w x = y

Definiia gramaticii de tip LR

2) S'

Bx

3) PRIM k ( w ) = PRIM k ( y ) implic Ay = Bx (adic = , A = B i x = y ).


Definiia 7.8. Cuvntul ( N )* este un prefix viabil n gramatica

G = ( N , ,P ,S ) dac S se numete parte deschis.

Aw

w i este un prefix al lui ;

Automate, limbaje i compilatoare

64

Definiia 7.9. Fie G = ( N , ,P ,S ) o GIC. Vom spune c [ A 1 . 2 , u ]

este linie LR( k ) , dac ( A 1 2 ) P i u * k . nucleul iar u irul de anticipare al liniei.

A 1 . 2 se numete

Definiia 7.10. Linia LR( k ) [ A 1 . 2 , u ] este valid pentru prefixul

viabil 1 dac exist o derivare de forma S u = PRIM k ( w ) .


Exemplul 7.2. Fie gramatica cu produciile:
S C/ D
C aC / b

Aw

1 2 w i

D aD / c

Linia [C a .C , ] este valid pentru aaa deoarece exist derivaia S


aaaC cu = aa i w = .

aaC

Definiia 7.11. Funcia EFF : ( N )* Pf ( * ) ( -free first) este o

restricie a funciei PRIM i este definit astfel: EFFk ( ) = PRIM k ( ) dac N ( N )* i EFFk ( ) = { w / wx ,w = PRIM k (wx ) i ultima producie folosit nu este

producie cnd N (N )*
Exemplul 7.3. Pentru gramatica G cu produciile
S AB A Ba / B Cb / C C c/

avem PRIM 2 ( S ) = { ,a ,b ,c ,ab ,ac ,ba ,ca ,cb } , EFF2 ( S ) = { ca ,cb } . Lema 7.1. Fie G = ( N , ,P ,S' ) o gramatic extins care nu este LR(k).

Atunci: 1) S' 2) S'


Aw

w x = y

Bx

Automate, limbaje i compilatoare

65

3) PRIM k ( w ) = PRIM k ( y ) 4) implic Ay Bx .


Demonstraie. Din definiia gramaticii LR( k ) deducem c pot fi satisfcute toate condiiile din lem exceptnd . Presupunnd > se ajunge la contradicia Ay = Bx . Teorema 7.5. O gramatic G = ( N , ,P ,S ) este LR( k ) dac i numai

dac este ndeplinit urmtoarea condiie, pentru orice u * k : dac [A ., u ] este linie LR( k ) valid pentru prefixul viabil atunci nu exist nici-o alt linie [A1 1 . 2 ,v ] valid pentru cu u EFFk ( 2 v ) .
Demonstraie.
" " Presupunem prin absurd c u * k i exist prefixul viabil astfel nct

[A ., u ]
nseamn c:

[A1 1 . 2 , v]
S'
S'

sunt dou linii valide pentru prefixul .


w cu u = PRIM k ( w )

Aw 1 A1 x

1 1 2 x cu v = PRIM k ( x )
uy , u EFFk ( 2 v ) .
Condiia necesar i suficient ca o gramatic s fie LR

i = 1 1 . n plus, 2 x
S'

Cazul I. Dac 2 = atunci u = v i


Aw
w 1 1 x

S'

1 A1 x

PRIM k ( w ) = PRIM k ( x ) = u = v .
Deoarece cele dou linii LR( k ) sunt distincte, nseamn c fie A A1 , fie
1 . n plus, Ax 1 A1 x , deci G nu este LR( k ) .

Cazul II. Dac 2 = z + atunci


S'
S'

Aw 1 A1 x

w , u = PRIM k ( w )

1 1 zx , v = PRIM k ( x )

PRIM k ( zx ) = PRIM k ( w )
n acest caz G nu poate fi LR( k ) deoarece Azx 1 A1 x . Cazul III. Presupunem c 2 conine cel puin un simbol neterminal. Atunci

Automate, limbaje i compilatoare

66

u1 Bu3

u1u 2 u 3

unde

u1u 2 ,

deoarece

conform

definiiei,

u EFFk ( 2 v ) i prin urmare un simbol neterminal de nceput nu poate fi


nlocuit prin cuvntul vid. Astfel, avem derivaiile:
S' S' Aw

w 11u1u 2 u 3 x = u1u 2 u 3 x

1 A1 x

11 2 x

11u1 Bu3 x

cu u1u 2 u3 x = uy . Deci PRIM k ( w ) = PRIM k ( u1u 2 u3 x ) = u . Deoarece gramatica este LR( k ) rezult c Au1u 2 u3 x = 11u1 Bu3 x , adic
Au1u 2 = 1u1 B , egalitate imposibil deoarece u1u 2 + . " " Presupunem c G nu este LR( k ) . Atunci avem S' S' Aw

Bx

x = y

PRIM k ( w ) = PRIM k ( y ) = u
dar Ay Bx . Putem alege derivrile astfel nct s aib lungimea ct mai mic posibil. innd seama de lema 7.1 presupunem c . Notm cu
1 A1 y1 ultima form derivaional la dreapta n derivarea S'

Bx astfel nct

lungimea prii sale deschise nu depete + 1 , adic 1 A1 + 1 . Derivarea de mai sus se poate scrie
S'
1 A1 y1 1 1 2 y1 1 1 y

cu 1 1 = . Din alegerea lui 1 A1 y1 avem 1 . n plus, n derivarea


2 y1

y nu se folosete ca ultim producie o

-producie, cci dac B

ar fi ultima producie folosit atunci 1 A1 y1 nu ar fi ultima form derivaional la dreapta n derivarea S'

Bx a crei parte deschis nu depete n lungime

+ 1 . Astfel, u = PRIM k ( y ) EFFk ( 2 y1 ) . Rezult c [A1 1 . 2 ,v] este

linie LR( k ) valid pentru , unde v = PRIM k ( y1 ) . Din S'


Aw
w deducem c [A .,u ] este linie valid pentru . S

artm acum c liniile [A .,u ] i [A1 1 . 2 ,v ] sunt distincte. Pentru aceasta presupunem contrariul; deci A1 1 . 2 coincide cu A . Atunci, ultima derivare de mai sus este de forma
S'
1 Ay 1y

cu 1 = . Atunci 1 = i Ay = Bx , contrar ipotezei c G nu este

Automate, limbaje i compilatoare

67

LR( k ) .
Fie G o GIC i un prefix viabil. Notm cu Vk ( ) mulimea liniilor
G

LR(k) valide pentru prefixul viabil . Vom renuna s mai specificm pe k i G


dac acestea se subneleg. Algoritmul LINII-LR - de calculare a mulimilor Vk

Intrare: G = ( N , ,P ,S ) o GIC, = x1 x2 ...xn ( N )* i n 0 Ieire: Vk ( ) Metoda: Se calculeaz succesiv


Vk ( ), Vk ( x1 ), Vk ( x1 x 2 ), ..., Vk ( x1 x 2 ...x n )
G G G G G

Pasul 1. Se construiete mulimea Vk ( )

(a) Dac ( S ) P , se include n Vk ( ) linia [S . ,]


G

(b) Dac [A .B 2 ,u ] Vk G ( ) i ( B ) P , atunci pentru


x PRIM k ( 2 u ) se include n Vk
G

( ) linia [B . ,x] , dac nu a fost deja

inclus.

(c) Se repet pasul 1.b pn cnd nici-o linie nu mai poate fi adugat la
Vk G ( ) .
Calcularea
G

Pasul 2. Presupunem c a fost calculat mulimea Vk


Vk ( x1 x 2 ...xi ) astfel:
G

(x1 x2 ...xi1 ) i calculm


G

liniilor LR

(a) Dac [A 1 .xi 2 ,v ] Vk ( x1 x2 ...xi 1 ) atunci se include n Vk


G

(x1 ...xi ) linia

[A 1 xi . 2 ,v].
(b) Dac [A 1 .B 2 ,u ] Vk G ( x1 ...xi ) i (B ) P atunci se include n
Vk
G

(x1 x2 ...xi ) linia [B . ,x] pentru x PRIM k ( 2 u ) , dac aceasta nu a

fost

deja inclus.

(c) Se repet pasul (2.b) pn cnd nu se mai poate aduga nici-o linie la
mulimea Vk
G

(x1 x2 ...xi ) .

Definiia 7.12. Fie gramatica G = ( N , ,P ,S ) i k 0

A = VkG ( ) , unde ( N )* . Definim funcia GOTO astfel:


GOTO(A , x)=A, unde A' = VkG (x ) i x N . Automate, limbaje i compilatoare
68

Urmtorul algoritm d o metod sistematic de calculare a mulimii de linii LR( k ) . Algoritmul COLECIE

Intrare: GIC G = ( N , ,P ,S ) i k 0 , numr de intrare Ieire: S ={ A / A VkG ( ) i este prefix viabil al lui G} Metoda: Iniial S =
Pasul 1. Se include n S mulimea Vk ( ) nemarcat. Pasul 2. Dac A S este nemarcat, atunci se marcheaz A dup ce se calculeaz pentru fiecare x N mulimea A = GOTO(A, x). Dac A i nu exist deja n S atunci se adug A la S, nemarcat. Pasul 3. Se repet pasul (2) pn cnd toate elementele lui S sunt marcate. Mulimea S se numete colecia canonic de mulimi de linii LR( k ) , pentru gramatica G. Definiia 7.13. Fie G = ( N , , P , S ) o GIC i k un numr ntreg nenegativ.
G

O mulime A de linii LR( k ) se numete consistent dac nu conine dou linii de forma [ A .,u ] i [ B 1 . 2 ,v ] cu u EFFk ( 2 v ) .
Din aceast definiie i din teorema 7.5 rezult urmtorul algoritm de testare a condiiei LR( k ) . Algoritmul TESTARE-LR

Intrare: G = ( N , , P , S ) o GIC i k 0 un numr ntreg Ieire : "DA" dac G este LR( k ) i "NU" n caz contrar Metoda
Pasul 1. Utiliznd algoritmul COLECTIE se calculeaz colecia canonic de mulimi de linii LR( k ) . Pasul 2. Se examineaz fiecare mulime de linii LR ( k ) din S i se determin dac este consistent. Pasul 3. Dac toate mulimile din S sunt consistente se rspunde "DA"; n caz contrar se rspunde "NU".
Testare condiie LR

Automate, limbaje i compilatoare

69

I.7.6. Gramatici de preceden


Aa cum am vzut anterior, dac gramatica G este LR( k ) , determinarea captului din dreapta al prii reductibile se face cu ajutorul unei funcii asupra urmtoarelor k simboluri din poriunea neexplorat a cuvntului de intrare. Adic,
* dac este dat derivarea S Aw w , atunci determinarea lui se face cu

ajutorul unei funcii asupra cuvntului PRIM k ( ) . Conceptul de gramatic de preceden este legat de existena unor relaii (numite de preceden) ntre simbolurile lui
d d

N , care permit izolarea

prii reductibile. Dac

* S Aw w = ' y z w' cu = ' y i w = zw' , atunci izolarea captului din

dreapta a lui rezult din: 1) toate simbolurile consecutive ale lui satisfac o anumit relaie 2) ultimul simbol al lui i primul simbol al lui w , adic perechea ( y , z ) , satisfac o alt relaie. Deci, izolarea prii reductibile depinde numai de relaia n care se gsesc dou simboluri succesive. Relaiile, trei la numr, sunt notate de obicei cu
< , = , > . n cazul precedenei simple, ntr-o derivare dreapt de forma:

* S X k +1 Aa x X k +1 X k K X 1a x d d

poriunea X k K X 2 X 1 este delimitat prin cele trei relaii astfel: - la dreapta: X 1 > a1 - la stnga: X k +1 < X k
- n interior: X i +1 = X i pentru i = 1,K , k 1 .

De asemenea, ntre simbolurile consecutive din X k +1 , avem relaia <


sau = . Facem observaia c toate derivrile sunt la dreapta.

Definiia 7.14. Fiind dat o GIC G = ( N , ,P ,S ) se numesc relaii de


preceden Wirth-Weber relaiile < ,= ,> definite pentru X ,Y N i a

astfel:
+ (1) X < Y dac exist producia C 1 XB 2 i B Y (2) X = Y dac exist producia C 1 XY 2

Automate, limbaje i compilatoare

70

* (3) X > a dac exist producia C 1 AB 2 i A X , B a

Relaiile de

La acestea se adaug relaiile ce implic marcajul $, de nceput i sfrit al preceden cuvntului de intrare: (4) $ < X dac S X
+

(5) X > $ dac S X .


Definiia 7.15. O GIC G = ( N , , P , S ) este proprie dac:

(1) nu are simboluri inutile (2) nu exist cicluri, adic derivri de forma A A (3) nu are -producii n afara, eventual, a produciei S , caz n care S nu apare n membrul drept al nici unei producii.
Definiia 7.16. O GIC proprie, fr -producii, n care ntre oricare
+

dou simboluri exist cel mult o relaie de preceden Wirth-Weber se numete gramatic de preceden. Dac, n plus, gramatica este i unic invertibil, ea se numete de preceden simpl.
Lema 7.2. Fie G = ( N , , P , S ) o gramatic proprie fr -producii.
(1) Dac X < Y sau X = Y i ( Y A ) P atunci X < A . (2) Dac X < a sau X = Y sau X > a i ( X Y ) P atunci Y > a .

Demonstraie. Demonstrm (1). Dac X < Y atunci ( C 1 XB 2 ) P

i B Y ; deci B Y A . Din ( C 1 XB 2 ) P i B A rezult


+ + +
X < A . Dac X = Y atunci ( C 1 XY 2 ) P ; innd seama i de faptul c

( Y A ) P rezult X < A . Punctul (2) se demonstreaz similar.


Teorema 7.6. Fie G = ( N , , P , S ) o gramatic

proprie

fr -

producii i derivarea:
$ S $ X p X p 1 K X k +1 Aa1 K a q X p X p 1 K X k +1 X k K X 1a1 K aq

Atunci:
(1) pentru k < i < p avem X i +1 < X i sau X i +1 = X i

Automate, limbaje i compilatoare

71

(2) X k +1 < X k
(3) pentru 1 i k 1, X i +1 = X i

(4) X1 > a1 .
Demonstraie. Folosim inducia dup numrul n al pailor n care are loc

derivarea indirect. Pentru n = 0 avem $ S $ $ S $ $ X k L X 1 $ i conform


definiiei 7.14 avem $ < X k , X i = X i +1 pentru 1 i k 1 i X 1 > $ .

Corectitudinea preceden

X k L X 1 nu poate fi cuvnt vid deoarece gramatica este presupus fr relaiilor de


producii. Presupunem c afirmaia din teorem este adevrat pentru n i fie

derivaia:
$ S $ X p L X k +1 Aa1 L aq X p L X k +1 X k L X 1a1 L aq
n

X p L X j +1Yr LY1 X j 1 L X 1a1 L aq

unde la ultimul pas, X j ( 1 j p ) a fost nlocuit cu Yr LY1 , deci X j 1 ,L , X1


sunt terminale (dac j = 1 atunci X j 1 L X 1 = ). Conform ipotezei inductive,
X j +1 < X j

sau

X j +1 = X j

i din lema 1.2. rezult

X j +1 < Yr . Apoi,

Yr = Yr 1 =L = Y1 , deoarece Yr LY1 este membrul drept al unei reguli. ntre X j i

X j 1 (sau a1 ) exist una dintre cele trei relaii posibile; conform punctului (2) al

lemei 1.2 avem Y1 > X j 1 sau Y1 > a dac j = 1 . De asemenea, X i +1 < X i sau
X i +1 = X i pentru j < i < p , conform ipotezei de inducie.

Corolarul 7.1. Dac G este gramatic de preceden, atunci concluziile

teoremei 7.6 devin:


(1) pentru k < i < p , fie X i +1 < X i , fie X i +1 = X i ;

(2) X k +1 < X k ;
(3) pentru 1 i k 1, X i +1 = X i ;

(4) X 1 > a1 ; (5) ntre oricare dou simboluri din irul X p L X 1a1 nu mai exist nici-o alt relaie n afara celor precizate n (1)-(4).

Plecnd de la definiia 7.14, vom da un algoritm de calculare a relaiilor


Automate, limbaje i compilatoare

72

Wirth-Weber. l vom explica pe exemplul urmtor.


Exemplul 7.4. Fie gramatica cu produciile:

S bAAc,

A Sa | a

Ne propunem s determinm relaiile Wirth-Weber. Fie M = , M > , M < mulimea perechilor ce se afl respectiv n relaia = , > , < . Mulimea M = se determin cutnd n partea dreapt a produciilor, toate perechile de simboluri consecutive; obinem M = = {( b, A ),( A, A ),( A,c ),( S ,a )} . Pentru a calcula mulimea M < se pornete cu ea vid i cu o mulime M iniializat cu M = . Se caut n M perechi de forma ( X , B ) cu B N ; n exemplul nostru ele sunt ( b , A ) i ( A , A ) . Pentru fiecare B din aceste perechi cutm n membrul drept al B produciilor primul simbol; fie el Y . Se adaug ( X ,Y ) la mulimea M < i dac Y N se adaug i la M. n exemplul nostru, din ( b, A ) obinem ( b, a ) i ( b, S ) . Ambele se adaug la M < iar ( b, S ) se adaug i la M. Calcularea lui M < se ncheie cnd nu mai exist n M nici-o pereche ( X , B ) netratat. n final se adaug perechile ($,Y ) unde
S Y ;
+

cazul

nostru,

($,b ) .

Obinem

M < = {( b , a ), ( b , S ), ( b , b ), ( A, a ), ( A, S ), ( A, b ), ($, b )} . Pentru a calcula mulimea

M > , o considerm iniial vid. Fie M o mulime iniializat cu M = . n M cutm

perechi

de

forma

( A, B ), cu A N ;

exemplul

nostru

ele

sunt

( A, A ),( A, c ),( S , a ). Se calculeaz PRIM 1 ( B ) , apoi pentru fiecare A producie

se ia ultimul simbol al prii drepte, fie el X . Se adaug la M > toate perechile


( X , a ) cu a PRIM 1 ( B ) , iar la mulimea M perechile ( X , a ) cu X N . n

exemplul nostru, pentru ( A, A ) avem PRIM 1 ( A ) = { a ,b } , iar ultimul simbol al Construirea prii drepte este a . Deci perechile adugate la M > sunt: ( a ,a ) i ( a ,b ) . preceden Mulimea rezultat este: M > = {( a , a ), ( a , b ), ( a , c ), ( c , a ), ( c , $)} . Tabelul relaiilor de preceden este prezentat mai jos. Condiia ca relaiile de preceden definite pentru o GIC s fie disjuncte este destul de tare. Dac se impune numai condiia de disjuncie care asigur izolarea corect a captului din dreapta al prii reductibile, adic
relaiilor de

Automate, limbaje i compilatoare

73

> ( < = ) = , se obine o gramatic de preceden slab.

S S A a b c $
< <
=

a
=

< >
=

< > <

> >

< >

<

Definiia 7.17. O gramatic G , proprie i fr

-producii, se numete

de preceden slab dac:


(1) > ( < = ) =

(2) dac A X i B sunt producii ale lui G , atunci nici una din
relaiile X < B , X = B nu este valid.

Automate, limbaje i compilatoare

74

Teme Curs Teste Autoevaluare 1. Considerm gramatica G = ({ E },{ a ,b ,0,1 },P ,E ) cu produciile
E E1aE 0 i E b . Se cere

a) S se construiasc colecia canonic de linii LR( 1 ) .......... 4 puncte b) S se verifice c gramatica este LR( 1 ) ........................... 2 puncte
2. Fie gramatica cu produciile:

E E +T /+T / T T T* F / F F ( E )/ a

a) S se construiasc matricea relaiilor de preceden simpl..... 2 puncte b) S se verifice c gramatica este de preceden slab................ 1 punct Oficiu......................................................................................................... 1 punct

Automate, limbaje i compilatoare

75

Rspunsuri 1. a)

V1 ( ) = A 0 = {[ E' .E , ],[ E .E1aE 0, / 1 ],[ E .b , / 1]} GOTO( A 0 ,E ) = V1 ( E ) = A1 = {[ E' E ., ], [ E E .1aE 0, / 1 ]} GOTO( A 0 ,b ) = V1 ( b ) = A 2 = {[ E b., / 1]} GOTO( A1 ,1 ) = V1( E1 ) = A 3 = {[ E E1.aE 0, / 1]} GOTO( A 3 ,a ) = V1 ( E1a ) = A 4 = {[ E E1a.E 0, / 1],[ E .E1aE 0,0 / 1],[ E .b ,0 / 1]} GOTO( A 4 ,E ) = V1 ( E1aE ) = A 5 = {[E E1aE .0 , 1][E E .1aE 0 ,0 1]} , GOTO( A 4 ,b ) = V1 ( E1ab ) = A 6 = {[ E b.,0 / 1]} GOTO( A 5 ,0 ) = V1 ( E1aE 0 ) = A 7 = {[ E E1aE 0., / 1]} GOTO( A 5 ,1 ) = V1 ( E1aE1 ) = A 8 = {[ E E1.aE 0,0 / 1]} GOTO( A 8 ,a ) = V1 ( E1aE1a ) = A 9 = {[ E E1a.E 0 ,0 / 1],[ E .E1aE 0,0 / 1],[ E .b ,0 / 1]} . GOTO( A 9 ,E ) = V1 ( E1aE1aE ) = A10 = {[ E E1aE .0,0 / 1 ],[ E E .1aE 0,0 / 1 ]} GOTO( A 9 ,b ) = A 6 GOTO( A10 ,0 ) = V1 ( E1aE1aE 0 ) = A11 = {[ E E1aE 0.,0 / 1]} GOTO( A10 ,1 ) = A 8

Colecia canonic este S = { A 0 ,A1 ,...,A11 } . b) Mulimea A 0 este consistent deoarece nu conine linii de forma [ A .,u ] . Mulimea A1 = {[ E' E ., ],[ E E .1aE 0 , / 1 ]} conine linii de ambele forme. Deoarece u = , 2 = 1aE 0 ,v { ,1 },EFF1 ( 1aE 0 ) = { 1 } , EFF1 ( 1aE 01 ) = { 1 } i

{1 } rezult c aceast linie este consistent.


La fel se arat c toate liniile sunt consistente i deci gramatica este LR( 1 ) .
2. a)

E E T

)
=

+
=

>

>

>

Automate, limbaje i compilatoare

76

F a

> > > < < < < <


<, =
,=

> > > <

> > >

> > >

) ( + * $
< <

<
=

< < <

< < < <

<

b) Condiia (1) din definiia 1.40 este satisfcut. Verificm condiia (2). Considerm produciile E E + T , E +T i E T ; deoarece nu exist relaii de preceden ntre E i E i nici ntre + i E rezult c este satisfcut condiia (2). Considerm acum produciile T T * F i T F ; deoarece nu exist relaii de preceden ntre * i T, condiia (2) este din nou verificat. Deoarece nu mai sunt reguli care s aib ca sufix al prii drepte partea dreapt a unei alte reguli, nseamn c gramatica este de preceden slab.

Rezumat: S-au definit gramaticile LR i cele de preceden, s-au dat o

metod de verificare c o gramatic este LR i un algoritm de construire a relaiilor de preceden.

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar

Calcularea relaiilor de preceden simpl


Teme Laborator/Seminar 1. S se scrie un program care s calculeze relaiile de preceden simpl

Automate, limbaje i compilatoare

77

Rezumat: Se calculeaz relaiile de preceden Wirth-Weber

Automate, limbaje i compilatoare

78

Notaii

Automate, limbaje i compilatoare

79

Automate, limbaje i compilatoare

80

Curs 6

II. PROIECTAREA COMPILATOARELOR


Curs 6 Teoria traducerii. Analiza lexical
Descriere General

Durata:

2 ore

Se analizeaz metode de traducere a limbajelor i se prezint principiile de realizare a analizei lexicale.


Obiective

cunoaterea etapelor ce trebuie parcurse n vederea proiectrii unui

compilator - cunoaterea principalelor tehnici de traducere a limbajelor - nsuirea metodologiei de proiectare a unui analizor lexical

Cuprins

II.1.1. Structura unui compilator II.1.2. Traductoare II.1.2.1 Scheme de traducere orientate de sintax II.1.2.2. Traductoare finite II.1.2.3. Traductoare pushdown II.2. Analiza lexical II. 2.1. Generaliti II. 2.2. Proiectarea unui analizor lexical

Coninut Curs

II. 1. TEORIA TRADUCERII II.1.1. Structura unui compilator


Compilatorul traduce un program scris n limbaj de nivel nalt (FORTRAN, PASCAL, C, C++, JAVA, etc.) n limbaj main. Deci un compilator primete la intrare un program surs i furnizeaz la
Automate, limbaje i compilatoare

81

ieire un program obiect echivalent (executabil, translatabil, limbaj main, etc.) i un fiier de erori. Traducerea programelor surs n program obiect se face n mai multe faze, aa cum rezult din figura 1.1.
Schema general a unui compilator

Figura 1.1 1. Analiza lexical grupeaz caracterele programului n subiruri, numite atomi lexicali, care reprezint : cuvinte cheie, operatori, constante, identificatori. De exemplu, n instruciunea de atribuire
valfin := valinit + ratia 60

(1)

analiza lexical depisteaz urmtorii atomi lexicali: - identificatorul valfin - simbolul de atribuire : = - identificatorul valinit - operatorul de adunare + - identificatorul raia - operatorul de multiplicare - constanta numeric 60. Spaiile ce separ atomii lexicali sunt eliminate n timpul analizei lexicale. Vom utiliza
id1 ,id 2 i id 3 pentru valfin, valinit i raia, respectiv, pentru a

sublinia c reprezentarea intern a unui identificator este diferit de secvena de rolului fiecrei caractere ce formeaz identificatorul. Reprezentarea intern a instruciunii (1) etape de dup analiza lexical este :
realizare a unui

Explicarea

Automate, limbaje i compilatoare

82

id1 := id 2 + id 3 60.

compilator

2. Analiza sintactic. irul de atomi lexicali este preluat de analiza sintactic; ea depisteaz n irul atomilor lexicali structuri sintactice ca: expresii, liste, instruciuni, proceduri, plasndu-le n arborele sintactic (figura 1.2) ce descrie relaiile de incluziune a structurilor sintactice unele n altele:

Figura 1.2 3. Analiza semantic. Scopul analizei semantice este de a mbogi arborele sintactic prin inserarea de informaii suplimentare n tabela de simboluri i de a conduce generarea codului intermediar. O component important a analizei semantice este verificarea tipurilor. Reprezentarea intern a unui numr real este n general diferit de cea a unui numr ntreg chiar dac ele au aceeai valoare. Presupunem, de exemplu, c toi identificatorii din figura 1.3 au fost declarai reali. Operaia se aplic unui numr real raia i unui numr ntreg 60; are loc conversia tipului ntreg la real. Aceasta se realizeaz prin inserarea unui nod suplimentar int-in-real.

Figura 1.3

Automate, limbaje i compilatoare

83

4. Generarea codului intermediar. Codul intermediar este de obicei, un ir de instruciuni simple cu format fix. Operaiile lor se apropie de operaiile calculatorului, iar ordinea lor respect ordinea execuiei. Operanzii instruciunilor sunt ns variabile din program sau introduse de compilator i nu regitri ai calculatorului. De exemplu, arborele semantic din figura 1.3 se traduce n:
t1 := int - in - real( 60 ) t 2 := id 3 t1 t 3 := id 2 + t 2 id1 := t 3 .

5. Optimizarea codului. n faza de optimizare de cod se elimin redundanele, calculele i variabilele inutile, pentru a realiza o execuie mai eficient:
t1 := id 3 * 60.0 id1 := id 2 + t1 .

6. Generarea codului. n aceast faz se selecteaz locaiile de memorie pentru fiecare variabil din program i se translateaz codul intermediar ntr-o secven de instruciuni main. Un aspect important const n alocarea de regiti pentru variabile:
MOV id 3 ,r2 MUL # 60.0, r2
MOV id 2 ,r1

ADD
MOV

r2,r1
r1,id 1

7. Gestiunea tabelei de simboluri. O funcie esenial a compilatorului este de a nregistra identificatorii utilizai n programul surs i de a colecta informaii despre diferitele atribute asociate variabilelor. Atributele furnizeaz informaii despre memoria alocat pentru un identificator, tipul su, numrul i tipul parametrilor unei proceduri, modul de transmitere a fiecrui argument. O tabel de simboluri este o structur de date coninnd o nregistrare pentru fiecare identificator, cu cmpuri pentru atribute.

Automate, limbaje i compilatoare

84

Tabela de simboluri 1 2 3 4 8. Tratarea erorilor este o colecie de proceduri ce sunt activate ori de cte ori se depisteaz o greeal n program. n acest caz utilizatorul trebuie s primeasc un mesaj de eroare iar compilarea s continuie mcar cu faza de analiz sintactic (n cadrul programului greit ) pentru a detecta i alte eventuale erori. Valfin Valinit Raia ........ ....... .......

II.1.2. Traductoare
Aa cum am precizat anterior, rolul compilatorului este de a traduce programul surs n program obiect. Traducerea se face n mai multe faze: analiza lexical, analiza sintactic, etc., fiecare faz fiind la rndul su o traducere. Exist mai multe niveluri la care poate fi abordat traducerea. Cel mai general ea este o funcie f : * * , unde este alfabetul de intrare iar este alfabetul de ieire. Deci, traducerea este o submulime T * * ; dac (x , y ) T , atunci y este traducerea lui x .
II.1.2.1 Scheme de traducere orientate de sintax Definiia 1.1. O schem de traducere orientat de sintax (STOS) este un

5-tuplu S = (N, , , R, S ) , unde : - N este mulimea neterminalelor, - este alfabetul de intrare , - este alfabetul de ieire, - R este o mulime de reguli de forma A , unde (N )* , (N )* iar neterminalele din sunt (eventual) o permutare a celor din , - S este un neterminal avnd rolul de simbol iniial.
Definiia schemei de traducere

Toate mulimile de mai sus se presupun a fi finite. Fie A , o regul; fiecare neterminal din este asociat cu unul identic din . Dac un neterminal
Automate, limbaje i compilatoare

85

B apare de mai multe ori n i vom folosi indici superiori pentru a pune n
eviden asocierea. De exemplu, n regula A B ( 1 )CB ( 2 ) , B ( 2 ) B ( 1 )C , B ( 1 ) este asociat cu B ( 1 ) , B ( 2 ) cu B ( 2 ) si C cu C .
Definiia 1.2. Numim form de traducere n STOS S = (N, , ,R, S ) o

pereche ( u ,v ) ( N )* ( N )* obinut conform regulilor: (1) ( S , S ) este o form de traducere, n care cele dou neterminale S sunt asociate; (2) dac ( A ,1 A1 ) este o form de traducere n care cele dou simboluri A sunt asociate i ( A , 1 ) R , atunci ( , 1 1 1 ) este o form de traducere. Neterminalele din 1 i sunt asociate exact ca n regul, iar cele din i traducere. sunt asociate cu cele din 1 i 1 exact ca n vechea form de

Pentru a defini relaia dintre cele dou forme de traducere vom scrie:
( A , 1 A1 ) ( , 1 1 1 ) .
S

Vom utiliza notaiile: , i pentru nchiderea tranzitiv, nchiderea


S S S

reflexiv i tranzitiv i respectiv derivarea n k pai. Dac nu exist pericol de confuzie, nu vom mai specifica schema de traducere S . Traducerea definit de STOS S este

* (S) = ( x , y ) /( S , S ) ( x , y ),x * si y * .

Traducerea realizat de schema

Definiia 1.3. Fie S = (N, , ,R, S ) o STOS. Gramatica Gi = ( N , , Pi , S )

unde Pi = {( A ( A , ) R} se numete gramatica de intrare a schemei S.. Gramatica Ge = ( N , , Pe , S ) unde Pe = {( A ( A , ) R} se numete gramatica de ieire a schemei S .
Schema de traducere orientat de sintax poate fi privit ca o metod de transformare a arborilor de derivare din gramatica Gi n arbori de derivare din gramatica Ge .
Algoritmul 1.1. - de transformare a arborilor

Automate, limbaje i compilatoare

86

Intrare: o STOS S = (N, , , R, S ) cu gramatica de intrare Gi = ( N , , Pi , S ) ,


gramatica de ieire Ge = ( N , , Pe , S ) i arborele de derivare D n Gi cu frontiera Relatia dintre

x * .
Ieire: un arbore de derivare D' n Ge cu frontiera y * astfel nct ( x , y ) ( S ) . Metoda:
(P1) Aplic pasul (P2), recursiv, ncepnd cu nodul rdcin al lui D. (P2) Fie q nodul cruia i se aplic acest pas. Presupunem c q este nod interior i are ca descendeni nodurile q1 ,...., qk : (a) terge descendenii direci ai lui q care sunt noduri maximale (etichetate cu

scheme i gramatici

sau cu terminale).
(b) Fie A producia din Gi reprezentat de nodul q i descendenii si; A este eticheta lui q iar este o secven format prin concatenarea etichetelor nodurilor q1 ,...., qk . Fie ( A , ) R ; permut neterminalele din n ordinea dat de , subarborii dominai de aceste noduri rmnnd neschimbai. (c) Insereaz noduri maximale cu etichete din n ordinea dat de . (d) Aplic pasul (P2) descendenilor direci ai lui q care sunt noduri nemaximale, n ordinea de la stnga la dreapta. (P3) Subarborele rezultat este ' .
Definiia 1.4. O STOS S = ( N , , , R, S ) astfel nct n fiecare regul

A , neterminalele asociate apar n aceeai ordine n i se numete schem simpl de traducere orientat de sintax (SSTOS).

II.1.2.2. Traductoare finite

Traductoarele finite sunt automate finite nzestrate cu ieiri. Un traductor finit, pornind dintr-o stare dat trece n alt stare i emite o secven pe un alfabet de ieire cnd primete un simbol de intrare sau simbolul vid (notat ).
Definiia 1.5. Un traductor finit F este un 6-tuplu (Q , , , ,q0 , F ) unde

- Q este mulimea strilor, Automate, limbaje i compilatoare


87

- este alfabetul de intrare, - este alfabetul de ieire, - este funcia de transfer; : Q ( {}) P f Q * unde P f nseamn mulimea prilor finite, - q0 Q este starea iniial, - F Q este mulimea strilor finale. Toate mulimile de mai sus sunt finite.
Definiia 1.6. Numim configuraie a traductorului finit F un triplet

Definiia traductorului finit

(q , x , y ) unde :
- q este starea curent, - x este poriunea din secvena de intrare rmas de citit, - y este secvena emis pe banda de ieire pn n momentul curent.
Definim , relaie binar ntre configuraiile lui F . Pentru

q Q , a { }, x * i y * astfel nct ( r , z ) (q ,a ) cu r Q i z *

scriem Notm cu

(q ,ax ,y )
,

(r ,x ,yz ).
, nchiderea tranzitiv, nchiderea reflexiv i
*

tranzitiv i respectiv trecerea n i pai. Dac pentru x ( {}) exist y * i q F astfel nct (q0 , x , )

Funcionarea traductorului

spunem c y este traducerea lui x i finit notm y = ( x ). Traducerea definit de F notat

(q , , y )

(F) este

{(x , y ) / (q0 ,x , )

(q , ,y ) pentru q F } .
este determinist dac pentru orice

Definiia 1.7. Traductorul finit F

q Q :
*

(1) sau ( q , a ) conine cel mult un element pentru orice a i mulimea vid sau

(q , ) este

(2) ( q , ) conine un element i pentru orice a ,(q , a ) este mulimea vid.


II.1.2.3. Traductoare pushdown

O alt clas important de traductoare o reprezint traductoarele pushdown. Un astfel de traductor este un automat pushdown nzestrat cu o

Automate, limbaje i compilatoare

88

ieire.

8-tuplu Definiia P = ( Q , , , , ,q0 ,Z 0 ,F ) , unde toate simbolurile au aceeai semnificaie ca n traductorului


Definiia 1.8.

Se

numete

traductor

pushdown

un

cazul automatului finit, exceptnd pe care este alfabetul (memoria) pushdown pushdown iar : Q ( {}) P f ( Q * * ) .
Definiia 1.9. Se numete configuraie a lui P un 4-tuplu (q ,x , ,y )

unde - q este starea curent, - x este poriunea din secvena de intrare rmas de citit, - este coninutul memoriei pushdown, - y este secvena emis pe banda de ieire pn n momentul curent.
Dac
( r , ,z ) (q ,a ,Z )

scriem

( q ,ax ,Z ,y )

( r ,x , ,yz )

pentru
Funcionarea

x * , * i y * . Spunem c y este traducerea lui x i scriem y = ( x ) , traductorului dac ( q0 ,x ,Z 0 , ) ( q , , ,y ) pentru q F i * . Traducerea definit de pushdown

P notat (P ) este
y
este

{(x ,y )(q ,x ,Z ,)
0 0

(q , , ,y ) pentru
cu memorie

q F i * .

traducerea

lui

pushdown

vid

dac

(q0 ,x ,Z 0 , )
pushdown

( q , , ,y ) pentru un q Q . Traducerea definit de P cu memoria


vid, notat
q Q} .

( P )

este

{(x , y )(q ,x ,Z , )
0 0

(q , , ,y ) pentru un
Definiia 1.10.

Traductorul pushdown P = ( Q , , , , , q 0 , Z 0 , F )

este determinist dac : (1) pentru orice q Q ,a {} i z , ( q , a , Z ) conine cel mult un element i (2) dac ( q , ,Z ) , atunci ( q ,a ,Z ) = pentru orice a .
La fel ca n cazul automatelor pushdown, are loc echivalena din
Teorema 1.1. Traducerea
+

este realizat de traductorul pushdown P1

dac i numai dac ea este realizat de un traductor pushdown P2 cu memoria

Automate, limbaje i compilatoare

89

pushdown vid.
Teoremele urmtoare arat c traductoarele pushdown caracterizeaz clasa schemelor simple de traducere orientate de sintax n aceeai manier n care automatele pushdowm caracterizez limbajele independente de context.
Teorema 1.2. Pentru orice SSTOS exist un traductor pushdown P

astfel nct (S )= ( P ) Demonstraie. Fie S = ( N , , ,R ,S ) o SSTOS. Vom avea nevoie s facem


distincie ntre simbolurile lui i cele ale lui . De aceea vom nlocui cu un alfabet ' astfel nct ' = . ' conine un nou simbol a' pentru fiecare
a . Fie h homomorfismul definit prin h( a ) = a' pentru a i P
= ({q}, , N ' , ' , , q , S , ) unde funcia

este definit astfel:

(1) dac ( A x0 B1 x1 ...Bk xk ,y0 B1 y1 ...Bk yk ) R cu k 0, xi * , yi ' * , Bi N

atunci (q , , A) conine pe (q,x 0 h( y0 )B1 x1h( y1 )...Bk xk h( yk ), ) (2) (q , a , a ) = {(q , , )} pentru orice a (3) (q , , a' ) = {(q , , a )} pentru orice a . Se arat, prin inducie dup m i n , c pentru orice A N i m , n 1( A,A) ( x ,y ) pentru un anumit m dac i numai dac (q ,x ,A, )
*

Teoremele 1.2 i 1.3 echivaleaz schemele de traducere cu traducatoare pushdown

(q , , ,y )

pentru un anumit n .

Lund A = S avem (S ,S ) ( x ,y ) dac i numai dac (q ,x ,S , ) deci (P ) = (S ) .

(q , , ,y ) ,

Teorema 1.3. Fie P = (Q, , , , , q0 , Z 0 , F ) un traductor pushdown .

Atunci exist o SSTOS S astfel nct (S ) = (P ) . Demonstraie. Construcia este similar cu cea a obinerii unei gramatici

independente de context dintr-un automat pushdown. Fie S (1) N = {[ pAq ] / p , q Q , A } {S } (2) R este definit astfel

= (N ,,,R,S ) unde

(a) dac (r ,x1 x2 ...xk ,y ) ( p ,a ,A) atunci, pentru k > 0, R conine regulile

[ pAq] a[rx1q1 ][q1 x2 q2 ]...[qk 1 xk qk ],y[rx1q1 ][q1 x2 q2 ]...[qk 1 xk qk ] q1 ,q2 ,...,qk Q i q = q k . Pentru k = 0 regula este [ pAr ] a ,y
Automate, limbaje i compilatoare
90

pentru

orice

, (b) pentru orice q Q ,R conine regula S [q0 Z 0 q ][q0 Z 0 q ]

Prin inducie dup m i n se arat c dac

([ pAq][ pAq])( x ,y ) ,

dac i numai

( p ,x ,A, )

(q , , ,y )
+

pentru orice

p ,q Q i A . Apoi avem

(S ,S ) ([q0 Z 0 q ],[q0 Z 0 q ]) (x ,y ) dac i numai dac (q0 ,x ,Z 0 , ) (S ) = ( P) .


Teorema 1.4. Dac S

(q , , ,y ) deci

este o SSTOS atunci t (S ) dac i numai

dac exist un traductor pushdown P astfel nct t (P ) . Demonstraie. Rezult din teoremele 1.17, 1.18 i 1.19.

II.2. ANALIZA LEXICAL II. 2.1. Generaliti


Analiza lexical este prima faz a compilrii, rolul su fiind de a citi caracterele de intrare i a produce la ieire o secven de atomi lexicali (tokens , n englez ) utilizai apoi n analiza sintactic. Un atom lexical este un reprezentant al unei clase de iruri de caractere cu reguli precise de formare. n majoritatea limbajelor de programare, urmtoarele construcii sunt tratate ca atomi lexicali: identificatori, constante, cuvinte cheie, operatori, iruri de caractere, semne de punctuaie ( paranteze, virgul, punct i virgul, etc. ), etc. Sarcina analizei lexicale este s selecteze n irul de caractere al programului surs subiruri ce respect regulile de formare a atomilor lexicali, s clasifice aceste subiruri i s le traduc n atomi lexicali. Un atom lexical va fi reprezentat printr-o pereche < clasa atomului, valoarea sa >. Pentru atomii care au o valoare particular nu vom mai folosi perechea, ci vom pune n eviden numai valoarea. De exemplu, pentru instruciunea COST= (PRE+TAXA) 0.45 se pun n evidena urmtorii atomi lexicali <id, COST> ; = ; ( ; < id, PRE > ; + ; < id , TAXA > ; ) ; ; 0.45 Analiza lexical trebuie s furnizeze informaii mai detaliate care servesc i n alte scopuri; acestea sunt colectate n atributele asociate. n general exist un
Automate, limbaje i compilatoare

91

singur atribut - un pointer spre tabela de simboluri unde se afl depus valoarea atomului. Analiza lexical poate fi implementat ca o faz separat sau se poate ntreptrunde cu analiza sintactic. Separarea celor dou faze are urmtoarele avantaje : - proiectarea este mai simpl, conform principiului modularitii ; - sintaxa atomilor lexicali poate fi exprimat printr-o gramatic regulat; deci analiza lexical poate fi efectuat de un automat finit i nu de unul pushdown, ca n cazul analizei sintactice ; - analiza lexical cur textul de informaiile inutile: comentarii, blancuri. Analizorul lexical poate fi comandat de cel sintactic; n acest caz el apare ca o rutin a analizorului sintactic pe care acesta o apeleaz ori de cte ori are nevoie de un nou simbol.

II. 2.2. Proiectarea unui analizor lexical


n cazul unui analizor lexical complex, acesta va fi descompus n buci ce vor fi legate ntre ele n vederea obinerii rezultatului final. Exemplificm cele spuse mai sus folosind urmtoarea gramatic:
(G0 )

(1) <ir atomi>:=<atom>/<ir atomi><atom> (2) <atom>:=<id>/<const>/<op>/<del>/<com> (3) <id> :=<lit>/<id><lit>/<id><cif> (4) <const>:=<cif>/<const><cif> (5) <op>:=+/*/</<=/>/>=/=/<> (6) <del>:=;/blanc (7) <com>:=*/<orice ir ce nu conine grupul */>*/ (8) <lit>:=A/B/C/..../Z/a/...../z (9) <cif>:=0/1/.../9 Gramatica ( G0 ) nu este regulat, dar poate fi transformat n una regulat
Structura atomilor lexicali

rescriind produciile. De exemplu, producia (4) se poate scrie <const>=0/1/2/.../9/<const>0/<const>1/.../<const>9. Pentru a uura proiectarea analizorului lexical, se prefer stratificarea gramaticii
( G0 ) ntr-o ierarhie de gramatici mai simple, regulate, care apoi trebuie cuplate

astfel nct limbajul generat s rmn acelai. Stratificarea ncepe cu partiionarea mulimii neterminalelor i stabilirea unei ierarhii ntre elementele partiiei. n cazul nostru putem realiza urmtoarea partiie:

Automate, limbaje i compilatoare

92

N 2 = {< id > ,< const > ,< op > ,< del > ,< com >} N 3 = {< lit > ,< cif >}

N1 = {< sir atomi > ,< atom >}

Cu ajutorul acestei partiii, descompunem gramatica (G0 ) n trei gramatici; pentru fiecare gramatic vom considera ca terminale, pe lng terminalele din
( G0 ) , i neterminalele din grupul imediat inferior n ierarhie. Cele trei gramatici

vor fi :
(G1 ):< sir atomi >:=< atom > / < sir atomi >< atom > < atom >:= id/const/op/del/com (G21 ):< id >= lit/ < id > lit/ < id > cif (G22 ):< const >:= cif/ < const > cif (G23 ):< op >:= + / / < / <= / > / >= / = / <>
(G24 ):< del >:=; /blanc (G 25 ):< com >:= */ < orice sir de caractere ce nu contine grupul * / > */
Proiectarea unui analizor lexical prin stratificarea gramaticii

(G31 ):< lit >:= A/B/.../Z/a/.../z (G32 ):< cif >:= 0/1/.../9

Noile gramatici sunt regulate, cu excepia lui G1 i G 25 . Le putem, ns, transforma, la fel cum am transformat anterior producia (4). Fiecare gramatic va fi modelat printr-un automat finit; fiecare automat de pe un nivel inferior trebuie s transmit nivelului superior informaia de acceptare a irului inspectat. Cuplarea automatelor A1 ,A2 i A3 se face n serie, ieirea unuia fiind intrare pentru cellalt. Automatele ce se cupleaz trebuie s satisfac urmtoarele condiii: - s fie deterministe; - orice simbol primit la intrarea unui automat i care nu activeaz nici o tranziie trebuie s conduc la o situaie de eroare. n cazul nostru nedeterminismul apare n cazul automatului A2 i se manifest prin existena a dou tranziii din starea iniial pentru simbolul

. n diagrama

ce o vom prezenta mai trziu vom nltura acest nedeterminism. Diagramele de tranziii ale automatelor se vor completa cu proceduri semantice, care au ca scop restabilirea la sfritul analizei unui atom lexical a unui context adecvat cutrii urmtorului atom, emiterea unei ieiri corecte care s reprezinte atomul analizat i semnalarea erorilor.

Automate, limbaje i compilatoare

93

n figura urmatoare este prezentat diagrama de tranziii a automatului A3 completat cu procedurile semantice CITCAR i IESCAR.

Procedura CITCAR este apelat nainte de nceputul funcionrii automatului i are rolul de a prelua din fiierul de intrare caracterul urmtor. Procedura IESCAR furnizeaz ieirea automatului A3 ; ea este format din clasa caracterului i caracterul propriu-zis. n figura urmatoarese prezint diagrama de tranziii a automatului A2 completat cu procedurile AD, CARNOU i IEIRE.

Automate, limbaje i compilatoare

94

Procedura AD

este folosit pentru construcia identificatorilor i

constantelor. Ea adaug ntr-un tablou de caractere (ir) caracterul primit la intrare. Tabloul acumuleaz toate caracterele identificatorului sau constantei analizate. CARNOU simuleaz intrarea automatului aducnd urmtorul caracter din textul surs, dar clasificndu-l conform automatului A3 . Procedura IEIRE formeaz ieirea automatului A2 , alctuit din clasa automatului i atomul lexical. n mod similar se proiecteaza diagrama de tranziie a automatului A1 completat cu procedurile semantice CAUTID, CAUTNR, SELECT. La fel ca n majoritatea limbajelor de programare, comentariile i blancurile sunt eliminate. Procedura CAUTID caut n tabela de simboluri identificatorul din tabloul ir i dac nu-l gsete l introduce. Ea ntoarce adresa la care se gsete identificatorul, completnd cu ea a doua informaie din atomul lexical. Dac identificatorul este cuvnt cheie, se nlocuiete clasa atomului cu numele cuvntului cheie iar a doua component se omite. Procedura CAUTNR determin valoarea constantei numerice din tabloul ir i caut n tabela de simboluri dac exist o constant cu aceeai valoare. Dac nu o gsete, valoarea din ir este plasat n tabel. Procedura determin adresa intrrii corespunztoare constantei i memoreaz adresa n atomul lexical. Procedura SELECT discerne blancul de ; .

Automate, limbaje i compilatoare

95

Teme Curs Teste Autoevaluare 1. Care este deosebirea dintre analiza sintactic i cea semantic?

................................................ 1 punct
2.

Fie STOS S = ({E}{+ ,,a}{+ ,,a},R ,E ) unde R este mulimea de reguli: , ,


E E(1) + E( 2 ) , E(1)E( 2 ) + E E(1) E( 2 ) , E(1)E( 2 ) E a, a

S se gseasc traducerea secvenei a + a a .... 2.5 puncte


3.

Considerm STOS S = ({S ,A}{0 , }{a ,b},R,S ) unde R este format din , 1, regulile
S 0 AS ,SAa A 0SA,ASa S 1,b A 1,b

Folosind algoritmul de transformare a arborilor, s se gseasc traducerea secvenei 00111 ..............................................2.5 puncte
4. Fie traductorul pushdown P = ({q}{a ,+ ,}{+ ,,E}{a ,+ ,}, ,q ,E ,{q}) unde , , ,

funcia de transfer este definit astfel:


(q ,a ,E ) = {(q , ,a )} (q ,+ ,E ) = {(q ,EE + , )}
(q ,,E ) = {(q ,EE, )} (q , ,+ ) = {(q , ,+ )} (q , ,) = {(q , ,)}

Care este traducerea secvenei + aaa ?.......... ..2.5 puncte


5. Este mai avantajos ca analiza lexical s fie separat de cea sintactic?

..................................................0.5 puncte Oficiu... 1 punct

Automate, limbaje i compilatoare

96

Rspunsuri 1. Analiza semantic extinde arborele construit n analiza sintactic 2. Avem derivarea:
( E ,E ) ( E(1 ) + E( 2 ) , E(1 )E( 2 ) + ) ( E(1 ) + E( 3 ) E( 4 ) , E(1 )E( 3 )E( 4 ) + ) ( a + E ( 3 ) E ( 4 ) , aE ( 3 ) E ( 4 ) + ) ( a + a E ( 4 ) , aaE ( 4 ) + ) ( a + a a , aaa + ),

deci ( a + a a ) = aaa +
3. ( 00111 ) = bbbaa 4. Traducerea secvenei + aaa se desfoar astfel

(q ,+ aaa ,E , )

(q , aaa ,EE + , ) (q ,aaa ,EE E + , ) (q ,aa ,E E + ,a ) (q ,a , E + ,aa ) (q ,a ,E + ,aa ) (q , ,+ ,aa a ) (q , , ,aa a + ) .

Deci, traducerea , cu memoria pushdown vid , a secvenei + aaa este


aa a +
5. DA Rezumat: S-au prezentat etapele ce trebuie parcurse n vederea proiectrii

unui compilator, apoi metode de traducere a limbajelor. n partea a doua sa explicat modul de efectuare a analizei lexicale.

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar Automate, limbaje i compilatoare

97

Realizarea unor analizoare lexicale, ca prim etap a construirii unui compilator


Teme Laborator/Seminar

1. Proiectai un analizor lexical care s recunoasc constantele aritmetice i alfanumerice cuprinse ntre ghilimele. 2. Proiectai un analizor lexical care s recunoasc identificatorii i cuvintele cheie
Rezumat: Se proiecteaz analizoare lexicale care s recunoasc elementele

de baz ale unui limbaj de programare.

Automate, limbaje i compilatoare

98

Notaii

Automate, limbaje i compilatoare

99

Automate, limbaje i compilatoare

100

Curs 7 Analiza sintactic (I)


Descriere General Se prezint pricipiile de funcionare ale analizei lexicale de tip ascendent i descendent, apoi se dau algoritmi generali de analiz sintactic Obiective - nsuirea principiilor de funcionare ale analizei sintactice - cunoaterea principalilor algoritmi de analiz sintactic, ce funcioneaz pe baza backtrackingului

Curs 7 Durata: 2 ore

Cuprins II.3.1. Formularea problemei II.3.2. Algoritmi generali de analiz sintactic II.3.2.1. Analiz sintactic descendent II.3.2.2. Analiza sintactic ascendent II.3.2.3. Algoritmul Cocke -Younger Kasami (CYK)

Coninut Curs

II.3.1.
Fie

Formularea problemei
G = ( N , ,P ,S ) o gramatic independent de context (GIC) i

L( G ) ; spunem c a fost efectuat analiza sintactic a secvenei dac a


fost gsit cel puin un arbore generator pentru

. Se lucreaz cu analiz

Definirea

sintactic la stnga sau la dreapta. Presupunem c gramatica G are produciile numerotate de la 1 la p i , (N )* . Scriem

dac se folosete analizei producia cu numrul i iar neterminalul care deriveaz este cel mai din stnga. sintactice
Similar scriem astfel : (1) dac (2) dac

dac se folosete producia

cu numrul i iar

neterminalul care deriveaz este cel mai din dreapta. Aceste notaii se extind

atunci

. Dac = i1i2 ...in , notm

atunci

Automate, limbaje i compilatoare

101

~ = inin1 ....i1 . Dac


*

L( G ) , se numete analiz sintactic la stnga o


. Se numete analiz sintactic la

1 secven { , 2, ..., p} astfel nct S

~ 1 dreapta a cuvntului , o secven { ,2,..., p}* astfel nct S

Exemplul 3.1 Fie G = ({E , T , F }, {a , + , * ,( , )}, { , 2 , 3, 4 , 5, 6}, E ) 1

1. E E + T 2. E T 3. T T * F i = a + a . E La fel E E+T E+T Avem T+T E+F

4. T F 5. F ( E ) 6. F a F+T E+a a+T T+a a+F F+a a+a a+a

deci analiza sintactic la stnga este = 124646 . deci analiza sintactic la dreapta este ~ = 642641 . Dispozitivele care furnizeaz analiza sintactic la stnga se numesc descendente (top - down), datorit modului n care construiesc arborele de derivare - de la rdcin spre nodurile maximale. Analizorii sintactici la dreapta se numesc ascendeni (bottom-up), arborele fiind construit ncepnd cu nodurile maximale i efectund reduceri pn se obine nodul rdcin.

II.3.2. Algoritmi generali de analiz sintactic


Se pot construi scheme de traducere orientate de sintax sau traductoare pushdown pentru a efectua analiza sintactic. Aceste dispozitive funcioneaz, ns, nedeterminist, ceea ce impune utilizarea backtracking-ului pentru a putea continua analiza n caz de blocaj. De aceea vom prezenta algoritmi care au backtracking-ul implementat sau vom utiliza gramatici care permit efectuarea analizei sintactice n mod determinist.
II.3.2.1. Analiz sintactic descendent

Operaiile ce trebuie efectuate de un analizor sintactic bazat pe modelul traductorului pushdown nedeterminist sunt: nlocuirea unui neterminal A din vrful stivei cu un ir ce reprezint o parte dreapt a A-produciilor gramaticii i tergerea unui terminal din vrful stivei n cazul n care el coincide

Automate, limbaje i compilatoare

102

cu terminalul curent de la intrare, urmat de avansul cu o poziie la dreapta pe banda de intrare. Deci, un astfel de analizor sintactic va propune pentru fiecare neterminal alternative de rescriere a lui, operaie numit expandare. Fiecare alternativ va reprezenta o structur posibil pentru urmtoarele simboluri de intrare. Dac structura nu este regsit n irul de intrare, analizorul trebuie s Principiul propun o alt alternativ. Modelul de analizor prezentat anterior nu ncearc analizei urmtoarea alternativ de expandare; vom prezenta mai trziu un analizor care are aceast proprietate. Pentru a prezenta principiul analizei sintactice cu reveniri s considerm urmtoarea gramatic
G = (N , ,P ,S ) , P = {S aAd / aB , A b / c ,B ccd / ddc} i fie accd
descendente

cuvntul de analizat . Se pornete cu simbolul iniial ca nod rdcin , se alege prima alternativ pentru S i prima alternativ pentru A . Deoarece secvena generat nu se regsete n irul de intrare se alege urmtoarea alternativ pentru A . Nici de data aceasta, secvena generat nu se regsete n cea de intrare; deoarece nu mai sunt alternative pentru A , se alege urmtoarea alternativ pentru S pentru B . Algoritmul pe care-l prezentm utilizeaz dou benzi pushdown ( B1 i
B2 ) i un indicator pe banda de intrare, ce precizeaz poziia curent.

i apoi prima

Algoritmul 3.1

Intrare: o GIC, fr recursie stng

G = ( N , ,P ,S ) i un cuvnt de

intrare

w = a1a2 ...an ,n 0 . Presupunem c produciile sunt numerotate cu

1,2,...,p .
Ieire : analiza sintactic la stnga a lui w, dac aceasta exist; n caz contrar se

afiaz ,, eroare.
Metoda.

Pentru fiecare neterminal A , dac A 1 / 2 ... / k


Ai

sunt toate A -

produciile, se noteaz cu (a)

alternativa

A i . Algoritmul utilizeaz

configuraii de forma (s , i , , ) unde s este starea algoritmului i poate lua una din valorile
q - n cazul funcionrii normale b - n cazul relurii derivaiei (backtracking )

Automate, limbaje i compilatoare

103

- n cazul configuraiei de terminare

Algoritm de analiz descendent bazat pe

(b) (c)

i { , 2 , ..., n + 1} este poziia curent pe banda de intrare; al n + 1 - lea 1

simbol de intrare este $, folosit pe post de delimitator la dreapta. spre dreapta, ce nregistreaz alternativele ncercate i simbolurile de intrare verificate. (d)
(N

( {Ai })* reprezint coninutul benzii pushdown B1 , band cu vrful backtracking

} )*

reprezint coninutul benzii pushdown B2 , band

cu vrful spre stnga. Simbolul din vrf reprezint nodul activ al arborelui de derivare. Configuraia iniial este (q ,1, ,S $ ) , unde S este simbolul iniial al gramaticii. Trecerea de la o configuraie la alta se face conform urmtorilor pai: Pasul 1 . expandare unde

(q , i , , A) (q , i , A1 , 1) ( A 1 ) P i 1 este prima alternativ pentru

A . Acest pas corespunde

extinderii arborelui parial de derivare utiliznd prima alternativ pentru neterminalul cel mai din stnga din arbore. Pasul 2 . Concordan ntre simbolul de intrare i cel derivat

(q , i , , a)

(q , i + 1, a , )

Se efectueaz cnd ai = a , 1 i n i const n mutarea simbolului terminal din vrful benzii B2 n vrful benzii B1 i mutarea indicatorului pe banda de intrare. Pasul 3 . Obinerea unei configuraii de acceptare

(q , n + 1, , $ )

(t , n + 1, , )

Ajungerea n aceast configuraie spune c a fost epuizat banda de intrare i a fost gsit un arbore de derivare stng. Acesta este gsit aplicnd homomorfismul
h lui : h( a ) =

pentru orice a

i h( Ai ) = j dac j este producia

( A ) = Ai .
Pasul 4 . Simbolul de intrare nu coincide cu cel derivat

(q , i , , a) (b , i , a , )

(b , i , , a) dac
(b , i 1, , a )

ai a

Pasul 5. ntoarcerea pe banda de intrare cu o poziie


a

Automate, limbaje i compilatoare

104

Pasul 6 . ncercarea alternativei urmtoare

(b, i , A , ) (q ,i , A
j j

j +1

, j +1 )

dac j +1

este a

j +1 - a

alternativ pentru A fr continuare dac i = 1, A = S i exista numai j alternative pentru A ; nu exist arbore de derivare pentru cuvntul de intrare

(b , i , , A ) n caz contrar ; au fost epuizate toate


alternativele pentru A i se renun la expandarea acestui nod . Algoritmul se execut astfel: Pasul 1 : Se pornete cu configuraia iniial i se calculeaz configuraiile succesive
C0
C1

...

Cr

Pasul 2 : Dac ultima configuraie este (t , n + 1, , ) se emite h( ) i algoritmul se oprete , h( ) fiind primul arbore de derivare gsit. Dac C configuraie fr continuare, se emite semnalul eroare . este o

II.3.2.2. Analiza sintactic ascendent

Principiul de funcionare a unui analizor sintactic ascendent cu reveniri este pus n eviden n figura 3.2, utiliznd gramatica cu regulile

S AB ,A ab ,B aba i cuvntul de intrare w = ababa


Se folosete pentru reducere prima regul posibil, A ab . Deoarece nu exist Principiul de nici-o regul de producie care s aib n membrul drept secvena AAa , se funcionare a renun la ultima reducere i se folosete regula B aba ; n final secvena AB se reduce la S .
Algoritmul 3.2
analizei ascendente

Intrare: G = ( N , ,P ,S ) o GIC, fr cicluri (nu conine producii de forma

A ) , fr - producii, cu produciile numerotate de la 1 la p i cuvntul

de intrare w = a1a2 ...an ,n 1 .


Ieire : arborele de derivare la dreapta, dac exist, i ,, eroare n caz contrar . Metoda :

se ordoneaz arbitrar regulile de producie; se lucreaz cu configuraii de forma (s , i , , ) unde

Automate, limbaje i compilatoare

105

a) s reprezint starea algoritmului i poate lua una din valorile - q : pentru funcionare normal, - b : pentru mersul napoi, - t : pentru ncheierea cu succes a analizei; b) c) d)
Algoritm de analiz ascendent backtracking
*

indic simbolul curent de pe banda de intrare; pe poziia n + 1 se afl bazat pe


( N {$}) este coninutul benzii pushdown B1 ( cu vrful spre

simbolul $ dreapta ) i reprezint poriunea n care a fost redus secvena de intrare


{ ,2,..., p , s} reprezint coninutul benzii pushdown B2 ( cu vrful spre 1
*

stnga ); aceast band ine evidena reducerilor efectuate pentru a se obine coninutul lui B1 .

configuraia iniial este (q , ,$, ) . 1

Pasul 1 : ncercare de reducere

(q , i , , )

(q , i , A, j )

unde A este producia cu numrul j . Dac s-a efectuat pasul 1 se rmne la acest pas ; n caz contrar se merge la pasul 2 . Pasul 2 : trecere

(q , i , , )

(q , i + 1, ai , s )

cu condiia i n + 1 ; apoi se merge la pasul 1. Dac i = n + 1 se merge la pasul 3 . Simbolul s de pe banda pushdown B2 arat c a avut loc o trecere a unui simbol de pe banda de intrare pe banda B1 . Pasul 3 : acceptare

(q , n + 1, $ S , )

(t , n + 1, $ S , )

Algoritmul se oprete i se emite h( ) , unde h este homomorfismul definit prin


1 h( s ) = i h( j ) = j pentru j { , 2 , ..., p} .

Dac pasul 3 nu s-a executat se merge la pasul 4. Pasul 4 : nceputul mersului napoi

(q ,n + 1, , )
Pasul 5 : mersul napoi (a) unde

(b , n + 1, , )

cu condiia $ S . Se merge la pasul 5.

(b , i , A, j)

(q , i , ' B , k )

A este producia cu numrul j ; urmtoarea producie, n ordinea


106

Automate, limbaje i compilatoare

stabilit la nceput, al crei membru drept este un sufix al lui este B ' i are numrul k ; n acest caz = ' ' . Dup efectuarea acestui pas se merge la pasul 1. (b)

(b , n + 1, A, j )

(b , n + 1, , )

unde A este producia cu numrul j i nu exist nici-o alt alternativ de reducere pentru (c)

. Apoi, se merge la pasul 5.

(b , i , A, j )

(q , i + 1, ai , s )

cu i n + 1; A este producia cu numrul j i nu exist nici-o alternativ de reducere pentru . Apoi, se merge la pasul 1. (d)

(b , i , a , s )

(b , i 1, , )

Deci, se renun la trecerea lui a pe banda B1 ; suntem cu o poziie n urm pe banda de intrare i rmnem la pasul 5.

II.3.2.3. Algoritmul Cocke -Younger Kasami (CYK)

Acest algoritm face trecerea de la analiza global a lui w = a1a2 ...an la analize locale; timpul de execuie este de ordinul n 3 iar memoria necesar este de ordinul n 2 , unde n este lungimea lui w . Ideea de baz este de a purta pe cuvntul de analizat dou paranteze, una stng notat cu i i alta dreapt notat cu j , n aa fel nct fiecare poriune din w poate fi inclus ntre aceste paranteze i poate constitui obiect de analiz, independent de celelalte poriuni ale cuvntului w . Fiecrei pereche ( i , j ) ce corespunde poriunii ai ........ai + j 1 , i atam o mulime de simboluri neterminale T [i , j ] astfel nct A T [i , j ] dac i numai dac
S

ai ai +1 ...ai + j 1 . Evident, dac S T [1,n] nseamn c

a1a 2 ...a n i deci w L( G ) .

Am pus n eviden dou probleme : a) construcia unei mulimi T [i , j ] ce reprezint structura local a cuvntului
ai ai +1 ...ai + j 1 ;

b) construcia unui algoritm care pentru cuvntul w s genereze o analiz pornind de la structurile locale. Le analizm pe rnd. a) Pentru i = 1,2 ,...,n i j = 1 avem urmtoarele mulimi

Automate, limbaje i compilatoare

107

T [i ,1] = {A / A T [1, j ] = {A / A T [i , j ] = {A / A

ai } iar pentru j > 1 avem a1a2 ...a j } ai ai +1 ...ai + j 1 } an j +1 ...an }

...............................................................
T [n j + 1, j ] = {A / A

Mulimile de mai sus se organizeaz ntr-un tabel astfel


T [1, 1] T [2, 1] ... T [n 1, 1] T [n , 1] T [1, 2] T [2 , 2] ... T [n 1, 2] T = T [1, n 1] T [2 , n 1] T [1, n]
Analiz sintactic de tip local

Algoritmul se aplic pentru gramatici fr - producii i n form normal Chomsky. n acest caz prima linie din tabelul T devine
T [i ,1] = {A / ( A ai ) P}, i = 1, 2, ... n .

Considerm cazul general al liniei j , adic


T [i , j ] = {A / A

ai ai +1 ...ai + j 1 } . Dac ai ai +1 ...ai + j 1 , ai ai +1 ...ai + k 1C

A
exist

ai ai +1 ...ai + j 1 , atunci avem i

A A

BC

adic

un

astfel

nct pentru

BC

ai ai +1 ...ai +k 1ai +k ...ai + j 1 .

Adic,

1 k < j mulimea T [i , j ] poate fi definit n funcie de mulimile deja construite


T [i ,k ] i T [i + k , j k ] ; deci T [i , j ] = {A /( A BC ) P , B T [i , k ] , C T [i + k , j k ]}.

Procedeul descris poate fi uor transpus ntr-un algoritm. b) Dup ce a fost construit tabelul T , analiza sintactic se poate efectua conform urmtorului algoritm
Algoritmul 3.3.

Intrare : o GIC n form normal Chomsky , G = ( N , ,P ,S ) avnd produciile

numerotate de la 1 la p , un cuvnt de intrare w = a1a 2 ...an i tabelul T al mulimilor T [i , j ] .


Ieire : analiza sintactic la stnga a lui w sau mesajul ,, eroare . Metoda:

Se folosete rutina gen(i , j , A) pentru a genera un arbore de derivare

Automate, limbaje i compilatoare

108

stng corespunztor derivaiei A

ai ai +1 ...ai + j 1 . Rutina este definit astfel :


Algoritmul analizei locale

1) Dac j = 1 i a m -a producie din P este A ai , atunci se emite numrul


m.

2) Dac j > 1 i k este cel mai mic numr ntreg, 1 k < j , astfel nct pentru
B T [i , k ] , C T [i + k , j k ] i A BC este producia cu numrul m , atunci se

emite m i se execut gen(i ,k ,B ) i apoi gen(i + k , j k ,C ) . Dac S T [1,n ] se execut gen(1, n , S ) iar dac S T [1, n] se emite mesajul ,,eroare .

Automate, limbaje i compilatoare

109

Teme Curs Teste Autoevaluare 1. Fie gramatica G = ({E , T , F , E' , T ' }, {+ , *, a , ( , )}, E , P ) unde P const din

produciile 1. E TE' 2. E' +TE' 3. E' 4. T FT' 5. T' * FT' 6. T' 7. F a 8. F ( E ) Efectuai analiza sintactic descendent a cuvntului a .. 3 puncte
2. Fie G = ({E , T , F }, {a , + , * ,( , )}, { , 2 , 3, 4 , 5, 6}, E ) 1

1. E E + T 2. E T 3. T T * F

4. T F 5. F ( E ) 6. F a

Se cere analiza sintactic ascendent a cuvntului w = a a .. 3 puncte


3. Considerm gramatica G = (N , ,P ,S ) cu produciile

1 S AA

2. S AS

3. S b 6. A a.

4. A SA 5. A AS

i cuvntul de intrare w = abaab . Se cere a) Tabelul de analiz CYK 1.5 puncte b) Analiza sintactic de tip CYK1.5 puncte Oficiu.1 punct

Automate, limbaje i compilatoare

110

Rspunsuri 1.

(q ,1, ,E $ )

(q ,1,E1 ,TE' $ ) (q ,1,E1T1 ,FT' E' $ )

( cazul 1 ) ( cazul 1 ) ( cazul 1 ) ( cazul 2 ) ( cazul 1 ) ( cazul 4 )

(q ,1,E1T1 F1 ,aT ' E' $ )


(q ,2,E1T1F1a ,T' E' $ )

(q ,2,E1T1F1aT1' ,* FT' E' $ ) (b ,2,E1T1 F1aT1' ,* FT' E' $ )

(q ,2,E1T1F1aT ' 2 ,E' $ )

( cazul 6a ) ( cazul 1 ) ( cazul 4 )

(q ,2,E1T1 F1aT ' 2 E' 2 ,+ TE' $ )


(b ,2,E1T1F1aT ' 2 E1' ,+ TE' $ )

(q ,2,E1T1F1aT '2 E'2 , $ ) ( cazul 6a ) (t ,2,E1T1 F1aT ' 2 E' 2 , ) ( cazul 3 )


Deci, analiza sintactic la stnga a cuvntului a este
h(E1T1 F1 aT ' 2 E' 2 ) = 14763 .

2.

(q ,1,$, )

(q ,2,$ a ,s ) (q ,2,$ F ,6s ) (q ,2,$T ,46s ) (q ,2,$ E ,246s ) (q ,3,$ E*,s 246s ) (q ,4,$ E * a ,ss 246s ) (q ,4,$ E * F ,6ss 246s ) (q ,4,$ E * T ,46ss 246s ) (q ,4,$ E * E ,246ss 246s ) (b ,4,$ E * E ,246ss 246s ) (b ,4,$ E * T ,46ss 246s ) (b ,4,$ E * F ,6ss 246s ) (b ,4,$ E * a ,ss 246s ) (b ,3,$ E*,s 246s )
111

Automate, limbaje i compilatoare

(b ,2,$ E ,246s ) (q ,3,$T*,s 46s ) (q ,4,$T * a ,ss 46s ) (q ,4,$T * F ,6ss 46s ) (q ,4,$T ,36ss 46s ) (q ,4,$ E ,236ss 46s ) (t ,4,$ E ,236ss 46s )
i h( ) = h( 236ss 46s ) = 23646 .
3. a)

A A,S A,S A,S A,S b) Deoarece

S A S A,S

A S A,S

A A,S

S T [1,5] , w L( G ) . Pentru a obine arborele de derivare A T [1,1], A T [2 ,4] i

chemm rutina gen(1,5,S ) . Gsim

(S AA) P . Emitem 1 ( numrul produciei A AA ) i chemm gen(1,1,A) i gen(2 ,4 ,A) . gen(1, ,A) d producia 6 . Deoarece S T [2,1] , A T [3,3] i A SA este 1 1, producia cu numrul 4 , gen(2 ,4 ,A) emite 4 i cheam gen(2 , 5) urmat de gen(3,3,A) . Continund n acest fel se obine 164356263 ; aceste secvene de
ambigu ).

reguli dau un arbore de derivare stng pentru w (notm faptul c gramatica este

Rezumat: S-au prezentat algoritmi generali de analiz sintactic

Lucrari Practice (Laborator/Seminar)

Automate, limbaje i compilatoare

112

Coninut Laborator/Seminar Implementarea unui algoritm de analiz sintactic din cei trei prezentai.
Teme Laborator/Seminar

1. Implementai unul din algoritmii generali de analiz sintactic

Rezumat: implementarea unui algoritm de analiz sintactic

Automate, limbaje i compilatoare

113

Notaii

Automate, limbaje i compilatoare

114

Curs 8 Analiza sintactic (II)


Descriere General

Curs 8 Durata:

2 ore

Se prezinta algoritmi de analiz sintactic determiniti care - iau decizii privind un anumit numr de simboluri spre dreapta i parcurg secvena de analizat o singur dat - funcioneaz pe baza unor relaii ntre simbolurile gramaticii (numite de preceden) care permit determinarea prii reductibile
Obiective

- cunoaterea a trei algoritmi determiniti de analiz sintactic - cunoaterea unor posibiliti de eficientizare a analizei deterministe

Cuprins

II.3.3. Analiza sintactic de tip LL II. 3.4. Analiza sintactic de tip LR II.3.5. Analiza sintactic de tip preceden II. 3.5.1. Analiza sintactic a gramaticilor de preceden simpl II.3.5.2. Analiza sintactic a gramaticilor de preceden slab

Coninut Curs

II.3.3. Analiza sintactic de tip LL


Dm un algoritm de analiz sintactic pentru gramatici de tip LL(k ),k 1 .
Definiia 3.1.

Fie

G = ( N , ,P ,S )

o GIC. Pentru fiecare

A N i L * k definim funciile TA ,L , numite tabele LL(k ) asociate cu A i

L , astfel :
(1) TA ,L ( u ) = eroare dac nu exist nici-o producie A astfel nct Definiia
tabelelor TA ,L

u PRIM k ( ) k L . (2) T A ,L ( u ) = ( A ,< Y1 ,Y2 ,...,Ym > ) dac exist o unic producie A astfel nct u PRIM k ( ) k L .

Automate, limbaje i compilatoare

115

Dac

= x0 B1 x1 B2 ...Bm xm ,m 0,Bi N i

xi *

atunci

Yi = PRIM k ( xi Bi +1 xi +1 ...Bm x m ) k L . Yi se numete mulimea local urmtoare a lui Bi . Dac m = 0 atunci T A ,L ( u ) = ( A , ) . (3) T A ,L ( u ) este nedefinit dac exist cel puin dou producii A 1 / 2 / ... / n u PRIM k ( i ) k L , 1 i n, n 2 .

astfel nct

Aceast situaie nu apare dac G este LL(k ) . Intuitiv, T A ,L ( u ) = eroare spune c nu este posibil nici-o derivaie de forma
Ax

uv

pentru

nici-un

xL

v * .

Cnd

TA ,L ( u ) = ( A ,< Y1 ,Y2 ,...,Ym > ) exist exact o producie A care poate fi utilizat la primul pas al derivaiei Ax
uv

pentru orice x L i v * .

Fiecare mulime Yi d toate prefixele posibile de lungime cel mult k , formate din terminale, care pot urma un ir derivat din
A Ax

Bi cnd utilizm producia


orice derivaie de forma

,
x

unde

= x0 B1 x1 B2 ...Bm xm

uv , cu x L .

Algoritmul 3.4. - de construire a tabelelor LL

Intrare : o GIC G = (N , ,P ,S ) de tip LL(k ) Ieire : mulimea T a tabelelor LL(k ) Metoda : Pasul 1. Se construiete T0 = TS , i se iniializeaz T = {T0 }. Pasul 2. Pentru fiecare tabel LL(k ) T cu intrarea T ( u ) = ( A x0 B1 x1 ...Bm x m ,< Y1 ,Y2 , ..., Ym > ) se adaug la T pentru 1 i m dac el nu exist deja n T . Pasul 3. Se repet pasul (2) pn cnd nu se mai poate aduga nici-un tabel la T . Analiza sintactic , folosind mulimea de tabele algoritmul urmtor.
Algoritmul 3.5.
LL(k ) este dat de
Construirea tabelelor TA ,L

tabelul TBi ,Yi

Intrare : gramatica G = (N , ,P ,S ) de tip LL(k ) i T Ieire : tabelul M de analiz sintactic Metoda : M este definit pe (T {S }) * k astfel : /

Automate, limbaje i compilatoare

116

Pasul 1. dac A x0 B1 x1 B2 ...Bm xm


M (T A ,L ,u ) = x0TB1 ,Y1 x1 ...TBm ,Ym x m ,i .

este producia cu numrul i , TA ,L T i


Analiza sintactic
LL (k )

TA ,L ( u ) = ( A x0 B1 x1 B2 x2 ...Bm xm ,< Y1 ,Y2 ,...,Ym > ) atunci M se definete astfel

Pasul 2. M ( a , av ) = reducere pentru orice v *( k 1 ) .


/ Pasul 3. M (S , ) = acceptare.

Pasul 4. M ( X ,u ) = eroare, n alte cazuri . Configuraia iniial este

(T0 S ,w, ) /

iar cea final este

(S , ,) /

unde w

este cuvntul de analizat iar este analiza sintactic la stnga a lui w . Analiza sintactic a gramaticilor LL(k ) se simplific n cazul k = 1 .
Definiia 3.7. O gramatic G = (N , ,P ,S ) este LL(1) dac pentru orice

neterminal A i orice dou A -producii distincte verificat condiia

i A este

PRIM 1 ( URM 1 ( A )) PRIM 1 ( URM 1 ( A )) = .

O formulare mai simpl a condiiei de mai sus este: pentru orice reguli A 1 / 2 / ... / n 1. 2. : PRIM 1 ( i ) PRIM 1 ( j ) = pentru i j dac i atunci

PRIM 1 ( j ) URM 1 ( A ) = pentru i j Analiza sitactic se face cu ajutorul funciei


reducere acceptare ( , i ) M ( A,a ) = ( , i ) eroare dac A = a dac A = $ si a = dac a PRIM 1 ( ) i ( A ) = i P dac a URM 1 ( A ) i ( A ) = i P iar PRIM 1 ( ) n alte cazuri
Analiza
LL(1)

Automate, limbaje i compilatoare

117

II. 3.4. Analiza sintactic de tip LR


Descriem un algoritm de analiz sintactic pentru gramatici LR( k ) , care furnizeaz o analiz la dreapta privind k simboluri n fa i funcionnd n mod determinist.
Definiia 3.8. Fie G = ( N , ,P ,S ) o GIC i S

colecia canonic de

mulimi de linii LR( k ) . T (A ), tabelul LR( k ) asociat mulimii A S , este o pereche de funcii < f ,g > unde f este funcia de trecere iar g este funcia GOTO: (1) functia f este definite astfel (a) f ( u ) =trecere u EFFk ( 2 v ) (b) (c) (d) dac
Funcii LR

[A 1 . 2 ,v] A

f ( u ) = i dac [A ., u ] A i A este producia cu


numrul i. f ( ) = acceptare dac [S' S .,] A f ( u ) =eroare n alte cazuri.

(2) funcia g determin urmtorul tabel ce va fi folosit n analiz; ea pune n coresponden unui element din N un tabel LR( k ) sau eroare:
g ( x ) = GOTO( A , x) dac GOTO( A , x) g ( x ) = eroare dac GOTO( A , x)= .

Algoritmul 3.6.

Intrare: Mulimea T de tabele LR( k ) corespunztoare gramaticii G = ( N , , P , S ) cu tabelul iniial T0 = T ( A 0 ), A 0 = VkG ( ) i cuvntul iniial w * . Ieire: Analiza sintactic la dreapta dac w L( G ) i eroare n caz contrar. Metoda: Algoritmul lucreaz cu o band de intrare, o band de ieire i una pushdown. Configuraia iniial este ( T0 ,w, ) . Se execut paii (1) i (2) pn cnd se obine un rspuns de acceptare sau de eroare. Pasul 1. Se determin u = PRIM k (poriunea din banda de intrare rmas de citit). Pasul 2. Fie Ti =< f ,g > linia nscris n vrful benzii pushdown; (a) Dac f ( u ) = trecere, atunci primul simbol disponibil x de pe banda de intrare se trece n vrful benzii pushdown. Calculeaz g( x ) = T j i nscrie Tj Automate, limbaje i compilatoare 118

n vrful benzii pushdown i apoi treci la pasul (1). (b) Dac f ( u ) = i i A este regula i din P, atunci terge 2 simboluri de pe banda pushdown i nscrie i pe banda de ieire. Fie T j =< f j ,g j > tabelul rmas n vrful benzii pushdown; determin g j ( A ) = T ' , nscrie pe banda pushdown pe AT' i mergi la pasul (1). Dac g j ( A ) = eroare, oprete algoritmul i cheam, eventual, o rutin de tratare a erorii. (c) Dac f ( u ) = eroare, oprete algoritmul i cheam, eventual, o rutin de tratare a erorii. (d) Dac f ( u ) = acceptare, oprete algoritmul i emite ~ , unde este secvena de pe banda de ieire. n locul analizei LR(1), se prefer analiza LALR(1), bazat pe gramatici LALR (n englez lookhead LR grammars). Ea este mai avantajoas deoarece Analiza tabelul LALR(1) este mai mic n comparaie cu cel LR(1). De asemenea, LALR(1) gramaticile LALR(1) acoper o clas mare de limbaje ce includ practic toate construciile sintactice folosite n limbajele de programare cunoscute. Fie A i = {[ A .,a ] } i
Analiza LR

A j = {[ A .,b ] } dou elemente ale

coleciei canonice de linii LR(1). Liniile din cele dou mulimi au acelai nucleu, dar difer prin irul de anticipare (a i respectiv b). Dup reducere, n funcie de elementul din vrful stivei i de simbolul de intrare, se ajunge n stri diferite. Dac se renun la verificarea simbolului de intrare, cele dou mulimi de linii LR, A i i A j sunt echivalente; putem s le nlocuim cu o nou mulime

A i , j = {[ A .,a / b ]} . Mai general, dou mulimi din colecia canonic LR(1)


pot fuziona dac au aceleai nuclee ale elementelor componente. Repetnd aceast operaie pn cnd nu mai exist stri cu nuclee identice, ajungem la un tabel LR(1). Deoarece funcia GOTO depinde doar de nucleu, toate referirile la Ti i T j din definirea funciei g vor fi nlocuite prin Ti , j .

II.3.5. Analiza sintactic de tip preceden


II. 3.5.1. Analiza sintactic a gramaticilor de preceden simpl

Plecnd de la relaiile de preceden trebuie stabilit mai nti cnd are loc o trecere a unui simbol de pe banda de intrare pe banda pushdown i cnd are loc o operaie de reducere.

Automate, limbaje i compilatoare

119

Algoritmul 3.7

Intrare: o gramatic de preceden simpl G = ( N , ,P ,S ) cu produciile numerotate de la 1 la p. Ieire: funciile f i g . Metoda: Simbolul $ ( N ) marcheaz sfritul benzii pushdown i ultimul simbol de pe banda de intrare. Funcia f depinde de simbolul din vrful benzii pushdown i de cel curent de pe banda de intrare; ea este definit astfel:
a) f ( X ,a ) = trecere , dac X < a sau X = a

Funciile de preceden simpl

b) f ( X ,a ) = reducere , dac X > a c) f ( S ,$) = acceptare d) f ( X ,a ) = eroare n alte cazuri. Regula c) este prioritar fa de regulile a) i b) cnd X = S i a = $ Funcia g nu depinde de coninutul benzii de intrare; ea depinde numai de simbolurile din vrful benzii pushdown ce formeaz partea reductibil, plus un simbol la stnga:
a') g( X k +1 X k L X 1 , ) = i dac X k +1 < X k , X j +1 = X j pentru 1 j < k i

A X k L X 1 este producia cu numrul i . b') g( , ) = eroare n alte cazuri. Deci f este definit pe ( N {$}) ( {$}) iar g este definit pe ( N {$})* . Algoritmul de analiz folosete o band pushdown pe care $ arat captul din stnga, o band de intrare pe care $ arat captul din dreapta i o band de ieire. Deci, o configuraie este de forma: ($ X 1 L X m , a1 L a q $, i1 Lin ) unde: - $ X 1 L X m reprezint coninutul benzii pushdown cu X m n vrf; - a1 L aq este poriunea din banda de intrare rmas de citit, iar a1 este simbolul curent; - i1 L in indic secvena regulilor de producie utilizate pentru a reduce cuvntul iniial la X1 L Xm a1 L aq . Pentru ca legtura dintre transformarea configuraiilor i funciile f i g s fie mai clar, vom considera c funciile f i g sunt extinse astfel:

Automate, limbaje i compilatoare

120

f : V * ( {$})* { trecere, reducere, eroare , acceptare } g : V * ( {$})* { 1,2,L , p, eroare } , unde V = N {$} . Trecerea de la o configuraie la alta se definete astfel: (1) dac f ( , aw ) = trecere atunci ( , aw, ) atunci ( , w, )

( a , w , ) ;

Analiza de preceden simpl

(2) dac f ( , w ) = reducere , g ( ,w) = i i A este producia cu numrul i

( A, w, i ), cu = ;
acceptare

(3) dac f ( , w ) = acceptare atunci ( , w, ) (4) ( , w, ) Dac ($,w$, )


eroare n alte cazuri.

($ S ,$, )

acceptare , atunci S w .

Exemplul 3.2. Considerm gramatica din Lecia 5. Funciile f i g se deduc

imediat urmrind tabelul prezentat n acest exemplu. S efectum analiza sintactic a cuvntului w = babaacac . Avem: ($,babaacac$, ) ($b , abaacac$, )

($ba , baacac$, ) ($bA,baacac$,3 )


($bAb ,aacac$,3 ) ($bAba ,acac$,3 )

($bAbA,acac$,33 ) ($bAbAa ,cac$,33 )


($bAbAA,cac$,333 ) ($bAbAAc ,ac$,333 )

($bAS ,ac$,3331 )
($bASa ,c$,3331 ) ($bAA,c$,33312 ) ($bAAc ,$,33312 )

($ S ,$,333121 )
acceptare

deci = 333121 i S w .

Automate, limbaje i compilatoare

121

II.3.5.2. Analiza sintactic a gramaticilor de preceden slab

Urmtoarea teorem arat cum se alege regula folosit pentru reducere.


Teorema 3.1. Fie G = ( N , , P , S ) o gramatic de preceden slab,
* ( B ) P i $ S $ Cw X w . Dac ( A X ) P , atunci ultima

producie folosit n derivarea de mai sus nu este B .


Demonstraie. Presupunem c ultima producie folosit a fost B .
* Atunci, avem $ S $ Bw = XBw X w . Conform teoremei 7.6 din I, avem X < B sau X = B , ceea ce este n contradicie cu definiia gramaticilor de

preceden slab. Din aceast teorem rezult c ntr-o gramatic de preceden slab, odat izolat limita dreapt a prii reductibile, reducerea este determinat de producia a crei cea mai lung parte dreapt filtreaz vrful benzii pushdown. n cazul
Realizarea precedenei

cnd condiia (1) din definiia precedenei simple (definiia 7.17 din I) nu este slabe satisfcut, gramatica poate fi modificat astfel nct s fie eliminat conflictul. De
exemplu, dac X = Y i X > Y atunci X = Y nseamn c exist producia A X Y . Eliminm relaia X = Y astfel:

- nlocuim pe X cu un nou neterminal B; deci producia A XY A BY ; - adugm la produciile existente producia B X .

devine

Modificrile nltur conflictele, dar trebuie verificat dac se mai pstreaz proprietatea de unic invertibilitate.
Exemplul 3.3. Fie gramatica cu produciile: E a /( E ) / a( F ) F E / F ,E
Avem E = ) i E > ) . Dac nlocuim E ( E ) cu E ( A ) i adugm

A E , conflictul dispare. Dar, noua gramatic:

Automate, limbaje i compilatoare

122

E a /( A ) / a( F ) F E / F ,E A E

nu mai este unic-invertibil datorit produciilor F E i A E . n cazul gramaticii de mai sus, o soluie mai bun const n evitarea relaiei E > ) ,
datorat lui F = ) , astfel:

E a /( E ) / a( E ) / a( F , E ) F E / F ,E
Acum avem peste tot E = ) , dar mai sunt i alte conflicte ce trebuie eliminate:
( = E i ( < E sau ( = F i ( < F .

Automate, limbaje i compilatoare

123

Teme Curs Teste Autoevaluare

1.

Considerm gramatica cu produciile

1.S aAaa 2.S bAba 3.A b 4.A tiind c este LL(2), s se efectueze analiza sintactic a cuvntului
w = bbba .......................................................... 5 puncte

2. Fie gramatica G = ({S ,A,B ,C}{a ,b ,c ,d ,e , f },P ,S ) unde produciile sunt : ,

1. S aAbc 2. A BA 3. A 4. B dcCe 5. B fa 6. C cC 7. C S se verifice c este LL(1) i s se efectueze analiza sintactic a cuvntului


w = abc . ....................................................................4 puncte

Oficiu..................................... 1 punct

Automate, limbaje i compilatoare

124

Rspunsuri 1. a)

Construim

mai

nti

mulimea

de

tabele

T.

.................................................................................................. 3 puncte

(S aAaa ) P calculm PRIM k (aAaa ) 2 {} = {aa ,ab} ; deoarece (S bAba ) P calculm PRIM 2 (bAba ) 2 {} = {bb}. Y = PRIM 2 ( aa ) 2 {} = {aa} . Atunci T0 ( aa ) = (S aAaa ,Y ) , unde
Deoarece Continund n acest mod obinem tabelul T0 = TS ,{} u aa ab bb Producia S aAaa S aAaa S bAba mulimile urmtoare {aa} {aa} {ba}

Deoarece T0 ( aa ) = (S aAaa ,{aa}) adugm la T tabelul T1 = T A ,{aa} u ba aa Producia Ab A mulimile urmtoare

Deoarece T0 ( bb ) = (S bAba ,{ba}) , adugm la T tabelul T2 = TA ,{ba} u ba bb Producia A Ab mulimile urmtoare

b) Construirea tabelului M ............................................................... 1.5 puncte

aa T0
T1
T2

ab
aT1 aa ,1

ba

bb
bT2 ba ,2

aT1 aa ,1

,4 R R R

b ,3 ,4 R b,3 R R A

a b $

Automate, limbaje i compilatoare

125

unde R nseamn reducere iar A acceptare.


c) Analiza................................................ 0.5 puncte

(T0 S ,bbba , ) / (baS ,ba ,23) /


deci = 23.

(bT2baS ,bbba ,2) (T2baS ,bba ,2) / / (aS ,a ,23) (S , ,23) / /

(bbaS ,bba ,23) /

2. a) verificarea condiiei.... 1 punct

Deoarece PRIM 1 ( aAbc ) = {a} , PRIM 1 ( BA ) = {d , f } , PRIM 1 ( ) = {} ,


PRIM 1 ( dcCe ) = {d } PRIM 1 ( fa ) = { f }

PRIM 1 ( cC ) = {c}

URM 1 ( A ) = {b} , URM 1 ( B ) = {b} , URM 1 ( C ) = {e} rezult c gramatica

este LL(1) . b) tabelul ......................................................................................... 2 puncte a S A B C a b c d e f $ R R R R R R A (cC,6) (aAbc,1) (,3) (BA,2) (dcCe,4) (,7) (BA,2 (fa,5) b c d e f

c) analiza ..................................................................................... 1 punct

(S $,abc , )

(aAbc$,abc ,1) ( Abc$,bc ,1) (bc$,bc ,13)

Automate, limbaje i compilatoare

126

(c$,c ,13) ($, ,13)


acceptare.
Rezumat: S-au descris algoritmi determiniti de analiza sintactic

ascendent si descendent

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar Se vor implementa doi algoritmi de analiz sintactic corespunzator celor dou tipuri: ascendent i descendent
Teme Laborator/Seminar

1. Implementai analiza sintactic de tip preceden simpl 2. Implementai analiza sintactica LL(1)

Rezumat: se implementeaz algoritmii de tip preceden i LL(1)

Automate, limbaje i compilatoare

127

Notaii

Automate, limbaje i compilatoare

128

Curs 9 Analiza semantic


Descriere General Se definesc tipurile de atribute i rolul lor n specificarea semanticii unui limbaj de programare. Se arat modul de utilizare a gramaticilor L-atributate n specificarea semanticii iar n final se d un exemplu pentru un limbaj concret. Obiective - cunoaterea tipurilor de atribute i a semnificaiei lor - cunoaterea rolului gramaticilor atributate n specificarea semanticii unui limbaj de programare

Curs 9 Durata: 2 ore

Cuprins II.4.1. Specificarea semanticii limbajelor II.4.1.1. Specificarea semanticii folosind gramatici cu atribute II.4.1.2. Specificarea semanticii folosind gramatici L-atributate II.4.2. Model de analiz semantic

Coninut Curs

II.4.1. Specificarea semanticii limbajelor


Analiza lexical i cea sintactic extrag structura programului surs. Analiza semantic completeaz structura sintactic cu valorile atributelor asociate componentelor acestei structuri. Pe baza valorilor atributelor, se realizeaz , pe considerente semantice, corectitudinea programului surs i se alctuiete codul intermediar echivalent. Rezolvarea acestor dou sarcini necesit, de obicei, mai multe parcurgeri ale arborelui de derivare. Numrul acestor parcurgeri poate fi fix sau variabil n funcie de structura programului analizat. Prima situaie este preferabil i, de obicei, prin modificri ale
Generaliti

definiiei limbajului sau impunerea unor restricii, numrul parcurgerilor poate fi limitat, putndu-se ajunge la situaia ideal: o singur parcurgere. Numrul de parcurgeri rezult din ordinea de evaluare a atributelor i este Automate, limbaje i compilatoare 129

influenat de resursele de memorie disponibile. Pentru a economisi spaiu de memorie, arborele de derivare nu este explicit construit; n locul lui se prefer arborele sintactic sau forme echivalente acestuia. n cazul analizei ntr-o singur trecere, informaiile privind structura programului sunt concentrate n irul aciunilor analizorului sintactic i arborele devine inutil. In practic, analiza semantic se desfoar n paralel cu cea sintactic, asociind aciunilor specificare a semanticii limbajelor de analizorului sintactic aciuni referitoare la atributele componentelor sintactice. Knuth a propus o metod de programare, definind nelesuri ale cuvintelor unui limbaj independent de context cu ajutorul atributelor asociate simbolurilor din arborele de derivare.

II.4.1.1. Specificarea semanticii folosind gramatici cu atribute Definiia 4.1. O gramatic cu atribute (GA) const din: a) o gramatic independent de context G = ( N , , P , S ) avnd produciile numerotate sub forma
p .X p0 X p1 X p2 K X pn
p

n care simbolul iniial S nu apare n partea dreapt a nici unei producii; b) o mulime de atribute At . Fiecare atribut a At este caracterizat printr-o mulime de valori V (a ) la fel cum un tip de date este caracterizat prin mulimea valorilor sale. Fiecrui simbol X N i corespunde o mulime finit de atribute A ( X ) format din dou mulimi disjuncte S ( X ) i M ( X ) , numite mulimea atributelor sintetizate i respectiv motenite ale lui X . Un atribut poate reprezenta o entitate oarecare: o valoare numeric, un tip, un cmp de caractere, o adres de memorie, etc. Atributele din A ( X ) nsoesc simbolul X n toate produciile n care acesta apare. c) o mulime F de reguli semantice, folosite pentru evaluarea fiecrei producii:
Gramatic cu

- pentru un atribut sintetizat, valoarea sa se calculeaz n funcie de valorile atribute atributelor asociate fiilor acestui nod S.a

s1.a1 ... Automate, limbaje i compilatoare

sk.ak 130

S s1 L s k este regula de producie

a1 ,K , a k asociate respectiv lui S1 ,K , S k : a = f (a1 ,K , a k )


Simbolurile terminale nu pot avea atribute sintetizate.

a = atributul sintetizat asociat lui S i se calculeaz n funcie de atributele

- pentru un atribut motenit, valoarea se calculeaz utiliznd valorile atributelor asociate frailor sau prinilor acestui nod S.a

s1.a1 ...

si.ai

...

sk.ak

S s1 .......s k este regula de producie


ai = atribut motenit asociat lui si ;
ai
=

f (a ,a1 ,K ,ai 1 ,ai +1 ,K ,ak ) unei

Dac existena atributelor sintetizate rezult din faptul c nelesul motenite poate fi pus la ndoial.

componente sintactice rezult n primul rnd din structura ei, necesitatea celor Exist ns situaii cnd atributele motenite nu pot fi evitate, deoarece ele capteaz influena asupra nelesului unei componente sintactice a contextului n care apare componenta respectiv. Este posibil ca numrul de parcurgeri s fie infinit, aceasta nsemnnd c valoarea unui atribut rezult dintr-un calcul n care este implicat ea nsi. Knuth a dat un algoritm de verificare a existenei unei astfel de situaii. Dac b este un atribut, asociat nodului a , ce depinde de atributul c , atunci regula semantic pentru b trebuie evaluat dup regula semantic ce definete pe dependen: for fiecare nod n din arborele de derivare do for fiecare atribut a asociat nodului n do Construiete un nod n graful de dependene pentru a for fiecare nod n din arborele de derivare do for fiecare regul semantic b := f (c1 ,c2 ,K ,ck )
c . Interdependena dintre atributele sintetizate i cele motenite

asociate nodurilor arborelui de derivare poate fi nfiat prin graful de

Automate, limbaje i compilatoare

131

asociat produciei corespunztoare nodului n do for i:=1 to k do Construiete o muchie de la nodul corespunztor lui c i la cel corespunztor lui b . De exemplu, fie A.a = f ( X .x ,Y . y ) o regul semantic pentru producia
A XY ; aceast regul definete atributul sintetizat A.a care depinde de

atributele X .x

si Y . y . Se construiesc nodurile A.a , X .x la


A.a

i Y . y , apoi o

muchie de la X .x

i nc una de la Y . y la A.a . Dac producia

A XY are regula semantic X .x := g ( A.a ,Y . y ) atunci se construiete o muchie

de la A.a la X .x i nc una de la Y . y la X .x . Exemplul 4.1. producia


E E1 + E 2

Graf de

regula semanantic
E .val := E1 .val + E 2 .val

dependen

Cele trei noduri din graful de dependen marcate prin


E .val , E1 .val i E 2 .val

corespund atributelor

Figura 4.2 - Exemplu de graf de dependen

II.4.1.2. Specificarea semanticii folosind gramatici L-atributate Funciilor semantice, fie ele simple transferuri de valori fie calcule orict de complexe ale valorilor atributelor, li se asocieaz aciuni semantice; astfel analiza semantic devine o nlnuire a aciunilor semantice n ordinea impus de aciunile sintactice. Simbolurile de aciune se intercaleaz printre simbolurile din partea dreapt a produciilor n funcie de necesitile de evaluare i transmitere a atributelor. De exemplu, producia A XYZ poate fi completat cu simboluri de aciune astfel:

A XY @ TZ , unde notaia @ introduce un simbol de actiune.


Automate, limbaje i compilatoare 132

Definiia 4.2. Fie G = ( N , , P , S ) o GIC i o mulime de simboluri

(numite de aciune) astfel nct ( N ) = . Atunci:

Introducerea simbolurilor de aciune

a) Fie At o mulime de atribute, fiecrui atribut a At corespunzndu-i o


mulime de valori V (a ) . Pentru fiecare simbol X N exist o mulime de atribute asociate A

( X ) At . A ( X ) =

M (X ) S (X ) ;

M ( X ) se numete atribut motenit al lui X iar s S ( X ) se numete atribut

sintetizat al lui X . b) Pentru fiecare producie din P exist o rescriere numit producie atributat. n cadrul ei pot s apar n partea dreapt i simboluri din . c) Pentru fiecare producie atributat exist o mulime de reguli de calculare a valorilor atributelor conform regulilor: c1) valoarea unui atribut motenit ce apare n partea dreapt a unei reguli de producie este calculat n funcie de alte atribute ale produciei. Pentru atributele motenite ale simbolului de start se dau valori iniiale. c2) valoarea unui atribut sintetizat asociat neterminalului din stnga produciei se calculeaz n funcie de alte atribute ce apar n regul. c3) valoarea unui atribut sintetizat asociat unui simbol de aciune se calculeaz n funcie de alte atribute ale simbolului de aciune.
Condiiile de mai sus definesc o gramatic de traducere atributat. Pentru a exemplifica aceast definiie considerm regula de mai jos, unde atributele motenite sunt precedate de caracterul iar cele sintetizate sunt precedate de
terms
s t

::= + term

terms

b c

b s + a; t c
Definiia 4.3. O gramatic de traducere atributat se numete L-atributat

dac specificaiile a ) i b ) se menin nemodificate iar c ) se modific n:

c'1 ) valoarea unui atribut motenit ce apare n partea dreapt a unei reguli de
producie este calculat n funcie de atributele motenite ale simbolului din stnga regulii i atribute arbitrare ale simbolurilor din dreapta regulii de producie ce apar la stnga simbolului a crui apariie de atribut o considerm;
Gramatica Latributat

c'2 ) valoarea unui atribut sintetizat asociat neterminalului din stnga, se


calculeaz n funcie de atributele motenite ale simbolului din stnga i
Automate, limbaje i compilatoare
133

atributele arbitrare ale simbolurilor din dreapta ;

c'2 ) valoarea

unui atribut sintetizat asociat unui simbol de aciune se

calculeaz n funcie de alte atribute motenite ale simbolului de aciune.


Definiia 4.4. O gramatic L-atributat se numete n form simpl dac

cerinele c'1 ) i c' 2 ) se modific n:

Gramatica Latributat n form simpl

c"1 ) valoarea unui atribut motenit asociat unui simbol din partea dreapt este
o constant, valoarea unui atribut motenit al simbolului din stnga sau valoarea unui atribut sintetizat al unui simbol care apare la stnga simbolului considerat, n partea dreapt;

c"2 ) valoarea unui atribut sintetizat asociat neterminalului din stnga este o
constant, valoarea unui atribut al neterminalului din stnga sau valoarea unui atribut sintetizat al unui simbol din partea dreapt.
Fiind dat o gramatic L-atributat, se poate construi o gramatic Latributat n form simpl echivalent, prin adugarea de simboluri de aciune.
terms
s t

::= + term

@add b,cd terms

e f

b s ,c a ,e d ,t f

Diferena esenial dintre cele dou gramatici const n nlocuirea regulilor de evaluare prin simboluri de aciune. De exemplu, simbolul de aciune @ add invoc rutina
''

add '' care primete ca parametri de intrare atributele motenite

b i c i genereaz ca parametru de ieire atributul sintetizat d :d b + c . Este

posibil s se nlocuiasc atribuirea explicit prin atribuirea implicit care se realizeaz folosind atribute variabile. De exemplu, producia anterioara poate fi scris ca
terms
s f

::= + term

@ add s ,ad terms

d f

Regulile ce guverneaz aceast atribuire sunt urmtoarele: 1) un atribut motenit, s zicem a , situat n partea dreapt primete ca valoare atributul sintetizat sau motenit avnd acelai nume i situat la stnga lui a . Referindu-ne la regula analizat avem: - atributul motenit s din partea dreapt primete valoare de la atributul motenit
s situat n stnga regulii;

- atributul motenit d primete valoare de la atributul sintetizat d asociat

Automate, limbaje i compilatoare

134

simbolului de aciune @ add . 2) un atribut motenit, s zicem a , din partea stng motenete valoarea prin aplicarea unei producii care invoc partea stng. De exemplu, atributul motenit
s din stnga regulii 4 primete valoare prin aplicarea produciilor care conin terms n partea dreapt.

3) un atribut sintetizat ce apare n partea dreapt a unei reguli primete valoare fie prin aplicarea unei rutine de aciune fie prin sintetizarea informaiei produse prin procesul de construire a arborelui de derivare. De exemplu, atributul sintetizat d din dreapta produciei primete valoare prin invocarea rutinei de aciune @ add iar atributul sintetizat f primete valoare cnd terms
e f

din dreapta

se unific eventual cu cuvntul vid i f

primete valoarea lui s aa cum rezult din producia 3; 4) un atribut sintetizat din partea stng primete valoare de la atributul sintetizat cu acelai nume situat n dreapta produciei. Deci, atributul sintetizat f care apare n stnga produciei primete valoare de la atributul sintetizat f din partea dreapt. Regula urmtoare este in forma simpl
terms
s f

::= + term

@ add s ,a d terms

d f

II.4.2. Model de analiz semantic


Definim gramatica independent de context ce definete limbajul cu care vom lucra, apoi vom atributa aceast gramatic. Mulimea simbolurilor terminale este T={func, var, endf, rezultat, +, -, *, /, (, ), virgul , ; , =, lit, v, n, f} Primele patru simboluri sunt cuvinte rezervate:
func (este analogul lui function din

Pascal i servete la definirea unei noi funcii), var (se utilizeaz la definirea variabilelor), endf (indic sfritul definiiei unei funcii) i rezultat (specific variabila sau parametrul formal a crui valoare este returnat de funcie). Urmtoarele patru simboluri terminale corespund celor patru operaii aritmetice; urmeaz parantezele rotunde i virgula, care servesc la delimitarea irului de parametri ai unei funcii. Simbolul punct i virgul se utilizeaz pentru semnalarea sfritului unei instruciuni sau a unei declaraii, iar semnul egal servete la delimitarea prii stngi a unei atribuiri, de partea dreapt a acesteia. Ultimele patru simboluri au urmtoarea semnificaie:
Automate, limbaje i compilatoare

135

- lit corespunde unui literal numeric; - n , v , i f corespund fiecare unui identificator. La ntlnirea unui identificator, analizorul lexical returneaz simbolul terminal n dac identificatorul este ntlnit pentru prima dat sau nu are nc atributele completate (este nc nedefinit), simbolul v dac din tabela de simboluri reiese c este o variabil sau parametru formal al unei funcii, respectiv simbolul terminal f dac s-a ntlnit un nume de funcie. Mulimea simbolurilor neterminale este

N = {Start, Vars, Func, Corp, Listparform, Sflist1, Atrib, Expr, Termen,


Sftermen, Fact, Sffact, Listparact, Sflist2}

Simbolul de start este Start , iar produciile sunt urmtoarele: 1. Start Vars Func Corp

2. Vars
3. Vars var n Sflist1 ; 4. Sflist1

5. Sflist1 , n Sflist1;
6. Corp Atrib rezultat v;

7. Atrib
8. Atrib v = Expr ; Atrib

Gramatica limbajului

9. Func func n Listparform; Vars Func Corp endf Func 10. Func 11. Listparform

12. Listparform ( n Sflist1 )


13. Expr Termen Sfterm

14. Sfterm
15. Sfterm + Expr

16. Sfterm Expr


17. Termen Fact Sffact 18. Sffact

19. Sffact Termen


20. Sffact / Termen

21. Fact v
Automate, limbaje i compilatoare

136

22. Fact lit

23. Fact ( Expr )


24. Fact f Listparact

25. Listparact ( Expr Sflist 2 )


26. Listparact

27. Sflist 2
28. Sflist 2 , Expr Sflist 2 Un program definit de aceast gramatic se compune din definirea variabilelor, a funciilor i din programul principal care are aceeai sintax ca i corpul unei funcii. Variabilele sunt definite naintea funciilor pentru ca ele s fie vizibile i n corpul funciilor. Definirea variabilelor ncepe cu cuvntul cheie var urmat de o list de identificatori, separai prin virgul, i terminat cu punct i virgul. Corpul unei funcii (precum i programul principal) const dintr-o list de atribuiri urmat de cuvntul cheie rezultat care precede un nume de variabil (sau parametru formal, care la nivelul sintaxei este echivalent cu o variabil). Din producia 9 rezult felul cum se pot defini funciile: cuvntul rezervat func arat c ncepe o definiie de funcii; dup func urmeaz numele funciei, urmat de lista, eventual vid, a parametrilor formali i punct i virgul. Urmeaz definirea variabilelor locale, definirea funciilor locale funciei n curs de definire (funciile imbricate), dup care urmeaz corpul funciei. Definirea unei funcii se termin cu cuvntul rezervat endf . Dup definiia unei funcii poate urma o alt definiie de funcie; aceast funcie va fi la acelai nivel cu prima. Producia 10 arat c funciile locale pot s lipseasc. Produciile 13-28 definesc sintaxa unei expresii aritmetice. In definirea sintaxei unei expresii s-a fcut deosebire ntre neterminalele Termen i Factor ; primul apare n sume i diferene iar al doilea n produse i cturi. Aceast deosebire este necesar datorit prioritilor diferite asociate operatorilor aritmetici. Dac nu ar fi fost problema prioritilor, sintaxa expresiilor aritmetice s-ar fi putut descrie i cu produciile 13' ) Expr Fact Sffact 14' ) Sffact Oper Fact 15' ) Sffact

Automate, limbaje i compilatoare

137

16' ) Oper + 17' ) Oper 18' ) Oper 19' ) Oper / care puteau nlocui produciile 13-20. n definirea sintaxei limbajului de programare s-a folosit simbolul terminal lit pe care l va returna analizorul lexical de fiecare dat cnd ntlnete n textul surs un literal numeric, adic o succesiune de cifre. Acest fapt poate fi detaliat mai mult la nivelul gramaticii, considernd c lit este un neterminal (notat n continuare cu Lit ) i introducnd produciile
Lit 0 Sflit Lit 1 Sflit Lit 2 Sflit Lit 3 Sflit Lit 4 Sflit Lit 5 Sflit Lit 6 Sflit Lit 7 Sflit Lit 8 Sflit Lit 9 Sflit Sflit Sflit lit

Gramatica precedent va fi L -atributat astfel nct atributele i aciunile semantice s permit: -- verificarea coincidenei numrului de parametri actuali cu numrul parametrilor formali, la apelul unei funcii; -- asigurarea regulilor de valabilitate pentru structura de blocuri, adic schimbarea contextelor i permiterea redefinirii locale a numelor; -- alocarea memoriei pentru variabilele i parametri formali ai funciilor. Pentru aceasta s-au definit urmtoarele mulimi de valori VAL - corespunde valorii unui literal numeric; DIM - corespunde numrului total de parametri i variabilele locale; OFF - corespunde offsetului n cadrul articolului de activare: practic acest offset este numrul de ordine al identificatorului n lista concatenat a parametrilor formali i variabilelor locale ale funciei n ordinea apariiei lor n textul surs; PAR - corespunde numrului de parametri formali sau actuali; TIPV - corespunde tipului variabilei : variabil local sau parametru formal ; NIS - corespunde nivelului de imbricare static a unui identificator; NUME = mulimea identificatorilor admii. Valorile atributelor sunt: V (VAL ) = N , V ( DIM ) = N , V ( OFF ) = N , V ( PAR ) = N , V ( NIS ) = N , V ( TIPV ) = {var, par} ;. Atributele asociate diferitelor simboluri gramaticale sunt: Start OFF - arat numrul de variabile definite la nivelul programului principal;
Valorile atributelor

Automate, limbaje i compilatoare

138

VarsOFF OFF - arat offsetul primei variabile din lista variabilelor locale, respectiv numrul total de variabile; numrul total de variabile; ListparformOFF - arat numrul de parametri formali ai funciei; Listparact PAR PAR - arat numrul iniial de parametri actuali (adic 0) respectiv numrul total de parametri actuali; Sflist2 PAR PAR - arat numrul de parametri actuali deja analizai, respectiv numrul total al lor; lit VAL - arat valoarea literalului vTIPV NUME OFF NIS - arat tipul, numele i offsetul variabilei, respectiv nivelul de imbricare static; n NUME - un identificator nc nedefinit nu are alt informaie completat n tabela de simboluri, dect numele; f NUME PAR DIM NIS - arat numele, numrul de parametri formali, numrul total de variabile, respectiv nivelul de imbricare. Cu aceste notaii, gramatica L-atributat este : 1. Start o Vars0,o Func Corp 2. Vars o,o
3. Vars o,o1 var@ Taien n Sflist1o +1,var,o1 ; @ Re fa
var,n ,o

Atributele

Sflist1OFF TIPV OFF - arat offsetul i tipul urmtoarei variabile din list, respectiv asociate

@ Ins

4. Sflist1o ,t ,o 5. Sflist1o ,t ,o1 , nn


t ,n ,o

@ Ins Sflist1o +1,t ,o1 ;


Gramatica Latributat

6. Corp Atrib rezultat vt ,n ,o ,i ; Atrib

7. Atrib
8. Atrib vt ,n ,o ,i = Expr ; Atrib 9. Func func @ Taie nn @ Ref @ Context @ Taie Listparformo @Ref; Vars o,o1 Func Corp, endf @Exit 10. Func 11. Listparform0
12. Listparfor mo ( n n
par ,n ,o n ,o ,o1

@Insfunc Func

@ Ins Sflist11, par ,o )

Automate, limbaje i compilatoare

139

13. Expr Termen Sfterm

14. Sfterm
15. Sfterm + Expr

16. Sfterm Expr


17. Termen Fact Sffact

18. Sffact
19. Sffact Termen 20. Sffact / Termen 21. Fact vt ,n ,o ,i 22. Fact lit v 23. Fact ( Expr )
24. Fact f n , p ,d ,i Listparact 0 ,a
p ,a

@ Verif

25. Listparact p , p1 ( Expr Sflist 2 p +1, p1 )

26. Listparact p , p 27. Sflist 2 p , p 28. Sflist 2 p , p1 Expr Sflist 2 p +1, p1 Actiunile semantice au urmtorul rol :

@ Taie - taie legtura de la blocul context curent la contextul tat, pentru a


permite redefinirea local a numelor; @Ref- reface legtura la contextul tat, pentru a permite folosirea numelor din blocurile nglobate;
TIPV ,NUME ,OFF

@ Ins - insereaz n blocul curent al tabelei de simboluri o variabil


Aciuni semantice

de tip TIPV cu numele NUME i offsetul OFF ;

@ Context - creaz un context imbricat, initial vid;


NUME ,PAR ,DIM

@ Insfunc - insereaz n blocul curent al tabelei de simboluri o funcie

cu numele NUME , cu numrul parametrilor egal cu PAR i cu numrul total de variabile plus parametri formali egal cu DIM ;
PAR ,PAR

@ Verif - verific dac numrul parametrilor actuali este egal cu numrul

celor formali;

@ Exit - determin ieirea din contextul curent n contextul tat.

Automate, limbaje i compilatoare

140

Teme Curs Teste Autoevaluare 1. De cine depinde numrul de parcurgeri ale arborelui de derivare necesar

pentru calcularea atributelor?........................................................... 1 punct


2. Prin ce metode poate fi modificat numrul parcurgerilor?.............. 1 punct 3. Care sunt elementele ce definesc o gramatic cu atribute?............. 1 punct 4. Cte tipuri de atribute exist i prin ce se caracterizeaz?.............. 2 puncte 5. Care atribute nu pot fi eliminate i de ce?........................................1 punct 6. n ce parte a unei reguli de producie se plaseaz simbolurile de

aciune?.................................. ..........................................................1 punct


7. Dai un exemplu de situaie n care parcurgerea arborelui de derivare, n

vederea calculrii atributelor, duce la ciclare?............................... 1 punct


8. Care este atributul care trebuie s fie obligatoriu prezent?............ 1 punct

Oficiu................................................................................................... 1 punct

Automate, limbaje i compilatoare

141

Rspunsuri 1. De ordinea de evaluare a atributelor i de resursele de memorie

disponibile
2. Prin modificri ale definiiei limbajului sau impunerea unor restricii 3. Gramatica independent de context, mulimea atributelor i mulimea

regulilor semantice
4. Atribute sintetizate i atribute motenite. Pentru un atribut sintetizat,

valoarea sa se calculeaz n funcie de valorile atributelor asociate fiilor acestui nod. Pentru un atribut motenit, valoarea se calculeaz utiliznd valorile atributelor asociate frailor sau prinilor acestui nod
5. Atributele sintetizate, deoarece existena lor rezult din faptul c nelesul

unei componente sintactice este dat n primul rnd de structura ei


6. n partea dreapt 7. Funcia care calculeaz atributul a are ca argument pe a 8. Adresa de memorie Rezumat: S-au definit noiunile de atribut, gramatic L-atributat i s-a

prezentat modul de utilizare a gramaticii L-atributate pentru specificarea semanticii unui limbaj; n final s-a dat un exemplu de gramatic L-atributat pentru un limbaj de programare.

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar Se implementeaz un program simplu care s verifice prin tehnici semantice transmiterea corect a parametrilor formali

Automate, limbaje i compilatoare

142

Teme Laborator/Seminar

1. Implementati analiza semantic pentru verificarea transmiterii corecte a parametrilor actuali.


Rezumat: se implementeaz un model de analiz semantic

Automate, limbaje i compilatoare

143

Notaii

Automate, limbaje i compilatoare

144

Curs 10 Generarea codului intermediar


Descriere General

Curs 10 Durata:

2 ore

Se prezint trei forme de reprezentare a codului intermediar: forma polonez, arbori sintactici i triplete. Ca model se prezint codul intermediat pentru expresii booleene.
Obiective cunoaterea semnificaiei i importanei codului intermediar

- cunoaterea tipurilor de cod intermediar i a diferenelor dintre ele - cunoasterea posibilitilor de implementare a codului cu trei adrese - ntelegerea modului de generare a codului cu trei adrese

Cuprins

II.5.1. Forma polonez II. 5.2. Arbori sintactici II.5.3. Cod intermediar cu trei adrese II.5.3.1. Triplete II.5.3.2. Cuadruple II.5.3.2.1. Expresii booleene

Coninut Curs Rezultatul analizei sintactice i semantice const dintr-un fiier coninnd traducerea programului ntr-un limbaj intermediar. Acesta este mai apropiat de limbajul de asamblare dect de cel surs. Astfel, programul este o succesiune de operaii mpreun cu operanzii asociai. Operaiile sunt n majoritate similare celor din limbajul de asamblare: operaii aritmetice, atribuiri, teste, salturi, iar ordinea lor din program este cea n care se execut. Din program lipsesc declaraiile, descrierea operanzilor gsindu-se n tabela de simboluri. n acelai timp, codul intermediar se deosebete de limbajele de asamblare prin aceea c Generaliti operanzii nu sunt regitri sau cuvinte de memorie, ci referine la intrri n tabela de simboluri. n afara referinelor propriu-zise, operanzii mai pot conine i informaii sumare privind natura lor: variabile simple, variabile indexate,

Automate, limbaje i compilatoare

145

variabile temporare, constante, apeluri de funcii sau informaii privind modul de adresare: direct sau indirect. Structura secvenei operaiilor, ca i modul de reprezentare a unei instruciuni sunt dependente de soluia adoptat pentru codul intermediar: forma polonez, arbori sintactici, triplete, cuadruple.

II.5.1. Forma polonez


Acest tip de cod intermediar este foarte utilizat pentru limbaje constituite n general din expresii aritmetice i structuri de control rudimentare. O expresie n form polonez, sau notaie postfixat se caracterizeaz prin aceea c operatorii apar n ordinea n care se execut operaiile pentru calculul expresiei. De aceea, evaluarea unei expresii n form polonez se face parcurgnd ntr-un singur sens expresia i executnd operaiile innd seama de aritatea lor. De exemplu, expresia a (b + c ) se traduce n form polonez n abc + . n parcurgerea ei spre dreapta ntlnim nti + care, fiind o operaie binar, determin efectuarea adunrii b+c . Urmeaz care, precedat de a i de rezultatul lui b+c (s-l notam cu t), determin operaia a t .
Definiia 5.1. O expresie n form polonez ( EFP ) se definete astfel:

1) orice operand a este EFP; 2) daca e1 , e2 ,L , en sunt EFP i este o operatie n -ar e1e2 Len este EFP; 3) orice expresie format altfel ca la 1) i 2) nu este EFP. Transcrierea unei expresii aritmetice n form polonez se face cu urmtorul algoritm :
Algoritmul 5.1

(n 1)

Definiia

, atunci formei
poloneze

Intrare : o expresie aritmetic Ieire : forma polonez postfixat a expresiei aritmetice Metoda : se definesc prioritile pentru operatori : $ i ( au prioritatea 0 + i - au prioritatea 1

i / au prioritatea 2
$ este un simbol special, iar pentru ) nu avem nevoie de prioriti. Automate, limbaje i compilatoare 146

Lucrm cu triplete

( , , ) , unde

este irul de intrare, este stiva de lucru


Algoritmul formei poloneze

folosit pentru depozitarea temporar a operatorilor iar este irul de ieire. Configuraia iniial este ( , $, ) iar cea final este ( ,$, ) . Pasul 1. (a , b, )

( , b, a ) dac a este operand ( , ab, ) dac a este operator i P(a ) > P(b )
sau a = (

(a , , b ) dac a este operator i P(a ) P(b ) Pasul 2. ( ) , b, ) ( , , ) dac b = ( ( ) , , b ) dac b ( Pasul 3. ( , b , ) ( , , b ) dac b $ , unde P( x ) este prioritatea operatorului x .
Aa cum am subliniat anterior, avantajul folosirii formei poloneze ca limbaj intermediar const n proprietatea c expresia poate fi evaluat printr-o singur trecere prin textul ei. Simplitatea algoritmului de evaluare recomand folosirea formei poloneze ca limbaj intermediar n compilare. Dar, n cazul limbajelor de programare exist i alte operaii ce trebuie traduse n cod intermediar: atribuiri, teste, salturi, indexri, etc. De aici, necesitatea extinderii reprezentrii i la asemenea operaii sau folosirii altor forme de reprezentare. Se pot aduga, de exemplu, umtoarele operaii: a) L goto - operaie ce indic o instruciune de salt din programul surs. Acest etichet se afl ntr-o intrare n tabela de simboluri care se actualizeaz la un moment dat cu echivalentul etichetei n forma polonez: un index n irul fpol . b) E1 E2 ....En A INDEX - operaie cu numr variabil de operanzi reprezentnd indexarea tabloului A cu rezultatele expresiilor E1 ,..., En . Operaia INDEX, pe baza simbolului A din vrful stivei, determin din tabela simbolurilor numrul n al dimensiunilor lui A i extrage din stiv, pentru indexare, cele n valori ale expresiilor. c) E1 E2 ....En P PREL - operator cu numr variabil de operanzi reprezentnd apelul procedurii P cu parametri efectivi dai de expresiile E1 ,..., En . d) I1 S1 I 2 S 2 ...I n S n A TDECL - operaie cu numr variabil de operanzi reprezentnd declaraia tabloului A . I j i S j reprezint expresiile ce dau limita

Automate, limbaje i compilatoare

147

inferioar i respectiv superioar pentru dimensiunea j .

II. 5.2. Arbori sintactici


Reprezentarea programului intermediar ca un arbore este forma de reprezentare cea mai apropiat de structura sintactic a programului surs, fiind mai indeprtat de structura programului obiect. Ea conine puine elemente noi fa de programul surs, fiind o form concentrat a acestuia. Din aceast cauz reprezentarea arborescent este util n faza de optimizare a codului. n general, arborele folosit nu este cel al derivrii, ci o variant a sa care nu conine redundane. Un astfel de arbore se numete arbore sintactic sau abstract. n figura 5.1 se prezint arborii sintactici ai unei expresii aritmetice i ai unei instruciuni condiionale. Se observ c nodurile interioare sunt etichetate cu operatori, iar frunzele cu operanzi. Operaiile nu sunt numai aritmetice, ele pot fi: indexri, selectri, comparaii, atribuiri, salturi, etc. De asemenea, ele pot fi: unare, binare sau ternare. Aritatea operaiilor d numrul de descendeni ai nodului etichetat cu operaia respectiva. Totui, n unele cazuri se prefer folosirea arborilor binari care au reprezentarea mai uniform i sunt mai uor de parcurs.
*

/ \ / / \ / id2 / \ / \
id3 id4

id1 +

\
[]
Exemplu de arbore sintactic

id1*(id2+id3[id4] ) Figura 5.1

Automate, limbaje i compilatoare

148

II.5.3. Cod intermediar cu trei adrese


Cel mai adesea, codul intermediar este vzut ca o secven de instruciuni de tipul A := B op C , unde A,B i C sunt identificatori din program, constante sau variabile temporare generate de compilator, iar op este o operaie aritmetic sau logic. Instruciunile complexe sunt fragmentate n instruciuni simple coninnd un singur operator. Variabilele temporare sunt create pentru a memora rezultatele intermediare. Codul cu trei adrese poate fi implementat sub form de triplete, triplete indirecte sau cuadruple.
II.5.3.1. Triplete

Sunt reprezentate prin structuri cu trei cmpuri coninnd operatorul i cei doi operanzi. Instruciunea A := B op C se reprezint printr-o structur ale crei cmpuri conin : op , B i C . Cele trei cmpuri sunt pointeri ctre tabela de simboluri sau ctre structura tripletelor. Pointerii ctre structura tripletelor se vor reprezenta prin numere ntre paranteze rotunde.
Exemplul 5.1. Expresia A := (B + C ) D se reprezint astfel:

Cod intermediar sub forma de triplete directe

numr triplet (0) (1) (2)

Operator + * :=

Operand stnga B (0) A

operand dreapta C D (1)

n faza de optimizare a codului au loc, frecvent, operaii de suprimare sau deplasare a instruciunilor cu trei adrese. n caz de deplasare trebuie modificai toi pointerii ctre aceste instruciuni. Trebuie parcurs structura tripletelor i modificate toate tripletele care utilizeaz variabila temporar asociat tripletului deplasat. Pentru a economisi timp se prefer folosirea tripletelor indirecte. n acest caz, structurii tripletelor i se asociaz o list de pointeri, care dau ordinea de execuie a tripletelor. Cnd au loc modificri n ordinea de execuie a tripletelor, este suficient s se reordoneze numai lista pointerilor.

Automate, limbaje i compilatoare

149

Exemplul 5.2. Expresia A := (B + C ) D se reprezint prin triplete indirecte

astfel: Instruciuni (0) (1) (2) ( 100 ) ( 101 ) (102 ) operator ( 100 ) ( 101 ) ( 102 ) operand operand stnga + * := dreapta B (0) A C D (1)
Cod intermediar sub forma de triplete indirecte

II.5.3.2. Cuadruple

Cuadruplele sunt structuri cu patru cmpuri coninnd operatorul, cei doi operanzi i rezultatul. Cmpurile corespunztoare operanzilor i rezultatului pointeaz ctre tabela de simboluri. Trebuie, deci, ca variabilele temporare s fie memorate n tabela de simboluri la fel cum sunt memorai identificatorii unui program surs.
Exemplul 5.3. Expresia
A := (B + C ) D se reprezint prin cuadruple

astfel:
Cod

operand operator (0) (1) (2) + * := stnga B T1 A

operand dreapta C D T2 rezultat T1 T2

intermediar sub form de cuadruple

n continuare ne vom ocupa numai de generarea codului intermediar sub form de cuadruple. Instruciunile cu trei adrese pe care le utilizm n continuare sunt :
instructiuni de atribuire :

- A := B op C - A := op B - A := B

cu op operator aritmetic sau logic binar; cu op operator aritmetic sau logic unar;

instruciuni de salt necondiional:

Automate, limbaje i compilatoare

150

- goto Q ;
instruciuni de salt condiional:

if A oprel B goto Q

unde oprel

este un operator relaional; dac

relaia este satisfcut se execut instruciunea cu trei adrese etichetat cu Q ;


apel de subprograme :

- Param Pa - specific faptul c Pa este parametru; - Call Pr, Np - specific apelul procedurii Pr cu Np parametri;
atribuirea indexat:
Instruciuni cu trei adrese

- A := B[i ] i A[i ] := B
atribuirea prin pointeri i adrese:

- A := * B i * A := B ; - A := Adr B ;

Exemplul 5.4.

A:=B or C

T 1 :=B or C A:=T 1

Prod (A,B)

(1) (2) (3)

Param A Param B Call Prod, 2

n tabelul urmtor se d corespondena dintre instruciunile cu trei adrese i cuadruple: Instruciunea cu trei adrese A:=B op C A:= op B A:= B Param Pa Call Pr , Np goto Q If A oprel B goto Q Cuadruplul (op , B , C , A ) (op , B , _ , A ) ( := , B , _ , A ) ( Param , Pa , _ , _ ) ( Call , Pr , Np , _ ) ( goto , _ , _ , Q) ( oprel , A , B , Q )

Vom exemplifica, n continuare, modul de generare a codului intermediar

Automate, limbaje i compilatoare

151

pentru expresii booolene.


II.5.3.2.1. Expresii booleene

Gramatica ce genereaz expresii booleene este: G=({ E },{id , or , and ,not , oprel , := , ( , ) } , P ,E } cu urmtoarele producii : 1. E E or E 2. E E and E 3. E not E 4. E ( E ) 5. E id 6. E id oprel id Reprezentare prin valorile fals i adevrat Pentru a reprezenta valoarea unei expresii booleene vom folosi valorile 0 pentru fals i 1 pentru adevrat. Expresiile sunt evaluate de la stnga la dreapta innd seama de prioritatea operatorilor: operatorul not este prioritar n raport cu and, care este prioritar n raport cu or. n aciunile semantice asociate regulilor gramaticii, presupunem c toi identificatorii sunt de tip boolean. Gramatica cu atributele i aciunile semantice asociate sunt : 1) E E 1 or E 2 2) E E 1 and E 2 3) E not E 1 4) E ( E 1 ) 5) E id 6) E id 1 oprel id 2 @1 T := Var_Temp ( ) E.intrare := T Gen_cuadr (or, E 1 .intrare, E 2 .intrare, T ) @2 T := Var_Temp ( ) E.intrare := T Gen_cuadr (and, E 1 .intrare, E 2 .intrare, T ) @3 T := Var_Temp ( ) Automate, limbaje i compilatoare 152
Gramatica

@1 @2 @3 @4 @5 @6

E.intrare := T Gen_cuadr (not , E 1 .intrare , _ , T ) @4 @5 @6 E.intrare := E 1 .intrare E.intrare := id.intrare T := Var_Temp ( ) E.intrare := T Gen_cuadr (oprel , id 1 .intrare , id 2 .intrare , Cuadr+3 ) Gen_cuadr ( := , 0 , _ , T ) Gen_cuadr ( goto , _ , _ , Cuadr+2 ) Gen_cuadr ( := , 1 , _ , T ) Cuadr trimite ctre prima intrare liber din tabela de cuadruple. Aceast variabil este incrementat automat la fiecare creare a unui nou cuadruplu, adic la fiecare apel al funciei Gen_cuadr( ). Reprezentarea printr-o poziie de atins Aceast metod, numit i evaluare prin scurt-circuit, permite generarea unui cod corespunztor unei expresii ce va fi evaluat n funcie de valoarea subexpresiilor. Dac avem expresia E 1 or E 2 numai E 1 va fi evaluat dac ea este adevrat. Acest tip de reprezentare este interesant deoarece expresia boolean exemplu : if E then S else S while E do S repeat S until E Expresia urmtoare conine un exemplu de expresie boolean if A < B or A > D then (0) (1) (2) (3) (4) if if A := A+1; A<B A>D goto ( 3 ) goto ( 3 ) Ea se traduce prin cuadruple astfel : sau sau este o condiie ntr-o instruciune iterativ sau condiional; de

atributat pentru expresii booleene

goto ( 5 ) T1 := A+1 A :=T1 153

Codul generat

Automate, limbaje i compilatoare

(5)

Dac utilizm o analiz ascendent, cnd este generat un cuadruplu nu se

cunoate nc intrarea n tabela cuadruplelor ce corespunde ieirii adevrat; nu putem, deci, completa acest cuadruplu. Codul generat pentru expresii booleene va conine un numr de cuadruple de salt (condiional i/sau necondiional) care vor rmne incomplete. Ele se vor completa n funcie de context. Cuadruplele incomplete trebuie memorate ntr-o list. n realitate lucrm cu dou liste asociate unei expresii booleene: una pentru ieirile adevrate i una pentru cele false. Fiecare list conine i cuadruple incomplete. Pentru a manipula aceste liste este nevoie de urmtoarele funcii: - Creaz_lista( n ): creaz o list coninnd cuadruplul incomplet cu indicele
n n tabela cuadruplelor ;

- Concateneaz_liste ( L1,L 2 ) : concateneaz listele definite de pointerii L1 i

L 2 , i returneaz un pointer spre noua list ;


- Completeaz_lista ( L ,n ) : completeaz lista definit de pointerul indicele n al tabelei de cuadruple. Folosim atributele E.true i E.false care conin pointerii catre listele asociate ieirilor adevrat i respectiv fals. Considerm regula E E 1 or E 2 i avem : - dac E 1 este adevrat atunci E este adevrat fr a evalua E 2 ; deci ieirile adevrate ale lui E sunt aceleai cu cele ale lui E 1 ; - dac E 1 este fals atunci trebuie evaluat E 2 ; deci ieirile false ale lui E 1 corespund cu primul cuadruplu al lui E 2 ; - dac E 1 este fals atunci ieirile lui E corespund cu cele ale lui E 2 ; Aciunile semantice vor fi: - completarea listei E 1 .false cu indicele primului cuadruplu al lui E 2 tabloul cuadruplelor ; - concatenarea listelor E 1 .true i E 2 .true pentru a crea lista E.true ; - punerea n coresponden a ieirilor false ale lui E 2 cu cele ale lui E. Pentru regula E E 1 and E 2 avem : - dac E 1 este fals atunci E este fals fr a evalua E 2 ; deci ieirile false ale lui E sunt aceleai cu cele ale lui E 1 ; - dac E 1 este adevrat atunci trebuie evaluat i expresia E 2 ; ieirile adevrate ale lui E 1 corespund primului cuadruplu al lui E 2 ; - dac E 1 este adevrat, atunci ieirile lui E corespund cu cele ale lui E 2 ; Automate, limbaje i compilatoare 154 din

L cu

Aciunile semantice sunt : - completarea listei E 1 .true cu indicele primului cuadruplu al lui E 2 ; - concatenarea listelor E 1 .false i E 2 .false pentru a crea lista E.false ; - punerea n coresponden a ieirilor adevrate ale lui E 2 cu cele ale lui E . Pentru regula E not E 1 este suficient s se inverseze ieirile lui E 1 pentru a obine pe cele ale lui E. Pentru regula E E 1 or E 2 , trebuie completat lista E 1 .false cu indicele din tabloul cuadruplelor unde apare primul cuadruplu al lui E 2 . Dar aceast list este cunoscut numai dup ce s-a utilizat aceast regul de derivare. Trebuie modificat regula astfel nct primul cuadruplu al lui E 2 s poat fi accesibil atunci cnd aciunea semantic are nevoie de el. Adugam un simbol neterminal M cruia i atam un atribut ce memoreaz primul cuadruplu care urmeaz codului generat pentru E 1 . Acesta ne permite s completm lista E 1 .false cnd codul corespunztor lui E 2 a fost generat. Vom avea : E E 1 or ME 2 M @1 .......... Completeaz_Lista ( E 1 .false , M.cuadruplu ) .......... @2 M.cuadruplu :=Cuadruplu_nou Deci variabilei M i asociem atributul M.cuadruplu care memoreaz indicele primei intrri libere din tabloul cuadruplelor; acesta este indicele primului cuadruplu al lui E 2 . Raionnd ca mai sus, rezult urmtoarea asociere a aciunilor semantice pentru regulile de mai jos : E E 1 or ME 2 E E 1 and ME 2 E not E 1 E ( E1 ) E id E id 1 oprel id 2 M @1 @2 @3 @4 @5 @6 @7 @1 @2

Automate, limbaje i compilatoare

155

@1

E.true := Concateneaz_liste ( E 1 . true, E 2 .true ) E.false := E 2 .false Completeaz_lista (E1. false , M.cuadruplu)

@2

E.true := E 2 .true E.false := Concateneaz_liste( E 1 .false , E 2 .false ) Completeaz_lista (E 1 .true , M.cuadruplu )

O nou gramatic atributat pentru expresii booleene

@3

E.true := E 1 .false E.false := E 1 .true

@4

E.true := E 1 .true E.false := E 1 .false

@5

E.true := Creaz_Lista ( Cuadruplu_nou ) E.false := Creaz_Lista ( Cuadruplu_nou+1 ) Gen_cuadr ( oprel , id.intrare , _ , _ ) Gen_cuadr ( goto , _ , _ , _ )

@6

E.true := Creaz_Lista ( Cuadruplu_nou ) E.false := Creaz_Lista ( Cuadruplu_nou+1 ) Gen_cuadr ( oprel , id 1 .intrare , id 2 .intrare , _ ) Gen_cuadr ( goto , _ , _ , _ )

@7

M.cuadruplu := Cuadruplu_nou

Automate, limbaje i compilatoare

156

Teme Curs Teste Autoevaluare 1.

Aplicai algoritmul de aducere la forma polonez pentru expresia

c (a + b ) .............................................. 1 punct

2.

Generai codul de tip arbore pentru instruciunea if id1>id2 then id2:=id1**2. 1 punct

3. 4. 5.

Transpunei n cod cu trei adrese instruciunea A<B or C Generarai codul intermediar pentru expresia A > B , folosind algoritmul Aplicai algoritmul de tip scurt circuitare pentru a genera codul

.............................. 1 punct care utilizeaz valorile fals i adevrat..... 1 punct corespunztor expresiei A or not B and C ....................................... 5 puncte Oficiu .............................. 1 punct

Automate, limbaje i compilatoare

157

Rspunsuri 1. (c (a + b ), $, )

( (a + b ), $, c ) ((a + b ), $, c ) (a + b ), ( $, c ) (+ b ),( $,ca ) (b ), + ( $, ca ) ( ), + ( $, cab ) ( ), ( $, cab + ) ( , $, cab + ) ( , $, cab + )


/\ if / /
>

2.

| \ | / \ \ \ \
** := goto

/\ / \ /

\
et1

id1 id2 id2 / \ / id1


3.

\
2

(0) (1) (2) (3) (4)


4.

if A<B goto (3) T 1 :=0 goto (4) T 1 :=1 T 2 :=T 1 or C

(0) (1) (2) (3) (4)


5.

if A>B goto (3) T1:=0 goto (4) T1:=1

Automate, limbaje i compilatoare

158

Evalum expresia descris de arbore parcurgndu-l ascendent i executnd aciunile semantice asociate fiecrui nod. Presupunnd Cuadruplu_nou este 100 , avem : Nodul 1 : E.true := { 100 } E.false := { 101 } ( 100 ) if A goto _ ( 101 ) goto _ Se creaz listele E.true i E.false, i dou cuadruple incomplete la 100 i 101 . Nodul 2 : M.cuadruplu := 102 c valoarea lui

Indicele 102 conine primul cuadruplu al lui E 2 , adic not B and C Nodul 3: E.true := { 102 } E.false := { 103 } ( 102 ) if B goto _ ( 103 ) goto _ Se creaz listele E.true i E.false, i dou cuadruple incomplete la 102 i 103 . Nodul 4: E.true := { 103 } E.false := { 102 } Se inverseaz listele corespunztoare ieirilor adevrat i fals, deoarece se testeaz expresia not B. Nodul 5 : M.cuadruplu := 104

Indicele 104 conine primul cuadruplu al lui E 2 , adic C. Nodul 6 : E.true := { 104 } E.false := { 105 } ( 104 ) if C goto _ Automate, limbaje i compilatoare 159

( 105 ) goto _ Se creaz listele E.true i E.false i dou cuadruple incomplete la 104 i 105. Nodul 7: E.true := { 104 } E.false := { 102 ,105 } Se creaz listele E.true i E.false i se completeaz cuadruplul de la (103) prin valoarea M.cuadruplu, adic 104: ( 103 ) goto 104 Nodul 8 : E.true := { 100 , 104 } E.false := { 102 , 105 } Se creaz listele E.true i E.false i se completeaz cuadruplele listei E.false, adic cuadruplul cu indicele 101, prin valoarea M.cuadruplu =102 ( 101 ) goto 102 Obinem la ieire listele de cuadruple incomplete : E.true := { 100 , 104 } E.false := { 102 , 105 } i urmtoarea list de cuadruple : ( 100 ) ( 101 ) ( 102 ) ( 103 ) ( 104 ) ( 105 ) if A goto _ goto 102 if B goto _ goto 104 if C goto _ goto _

Rezumat: S-au prezentat trei forme de reprezentare a codului intermediar i

un exemplu pentru expresii booleene.

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar Se va implementa codul intermediar sub una din formele alese pentru a continua etapele urmtoare ale construirii compilatorului Automate, limbaje i compilatoare 160

Teme Laborator/Seminar

1. Scriei un program care s implementeze codul intermediar sub form de arbori sintactici sau cod cu trei adrese
Rezumat: se implementeaz codul intermediar sub o form la alegere

Automate, limbaje i compilatoare

161

Notaii

Automate, limbaje i compilatoare

162

Curs 11 Optimizarea codului

Curs 11 Durata: 2 ore

Descriere General Se prezint trei metode de optimizare a codului: simple, locale i globale. Se detaliaz modul de lucru la nivelul fiecreia i se explic pe exemple avantajele optimizrii respective. Obiective Cunoaterea unor metode de mbuntire a codului intermediar, cu privire la timp de rulare i memorie ocupat

Cuprins II.6.1. Optimizri simple II.6.2. Optimizri globale II.6.3. Optimizri locale

Coninut Curs Optimizarea codului este o faz opional i are ca scop rearanjarea codului intermediar sau obiect n vederea obinerii unui program mai eficient. Eficiena se refer att la memoria folosit la execuie dar, mai ales, la timpul execuiei. Denumirea de optimizare este improprie, deoarece se pot obine programe mai bune dar foarte rar sunt i optime. Iat cteva dintre posibilele surse ale optimizrii: un bun algoritm de programare o alocare inteligent a regitrilor compatibilizarea codului cu structura mainii propagarea constantelor utilizarea identitilor algebrice reducerea aritmetic a operatorilor eliminarea subexpresiilor comune reordonarea codului. Dac optimizrile sunt structurate modular, ele nu vor duce la o cretere
Generaliti

Automate, limbaje i compilatoare

163

substanial a complexitii programului. mbuntirea codului poate fi realizat n paralel cu analiza semantic, n paralel cu generarea de cod sau ntr-un pas separat. Aa cum am precizat, optimizarea se poate realiza att asupra codului intermediar ct i asupra codului obiect. n ultimul caz, mbuntiri importante ale eficienei execuiei se pot obine dac n paralel cu generarea de cod se urmrete optimizarea alocrii regitrilor sau folosirea codului de instruciuni ale mainii. De aceea, metodele folosite pentru optimizarea codului obiect sunt puternic dependente de main i, deci, mai dificil de prezentat ntr-un mod unitar. n cele ce urmeaz ne vom ocupa de optimizarea codului intermediar.

II.6.1. Optimizri simple


Una din cele mai simple exemplu, expresia optimizri este aplatizarea: ea const n
A = 5+ A+C ,

nlocuirea expresiilor ce pot fi evaluate n timpul compilrii prin valorile lor. De


A = 2 + 3 + A + C poate fi nlocuit prin

unde 5 nlocuiete expresia 2 + 3 . Pentru aplatizarea codului se poate ine seama de : - unele identiti algebrice ; de exemplu
X +0= X 0+ X = X X 1 = X 1 X = X 0 /X = 0 X 0 = X

proprietile de asociativitate i comutativitate ale unor operatori; de exemplu, Aplatizarea expresia 5 + A + B + 7 se poate nlocui cu 12 + A + B . n strns legtur cu identitile algebrice se afl i reducerea aritmetic a operatorilor, care const n nlocuirea unui operator cu altul mai puin costisitor; de exemplu 1.
i 2 = 2i = i + i

2.

x / 2 = x 0.5 .

O alt optimizare simpl este propagarea constantelor i const n nlocuirea variabilelor cu valorile lor, dac aceste valori sunt cunoscute la Propagarea constantelor compilare. De exemplu secvena de program
PI := 3.141592 D := PI / 180.0

Automate, limbaje i compilatoare

164

poate fi rescris ca
PI: = 3.141592 D: = 3.141592 / 180.0

sau nc
PI: = 3.141592 D: = 0.0174644

II.6.2. Optimizri globale


Cea mai mare parte a timpului de optimizare a codului intermediar este destinat optimizrii buclelor. Pentru a determina diferitele bucle ale unui program se utilizeaz graful de flux. El este un graf orientat ce definete relaiile dintre blocurile de baz. Un bloc de baz este format din instruciuni consecutive ale programului, care alctuiesc o zon accesibil la execuie doar prin instruciunea de nceput i sunt executate una dup alta exact n ordinea n care apar n program. Astfel, controlul execuiei prsete blocul de baz prin ultima instruciune din bloc. Doar ntr-un bloc de baz se pot controla variabilele fr perturbaii exterioare; deci, mprirea unui program n blocuri de baz este absolut necesar. Dou blocuri de baz dintr-un program nu pot avea instruciuni comune; nseamn c mprirea unui program n blocuri de baz este echivalent cu partiionarea sa. Avnd o secven de instruciuni (cu trei adrese) putem obine lista blocurilor de baz n dou etape: a) se determin primele instruciuni ale blocurilor b) pentru fiecare prim instruciune se construiete blocul ei. Dac n urma acestor operaii rmn instruciuni neincluse n vreun bloc ele pot fi eliminate deoarece nu vor fi executate niciodat. Determinarea primelor instruciuni se face astfel: - prima instruciune din program este prima instruciune a unui bloc - o instruciune ce urmeaz unei instruciuni de transfer este o prim instruciune - o instruciune la care trimite o instruciune de transfer este o prim instruciune. Blocul corespunztor unei prime instruciuni conine aceast instruciune precum i cele care urmeaz pn la urmtoarea prim instruciune, exclusiv aceasta. Prezentm n continuare diferite tipuri de optimizare la nivelul unui bloc de baz, lund ca exemplu algoritmul ce efectueaz produsul scalar a doi vectori:
Bloc de baz

Automate, limbaje i compilatoare

165

produs : = 0 indice : = 1 repeat produs : = produs + A[indice] B[indice] indice : = indice +1 until indice >20 Presupunnd c unui cuvnt i corespund patru octei, programului de mai sus i corespunde urmtoarea secven de cuadruple: (1) (2) (3) (4) (5) (6) (7) (8) (9) produs : = 0 indice : = 1 T1 : = 4 indice T2 : = adresa (A) - 4 T3 : = T2[T1] T4 : = 4 indice T5 : = adresa (B) - 4 T6 : = T5[T4] T7 : = T3 T6

(10) T8 : = produs +T7 (11) produs : = T8 (12) T9 : = indice +1 (13) indice : = T9 (14) if indice < = 20 goto (3) (15) Graful de flux asociat este cel din figura 6.1. O prim optimizare const n determinarea invarianilor din bucle i scoaterea lor n afar. Un invariant este un calcul ce d acelai rezultat la fiecare iteraie. Prin scoaterea n afar a invarianilor acetia se execut o singur dat nainte de intrarea n bucl i deci numrul cuadruplelor ce se execut se micoreaz. n blocul BL2 , cuadruplele (4) (7) T2 : = adresa (A) - 4 T5 : = adresa (B) - 4 i

reprezint invariani dac spaiul de memorie rezervat vectorilor A i B este alocat n mod static.

Automate, limbaje i compilatoare

166

Eliminarea invarianilor

Figura 6.1 Dac scoatem din blocul BL2 cuadruplele (4) i (7) obinem graful de flux din figura 6.2.a. Aceste cuadruple sunt plasate naintea lui BL 2 i formeaz un bloc BL3 .

Automate, limbaje i compilatoare

167

Figura 6.2 Blocurile BL1 i BL3 pot fi combinate ntr-un singur bloc deoarece, BL1 este singurul predecesor al lui BL3 (figura 6.2.b ) Scond cuadruplele (4) i (7), numrul cuadruplelor din bucl scade de la 12 la 10 iar numrul de cuadruple executate scade de la 2+12*20 = 242 la 4+10*20 = 204. Codul obinut poate fi optimizat n continuare prin eliminarea unor variabile induse. Acestea sunt variabile ale cror valori formeaz pe parcursul execuiei repetate a ciclului, o progresie aritmetic. n exemplul nostru, Eliminarea variabila indice crete de la 1 la 20 cu pasul 1 iar T 1 crete de la 4 la 80 cu pasul variabilelor 4. Variabila care se elimin este, n general , cea care este utilizat pentru calculul induse alteia. n cazul nostru se poate elimina variabila indice; cuadruplul (3) T1: = 4*indice se va nlocui cu (3) T1: = T1+4 Variabila T 1 nu are valori iniiale ; de aceea trebuie adugat un cuadruplu pentru a o iniializa la valoarea 0, deoarece la prima iteraie ea are valoarea 4. Acest cuadruplu va fi inserat naintea blocului BL2. Cuadruplele (2), (12) i (13) , care utilizeaz variabila indice, se elimin. Cuadruplul (14) se modific pentru a utiliza variabila T 1 n locul variabilei indice. La ultima execuie, T 1 trebuie s aib valoarea 80, deci noul cuadruplu (14) este (14) if T1< = 76 goto (3) iar BL 2 este singurul succesor al lui BL1

Automate, limbaje i compilatoare

168

Astfel, la ultima iteraie T 1 va avea valoarea 80. Se creaz un nou bloc BL3 pentru a iniializa variabilele T 1 i T 4 iar blocurile BL1 i BL3 se combin ntr-unul singur, deoarece BL1 este singurul predecesor al lui BL3 iar BL3 este singurul succesor al lui BL1 ; astfel se obtine graful de flux cu variabilele induse eliminate

II.6.3. Optimizri locale


Optimizrile locale const n eliminarea instruciunilor inutile, date de existena a dou sau mai multe subexpresii comune, adic subexpresii echivalente sau care produc acelai rezultat. n cazul subexpresiilor comune este suficient s calculm rezultatul o singur dat i apoi doar s-l referim.
Exemplul 6.1. Fie secvena de program

x = ( 1 + 20 ) ( x ) y = x x + ( x/y ) y = z = ( x/y )/( x x ) Codul intermediar generat este: (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) T1 : = (1+20) T2 : = -x x : = T1*T2 T3 : = x x T4 : = x/y y : = T3+T4 T5 : = x/y T6 : = x x z : = T5/T6 y:=z Expresia x x se calculeaz de dou ori, n instruciunile (4) i (8); vom elimina a doua operaie de calculare a acestei valori. n liniile (5) i (7) avem aceeai operaie, x y . Valoarea lui x rmne neschimbat, dar a lui y se modific n linia 6 i deci x y nu este subexpresie comun. Pentru a elimina instruciunile inutile se utilizeaz o structur de date particular n vederea analizrii unui bloc de baz: graful orientat fr cicluri

Automate, limbaje i compilatoare

169

( GOFC ). El descrie modul cum valoarea calculat pentru fiecare cuadruplu este utilizat n alte instruciuni ale blocului. El permite detectarea subexpresiilor comune unui bloc, a identificatorilor utilizai ntr-un bloc i evaluai n altul i a cuadruplelor ale cror valori sunt utilizate n afara blocului. ntr-un GOFC , nodurile sunt etichetate astfel: - fiecare terminal este etichetat cu un identificator (nume de variabil sau de constant) indiciat prin valoarea 0; indicele precizeaz c este vorba de o valoare iniial a identificatorului; - un nod interior este etichetat printr-un operator; el reprezint valoarea calculat pentru expresia corespunztoare acestui nod; - nodurile interioare pot fi etichetate, n plus, printr-o mulime de identificatori care au valoarea calculat n acel nod. Nu trebuie confundat graful de flux cu un GOFC . Fiecare nod al unui graf de flux poate fi reprezentat printr-un GOFC . Pentru a construi un GOFC , se ia fiecare bloc de baz i se trateaz toate cuadruplele. Cnd se ntlnete un cuadruplu de tipul

A := B op C , se examineaz nodurile reprezentnd valorile

curente ale identificatorilor B i C . Se creaz un nou nod etichetat op cu doi fii, la stnga nodul asociat lui B i la dreapta cel asociat lui C . Apoi se adaug eticheta A nodului op . Dac exist deja un nod reprezentnd pe B op C , nu se mai creaz un nou nod, doar se adaug A la lista identificatorilor asociai acestui nod. Dac A a etichetat n prealabil un alt nod, care nu e terminal, se elimin aceast etichet, cci valoarea curent a lui A este valoarea noului nod creat. Graf orientat Pentru cuadruplul A := B nu se creaz un nou nod, ci se adaug eticheta A la fr cicluri nodul ce corespunde valorii curente B . Pentru a defini funcia de creare a unui
GOFC , ce returneaz un pointer ctre ultimul nod creat, utilizm urmtoarele

funcii : - Nod ( identificator ) : returneaz un pointer ctre nodul cu eticheta identificator dac exist , n caz contrar returneaz Nil ; - Nod _ operator (op, pointer_st, pointer_dr): returneaz un pointer ctre nodul cu eticheta op care are ca descendent stng nodul definit de pointer_st iar ca descendent drept nodul definit de pointer_dr; n caz contrar returneaz Nil; Vom aplica aceast funcie pentru blocul BL2 din figura 6.1;

Automate, limbaje i compilatoare

170

Se observ c : - subexpresiile comune apar n acelai nod; T1 i T4, de exemplu - variabilele temporare inutile de tipul T8 : = produs +T7 produs : = T8 apar n acelai nod. GOFC permite reconstruirea listei simplificate a cuadruplelor eliminnd subexpresiile comune i cuadruplele de tipul A := B cu excepia celor care sunt necesare. n cazul cnd lista asociat unui nod operator conine numai variabile temporare se alege una la ntmplare, fiind foarte probabil ca ele s fie utilizate
, numai n blocul de baz curent. De exemplu, n cazul nodului T 1T 4 se poate reine oricare din variabilele T 1 i T 4 . Dac lista conine i o variabil din program, de exemplu T 1, T 4, A , ar trebui s optm pentru A deoarece este posibil ca aceasta s fie folosit n blocurile urmtoare. Pentru a ti care variabil este utilizat n blocurile urmtoare, trebuie fcut o analiz global, pe graful de flux, a transferului de valori ale variabilelor ntre blocuri. Dac n urma acestei analize rezult c, din lista de identificatori asociat unui nod, este posibil s avem nevoie n blocurile urmtoare de mai multe variabile, atunci alegem dintre aceti identificatori unul la ntmplare, fie el A , i pentru ceilali, fie ei B1 , B2 ,...Bk , introducem atribuirile B1 := A, B2 := A,...., Bk := A .

Automate, limbaje i compilatoare

171

Teme Curs Teste Autoevaluare 1. Ilustrai grafic (prin arbori sintactici) efectul aplatizrii expresiei

(2 * i )* 3 ...................................................................................... 1 punct
2. Generai codul intermediar cu trei adrese corespunztor programului de

mai jos, apoi realizai mprirea n blocuri de baz i construii graful de flux. FACT 1 for i = 2 to n do FACT FACT i FACTORIAL FACT .. 4 (=2+1+1) puncte
3. Efectuai optimizri simple i locale pentru urmtoarea secven de cod

intermediar (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) T1 : = (1+20) T2 : = -x x : = T1*T2 T3 : = x x T4 : = x/y y : = T3+T4 T5 : = x/y T6 : = x x z : = T5/T6 y:=z

.. 2 puncte
4.

Care

este

deosebirea

dintre

graful

de

flux

si

GOFC?...................................................................................................... 1 punct
5. Ce

se

reduce

prin

optimizrile

globale

(memorie,

timp)?............................................................................................... 1 punct Oficiu.. 1 punct Automate, limbaje i compilatoare 172

Rspunsuri 1.

2.

Codul intermediar (1) FACT 1 (2) i 2 (3) if i>n then goto (7) (4) FACT FACT * i (5) i i+1 (6) goto (3) (7) FACTORIAL FACT

mprirea n blocuri de baz

Graful de flux

Automate, limbaje i compilatoare

173

Figura 6.3
3.

Dup propagarea constantelor i eliminarea expresiilor comune, codul T2 : = -x x : = 21*T2 T3 : = x x T4 : = x/y y : = T3+T4 T5 : = x/y z : = T5/T3 y:=z

devine:

4. Fiecare nod al unui graf de flux poate fi reprezentat printr-un GOFC 5. Memorie i timp Rezumat: S-au prezentat modaliti de realizare a optimizrilor de tip: local,

global, simplu

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar Pentru fiecare tip de optimizare studiat se cere s se scrie cte un program care s implementeze metoda respectiv.

Automate, limbaje i compilatoare

174

Teme Laborator/Seminar 1. Scriei un program care s realizeze mprirea n blocuri de baz. 2. Scriei un program care, pentru o secven de cod intermediar cu trei

adrese, s efectueze optimizrile simple i locale


3. Scriei un program care efectueaz optimizri globale la nivelul unui bloc

de baz
Rezumat: se implementeaz tipurile de optimizri studiate

Automate, limbaje i compilatoare

175

Notaii

Automate, limbaje i compilatoare

176

Curs 12 Generarea codului obiect


Descriere General

Curs 12 Durata:

2 ore

Se prezint trei forme de reprezentare a codului intermediar: forma polonez, arbori sintactici i triplete. Ca model se prezint codul intermediar pentru expresii booleene
Obiective

cunoaterea tipurilor de cod obiect cunoaterea generrii codului pentru calculatoare cu un singur registru cunoaterea metodelor de generare a codului pentru calculatoare cu regitri generali modaliti de mbuntire a codului obiect

Cuprins

II.7.1. Generaliti II.7.2. Generarea codului pentru calculatoare cu registru acumulator II. 7.3. Generarea codului pentru calculatoare cu regitri generali II.7.3.1. Gestiunea regitrilor II.7.3.2. Utilizarea GOFC n generarea codului obiect

Coninut Curs

II.7.1. Generaliti
Ultima faz a compilrii are ca scop sinteza programului obiect, program executabil sau aproape executabil, n sensul c el poate fi preluat de un alt procesor de limbaj implementat pe calculatorul int i tradus de acesta n cod executabil. Generarea codului este una din fazele cele mai importante i mai dificile. Pentru implementarea sa sunt necesare cunotine aprofundate despre maina cu care se lucreaz. Forma luat de programul obiect este, de obicei, una din urmtoarele: 1) Program executabil : rezultatul obinut este direct executabil. El este stocat ntr-o zon de memorie fix i toate adresele sunt puse la zi. Aceast form este

Automate, limbaje i compilatoare

177

recomandat pentru programele mici. Inconvenientul su const n lipsa de flexibilitate. Compilarea modular este imposibil, toate modulele trebuind s fie Tipuri de cod compilate simultan. 2) Program obiect. Aceast form este numit i translatabil; nainte de execuie este necesar faza de editare de legturi, care permite i legarea unor rutine din bibliotec sau realizate de utilizatori. Este soluia cea mai des ntlnit n cazul compilatoarelor comerciale. 3) Program n limbaj de asamblare. Este forma cea mai simpl de generat, deoarece instruciunile sunt foarte apropiate de cele cu trei adrese. Programul este reprezentat de o mulime de instruciuni simbolice care necesit o faz de asamblare nainte de execuie. Deci, generarea codului este simplificat, dar rezultatul nu poate fi direct utilizabil. 4) Program ntr-un alt limbaj, preprocesoarelor de limbaje. Generarea codului este dependent de calculatorul int ca i de sistemul de operare al acestuia. De aceea prezentarea sa necesit unele presupuneri privind structura calculatorului int i a setului su de instruciuni. Pe de alt parte, ea este influenat de forma codului intermediar precum i de gradul n care compilatorul a rezolvat problemele traducerii: a fcut verificrile semantice, a introdus conversii, a optimizat codul intermediar, l-a structurat pe blocuri de baz, etc. n cele ce urmeaz vom analiza generarea de cod pentru dou tipuri de calculatoare: a) calculatoare cu acumulator b) calculatoare cu un numr de regitri generali. Presupunem c n fazele anterioare s-au realizat toate verificrile semantice, s-a optimizat codul intermediar, etc. Pentru fiecare variabil tim adresa ei la execuie, prin perechea (registru ce conine o adres de nceput a nregistrrii de activare, deplasamentul n aceast zon). Mai presupunem c toate operaiile din codul intermediar au un corespondent n setul de instruciuni ale calculatorului iar variabilele sunt simple. Pentru uurina nelegerii vom genera codul obiect n limbaj de asamblare n care variabilele apar prin numele lor i nu prin referine, deplasamente, etc. Generarea codului obiect apare ca un proces n care se parcurge instruciune cu instruciune forma intermediar, apelndu-se pentru fiecare tip de instruciune proceduri de generare care simplific mult generarea de cod, dar necesit cel puin o compilare suplimentar pentru a putea fi executat. Este cazul
obiect

Automate, limbaje i compilatoare

178

corespunztoare. Pentru a genera un cod eficient trebuie s se in seama de unele detalii legate de calculatorul int: 1) majoritatea calculatoarelor permit efectuarea unor calcule n mai multe feluri utiliznd diferite instruciuni; de exemplu nr := nr + 1 se poate traduce prin MOV AX , nr INC AX MOV sau ADD nr, 1 ; se adun 1 la coninutul zonei de memorie nr 2) diferitele forme de traducere a aceleiai secvene de instruciuni nu folosesc, n general , acelai numr de regitri. Costul unei instruciuni const n lungimea sa n bii sau n timpul de execuie. Strategiile optimizrii tind s se concentreze pe reducerea costului de execuie, deoarece majoritatea utilizatorilor apreciaz mai mult viteza de execuie dect spaiul ocupat. Instruciunile care lucreaz cu regitri, fr a face apel la memorie, au un timp de execuie mai mic i ocup mai puin memorie. O alt posibilitate de a optimiza codul const n eliberarea zonelor de memorie ocupate de variabile nefolositoare. n momentul cnd o variabil devine nefolositoare i valoarea sa se afl ntr-un registru, ea poate fi tears din acesta. Cnd se ajunge la finalul unui bloc de baz, valoarea fiecrei variabile folositoare trebuie pstrat fie ntr-un registru, fie n memoria principal prin intermediul variabilelor temporare. ; ncarc valoarea lui nr n registrul AX ; incrementeaz 1 la coninutul registrului AX corespunztoare lui nr
Generaliti

nr, AX ; se stocheaz coninutul registrului AX n locaia

II.7.2. Generarea codului pentru calculatoare cu registru acumulator


Toate calculele trebuie efectuate ntr-un singur registru, numit adesea acumulator. Acumulatorul va fi continuu alocat la diferite variabile astfel nct s se minimizeze numrul de instruciuni ale codului generat. S lum mai nti un exemplu simplu care arat cum poate fi utilizat n mod eficient registrul acumulator. Printre instruciunile existente n limbajul de asamblare sunt urmtoarele: LOD X STO X ; ncarc valoarea X n registrul acumulator ; memoreaz coninutul registrului acumulator ntr-un

Automate, limbaje i compilatoare

179

cuvnt de memorie notat cu X ADD X SUB X MUL X ; adun valoarea lui X la valoarea acumulatorului ; valoarea variabilei X se scade din valoarea acumulatorului ; valoarea variabilei X este multiplicat prin valoarea acumulatorului DIV X ; valoarea acumulatorului se mparte la valoarea variabilei X Toate cele patru operaii aritmetice plaseaz rezultatul n acumulator i las neschimbat coninutul lui X. Compilatorul utilizeaz forma polonez pentru reprezentarea codului intermediar. Codul pentru operatorii aritmetici binari este generat conform urmtorului algoritm : 1) se ncarc primul operand n acumulator; 2) se aplic operatorul folosind al doilea operand i lsnd rezultatul n acumulator; 3) se memoreaz rezultatul ntr-o variabil temporar. De exemplu, expresia x+y, care se reprezint n forma polonez ca xy+, se translateaz conform acestui algoritm n LOD x ADD y STO T1 unde T1 este adresa unei locaii de memorie care conine valoarea unui rezultat intermediar. Codul pentru operatorul de asignare ,,:='' este generat conform urmtorului algoritm simplu : 1. se ncarc valoarea prii drepte a instruciunii de asignare n acumulator; 2. se memoreaz acest rezultat n variabila specificat. Algoritmul parcurge liniar irul, aflat n form polonez. Cnd este ntlnit un operator, se selecteaz ultimele dou simboluri din stiv, se execut operaia indicat de operator, iar rezultatul obinut este plasat n stiv. Deoarece operatorii sunt binari, se afiaz un mesaj de eroare dac stiva nu conine doi operanzi la ntlnirea unui operator. Dac algoritmul s-a terminat i au mai rmas operanzi n stiv, expresia nu este o instruciune de atribuire valid. Considerm instruciunea
X A + (B * C + D ) care se reprezint n

Instrutiuni cod obiect

forma polonez postfix ca XABC* D + + Algoritmul precedent produce urmtorul cod : LOD B MUL C STO T1 LOD T1 Automate, limbaje i compilatoare 180

ADD D STO T2 LOD A ADD T2 STO T3 LOD T3 STO X Codul generat nu este optim , cci secvene de tipul STO Ti LOD Ti sunt inutile. De asemenea, codul poate fi rearanjat folosind proprietatea de comutativitate a operatorilor de adunare i nmulire. Astfel, secvena : STO T2 LOD A ADD T2 poate fi rescris sub forma STO T2 LOD T2 ADD A deoarece T2 + A are aceeai valoare cu A +T2.

Exemplu de generare cod obiect

II. 7.3. Generarea codului pentru calculatoare cu regitri generali


II.7.3.1. Gestiunea regitrilor

n vederea generrii codului obiect pentru calculatoare cu regitri generali vom considera codul intermediar sub forma instruciunilor cu trei adrese. Pentru uurina exprimrii vom lucra cu expresii aritmetice pentru care sunt verificate condiiile de mai jos. a) Variabilele sunt simple i alocate static. n vederea alocrii regitrilor trebuie cunoscut starea lor: un registru poate fi disponibil, adic memoreaz o valoare nesemnificativ, sau poate fi ocupat, cnd conine o valoare utilizabil n continuare. Notm cu Var( R ) mulimea variabilelor a cror valoare se afl n registrul R . b) Pentru fiecare variabil este necesar s se cunoasc locul unde se afl valoarea sa curent. Notm cu Loc( X ) mulimea locurilor n care se afl la un moment

Automate, limbaje i compilatoare

181

dat valoarea variabilei X . c) Pentru utilizarea eficient a regitrilor este necesar cunoaterea, pentru fiecare apariie a unei variabile n codul intermediar, a urmtoarei ei utilizri. Procedura de determinare a urmtoarei utilizri poate fi simplificat dac ne Informaii limitm la un bloc de baz i considerm c la ieirea dintr-un bloc toate necesare la variabilele sunt utilizate n continuare. Notm cu Ni( A ) numrul urmtoarei generarea instruciuni din bloc ce folosete valoarea curent a variabilei A . Dac
codului obiect

Ni( A ) = 0 , nseamn c A nu are o utilizare urmtoare n blocul curent.


d) Gestiunea regitrilor generali este asigurat de procedura GESTREG care ntoarce o locaie L ce urmeaz s fie folosit pentru memorarea unei valori a unei variabile A obinut prin instruciunea A := B op C . Locaia poate fi un registru sau o locaie de memorie. Procedura determin locaia L cercetnd succesiv urmtoarele cazuri : 1) B se afl ntr-un registru R i este ultima ei utilizare naintea unei atribuiri B : = .... Vom folosi pentru A chiar registrul folosit de B ; deci L R ; 2) exist un registru R disponibil ; se ia L = R ; 3) variabila A este utilizat n continuare n blocul curent i se gsete un registru care poate fi eliberat (este posibil ca toi regitri s fie ocupai); fie acesta R . Se elibereaz registrul R prin salvarea valorii sale ntr-o locaie de memorie i se ia L = R . 4) trebuie folosit chiar locaia de memorie rezervat pentru A . Algoritmul de generare a codului este urmtorul
Algoritmul 7.1 - ( GENCOD1 )

Algoritm de generare cod obiect, folosind procedura

Intrare : O instruciune cu trei adrese de tipul A := B op C Ieire : Codul obiect corespunztor acestei instruciuni Metoda : operaia B op C ; n mod obinuit L este un registru, dar poate fi i o locaie de memorie. 2. Consult mulimea Loc( B ) pentru a determina locaia curent B' a lui B . Preferm un registru pentru B' dac valoarea lui B se afl att n memorie ct i ntr-un registru. Dac valoarea lui B nu se afl deja n L , genereaz instruciunea :

1. Cheam funcia GESTREG pentru a determina locaia L unde se va executa GESTREG

Automate, limbaje i compilatoare

182

MOV B' , L 3. Genereaz instruciunea op C' , L unde C' este locaia curent a lui C . Din nou preferm un registru dac valoarea lui C se afl i n memorie i ntr-unul sau mai muli regitri.

II.7.3.2. Utilizarea GOFC n generarea codului obiect

a) Reordonarea nodurilor. Avantajul utilizrii grafurilor orientate fr cicluri n generarea codului obiect const n posibilitatea alegerii unei secvene de instruciuni cu trei adrese ntr-o ordine mai convenabil pentru obinerea unui cod eficient: program mai scurt i variabile temporare mai puine.
Exemplul 7.1.

Fie expresia

( A + B ) (E (C + D )) . n figura 7.1.a

este

prezentat codul intermediar, n 7.1.b GOFC corespunztor iar n 7.1.c codul generat conform algoritmului anterior, considernd c avem disponibili doi regitri.

Optimizarea codului prin rearanjarea nodurilor

S rearanjm codul intermediar astfel nct T1 s apar imediat naintea lui T4 T2 : = C+D T3 : = E - T2 T1 : = A+B T4 : = T1 - T3 Folosind din nou algoritmul GENCOD1 obinem MOV C, R0 ADD D, R0 MOV E, R1 SUB R0, R1 Automate, limbaje i compilatoare 183

MOV A, R0 ADD B , R0 SUB R1, R0 MOV R0, T4. Din exemplul anterior rezult c mbuntirea codului generat s-a

obinut prin plasarea instruciunii de calcul a lui T 1 imediat naintea instruciunii de calcul a lui T 4 , n cadrul creia T 1 este primul operand. Pe baza acestei observaii putem afirma c, de regul, obinem un cod mai bun dac plasm calculul celui mai din stnga operand chiar naintea instruciunii care conine operaia. Astfel operandul se va gsi ntr-un registru n momentul cnd avem nevoie de el, economisind astfel o memorare i o ncrcare n registru. Pentru a obine lista nodurilor din GOFC ordonate conform acestei observaii, se parcurge arborele de la rdcin spre frunze listnd nti nodurile rezultat. Apoi, listm nodurile operanzi ncepnd cu cel mai din stnga dac toi prinii lui au fost evaluai. Ne intereseaz numai nodurile interioare, crora le corespund temporare. Se obine secvena optimizat a instruciunilor n ordinea invers.
Algoritmul 7.2 - de listare a nodurilor (LISTNOD )

Intrare : un GOFC Ieire : secvena optimizat a instruciunilor n ordine invers Metoda : while mai exist noduri interioare nelistate do begin selecteaz un nod interior nelistat n , ai crui prini au fost listai listeaz n while cel mai din stnga descendent m al lui n are toi prinii listai i m nu este nod frunz do begin listeaz m
n m
Algoritmul de optimizare prin rearanjarea nodurilor

end end b) Etichetarea nodurilor Evitarea memorrii rezultatelor pariale, pstrnd pe ct posibil aceste

Automate, limbaje i compilatoare

184

valori n regitri mainii, necesit cunoaterea numrului de regitri necesari generrii codului pentru diferite secvene de instruciuni cu trei adrese. Stabilirea acestui numr se numete etichetare. Etichetarea se realizeaz vizitnd nodurile de jos n sus astfel nct un nod nu este vizitat atta timp ct descendenii si nu au fost etichetai. Etichetarea nodurilor se face conform algoritmului urmtor:
Algoritmul 7.3 - de etichetare

Intrare : nodul n mpreun cu descendenii si etichetai Ieire : eticheta lui n Metoda : if n este nod terminal then if n este descendentul cel mai din stnga al printelui su then eticheta ( n ) 1 else eticheta ( n ) 0 else begin fie n1 , n2 ,..., nk descendenii lui n n ordinea dat de etichete : eticheta( n1 ) eticheta( n2 ) ..... eticheta( nk ) eticheta( n ) max (eticheta( ni ) + i 1 )
1i k

Determinarea numrului de regitri necesari

end n cazul cnd n este un nod binar cu descendenii avnd etichetele


n1 i n 2 , formula de etichetare a sa devine

max( n1 ,n2 ) dac n1 n2 eticheta( n ) = dac n1 = n2 n1 + 1

Odat etichetat arborele, se poate genera codul folosind procedura GENCOD 2 pe care o prezentm n continuare pentru cazul arborilor binari; extinderea sa la arbori cu mai mult de doi descendeni se poate face fr dificultate.
Algoritmul 7.4 - GENCOD2

Intrare : un arbore de derivare etichetat Ieire : codul obiect asociat arborelui

Automate, limbaje i compilatoare

185

Metoda

Algoritmul este o procedur recursiv care aplicat unui nod

genereaz codul arborelui dominat de acel nod . Se utilizeaz : a) o stiv Stiva care reine toi regitri disponibili la un moment dat, din cei r ai mainii; iniial stiva conine toi cei r regitri. Pentru a lucra cu o stiv s se folosesc :

procedura PUSH ( s , x ) care depune n stiva s valoarea x funcia POP( s ) care descarc stiva s funcia VARF ( s ) care ntoarce valoarea din vrful stivei procedura PERM ( s ) care permut dou valori din vrful stivei.
La ieirea din GENCOD2( n ) , registrul din vrful stivei este cel care conine valoarea calculat pentru nodul n . b) o stiv Temp care menine lista variabilelor temporare T 0, T 1,L , pe care le poate folosi n continuare. Cnd cei r regitri sunt ocupai, algoritmul ia o celul temporar din vrful stivei. procedure GENCOD2 (n) begin if n este un nod frunz reprezentnd operandul nume i este cel mai din stnga descendent al tatlui su then

{ cazul 1 }
write (' MOV ' , nume, VRF (Stiva ) ) else if n este un nod interior cu operatorul op , descendentul stng n1 i cel drept n2 then
Algoritm recursiv de generare cod

{ cazul 2 }
if eticheta ( n2 ) = 0 then begin fie nume operandul reprezentat de n2 call GENCOD2 ( n1 ) write (op, nume, VRF (Stiva )) end else if 1 eticheta( n1 )<eticheta( n2 ) i

Automate, limbaje i compilatoare

186

eticheta( n1 )< r then

{ cazul 3 }
begin call PERM ( Stiva ) call GENCOD2 ( n2 ) reg POP ( Stiva ) call GENCOD2 ( n1 ) write (op, reg, VRF(Stiva) ) call PUSH (Stiva, reg ) call PERM (Stiva ) end else if 1 eticheta(n2 ) eticheta(n1 ) i
eticheta( n2 ) < r

then

{ cazul 4 }
begin call GENCOD2 ( n1 ) reg POP ( Stiva ) call GENCOD2 ( n2 ) write (op, VRF(Stiva ), reg) call PUSH (Stiva, reg ) end else

{ cazul 5: ambele etichete sunt mai mari dect n }


begin call GENCOD2 ( n2 ) t POP ( Temp) write ('MOV ' , VRF(Stiva), t ) call GENCOD2 ( n1 ) call PUSH (Temp, t ) write( op, t, VRF (Stiva ) ) end end

Automate, limbaje i compilatoare

187

n funcie de nodul ntlnit, algoritmul se poate afla n una din situaiile urmtoare : 1) Nod frunz, fiind cel mai din stnga descendent al nodurilor tat. El are eticheta 1, deci necesit o ncrcare ntr-un registru a valorii reprezentate de acest nod. Extragem registrul din vrful stivei Stiva i executm instruciunea
MOV de ncrcare n el a operandului indicat de nod.

2) Nod interior, avnd ca descendent dreapta un nod frunz. Operaia indicat de nodul curent poate fi realizat cu condiia evalurii n prealabil a descendentului stng. Se apeleaz recursiv algoritmul GENCOD 2 pentru descendentul stng, dup care se genereaz codul operaiei nodului curent folosind registrul din vrful stivei Stiva . 3) Nod interior, avnd ca operanzi subarborii dominai de nodurile cu
eticheta(n1 ) < eticheta(n2 ) n1 i n2

eticheta(n1 ) < r . Procedura se apeleaz

recursiv pentru a genera codul operandului doi i apoi al primului. Inversarea ordinei de generare este precedat de permutarea a doi regitri din vrful stivei
Stiva ; este vorba de acei regitri ce vor conine rezultatele operanzilor. nainte de

ieirea din procedur, stiva se reface repermutnd regitri din vrful su. 4) Nod interior n condiiile de la 3), doar c eticheta(n1 ) eticheta(n2 ) permutarea i refacerea celor doi regitri din vrful stivei. 5) Nod interior, avnd operanzii subarbori dominai de nodurile
n1 i n2 cu

si

eticheta(n2 ) < r . Se execut operaiile de la 3) fr a mai fi nevoie de

eticheta( ni ) r , i { 2}. Dup generarea codului pentru al doilea operand se 1, salveaz coninutul registrului din vrful stivei (cel ce conine rezultatul operandului) ntr-o variabil temporar extras din stiva Temp . Dup generarea codului pentru primul operand, variabila este rentoars n Temp , iar codul de operaie generat va conine referine la variabila temporar i la registrul din vrful stivei.

Automate, limbaje i compilatoare

188

Teme Curs Teste Autoevaluare 1.

Optimizai codul corespunztor expresiei XABC* D + + , n cazul cnd se folosete un singur registru.. 1 punct

2. Fiind dat codul cu trei adrese


T 1 := A B T 2 := A C T 3 := T 1 + T 2 T 4 := T 3 + T 2

se

genereze

codul

obiect

folosind

algoritmul

GENCOD1.... 2 puncte
3. Folosind algoritmul de listare a nodurilor, rearanjai codul intermediar dat

de arborele urmtor

2 puncte
4. Folosind algoritmul GENCOD2, generai codul corespunztor expresiei

( A + B ) (E (C + D )) ... 4 puncte
Oficiu... 1 punct

Automate, limbaje i compilatoare

189

Rspunsuri 1.

LOD B MUL C ADD D ADD A STO X


2.

MOV A, R0 SUB B, R0 MOV A, R1 SUB C, R1 ADD R1, R0 ADD R1, R0 MOV R0, D
3.

T7 : = D+E T6 : = A+B T5 : = T6 - C T4 : = T5 T8 T3 : = T4 - E T2 : = T6 + T4 T1 : = T2 T3
4.

GENCOD2 (T4) GENCOD2 (T3) GENCOD2 (E) MOV E, R1 GENCOD2 (T2) MOV C, R0 ADD D, R0 SUB R0, R1

[R1 R0] [R0 R1] [R0 R1] [R0]

GENCOD2 (C) [R0]

Automate, limbaje i compilatoare

190

GENCOD2 (T1) GENCOD2 (A) MOV A, R0 ADD B, R0 SUB R1, R0

[R0] [R0]

Rezumat: S-au prezentat doi algoritmi de generare a codului obiect i cte un

algoritm de optimizare din punct de vedere al numrului de instruciuni i al numrului de regitri.

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar Se vor implementa algoritmii de optimizare a codului folosind graful orientat fr cicluri i un algoritm de generare a codului obiect
Teme Laborator/Seminar

1. Implementai algoritmul de listare a nodurilor 2. Implementai algoritmul de etichetare a nodurilor 3. Implementai algoritmul GENCOD2
Rezumat: se implementeaz un algoritm de generare cod obiect i algoritmii

de optimizare

Automate, limbaje i compilatoare

191

Notaii

Automate, limbaje i compilatoare

192

Curs 13 Tabela de simboluri


Descriere General Se prezint noiuni generale cu privire la importana tabelei de simboluri, diferite moduri de implementare i gestiune a tabelei de simboluri i reprezentarea identificatorilor innd seama de domeniul de valabilitate. Obiective - cunoaterea structurii i utilitii tabelei de simboluri - cunoaterea principalelor moduri de organizare a tabelei de simboluri

Curs 13 Durata: 2 ore

Cuprins II.8.1. Generaliti II.8.2. Organizarea tabelei de simboluri II.8.2.1. Tabele neordonate II.8.2.2. Tabele ordonate alfabetic II.8.2.3. Tabele arborescente II. 8.2.4. Tabele dispersate II.8.3. Reprezentarea identificatorilor innd seama de domeniul de valabilitate

Coninut Curs

II.8.1. Generaliti
Informaia selectat de compilator n legtur cu numele simbolice care apar n programul surs se afl, de obicei, concentrat ntr-o structur numit tabela de simboluri. n cea mai simpl form, tabela de simboluri apare ca un tablou de nregistrri, dar exist i alte forme de reprezentare a sa: arbori, liste, etc. Tabela de simboluri este divizat n dou pri : numele, care este un ir de caractere reprezentnd identificatorul i informaia care conine tipul identificatorului: integer, real, record, array, etc. utilizarea sa : parametru formal, etichet, subprogram, etc.
Generaliti cu privire la structura i utilizarea

Automate, limbaje i compilatoare

193

domeniul de definiie: pentru un tablou, de exemplu, numrul dimensiunilor, tabelei de limitele fiecarei dimensiuni, etc. adresa de memorie, etc. Aceast divizare a tabelei de simboluri se face cu scopul de a economisi memorie. Numele simbolice devin la un moment dat inutile, cum se ntmpl la ieirea din domeniul de valabilitate al variabilelor desemnate prin aceste nume. Spaiul folosit pentru pstrarea numelor poate fi reutilizat n cazul cnd numele memorate nu mai apar n program. Tabela de simboluri poate fi constituit dintr-o mulime de tabele, fie specializate pentru variabile, proceduri, constante, etichete, etc., fie difereniate pe baza lungimii numelui simbolic: tabele cu nume de cel mult patru caractere, tabele cu nume de cel mult 5-8 caractere, etc. Tabela de simboluri este utilizat n diferite faze ale compilrii: n faza de analiz lexical i sintactic, cnd, la ntlnirea unui nume n program, compilatorul (de obicei analizorul lexical) verific dac numele respectiv se afl memorat sau nu n tabel. Dac numele nu se afl n tabel, el este introdus, reinndu-se adresa intrrii; n faza de analiz semantic, pentru a verifica dac utilizarea identificatorilor este n concordan cu declaraiile; n faza generrii de cod pentru a determina lungimea zonelor de memorie alocate variabilelor; n faza de tratare a erorilor, pentru a evita mesaje redundante. Diferitele aciuni executate de compilator asupra tabelei de simboluri sunt: verificarea dac un nume este ntlnit pentru prima dat sau nu; adugarea unui nume ntlnit pentru prima dat; adugarea unei informaii la un nume; tergerea unui nume sau grup de nume. Deoarece performanele unui compilator depind n mare msur de eficiena cutrii n tabela de simboluri, iar cutarea are loc pentru fiecare simbol ntlnit, este foarte important metoda de organizare a tabelei de simboluri.
simboluri

II.8.2. Organizarea tabelei de simboluri


O prim clasificare a tabelei de simboluri este dat de existena sau inexistena unor criterii de cutare n tabel. Dac asemenea criterii nu exist, tabela este neordonat; dac exist un mecanism care s grbeasc gsirea unui

Automate, limbaje i compilatoare

194

simbol n tabel, aceasta este ordonat. Tabelele ordonate se clasific la rndul lor dup mecanismul folosit pentru accesul la intrri. II.8.2.1. Tabele neordonate Organizarea cea mai simpl a unei tabele de simboluri const n adugarea secvenial de noi intrri pe msur ce ele apar, n ordinea apariiei. Organizarea tabelei de simboluri depinde de limbaj. Pentru un limbaj ce impune o lungime maxim asupra numelor, memorarea va fi diferit fa de un limbaj care nu impune aceast cerin. Cnd lungimea este limitat, se poate rezerva un spaiu maxim pentru a memora numele. Implementarea se face ca n figura 8.1. Nume Identif1 A B Informaii ntreg,, variabila simpl ir,., etichet real,.., variabil simpl
Tabele neordonate

Figura 8.1 Cnd lungimea nu este limitat, nu ne putem permite s rezervm un spaiu maxim pentru a stoca numele, deoarece spaiul pierdut ar fi prea mare. n acest caz vom stoca numele sub forma unui pointer ctre tabela numelor. Vom avea, deci dou tabele: una care conine numele i alta care conine informaiile i pointerii ctre prima. Lungimea numelor se stocheaz n tabela informaiilor sau n tabela numelor sau va fi implicit. Dezavantajul reprezentrii tabelei de simboluri sub form de tablou const n faptul c pentru identificarea unui nume este necesar cutarea sa ncepnd cu prima nregistrare pn cnd este gsit sau pn la sfrit. Cutarea poate fi optimizat dac plasm cele mai frecvent utilizate nume la nceputul tabelei. Pentru aceasta se suprapune peste structura secvenial a tabelei, o structur de list, ca n figura urmtoare. n acest caz, cutarea se face n ordinea dat de legturi.

Automate, limbaje i compilatoare

195

Figura 8.2

II.8.2.2. Tabele ordonate alfabetic n tabelele ordonate alfabetic ordinea intrrilor este dat de ordinea alfabetic a numelor. Dac tabela este un tablou de nregistrri, cea mai adecvat cutare este cea binar. Presupunnd c sunt ocupate n intrri din tabel, cutarea se face cu funcia Caut_bin(x,k) p1 un gsit fals repeat i [(p+u)/2] if x<Nume[i] then u i-1 else if x>Nume[i] then p i+1 else begin gsit true ki end until gsit or p>u if not gsit then k 0 Automate, limbaje i compilatoare 196
Algoritmul de cutare binar ntr-o tabel ordonat alfabetic

unde [x ] reprezint partea ntreag a lui x . Procedura primete la intrare numele x i ntoarce indexul k al intrrii n care a gsit numele sau k =0, dac nu l-a gsit. nregistrrile din tabel sunt R1 , R2 ,L , Rn avnd numele Nume1 , Nume2 ,L , Numen . II.8.2.3. Tabele arborescente Unele compilatoare folosesc arbori binari pentru reprezentarea

simbolurilor. Fiecare nod reprezint o intrare n tabel; el conine pe lng nume i atribute, o legtur spre stnga i una spre dreapta ctre arborii ce conin nume mai mici i respectiv mai mari dect numele respectiv, n ordinea alfabetic (figura 8.3). f / / / ................ b ................. / / .................. an .................. / / ................................ Craiova ................................. Figura 8.3 / \ \ ................... comp ..................... form1 .................. / ................. / \ \ \ ................... m ................... \ \ .................. x3 ....................
Exemplu de implementare a unei tabele arborescente

Automate, limbaje i compilatoare

197

II. 8.2.4. Tabele dispersate Metoda de cutare prin dispersie folosete o funcie de dispersie care aplicat la un identificator produce o valoare ntreag nenegativ numit indexul de dispersie al identificatorului. Prin funcia de dispersie, mulimea identificatorilor este partiionat ntr-un anumit numr de clase, identificatorilor dintr-o clas corespunzndu-le acelai index de dispersie. O funcie de dispersie bun trebuie s fie uor de calculat i s creeze clase echilibrate din punct de vedere al numrului de identificatori ce-l conin. Prin dispersie, timpul de cutare al unui identificator se reduce la timpul de calcul al indexului identificatorului i la timpul de cutare ntr-o singur clas. Funciile de dispersie folosite n proiectarea tabelelor de simboluri prelucreaz de obicei reprezentarea intern a irului de caractere ce formeaz identificatorul. Iat dou astfel de funcii: a) index cuprins ntre 0 i 255

se adun ultimii 4 bii ai primelor dou caractere ale identificatorului la rezultat se adun lungimea identificatorului nmulit cu 16 se rein ultimii 8 bii ai rezultatului.
din 4 octei)
Funcii de

b) index cuprins intre 0 si 210 ( i calculator avnd cuvntul de memorie format dispersie

se adun cuvintele ce conin caracterele identificatorului se mparte rezultatul la 211 i se reine restul.
Dac funcia de dispersie este bun, iar numrul indecilor este destul de mare, este posibil ca, ntr-un program nu prea lung, s se disperseze pentru fiecare index cel mult un identificator. n general, ns, nu putem evita dispersarea a mai mult de un identificator pentru un index, fenomen numit coliziune. Principala tehnic de rezolvare a coliziunilor este nlnuirea, care poate fi utilizat sub diverse forme; ne vom opri la cea numit nlnuire separat. Aceast metod implic nlnuirea nregistrrilor ce colizioneaz, ntr-o zon special, separat de prima, conform figurii 8.4.

Automate, limbaje i compilatoare

198

Tabela dispersat

Figura 8.4

II.8.3. Reprezentarea identificatorilor innd seama de domeniul de valabilitate


n majoritatea limbajelor de programare, n cadrul unui program se poate folosi acelai identificator pentru a desemna variabile diferite, cu atribute diferite i zone de memorie diferite, alocate n faza de execuie. Tabela de simboluri trebuie s pstreze pentru fiecare variabil intrri distincte. Deci, trebuie s existe un mecanism care la apariia unui identificator s selecteze intrarea corect din mulimea intrrilor ce conin acelai nume simbolic. Dar, semnificaia unei variabile rezult din modul n care se stabilete domeniul de valabilitate al variabilelor din limbajul respectiv. Aceasta se poate realiza innd seama de blocul n care apare identificatorul respectiv. Un identificator va fi reprezentat prin numele su i prin numrul blocului n care a fost declarat. Acest numr nu apare obligatoriu n mod explicit; el poate fi dedus plecnd de la poziia identificatorului n tabela de simboluri. Pentru a determina domeniul de valabilitate al unui identificator se definete noiunea de bloc activ sau inactiv. Un bloc este activ atta timp ct nu a fost ntlnit sfritul su. Cnd se analizeaz procedura 4 din figura 8.5, procedurile 1, 2 i 4 sunt active, iar 3 este inactiv.

Automate, limbaje i compilatoare

199

PROCEDURE _ _ _ BEGIN | | | | | | | | 1| | | | | | | | | | | | | 2 | | | | | | --- END | 4| | --- END | 3| |

PROCEDURE _ _ __ BEGIN PROCEDURE _ _ __ BEGIN


---- END PROCEDURE _ _ __ BEGIN

Structur de tip bloc


--- END

Figura 8.5 Analiza lexical folosete identificatorul unei variabile pentru a cuta descrierea sa n tabela de simboluri. O dat gsit, identificatorul poate fi nlocuit cu un indicator la aceast intrare ce va fi utilizat n generarea codului intermediar. Dup analiza zonei ce reprezint domeniul de valabilitate al unei variabile, memorarea identificatorului nu mai este necesar; rmn necesare n continuare atributele. Referinele din codul intermediar vor fi spre aceast parte i nu neaprat spre numele simbolic, care poate lipsi. Pentru limbajele de tip bloc (de exemplu, PASCAL, C) trebuie inut cont de incluziunea unul n altul a domeniilor de valabilitate reprezentate de blocuri, proceduri, cicluri. La ntlnirea unui identificator, el trebuie cutat n declaraiile celui mai apropiat bloc nconjurtor, iar dac nu este gsit este cutat n blocul nconjurtor acestuia . a. m. d. Deci, tabela de simboluri trebuie s reflecte structura de bloc a limbajului. Este necesar ca: - orice nceput de bloc s deschid un domeniu de valabilitate, deci o tabel de simboluri locale blocului; - n orice moment trebuie s putem cuta nu numai n tabela de simboluri a Automate, limbaje i compilatoare 200

blocului curent, ci i n tabelele blocurilor nconjurtoare; deci este necesar o legtur ntre aceste tabele; - la sfritul unui bloc, variabilele declarate n acest bloc devin inutile, deoarece atributele lor sunt completate i pe durata analizei nu vor mai fi folosite; este necesar stocarea lor n vederea fazelor ulterioare ale compilrii. O soluie de implementare a unui program de tip Pascal este dat n figura 8.6. begin | | | | | 1| | | | | | | | | end. begin | | | | | begin | end begin | end ...

| 3|

| 2 | | | end

| 4|

begin 5| | end

Implementare care ine seama de structura blocurilor

Tabela general de simboluri Figura 8.6 Automate, limbaje i compilatoare 201

Tabela blocurilor pstreaz (prin cmpul Tata ) nlnuirea blocurilor, numrul de simboluri declarate n fiecare bloc (prin cmpul Nrsimb ) i adresa din tabela de simboluri general la care ncepe tabela de simboluri dedicat fiecrui bloc. n continuare vom da un alt exemplu de implementare folosind tabele dispersate. Fiecare bloc primete un numr; acesta, mpreun cu noiunea de bloc activ, permit determinarea corespondenei ntre utilizarea unui identificator i declararea sa. Cnd un bloc este deja analizat el devine inactiv iar variabilele locale lui nu pot fi utilizate n alte blocuri dect dac sunt redefinite. Blocurile inactive pot fi eliminate din tabela de legturi, dar informaia lor trebuie conservat pentru fazele urmtoare.

Automate, limbaje i compilatoare

202

Teme Curs Teste Autoevaluare 1. De ce se recomand divizarea tabelei de simboluri?....................... 1 punct 2. Pentru ce este necesar tabela de simboluri n faza generrii de cod?................................................................................................. 1 punct 3. Dai un exemplu de implementare a unei tabele neordonate care nu folosete lungimea identificatorilor 2 puncte 4. Care este dezavantajul utilizrii unei tabele arborescente? 5. Care este principala caracteristic a tabelelor dispersate? Dar Dar avantajul?........................................................................................ 2 puncte avantajul?........................................................................................ 1 punct 6. Ce informaii se stocheaz n partea a doua a unei tabele dispersate?...................................................................................... 1 punct 7. Prin ce se definete domeniul de valabilitate al unei variabile?.......................................................................................... 1 punct Oficiu 1 punct

Automate, limbaje i compilatoare

203

Rspunsuri 1. Pentru a economisi memorie 2. Pentru a determina lungimea zonelor de memorie alocate 3. Nume Informaie ntreg,.., variabil simpl ir,.., etichet real,, variabil simpl

8identif1 1A 7Element 4. Dezavantaj: poate genera arbori dezechilibrai. Avantaj: este foarte util n optimizarea codului 5. Realizeaz mprirea identificatorilor n clase. Cutarea secvenial se face doar la nivelul unei clase 6. Cele care colizioneaz cu cele din prima 7. Prin blocul cel mai interior care o conine

Rezumat: S-au prezentat modaliti de construire a tabelei de simboluri i de gestionare a informaiilor coninute.

Lucrari Practice (Laborator/Seminar) Coninut Laborator/Seminar Se implementeaz metodele de creare si gestiune a tabelelor de simboluri ordonate. Teme Laborator/Seminar 1. Implementai algoritmul de utilizare a unei tabele de simboluri ordonat

Automate, limbaje i compilatoare

204

alfabetic. 2. Implementai algoritmul de lucru cu o tabel arborescent. 3. Implementai algoritmul de nlnuire separat. Rezumat: se implementeaz algoritmi de utilizare a tabelei de simboluri

Automate, limbaje i compilatoare

205

Notaii

Automate, limbaje i compilatoare

206

Curs 14 Tratarea erorilor


Descriere General Se prezint sursele erorilor i principalele erori care se ntlnesc n fazele de analiz lexical, sintactic, semantic i la executarea programelor. Obiective Cunoaterea surselor i a principalelor tipuri de erori care apar n faza de compilare i execuie a programelor

Curs 14 Durata: 2 ore

Cuprins II.9.1 Sursele erorilor II.9.2 Erori n analiza lexical II.9.3 Erori n analiza sintactic II.9.4 Erori semantice

Coninut Curs .

II.9.1 Sursele erorilor


Programele pe care le scriem sunt rareori corecte; ele prezint diferite tipuri de erori pe care compilatorul trebuie s le detecteze i s le semnaleze clar. Un mesaj de eroare trebuie : - s se exprime n termenii programului surs i nu n termeni legai de reprezentarea intern - s localizeze corect eroarea; este corect mesajul ,, identificatorul ID n-a fost declarat n procedura PROC i nu ,, lipsete declararea identificatorului ID - s nu fie redundant. Strategia utilizat de majoritatea compilatoarelor const n afiarea liniei eronate cu un marcator pe locul unde a fost detectat eroarea. Eroarea real se gsete, n general, fie n locul marcat, fie cu cteva simboluri mai n fa. n unele cazuri compilatorul nu poate s dea nici-o informaie cu privire la eroarea ntlnit ; de exemplu, cazul cnd cuvntul cheie END este omis ( n Pascal ).

Automate, limbaje i compilatoare

207

Erorile unui program pot fi detectate fie la compilare, fie la execuie, diferitele surse de erori fiind : - erori generate de compilator; ele sunt detectate, n general, la execuie, dar din fericire sunt foarte rare ; - erori datorate limitelor compilatorului ( dimensiunea mare a programului compilat, numrul maxim de simboluri stocate n tabela de simboluri, etc ) , limite ce nu apar n specificarea limbajului; - erori lexicale; ele corespund inserrii sau absenei unui caracter sau nlocuirii unui caracter prin altul. Aceste erori sunt uor de detectat i recuperat . - erori sintactice i semantice; compilatorul poate corecta unele din ele. Erorile sintactice sunt detectate n faza de analiz lexical i sintactic. Exemplele de mai jos ne dau o imagine general asupra acestor tipuri de erori : - eroare de punctuaie : utilizarea virgulei n loc de punct i virgul Function f ( x : integer , y : integer ) : real ; - eroare de inserare : if x : = y then writeln (x) else writeln (y) ; sau if x = y then writeln (x) ; else writeln (y) ; if x = 2+y-x ) then writeln (x) else writeln (y) ; n aceast instruciune simbolul ) este n plus sau lipsete (. Aceste erori sunt dificil de corectat, trebuind s ghicim intenia programatorului; - erori detectate mai trziu if x +2-y = y then writeln (x) else writeln (y) ; n acest caz lipsete un spaiu ntre if i variabila x. Aceast eroare este detectat la ntlnirea caracterului t al lui then. Erorile de acest tip nu pot fi detectate imediat, fiind necesar un mijloc de a le repera i de a reveni la locul unde au fost detectate. Dac prezena separatorilor este obligatorie, la ntlnirea lui ,, if , compilatorul va afia mesajul identificator nedeclarat. Erorile semantice sunt detectate la : - compilare , n timpul fazei de analiz sintactic : - erori dificil de semnalat
Exemple de erori sintactice Surse ale erorilor

incompatibilitate de tip ntre operanzi i operatori, ntre parametrii


actuali i cei formali, etc.

Exemple de erori semantice

identificator nedeclarat sau multiplu declarat


- la execuie

mprirea prin zero citirea unui fiier dup nchiderea sa

Automate, limbaje i compilatoare

208

afectarea unei valori care nu aparine domeniului unei variabile: indice


de tablouri , selectorul instruciunii case , etc . Recuperarea erorilor . Odat detectat o eroare, compilatorul trebuie s-o semnaleze programatorului i s ncerce s-o repare. Compilatoarele difer dup metoda de reparare a erorilor i dup maniera de continuare a analizei dup apariia unei erori. Exist compilatoare care realizeaz : - redresarea : toate activitile compilatorului, altele dect analiza lexical i sintactic, nceteaz dup detectarea primei erori. Majoritatea compilatoarelor lucreaz n aceast manier . - recuperarea : un compilator mai complex caut s repare eroarea, adic s Eliminarea transforme intrarea eronat ntr-una echivalent, dar autorizat. Totui, rezultatul erorilor nu este ntotdeauna cel scontat; recuperarea unei erori sintactice poate duce la una semantic. - corectarea : un compilator i mai complex caut s corecteze intrarea eronat ncercnd s ghiceasc intenia programatorului; un exemplu este compilatorul PL/C. Aceste corecii pot fi efectuate ns pentru un domeniu restrns de erori.

II.9.2 Erori n analiza lexical


Analizorul lexical este un automat finit; simbolurile de intrare i permit trecerea de la o stare la alta. Dac s-a ajuns n starea final, a fost recunoscut un atom lexical. Dac automatul se blocheaz pe stare nefinal, trebuie invocat o rutin de tratare a erorilor. Din pcate, acestea nu dispun de soluii miraculoase. Cnd un simbol de intrare nu permite nici-o trecere, unele rutine l ignor, iar altele l nlocuiesc printr-unul ce permite trecerea. O soluie mai elaborat const n existena unui dialog ntre analizorul lexical i cel sintactic. De exemplu, analizorul sintactic poate cere celui lexical ca urmtorul atom s aparin unei anumite clase de atomi. Astfel, analizorul lexical este orientat n cutarea dar i n repararea erorii. La rndul su, analizorul lexical poate raporta analizorului sintactic tipul eventualelor transformri presupuse de repararea erorii.
Tratarea erorilor

O categorie frecvent ntlnit de erori detectate de analizorul lexical se lexicale datoreaz scrierii greite a cuvintelor cheie. Repararea este n acest caz posibil datorit numrului relativ mic de posibiliti de reparare. Tratamentul este dificil pentru erori de tipul : - cmp : = acesta este un ir

Automate, limbaje i compilatoare

209

cnd apostroful final este omis ; - expresie : = AB cnd este omis operatorul, AB fiind luat ca identificator.

II.9.3 Erori n analiza sintactic


Erorile detectate n timpul analizei lexicale nu sunt obligatoriu erori sintactice propriu-zise. De exemplu instruciunea if x = y then writeln (x) ; else writeln (y) ; conine un punct i virgul inutil. Aceast eroare va fi detectat de analizorul lexical, dar ea este o eroare de inserare. Exist mai multe metode de tratare a erorilor sintactice . Recuperarea n mod panic este metoda cea mai folosit i cea mai uor Tratarea de implementat, fiind utilizat de toate tipurile de analizori, fr nici-o condiie. erorilor de Cnd este ntlnit un simbol eronat, se nltur simbolurile urmtoare pn se sintax ntlnete unul de sincronizare cum sunt punct i virgul sau end. Se procedeaz la fel i cu simbolurile din vrful stivei. tergerea de simboluri const n tergerea tuturor simbolurilor de intrare care nu dau o aciune legal de executat. La fel ca precedenta, aceast metod ignoreaz erorile ce pot apare datorit simbolurilor terse. Inserarea de simboluri. Cnd un simbol de intrare, combinat cu cel din vrful stivei, nu d o aciune legal, se insereaz la intrare un simbol care d o astfel de aciune . Tratarea erorilor n analiza LL(1) Poate fi aplicat oricare din metodele anterioare, dar strategia cea mai important const n completarea csuelor libere din tabloul de analiz cu pointeri ctre rutinele de tratare a erorilor. Aceste rutine au dou funcii - schimb, insereaz sau suprim simboluri din cmpul de intrare - modific, n mod corespunztor, stiva .

II.9.4 Erori semantice


Sursa principal a erorilor semantice o constituie utilizarea incorect a identificatorilor sau a expresiilor ce desemneaz variabilele din program. Prima ntlnire a unui asemenea identificator sau expresie trebuie s determine afiarea Automate, limbaje i compilatoare 210

unui mesaj de eroare dar i nregistrarea sa n tabela de simboluri. Aceast nregistrare este necesar n vederea viitoarelor ntlniri ale acestui identificator: o operaie identic din punct de vedere al atributelor nu trebuie s provoace emiterea aceluiai mesaj, iar apariiile distincte trebuie nregistrate n tabel. Problema recuperrii din erori semantice este legat de suprimarea unor mesaje de eroare. a) Mesajele datorate recuperrii defectuoase a unui identificator sau expresii trebuie suprimate. Cazul cel mai frecvent este cel al variabilelor indexate de forma A[ind1 , ind 2 ,L , ind n ] n cazul cnd A nu a fost declarat ca tablou sau Tratarea declaraia a fost greit i, deci, ignorat. La ntlnirea lui A [ se d un mesaj erorilor privind incompatibilitatea folosirii lui

raport

cu

declararaia. De

semantice

asemenea la ntlnirea lui ] analizorul va verifica numrul de dimensiuni cu cel declarat; neconcordana va determina emiterea unui nou mesaj. n cazul cnd identificatorul eronat este interpretat ca unul corect, se creaz o intrare n tabela de simboluri avnd ca valori de atribut cele rezultate din contextul utilizrii. n cazul prezentat anterior, intrarea va conine pentru atributele ,,tip identificator i numr dimensiuni valorile tablou i n . La ntlnirea unei situaii de eroare datorate acestei ,,corectri , faptul c vom cuta n nregistrarea corectat i nu n una normal, permite s evitm tiprirea mesajului. b) Mesajele datorate utilizrii incorecte de mai multe ori a aceluiai identificator sau expresii trebuie suprimate. Cazul cel mai frecvent este cel al omiterii declaraiilor. Apariia repetat a unui identificator nedeclarat poate determina emiterea de mai multe ori a aceluiai mesaj de eroare. Prima apariie a unui astfel de identificator trebuie s determine formarea unei intrri n tabela de simboluri, dedicat identificatorului. Atributele asociate intrrii sunt cele rezultate din context. La ntlnirea identificatorului n aceeai situaie, nu se va mai emite mesaj de eroare. Dac identificatorul este folosit i n alte situaii (de exemplu, este de alt tip), acestea trebuie memorate pentru a se evita mesaje identice. n acest scop , intrarea oricrui identificator va conine i un indicator spre o list a tuturor modurilor incorecte n care a fost folosit identificatorul. Lista aceasta servete pentru a tipri doar mesajele de erori distincte.

Automate, limbaje i compilatoare

211

Teme Curs Teste Autoevaluare 1. Care sunt caracteristicile mesajului de eroare............................... 2 puncte 2. Care sunt sursele erorilor?............................................................. 2 puncte 3. Cnd se detecteaz erorile sintactice..............................................1 punct 4. Cnd se detecteaz erorile semantice.............................................1 punct 5. Care sunt metodele de reparare a erorilor?.................................... 1 punct 6. Care sunt metodele de tratare a erorilor sintactice si in ce consta?.......................................................................................... 2 puncte Oficiu 1 punct

Automate, limbaje i compilatoare

212

Rspunsuri 1.

s se exprime n termenii programului surs i nu n termeni legai de

reprezentarea intern - s localizeze corect eroarea - s nu fie redundant. 2. - erori generate de compilator; ele sunt detectate, n general, la execuie, dar din fericire sunt foarte rare ; - erori datorate limitelor compilatorului ( dimensiunea mare a programului compilat, numrul maxim de simboluri stocate n tabela de simboluri, etc ) , limite ce nu apar n specificarea limbajului; - erori lexicale; ele corespund inserrii sau absenei unui caracter sau nlocuirii unui caracter prin altul. Aceste erori sunt uor de detectat i recuperat . - erori sintactice i semantice; compilatorul poate corecta unele din ele. 3. n fazele de analiz lexical i sintactic 4. La analiza sintactic i la execuie 5. Redresarea, recuperarea i corectarea 6. Recuperarea n mod panic: cnd este ntlnit un simbol eronat, se nltur simbolurile urmtoare pn se ntlnete unul de sincronizare cum sunt punct i virgul sau end.

Stergerea de simboluri const n tergerea tuturor simbolurilor de intrare care


nu dau o aciune legal de executat.

Inserarea de simboluri. Cnd un simbol de intrare, combinat cu cel din vrful


stivei, nu d o aciune legal, se insereaz la intrare un simbol care d o astfel de aciune

Rezumat: S-au prezentat modaliti de tratare a erorilor ntlnite n fazele de

analiz.

Automate, limbaje i compilatoare

213

Lucrari Practice (Laborator/Seminar)

Coninut Laborator/Seminar
Se implementeaz un algoritm care s corecteze erorile sintactice prin una din metodele: recuperare n mod panic, tergere de simboluri, inserare de simboluri Teme Laborator/Seminar 1. Scriei un program care s elimine erorile din analiz lexical Rezumat: se implementeaz un algoritm de corectare a erorilor sintactice

Automate, limbaje i compilatoare

214

Notaii

Automate, limbaje i compilatoare

215

Automate, limbaje i compilatoare

216

BIBLIOGRAFIE [1] A. V. Aho, R. Sethi, J. D. Ullman: Compilers, Principles, techniques and tools, Addison-Wesley, 1986 [2] A. Dinc, M. Andrei: Limbaje formale, Editura Universitaria, Craiova, 2002 [3] D. Gries, Compiler construction for digital computers, Wiley and Sons, New York, 1971 [4] A. Hajjam El Hassani, Les compilateurs el leur principes, Edition Scientifiques et Techniques, Ecole Superieure des Sciences Appliquees pour lIngenieurs, Mulhouse, 1993 [5] I. Iancu : Teoria compilatoarelor, Editura Vlad & Vlad, Craiova, 1997 [6] I. Iancu, M. Andrei: Teoria compilatoarelor si semantica limbajelor de programare. Indrumar de laborator, Reprografia Universitatii din Craiova, 1998. [7] I. Iancu: Proiectarea compilatoarelor , Editura Universitaria, Craiova, 2002 [8] C. Ionescu Texe, I. Zsako: Structuri arborescente si aplicatiile lor, Ed. Tehnica, Bucuresti, 1990 [9] L. Livovschi, C. Popovici, H. Georgescu, N. ndreanu : Bazele informaticii, Editura Didactic i Pedagogic, Bucureti, 1981 [10] A. B. Pyster, Compiler design and construction. Tools and techniques, Van Nostrand Reinhold, New York, 1988 [11] L. D. erbnai, Limbaje de programare i compilatoare, Editura Academiei, Bucureti, 1987 [12] J. P. Tremblay, P. G. Sorenson, The theory and practice of compiler writing, McGraw-Hill, Inc., New York, 1985

Automate, limbaje i compilatoare

217