Documente Academic
Documente Profesional
Documente Cultură
404
Seria
nvmnt la Distan
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
Titular: Prof. dr. Ion Iancu Tutore: Prof. dr. Ion Iancu
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
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
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
l notm cu w1 L wk ,
Pentru descrierea limbajelor sunt folosite urmtoarele metode: - enumerarea elementelor, cnd limbajul este finit
- 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
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
i o definim astfel:
Z 0 ,L, Z k (N )
*
w1 w2 dac
w1 = w2 sau
exist
k 1
Limbaj gramatic
numesc echivalente.
10
Impunnd anumite restricii produciilor unei gramatici, Chomsky a introdus trei tipuri de gramatici:
,v
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
G1
S1 w1 L wk = w . Din
w L(G ) .
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
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
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 , ,
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
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, ) }
(Y , )
i Y F '
q Y F i (q 0 , x )
deci L( A) = L( A' ) .
(q, ) x L( A) ,
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
(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
( p1 , ) ,
(q 2 , x )
15
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
A = (Q, , , q0 , F )
k +1
un
q1 q 2 a , (q1 , a ) (q 2 , a ) .
k +1
x *
cu
x k
care distinge
p1
p 2 , adic
( p1 , x )
( p'1 , ) ,
( p2 , x)
( p' 2 , )
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
Pentru
orice
automat
finit
complet
determinist
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
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 )
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.
{S , X } F = { X }
dac
( S ) P
n caz contrar
Exist produciile
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
deci
Acest automat finit nedeterminist poate fi transformat, conform Teoremei 2.1, ntr-un automat finit determinist care accept acelai limbaj.
19
Teme Curs
Teste Autoevaluare 1. Fie gramatica G = ({S }, { x, y}, {S xy, S xSy}, S ) . Precizai forma
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
20
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.
automat finit, limbaj acceptat de un automat finit, relaia dintre automate finite i gramatici, minimizarea automatelor finite.
21
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
22
Notaii
23
24
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
nelegerea diferenei dintre derivarea la stnga i cea la dreapta i a - cunoaterea principalilor algoritmi de simplificare a formei gramaticilor
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
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
25
1 2 L n
atunci
= 1 2 L n i i i , i { , 2 , L , n} 1
Proprietate de derivare
= 1 L n i i i , i { , 2 , L , n} ; 1
n plus, derivaiile din
1 2 L n
k
Din
1 2 L n ,
= 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)
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
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.
27
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
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.
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
(A ) P,
, = 1 A1 2 L k Ak k +1 .
28
A 1 X 1 2 L k X k k +1
unde
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
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
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
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
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
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 .
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 .
30
I.5.3. Eliminarea simbolurilor inutilizabile Definiia 5.2. Fie G = ( N , , P , S ) o gramatic independent de context.
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.
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 } .
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
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
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
= 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
rmne de artat c G" are toate simbolurile utilizabile. Deoarece orice A N"
32
este accesibil pentru G" , exist derivaia S A . Cum toate simbolurile din
G"
33
B Bc /
F ( E )/ a
S aSb | aA | b , A bA , B bS | b | c
34
Rspunsuri
S r
n1 A
n3
a
n2
n4
A
n5
b
n6
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
35
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 la una n form mai simpl; se poate simplifica n cascad, la fiecare pas simplificnd gramatica de la pasul anterior.
36
Notaii
37
38
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
Coninut Curs
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
este
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
Trecerea
de
la
configuraie
la
alta
se
face
prin ,
pai: ,
( q ,aw, Z )
( q1 , w, ) dac ( q1 , ) ( q , a , Z ) . Notm cu
( p , , ), p F }.
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 ,, )
40
(q , w) (q , , A) ,
deci
(q , w, A)
1
(q , w, w) = (q , a1 L a p , a1 L a p ) .
p
(q , a L a
, a1 L a p )
(q ,, ) ,
deci
(q , w, A)
dect k i fie A w . nseamn c
k
(q ,, ) .
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
(q , wi , Ai )
(q ,, ) ,
i { , 2, L , r} 1
(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 ,, )
(q , w, A)
(q ,, ) . Dac (q , w, A) (q ,, ) ,
w = i A w .
( A ) P ,
(3)
Presupunem implicaia adevrat pentru un numr de pai mai mic dect k i fie
(q , w, A)
(q ,, ) n k
pai
(q , w, A)
(q , w, ) = (q , w,1 A1 2 L Ar r +1 )
(q ,, )
(A =
A1 2 L Ar r +1 P .
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
(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 ,, )
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
[ p , Z , pr ] a[q , X 1 , p1 ][ p1 , X 2 , p2 ]L[ pr 1 , X r , pr ]
independent de
context. Pentru
a stabili egalitatea
(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.
42
Fie w L (M ) ; rezult
(q
, w, Z 0
(q ,, ) cu q Q .
Conform produciilor de tipul 1, avem
[q0 , Z 0 , q] w .
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
Fie finale
P = (Q , , , , q 0 , Z 0 , ) ;
am luat
F = ,
deoarece
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
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
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
P = (Q , , , , q0 , Z 0 , F ) este
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
accepte pe L .
44
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
45
- 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 , w , ) , q Q , w * , *
L( P ) = w * ( q 0 , w, Z 0 )
( p , , ) }. ( p , , ), p F } .
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
echivalena dintre cele dou moduri de acceptare, i dintre automate pushdown i limbaje independente de context.
46
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
47
Notaii
48
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
49
Teorema 7.1.
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
X se numete
*
50
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
'
Metoda :
P1. ordoneaz neterminalele n ordinea A1 , A2 ,..., An P2. for i := 1 to n do
Algoritmul de eliminare a recursiei
Intrare : o GIC G Ieire : o gramatic echivalent, factorizat la stnga Metoda : Pentru fiecare neterminal A se determin cel mai lung prefix
A -produciile
Factorizarea la stnga
, cu
A A' / A' 1 / 2 / ... / n
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
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
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
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
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
Demonstraie.
,,
wA
x i u = PRIM k ( x )
*
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 ( ) ,
53
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} .
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 ( ) .
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 :
wA
i L = PRIM k ( )
}
Algoritmul de testare a condiiei LL
Pasul 2. calculeaz
Dac
A i
A sunt
f ( L ) = (PRIM k ( ) k L ) (PRIM k ( ) k L )
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
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
*
= 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
x / x Fi 1 ( y1 ) k ... k Fi 1 ( y n ), Fi ( A) = Fi 1 ( A) ( A y1 ... y n ) P
PRIM k .
Demonstraie : Deoarece Fi ( A ) * k rezult c mulimile Fi ( A ) , cu
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
y i
Corectitudinea algoritmului
55
Y1 ...Yn
unde
y = y1 y 2 ...y n
i Y p
yp
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
implic
PRIM k ( ) PRIM k ( ) ,
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
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
(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
56
w * i ( N ) astfel nct S
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
TESTUL 2
a) Folosind
algoritmul
PRIM,
se
calculeze
valorile
funciei
58
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)
S , A , gramatica
Raspunsuri la Testul 2
a) PRIM 3 ( A ) = {a , ab}
b)
Pentru neterminalul B :
( B ) = {{}}
59
n anumite tipuri de analiz sintactic. S-a prezentat o metod de verificare a faptului c o gramatic este sau nu de tipul LL .
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
gramatici care vor simplifica analiza sintactic. Se implementeaz algoritmul PRIM folosit la testarea condiiei LL.
60
Notaii
61
62
(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
Coninut Curs
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
w x = y
2) S'
Bx
Aw
64
A 1 . 2 se numete
Aw
1 2 w i
D aD / c
aaC
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).
w x = y
Bx
65
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'
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'
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 ) .
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
66
u1 Bu3
u1u 2 u 3
unde
u1u 2 ,
deoarece
conform
definiiei,
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
ar fi ultima producie folosit atunci 1 A1 y1 nu ar fi ultima form derivaional la dreapta n derivarea 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
67
LR( k ) .
Fie G o GIC i un prefix viabil. Notm cu Vk ( ) mulimea liniilor
G
inclus.
(c) Se repet pasul 1.b pn cnd nici-o linie nu mai poate fi adugat la
Vk G ( ) .
Calcularea
G
liniilor LR
[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
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 ) .
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
69
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
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 .
astfel:
+ (1) X < Y dac exist producia C 1 XB 2 i B Y (2) X = Y dac exist producia C 1 XY 2
70
Relaiile de
La acestea se adaug relaiile ce implic marcajul $, de nceput i sfrit al preceden cuvntului de intrare: (4) $ < X dac S X
+
(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 .
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
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
Corectitudinea preceden
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
sau
X j +1 = X j
X j +1 < Yr . Apoi,
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.
(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).
72
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
perechi
de
forma
( A, B ), cu A N ;
exemplul
nostru
ele
sunt
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
73
S S A a b c $
< <
=
a
=
< >
=
> >
< >
<
-producii, se numete
(2) dac A X i B sunt producii ale lui G , atunci nici una din
relaiile X < B , X = B nu este valid.
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
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
E E T
)
=
+
=
>
>
>
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.
Coninut Laborator/Seminar
77
78
Notaii
79
80
Curs 6
Durata:
2 ore
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
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
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
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.
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
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 * .
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
86
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).
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
- 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
(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
(q , , y )
(F) este
{(x , y ) / (q0 ,x , )
(q , ,y ) pentru q F } .
este determinist dac pentru orice
q Q :
*
(1) sau ( q , a ) conine cel mult un element pentru orice a i mulimea vid sau
(q , ) este
O alt clas important de traductoare o reprezint traductoarele pushdown. Un astfel de traductor este un automat pushdown nzestrat cu o
88
ieire.
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
( 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
+
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
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, )
*
(q , , ,y )
pentru un anumit n .
(q , , ,y ) ,
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
([ pAq][ pAq])( x ,y ) ,
dac i numai
( p ,x ,A, )
(q , , ,y )
+
pentru orice
p ,q Q i A . Apoi avem
(q , , ,y ) deci
dac exist un traductor pushdown P astfel nct t (P ) . Demonstraie. Rezult din teoremele 1.17, 1.18 i 1.19.
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.
(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:
92
N 2 = {< id > ,< const > ,< op > ,< del > ,< com >} N 3 = {< lit > ,< cif >}
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.
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.
94
Procedura AD
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 ; .
95
Teme Curs Teste Autoevaluare 1. Care este deosebirea dintre analiza sintactic i cea semantic?
................................................ 1 punct
2.
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 , , ,
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 , )
unui compilator, apoi metode de traducere a limbajelor. n partea a doua sa explicat modul de efectuare a analizei lexicale.
97
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
98
Notaii
99
100
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
. 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
cu numrul i iar
neterminalul care deriveaz este cel mai din dreapta. Aceste notaii se extind
atunci
atunci
101
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.
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
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
G = ( N , ,P ,S ) i un cuvnt de
intrare
1,2,...,p .
Ieire : analiza sintactic la stnga a lui w, dac aceasta exist; n caz contrar se
afiaz ,, eroare.
Metoda.
sunt toate 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 )
103
(b) (c)
simbol de intrare este $, folosit pe post de delimitator la dreapta. spre dreapta, ce nregistreaz alternativele ncercate i simbolurile de intrare verificate. (d)
(N
} )*
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
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
( 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
104
(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
...
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
Principiul de funcionare a unui analizor sintactic ascendent cu reveniri este pus n eviden n figura 3.2, utiliznd gramatica cu regulile
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
*
stnga ); aceast band ine evidena reducerilor efectuate pentru a se obine coninutul lui B1 .
(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 , )
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, , )
(b , i , A, j)
(q , i , ' B , k )
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)
(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.
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
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
107
T [i ,1] = {A / A T [1, j ] = {A / A T [i , j ] = {A / A
...............................................................
T [n j + 1, j ] = {A / A
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 .
A
exist
A A
BC
adic
un
astfel
nct pentru
BC
Adic,
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.
108
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 .
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
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
110
Rspunsuri 1.
(q ,1, ,E $ )
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
(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)
S A S A,S
A S A,S
A A,S
(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
112
Coninut Laborator/Seminar Implementarea unui algoritm de analiz sintactic din cei trei prezentai.
Teme Laborator/Seminar
113
Notaii
114
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
Fie
G = ( N , ,P ,S )
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 .
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
,
x
unde
= x0 B1 x1 B2 ...Bm xm
uv , cu x L .
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
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 : /
116
(T0 S ,w, ) /
(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
i A este
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
117
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
(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
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
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.
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
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:
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 , ) ;
( A, w, i ), cu = ;
acceptare
($ S ,$, )
acceptare , atunci S w .
imediat urmrind tabelul prezentat n acest exemplu. S efectum analiza sintactic a cuvntului w = babaacac . Avem: ($,babaacac$, ) ($b , abaacac$, )
($bAS ,ac$,3331 )
($bASa ,c$,3331 ) ($bAA,c$,33312 ) ($bAAc ,$,33312 )
($ S ,$,333121 )
acceptare
deci = 333121 i S w .
121
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:
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
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 .
123
1.
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
Oficiu..................................... 1 punct
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}
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 $
125
PRIM 1 ( cC ) = {c}
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
(S $,abc , )
126
ascendent si descendent
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)
127
Notaii
128
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
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
sk.ak 130
- pentru un atribut motenit, valoarea se calculeaz utiliznd valorile atributelor asociate frailor sau prinilor acestui nod S.a
s1.a1 ...
si.ai
...
sk.ak
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
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
i Y . y , apoi o
muchie de la X .x
Graf de
regula semanantic
E .val := E1 .val + E 2 .val
dependen
corespund atributelor
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:
( X ) At . A ( X ) =
M (X ) S (X ) ;
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
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
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
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
''
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
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;
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
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
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
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
14. Sfterm
15. Sfterm + Expr
21. Fact v
Automate, limbaje i compilatoare
136
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
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
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
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
139
14. Sfterm
15. Sfterm + Expr
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
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 :
cu numele NUME , cu numrul parametrilor egal cu PAR i cu numrul total de variabile plus parametri formali egal cu DIM ;
PAR ,PAR
celor formali;
140
Teme Curs Teste Autoevaluare 1. De cine depinde numrul de parcurgeri ale arborelui de derivare necesar
Oficiu................................................................................................... 1 punct
141
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
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.
Coninut Laborator/Seminar Se implementeaz un program simplu care s verifice prin tehnici semantice transmiterea corect a parametrilor formali
142
Teme Laborator/Seminar
143
Notaii
144
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,
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.
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
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
147
/ \ / / \ / id2 / \ / \
id3 id4
id1 +
\
[]
Exemplu de arbore sintactic
148
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:
Operator + * :=
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.
149
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
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;
150
- goto Q ;
instruciuni de salt condiional:
if A oprel B goto Q
unde oprel
- 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)
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 )
151
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
Codul generat
(5)
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 ;
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
155
@1
E.true := Concateneaz_liste ( E 1 . true, E 2 .true ) E.false := E 2 .false Completeaz_lista (E1. false , M.cuadruplu)
@2
@3
@4
@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
156
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
157
Rspunsuri 1. (c (a + b ), $, )
2.
| \ | / \ \ \ \
** := goto
/\ / \ /
\
et1
\
2
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 _
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
161
Notaii
162
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
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.
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
164
poate fi rescris ca
PI: = 3.141592 D: = 3.141592 / 180.0
sau nc
PI: = 3.141592 D: = 0.0174644
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.
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 .
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
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
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
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
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;
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 .
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,
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
Graful de flux
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
Coninut Laborator/Seminar Pentru fiecare tip de optimizare studiat se cere s se scrie cte un program care s implementeze metoda respectiv.
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
de baz
Rezumat: se implementeaz tipurile de optimizri studiate
175
Notaii
176
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
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
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
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
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.
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
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
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 :
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.
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.
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
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
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
185
Metoda
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
186
{ 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
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
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( 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.
188
Optimizai codul corespunztor expresiei XABC* D + + , n cazul cnd se folosete un singur registru.. 1 punct
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
189
Rspunsuri 1.
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
190
[R0] [R0]
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
191
Notaii
192
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
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
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.
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
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.
198
Tabela dispersat
Figura 8.4
199
---- END PROCEDURE _ _ __ BEGIN
--- 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
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.
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
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
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
205
Notaii
206
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 .
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
208
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
209
cnd apostroful final este omis ; - expresie : = AB cnd este omis operatorul, AB fiind luat ca identificator.
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.
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
212
Rspunsuri 1.
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.
analiz.
213
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
214
Notaii
215
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
217