Sunteți pe pagina 1din 132

Limbaje Formale si Tehnici de Compilare

Dragan Mircea
April 19, 2006
1
P R E F A T

A
Materialul prezentat constituie notele de curs t inute student ilor din primii
doi ani la Sect ia Informatica a Facult at ii de Matematica si Informatica de la
Universitatea de Vest Timisoara.

In primul capitol, Introducere se trec n revista not iunile fundamentale din


teoria limbajelor formale si se prezint a problema generala a compilarii.
Capitolul al doilea, Limbaje regulate si analiza lexicala, prezint a chestiunile
teoretice fundamentale privind teoria automatelor si echivalent a cu limbajele de
tipul trei, proprietat i speciale si mecanisme echivalente cu automatele nite. Sunt
prezentate de asemenea si principiile analizei lexicale, nalizate cu realizarea unui
analizor lexical.
Capitolul al treilea, Limbaje independente de context este dedicat studiului
teoretic al mecanismelor de generare si de recunoastere a limbajelor de tipul
doi. Sunt prezentate formele normale ale gramaticilor independente de context
si cateva proprietat i speciale.
Capitolul patru, Analiza sintactica este dedicat prezent arii principiilor gen-
erale de analiza sintactica si a algoritmilor specializat i de analiza. Pentru ecare
tip de algoritm analizat s-au considerat exemple practice de aplicare.
Capitolul al cincilea, Sinteza programelor trateaza formele intermediare uzuale
pentru traducerea programelor si generarea codului obiect pornind de la for-
matul intermediar. Pentru cazul expresiilor aritmetice sunt prezentat i si algoritmi
direct i de generarea a formatului intermediar, mpreun a cu proceduri standard
de optimizare a codului generat.
Ultimul capitol, Masina Turing prezinta succint mecanismul formal ce de-
neste modelul de calculabilitate.
La sfarsitul ecarui capitol sunt date cateva exercit ii (nerezolvate), aplicat ii
directe la chestiunile teoretice prezentate. Acestea pot parcurse n cadrul orelor
de seminar si laborator.

In expunerea algoritmilor s-a folosit un limbaj mai put in rigid, fara prea multe
reguli stricte.

In general s-a urmarit descrierea cat mai simpla a structurilor care
apar n text.
2
Cuprins
1 Introducere 5
1.1 Limbaje formale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Gramatici generative de tip Chomsky . . . . . . . . . . . . . . . . 8
1.3 Ierarhia Chomsky . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4 Traducerea programelor . . . . . . . . . . . . . . . . . . . . . . . 17
1.5 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2 Limbaje Regulate si Analiza Lexicala 23
2.1 Automate nite si limbaje regulate . . . . . . . . . . . . . . . . . 23
2.2 Proprietat i speciale ale limbajelor regulate . . . . . . . . . . . . . 29
2.3 Expresii regulate si sisteme tranzit ionale . . . . . . . . . . . . . . 34
2.4 Analiza lexicala . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.5 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3 Limbaje Independente de Context 51
3.1 Arbori de derivare . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2 Ambiguitate n familia /
2
. . . . . . . . . . . . . . . . . . . . . . . 54
3.3 Forme normale pentru gramatici de tipul 2 . . . . . . . . . . . . . 56
3.4 Lema BarHillel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.5 Automate push-down (APD) . . . . . . . . . . . . . . . . . . . . . 65
3.6 Automate pushdown deterministe . . . . . . . . . . . . . . . . . 73
3.7 Probleme propuse . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4 Analiza Sintactica 79
4.1 Algoritmi TOP-DOWN . . . . . . . . . . . . . . . . . . . . . . . . 80
4.1.1 Algoritmul general de analiza top-down . . . . . . . . . . . 80
4.1.2 Analiza top-down far a reveniri . . . . . . . . . . . . . . . . 81
4.1.3 Programarea unui analizor sintactic. Studiu de caz . . . . 84
4.2 Algoritmi BOTTOM-UP . . . . . . . . . . . . . . . . . . . . . . . 90
4.2.1 Gramatici cu precedent a simpla . . . . . . . . . . . . . . . 90
4.2.2 Relat ii de precedent a . . . . . . . . . . . . . . . . . . . . . 92
4.2.3 Proprietat i ale gramaticilor cu precedent a simpla . . . . . 93
3
4 CUPRINS
4.2.4 Determinarea relat iilor de precedent a pentru gramatici cu
precedent a simpla . . . . . . . . . . . . . . . . . . . . . . . 95
4.2.5 Studiu de caz . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.2.6 Gramatici operatoriale . . . . . . . . . . . . . . . . . . . . 97
4.2.7 Gramatici operatoriale . . . . . . . . . . . . . . . . . . . . 100
4.2.8 Determinarea relat iilor de precedent a pentru gramatici op-
eratoriale . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.2.9 Studiu de caz . . . . . . . . . . . . . . . . . . . . . . . . . 104
5 Sinteza Programelor 107
5.1 Forme interne ale programelor . . . . . . . . . . . . . . . . . . . . 107
5.1.1 Tabelele compilatorului . . . . . . . . . . . . . . . . . . . . 107
5.1.2 Cvadruple si triplete . . . . . . . . . . . . . . . . . . . . . 109
5.2 Generarea formatului intermediar . . . . . . . . . . . . . . . . . . 114
5.2.1 Generarea cvadruplelor . . . . . . . . . . . . . . . . . . . . 115
5.2.2 Generarea tripletelor . . . . . . . . . . . . . . . . . . . . . 117
5.2.3 Generarea sirului polonez . . . . . . . . . . . . . . . . . . 118
5.3 Generarea formatului intermediar pentru instruct ii clasice . . . . . 121
5.3.1 Instruct iunea de atribuire . . . . . . . . . . . . . . . . . . 121
5.3.2 Instructiunea If . . . . . . . . . . . . . . . . . . . . . . . . 121
5.3.3 Variabile indexate . . . . . . . . . . . . . . . . . . . . . . . 121
6 Masina Turing 123
6.1 Limbaje de tipul zero . . . . . . . . . . . . . . . . . . . . . . . . . 123
6.2 Masina Turing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Capitolul 1
Introducere
1.1 Limbaje formale
Not iunea generala de limbaj. Se numeste alfabet sau vocabular orice mult ime
nita si nevida. Elementele unui alfabet V le vom numi simboluri (sau litere,
caractere, variabile).
Denit ie 1.1 Un cuvant peste un alfabet V este o secvent a p = a
1
a
2
. . . a
n
, a
i

V, i = 1, . . . , n.
Numarul n, deci num arul simbolurilor cuvantului p, se numeste lungimea cuvantului
si va notat cu [p[ sau l(p). Vom considera si cuvantul vid sau e, care nu cont ine
nici un simbol; evident [[ = 0.
Not iunea de cuvant este fundamentala n teoria limbajelor formale sau n alte
domenii ale informaticii; termeni sinonimi utilizat i n literatura sunt propozit ie,
fraza sau sir. Sa observam ca nu exista o similitudine foarte buna ntre not iunile
de alfabet, cuvant, etc. din teoria limbajelor formale si not iunile core-
spunzatoare din lingvistica.
Mult imea tuturor cuvintelor peste un alfabet V o notam cu V
+
. Aceasta
mult ime mpreuna cu cuvantul vid va notata cu V

.

In general, vom utiliza
litere mari de la sfarsitul alfabetului pentru notarea diverselor alfabete, U, V, W,
etc.; litere de lanceputul alfabetului (mari sau mici) pentru notarea simbolurilor,
A, B, C, . . . , a, b, c, . . . , i, j, . . . (uneori cifre 0,1,2,...); pentru notarea cuvintelor
vom utiliza litere mici de la sfarsitul alfabetului, p, q, r, s, t, u, v, w, x, y, z, etc.
(aceasta convent ie de notare nu va absoluta).
Fie p = a
1
. . . a
n
, q = b
1
. . . b
m
. Denim pe mult imea V

operat ia de con-
catenare sau juxtapunere prin pq = a
1
. . . a
n
b
1
. . . b
m
.
Se poate verica usor ca aceasta operat ie este asociativa. Prin urmare,
mult imea V
+
nzestrata cu aceasta operat ie este un semigrup (semigrupul liber
peste V ). Mult imea V

cu aceiasi operat ie este un semigrup cu unitate, deci un


monoid, unitatea ind cuvantul vid (monoidul liber peste V ). Structura are si
5
6 CAPITOLUL 1. INTRODUCERE
proprietatea de simplicare la stanga si la dreapta, adica:
ua = uba = b, respectiv, au = bua = b, a, b, u V

Fie din nou p, q V

. Vom spune ca q este un subcuvat sau un inx (propriu)


al lui p daca p = uqv, u, v V

(u, v V
+
); q este prex (propriu) al lui p daca
p = qv, v V

(v V
+
); q este sux (propriu) al lui p daca p = uq, u V

(u
V
+
).
Denit ie 1.2 Un limbaj L peste alfabetul V este o parte a mult imii tuturor
cuvintelor peste V , deci L V

.
Sa observam ca V

(sau V
+
) este ntotdeauna o mult ime innita (evident
numarabil a); n aceasta accept iune generala, un limbaj poate sa e o mult ime
nita sau innita, uneori chiar vida.
Exemplu. Fie V = 0, 1. Avem
V
+
= 0, 1, 00, 01, 10, 000, . . .,
V

= , 0, 1, 00, 01, 10, 000, . . ..


Limbaje peste alfabetul V sunt de exemplu mult imile
L
1
= , 00, 11,
L
2
= 1, 11, 111, . . . = 1
n
[n 1.
Observat ie. Notat ia a
n
, unde a este un simbol al unui alfabet, nseamn a
cuvatul constituit din n simboluri a, adica aa . . . a
. .
.

In particular a
0
= .
Operat ii cu limbaje Limbajele ind mult imi se pot efectua cu limbaje ope-
rat iile obisnuite cu mult imi: reuniune, intersect ie, diferent a, complementariere
(fat a de V

). Exista si operat ii specice limbajelor.

In general, o operat ie de n-aritate oarecare (cel mai adesea binara sau unara)
pe mult imea V

deneste o operat ie corespunzatoare pe mult imea limbajelor.


Astfel, daca
: V

T(V

) si : V

T(V

)
sunt doua operat ii pe V

(unara si respectiv binara) si L


1
, L
2
sunt doua limbaje
peste V , putem deni limbajele (L
1
) respectiv (L
1
, L
2
) prin
(L
1
) =
_
xL
1
(x), (L
1
, L
2
) =
_
xL
1
,yL
2
(x, y).
Exemple:
1.1. LIMBAJE FORMALE 7
1. Produsul (concatenarea) a doua limbaje denit prin
L
1
L
2
= pq[p L
1
, q L
2
.
Daca L
1
= L
2
= L vom nota LL = L
2
. Prin recurent a, se deneste L
n
astfel
L
0
= , L
k
= L
k1
L, k 1.
2.

Inchiderea (Kleene) a unui limbaj L este
L

_
k=0
L
k
.
3. Limbajul Sub(L). Fie V

si Sub(x) mult imea tuturor subcuvintelor lui x


(evident Sub este o operat ie unara pe V

). Daca L este un limbaj peste V ,


putem deni limbajul
Sub(L) =
_
xL
Sub(x).
adica limbajul constituit din toate subcuvintele tututor cuvintelor lui L.
Semnicat ii analoage vor avea si limbajele Pref(L) si Suf(L).
4. Limbajul Mi(L). Fie x = a
1
. . . a
n
un cuvant peste alfabetul V . Cuvantul
Mi(x) = a
n
. . . a
1
se numeste rasturnatul sau oglinditul lui x (Mi este pres-
curtarea cuvantului englez mirror). Se mai noteaza Mi(x) = x. Avem
atunci si rasturnatul unui limbaj
Mi(L) =
_
xL
Mi(x).
5. Operat ia de substitut ie. Fie U si V doua alfabete si e aplicat ia s : V
T(U

). Extindem (prelungim) aceasta aplicat ie la V

prin
s() = , s(xy) = s(x)s(y), x, y V

.
O astfel de prelungire se numeste canonica; ea pastreaza operat ia de con-
catenare, n sensul ca daca p = xy, atunci s(p) = s(x)s(y) este concatenarea
limbajelor s(x), s(y). Operat ia de substitut ie a limbajelor este data de
s(L) =
_
xL
s(x).
Sa observam ca aceasta operat ie transforma un limbaj peste un alfabet V
ntr-un limbaj peste un alfabet U si ca pastreaza operat ia de concatenare.
Daca card(a) < , a V , vom spune ca substitut ia este nita, iar daca
card(a) = 1, a V vom spune ca s este un homomorsm.
Operat iile reuniune, produs si nchidere Kleene se mai numesc operat ii reg-
ulate asupra limbajelor.
8 CAPITOLUL 1. INTRODUCERE
1.2 Gramatici generative de tip Chomsky
Un limbaj peste un alfabet poate sa e o mult ime nita sau innita. Daca este o
mult ime nita, el poate denit prin scrierea efectiva a cuvintelor limbajului.

In
cazul n care este o mult ime innita, el poate denit n anumite cazuri punand
n evident a structura cuvintelor lui. De exemplu
L
2
= 01, 0011, 000111, . . . = 0
n
1
n
[n 1.
Exista doua procedee mai generale pentru denirea limbajelor:
1. Procedee generative, care permit generarea tuturor cuvintelor limbajului.
Exista mai multe tipuri de mecanisme de generare a limbajelor, ntre care
gramaticile Chomsky, sisteme Lindenmayer,etc.
2. Procedee analitice, care determina daca un cuvant dat apart ine sau nu
limbajului. Sunt asa-numitele automate, automate nite, automate push-
down, etc.
Un rol deosebit n teoria limbajelor formale l au gramaticile Chomsky.
Not iunea de gramatica Fie V
N
si V
T
doua alfabete disjuncte,V
N
V
T
=
numite respectiv alfabetul simbolurilor neterminale (V
N
) si alfabetul simbolurilor
terminale (V
T
). Notam V
G
= V
N
V
T
alfabetul general si P V

G
V
N
V

G
V

G
alfabetul regulilor.
Mult imea P va deci formata din perechi de forma (u, v), unde u = u

Au

,
u

, u

G
, A V
N
iar v V

G
, deci u si v sunt cuvinte peste V
G
, cu observat ia
ca u trebuie sa cont in a cel put in un simbol neterminal. Vom spune ca o astfel
de pereche este o regula (product ie, regula de generare, regula de rescriere) si o
vom nota u v (vom spune: u se transforma n v). Apartenent a unei reguli la
P o vom nota n mod obisnuit (u v) P, sau mai simplu, u v P (nu va
exista confuzia cu faptul ca v este un element al lui P).
Denit ie 1.3 O gramatica este un sistem G = (V
N
, V
T
, X
0
, P), unde V
N
este
alfabetul simbolurilor neterminale, V
T
este alfabetul simbolurilor terminale, X
0

V
N
si se numeste simbol de start al gramaticii, iar P este mult imea de reguli.
Observat ie. Simbolurile alfabetului V
N
le vom nota n general cu litere mari
A, B, C, . . . , X, Y, Z (mai putin U, V, W) iar cele ale alfabetului V
T
cu litere mici
de la nceput a, b, c, . . . sau cu cifre 0, 1, 2, . . ..
Fie G o gramatica si p, q V

G
. Vom spune ca p se deriveaza direct n q
si vom scrie p
G
q (sau mai simplu pq) daca exista cuvintele r, s, u, v V

G
astfel nct p = rus, q = rvs iar u v P. Vom spune ca p

se deriveaza n p

(far a specicat ia direct) daca exista p


1
, p
2
, . . . , p
n
n 1 astfel ncat
p

= p
1

G
p
2

G
. . .
G
p
n
= p

.
1.2. GRAMATICI GENERATIVE DE TIP CHOMSKY 9
Vom scrie p

G
p

(sau p

+
p

cand nu exista nici o confuzie) daca n > 1


si p

G
p

(sau p

) daca n 1. Sirul de mai sus va numit derivare iar


num arul de derivari directe din sir l vom numi lungimea derivarii; se mai spune
ca p

deriva n p

.
Sa observam ca transformarile astfel denite ,
+
,

sunt relat ii pe V

G
.
Este clar ca relat ia
+
este nchiderea tranzitiva a relat iei , iar relat ia

este
nchiderea tranzitiva si reexiva a relat iei de transformare directa .
Denit ie 1.4 . Limbajul generat de gramatica G este prin denit ie mult imea
L(G) = p V

T
, X
0

G
p.
Observat ie. Daca p V

G
si X
0

G
p se spune ca p este o forma propozit ionala
n gramatica G.
Exemple:
1. Fie G = (V
N
, V
T
, X
0
, P), unde V
N
= A, V
T
= 0, 1, X
0
= A (evident)
si P = A 0A1, A 01. O derivare n aceasta gramatica este, de
exemplu
A0A100A11000111 = 0
3
1
3
.
Este evident ca L(G) = 0
n
1
n
[n 1.
Observat ie.

In cazul n care mai multe reguli au aceeasi parte stanga, le
vom scrie compact astfel u v
1
[v
2
[ . . . [v
n
, simbolul [ av and sensul de sau;
n cazul nostru, A 0A1[01.
2. G = (V
N
, V
T
, X
0
, P), unde
V
N
= <propozit ie>, <subiect>, <atribut>, <predicat>, <complement>,
<substantiv>, <adjectiv>, <verb>, <articol>,
V
T
= o, orice, matrice, funct ie, derivabila, continu a, este ,
X
0
=<propozit ie>,
P = <propozit ie><subiect><atribut><predicat><complement>,
<subiect><articol><substantiv>,
<atribut><adjectiv>,
<predicat><verb>,
<complement><adjectiv>,
<articol>o[orice,
<substantiv>matrice[funct ie,
<adjectiv>derivabil a[continu a,
<verb>este.
Observat ie.

In acest exemplu, <propozit ie>, <subiect>, etc., reprezinta
ecare cate un simbol neterminal; de asemenea, o, orice, matrice,
10 CAPITOLUL 1. INTRODUCERE
etc., reprezinta simboluri terminale. Se poate usor observa ca aceasta
gramatica genereaza propozit ii simple de forma subiect-atribut-predicat-
complement care exprima judecat i asupra conceptelor de matrice si funct ie.
De exemplu, se poate forma propozit ia: orice funct ie derivabil a este con-
tinua, care este din punct de vedere semantic corecta, precum si propozit ia
orice funct ie continu a este derivabil a, care, dupa cum se stie, este falsa.
Evident, se pot genera si numeroase propozit ii care nu au sens. Ceea ce ne
intereseaza n acest moment este aspectul formal, deci din punct de vedere
sintactic toate aceste propozit ii sunt corecte; semantic, unele propozit ii pot
sa e incorecte sau chiar sa nu aibe sens.
Sa mai observam ca o gramatica Chomsky este n masur a sa constituie
un model matematic pentru sintaxa unei limbi, fara sa intereseze aspectele
semantice. Este ceea ce a ncercat sa faca Naom Chomsky pentru limba
engleza n lucrarile sale din anii /50.
3. G = (V
N
, V
T
, X
0
, P), unde
V
N
= <program>, <instruct ie>, <atribuire>, <if>, <expresie>, <termen>,
<factor>, <variabil a>, <index>,
V
T
= begin, end, if, then, stop, t, i, +, *, (, ), =, ,, ; ,
X
0
=<program>
P = <program>begin <linie> end
<linie><linie>;<instruct ie> [ <instruct ie>
<instruct ie><atribuire> [ <if> [ stop
<atribuire><variabil a>=<expresie>
<if>if( <expresie>) then <atribuire>
<expresie><expresie> + <termen> [ <termen>
<termen><termen> <factor> [ <factor>
<factor>(<expresie>)[ <variabila>
<variabila>t(<index>)[i
<index><index>, <expresie> [ <expresie>
Gramatica din acest exemplu deneste un limbaj de programare simplu cu
trei tipuri de instruct ii: atribuiri, if-then, stop. Expresiile aritmetice au nu-
mai operatorii + si *; variabilele pot simple sau indexate (tablouri), iar i
t ine loc de identicator sau constant a. Ment ion am ca denirean acest mod
a unui limbaj, inclusiv utilizarea crosetelor pentru desemnarea simbolurilor
neterminale, poarta adesea denumirea de notat ie Backus Naur; n acest
mod s-a denit limbajul ALGOL60.
Tipuri de gramatici Dupa forma regulilor de generare, gramaticile Chomsky
se mpart n mai multe tipuri; clasicarea obisnuit a este urmatoarea:
Gramatici de tipul 0; sunt gramatici far a restrict ii asupra regulilor;
Gramatici de tipul 1 (dependente de context); sunt gramatici care au reguli
de forma
1.2. GRAMATICI GENERATIVE DE TIP CHOMSKY 11
uAv upv, u, p, v V

G
, p ,= , A V
N
sau A si n acest caz A nu apare n dreapta vreunei reguli.
Observat ie. Evident, regulile de forma a doua au sens numai daca A este
simbolul de start.
Gramaticile de tipul 2 (independente de context); sunt gramatici care au
reguli de forma
A p, A V
N
, p V

G
.
Gramaticile de tipul 3 (regulate); sunt gramatici care au reguli de forma
_
A Bp
C q
sau
_
A pB
C q
cu A, B, C V
N
si p, q V

T
.
Vom nota cu /
j
, j = 0, 1, 2, 3 familiile de limbaje generate de gramaticile
de tipurile j = 0, 1, 2, 3; vom avea astfel limbaje de tipul 0, limbaje de tipul 1
(sau dependente de context) , limbaje de tipul 2 (sau independente de context)
si limbaje de tipul 3 (sau regulate). Sa observam ca este importanta structura
cuvintelor unui limbaj si nu modul n care sunt notate simbolurile terminale. De
exemplu , limbajele
L

2
= 0
n
1
n
[n 1, L

2
= a
n
b
n
[n 1
sunt n mod practic identice. Putem utiliza o unica notat ie pentru afabetul
simbolurilor terminale , de exemplu , V
T
= i
1
, . . . , i
n
. Clasicarea de mai
sus este fundamentala n teoria limbajelor formale, ea a fost introdusa de Naom
Chomsky in 1958 si prin tradit ie noile clase de limbaje sunt raportate la aceasta
clasicare. O alta clasicare este urmatoarea
Gramatici de tipul 0; far a restrict ii;
Gramatici monotone (de tipul 1):
u v, [u[ [v[, u, v V

G
;
Gramatici dependente de context:
uAv upv, u, p, v V

G
, p ,= , A V
N
;
Gramatici independente de context (de tipul 2):
A p, A V
N
, p V

G
;
12 CAPITOLUL 1. INTRODUCERE
Gramatici liniare:
A uBv, A V
N
, B V
N
u, v V

T
;
Gramatici (stang) drept liniare:
A uB (A Bv), A V
N
, B V
N
u, v V

T
;
Gramatici regulate (de tipul 3); gramatici stang liniare sau gramatici drept
liniare.
Gramaticile monotone ca si cele dependente de context nu pot avea reguli cu
partea dreapta vida. Se introduce urmatoarea convent ie de completare: ntr-
o gramatica monotona sau dependenta de context se admite o regula de forma
A cu condit ia ca A sa nu apara n partea dreapta a vreunei reguli. Dupa
cum vom vedea , existent a sau inexistent a regulilor de forma A , reguli
numite de stergere, poate modica esent ial puterea generativa a unei gramatici.
O gramatica n care nu avem astfel de reguli o vom numi gramatica libera; de
asemenea, un limbaj care nu cont ine cuvantul vid, l vom numi limbaj liber.
Sa mai observam ca existent a regulilor de stergere ntr-o gramatica nu implica n
mod necesar existent a cuvantului vid n limbajul generat.
Doua gramatici care genereaza acelasi limbaj se numesc echivalente.
Gramaticile monotone si gramaticile dependente de context sunt echivalente;
de asemenea, gramaticile drept si stang liniare sunt echivalente, justicandu-se
astfel clasa gramaticilor regulate.
1.3 Ierarhia Chomsky
Lemele care urmeaza vor avea o utilizare frecvent a n cele ce urmeaza.
Lema 1.1 (Lema de localizare a gramaticilor independente de context) Fie G o
gramatica independenta de context si e derivarea
x
1
. . . x
m

p, unde x
j
V
G
, j = 1, m , p V

G
.
Atunci exista p
1
, p
2
, . . . , p
m
V

G
astfel ncat
p = p
1
. . . p
m
si x
j

p
j
, j = 1, m.
Demonstrat ie. Procedam prin induct ie asupra lungimii derivarii l.
Daca l = 0 atunci p = x
1
. . . x
m
si luam p
j
= x
j
.
Presupunem ca proprietatea este adevarata pentru derivari de lungime l si
e o derivare de lungime l + 1, x
1
. . . x
m

p. Punem n evident a ultima derivare


1.3. IERARHIA CHOMSKY 13
directa x
1
. . . x
m

qp. Conform ipotezei inductive, q = q


1
. . . q
m
si x
j

q
j
, j =
1, . . . , m.
Fie apoi A u regula care se aplican derivarea directa qp si sa presupunem
ca A intr a n subcuvantul q
k
, deci q
k
= q

k
Aq

k
. Vom lua
p
j
=
_
q
j
, j ,= k
q

k
uq

k
, j = k
Este evident ca x
j

p
j
, j ,= k, iar pentru j = k avem
x
k

q
k
= q

k
Aq

k
q

k
uq

k
= p
k
.2
Vom pune n evident a n continuare o proprietate asupra structurii regulilor gra-
maticilor Chomsky. Partea dreapta a unei reguli, pentru toate tipurile de gra-
matici, este un cuvant format din terminale sau neterminale. Este convenabil
de multe ori ca partea dreapta a regulilor sa cont ina un singur tip de simboluri,
terminale sau neterminale. Acest lucru este posibil fara modicarea tipului gra-
maticii.
Lema 1.2 (Lema A i) Fie G = (V
N
, V
T
, S, P) o gramatica de tipul 2. Exista
o gramatica G

echivalenta, de acelasi tip, cu proprietatea ca daca o regula are


n partea dreapta un terminal, atunci ea este de forma A i, A V
N
, i V
T
.
Demonstrat ie. Luam gramatica G

de forma G

= (V
N

, V
T

, S, P

) unde V
N

si
P

se construiesc astfel: V
N
V
N

si includem n P

toate regulile din P care


convin. Fie acum o regula din P care nu convine (punem n evident a aparit ia
terminalelor din partea dreapta):
u v
1
i
1
v
2
i
2
. . . i
n
v
n+1
, i
k
V
T
, v
k
V

N
.
Vom introduce n P

urmatoarele reguli:
u v
1
X
i
1
v
2
X
i
2
. . . X
i
n
v
n+1
, X
i
k
i
k
, k = 1, n ,
unde X
i
k
sunt neterminale noi pe care le adaug am la V
N

. Este evident ca G

pastreaz a tipul lui G si ca L(G

) = L(G)2.
Observat ie. Construct ia din lema se poate extinde usor la gramatici de tipul
0, nlocuind si terminalele din partea stang a a regulilor (u poate un sir arbitrar
ce cont ine minim un neterminal). Gramatica astfel obt inut a este echivalent a cu
cea init iala si pastreaz a tipul.
Ierarhia Chomsky. Este evident ca /
3
/
2
si ca /
1
/
0
, deoarece orice
regula a unei gramatici de tipul 3 respecta prescript iile unei gramatici de tipul
2; analog pentru familiile /
1
si /
0
. Aparent, o regula de forma A p (de tipul
2) este un caz particular a unei reguli de forma uAv upv (de tipul 1), pentru
14 CAPITOLUL 1. INTRODUCERE
u = v = ; totusi, realitatea nu este aceasta, deoarece la tipul 2 de gramatici
sunt permise reguli de stergere, pe cand la tipul 1 se impune condit ia p ,= . Vom
arata ca avem /
2
/
1
.
Sirul de incluziuni
/
3
/
2
/
1
/
0
poarta denumirea de ierarhia Chomsky (vom arata pe parcursul acestui curs
ca incluziunile sunt stricte). Aceasta ierarhie caracterizeaza puterea generativa
a celor patru tipuri de gramatici, aceasta putere ind crescatoare de la 3 la 0.
Orice alte mecanisme generative se raporteaza la aceasta ierarhie fundamental a.
Vom demonstra mai ntai urmatoarea lema.
Lema 1.3 (Lema eliminarii regulilor de stergere). Orice limbaj independent de
context -liber poate generat de o gramatica de tipul 2 fara reguli de stergere.
Demonstrat ie. Fie G = (V
N
, V
T
, X
0
, P) o gramatica independenta de context si
L(G) limbajul generat. Prin ipoteza , L(G). Denim prin recurent a sirul de
mult imi U
k
astfel:
U
1
= X[X V
N
, X P
U
k+1
= X[X V
N
, X p P, p U

k
U
k
, k 1.
Sa observam ca sirul de mult imi denite este crescator n raport cu relat ia de
incluziune. Cum toate aceste mult imi sunt incluse n V
N
si V
N
este nita, rezulta
ca exista o mult ime maximala U
f
astfel astfel nc at
U
1
U
2
U
f
= U
f+1
= .
Are loc de asemenea si implicat ia X U
f
X

.
Vom ilustra aceasta implicat ie cu un exemplu. Sa presupunem ca U
f
= U
3
si e X U
3
. Atunci n mod necesar trebuie sa avem X p P, p U

2
; de
exemplu p = X
1
X
2
si X
1
, X
2
U
2
.

In mod analog X
1
Y
1
Y
2
Y
3
, X
2
Z
1
Z
2
si
Y
1
, Y
2
, Y
3
, Z
1
, Z
2
U
1
, prin urmare Y
1
, Y
2
, Y
3
, Z
1
, Z
2
.
Putem scrie derivarea
XX
1
X
2

Y
1
Y
2
Y
3
Z
1
Z
2

.
Denim acum urmatoarea gramatica independent a de context far a reguli de
stergere G

= (V
N
, V
T
, X
0
, P

) unde V
N
, V
T
, X
0
sunt ca n gramatica data, iar P

se construieste pornind de la P astfel. Fie X p P, p ,= . Includem atunci


n P

aceasta regula precum si toate regulile de forma X p


j
, unde p
j
se obt ine
din p las and la o parte, n toate modurile posibile, simbolurile din U
f
(se excepta
cazul p
j
= ). De exemplu daca X ABC P si A, B U
f
, vom induce n P

regulile
X ABC, X BC, X AC, X C.
1.3. IERARHIA CHOMSKY 15
Sa observam ca n acest fel mult imea P a fost pe de o parte micsorat a (au fost
excluse regulile de alegere), iar pe de alta parte mbogat ita cu eventualele noi
reguli. Sa mai obsevam ca G

este independent a de context si ca nu cont ine


reguli de stergere.
Vom arata ca L(G) = L(G

).
Mai ntai, sa aratam ca L(G) L(G

).
Fie p L(G), deci X
0

G
p; vom arata ca X
0

p. Vom arata o implicat ie


ceva mai generala, X

G
p implica X

p, pentru orice X V
N
(relat ia ceruta
se obt ine pentru X = X
0
). Procedam prin induct ie asupra lungimii derivarii l.
Daca l = 1 avem
X
G
p deci X p P. Dar p ,= deci X p P

adica X

p.
Presupunem ca armat ia este adevarat a pentru l = n si luam o derivare cu
lungimea l = n + 1. Punem n evident a prima derivare directa
X
G
X
1
. . . X
m

G
p
Conform lemei de localizare avem p = p
1
. . . p
m
si X
j

G
p
j
, j = 1, . . . , m.
Unele din cuvintele p
j
pot sa e vide; pentru precizarea ideilor sa presupunem ca
p
2
, p
3
, p
5
= . Atunci pentru derivarile X
j

G
p
j
, j ,= 2, 3, 5, care au lungimea
de cel mult n, conform ipotezei inductive avem X
j

p
j
.
Pe de alta parte , pentru j = 2, 3, 5 avem X
2

G
, X
3

G
, X
5

G
,
deci X
2
, X
3
, X
5
U
f
. Rezulta ca
X X
1
X
4
X
6
. . . X
m
P

asa nc at putem scrie


X
G

X
1
X
4
X
6
. . . X
m

p
1
p
4
p
6
. . . p
m
= p.
Deci X

p si luand X = X
0
obt inem p L(G

). Prin urmare L(G) L(G

).
Sa arat am acum incluziunea invers a , L(G

) L(G).
Fie p L(G), X
0

p. Punem n evident a o derivare directa oarecare


X
0

u
G

p.
16 CAPITOLUL 1. INTRODUCERE
Daca n derivarea directa u
G

v se aplica o regula care exista si n G, atunci


evident pasul respectiv poate facut si n G. Sa presupunem ca se aplica o regula
nou introdusa de exemplu X BC, deci pasul respectiv va avea forma
u = u

Xu

BCu

= v
Regula X BC P

a provenit dintr-o regula din P, las and la o parte simboluri


din U
f
, n cazul nostru din X ABC, las andu-l la o parte pe A U
f
. Deoarece
A

G
, avem
u = u

Xu


G
u

ABCu

G
u

ABCu

= v.
Prin urmare orice pas al derivarii considerate se poate obt ine si n gramatica G,
deci X
0

G
p si p L(G), adica L(G

) L(G)2.
Teorema 1.1 /
2
/
1
.
Demonstrat ie. Fie L /
2
un limbaj independent de context si G o gramatica de
tipul 2 care l genereaza, adica L = L(G).
Presupunem ca L. Construim gramatica G

ca n lema precedenta; orice


cuvant p ,= din L(G) se poate obt ine n G

si invers , deci L(G

) = L(G) .
Consideram atunci o gramatica G

= (V
N
X

0
, V
T
, X

0
, P

0
, X

0

X
0
). Evident L(G

) = L(G). Toate regulile lui G

respecta tipul 1 (cu u =


v = ) si cont ine o singura regula de stergere X

0
iar X

0
nu apare n partea
dreapta a vreunei reguli. Deci G

este de tipul 1 si orice limbaj independent de


context este inclus n /
1
, adica /
2
/
1
.2
Fiind data o operat ie binara notata cu pe o familie de limbaje L, vom
spuna ca familia L este nchis a la operat ia daca L
1
, L
2
L implica L
1
L
2

L. Denit ia not iunii de nchidere pentru operat ii unare sau cu aritate oarecare
este analoaga. Relativ la proprietat ile de nchidere a familiilor din clasicarea
Chomsky ment ion am urmatorul rezultat.
Teorema 1.2 Familiile /
j
, j = 0, 1, 2, 3 sunt nchise la operat iile regulate.
Demonstrat ie. Fie G
k
= (V
N
k
, V
T
k
, S
k
, P
k
), k = 1, 2 doua gramatici de acelasi
tip j, j = 0, 1, 2, 3. Putem presupune ca V
N
1
V
N
2
= . Trebuie sa arat am ca
limbajele L(G
1
) L(G
2
), L(G
1
)L(G
2
), L(G
1
)

, sunt de acelasi tip j.



In acest
scop vom construi gramatici de tipul j care sa genereze le genereze. Vom indica
far a demonstrt ie modul de construct ie al gramaticilor (pentru detalii vezi [?]):
Reuniune
1.4. TRADUCEREA PROGRAMELOR 17
j = 0, 1, 2, 3:
G = V
N
1
V
N
2
S, V
T
1
V
T
2
, P
1
P
2
S S
1
[S
2
).
Produs
j = 0, 1, 2:
G = V
N
1
V
N
2
S, V
T
1
V
T
2
, P
1
P
2
S S
1
S
2
).
j = 3:
G = V
N
1
V
N
2
S, V
T
1
V
T
2
, S
1
, P

1
P
2
),
unde P

1
se obt ine din P
1
prinnlocuirea regulilor de forma A p cu A pS
2
.

Inchidere Kleene
j = 0, 1:
G

= (V
N
S

, X, V
T
, S

, P S

[S[XS, Xi Si[XSi, i V
T
)
j = 2:
G

= (V
N
S

, V
T
, S

, P P
prime
S

S[)
j = 3:
G

= (V
N
S

, V
T
, S

, P P
prime
S

S[)
1.4 Traducerea programelor
Un limbaj de programare este un limbaj care are drept scop descrierea unor
procese de prelucrare a anumitor date si a structurii acestora (n unele cazuri
descrierea structurii datelor este preponderenta), prelucrare care se realizeaza n
general cu ajutorul unui sistem de calcul.
Exista n prezent un numar mare de limbaje de programare de nivel nalt sau
evoluate care se caracterizeaza printr-o anumit a naturalet e, n sensul ca descrierea
procesului de prelucrare cu ajutorul limbajului este apropiata de descrierea nat-
urala a procesului respectiv precum si prin independent a unor astfel de limbaje
fat a de sistemul de calcul. Dintre limbajele de acest tip cu o anumita rasp andire
n momentul de fat a ment ion am limbajele PASCAL, FORTRAN, C, JAVA, etc.
O alta clasa importanta de limbaje, sunt limbajele de asamblare, sau de nivel
inferior, ale caror caracteristici depind de sistemul de calcul considerat. In gen-
eral, ecare sistem de calcul (sau tip de sistem de calcul), are propriul sau lim-
baj de asamblare; de exemplu, limbajul de asamblare ale sistemelor de calcul
echipate cu procesoare de tip Intel Z-80 este denumit n mod curent ASSEM-
BLER. Instruct iile unui limbaj de asamblare corespund cu operat iile simple ale
18 CAPITOLUL 1. INTRODUCERE
sistemului de calcul iar stocarea datelor n memorie este realizata direct de uti-
lizator la nivelul locat iilor elementare ale memoriei. Exista de asemenea anumite
pseudo-instruct ii sau directive referitoare la alocarea memoriei, generarea datelor,
segmentarea programelor, etc., precum si macroinstruct ii care permit generarea
unor secvent e tipice de program sau accesul la bibliotecile de subprograme.
In afara de limbajele evoluate si de limbajele de asamblare, exista numeroase
limbaje specializate, numite uneori si de comanda, care se refera la o anumita clasa
de aplicat ii. Ment ionam de exemplu limbajul pentru prelucrarea listelor LISP,
limbajele utilizate n cadrul softwarelui matematic (Mathematica, Maple, MAT-
CAD, etc.) si multe altele.

In general nsa astfel de limbaje nu sunt considerate
limbaje de programare propriuzise.
Un program redactat ntr-un limbaj de programare poarta denumirea de pro-
gram sursa. Fiecare sistem de calcul, n funct ie de particularitat ile sale, poseda
un anumit limbaj propriu, numit cod masina, acesta ind singurul limbaj nt eles
de procesorul sistemului. Un astfel de limbaj depinde de structura instruct iilor
procesorului, de setul de instruct ii, de posibilitat ile de adresare, etc. Un pro-
gram redactat n limbajul cod masin a al sistemului de calcul l numim program
obiect.
Procesul de transformare al unui program sursa n program obiect se numeste
compilare sau translatare, uneori chiar traducere. De obicei termenul de com-
pilare este utilizat numai n cazul limbajelor evoluate, n cazul limbajelor de
asamblare ind utilizat termenul de asamblare.
Compilarea (asamblarea) este efectuata de un program al sistemului numit
compilator (asamblor). De multe ori compilatoarele nu produc direct program
obiect, ci un text intermediar apropiat de programul obiect, care n urma unor
prelucrari ulterioare devine program obiect. De exemplu, compilatoarele sis-
temelor de operare DOS produc un text numit obiect (siere cu extensia obj)
care n urma unui proces numit editare de legaturi si a ncarc arii n memorie
devine program obiect propriuzis, numit program executabil (siere cu extensia
exe). Exista mai multe rat iuni pentru o astfel de tratare, ntre care posibilitatea
cuplarii mai multor module de program realizate separat sau provenite din lim-
baje sursa diferite, posibilitatea crearii unor biblioteci de programe n formatul
intermediar si utilizarea lor n alte programe, etc.
Un program sursa poate de asemenea sa e executat de catre sistemul de
calcul direct, far a transformarea lui prealabila n program obiect.

In acest caz,
programul sursa este prelucrat de un program al sistemului numit interpretor;
acesta ncarc a succesiv instruct iile programului sursa, le analizeaza din punct
de vedere sintactic si semantic si dupa caz, le executa sau efectueaza anumite
operat ii auxiliare.
Procesul de compilare este un proces relativ complex si comporta operat ii care
au un anumit caracter de autonomie. Din aceste motive procesul de compilare
este de obicei descompus n mai multe subprocese sau faze, ecare faza ind o
operat ie coerenta, cu caracteristici bine denite.

In principiu aceste faze sunt
1.4. TRADUCEREA PROGRAMELOR 19
AnalizaLexicala
Analizasintactica
Generarea formatului
intermediar
Generarea codului
Optimizarea codului
Tratarea
erorilor
Prelucrarea
tabelelor
Program Obiect
Program Sursa
Figura 1.1: Fazele compilarii
parcurse secvent ial (pot sa existe si anumite reveniri) iar programul sursa este
transformat succesiv n formate intermediare. Se poate considera ca ecare faza
primeste de la faza precedent a un sier cu programul prelucrat ntr-un mod core-
spunzator fazei respective, l prelucreaza si furnizeaza un sier de iesire, iarasi
ntr-un format bine precizat, sier utilizat n faza urmatoare. Exista cinci faze de
compilare principale: analiza lexicala, analiza sintactic a, generarea formatului in-
termediar, generarea codului, optimizarea codului si doua faze auxiliare, tratarea
erorilor si tratarea tabelelor (vezi gura 1.1).
Analiza lexicala are ca obiectiv principal determinarea unitat ilor lexicale ale
unui program, furnizarea codurilor acestora si detectarea eventualelor erori lex-
icale. Pe langa aceste operat ii de baza, la analiza lexicala se mai pot efectua
anumite operat ii auxiliare precum: eliminarea blank-urilor (daca limbajul per-
mite utilizarea far a restrict ii a acestora), ignorarea comentariilor, diferite conver-
siuni ale unor date (care se pot efectua la aceasta faza), completarea tabelelor
compilatorului.
Analiza sintactica determina unitat ile sintactice ale programului (secvent e
de text pentru care se poate genera format intermediar) si veric a programul
din punct de vedere sintactic. Este faza centrala a unui compilator, deseori toate
celelalte faze sunt rutine apelate de analizorul sintactic pe masur a ce este posibila
efectuara unei part i din faza respectiva. Tot la analiza sintactic a se denitiveaz a
20 CAPITOLUL 1. INTRODUCERE
tabelele de informat ii si se realizeaza prelucrarea erorilor sintactice.
Faza de generare a formatului intermediar se refera la transformarea progra-
mului ntr-o forma numita intermediara pornind de la care se poate, printr-o
procedura relativ simpla, sa se obt in a programul obiect. Structura acestei faze
depinde de formatul intermediar ales de catre proiectant si de modalitatea de
implementare; uzual se folosesc cvadruple, triplete sau sirurile poloneze.
Generarea codului este o faza in care se realizeaza codul obiect corespunzator
programului. Practic n aceasta faza se obt ine programul n limbaj de asamblare
corespunzator programului sursa redactat ntr-un limbaj evoluat.

In mod obisnuit
generatorul de cod este constituit din rutinele generatoare de cod corespunzatoare
diverselor unitat i ale formatului intermediar.

In faza de optimizare a codului se realizeaza o anumita mbunat at ire a codului


obiect astfel ncat programul rezultat sa e cat mai performant (n privint a con-
sumului de timp si memorie). Cele mai tipice exemple sunt eliminareanc arc arilor
si a memorarilor redundante sau optimizarea ciclurilor.
Fazele de Prelucrare a tabelelor si de Tratare a erorilor vor atinse numai
part ial n aceast curs. Facem ns a ment iunea ca prelucrarea tabelelor poate sa
aiba o inuent a importanta asupra performant elor unui compilator, n mod spe-
cial din punctul de vedere al timpului de execut ie (compilare) si ca tratarea
erorilor are o anumit a implicat ie n eliminarea erorilor sintactice.
1.5 Probleme propuse
1. Gasit i limbajul generat de gramatica G = (V
N
, V
T
, S, P), precizand tipul
gramaticii (cf. clasicarii Chomsky):
(a) V
N
= S; V
T
= 0, 1, 2;
P = S 0S0[1S1[2S2[0.
(b) V
N
= S; V
T
= a, b;
P = S aSb[ab.
(c) V
N
= S, A, B; V
T
= a, b, c;
P = S abc[aAbc, Ab bA, Ac Bbcc, bB Bb, aB
aaA[aa.
(d) V
N
= S, A, C; V
T
= +, , 0, 1, . . . , 9;
P = S A[ + A[ A, A AC[C, C 0[1[ . . . [9.
(e) V
N
= S, A, B; V
T
= 0, 1;
P = S 0S[1A, A 0B[1S[0, B 0A[1B[1.
(f) V
N
= A, V
T
= a, b, S = A, P = A aA[b;
(g) V
N
= x
0
, V
T
= A, B, . . . , Z, S = x
0
, P = x
0
x
1
D,
x
1
x
2
N, x
2
E;
1.5. PROBLEME PROPUSE 21
(h) V
N
= A, V
T
= 0, 1, 2, S = A, P = A 0A0[1A1[2A2[;
(i) V
N
= S, A, V
T
= 0, 1, . . . , 9, .,
P = S A.A, A 0A[1A[ . . . [9A[0[1[ . . . [9;
(j) V
N
= S, V
T
= PCR, PDAR, UDMR,
P = S PCR[PDAR[UDMR;
(k) V
N
= A, B, C, V
T
= 0, 1, S = A, P = A 0A[1B[1,
B 0C[1A, C 0B[1C[0;
(l) V
N
= S, A, B, C, V
T
= 0, 1, . . . , 9, +, ,
P = S +A[ A[A, A 0A[1A[ . . . [9A[0[1[ . . . [9;
(m) V
N
= S, V
T
= (, ), P = S S(S)S[;
(n) V
N
= E, T, F, V
T
= (, ), i, +, , S = E,
P = E E + T[T, T T F[F, F (E)[i;
(o) V
N
= S, A, B, V
T
= a, b, c, P = S abc[aAbc,
Ab bA, Ac Bbcc, bB Bb, aB aaA[aa;
(p) V
N
= S, A, B, C, D, E, V
T
= a, P = S ACaB, Ca aaC, CB
DB[E, aD Da, AD AC, aE Ea, AE ;
(q) V
N
= S, A, B, C, D, E, V
T
= a, b, P = S ABC,
AB aAD[bAE, DC BaC, EC BbC, Da aD, Db bD, Ea
aE, Eb bE, AB , C , aB Ba, bB Bb;
2. Precizat i care dintre gramaticile precedente sunt echivalente.
3. Gasit i gramatici pentru generarea urmatoarelor limbaje:
(a) L = ;
(b) L = ;
(c) L = 0
n
[n N;
(d) L = a, ab, aab, ba, baa.
(e) L = a
n
cb
n
[n 1.
(f) L = w a, b, c

[w cont ine cc si se termina cu a.


(g) L = BEGIN[END[IF[WHILE[UNTIL.
(h) L = w 0, 1

[ reprezentarea binara pe 8 bit i a unui ntreg .


(i) L = a
n
b
n+3
a
n+1
[n 0.
(j) L = w a, b, c

[w ncepe cu a si are maxim 4 litere .


(k) L = a
i
b
j
c
k
[i, j, k > 0.
(l) L = w 0, 1

[w multiplu de 8 .
(m) L = constante reale n scrierea obisnuit a cu punct zecimal p
i
.p
z
.
22 CAPITOLUL 1. INTRODUCERE
(n) L = a
i
b
j
a
i
b
j
;
(o) L = awbbw

[w, w

0, 1

;
(p) L = w 0, 1

[w cont ine maxim 2 de 0 ;


(q) L = wa w[w 0, 1

;
(r) L = w[w octet ce reprezinta un numar par ;
(s) L = A, B, C, . . . , Z;
4. Construit i o gramatica ce cont ine reguli de stergere, dar genereaza un limbaj
-liber.
5. Folosind teorema sa se construiasca o gramatica independent a de context,
far a reguli de stergere care genereaza limbajul de la punctul precedent.
Capitolul 2
Limbaje Regulate si Analiza
Lexicala
2.1 Automate nite si limbaje regulate
Automate nite. Automatele nite sunt mecanisme pentru recunoasterea lim-
bajelor de tipul 3 (regulate). Un automat nit (AF) se compune dintr-o banda
de intrare si un dispozitiv de comanda.
Pe banda de intrare sunt nregistrate simboluri ale unui alfabet de intrare, con-
stituind pe banda un cuvant p. La ecare pas de funct ionare banda se deplaseaza
cu o pozit ie spre stanga.
Dispozitivul de comanda poseda un dispozitiv de citire de pe banda; dispoz-
itivul se aa permanent ntr-o anumita stare interna, element al unei mult imi
nite de stari. Schema unui automat nit este redata n gura 2.1.
Automatul nit funct ioneaz a n pasi discret i. Un pas de funct ionare consta
din: dispozitivul de comanda citeste de pe banda de intrare simbolul aat n
dreptul dispozitivului de citire; n funct ie de starea intern a si de simbolul citit,
automatul trece ntr-o noua stare si mut a banda cu o pozit ie spre stanga. Au-
tomatul si nceteaza funct ionarea dupa ce s-a citit ultimul simbol nregistrat pe
banda; n acest moment el se va aa ntr-o anumita stare, care, dupa cum vom
vedea, va juca un rol important n recunoasterea cuvintelor.
Din punct de vedere matematic, un automat nit este un sistem
AF = (, I, f, s
0
,
f
),
unde
este alfabetul (mult imea) de stari;
I este alfabetul de intrare;
f : I T() este funct ia de evolut ie;
s
0
este starea init ial a;

f
este mult imea de stari nale.
23
24 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
i
1
i
2
i
3
...
i
k
...
i
n-1
i
n
...
Dispozitiv decitire
Dispozitiv decomanda sS
Bandadeintrare
Figura 2.1: Reprezentarea schematic a a unui automat nit
Daca pentru orice (s, i) I, avem [f(s, i)[ 1 automatul se numeste
determinist; n caz contrar se numeste nedeterminist.
Observat ii:
1. Funct ionarea unui automat nit se poate bloca n situat ia n care el se aa
n starea s, citeste de pe banda simbolul i si f(s, i) = ; evident ca n acest
caz funct ionarea n continuare nu mai este posibila.
2.

In cazul unui automat determinist vom scrie f(s, i) = s

(n loc de f(s, i)
s

.
3. Denit ia data este specica teoriei limbajelor formale. O alta denit ie (mai
generala) , ntalnit an teoria automatelor este urmatoarea: un automat nit
este un sistem AF = (, I, O, f, g, s
0
, F) unde, , I, f, s
0
, F au semnicat ia
de mai sus, O este alfabetul de iesire iar g : I T(O) este funct ie
de iesire. Funct ionalitatea unui astfel de automat nit este analoaga cu
cea descrisa mai sus, cu deosebirea ca la ecare pas automatul furnizeaza o
iesire o g(s, i).
Prin diagrama de stari a unui automat nit nt elegem un graf orientat care are
nodurile etichetate cu starile s iar arcele se construiesc astfel: nodurile s, s

se unesc cu un arc orientat de la s la s

daca exista i I astfel ncat s

f(s, i);
arcul respectiv va notat cu i.
Exemplu AF = (, I, f, s
0
,
f
) unde = s
0
, s
1
, s
2
, I = i
1
, i
2
,
f
= s
2
,
iar f este data de tabelul
s
0
s
1
s
2
i
1
s
1
s
2
s
0

i
2
s
0
, s
1
s
0
, s
1

2.1. AUTOMATE FINITE SI LIMBAJE REGULATE 25


s
0
s
2
s
1
i
1
i
1
i
2
i
2
i
2
i
2
Figura 2.2: Diagrama de stari
Diagrama de stari corespunzatoare este prezentat a n gura 2.2.
Funct ia de evolut ie Funct ia f se prelungeste de la I la T() I

deci
denim f

: T() I

T(), astfel:
(a) f

(s, ) = s, s ,
(b) f

(, i) = , i I,
(c) f

(Z, i) =

sZ
f(s, i), Z T(), Z ,= ,
(d) f

(Z, pi) = f

(f

(Z, p), i).


Prin abuz de limbaj, vom folosi pentru noua funct ie tot notat ia f.Sa observam
ca relat iile de mai sus constituie o denit ie prin recurent a, corecta; ind dat f,
putem deni mai nt ai toate valorile f(Z, i) (un num ar nit, deoarece I este o
mult ime nita), apoi f(Z, p) pentru [p[ = 2, n continuare f(Z, p) pentru [p[ = 3,
etc.
Proprietat ile funct iei f:
1. Daca Z
k
este o familie de part i a lui , avem
f(
_
k
Z
k
, i) =
_
k
f(Z
k
, i)
Demonstrat ie. Utilizand (c) putem scrie
_
k
f(Z
k
, i) =
_
k
(
_
sZ
k
f(s, i)) =
_
sZ
k
f(s, i) = f(
_
k
Z
k
, i).2
2. f(Z, p) =

sZ
(f(s, p)), p I

.
Demonstrat ie. Prin induct ie asupra lungimii lui p.
Pentru [p[ = 1 avem f(Z, i) =

sZ
f(s, i), adica (c).
Presupunem ca relat ia este adevarat a pentru [p[ = m si consideram un p astfel
26 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
nc at [p[ = m + 1, deci p = p

i, [p

[ = m. Putem scrie
f(Z, p) = f(Z, p

i) = f(f(Z, p

), i) = f(

sZ
f(s, p

), i) =
=

sZ
f(f(s, p

), i) =

sZ
f(s, p

i) =

sZ
f(s, p).
2
3. f(s, pq) = f(f(s, p), q), p, q I

.
Demonstrat ie. Induct ie asupra lungimii lui q.
Daca [q[ = 1, atunci q = i si relat ia se reduce la (d).
Presupunem ca proprietatea este adevarata pentru r si consideram [q[ = r+1.
Deci q = q

i. Avem
f(s, pq) = f(s, pq

i) = f(f(s, pq

), i) = f(f(f(s, p), q

), i) =
= f(f(s, p), q

i) = f(f(s, p), q).


2
Limbaje regulate.
Denit ie 2.1 Limbajul recunoscut de automatul nit AF = (, I, f, s
0
,
f
) este
L(AF) = p[p I

, f(s
0
, p)
f
,=
Deci p L(AF) daca automatul aandu-se n starea init iala s
0
, dupa [p[ pasi
de funct ionare poate sa ajunga ntr-o stare nala.

In cazul unui automat nit determinist limbajul recunoscut poate denit


n modul urmator. Pentru ecare s denim funct ia f
s
: I

T() prin
f
s
(p) = f(s, p).
Atunci
f(s
0
, p)
f
,= f(s
0
, p) = f
s
0
(p)
f
,
deci
L(AF) = p[f(s
0
, p)
f
,= = f
1
s
0
(
f
)
Limbajele recunoscute de automate nite le vom numi limbaje regulate; familia
acestor limbaje o vom nota cu 1. Evident, familia limbajelor recunoscute de
automate nite deterministe, 1
d
, este o parte a lui 1, 1
d
1. Vom arata ca
cele doua familii coincid.
Teorema 2.1 1
d
= 1.
Demonstrat ie. Fie AF = (, I, f, s
0
,
f
) un automat nit (n general nedetermin-
ist). Construim urmatorul automat nit determinist AF

= (

, I, f

, s
0
,

f
)
unde

= T(), f

= f (prelungirea la I

),

f
= Z[ Z T(), Z
f
,= .
Evident, automatul AF

este determinist.
Fie p L(AF). Atunci f(s
0
, p)
f
,= si f(s
0
, p)

f
. Pe de alta parte,
conform cu proprietatea 2 a funct iei de evolut ie, avem
f

(s
0
, p) = f(s
0
, p)
2.1. AUTOMATE FINITE SI LIMBAJE REGULATE 27
si deci f

(s
0
, p)

f
, adica p L(AF

) si L(AF) L(AF

).
Pe o cale analoaga se arata ca L(AF

) L(AF).2
Observat ie. Faptul ca un cuvant este recunoscut de un automat nit se poate
verica prin calcul direct sau pe diagrama de stari.
Exemplu. Consideram automatul din exemplul anterior (gura 2.2) si e
p = i
1
i
2
i
1
. Prin calcul direct:
f(s
0
, i
1
i
2
i
1
) = f(f(f(s
0
, i
1
), i
2
), i
1
) = f(f(s
1
, i
2
), i
1
) =
= f(s
0
, s
1
, i
1
) = f(s
0
, i
1
) f(s
1
, i
1
) = s
1
s
2
.
Astfel ca f(s
0
, i
1
i
2
i
1
)
f
= s
2
,= si p L(AF).
Pe diagrama de stari exista traiectoriile:
s
0
i
1
s
1
i
2
s
0
i
1
s
1
;
s
0
i
1
s
1
i
2
s
1
i
1
s
2
;
A doua traiectorie ne duce ntr-o stare nala, deci p L(AF).
Limbaje de tipul trei si limbaje regulate. Vom arata n cele ce urmeaza ca
familia limbajelor de tipul 3 coincide cu familia limbajelor regulate.

In prealabil
vom pune n evident a o forma speciala a limbajelor de tipul 3, pe care convenim
sa o numim forma normala.
Denit ie 2.2 Vom spune ca o gramatica de tipul 3 este n forma normala daca
are reguli de generare de forma
_
A iB,
C j,
unde A, B, C V
N
, i, j V
T
sau regula de completare S si n acest caz S nu apare n dreapta vreunei
reguli.
Lema 2.1 Orice gramatica de tipul 3 admite o forma normala.
Demonstrat ie. Daca G = (V
N
, V
T
, S, P) (
3
este gramatica data, eliminamn
primul rand -regulile (ca n lema eliminarii regulilor de stergere) apoi construim
gramatica G

= (V

N
, V
T
, S, P

), unde V

N
si P

se denesc astfel: introducem n


V

N
toate simbolurile din V
N
iar n P

toate regulile din P care convin; e acum


n P o regula de forma
A pB, p = i
1
. . . i
n
Vom introduce n P

regulile:
A i
1
Z
1
,
Z
1
i
2
Z
2
,
. . . ,
Z
n1
i
n
B,
28 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
iar simbolurile Z
1
, . . . Z
n1
le includem in V

N
.

In cazul unei reguli de forma A p cu [p[ > 1 procedam analog, exceptand ul-
tima regula nou introdusa care va avea forma Z
n1
i
n
. Sa mai facem observat ia
ca simbolurile Z
1
, . . . , Z
n1
le luam distincte pentru ecare caz.
Se poate arata usor ca L(G) = L(G

).2
Teorema 2.2 Familia limbajelor de tipul 3 coincide cu familia limbajelor regu-
late.
Demonstrat ie. Partea I: E /
3
E 1.
Fie E un limbaj de tipul 3 si G = (V
N
, V
T
, S, P) gramatica care l genereaza;
putem presupune ca G este n forma normala. Construim automatul nit AF =
(, I, f, s
0
,
f
) unde = V
N
X ( X simbol nou), I = V
T
, s
0
= S si

f
=
_
X, S , pentru E
X , pentru , E
Funct ia de evolut ie este denita de:
daca A iB P luam B f(A, i),
daca C j P luam X f(C, j),
n rest
Observat ie. Automatul astfel denit este n general nedeterminist. De exemplu,
daca A 0B[0 atunci f(A, 0) = B, X.
Fie p L(G), p = i
1
. . . i
n
, deci S

p. Detaliat, aceasta derivare va avea
forma
(1) Si
1
A
1
i
1
i
2
A
2
i
1
i
2
. . . i
n1
A
n1
i
1
i
2
. . . i
n
.
S-au aplicat regulile:
(2)
S i
1
A
1
,
A
1
i
2
A
2
,
. . .
A
n1
i
n
.

In automat avem corespunzator:


(3) :
A
1
f(S, i
1
),
A
2
f(A
1
, i
2
),
. . .
X f(A
n1
, i
n
)
Putem scrie traiectoria
(4) S
i
1
A
1
i
2
A
2
i
3
. . .
i
n
X
f
2.2. PROPRIET

AT I SPECIALE ALE LIMBAJELOR REGULATE 29


Deci p L(AF).
Daca p = , atunci S si S P. Dar atunci L(AF), caci
automatul este n starea S si ramne n aceasta stare dupa citirea lui ; cum
nsa n acest caz S
f
rezulta ca si n acest caz p L(AF).

In consecint a
L(G) L(AF).
Fie acum p = i
1
. . . i
n
L(AF); atunci avem traiectoria (4), relat iile (3),
regulile de generare (2) si putem scrie derivarea (1), adica p L(G) si L(AF)
L(G).2
Partea II E 1 E /
3
.
Vom indica numai modul de construct ie a gramaticii. Fie AF = (, I, f, s
0
,
f
)
automatul nit care recunoaste limbajul E, pe care l presupunem determinist.
Construim gramatica G = (, I, s
0
, P) unde mult imea P este denita astfel
f(A, i) = B genereaza regula A iB P,
n plus daca B
f
se genereaza si regula A i P.
Putem arata ca L(G) = L(AF).2
2.2 Proprietat i speciale ale limbajelor regulate
Caracterizarea algebrica a limbajelor regulate. Limbajele regulate, ind
part i din I

, se pot caracteriza algebric, independent de mecanismele de generare


(gramaticile de tipul 3) sau de cele de recunoastere (automatele nite).
Teorema 2.3 Fie E I

un limbaj. Urmatoarele armat ii sunt echivalente.


(a) E 1;
(b) E este o reuniune de clase de echivalent e a unei congruent e de rang nit;
(c) Urmatoarea congruent a
= (p, q)[
E
(r
1
pr
2
) =
E
(r
1
qr
2
), r
1
, r
2
I

,
unde
E
este funct ia caracteristica a lui E, este de rang nit.
Demonstrat ie: Vom arata urmatoarele implicat ii: (a) (b), (b) (c), (c) (a).
(a) (b).
Fie AF = (, I, f, s
0
,
f
) automatul nit care recunoaste limbajul E. Denim
pe I

relat ia
= (p, q)[f(s, p) = f(s, q), s .
Se poate vedea cu usurint a ca este o relat ie de echivalent a (reexiva , simetrica
, tranzitiva).

In plus , daca r I

si (p, q) , atunci (pr, qr) si (rp, rq) .


De exemplu, prima apartenent a se deduce astfel
f(s, pr) = f(f(s, p), r) = f(f(s, q), r) = f(s, qr), etc.
30 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
Prin urmare este o relat ie de congruent a.
Sa aratam ca aceasta congruent a este de rang nit, adica mult imea cat I

/
este nita.
Fie : o aplicat ie oarecare si e mult imea
I

() = p[p I

, f(s, p) = (s), s .
Sa observam ca daca este funct ia identic a atunci I

(). Deci nu toate


I

() sunt vide; n acest caz I

() este o clasa de echivalent a.



Intr-adev ar, e
p I

() I

xat si e C
p
clasa de echivalent a a lui p. Arat am ca C
p
= I

().
Daca q I

(), atunci f(s, q) = (s), s , ceea ce nseamn a ca f(s, q) =


f(s, p), s , si deci (p, q) adica q C
p
si I

() C
p
.
Invers daca q C
p
atunci f(s, q) = f(s, p) = (s), s si q I

(),
adica C
p
I

(). Aceasta nseamn a ca I

() = C
p
, adica I

() este o clasa de
echivalent a .

Intre mult imea cat I

/ si mult imea funct iilor denite pe cu valori n


putem stabili urmatoarea corespondent a biunivoca: unei funct ii : i
corespunde clasa de echivalent a I

(). Invers, ind data o clasa de echivalent a C,


luam p C (oarecare) si atas am lui C funct ia (s) = f(s, p)s . T inand cont
ca daca q C atunci f(s, p) = f(s, q), s , rezulta ca funct ia nu depinde
de elementul p ales.
Dar mult imea funct iilor denite pe cu valori n este nita, deci I

/ este
nita, adica congruent a este de rang nit.
Fie acum p L(AF) si q astfel ca (p, q) . Avem
f(s
0
, q) = f(s
0
, p)
f
;
adica q L(AF). Aceasta nseamna ca odata cu elementul p, L(AF) cont ine
clasa de echivalent a a lui p. De aici rezulta ca L(AF) este constituit dintr-un
anumit num ar de clase de echivalent a a lui .2
(b)(c)
Fie o congruent a de rang nit si E o reuniune de clase de echivalent a. Fie
apoi (p, q) ; aceasta nseamna ca r
1
pr
2
E r
1
qr
2
E, deci

E
(r
1
pr
2
) =
E
(r
1
qr
2
), r
1
, r
2
I

.
Prin urmare, (p, q) . Orice clasa de echivalent a din I

/ este inclusa
ntr-o clasa de echivalent a din I

/, asa ncat card(I

/) < card(I

/), adica
congruent a este de rang nit.2
(c) (a)
Presupunem ca este o congruent a de rang nit; consideram automatul nit
AF = (I

/, I, f, C

,
f
), unde funct ia de evolut ie f si mult imea de stari nale
sunt
f(C
p
, i) = C
pi
,
f
= C
p
[p E.
2.2. PROPRIET

AT I SPECIALE ALE LIMBAJELOR REGULATE 31


Vom arata ca E = L(AF).

In primul rand sa observam ca f(C
p
, q) = C
pq
(se
poate arata prin induct ie asupra lui [q[). Avem
p E C
p

f
f(C

, p) = C
p
= C
p

f
p L(AF)
adica E = L(AF) si E este un limbaj regulat.2
Corolar 2.4 Familia R este nchisa la operat ia de rasturnare.
Demonstrat ie. Fie E 1 si

E rasturnatul lui E. Conform teoremei de carac-
terizare, card(I

/
E
) < . Avem
(p, q)
E

E
(r
1
pr
2
) =
E
(r
1
qr
2
)
si

E
( r
1
p r
2
) =

E
( r
1
q r
2
) ( p, q)

E
Cu alte cuvinte daca C este o clasa de echivalent a a lui
E
atunci

C (rasturnatul
lui C) este o clasa de echivalent a a lui

E
. Aceasta nseamn a ca card(I

E
) =
card(I

/
E
) < si conform aceleiasi teoreme de caracterizare

E 1.2
Observat ie. Am vazut ca limbajele de tipul 3 pot denite de gramatici cu
reguli de doua categorii: drept liniare sau stang liniare. Este evident ca limbajele
stang liniare sunt rasturnatele limbajelor drept liniare. Cum familia limbajelor
regulate (drept liniare) este nchis a la operat ia de rasturnare, rezulta ca cele doua
familii de limbaje coincid.

Inchiderea familiei /
3
la operat iile Pref si complementariere.
Operat iile Pref si complementariere se denesc n modul urmator
Pref(E) = p[r I

, pr E, C(E) = I

E.
Teorema 2.5 Familia /
3
este nchisa la operat iile Pref si complementariere.
Demonstrat ie. Fie AF = (, I, f, s
0
,
f
) automatul nit care recunoaste limbajul
E. Putem presupune ca AF este determinist.
Limbajul Pref(E). Construim automatul nit AF

= (, I, f, s
0
,

f
) unde

f
= s [s = f(s
0
, q), q Pref(E).
Este evident ca Pref(E) L(AF

), caci daca q Pref(E) atunci s = f(s


0
, q)

f
conform denit iei lui

f
.
Sa arat am acum ca L(AF

) Pref(E). Fie r L(AF

), atunci f(s
0
, q)

f
,
deci exista q Pref(E) astfel ncat f(s
0
, r) = f(s
0
, q). Cum q este prexul unui
cuvant din E, exista w I

astfel ncat qw E, adica f(s


0
, q)
f
. Dar
f(s
0
, rw) = f(f(s
0
, r), w) = f(f(s
0
, q), w) = f(s
0
, qw)
f
,
32 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
s
0
s
1
i
1
s
j -1
s
j
=s
k
s
j +1
s
k -1
i
j
i
k +1
s
k +1
s
n -1 i
n
s
n
Figura 2.3: Traiectoria automatului nit
deci rw E si r Pref(E). Aceasta nseamn a ca L(AF

) Pref(E) si prin
urmare Pref(E) = L(AF

), adica Pref(E) este limbaj regulat.2


Limbajul C(E). Avem
C(E) = p I

[p , E = p I

[f(s
0
, p) ,
f
= p I

, f(s
0
, p) C(
f
).
Prin urmare C(E) = L(AF
c
) unde AF
c
= (, I, f, s
0
, C(
f
), adica C(E) este
un limbaj regulat.2
Lema de pompare pentru limbaje regulate Sub aceasta denumire (sau lema
uvw) este cunoscuta o proprietate a limbajelor regulate (ca si a altor familii de
limbaje) care ne premite sa descompunem cuvintele sucient de lungi ale limba-
jului n forma uvw si sa multiplic am subcuvantul v de un num ar arbitrar de ori,
obt inand cuvinte care apart in de asemenea limbajului. Cu alte cuvinte, putem
sa pompam n cuvantul dat o anumita parte a sa. Astfel de leme se utilizeaza
deseori pentru a rezolva probleme de neapartenent a, adica pentru a arata ca un
anumit limbaj nu apart ine unei familii date de limbaje.
Lema 2.2 Fie E un limbaj regulat si AF = (, I, f, s
0
,
f
) automatul nit care
l recunoaste. Daca p E si [p[ card() atunci p se descompune n forma
p = uvw, v ,= si uv
m
w E, m N.
Demonstrat ie. Fie p = i
1
. . . i
n
, n card(); e s
0
, s
1
, . . . , s
n
starile parcurse
de automat la citirea cuvantului p. Atunci, s
j
= f(s
j1
, i
j
), j = 1, n, s
n

f
.
Exista n mod necesar doua stari egale, s
j
= s
k
, j < k. Traiectoria va avea o
bucla (vezi gura 2.3).
Descompunem cuvantul pn forma p = uvw unde u = i
1
. . . i
j
, v = i
j+1
. . . i
k
, w =
i
k+1
. . . i
n
. Este clar ca v ,= , caci j < k. Pe de alta parte, putem parcurge traiec-
toria facand de mai multe ori bucla, adica
f(s
0
, uv
m
w) = s
n

f
.
Prin urmare uv
m
w E.2
2.2. PROPRIET

AT I SPECIALE ALE LIMBAJELOR REGULATE 33


Consecint a 2.3 Incluziunea /
3
/
2
este stricta.

In adevar, e limbajul L
2
= 0
n
1
n
[n 1. Stim ca acest limbaj este de tipul 2 si
ca poate generat de gramatica G = (A, 0, 1, A, A 0A1[01). Sa aratam
ca L
2
nu este de tipul 3.
Sa presupunem ca L
2
este de tipul 3 si e AF = (, I, f, s
0
,
f
) automatul
nit care l recunoaste. Cum L
2
cont ine cuvinte oricat de lungi, e p L
2
astfel ncat p card(). Conform lemei de pompare, p se descompune n forma
p = uvw, v ,= si uv
m
w E. Putem avea una din situat iile:
(1) p = 0 . . . 0
. .
u
0 . . . 0
. .
v
0 . . . 01 . . . 1
. .
w
,
(2) p = 0 . . . 01 . . . 1
. .
u
1 . . . 1
. .
v
1 . . . 1
. .
w
,
(3) p = 0 . . . 0
. .
u
0 . . . 1
. .
v
1 . . . 1
. .
w
.
Primele doua cazuri nu pot avea loc deoarece multiplic andu-l pe v, num arul de
simboluri 0 si 1 nu s-ar pastra egal.

In al treilea caz, luand de exemplu, m = 2
obt inem
p
2
= 0 . . . 00 . . . 10 . . . 11 . . . 1 L
2
ceea ce din nou nu este posibil, ntruc at se contrazice structura cuvintelor lui L
2
.
Prin urmare L
2
nu este de tipul 3.2
Observat ie. Este interesant de observat ca limbajele simple de forma lui L
2
sunt semnicative pentru clasele din clasicarea Chomsky. Astfel
L
1
= a
n
[n 1, L
1
/
3
;
L
2
= a
n
b
n
[n 1, L
2
/
2
, L
2
, /
3
;
L
3
= a
n
b
n
c
n
[n 1, L
3
/
1
(?), L
3
, /
2
;
Ne-am putea astepta ca limbajul L
3
, un exemplu analog lui L
2
, sa e de tip
1, adica L
3
/
1
, L
3
, /
2
.

In adevar, se poate arata ca L
3
, /
2
, dar dupa
cunostint a autorului, aparent a L
3
/
1
este o problema deschisa.
Consecint a 2.4 Fie E un limbaj regulat si AF = (, I, f, s
0
,
f
) automatul nit
care l recunoaste. Atunci E este innit daca si numai daca exista p E astfel
ncat [p[ card().
Daca limbajul este innit, este clar ca exista p E cu [p[ card(). Invers, daca
exista p E cu [p[ card() atunci p = uvw, v ,= si uv
m
w E, m N,
deci limbajul este innit.2
34 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
2.3 Expresii regulate si sisteme tranzit ionale
Expresii regulate Fie V un alfabet. Expresiile regulate sunt cuvinte peste
alfabetul V , , [ (, ) la care se adauga simbolul , Simbolurile [-sau,
-produs, -nchidere, le vom considera operatori. Expresiile regulate se
denesc astfel:
(1) si sunt expresii regulate;
(2) pentru orice a V , cuvantul a este o expresie regulata;
(3) daca R si S sunt expresii regulate, atunci (R[S) (R S) si (R

) sunt
expresii regulate;
(4) orice expresie regulata se obt ine prin aplicarea de un numar nit de ori a
regulilor (1)-(3).
Parantezele sunt utilizate pentru a punen evident a ordinea de aplicare a oper-
atorilor. Pentru simplicarea scrierii vom considera ca operatorul are ponderea
cea mai mare, apoi operatorul si [ ponderea cea mai mica. Astfel parantezele
redundante pot eliminate. De exemplu, prin R[S

vom nt elege (R[(S

)).
Observat ie. Expresiile regulate se pot deni cu ajutorul gramaticii G =
(E, V [, , , (, ), E, P) unde
P = E (E[E) | (E E) | (E

) | a | | .
Unei expresii regulate i putem asocia un anumit limbaj peste V ; vom spune
ca expresia regulata reprezinta (desemneaza, noteaza) acel limbaj. Modul n care
asociem un limbaj unei expresii regulate este
(1) reprezinta limbajul ;
(1/) reprezinta limbajul ;
(2) a reprezint a limbajul a;
(3) daca R si S sunt expresii regulate ce reprezinta limbajele
L
R
respectiv L
S
atunci
(i) R[S reprezint a limbajul L
R
L
S
;
(ii) R S reprezint a limbajul L
R
L
S
;
(iii) R

reprezint a limbajul (L
R
)

.
Fie R, S, P trei expresii regulate si L
R
, L
S
, L
P
limbajele reprezentate. Avem :
L
(R|S)|P
= (L
R
L
S
) L
P
= L
R
(L
S
L
P
) = L
R|(S|P)
,
ntruc at operat ia de reuniune este asociativa. Vom scrie (R[S)[P = R[(S[P).

In
mod analog se pot obt ine si alte proprietat i. De exemplu:
S[R = S[R,
R[R = R,
(R S) P = R (S P),
R (S[P) = (R S)[(R P), etc.
2.3. EXPRESII REGULATE SI SISTEME TRANZIT IONALE 35

In cazul n care nu exista pericol de confuzie, vom nota cu L (fara indice) limbajul
reprezentat de o anumit a expresie regulata.
Exemple.
1. R = a

; L =

j=0
a
j
= , a, a
2
, . . ..
2. R = aa

; L = a , a, a
2
, . . . = a, a
2
, a
3
. . ..
3. R = (a[b)

; L = (L
a
L
b
)

= (a b)

= a, b

;
a, b

= a, b
1
a, b
2
. . . = , a, b, aa, ab, ba, bb, . . ., adica
(a[b)

reprezint a mult imea tuturor cuvintelor peste alfabetul a, b.


4. R = a[ba

; L = a b , a, a
2
, . . . = a, b, ba, ba
2
, . . ..
Limbajele reprezentate de expresii regulate constituie o anumita familie de lim-
baje; o vom nota cu /
lr
. Apare urmatoarea problema: care este pozit ia acestei
familii n ierarhia Chomsky? Vom arata ca /
lr
coincide cu familia limbajelor
regulate.
Sisteme tranzit ionale
Denit ie 2.3 Un sistem tranzit ional este un sistem de forma
ST = (, I, f,
0
,
f
, )
unde:
este o mult ime (nita) de stari;
I este alfabetul de intrare;
f : I T() este funct ia de tranzit ie;

0
este mult imea de stari init iale;

f
este mult imea de stari nale;
este relat ia de tranzit ie .
Exemplu. = s
0
, s
1
, s
2
, I = 0, 1,
0
= s
0
, s
1
,
f
= s
2
iar funct ia si
relat ia de tranzit ie sunt date de:
f s
0
s
1
s
2
0 s
1
s
2
s
0

1 s
0
, s
1
s
0
, s
2

= (s
0
, s
1
), (s
2
, s
1
).
Ca si n cazul unui automat nit putem construi diagrama de stari completata
cu relat ia (arcele punctate).

In cazul exemplului nostru diagrama de stari este
prezenta n gura 2.4
Observat ie: ind o relat ie, are sens

(nchiderea tranzitiva si reexiva).


Fie i I ; vom spune ca sistemul tranzit ional evolueaz a direct din starea
s

n starea s

daca:
(1) i = si (s

, s

. Pe diagrama de stari vom avea o traiectorie punctata


de la starea s

la starea s

;
s

O O . . . O s

.
36 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
s
0
s
2
s
1
0
0
1
1
0,1
1
Figura 2.4: Diagrama de stari a sistemului tranzit ional
(2) i ,= si exista s
1
, s
2
astfel ncat (s

, s
1
)

, s
2
f(s
1
, i) si (s
2
, s

. Pe diagrama de stari, putem ajunge din s

n s

pe o traiectorie punctata,
apoi un pas pe un arc plin si din nou pe o traiectorie punctata.
s

O . . . s
1
i
s
2
O . . . s

.
Vom scrie s

i
s

.
Fie acum p = i
1
. . . i
n
. Vom spune ca sistemul evolueaz a din starea s

n starea
s

daca exista s
0
, s
1
, . . . , s
n
astfel ncat
s

= s
0
i
1
s
1
i
2
. . .
i
n
s
n
= s

.
Vom scrie s

p
s

.
Denit ie 2.4 Limbajul recunoscut de un sistem tranzit ional ST este
L(ST) = p[p I

, s
0

0
, s
0
p
s, s
f
.
Vom nota cu /
ST
familia limbajelor recunoscute de sisteme tranzit ionale. Este ev-
ident ca orice automat nit este un sistem tranzit ional particularn care card(
0
) =
1 iar = (nu exista arce punctate). Prin urmare 1 /
ST
.
Teorema 2.6 1 = /
ST
.
Demonstrat ie. Evident, trebuie sa arat am incluziunea /
ST
1. Fie ST =
(, I, f,
0
,
f
, ) un sistem tranzit ional. Construim automatul nit AF = (T(), I, f

,
0
,

f
)
unde
f

(Z, i) = s[s

Z, s

i
s,

f
= Z[Z
f
,= .
2.4. ANALIZA LEXICAL

A 37
s
0
s
1
a
s
0
s
0
s
1 s
1
Figura 2.5: Sistemele tranzit ionale ce recunosc limbajele , a, .
Fie p = i
1
. . . i
n
L(ST) si e urmatoarea evolut ie a sistemului tranzit ional
s
0
i
1
s
1
i
2
. . .
i
n
s
n

f
.
Putem construi o traiectorie a lui AF de forma

0
i
1
Z
1
i
2
. . .
i
n
Z
n
,
unde Z
1
= f

(
0
, i
1
), Z
k
= f

(Z
k1
, i
k
), k = 2, . . . , n. Sa observam ca s
0

0
si ca daca s
k1
Z
k1
, atunci conform denit iei funct iei f

, avem s
k

f

(Z
k1
, i
k
) = Z
k
. Asftel, s
k
Z
k
, k = 1, . . . , n; pentru k = n avem s
n
Z
n
si
cum s
n

f
rezulta ca Z
n

f
,= , adica Z
n

f
. Deci automatul ajunge
ntr-o stare nala, p L(AF) si L(ST) L(AF).
Incluziunea inversa se arata n mod analog.2
Construct ia sistemelor tranzit ionale pentru expresii regulate. Fiind data
o expresie regulata putem ntotdeauna construi un sistem tranzit ional care re-
cunoaste limbajul reprezentat de expresia respectiva.
Construct ia se face cu ajutorul diagramelor de stari.
Sistemele tranzit ionale (diagramele de stari) corespunzatoare expresiilor reg-
ulate , a si sunt prezentate n gura 2.5.
Daca Rsi S sunt expresii regulate si notam cu ST
R
si ST
S
sistemele tranzit ionale
corespunzatoare, atunci sistemele tranzit ionale pentru R[S, R S si R

sunt re-
date n gura 2.6.

In acest mod putem construi succesiv (recurent) un sistem tranzit ional core-
spunzator unei expresii regulate.
Exemplu. Sistemul tranzit ional corespunzator expresiei R = a[ba

este redat
n gura 2.7.
Consecint a Dandu-se o expresie regulata, putem construi sistemul tranzit i-
onal care recunoaste limbajul reprezentat de expresia respectiva. Cum orice
limbaj recunoscut de un sistem tranzit ional este regulat, rezulta ca limbajele
reprezentate de expresii regulate sunt limbaje regulate.
2.4 Analiza lexicala
Procesul de analiza lexicala este o faza a procesului de compilare n care se deter-
mina unitat ile lexicale (cuvintele, atomii) ale unui program sursa, se furnizeaza
38 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
ST
S
ST
R
ST
R
ST
L
ST
R
Figura 2.6: Sistemele tranzit ionale ce recunosc limbajele R[S, R S si
a
a
b
Figura 2.7: Sistemul tranzit ional corespunzator expresiei regulate
2.4. ANALIZA LEXICAL

A 39
codurile interne ale acestora si se detecteaza eventualele erori lexicale. Analizorul
lexical mai poate efectua o serie de operat ii auxiliare precum: eliminarea blank-
urilor, ignorarea comentariilor, diferite conversiuni ale unor date, completarea
tabelelor compilatorului, gestiunea liniilor textului sursa.
Unitat i lexicale O unitate lexicala (Lexic = vocabular; totalitatea cuvintelor
unei limbi) este o secvent a din textul sursa care are o anumit a unitate logica.
Denit ia riguroasa a unitat ilor lexicale ale unui limbaj particular se da la denirea
limbajului de programare respectiv. De obicei, n majoritatea limbajelor de pro-
gramare, unitat ile lexicale sunt: cuvinte cheie, identicatori, constante, operatori,
delimitatori. Din punctul de vedere al analizei lexicale si al modului de prelucrare,
unitat ile lexicale pot de doua categorii:
Unitat i lexicale simple, sunt unitat i lexicale care nu comporta atribute su-
plimentare, de exemplu, cuvintele cheie, operatorii;
Unitat i lexicale compuse (atributive), sunt unitat i lexicale care comporta
anumite atribute suplimentare, de exemplu, identicatorii si constantele.
Atributele sunt informat ii specice, de exemplu, tipul identicatorului sau
al constantei (ntreg, real, etc.). Este necesara specicarea tipului unui
identicator sau al unei constante din startul programului deoarece struc-
tura programului obiect sau reprezentarea interna a constantelor depinde
de acest tip.
Reprezentarea interna a unitat ilor lexicale se face n funct ie de categoria lor.
Cele simple se reprezint a printr-un cod specic(num ar ntreg). Unitat ile lexicale
compuse se reprezinta prin cod si informat ii (de natura semantic a) asupra sa.
De obicei compilatoarele utilizeaza tabele pentru stocarea atributelor (tabel de
constante, tabel de variabile, tabel de etichete, etc.). In acest caz unitatea lexicala
se reprezinta intern printr-un cod urmat de o referint a ntr-un tabel. Informat ia
cont inut a de tabel ar putea pentru constante: cod, tip, valoare, iar pentru
identicatori: cod, tip, indicator de init ializare.
Este posibil ca o clasa de unitat i lexicale simple sa se reprezinte printr-un
cod unic si un atribut pentru distingerea n cadrul clasei. De exemplu, operatorii
aritmetici cu aceiasi prioritate au o tratare similara din punct de vedere al anal-
izei sintactice. Lista unitat ilor lexicale si denit ia riguroasa a acestora se da la
proiectarea compilatorului.
Un exemplu de unitat i lexicale si coduri asociate ar putea cele din gura
2.8.
Analizorul primeste textul sursa si produce sirul de unitat i lexicale n codi-
carea interna. De exemplu secvent a de text sursa urmatoare:
{if (unu < 2) return 0;
a=33;
}
40 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
Unitate lexicala COD ATRIBUT Exemplu
if if = 1 - if, If, IF
else else = 2 - else ElSe
identicator ID = 3 referint a Nelu v tabel
constant a ntreag a NUM = 4 referint a 4 -3 233
constant a reala FLOAT = 5 referint a 4.32 -3.233
+ op = 6 1
- op = 6 2
op = 6 3
/ op = 6 4
< opr = 7 1
> opr = 7 2
<= opr = 7 3
>= opr = 7 4
( LPAR = 8 -
) RPAR = 9 -
LBRACE = 10 -
RBRACE = 11 -
Figura 2.8: Coduri asociate unitatilor lexicale
2.4. ANALIZA LEXICAL

A 41
va produce sirul de unitat i lexicale
LBRACE If LPAR [ID,22] [opr,1] [NUM, 40], RPAR RETURN [NUM, 42] SEMI
[ID,24] opAssign [NUM,44] SEMI RBRACE.
In lista codurilor interne gasite atributul identicatorului este adresa relativa
din tabela de identicatori, analog atributele constantelor numerice sunt adrese
relative n tabelele de constante.
Majoritatea limbajelor evoluate cont in si secvent e de text care nu sunt unitat i
lexicale, dar au act iuni specice asociate . De exemplu:
comentarii /* text */
directive de preprocesare #include<stdio.h>
#define MAX 5.6

Inaintea analizei lexicale (sau ca subrutina) se preproceseaza textul si abia


apoi se introduce rezultatul n analizorul lexical.
Specicarea unitat ilor lexicale Denirea riguroasa a unitat ilor lexicale se face
de catre proiectantul limbajului. O posibilitate de descriere este limbajul natural.
De exemplu, pentru C si JAVA:
Un identicator este o secvent a de litere si cifre: primul caracter trebuie sa
e litera. Liniut a de subliniere conteaza ca litera. Literele mari si mici sunt
diferite. Daca sirul de intrare a fost mpart it n unitat i lexicale pana la un carac-
ter dat, noua unitate lexicala se considera astfel ncat sa includa cel mai lung sir
de caractere ce poate constitui o unitate lexicala. Spat iile, taburile, newline si co-
mentariile sunt ignorate cu except ia cazului cand servesc la separarea unitat ilor
lexicale. Sunt necesare spat ii albe pentru separarea identicatorilor, cuvintelor
cheie si a constantelor.
Orice limbaj rezonabil poate folosit pentru implementarea unui analizor
lexical.
Unitat ile lexicale se pot specica cu ajutorul limbajelor regulate, deci folosind
gramatici de tipul 3 sau expresii regulate ce noteaza limbajele. Ambele specicat ii
conduc la construirea de automate nite echivalente, care se pot usor programa.

In cele ce urmeaza, vom folosi ambele variante de specicare pentru un set uzual
de unitat i lexicale nt alnit la majoritatea limbajelor evoluate.
Consideram gramatica regulata ce genereaza identicatori, constante ntregi,
cuvinte cheie, operatori relat ionali si aritmetici.
G :
_

_
< ul >< id > [ < num > [ < cc > [ < op > [ < opr >
< id > l < id1 > [l, < id1 > l < id1 > [c < id1 > [l[c
< num > c < num > [c
< cc > if[do[else[for
< op > +[ [ [/
< opr >< [ <= [ > [ >=
,
42 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
unde l-litera, c-cifra.
Pornind de la aceasta gramatica se poate construi una echivalent a n forma
normala, apoi se extrage funct ia de evolut ie a automatului nit determinist
echivalent ce recunoaste unitat ile lexicale.
Descrieri echivalente ale unitat ilor lexicale cu ajutorul expresiilor regulate sunt
cuvinte cheie = if | do | else | for
identificatori = ( a|b|c|...z )( a|b|c|...z|0|1|...|9 )*
Numar = ( 0|1|...|9 )( 0|1|...|9 )*
Operatori aritmetici = + | - | * | /
Operatori relationali = < | <= | > | >=
Limbajul generat de gramatica precedent a se obt ine prin suma expresiilor
regulate. Ment ion am ca exista programe specializate (Lex, Flex, JavaCC) ce
genereaza un analizor lexical (n C sau Java) pornind de la expresiile regulate.
Sintaxa folosita n scrierea expresiilor regulate este dependent a de programul
folosit.
Programarea unui analizor lexical Realizarea efectiva a unui analizor revine
la simularea funct ion arii unui automat nit. O variant a de programare este
atasarea unei secvent e de program la ecare stare a automatului. Daca starea
nu este stare nala atunci secvent a citeste urmatorul caracter din textul sursa si
gaseste urmatorul arc din diagrama de stari. Depinzand de rezultatul caut arii
se transfera controlul altei stari sau se returneaza esec (posibila eroare lexicala).
Daca starea este nala atunci se apeleaza secvent a de returnare a codului unitat ii
lexicale si eventuala instalare a unitat ii lexicale n tabelele compilatorului.
Pentru simplicarea implementarii se cauta urmatoarea unitate lexicala prin
ncercarea succesiva a diagramelor corespunzatoare ecarei unitat i lexicale (ntr-
o ordine prestabilita). Eroarea lexicala se semnaleaza doar atunci cand toate
ncerc arile se ncheie cu esec.
De obicei textul sursa cont ine si secvent e ce se pot descrie cu ajutorul expresi-
ilor regulate, dar care nu sunt unitat i lexicale (de exemplu comentariile). Aceste
secvent e nu vor genera cod lexical, dar au asociate diverse act iuni specice. Pen-
tru a evita aparit ia unor caractere necunoscute in textul sursa se considera si
limbajul ce consta din toate simbolurile ASCII. Astfel, indiferent de unde ncepe
analiza textului, programul de analiza lexicala gaseste o potrivire cu o descriere.
Spunem ca specicat ia este completa.
Exista posibilitatea ca mai multe secvent e cu aceeasi origine sa corespunda la
diferite descrieri ale unitat ilor lexicale. Se considera unitate lexicala cel mai lung
sir ce se potriveste unei descrieri (longest match rule). Daca sunt doua reguli
2.4. ANALIZA LEXICAL

A 43
care se potrivesc la acelasi sir de lungime maxima atunci se considera o prioritate
asupra descrierilor (rule priority).
De exemplu, in textul urmator,
i if if8
unitat ile lexicale delimitate vor iidenticator, ifcuvant cheie, if8identicator.
Regula de prioritate se aplica pentru potrivirea lui if cu identicator si cuvant
cheie, iar criteriul de lungime maxima pentru if8.
Pentru depistarea celei mai lungi potriviri, din punt de vedere al programarii
analizorului, este sucient sa prevedem un pointer suplimentar pe caracterul ce
corespunde ultimei stari nale atinse pe parcursul citirii.
Studiu de caz. Se considera problema realizarii unui analizor lexical ce delim-
iteaza ntr-un text sursa cuvinte din limbajul ce cont ine identicatori, cuvinte
cheie (pentru simplicare folosim doar cuvantul cheie if), constante numerice
(ntregi far a semn). De asemenea se face salt peste spat iile albe si se ignora co-
mentariile. Presupunem ca un comentariu ncepe cu doua caractere slash si se
termina cu newline. Orice caracter ce nu se potriveste descrierii este semnalat ca
si caracter ilegal in text.
Etapa I. Descriem secvent ele cu ajutorul expresiilor regulate
IF = "if"
ID = (a|b|c|...|z)(a|b|c|...|z|0|1|...|9)*
NUM = (0|1|...|9)(0|1|...|9)* = (0|1|...|9)+
WS = (\n|\t|" ")+
COMMENT = "//"(a|b|c|...|z|0|1|...|9|" ")*\n
ALL = a|b|...|z|0|...|9|\t| ... toate caracterele ASCII
Etapa II. Corespunzator expresiilor avem urmatoarele automate nite deter-
ministe echivalente, prezentate n gura 2.9 (starile au fost notate prin numere
ntregi):
Etapa III. Se construieste sistemul tranzit ional (vezi gura 2.10) ce re-
cunoaste limbajul reuniune, adaugand o noua stare init iala (notata cu 1), pe
care o conectam prin arce punctate (ce corespund -tranzit iilor). Construct ia
provine din legarea sistemelor tranzit ionale n paralel. S-au renumerotat starile
sistemului tranzit ional, asignand nume simbolice starilor nale.
Etapa III. Construct ia automatului nit determinist general ce recunoaste
reuniunea limbajelor. Pentru aceasta sistemul tranzit ional se transforma cu teo-
rema de echivalent a n automat nit determinist (practic se trece de la stari ale
sistemului tranzit ional la submult imi de stari, ce devin starile automatului nit).
44 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
4
2 1
2 1
2 1
3 2 1
a- z
0- 9
/
/
\ n
0- 9
0- 9
a - z
\ n\ t \ b
\ n\ t \ b
2 1
ID
NUM
WS
COM
ERR
orice
a- z ,\b
Figura 2.9: Automatele nite corespunzatoare expresiilor regulate

In cazul particular al automatului nostru, diagrama de stari este datan gura


2.11.
Etapa IV. Programarea analizorului lexical.
Automatul nit obt inut are starile nale asociate cu clasele de cuvinte recunos-
cute. Se asociaza act iuni starilor nale, corespunzator denit iilor unitat ilor lexi-
cale (de exemplu pentru constante numerice se genereaza reprezentarea interna, se
memoreaza n tabelul de constante si se returneaza codul unitat ii lexicale NUM).
Pentru programarea analizorului se folosesc trei variabile de tip pointer in textul
sursa: FirstSymbol, CurrentSymbol, LastFinalSymbol, ce ret in indicele carac-
terului de nceput al secvent ei, indicele caracterului ce urmeaza la citire, indicele
ultimului caracter ce corespunde atingerii unei stari nale. Cei trei pointeri au
fost reprezentat i prin semnele grace [, respectiv . De asemenea consideram
o variabil a State, ce ret ine starea curent a a automatului.
In tabelul 2.12 este indicata evolut ia analizorului lexical (inclusiv act iunile
asociate) pentru cazul analizei urmatorului text sursa.
if if8%// ha\n
Pentru simplicarea codicarii, starile automatului nit determinist au fost
redenumite prin numerentregi ncepand cu starea init iala 1, starea 3, 6, 16 = 2,
4, 6 = 3, 6, 16 = 4, s.a.m.d. de la stanga la dreapta si de sus n jos. De obicei
2.4. ANALIZA LEXICAL

A 45
14
3 2
10 9
8 7
6 5
13 12 11
4
i f
a - z
0- 9
/
/
\ n
0- 9
0- 9
a - z
a - z
\ n\ t \b
\ n\ t \ b
,\b
16 15
IF
ID
NUM
WS
COM
ERR
orice
1
Figura 2.10: Sistemul tranzit ional ce recunoaste reuniunea limbajelor
46 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
3,6,16 4,6
12,16
6,16
10,16
8,16
13
1
6
14
16
ID IF
f
i
ID
ID
NUM
WS
ERR
/ \ n
COM
ERR
a- e
g - z
0-9
a- z
0-9 a- z
0-9 a- z
0-9
a-h
j - z
0-9
/
a- z , \b
\ n\ t \b
orice
altceva
0-9
\ n\ t \b
Figura 2.11: Automatul nit determinist ce recunoaste reuniunea limbajelor
2.4. ANALIZA LEXICAL

A 47
Last Current Current Input Accept Action
Final State
0 1 [

i f i f 8 % / / h a n
2 2 [ i

f i f 8 % / / h a n
3 3 [ i f

i f 8 % / / h a n return cc =< if >


0 [ i f


i f 8 % / / h a n resume
0 1 i f[

i f 8 % / / h a n
7 7 i f[

i f 8 % / / h a n
0 i f[

i

f 8 % / / h a n resume
0 1 i f [

i f 8 % / / h a n
2 2 i f [ i

f 8 % / / h a n
3 3 i f [ i f

8 % / / h a n
5 5 i f [ i f 8

% / / h a n return id =< if8 >


0 i f [ i f 8

/ / h a n resume
0 1 i f i f 8[

% / / h a n
11 11 i f i f 8[ %

/ / h a n print (illegal character: %);


0 i f i f 8[ %

/ h a n resume
0 1 i f i f 8 %[

/ / h a n
0 8 i f i f 8 %[

/ h a n
0 9 i f i f 8 %[

/ /

h a n
. . . . . . . . .
Figura 2.12: Evolut ia analizorului lexical pentru textul if if8%// han
48 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
int edges[][] = { /* ... 0 1 2 ... e f g h i j ... */
/* state 0 */ {0,0, ...,0,0,0, ...,0,0,0,0,0,0, ... },
/* state 1 */ {0,0, ...,6,6,6, ...,4,4,4,4,2,4, ... },
/* state 2 */ {0,0, ...,5,5,5, ...,5,3,5,5,5,5, ... },
etc
}
Figura 2.13: Reprezentarea funct iei de evolut ie a automatului nit
funct ia de evolut ie asociata automatului nit determinist se memoreaza sub forma
unui tablou bidimensional de ntregi, ca n gura 2.13. Starea 0 este asociata cu
blocarea automatului. Ajungerea n aceasta stare echivaleaz a cu gasirea ultimei
unitat i lexicale, ntre pointerii [ si . Se executa act iunea asociata starii nale
si se reia cautarea (resume) urmatoarei unitat i lexicale ncep and cu caracterul
imediat urmator pointerului .
Observat ie: Cele mai costisitoare operat iuni (ca timp) din analiza lexicala
sunt ignorarea comentariilor si tratarea erorilor lexicale. Primele generatoare
automate de analizoare lexicale si sintactice au aparut n anii

70 si au fost incluse
n sistemul de operare Unix.
2.5 Probleme propuse
1. Construit i automate nite pentru recunoasterea limbajelor:
(a) L = PSDR, PNL, PUNR;
(b) L = w[ siruri de 0 si 1 terminate cu 1 ;
(c) L = w[w identicator PASCAL ;
(d) L = w[w constanta ntreaga cu semn n PASCAL ;
(e) L = w 0, 1

[w multiplu de 3 ;
(f) L = a
i
b
j
[i, j > 0;
(g) L = .
2. Construit i automate nite echivalente cu gramaticile de tipul trei de la
problema 1 capitolul 1.
2.5. PROBLEME PROPUSE 49
3. Construit i automate nite deterministe echivalente cu cele nedeterministe
obt inute la problema precedenta.
4. Gasit i gramatici regulate echivalente cu automatele de la problema 1.
5. Folosind lema de pompare pentru limbaje regulate dovedit i ca urmatoarele
limbaje nu sunt regulate:
(a) L = 0
i
2
[i 1;
(b) L = 0
2
n
[n 1;
(c) L = 0
n
[n este num ar prim ;
(d) L = 0
m
1
n
0
m+n
[m 1, n 1;
6. Specicat i limbajele denotate de urmatoarele expresii regulate:
(a) (11[0)

(00[1)

;
(b) (1[01[001)

([0[00);
(c) 10[(0[11)0

1;
(d) ((0[1)(0[1))

;
(e) 01

[1;
(f) ((11)

[101)

.
7. Construit i sisteme tranzit ionale ce recunosc limbajele specicate la prob-
lema precedenta. Pentru ecare sistem tranzit ional construit i un automat
nit determinist echivalent.
50 CAPITOLUL 2. LIMBAJE REGULATE SI ANALIZA LEXICAL

A
Capitolul 3
Limbaje Independente de
Context
3.1 Arbori de derivare
Caracterizarea familiei /
2
cu arbori de derivare. Una din caracteristicile
de baza ale limbajelor independente de context este aceea ca o derivare ntr-un
astfel de limbaj poate reprezentat a de un arbore, numit in acest context arbore
de derivare. Aceasta reprezentare este important a n mod special pentru faptul
ca permite o imagine intuitiv a simpla a unei derivari si deci posibilitatea de a
lucra usor cu limbaje de tipul 2.
Vom prezenta n primul rand cateva not iuni elementare de teoria grafurilor,
cu scopul de a preciza notat iile si terminologia.
Un graf orientat ( este o pereche ( = (V, ) unde V este o mult ime nita
iar o aplicat ie : V T(V ). Mult imea V se numeste mult imea varfurilor
(nodurilor) grafului iar daca v
2
(v
1
), perechea (v
1
, v
2
) este un arc n graf; v
1
este originea iar v
2
este extremitatea arcului. Un drum de la vrful v

la varful
v

n graful ( este o mult ime de arce (v


1
, v
2
)(v
2
, v
3
) . . . (v
n1
, v
n
) cu v

= v
1
si
v

= v
n
. Numarul n 1 este lungimea drumului. Un drum pentru care v
1
= v
n
se numeste circuit. Un circuit de lungime 1 poarta numele de bucla.
Denit ie 3.1 Un arbore este un graf fara circuite, cu card(V ) 2 si care sat-
isface urmatoarele doua condit ii :
1. v
0
V astfel ncat v
0
, (v), v V ; v
0
se numeste radacina arbore-
lui;
2. v V v
0
, !w cu v (w); altfel spus orice varf diferit de v
0
este
extremitatea unui singur arc.
Exemplu. V = v
0
, v
1
, v
2
, v
3
, v
4
iar funct ia este data de:
x v
0
v
1
v
2
v
3
v
4
(x) v
1
, v
2
v
3
, v
2

51
52 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
v
0
v
2
v
4
v
3
v
1
Nivel0
Nivel1
Nivel2
Figura 3.1: Reprezentarea graca a arborelui ( = (V, ).
Reprezentarea n plan a acestui arbore este data in gura 3.1
Nodurile v pentru care (v) = se numesc noduri terminale (nale); celelalte
se numesc interne. Mult imea nodurilor terminale constituie frontiera arborelui.

In general vom nota un arbore cu litere mari, specicnd ca indici radacina si fron-
tiera; de exemplu /
v
0
, v
1
v
2
v
3
. Un arbore comporta mai multe ramuri; n exemplu
avem urmatoarele ramuri : v
0
v
1
, v
0
v
2
v
3
, v
0
v
2
v
4
.
Fie G = (V
N
, V
T
, S, P) o gramatica de tipul 2.
Denit ie 3.2 Un arbore de derivare n gramatica G este un arbore cu urmatoarele
doua proprietat i .
(1) Nodurile sunt etichetate cu elementele din V
G
;
(2) Daca un nod v are descendent i direct i v
1
, . . . , v
n
atunci
v v
1
v
2
. . . v
n
P.
Exemplu. G = (A, B, a, b, A, P) unde
P = A aBA[Aa[a, B AbB[ba[abb.
Arborele /
A, aabbaa
reprezentat n gura 3.2 (Varianta 1) este un arbore de
derivare (poate desenat coborand frontiera pe nivelul ultim , Varianta 2):
Teorema 3.1 Fie G o gramatica de tipul 2. Atunci X

p daca si numai daca
exista un arbore /
X, p
.
Demonstrat ie. X

p implica /
X, p
.
Procedam prin induct ie asupra lungimii derivarii l.
Daca l = 1, X p = i
1
. . . i
n
si X i
1
. . . i
n
P. Arborele din gura 3.3
corespunde cerint elor teoremei.
3.1. ARBORI DE DERIVARE 53
A
A
B
a
a
B
b
b
a a
Varianta 2
A
A
A
B
a
a
B b
b
a a
A
Varianta 1
Figura 3.2: Variante de reprezentare a arborelui /
A, aabbaa
.
X
i
n
i
2
i
1
. . .
Figura 3.3: Arbore corespunzator unei derivari directe.
54 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
X
X
m
X
2
X
1
. . .
p
1
p
2
p
m
. . .
Figura 3.4: Construct ia arborelui /
X,p
1
...p
m
.
Presupunem ca proprietatea este adevarata pentru derivari de lungime l si
consideram o derivare de lungime l +1, X

p. Punemn evident a prima derivare
directa
XX
1
. . . X
n

p
Conform lemei de localizare, p = p
1
. . . p
n
si X
j

p
j
, j = 1, m. Putem face
urmatoarea construct ie: conform ipotezei inductive, ecarei derivari X
j

p
j
i
corespunde cate un arbore /
X
j
,p
j
; unim apoi toate nodurile X
j
n nodul X plasat
la nivelul zero. Obt inem astfel un arbore /
X,p
1
...p
m
= /
X,p
(vezi gura 3.4) care
corespunde cerint elor teoremei.
Pentru implicat ia , /
X,p
X

p, se parcurge o cale inversa, facand
o induct ie asupra numarului de nivele. De exemplu, daca acest numar este 2,
arborele de derivare trebuie sa arate can 3.3 si deci avem X i
1
i
2
. . . i
n
= p P
si X

p, etc. 2
3.2 Ambiguitate n familia /
2
.
Fie G o gramatica de tipul 2. O derivare S = u
0
u
1
. . . u
n
n care
la ecare derivare directa se nlocuieste simbolul neterminal cel mai din stanga
(dreapta) se numeste derivare extrem stanga (dreapta). Sa observam ca n par-
ticular ntr-o gramatica de tipul 3 orice derivare este extrem dreapta (scrierea
drept liniara).
Denit ie 3.3 O gramatica G de tipul 2 n care exista un cuvant p L(G) care
se poate obt ine cu doua derivari extrem stangi (drepte) distincte, se numeste
ambigua. In caz contrar este neambigua.
3.2. AMBIGUITATE

IN FAMILIA /
2
. 55
Exemplu. Gramatica A aBA[Aa[a, B AbB[ba[abb este ambigua.

Intr-
adevar, avem
AaBAaBaaAbBaaAbbaaaabbaa;
AAaaBAaaBaaaabbaa.
Denit ie 3.4 Un limbaj este ambigu daca toate gramaticile care l genereaza
sunt ambigue.

In caz contrar (adica daca exista o gramatica neambigua care sa
l genereze) limbajul este neambigu.
Daca G este ambigu a si p L(G) este un cuvant care se poate obt ine cu doua
derivari extrem stangi distincte, atunci exista arborii /
S, p
si /

S, p
, diferit i, dar
care au aceiasi rad acin a si frontier a.
Teorema 3.2 Daca L
1
si L
2
sunt limbaje disjuncte neambigue, atunci L
1
L
2
este neambigu.
Demonstrat ie. Fie G
k
= (V
N
k
, V
T
k
, S
k
, P
k
), k = 1, 2 doua gramatici de tipul 2
neambigue si e G = (V
N
1
V
N
2
, V
T
1
V
T
2
, S, P
1
P
2
S S
1
[S
2
) gramatica
ce genereaza limbajul L(G
1
) L(G
2
).
Sa presupunem ca L(G) este ambigua. Atunci exista p L(G) care se poate
obt ine cu doua derivari extreme stangi diferite. Sa presupunem ca p L(G
1
), p ,
L(G
2
). Atunci obt inem doua derivari distincte n gramatica G
(1) S
G
S
1

G
p, deci S
1

G
1
p;
(2) S
G
S
1

G
p, deci S
1

G
2
p,
deci si doua derivari extrem stangi n gramatica G
1
. Aceasta ar nsemna ca G
1
este ambigua. Contradict ie cu ipoteza!2
Teorema 3.3 Limbajele de tipul 3 sunt neambigue.
Demonstrat ie. Fie L un limbaj de tipul 3 si G gramatica care l genereaza; e apoi
AF automatul nit care recunoaste limbajul L si AFD automatul nit echivalent
determinist. Construim gramatica G

astfel nc at L(G

) = L(AFD). Reamintim
ca regulile lui G

se construiesc astfel f(A, a) = B A aB, f(A, a)


f

A a.
Sa presupunem acum ca L este ambigu; atunci orice gramatica carel genereaza,
inclusiv G

, este ambigua. Aceasta nseamn a ca exista un p L(G

) astfel nc at
Si
1
A
1
i
1
i
2
A
2
. . . i
1
. . . i
n1
A
n1
_
i
1
. . . i
n
A

n

i
1
. . . i
n
A

n

_

p.
Deci exista regulile A
n1
i
n
A

n
si A
n1
i
n
A

n
, adica n automatul AFD
avem
f(A
n1
, i
n
) = A

n
, f(A
n1
, i
n
) = A

n
,
ceea ce contrazice faptul ca AFd este determinist.2
56 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
3.3 Forme normale pentru gramatici de tipul 2
Forma normala Chomsky.
Denit ie 3.5 O gramatica n forma normala Chomsky este o gramatica cu reguli
de forma
A BC,
D i,
unde A, B, C, D V
N
si i V
T
. Se accepta si regula de completare S cu
condit ia ca S sa nu apara n dreapta vreunei reguli.
Lema 3.1 (lema substitut iei). Fie G o gramatica de tipul 2 si X uY v precum
si Y p
1
. . . p
n
toate regulile din G care au Y n stanga . Atunci G este echiva-
lenta cu o gramatica G

n care am facut substitut iile; adica facem urmatoarea


nlocuire
X uY v se nlocuieste cu X up
1
v[ . . . [up
n
v
(Regulile Y p
1
[ . . . [p
n
le vom pastra neschimbate).
Demonstrat ie. Fie p L(G) si S

p. Punem n evident a doi pasi consecutivi
oarecare:
G : S

rst

p.
Daca n rs se utilizeaza regula X uY v atunci n mod necesar n pasul
urmator se utilizeaza una din regulile Y p
1
[ . . . [p
n
, sa presupunem Y p
j
(evident, este posibil ca aceasta regula sa nu se aplice n pasul imediat urmator,
dar ea poate adusa n aceasta pozit ie). Prin urmare
(A) G : r = r

Xr

uY vr

up
j
vr

= t.
Acesti doi pasi se pot obt ine si n G

(ntr-un singur pas):


(B) G

: r = r

Xr

up
j
r

= t.
Deci S

p, p L(G

) si L(G) L(G

).
Invers, daca p L(G

) si S

p, atunci daca la un pas se utilizeaza o regula


nou introdusa (pasul (B)), transformarea respectiva se poate obt ine si n G cu
doi pasi (pasii (A)); deci p L(G) si L(G

) L(G).2
Corolar 3.4 Orice gramatica de tipul 2 este echivalenta cu o gramatica de acelasi
tip n care mult imea de reguli nu cont ine redenumiri. (O redenumire este o regula
de forma A B, A, B V
N
).
3.3. FORME NORMALE PENTRU GRAMATICI DE TIPUL 2 57
Intr-adevar, daca A B P este o redenumire si B p
1
[ . . . [p
n
sunt toate
regulile care au B n stanga, efectuam substitut iile, deci nlocuim regula A B
cu A p
1
[ . . . [p
n
.

In cazul n care printre acestea apare o noua redenumire,
repetam procedeul.2
Exemplu. Gramatica G
E
care genereaza expresii aritmetice E E+T[T, T
T F[F, F (E)[i se poate pune sub urmatoarea forma (far a redenumiri) :
E E + T[T F[(E)[i
T T F[(E)[i
F (E)[i
Teorema 3.5 (teorema lui Chomsky de existent a a formei normale). Orice gra-
matica independenta de context este echivalenta cu o gramatica n forma normala
Chomsky. ema2
Demonstrat ie. Putem porni de la o gramatica Gcare nu are redenumire si ale carei
reguli cu terminale au forma A i, A V
N
, i V
T
. De asemenea presupunem
ca G nu are reguli de stergere.
Rezulta ca regulile lui G au una din formele:
(1) A BC,
(2) D i,
(3) X X
1
. . . X
n
, n > 2.
Construim o gramatica G

= (V

N
, V
T
, S, P

) unde V
N
V

N
si P

cont ine toate


regulile din P de forma (1) si (2). Fiecare regula de forma (3) o nlocuim cu:
X X
1
Z
1
,
Z
1
X
2
Z
2
,
. . .
Z
n2
X
n1
X
n
si includem neterminalele Z
1
, . . . , Z
n2
(altele pentru ecare regula de forma (3)
n V

N
.
Se poate relativ usor arata ca L(G) = L(G

). De exemplu, daca uv (direct)


n G si de aplica o regula de forma (1) sau (2), atunci evident derivarea respectiva
se poate obt ine si n G

; n cazul n care se aplica o regula de forma (3), avem


G : u = u

Xu

X
1
. . . X
n
u

= v.
Aceasta derivare se poate obt ine si n G

n mai mult i pasi si anume


G

: u = u

Xu

X
1
Z
1
u

X
1
X
2
Z
2
u

. . . u

X
1
. . . X
n
u

= v.2
Observat ie. O gramatica ce are reguli de forma A BC, A B, A a
unde A, B, C V
N
si a V
T
spunem ca este n forma 2canonica. Este evident
ca orice gramatica de tip 2 este echivalenta cu o gramatica n forma 2canonica.
Gramatici recursive
58 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
Denit ie 3.6 Un simbol neterminal X al unei gramatici de tipul 2 este recursiv
daca exista o regula de forma X uXv, u, v V

G
.
Daca u = (v = ) simbolul X este stang (drept) recursiv. O gramatica ce are
cel put in un simbol recursiv se numeste recursiva. De exemplu, gramatica G
E
care genereaza expresiile aritmetice are doua simboluri stang recursive, E si T.
Existent a simbolurilor stang recursive poate provoca dicultat i n aplicarea al-
goritmilor de analiza top-down.

Intr-adev ar, ntr-o astfel de gramatica, ncercarea
de a construi arborele de derivare corespunzator unui cuvant p prin aplicarea
ntotdeauna a primei reguli pentru simbolul cel mai din stanga, poate sa conduca
la un ciclu innit (de exemplu n G
E
s-ar obt ine EE + TE +T + T. . .).
Teorema 3.6 Orice limbaj de tipul 2 poate sa e generat de o gramatica fara
recursie stanga.
Demonstrat ie. Fie G = (V
N
, V
T
, S, P) o gramatica de tipul 2; presupunem ca G
are un singur simbol recursiv X si e
(A) X u
1
[u
2
[ . . . [u
n
[Xv
1
[ . . . [Xv
m
toate regulile care au X n stanga. Construim gramatica G

= (V

N
, V
T
, S, P

),
unde V
N
V

N
, P P

cu except ia regulilor (A); acestea se nlocuiesc cu


X u
1
[u
2
[ . . . [u
n
[u
1
Y [u
2
Y [ . . . [u
n
Y,
Y v
1
[ . . . [v
m
[v
1
Y [ . . . [v
m
Y
G

este de tipul 2 si nu are simboluri stang recursive; se vede ns a ca Y este un


simbol drept recursiv.
Fie p L(G), S

G
p. Daca n aceasta derivare nu intervine simbolul re-
cursiv, atunci evident ca S

p. Sa presupunem ca X intervine la un anumit


pas: Sup, unde u = u

Xu

. Putem aplica, ncep and de la u spre dreapta, n


primul rand regulile pentru X si sa urmarim numai subarborele respectiv, deci
G : X
G
Xv
j
1

G
Xv
j
2
v
j
1

G
. . .
G
Xv
j
s
. . . v
j
1

G
u
j
v
j
s
. . . v
j
1
.
Aceeasi forma propozit ional a o putem obt ine si n gramatica G

astfel
G

: X
G

u
j
Y
G

u
j
v
j
s
Y
G

. . .
G

u
j
v
j
s
. . . v
j
1
.
Prin urmare avem S
G

u
G

p, adica p L(G

) si L(G) L(G

). Analog,
L(G

) L(G).2
Forma normala Greibach.
3.3. FORME NORMALE PENTRU GRAMATICI DE TIPUL 2 59
Denit ie 3.7 O gramatica n forma normala Greibach este o gramatica cu reguli
de forma
A ip, unde A V
N
, i V
T
p V

N
.
Se accepta si regula de completare S cu condit ia ca S sa nu apara n dreapta
vreunei reguli.
Teorema 3.7 (Teorema de existent a a formei normale Greibach). Orice gra-
matica de tipul 2 este echivalenta cu o gramatica n forma normala Greibach.
Demonstrat ie. Fie G o gramatica de tipul 2 n forma normala Chomsky si e
V
N
= S = X
1
, X
2
, . . . , X
n
. Vom construi o gramatica echivalent a care sa
satisfaca cerint ele din forma normala Greibach n mai multe etape.
Etapa I. Vom modica regulile de generare astfel nc at toate regulile care nu sunt
de forma X i sa satisfaca condit ia X
j
X
k
p, j < k, p V

N
. Acest lucru l
facem cu un algoritm pe care l prezent amntr-un limbaj nestandard de publicare
(tip PASCAL):
j := 1;
e1: begin
Se elimina recursiile stangi; neterminalele
noi le notam cu Y
1
, Y
2
, . . .
end
if j = n then STOP;
j := j + 1;
l := 1;
e2: begin
Fie X
j
X
l
p, p V

N
si X
l
p
1
. . . p
m
toate regulile care au X
l
n stanga; se efectueaza toate substitut iile.
end
l := l + 1;
if l < j 1 then goto e2
goto e1
Sa observam ca pentru j = 1 si dupa eliminarea recursiilor stangi condit ia
ceruta este evident ndeplinit a; n plus, daca au fost recursii, vom avea reguli cu
partea stang a neterminale noi Y
1
, Y
2
, . . .. Mai departe, luam toate regulile care au
n stanga X
2
(j := j +1 = 2) si efectuam substitut iile; acestea se vor transforma
n X
2
X
k
p cu k 2 si dupa o noua eliminare a recursiilor stangi vom avea
k > 2 plus reguli cu partea stanga neterminale noi.

In felul acesta toate regulile
care au n stanga X
1
si X
2
satisfac condit ia ceruta; n continuare j := j + 1 = 3,
etc.
Etapa II. Avem acum trei categorii de reguli:
60 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
(1) X
j
i;
(2) X
j
X
k
p, j < k, p V

N
;
(3) Y iq, q V

N
, i = 1, . . . , m.
Aranjam toate neterminalelentr-un sir unic, lanceput Y
1
, . . . , Y
m
apoi X
1
, . . . , X
n
si le redenumim, de exemplu cu X
1
, . . . , X
m+n
:
Y
1
, Y
2
, . . ., Y
m
, X
1
, X
2
, . . ., X
n
X
1
, X
2
, . . ., X
m
, X
m+1
, X
m+2
, . . ., X
m+n
Vom nota n + m = N.

In felul acesta regulile gramaticii vor avea numai
formele (1) si (2).
Etapa III. Toate regulile care au X
N
n stanga vor avea forma (1). Fie X
n1

X
N
p
1
[ . . . [X
N
p
n
toate regulile care au X
N1
n stanga si care nu sunt de forma
(1). Efecuam substitut iile lui X
N
; n acest fel regulile care au X
N
si X
N1
n
stanga satisfac cerint ele din forma normala Greibach.

In continuare, consideram
toate regulile care au X
N2
n stanga si efectuam substitut iile, etc.2
Forma normala operator
Una din formele importante pentru gramatici independente de context, uti-
lizata n analiza sintactica prin metoda precedent ei, este forma operator a acestor
gramatici.
Denit ie 3.8 O gramatica independenta de context G = (V
N
, V
T
, S, P) se spune
ca este n forma normala operator daca oricare ar product ia A P, n
nu apar doua neterminale (variabile) consecutive, adica
P V
N
[(V
N
V
T
)

(V
N
V
T
)

V
2
(V
N
V
T
)

].
Teorema 3.8 Orice gramatica independenta de context este echivalenta cu o gra-
matica n forma normala operator.
Demonstrat ie. Fie G = (V
N
, V
T
, S, P) o gramatica de tipul 2 si L(G) limbajul
generat. Fara a restrange generalitatea presupunem ca , L(G) si G este
n forma 2canonica (regulile sunt de forma A BC, A B, A a vezi
teorema ??). Denim o gramatica echivalent a G

= (V

N
, V
T
, S, P

) astfel: V

N
=
S (V
N
V
T
), iar P

= P
1
P
2
P
3
P
4
unde
i) P
1
= S (S, a)a[ a V
T
;
ii) P
2
= (A, a) [ A V
N
, a V
T
, A a P;
iii) P
3
= (A, a) (B, a)[ A, B V
N
, a V
T
, A B P;
iv) P
4
= (A, a) (B, b)b(C, a)[ A, B, C V
N
, a, b V
T
, A BC P.
Sa observam ca G

este n forma normala operator. Pentru a demonstra ca


L(G) = L(G

) vom deni mai nt ai o funct ie : P


2
P
3
P
4
P astfel:
((A, a) ) = A a pentru (A, a) P
2
;
((A, a) (B, a)) = A B pentru (A, a) (B, a) P
3
;
((A, a) (B, b)b(C, a)) = A BC pentru (A, a) (B, b)b(C, a) P
4
.
3.3. FORME NORMALE PENTRU GRAMATICI DE TIPUL 2 61
Funct ia se extinde n mod natural la

: (P
2
P
3
P
4
)

. Vom arata ca
n gramatica G, w V

T
, a V
T
are loc derivarea extrem dreapta A

G
wa
folosind product iile
1
,
2
, . . . ,
n
daca si numai daca exista n P

product iile

1
,

2
, . . . ,

n
astfel ca (

i
) =
i
, 1 i n si n G

are loc derivarea extrem


dreapta (A, a)

w folosind product iile

1
,

2
, . . . ,

n
.
Sa demonstram armat ia prin induct ie dupa n, lungimea derivarii.
Daca n = 1 atunci w = , A a P si n P

exista product ia (A, a) ,


deci (A, a) si ((A, a) ) = A a.
Invers, daca (A, a)w n G

atunci w = (dupa forma product iilor din G

)
si are loc proprietatea enunt ata.
Sa presupunem armat ia adevarat a pentru derivari de lungime cel mult n1
si sa o demonstram pentru derivari de lungime n > 1. Fie asadar A

G
wa
o derivare de lungime n n gramatica G si punem n evident a prima derivare
directa. Distingem doua cazuri:
I. Prima product ie utilizata n derivare este A B. Atunci,
A
G
B

G
wa
si conform ipotezei inductive avemn G

o derivare (B, a)

w (de lungine n1)


cu product ii satisfac and condit iile aratate. Dar cum A B P, n P

avem
product ia (A, a) (B, a) deci (A, a)

w n gramatica G

.
II. Prima product ie este de forma A BC. Atunci
A
G
BC

G
wa.

In acest caz wa = ubva (conform lemei de localizare), astfel ca B


G
ub si
C

G
va. Dupa ipoteza inductiva, vom avea n G

derivarile:
(B, b)

u, (C, a)

v.
Cum A BC P vom avea n P

product ia (A, a) (B, b)b(C, a) si n G

putem scrie derivarea extrem dreapta


(A, a)(B, b)b(C, a)

(B, b)bv

ubv = w
si product iile care s-au aplicat ndeplinesc condit iile din enunt .

In mod analog se demonstreaza reciproca.


62 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
Din aceasta armat ie, luand n particular A = S, obt inem:
S

G
wa (S, a)

w, w V

T
, a V
T
.
Cum n G

exista si product ia S (S, a)a, am gasit: wa L(G) daca si numai


wa L(G

), deci cele doua gramatici sunt echivalente.


Pentru a ncheia demonstrat ia trebuie sa consideram si cazul L(G).
Aplicam construct ia de mai sus unei gramatici ce genereaza L(G) si obt inem
G

= (V

N
, V
T
, S, P

) gramatica operator corespunzatoare. Consideram acum gra-


matica G
1
= (V
N
1
, V
T
, S
1
, P
1
) unde V
1
= V

S
1
, P
1
= P

S
1
, S
1
S
care este n forma normala operator si L(G
1
) = L(G).2
3.4 Lema BarHillel
Ca si n cazul limbajelor regulate, lema BarHillel pune n evident a urmatoarea
proprietate a unui limbaj independent de context: orice cuvant al unui astfel de
limbaj, sucient de lung, cont ine un subcuvant (nevid) pe care multiplicandu
l de un numar arbitrar de ori, obt inem noi cuvinte care apart in de asemenea
limbajului. Mai poarta denumirea de lema de pompare sau lema uvwxy.
Ne vom referi n cele ce urmeaza la gramatici de tipul 2 n forma normala
Chomsky.

Intr-o gramatica de aceasta forma arborii de derivare sunt ntotdeauna
arbori binari.
Lema 3.2 Fie G o gramatica n forma normala Chomsky si X

p, p V

G
. Daca
cea mai lunga ramura din arborele /
X,p
cont ine m noduri, atunci [p[ 2
m1
.
Demonstrat ie. Procedam prin induct ie asupra lui m.
Pentru m = 2 arborele are doua nivele si n mod evident [p[ 2 = 2
m1
.
Presupunem ca proprietatea este adevarat a pentru un m oarecare si con-
sideram un arbore care are pe cea mai lunga ramur a m + 1 noduri.

In derivarea
X

p punem n evident a prima derivare directa
XY Z

p.
Conform lemei de localizare, p = p
1
p
2
si Y

p
1
, Z

p
2
. Arborii de derivare /
Y,p
1
si /
Z,p
2
cont in, ecare pe cea mai lunga ramur a cel mult m noduri; conform
ipotezei de induct ie, avem [p
1
[ 2
m1
, [p
2
[ 2
m1
. Prin urmare
[p[ = [p
1
p
2
[ = [p
1
[ +[p
2
[ 2
m1
+ 2
m1
= 2
m
.2
Observat ie. Daca X

p si [p[ > 2
m1
atunci exista n arborele /
X,p
cel put in
o ramur a cu m + 1 noduri.
3.4. LEMA BARHILLEL 63
S
v
1
=A
v
2
=A
u v w x y
p
Figura 3.5: Descompunerea cuvantului p.
Lema 3.3 Fie G o gramatica de tipul 2 si e XX
1
. . . X
m

p. Atunci, conform
lemei de localizare, p = p
1
. . . p
m
si X
j

p
j
, j = 1, . . . , m. Fie /
Y,q
/
X,p
.
atunci q este subcuvant ntrunul din cuvintele p
j
.
Demonstrat ie. Neterminalul Y apart ine unuia din subarborii /
X
j
,p
j
, e acesta
/
X
k
,p
k
; atunci /
Y,q
/
X
k
,p
k
si q Sub(p
k
). 2
Lema 3.4 (Lema BarHillel) Fie E un limbaj independent de context. Atunci
exista un numar natural k astfel ncat, daca p E si [p[ > k atunci p se poate
descompune n forma p = uvwxy cu urmatoarele proprietat i:
1. vx ,= ;
2. [vwx[ k;
3. uv
j
wx
j
y E, j N,
Demonstrat ie. Fie n = card(V
N
). Luam k = 2
n
. Cum [p[ > k = 2
n
, conform
observat iei de la prima lema, exista n arborele /
S,p
cel put in o ramura cu n + 2
noduri; pe aceasta ramur a ultimul nod este terminal, deci exista n + 1 noduri
etichetate cu acelasi simbol A. Descompunem cuvantul p ca n gura 3.5, p =
uvwxy.
(1) Consideram subarborele /
A,vwx
caruia i corespunde derivarea A

vwx.
Punem n evident a primul pas
ABC

vwx,
si vwx se descompune n vwx = p
B
p
C
, B

p
B
, C

p
C
si p
B
, p
C
,= . Cum /
A,w

/
A,vwx
, rezulta ca w este subcuvant n p
B
sau n p
C
. Sa presupunem ca w
Sub(p
C
); atunci p
B
Sub(v) si cum p
B
,= rezulta v ,= .
64 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
(2)Putem alege nodurile v
1
si v
2
astfel ncat pe ramura punctata ncepand de
la v
1
n jos pan a la frontier a sa avem exact n + 1 noduri. Rezulta conform lemei
precedente, [vwx[ 2
n
= k.
(3) putem scrie derivarile A

w, A

vAx. Deci
S

uAy

uvAxy

uv
2
Ax
2
y

. . .

uv
j
wx
j
y.2
Problema nchiderii familiei /
2
la intersect ie
Teorema 3.9 Familia /
2
nu este nchisa la intersect ie.
Demonstrat ie. Consideram limbajul L
3
= a
n
b
n
c
n
[n 1. Sa ratam ca L
3
, /
2
.

Intradevar, sa presupunem ca L
3
/
2
si e k constanta din lema BarHillel.
Luam n > k/3 si e p = a
n
b
n
c
n
; avem [p[ > k, deci conform acestei leme p se
descompune n forma p = uvwxy cu vx ,= si uv
j
wx
j
y L
3
, j N.
Vom analiza posibilitat ile de constituire a subcuvintelor v si x. Sa presupunem
ca n v (sau x) intr a doua din simbolurile a, b, c; de exemplu v = aabbb. atunci
consideram cuvantul p
2
= uv
2
wx
2
y = uaabbaabbwx
2
y care nu are structura cu-
vintelor lui L
3
(a nu poate sa urmeze dupa b) dar conform lemei Bar-Hillel
apart ine lui L
3
. Deci, n v (sau x) nu pot intra doua (sau trei) din simbolurile
a, b, c. Sa presupunem ca intra un singur simbol; de exemplu v a

si x b

.
Atunci multiplicand n p subcuvintele v si x, puterile simbolurilor a si b se
maresc iar c ramane pe loc, contrazicanduse din nou structura cuvintelor din
L
3
.

In concluzie L
3
nu este independent de context.
Fie acum limbajele
L

3
= a
m
b
n
c
n
[m, n 1
L

3
= a
n
b
n
c
m
[m, n 1.
Se poate vedea usor ca aceste limbaje sunt de tipul 2; gramaticile care le genereaza
sunt S aS[aA, A bAc[bc si respectiv S Sc[Ac, A aAb[ab.
Avem L

3
L

3
= L
3
, deci intersect ia a doua limbaje de tipul 2 este un limbaj
care nu apart ine lui /
2
.2
Corolar 3.10 Familia /
2
nu este nchisa la complementariere.

Intradevar, sa presupunem ca /
2
este nchis a la complementariere si e E
1
, E
2

/
2
. Cum familia /
2
este nchis a la reuniune, ar rezulta C(E
1
) C(E
2
) /
2
. Dar
(de Morgan) C(E
1
) C(E
2
) = C(E
1
C(E
2
) /
2
.
Complementul limbajului C(E
1
E
2
) este E
1
E
2
si conform presupunerii ar
trebui ca E
1
E
2
/
2
, oricare ar E
1
, E
2
, ceea ce nu este adevarat.2
Generalizari ale lemei BarHillel Lema lui BarHillel reprezint a o condit ie
necesara ca un limbaj sa e independent de context. cu ajutorul ei se poate
demonstra relativ usor ca anumite limbaje nu sunt independente de context.
Ideea este aceea ca prin multiplicarea subcuvintelor v si x, de un num ar sucient
de ori, se contrazice structura limbajului.
3.5. AUTOMATE PUSH-DOWN (APD) 65
Totusi, nu orice limbaj care nu este de tipul 2 poate respins de lema lui
BarHillel. De exemplu, aceasta lema nu poate respinge limbajul
L = a
n
b
2
m
[n, m 1 b

,
care nu este de tipul 2 (se demonstreaza pe alta cale).

Intradev ar, pentru orice
p = a
n
b
2
m
luam
u = , v = a, w = , x = , y = a
n1
b
2
m
.
Putem itera subcuvintele v si x far a sa contrazicem structura cuvintelor limba-
jului.
O generalizare a lemei BarHillel este
Lema 3.5 (Lema lui Ogden) pentru orice limbaj independent de context L exista
o constanta k astfel ncat orice p L pentru care cel put in k simboluri sunt
marcate, se poate descompune n forma p = uvwxy astfel ncat
1. sau u, v, w sau w, x, y cont in ecare cate un simbol marcat;
2. vwx cont ine cel mult k simboluri marcate;
3. uv
j
wx
j
y L, j N
Cu ajutorul acestei leme se poate arata ca limbajul de mai sus nu este de tipul
2, considerand marcate simbolurile b.
3.5 Automate push-down (APD)
Automatele push-down sunt mecanisme pentru recunoasterea limbajelor indepen-
dente de context.
Un APD se compune din (vezi gura 3.6):
1. O banda de intrare care cont ine simboluri ale unui alfabet de intrare; aceste
simboluri constituie pe o banda un anumit cuvant peste alfabetul de intrare.
Banda se misca numai spre stanga;
2. O memorie push-down (memorie invers a, stiva, pila, etc) care cont ine sim-
boluri ale unui alfabet propriu, numit alfabetul memoriei push-down. Aceasta
memorie funct ioneaz a ca o stiva - ultimul introdus, primul extras (Last In,
First Out);
3. Un dispozitiv de comanda care se aa permanent ntr-o anumit a stare in-
terna apart in and unei mult imi nite de stari. Dispozitivul de comanda
poseda un dispozitiv de citire de pe banda de intrare si un dispozitiv de
scriere-citire n memoria push-down.
66 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
i
1
i
2
i
3
...
i
k
...
i
n-1
i
n
...
Dispozitiv decitire
depebanda
Dispozitiv
decomanda
s S
Bandadeintrare
z
0
z
1
z
m
Dispozitiv decitire/ scriere
Memoria pushdown
Figura 3.6: Reprezentare schematic a a unui automat push-down.
Ca si un automat nit, un automat push-down funct ioneaz a n pasi discret i;
un pas de funct ionare comporta:
1. Dispozitivul de comada citeste simbolul de pe banda de intrare din dreptul
dispozitivului de citire si mut a banda cu o pozit ie spre stanga.
2.

In funct ie de starea interna, de simbolul citit si de simbolul din varful
memoriei push-down dispozitivul de comanda efectueaza operat iile:
(a) Trece ntr-o noua stare;
(b) Scrie n memoria push-down un anumit cuvant peste alfabetul memoriei
push-down; n particular, acesta poate sa e cuvantul vid, ceea ce are ca
efect stergerea simbolului din varful memoriei push-down.
Funct ionarea unui APD se termina n general dupa ce s-a citit ultimul simbol al
cuvantului scris pe banda de intrare dar este posibil ca el sa efectueze un anumit
numar de pasi, citind de ecare data de pe banda cuvantul vid . De asemenea,
este posibil ca n timpul funct ion arii, deci nainte de a ajunge la ultimul simbol,
automatul sa se blocheze. De exemplu, automatul ajunge ntr-o congurat ie
(stare, simbol pe banda, simbol n varful memoriei push-down) inadmisibila sau
se goleste memoria push-down dar nu s-a epuizat cuvantul de pe banda, etc.
Matematic, un APD se deneste astfel:
Denit ie 3.9 Un automat push-down este un sistem
APD = (, I, Z, f, s
0
, z
0
)
unde:
3.5. AUTOMATE PUSH-DOWN (APD) 67
este mult imea de stari (nita si nevida);
I este alfabetul de intare;
Z este alfabetul memoriei push-down;
f : (I ) Z T( Z

) este funct ia de evolut ie;


s
0
este starea init iala;
z
0
Z este simbolul init ial al memoriei push-down.
Un APD aren general o funct ioanre nedeterminista, card f(s, i, z) 1; mult imea
automatelor push-down deterministe formeaza o clasa speciala.

In termenii funct iei de evolut ie, un pas de evolut ie comporta citirea simbolului
i de pe banda, citirea simbolului z din varful memoriei push-down, apoi, n funct ie
de starea interna s si de aceste doua simboluri, automatul trece ntr-o noua stare
s

si scrie n memoria push-down un cuvant q Z

astfel ncat (s

, q) f(s, i, z).

In cazul n care f(s, i, z) = evolut ia este oprita; este situat ia n care automatul
se blochez a.
O stare a automatului (sau congurat ie) este un sistem = (s, p, q) unde
s S este starea intern a, p I

este subcuvantul de pe banda de intrare ramas


de citit (inclusiv simbolul din dreptul dispozitivului de citire), iar q Z

este
subcuvantul din memoria push-down.
Vom spune ca un APD trece direct din starea
1
= (s
1
, p
1
, q
1
) n starea
2
=
(s
2
, p
2
, q
2
) si vom scrie
1

2
daca se executa un pas de evolut ie; daca p
1
=
ip

1
, q
1
= zq

1
putem avea (s
2
, q) f(s
1
, i, z) si atunci p
2
= p

1
, q
2
= qq

1
sau
(s
2
, q) f(s
1
, , z) si atunci p
2
= p
1
, q
2
= qq

1
.
Vom spune ca automatul evolueaza (far a specicat ia direct) din starea

n
stare

si vom scrie

daca:
(1)

;
(2)
1
, . . . ,
n
astfel ncat

=
1

2
. . .
n1

n
=

.
Limbajul recunoscut de un APD se poate deni n doua moduri:
(1) Limbajul recunoscut de un APD cu golirea memoriei push-down, este,
prin denit ie
L(APD) = p[p I

(s
0
, p, z
0
)

(s, , ).
Aceata nseamn a ca, pornind din starea interna s
0
si avand n varful memo-
riei push-down simbolul z
0
, cu ajutorul cuvantului p de pe banda de intrare,
automatul poate sa evolueze astfel ncat sa goleasca memoria push-down dupa
citirea cuvantului. Ment ion am ca golirea memoriei push-down nu trebuie nea-
parat sa coincida cu citirea ultimului simbol al lui p; este posibil ca automatul
sa mai efectueze cat iva pasi citind de pe banda simbolul .
(2) Limbajul recunoscut de un APD cu stari nale; n denit ia automatului se
adauga o submult ime
f
a lui numita mult imea de stari nale. Prin denit ie,
limbajul recunoscut de un APD cu stari nale este:
L(APD) = p[p I

(s
0
, p, z
0
)

(s, , q), s
f
, q Z

.
68 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
Prin urmare, este necesar ca dupa citirea lui p, eventual dupa nca cat iva pasi,
APD sa ajunga ntr-o stare nala. Vom vedea ca cele doua denit ii sunt echiva-
lente.
Limbaje recunoscute de automate push-down cu golirea memoriei. Vom
arata ca familia limbajelor recunoscute de APD cu stari nale coincide cu familia
limbajelor independente de context.

In felul acesta, APD constituie mecanisme
analitice de denire a limbajelor de tipul 2.
Teorema 3.11 Un limbaj este independent de context daca si numai daca este
recunoscut de un automat pushdown cu golirea memoriei pushdown.
Demonstrat ie. Partea I E /
2
E = L(APD).
Fie G = (V
N
, V
T
, S, P) o gramatica de tipul 2 n forma normala Greibach care
genereaza limbajul E. Construim un automat pushdown astfel:
APD = (s, V
T
, V
N
, f, s, S), funct ia de evolut ie ind denita de:
A ip P (s, p) f(s, i, A),
altfel .
Fie p L(G), p = i
1
. . . i
n
, S

G
p. Aceasta derivare trebuie sa aiba forma
(extrem stanga):
(A) Si
1
X
1
u
1
i
1
i
2
X
2
u
2
u
1
i
1
i
2
i
3
X
3
u
3
u
2
u
1
. . . i
1
. . . i
n
,
unde u
1
, u
2
, u
3
, . . . V

N
= Z

.
Observat ie. Aparent, partea u
s
u
s1
. . . u
1
se mareste cu ecare derivare di-
recta.

In realitate, unele din cuvintele u
j
sunt vide, si anume atunci cand se
aplica o regula de forma X i; n particular, n ultimele derivari directe se
aplica numai reguli de aceasta forma.
Avem
S i
1
X
1
u
1
(s, X
1
u
1
) f(s, i
1
, S),
X
1
i
2
X
2
u
2
(s, X
2
u
2
) f(s, i
2
, X
1
),
X
2
i
3
X
3
u
3
(s, X
3
u
3
) f(s, i
3
, X
2
),
. . . .
Prin urmare automatul poate sa aiba urmatoarea evolut ie:
(s, i
1
i
2
i
3
i
4
. . . i
n
, S)(s, i
2
i
3
i
4
. . . i
n
, X
1
u
1
)
(s, i
3
i
4
. . . i
n
, X
2
u
2
u
1
)(s, i
4
. . . i
n
, X
3
u
3
u
2
u
1
). . . .
Daca comparam aceasta evolut ie cu derivarea (A) putem observa ca pe banda
de intrare avem la ecare pas partea complementar a a cuvantului (fat a de derivare)
iarn memoria push-down se reproduce partea de neterminale din formele propozit ionale
3.5. AUTOMATE PUSH-DOWN (APD) 69
ale derivarii. Cum n derivare se ajunge la i
1
. . . i
n
, n evolut ie se va ajunge la
(s, , ).
Deci p L(APD) si L(G) L(APD).
Fie acum p L(APD); va trebui sa arat am ca p L(G), deci ca S

G
p.
Vom arata o implicat ie ceva mai generala, si anume, pentru orice u V

N
, avem
(s, p, u)

(s, , ) u

G
p.

In particular, daca u = S obt inem implicat ia dorita.


Procedam prin induct ie asupra lungimii lui p.
Daca [p[ = 1, atunci p = i, u = X iar evolut ia va avea un singur pas
(s, i, X)(s, , ), deci (s, ) f(s, i, X) si X i P. Putem scrie u =
X
G
i = p.
Presupunem ca implicat ia este adevarata pentru un cuvant [p[ = l si con-
sideram un p astfel ncat [p[ = l + 1. Fie i si X primele simboluri din p si u,
deci p = ip

si u = Xu

.

In evolut ia (s, p, u)

(s, , ) punem n evident a prima
evolut ie directa
(s, p, u) = (s, ip

, Xu

)(s, p

, vu

)

(s, , ).
Din denit ia evolut iei directe rezulta ca (s, v) f(s, i, X) deci X iv P. Pe
de alta parte din ipoteza inductiva rezulta ca vu

G
p

. Avem
u = Xu


G
ivu

G
ip

= p,
ceea ce demonstreaza implicat ia.
Prin urmare p L(G) si L(APD) L(G), de unde L(G) = L(APD).2
Partea II. E = L(APD) E /
2
Fie APD = (, I, Z, f, s
0
, z
0
). Construim G de forma G = (V
N
, V
T
, S, P)
unde V
N
= s
0
(s, z, s

)[s, s

, z Z, V
T
= I, S = s
0
, iar regulile de
generare le denim astfel:
(1) s
0
(s
0
, z
0
, s), s ;
(2) Daca (s
1
, z
1
. . . z
m
) f(s, i, z) vom introduce n P reguli de forma
(s, z, s

) i(s
1
, z
1
, s
2
)(s
2
, z
2
, s
3
) . . . (s
m
, z
m
, s

),
unde s

, s
2
, . . . , s
m
;
(3) Daca (s

, ) f(s, i, z) vom introduce n P reguli de forma


(s, z, s

) i,
70 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
unde s

.
Sa observam ca gramatica astfel construita este independenta de context, si
anume n forma normala Greibach.
Fie p L(APD), deci (s
0
, p, z
0
)

(s

, , ); trebuie sa aratam ca s
0

G
p.
Vom arata implicat ia ceva mai generala
(s, p, z)

(s

, , ) (s, z, s

G
p.

In particular pentru s = s
0
, z = z
0
rezulta (s
0
, z
0
, s

G
p si putem scrie s
0
(s
0
, z
0
, s

G
p,
adica p L(G).
Procedam prin induct ie asupra lungimii evolut iei l.
Daca l = 1 atunci (s, p, z)(s

, , ), deci p = i si (s

, ) f(s, i, z) si
(s, z, s

) i este o regula, adica putem scrie (s, z, s

)i = p.
Presupunem ca implicat ia este adevarata pentru evolut ii de lungime oarecare
l si consideram o evolut ie de lungime l + 1; punem n evident a prima evolut ie
directa
(s, p, z) = (s, i
1
p

, z)(s
1
, p

, z
1
. . . z
m
)

(s

, , ).
Descompunem cuvantul p

n forma p

= p
1
. . . p
m
astfel nc at
(s
1
, p
1
, z
1
)

(s
2
, , ),
(s
2
, p
2
, z
2
)

(s
3
, , ),
. . .
(s
m
, p
m
, z
m
)

(s

, , ).
Observat ie. Putem punen evident a felul n care se deneste cuvantul p
1
urmarind
evolut ia lui APD;
(s
1
, i
1
i
2
. . . i
n
, z
1
z
2
. . . z
m
) (s

1
, i
2
i
3
. . . i
n
, qz
2
. . . z
m
)
(a) (b)
. . . (s
2
, i
j
1
. . . i
n
, z
2
. . . z
m
)
(c)
La primul pas (situat ia a) automatul este n starea s
1
, pe banda este i
1
iar n
memoria push-down este z
1
. Dupa efectuarea unui pas, automatul trece n starea
s

1
, mut a banda cu o pozit ie spre stanga, extrage pe z
1
si scrie n memoria push-
down un cuvant q (situat ia b). Se poate observa ca z
2
a coborat; cum stim ca
memoria push-down se goleste (p L(APD)), trebuie ca la un moment dat z
2
sa
ajunga n varful stivei (situat ia c).

In acest moment partea din p citita va p
1
iar starea n care a ajuns automatul o notam cu s
2
. Este clar ca daca pe banda
am avea scris numai p
1
am avea evolut ia (s
1
, p
1
, z
1
)(s
2
, , ).
3.5. AUTOMATE PUSH-DOWN (APD) 71
Analog p
2
, . . . , p
m
.
Din denit ia derivarii directe (s, i
1
p

, z)(s
1
, p

, z
1
. . . z
m
) avem
(s
1
, z
1
. . . z
m
) f(s, i
1
, z) iar n P va exista regula
(s, z, s

) i
1
(s
1
, z
1
, s
2
)(s
2
, z
2
, s
3
) . . . (s
m
, z
m
, s

)
unde luam starile s
2
, . . . , s
m
cele rezultate la descompunerea lui p

. Pe de alta
parte, din ipoteza inductiva, avem
(s
1
, z
1
, s
2
)

p
1
,
(s
2
, z
2
, s
3
)

p
2
,
. . .
(s
m
, z
m
, s

)

p
m
.
Putem scrie derivarea
(s, z, s

)i
1
(s
1
, z
1
, s
2
)(s
2
, z
2
, s
3
) . . . (s
m
, z
m
, s

)

i
1
p
1
. . . p
m
= i
1
p

= p.
Dupa cum am vazut, rezulta mai departe p L(G) si L(APD) L(G).
Pentru a demonstra incluziunea inversa, vom arata mai nt ai implicat ia
(s, z, s

)

p(s
1
, z
1
s
2
) . . . (s
m
, z
m
, s

) implica (s, p, z)

(s
1
, , z
1
. . . z
m
).
Procedam prin induct ie asupra lungimii derivarii l.
Daca l = 1 atunci p = i si se aplica regula
(s, z, s

) i(s
1
, z
1
, s
2
) . . . (s
m
, z
m
, s

)
deci (s
1
, z
1
. . . z
m
) f(s, i, z) si (s, i, z)(s
1
, , z
1
. . . z
m
).
Presupunem ca implicat ia este adevarat a pentru l oarecare si consideram o
derivare de lungime l + 1. Fie p = p

i si punem n evident a ultimul pas.


(s, z, s

)

p

(s

j1
, z

j1
, s

j
)(s
j
, z
j
, s
j+1
) . . . (s
m
, z
m
, s

)
p

i(s
1
, z
1
, s
2
) . . . (s
j1
, z
j1
, s
j
)(s
j
, z
j
, s
j+1
) . . . (s
m
, z
m
, s

),
unde s

j
= s
j
; la ultimul pas s-a aplicat regula
(s

j1
, z

j1
, s
j
) i(s
1
, z
1
, s
2
) . . . (s
j1
, z
j1
, s
j
).
Rezulta (s
1
, z
1
. . . z
j1
) f(s

j1
, i, z

j1
) si putem scrie evolut ia
(s

j1
, i, z

j1
)(s
1
, , z
1
. . . z
j1
).
Pe de alta parte, conform ipotezei inductive, avem
(s, p

, z)

(s

j1
, , z

j1
z
j
. . . z
m
)
Prin urmare
(s, p, z) = (s, p

i, z)

(s

j1
, i, z

j1
z
j
. . . z
m
)(s
1
, , z
1
. . . z
m
)
72 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
si implicat ia este demonstrata.
Fie acum p L(G), deci s
0

G
p. T inand seama de forma regulilor din G,
n aceasta derivare se va aplica prima data o regula de forma (1), apoi regula de
forma (2) iar la sf arsit reguli de forma (3). La aplicarea regulilor (2) putem rescrie
la ecare pas simbolul neterminal cel mai din stanga, deci sa obt inem o derivare
extrem stang a. Sa observam ca n acest caz structura formelor propozit ionale
intermediare este cea ment ionata, p(s
1
, z
1
, s
2
)(s
2
, z
2
, s
3
) . . . (s
m
, z
m
, s

).
Prin urmare, derivarea va avea forma
s
0
(s
0
, z
0
, s

)

p(s
1
, z
1
, s
2
) . . . (s
m
, z
m
, s

)

p.
Trebuie sa avem regulile (s
j
, z
j
, s
j+1
) , j = 1, . . . , m, s
m+1
= s

si putem
scrie
(s
0
, p, z
0
)

(s
1
, , z
1
. . . z
m
)(s
2
, , z
2
. . . z
m
). . . (s

, , )
adica p L(APD) si L(G) L(APD).2
Automate pushdown cu stari nale. Vom nota un automat push-down
cu stari nale cu APD
f
.
Teorema 3.12 Un limbaj este recunoscut de un automat pushdown daca si nu-
mai daca este recunoscut de un automat pushdown cu stari nale.
Demonstrat ie. Partea I E = l(APD) E L(APD
f
).
Daca APD = (, I, Z, f, s
0
, z
0
) construim un automat pushdown cu stari
nale astfel
APD
f
= ( s

0
, s
f
, I, Z z

0
, f

, s

0
, z

0
)
unde mult imea de stari nale este s iar funct ia de evolut ie este denita de:
f

(s, i, z) = f(s, i, z), s , i I , z Z;


f

(s

0
, , z

0
) = (s
0
, z
0
z

0
);
f(s, , z

0
) = (s
f
, ), s ;
n rest .
Fie p L(APD); atunci (s
0
, p, z
0
)

(s, , ). Evident ca aceiasi evolut ie o
poate avea si automatul pushdown cu stari nale. Putem scrie n APD
f
evolut ia
(APD
f
) : (s

0
, p, z

0
)

(s
0
, , z

0
)(s, , ),
deci p L(APD
f
) si L(APD) L(APD
f
).
Invers, e p L(APD
f
), atunci (n APD
f
)
(s

0
, p, z

0
)(s, p, z
0
z

0
)

(s
f
, , q).
Ultimul pas trebuie sa e de forma (s, , z

0
)(s
f
, , ) pentru ca nu exista alta
valoare a lui f care sa ne duca ntr-o stare nala. Deci (n APD
f
)
(s

0
, p, z
0
z

0
)

(s, , z

0
)(s
f
, , )
3.6. AUTOMATE PUSHDOWN DETERMINISTE 73
si putem scrie n APD evolut ia (s
0
, p, z
0
)

(s, , ), adica p L(APD) si
L(APD
f
) L(APD).2
Partea II E = L(APD
f
E L(APD).
Fie APD
f
= (, I, Z, f, s
0
, z
0
,
f
) un automat pushdown cu stari nale
(mult imea starilor nale este
f
) si construim un APD astfel
APD = ( s

0
, s

, I, Z z

0
, f

, s

0
, z

0
)
unde
f

(s, i, z) = f(s, i, z), s , i I , z Z;


f(s

0
, , z

0
) = (s, z
0
z

0
);
f(s, , z) = (s

, ), s
f
s

, z Z z

0
;
n rest .
Fie p L(APD
f
), atunci (s
0
, p, z
0
)

(s, , q), s
f
. Este evident ca n
APD avem evolut ia (s
0
, p, z
0
)

(s, , q). Putem scrie
APD : (s

0
, p, z

0
)(s
0
, p, z
0
z

0
)

(s, , qz

0
)

(s

, , ),
deci p L(APD) si L(APD
f
) L(APD).
Invers, e p L(APD). Avem
APD : (s

0
, p, z

0
)

(s
0
, p, z
0
z

0
)

(s, , ).
Simbolul z

0
nu poate sters decat cu o regula de forma f(s, , z) = (s

, ),
s
f
s

, deci APD trebuie sa ajunga ntr-o stare s


f
, apoi sa ram an a n
s

.
APD : (s
0
, p, z
0
z

0
)

(s, , qz

0
), s
f
.
Putem scrie
APD
f
: (s
0
, p, z
0
)

(s, , q), s
f
si deci p L(APD
f
), adica L(APD) L(APD
f
).2
3.6 Automate pushdown deterministe
Funct ionarea unui APD este n general nedeterminista, card f(s, i, z) 1. Pen-
tru ca un APD sa aiba o funct ionare determinista nu ete sucient sa impunem
condit ia card f(s, i, z) = 1, deoarece daca pentru un anumit s si z Z avem
f(s, , z) ,= si f(s, i, z) ,= , putem face un pas citind sau citind i.
Denit ie 3.10 Un automat pushdown este determinist daca
(1) card f(s, i, z) 1, s , i I , z Z;
(2) daca f(s, , z) ,= , atunci f(s, i, z) = , i I.
74 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
Un limbaj recunoscut de un APD determinist l vom numi limbaj independent
de context (sau de tipul doi) determinist. Familia limbajelor independente de
context deterministe este inclusa (strict) n familia limbajelor de tipul 2 (dupa
cum vom vedea).
Un APD se poate bloca n urmatoarel doua situat ii
1. Automatul ajunge n starea s, n varful memoriei pushdown se aa sim-
bolul z, pe banda de intrare urmeaza i si f(s, i, z) = f(s, , z) = ;
2. Intrantr-un ciclu innit citind de pe banda ; de exemplu f(s, , z) = (s, z)
si f(s, i, z) = pentru o anumita pereche (s, z).
Denit ie 3.11 Un APD determinist este neblocabil daca pentru orice cuvant
p I

exista o evolut ie de forma (s


0
, p, z
0
)

(s, , q).

Intr-un APD determinist neblocabil orice cuvant peste I poate citit. Evi-
dent, de aici nu rezulta ca orice cuvant este recunoscut de APD.
Lema 3.6 Un APD determinist cu stari nale este echivalent cu un APD deter-
minist cu stari nale neblocabil (relativ la prima situat ie de blocare).
Demonstrat ie.Fie APD
f
= (, I, Z, f, s
0
, z
0
,
f
). Construim APD

f
= (
s

0
, s

, I, Z z

0
, f

, s

0
, z

0
,
f
) unde:
(1) f

(s, i, z) = f(s, i, z) daca f(s, i, z) ,= , s , i I , z Z;


(2) f

(s, i, z) = (s

, z) daca f(s, i, z) = f(s, , z) = , s , i I, z Z;


(3) f

(s

, i, z) = (s

, z), i I, z Z;
(4) f

(s

, , z

0
) = (s
0
, z
0
z

0
).
Avem
p L(APD
f
) (s
0
, p, z
0
)
APD
f
[= (s, , q), s
f

(s

0
, p, z

0
)
APD

f
[= (s
0
, p, z
0
z

0
)
APD

f
[= (s, , qz

0
), s
f
p L(APD

f
).
Deci L(APD
f
) = L(APD

f
.2
Observat ie.

Intr-o situat ie de blocare (s, ip, zq) si f(s, i, z) = f(s, , z) =
putem scrie
(s, ip, zq)
APD

f
[= (s

, p, zq)
APD

f
[= . . .
APD

f
[= (s

, , zq).
Teorema 3.13 Orice limbaj independent de context determinist este recunoscut
de un APD determinist neblocabil.
3.6. AUTOMATE PUSHDOWN DETERMINISTE 75
Demonstrat ie. Fiind dat un APD determinist vom construi un APD deter-
minist neblocabil echivalent. Conform lemei anterioare putem presupune ca nu
are loc prima situat ie de blocare.
Daca are loc a doua situat ie de blocare, putem avea doua cazuri:
1. cont inutul memoriei pushdown se mareste nelimitat;
2. lungimea cuvintelor scrise n memoria pushdown nu depaseste un anumit
num ar.
Fie card() = n, card(Z) = k, l = max[q[, q Z

[ (s

, q) f(s, i, z).
Cazul 1. Exista n total un num ar nk de perechi de forma (s, z). Daca n
evolut ia lui APD s-ar succede numai congurat ii cu perechi de forma (s, z) dis-
tincte atunci lungimea cuvantului din memoria pushdown ar creste la maximum
nkl simboluri. Prin urmare, daca (s

, ,

)

(s

, ,

) si [

[ [

[ > nkl,
atunci n aceasta evolut ie trebuie sa existe doua congurat ii cu aceiasi stare s si
cu acelasi simbol z n varful memoriei pushdown. Deci
(s

, ,

)

(s, , zr)

(s, , zqr)

(s

, ,

),
de unde urmeaza ca
(s

, ,

)

(s, , zr)

(s, , q
m
r), m N.
Cazul II Lungimea cuvantului scris n memoria pushdown nu depaseste nkl,
caci daca [

[ [

[ > nkl, ar rezulta ca n memoria pushdown am avea


zq
m
, m N si lungimea cuvantului nu ar nita.2
Teorema 3.14 Daca E este un limbaj independent de context determinist atunci
limbajul complementar I

E este de asemenea independent de context determin-


ist.
Demonstrat ie. Fie APD
f
= (, I, Z, f, s
0
, z
0
,
f
) automatul pushdown de-
terminist care recunoaste limbajul E. Construim un automat pushdown deter-
minist care va recunoaste limbajul I

E n modul urmator
APD

f
= (
1
,
2
,
3
, I, Z, f

, s

0
, z
0
,

f
)
unde
s

0
=
_
(s
0
,
1
) pentru s
0

f
,
(s
0
,
2
) pentru s
0
,
f
,
mult imea de stari nale este

f
= (s,
3
)[s iar funct ia de evolut ie este
denita de
76 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
(1) daca f(s, i, z) = (s

, q) atunci
f

((s,
1
), i, z) = ((s

, k

), q),
f

((s,
2
), i, z) = ((s,
3
), q),
f

((s,
3
), i, z) = ((s

, k

), q);
(2) daca f(s, , z) = (s

, q) atunci
f

((s,
1
), , z) = ((s

, k

), q),
f

((s,
3
), , z) = ((s

, k

), q);
unde k

= 1 daca s


f
si k

= 2 daca s

,
f
.
Fie p L(APD

f
), atunci ((s
0
,
k
), p, z
0
)

((s,
3
), , q), k = 1, 2.

In mod
necesar, ultima congurat ie trebuie sa e precedata de o congurat ie de forma
((s

,
2
), , q), deci
(A) ((s
0
,
k
), p, z
0
)

((s

,
2
), , q)((s,
3
), , q)
de unde rezulta ca (s
0
, p, z
0
)

(s

, , q) si s

,
f
. Deci p I

E si L(APD

f
)
I

E.
Invers, e p I

E, atunci n APD

f
avem evolut ia (s
0
, p, z
0
)

(s, , q), s ,

f
si putem scrie evolut ia (A). Prin urmare p L(APD

f
), adica I

E
L(APD

f
).2
Consecint a. Putem enunt a proprietatea de mai sus astfel: Familia limbajelor
independente de context deterministe este nchis a la complementariere. Cum
familia limbajelor independente de context nu este nchisa la complementariere
si cum ea coincide cu familia limbajelor recunoscute de automatele pushdown
nedeterministe putem mai departe obt ine urmatorul rezultat:
APD nedeterministe nu sunt echivalente cu APD deterministe.
3.7 Probleme propuse
1. Sa se arate ca L(G) = (ab)
n
a[n 0 unde G are product iile S
SbS, S a. Sa se construiasca o gramatica echivalenta cu G care sa
e neambigu a.
2. Eliminat i redenumirile din gramatica G
E
ce genereaza expresiile aritmetice
simple.
3. Aducet i la forma normala Chomsky gramaticile ce au regulile:
(a) S TbT, T TaT[ca;
(b) S aAC, A aB[bAB, B b, C c;
(c) S A.A, A 0A[1A[ . . . 9A[.
4. Gasit i forma normala Greibach pentru gramaticile:
3.7. PROBLEME PROPUSE 77
(a) A
1
A
2
A
3
, A
2
A
1
A
2
[1, A
3
A
1
A
3
[0.
(b) G
E
care genereaza expresiile aritmetice simple.
5. Construit i un automat pushdown pentru recunoasterea limbajului:
(a) L = w[w a, b

, numarul literelor a n w este egal cu num arul


literelor b n w ;
(b) L = w[w a, b

, w = w;
(c) L = w[w (, )

, w este un cuvant n care ecare paranteza deschisa


are o pereche, paranteza nchisa .
6. Folosind lema de pompare sa se arate ca urmatoarele limbaje nu sunt inde-
pendente de context:
(a) L = a
i
b
j
c
k
[i < j < k;
(b) L = a
i
b
j
[j = i
2
;
(c) L = a
n
b
n
c
n
[n 1;
(d) L = a
i
[i prim ;
(e) L = a
i
b
i
c
j
[j i;
78 CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
Capitolul 4
Analiza Sintactica
Analiza sintactic a este o faza a procesului de compilare care are urmatoarele doua
obiective principale:
Stabileste daca un cuvant dat apart ine sau nu limbajului, deci daca cuvantul
este corect din punct de vedere sintactic.

In particular limbajul poate
denit de o gramatica generativa de tip Chomsky si deci termenul de
analiza sintactic a trebuie nt eles n sensul teoriei limbajelor formale. Mai
ment ion am ca prin cuvant nt elegem orice structura constituita cu sim-
bolurile acceptate de limbaj, n particular un ntreg program, dar de obicei
ne vom margini la anumite entitat i, de exemplu, o linie sau un rand.
Determina derivarea (arborele de derivare) corespunzator cuvantului. Odata
cu aceasta operat ie sunt degajate anumite structuri pentru care se poate
genera cod intermediar, structuri pe care le vom numi unitat i sintactice.
Pe lang a aceste obiective principale se mai efectuaza si alte operat ii, de ex-
emplu, analiza si tratarea erorilor, prelucrarea tabelelor, etc. Rezultatul anal-
izei sintactice va un sier care cont ine derivarile (arborii de derivare) core-
spunzatoare unitat ilor sintactice n care este descompus programul: expresii ar-
itmetice, declarat ii, etc. Acest sier este utilizat n faza de generare a formatului
intermediar.

In mod curent ns a, generatoarele de format intermediar sunt niste
rutine, apelate de analizorul sintactic, astfel nc at formatul intermediar se obt ine
succesiv.
Teoretic, problema analizei sintactice este rezolvat a de automatele corespunzatoare
diverselor tipuri de limbaje; aceasta cale conduce ns a la algoritmi cu complex-
itate mare (num ar mare de stari, funct ie de tranzit ie conmplexa, etc.). Exista
algoritmi speciali de analiza sintactic a cu ecient a supe- rioara.

In continuare ne
vom ocupa cu doua clase de astfel de algoritmi:
Algoritmi top-down (de sus n jos);
Algoritmi bottom-up (de jos n sus).
79
80 CAPITOLUL 4. ANALIZA SINTACTIC

A
4.1 Algoritmi TOP-DOWN
4.1.1 Algoritmul general de analiza top-down
Algoritmul general de analiza top-down are un principiu foarte simplu: se aplica
n mod sistematic regulile de generare, ncepand cu simbolul de start; n cazul unui
esec se revine n sus si se ncearca o alta regula. Regulile se aplica n ordinea
n care sunt scrise n gramatica, fara sa existe o anumita ordine preferent iala
de scriere, ntrucat natura algoritmului nu permite nici un fel de ierarhizare a
regulilor din punctul de vedere al frecvent ei de utilizare.
Pentru descrierea riguroasa a acestui algoritm am urmat modelul din cartea
lui D. Gries, Compiler construction for digital compters.
Fie G = (V
N
, V
T
, x
0
, T) o gramatica de tipul 2 si p V

T
. Ne intereseaza
urmatoarele doua probleme:
(a) p L(G)?,
(b) Daca p L(G) atunci sa se determine derivarea x
0
p.
Consideram toate regulile care au X
0
n stanga:
x
0
x
11
. . . x
1n
1
[x
21
. . . x
2n
2
[ . . . [x
p1
. . . x
pn
p
Init ial x
0
devine activ si alege prima regula x
0
x
11
. . . x
1n
1
. Daca aceasta
alegere este corecta trebuie sa avem x
0
x
11
. . . x
1n
1

p si n conformitate cu
lema de localizare a gramaticilor de tipul 2, cuvantul p se poate descompune n
forma p = p
1
p
2
. . . p
n
1
, unde x
1j

p
j
, j = 1, . . . n
1
.
Simbolul x
0
l activeaz a pe x
11
si i cere sa gaseasca derivarea x
11

p
1
; daca x
11
reuseste, transmite lui x
0
succes. Simbolul x
0
l dezactiveaza pe x
11
, l activeaza pe
x
12
si i cere sa gaseasc a derivarea x
12

p
2
, etc. Daca toate simbolurile activate de
x
0
transmit succes, construct ia este terminata. Sa presupunem ca x
1j
transmite
esec; atunci x
0
l dezactiveaza pe x
1j
, l reactiveaz a pe x
1j1
caruia i transmite:
Mi-ai dat o derivare, dar aceasta nu este buna, ncearca alta. Daca x
1j1
reuseste,
procesul se continua spre dreapta; daca nu, atunci x
0
l dezactiveaza pe x
1j1
,
l reactiveaz a pe x
1j2
caruia i cere o alta derivare. Procesul se continu a n
acest mod e spre dreapta, e spre stanga. Daca se ajunge la x
11
si acesta nu
reuseste sa gasasc a o alta derivare, x
0
decide ca prima regula aleasa nu este buna
si ncearc a cu urmatoarea regula, adica x
0
x
21
. . . x
2n
2
, s. a. m. d.
Observat ii
Fiecare simbol devenit activ, procedeaza exact ca si parintele sau, alege
prima regula, activeaza primul simbol, etc.
Nu se cunoaste anticipat descompunerea p = p
1
p
2
. . . p
n
1
. Deci x
1j
trans-
mite succes daca reuseste sa gaseasc a o derivare x
1j

p
j
, unde p
j
este un
subcuvant oarecare al lui p, cu singura condit ie ca p
1j
sanceap a din punctul
unde s-a terminat p
1j1
. De exemplu, daca p = i
1
i
2
. . . i
8
. . . si p
1
= i
1
i
2
i
3
i
4
,
4.1. ALGORITMI TOP-DOWN 81
p
2
= i
5
i
6
, atunci x
13
trebuie sa gaseasc a o derivare de forma x
13

i
7
i
8
. . ..

In particular, daca x
1j
V
T
decizia de succes sau esec depinde de faptul
daca x
1j
coincide sau nu cu simbolul din p care urmeaza (

In exemplul de
mai sus, daca x
13
coincide sau nu cu i
7
).
Cand se reactiveaza un simbol si i se cere o noua derivare, acesta reactiveaza
ultimul simbol u si i cere acelasi lucru.
Exemplu Consideram urmatoarea gramatica G
E
care genereaza expresii ar-
itmetice simple. Operanzii sunt notat i simbolic cu a, operatorii sunt + si * iar
ordinea naturala a operat iilor este completata de paranteze.
_

_
E T + E[T
T F T[F
F (E)[a
Procesul de analiza sintactic a top-down pentru cuvantul p = aa este prezen-
tat n gura 4.1.

In aceasta gura, revenirile n sus au fost marcate prin ncadrarea ntr-un


dreptunghi a subarborelui care a condus la un esec. Dreptunghiurile interioare
au semnicat ia unor esecuri realizate mai devreme (este vorba de timpul de
desfasurare al procesului). Arborele corespunzator cuvantului este cel nencadrat
n vreun dreptunghi (n gura acesta este situat n partea dreapta).
4.1.2 Analiza top-down fara reveniri

In cazul unor gramatici cu o forma speciala se poate face o analiza de tip top-down
far a reveniri. Principala condit ie este can cazul mai multor alternative (reguli cu
acelasi simbol n stanga), sa se poata decide cu precizie ramura corecta.

In general
o astfel de decizie se poate realiza prin analiza unor simboluri care urmeaza n
cuvantul de analizat.
Exemplu Consideram urmatoarea gramatica G care genereaza secvent e de
declarat ii si instruct iuni cuprinse intre cuvintele cheie Program si EndPro-
gram. Declarat iile sunt notate simbolic cu d,iar instruct iunile cu i. Fiecare
instruct ie sau declarat ie se ncheie cu ;, exceptand cazul celei ce precede End-
Program.
G
_

_
< program > Program D I EndProgram
D d; X
X d; X[
I iY
Y ; iY [
Sa consideram urmatorul cuvant de analizat
82 CAPITOLUL 4. ANALIZA SINTACTIC

A
E
T + E
F
*
T
( E ) F
*
T
( E )
i
i
F
(
E
)
i
F
(
E )
i
7
5
3
2
4
6
1
F T
( E ) F
*
T
( E )
i
i
F
(
E
)
i
E
T
*
8
9
10
11
Figura 4.1: Arborele sintactic pentru p = i i
4.1. ALGORITMI TOP-DOWN 83
Program
d;
d;
i;
i;
i;
EndProgram
O derivare extrem stang a pentru acest cuvant este
< program > Program D I EndProgram Program d; X I EndProgram
Program d; d; X I EndProgram Program d; d; I EndProgram
Program d; d; iY EndProgram Program d; d; i; iY EndProgram
Program d; d; i; i; iY EndProgram Program d; d; i; i; i EndProgram
Pentru construct ia derivarii extrem stangi se procedeaza astfel: init ial se con-
sidera simbolul de start < program > pentru care se alege singura regula disponi-
bila (daca primul simbol din sirul de analizat nu coincide cu primul terminal al
regulii se poate decide imediat eroare sintactica).Urmatorul simbol neterminal
pentru care trebuie aleasa o regula este D iar sirul ramas de analizat (de generat)
ncepe cu d, astfel ca regula aleasa va D d; X. Din cuvantul init ial trebuie
generata n continuare secvent a d; i; i; i; EndProgram ce ncepe cu d iar neter-
minalul cel mai din stanga este X, astfel ca se alege regula ce ncepe cu d.

In
continuare, din cuvantul init ial ram ane de generat secvent a i; i; i; EndProgram
ce ncepe cu i iar neterminalul cel mai din stanga este X, astfel ca se alege regula
ce X , s.a.m.d.
Daca se considera gramatica ce genereaza expresii aritmetice simple, n forma
considerata la algoritmul general top-down (4.2.9), atunci la primul pas al unei
derivari extrem stangi pentru cuvantul (a + a a) + a nu se poate decide regula
de ales prin citirea primului terminal ( deoarece ar necesar sa consultam sirul
rezultat pan a la ntalnirea operatorului + aat dupa paranteza nchis a.
O gramatica pentru care alegerea regulii de aplicat este unic determinata
de urmatorul simbol terminal din sirul de analizat se numeste gramatica LL(1)
(Left to right parsing, Leftmost derivation, 1 symbol lookahead).

In multe cazuri
exista posibilitatea de a transforma gramatica ntr-una echivalent a de tip LL(1).
Pentru cazul particular al gramaticii pentru generarea expresiilor aritmetice, o
gramatica echivalenta este urmatoarea:
_

_
E TE

+TE

[ TE

[
T FT

FT

[/FT

[
F (E)[id[num
84 CAPITOLUL 4. ANALIZA SINTACTIC

A
_

_
< bloc > < lista >
< lista >< instr > L
L ; < instr > L [
< instr > id = E[if(E)then < instr > [while(E)do < instr > [< lista >
E TE

+TE

[ TE

[
T FT

FT

[/FT

[
F (E)[id[num
Figura 4.2: Gramatica pentru generarea blocurilor de instruct iuni.
{
a = 2;
b = b + 1;
if ( b-a ) then { x = x-1;
a = 3 };
c = b*72
}
Figura 4.3: Program sursa de analizat sintactic
4.1.3 Programarea unui analizor sintactic. Studiu de caz
Programarea unui analizor sintactic top-down far a reveniri se poate face relativ
usor asociind cate o funct ie la ecare neterminal. Analiza unui cuvant revine
la un sir de apeluri corespunzatoare tratarii simbolurilor ce apar pe parcursul
construct iei derivarii extrem stangi. Fiecare funct ie asociata cont ine o singura
instruct iune switch cu clauze ce corepund regulilor gramaticii. Alegerea regulii
se face dupa urmatoarea unitate lexicala din textul de analizat.
Sa consideram urmatoarea gramatica (vezi gura 4.2) ce genereaza un bloc
de instruct iuni de atribuire, condit ionale de tip if (expresie aritmetica) then
instruct iune sau repetitive de tip while.

Instruct iune poate o instruct ie simpla
sau bloc de instruct iuni separate prin delimitatorul ;(SEMICOLON).
Un text sursa ce poate analizat de aceasta gramatica este cel din gura 4.3.
Lista de unitati lexicale furnizate de analizorul lexical este pentru acest caz
LBRACE id LET num SEMI id LET id PLUS num SEMI if LPAR id MINUS id
RPAR then LBRACE id LET id LET id minus num SEMI id LET num RBRACE
SEMI id LET id ORI num RBRACE.
4.1. ALGORITMI TOP-DOWN 85
Un program pentru analiza sintactic a top-down fara reveniri corespunzator
gramaticii din gura 4.2 este reprezentat part ial n gura 4.4. Lista codurilor
de unitat i lexicale (terminalele gramaticii) cont ine SEMI LPAR RPAR s.a.m.d.
Presupunem ca analizorul lexical funct ioneaz a ca funct ie ce returneaza codul
urmatoarei unitat i lexicale din textul sursa. Variabila de tip ntreg token cont ine
codul returnat de analizorul lexical ALEX(). S-au mai denit doua funct ii: err()
pentru tratarea erorilor de sintax a depistate si eat(int tok) ce consuma din textul
sursa unitatea lexicala tok pe care ne astept am sa o gasim n text.
Rularea programului pentru exemplul din gura 4.3 va produce o secvent a de
apeluri recursive ca n gura 4.5.
Un pic de algebra
Vom da n cele ce urmeaza o denit ie riguroasa a gramaticilor LL(k) (k sim-
boluri citite n avans) vom da n cele ce urmeaza , mpreuna cu condit iile necesare
si suciente ca o gramatica sa intre n aceasta categorie.
Denit ie Fie G = (V
N
, V
T
, S, T) o gramatica independenta de context. G se
zice de tip LL(k) daca si numai daca oricare ar doua derivari extrem stangi
S

uXv uv

u
S

uXv uv

u unde X T, X T, , V
+
T
din
k
=
k
rezulta = (notat ia
k
nseamn a primele k simboluri din sirul ).
Pentru k = 1 se obt ine cazul gramaticilor din sect iunile precedente. Restrict ia
asupra numarului de simboluri citite n avans restrange drastic mult imea limba-
jelor ce por analizate cu astfel de gramatici. Un inconvenient major pentru
k > 1 este cresterea exponent ial a a dimensiunii tabelei de predict ie (cate o in-
trare n tabel pentru ecare combinat ie de k simboluri. O variant a mai ecienta
de analiza se obt ine cu gramatici LR(1) (Left to right parsing, Rightmost deriva-
tion, 1 symbol lookahead).
Pentru orice V
+
G
, X V
N
, X T vom considera urmatoarele
mult imi:
Prim() = a V
T
[

a, V

Urm() = a V
T
[S

uXv, a Prim(v)
SD(X, ) = a V
T
[ a Prim() sau (

si a Urm(X) )
NULL(G) = X V
N
[X

Daca un terminal a Prim() atunci a poate aparea pe prima pozit ie ntr-un


sir derivat din . Mult imea SD(X, ) poarta denumirea de mult imea simbolurilor
directoare asociate regulii X , iar NULL(G) cont ine neterminalele ce se pot
sterge (n unul sau mai mult i pasi) cu reguli din G.
Teorema.
G LL(k) SD(X, ) SD(X, ) = , X , X T, ,=
86 CAPITOLUL 4. ANALIZA SINTACTIC

A
final int if=1, then=2, LPAR=3, RPAR=4, LBRACE=5, RBRACE=6,
PLUS=7, MINUS=8, ORI=9, DIV=10, SEMI=11, id=12,
while=13, do=14, LET=15;
void err();
int ALEX();
int token = ALEX();
void eat(int tok){
if (tok==token) token=ALEX else err()
};
void bloc(){
eat(LBRACE); lista(); eat(RBRACE)
};
void lista(){
instr();L()
};
void L(){
switch(token){
case SEMI: eat(SEMI); instr(); L(); break;
default: break }
};
void instr(){
switch(token){
case if: eat(if); eat(LPAR); E(); eat(RPAR); eat (then); instr(); break;
case id: eat(id); eat(LET); E(); break;
case while: eat(while); eat(LPAR); E(); eat(RPAR); eat(do); instr(); break;
case LBRACE: eat(LBRACE); instr(); eat(RBRACE); break;
default: printf("syntax error: if, identif, while or left brace expected");
err()}
};
...
void E(){
T(); Eprime();
};
void Eprime(){
switch(token) {
case PLUS: eat(PLUS);T();Eprime();break;
case MINUS: eat(MINUS);T();Eprime();break;
default: break;
}
};
...
Figura 4.4: Cod C corespunzator analizorului sintactic
4.1. ALGORITMI TOP-DOWN 87
bloc()
eat(LBRACE);
lista()
instr()
eat(id);
eat(LET);
E()
T()
F()
eat(num);
return_F;
Tprime()
return_Tprime;
return_T;
Eprime()
return_Eprime;
return_E;
return_instr;
L()
eat(SEMI)
instr()
.... aici se recunoaste ; b = b + 1
return_instr;
L()
eat(SEMI);
instr()
.... aici se recunoaste ; if ( ... }
return_instr;
L()
.... aici se recunoaste ; c = b * 72
return_L();
return_L;
return_L;
return_lista;
eat(RBRACE);
return_bloc;
Figura 4.5: Execut ia analizei lexicale pentru textul sursa
88 CAPITOLUL 4. ANALIZA SINTACTIC

A
Determinarea mult imilor denite anterior se poate face usor. Pentru NULL(G),
se poate aplica algoritmul denit la eliminarea regulilor de stergere pentru o gra-
matica independenta de context.
NULL = X V
N
[X T
repeat
(1) AUX = NULL;
(2) NULL = NULL X V
N
[X p, p AUX
+
;
until NULL = AUX2
Calculul mult imilor Prim(X) si Urm(X) se poate face cu algoritmul urmator:
Pas 1: Init ializare
Prim(a) = a; a V
T
Prim(X) = Urm(X) = ; X V
N
Pas 2: Repeat
Pentru ecare regula X Y
1
Y
2
. . . Y
k
Do
For(i = 1; i k; i + +)
(2.1)if (i = 1 sau Y
1
Y
2
. . . Y
i
NULL
+
)
Prim(X) = Prim(X) Prim(Y
i
);
(2.2)if (i = k sau Y
i+1
. . . Y
k
NULL
+
)
Urm(Y
i
) = Urm(Y
i
) Urm(X);
(2.3)For (j = i + 1 j k; j + +)
if (j = i + 1 sau Y
i+1
. . . Y
j1
NULL
+
)
Urm(Y
i
) = Urm(Y
i
) Prim(Y
j
);
end for
end for
end do
Until Prim(X), Urm(X) nu se schimb a la o iterat ie.2
Calculul mult imilor Prim() revine la denit ia recursiva
Prim(X) =
_
Prim(X) dac

a X / NULL(G)
Prim(X) Prim() dac

aX NULL(G)
Daca se considera gramatica ce genereaza expresii aritmetice 4.1.2, atunci
rezultatul aplicarii algoritmilor este prezentat n tabelul urmator:
NULL Prim Urm
E ( , i )
E

DA + , )
T ( , i + , , )
T

DA , / + , , )
F ( , i , / , )
,
4.1. ALGORITMI TOP-DOWN 89
iar mult imile simbolurilor directoare sunt
SD(E, TE

) = ( , i
SD(E

, +TE

) = +
SD(E

, ) = )
SD(T, FT

) = ( , i
SD(T

, FT

) =
SD(T

, ) = + )
SD(F, (E)) = (
SD(F, id) = id
SD(F, num) = num
Funct iile C sau Java corespunzatoare neterminalelor se modica put in, n sen-
sul ca vom avea clauze corespunzatoare simbolurilor terminalelor ce se regasesc
n mult imile simbolurilor directoare asociate regulilor. Daca la reconstruct ia de-
rivarii trebuie aplicata o regula pentru X si urmatorul terminal din textul de
analizat nu face parte din mult imea simbolurilor directoare asociate vreunei reg-
uli cu X n stanga, atunci se apeleaza modulul de tratare a erorilor sintactice.
Pentru cazul gramaticii anterioare, cateva din secvent ele de cod asociate neter-
minalelor sunt prezentate n continuare.
...
void E(){
switch(token) {
case LPAR:
case id:
case num: T(); Eprime(); break;
default: printf("syntax error: (,identifier or number expected");
err()
}
}
void Tprime(){
switch(token) {
case ORI: eat(ORI);F();Tprime();break;
case DIV: eat(DIV);F();Tprime();break;
case PLUS:
case RPAR: break;
default: printf("syntax error: *,/,+,) expected");
err()
}
}
Tratarea erorilor este dependent a de proiectantul compilatorului si limbaj.
Principial, exista trei modalitat i de tratare.
90 CAPITOLUL 4. ANALIZA SINTACTIC

A
Se opreste analiza sintactica n punctul unde s-a depistat o eroare, cu trans-
miterea unui mesaj prietenos catre utilizator, de exemplu: Eroare sintac-
tica: asteptam sa urmeze delimitator de instruct iune. Mai nvat a sintaxa
limbajului! BYE!.
Se ncearca repararea greselii de sintax a inserand n textul sursa un simbol
din mult imea de simboluri directoare asociate regulii ce s-a aplicat. Desigur
ca este sucient sa presupunem ca am inserat n text, astfel ncat analiza
poate continua (desigur nu vom uita sa anunt am utilizatorul ca nu cunoaste
regulile de sintaxa si l-am corectat noi!). Inserarea poate conduce la cicluri
innite, astfel ca nu este recomandabila totdeauna.
Se ncearca gasirea unui simbol ce se potriveste ignorand toate terminalele
textului sursa pana se nt alneste un simbol din mult imea simbolurilor di-
rectoare. Se transmite acelasi mesaj prietenos catre autorul textului sursa,
apoi se continu a analiza.
4.2 Algoritmi BOTTOM-UP
4.2.1 Gramatici cu precedent a simpla
Fie G = (V
N
, V
T
, x
0
, T) o gramatica de tipul doi si p L(G) o forma propozit ional a,
adica un cuvant peste alfabetul general V
G
astfel nc at x
0

p. Vom nota cu /
x
0
,p
arborele de derivare care are rad acina x
0
si frontiera p.
Denit ia 1. Vom spune ca f este o fraza simpla a lui p daca f este un
subcuvant al lui p si n plus:
x V
N
, cu x f T;
/
x,f
/
x
0
,p
.
Exemplu. Consideram gramatica G
E
4.2.9 si forma propozit ionala p = T F +
a (E + T). Arborele de derivare este prezentat n gura 4.6. Se poate observa
ca frazele simple sunt T F, a, E + T.
Observat ie. Subcuvantul F respecta prima condit ie dar nu este fraza simpla,
ntruc at nu este satisfacuta condit ia a doua din denit ie.
Denit ia 2. Fraza simpla cea mai din stanga poarta denumirea de fraza
simpla stanga.
Vom nota fraza simpla stang a corespunzatoare lui p cu f
p
n exemplul nostru,
f
p
= T F. Dupa cum vom vedea n continuare, fraza simpla stang a are un
rol important n algoritmii de analiza sintactica bottom-up.

In principiu, acesti
algoritmi prevad urmatorii pasi (descrisi de gura 4.7):
Regulile determinate la pasul (3), aplicaten ordine invers a, ne vor da derivarea
corespunzatoare lui p. Sa mai observam ca n acest mod arborele de derivare se
4.2. ALGORITMI BOTTOM-UP 91
E
E
+
T
T
T * F
F
T * F
( E
)
a E + T
Figura 4.6: Arborele de derivare corespunzator derivarii lui p = T F +a(E+T)
(1) Init ializare p;
(2) Se determina f
p
, fraza simpla stang a a lui p;
(3) Se determina regula x f
p
;
(4) Se reduce fraza simpla stanga, adica daca p = rf
p
s, se pune p = rxs;
GOTO(2).
Figura 4.7: Algoritmul bottom-up
92 CAPITOLUL 4. ANALIZA SINTACTIC

A
construieste de jos n sus (bottom-up). Problema cea mai dicila este desigur
determinarea frazei simple stangi de la pasul (2).

In principiu ar trebui cunoscut
anticipat arborele de derivare corespunzator lui p, dar tocmai acesta este scopul
analizei sintactice. Dupa cum vom vedea, aceasta dicultate se poate elimina,
deci putem determina fraza simpla stanga far a a cunoaste acest arbore. De fapt,
fraza simpla stanga este legata de anumite proprietat i ale gramaticii pe care le
tratam n continuare.
4.2.2 Relat ii de precedent a
Denit ia 3. Fie x, y V
G
doua simboluri oarecare ale gramaticii.
Vom spune ca:
(1) x y (x precede pe y) daca p astfel ncat p = rxys, x / f
p
, y f
p
;
(2) x y (x este egal cu y) daca p astfel ncat p = rxys, x f
p
, y f
p
;
(2) x ~ y (y succede lui x) daca p astfel ncat p = rxys, x f
p
, y / f
p
;
Relat iile ~ se numesc relat ii de precedent a simple (atunci cand nu exista
posibilitatea de confuzie se folosesc denumirile mai mic, egal, mai mare pentru
relat iile de precedent a). Sa observam ca aceste relat ii nu se exclud reciproc, deci
ca putem avea, de exemplu, x y si n acelasi timp x ~ y, ntruc at pot exista
cazuri de gramatici n care putem gasi doua forme propozit ionale p
1
, p
2
astfel
nc at sa avem simultan cele doua relat ii. Sa mai facem de asemenea observat ia
ca exista mai multe tipuri de astfel de relat ii, cu denit ii asemanatoare, ntruc at
relat iile trebuie sa satisfaca condit ii suplimentare care depind si de gramatica;
pentru toate aceste tipuri de relat ii vom utiliza aceleasi notat ii.
Denit ia 4. O gramatica de tipul 2 spunem ca este cu precedent a simpla
daca ntre oricare doua simboluri ale gramaticii exista cel mult o relat ie de
precedent a.
Pentru algoritmul de analiza sintactic a ascendenta este important ca sa nu
existe reguli cu part ile drepte identice; altminteri, n cadrul pasului (4) din algo-
ritmul de analiza sintactica nu se poate decide la cine sa se faca reducerea frazei
simple stangi. De asemenea regulile de stergere nu sunt admise, pentru acest
caz not iunea de fraza simpla neav and sens. Aceste condit ii presupunem n mod
sistematic ca sunt satisfacute.
Fie acum V
G
= x
1
, x
2
, . . . , x
n
alfabetul general, unde am adoptat o anumit a
ordine a simbolurilor. Denim matricea de precedent a a gramaticii,
M = (a
ij
), unde a
ij
=
_

_
daca x
i
x
j
daca x
i
x
j
~ daca x
i
~ x
j
Exemplu. Consideram urmatoarea gramatica
G = (A, B, 0, 1, A, A A0[1B, B 1).
4.2. ALGORITMI BOTTOM-UP 93
Matricea de precedent a va
A B 0 1
A
B ~
0 ~
1 ~
4.2.3 Proprietat i ale gramaticilor cu precedent a simpla
Proprietatea 1. Fie p = a
1
. . . a
n
o forma propozit ionala ntr-o gramatica cu
precedent a simpla (a
i
sunt simboluri neterminale sau terminale ale gramaticii).
Atunci f
p
= a
i
. . . a
j
daca si numai daca
a
1

a
2
. . .

a
i1
a
i
a
i+1
. . . a
j
~ a
j+1
()
Demonstrat ia acestei proprietat i se efectueaza considerand toate structurile
de arbori de derivare posibile ntr-o situat ie data. Vom exemplica aceasta idee
pentru cuvanul p = a
1
. . . a
7
. Daca presupunem ca f
p
= a
3
a
4
a
5
, atunci, conform
denit iei frazei simple stangi, avem
a
2
a
4
, a
4
a
5
, a
5
~ a
6
Mai trebuie aratat ca a
1

a
2
.

In acest scop vom considera toate posibilitat ile
de structuri arborescente; o parte din ele sunt prezentate n gura 4.8.
Se poate observa ca n ipoteza ca f
p
= a
3
a
4
a
5
, singurele situat ii posibile sunt
(a) si (b). Celelalte situat ii contrazic aceasta ipoteza, de exemplu, n cazurile (c)
si (d) fraza simpla stang a ar , respectiv, a
1
a
2
sau a
2
. Acum, n cazul (a), prin
reducerea succesiva a frazei simple stangi, vom obt ine un arbore n care fraza
simpla stanga va a
1
a
2
, adica a
1
a
2
iar n cazul (b), fraza simpla stang a va
a
2
si atunci a
1
a
2
.
Implicat ia invers a se bazeaza pe cea directa; se presupune ca f
p
= a
l
. . . a
k
cu
l ,= i si k ,= j si se considera n continuare toate posibilitat ile de pozit ionare a
indicilor l, k fat a de i, j. De exemplu, daca f
p
= a
2
a
3
atunci, conform implicat iei
directe, avem
a
1
a
2
a
3
~ a
4
ceea ce contrazice relat ia (*), conform careia a
3
a
4
iar gramatica are precedent a
simpla.
Observat ie La delimitarea frazei simple stangi se procedeaza astfel: parcurgem
sirul de simboluri de la stanga la dreapta pan a se gaseste relat ia ~ (sau marginea
dreapta a formei propozit ionale) pentru determinarea ultimului simbol din f
p
,
apoi se parcurge sirul spre stanga, trecand peste relat ii , pan a la gasirea unei
94 CAPITOLUL 4. ANALIZA SINTACTIC

A
a
3
a
4
a
5
a
6
a
7 a
1
a
2
a
3
a
4
a
5
a
6 a
1
a
2
a
3
a
4
a
5
a
6 a
1
a
2
a
3
a
4
a
5
a
6 a
1
a
2
a
7
a
7
a
7
(a)
(b)
( c)
(d)
Figura 4.8: Arbori de derivare posibili
x
0
a
1
a
2
. . . a
n
Figura 4.9: Arborele de derivare pentru ni = 1
relat ii (sau marginea dreapta a formei propozit ionale) pentru determinarea
primului simbol din f
p
.
Proprietatea 2. O gramatica cu precedent a simpla este neambigu a.
Schit a de demonstrat ie. Fie p o forma propozit ional a si /
x
0
,p
arborele de
derivare corespunzator. Vom arata ca acest arbore este unicul arbore de derivare
care are rad acina x
0
si frontiera p. Procedam prin induct ie asupra numarului de
noduri interne ni. Daca ni = 1 atunci arborele de derivare va avea forma din
gura 4.9 si unicitatea acestuia este evidenta. Presupunem acum ca proprietatea
este adevarat a pentru un ni oarecare si consideram cazul ni +1. Sa presupunem
ca ar exista doi arbori diferit i cu rad acina x
0
si frontiera p; e acestia /

x
0
,p
si
/
x
0
,p
.
Deoarece gramatica este cu precedent a simpla, rezulta ca fraza simpla stang a,
care este aceiasi n cei doi arbori, este situata n aceiasi pozit ie, p = rf
p
s.
Efectuam reducerea frazei simple f
p
(conform regulii aplicate x f
p
) si vom
4.2. ALGORITMI BOTTOM-UP 95
obt ine arborii /

x
0
,q
si /
x
0
,q
unde q = rXs iar cei doi arbori trebuie sa e diferit i.
Dar numarul de noduri interne este ni, n contrazicere cu ipoteza.
4.2.4 Determinarea relat iilor de precedent a pentru gra-
matici cu precedent a simpla
Asa cum s-a precizat deja, relat iile de precedent a sunt proprietat i intrinseci ale
gramaticii, nu depind de contextul n care se aa cele doua simboluri. Prin ur-
mare, cunoasterea anticipat a a acestor relat ii mpreun a cu proprietatea 1, rezolva
complet problema pasului 2 de la algoritmul de analiza bottom-up, adica deter-
minarea frazei simple stangi.

In acest subparagraf vom prezenta o teorema de
caracterizare pe baza careia se pot determina relat iile de precedent a simple si
implicit faptul daca gramatica este sau nu cu precedent a simpla.
Vom deni doua relat ii specice gramaticilor si care vor utilizate n con-
tinuare, numite, respectiv, F (First) si L (Last). Fie x V
N
si y V
G
doua
simboluri ale gramaticii. Vom spune ca
xFy daca x yu T, u V

G
xLy daca x uy T, u V

Inchiderile tranzitive, respectiv, tranzitive si reexive ale acestor relat ii le vom


nota cu F
+
, L
+
si respectiv, F

, L

. Exista numerosi algoritmi direct i care


permit calcularea acestei nchideri,cu complexitate redusa.
Teorema 2. Avem
(1) x y u . . . xv . . . T, vF
+
y;
(2) x y u . . . xy . . . T;
(3) x ~ y u . . . vw. . . T, vL
+
x, wF

y;
Schit a de demonstrat ie. Se analizeaza posibilitat ile de arbori de derivare care
raspund cerint elor teoremei. De exemplu, pentru cazul (1), trebuie sa existe
structura de arbore ca n gura 4.10.
Este clar ca daca x y, atunci conform denit ei frazei simple stangi, tre-
buie sa existe p astfel nc at p = rxys, x / f
p
, y f
p
, adica sa existe struc-
tura din 4.10. Invers, daca exista o astfel de structura, atunci e o forma
propozit ionala care cont ine u. Efectuam reduceri succesive pan a cand vom obt ine
o forma propozit ional a pentru care u apart ine frazei simple stangi; la arborele
astfel obt inut, adaug am subarborele de mai sus. Vom avea n mod evident
x / f
p
, y f
p
.
4.2.5 Studiu de caz
Sa consideram cazul gramaticii pentru generarea expresiilor aritmetice simple
G
E
, cu regulile obisnuite
96 CAPITOLUL 4. ANALIZA SINTACTIC

A
u
v
...
x y
...
Ramificatii
spre dreapta
Figura 4.10: Arborele de derivare corespunzator cazului x y
E T F + ( ) a
E
T ~
F ~ ~
+

(
) ~ ~ ~
a ~ ~ ~
Figura 4.11: Matricea de precedent a pentru G
E
_

_
E E + T[T
T T F[F
F (E)[a
Relat iile First, Last si nchiderile acestora sunt:
E F E, T E F
+
E, T, F, (, a E F

E, T, F, (, a
T F T, F T F
+
T, F, (, a T F

T, F, (, a
F F (, a F F
+
(, a F F

F, (, a
E L T E L
+
T, F, a, ) E F

E, T, F, a, )
T L F T L
+
F, a, ) T F

T, F, a, )
F L a, ) F L
+
a, ) F F

F, a, )
Conform teoremei de calcul a relat iilor de precedent a vom obt ine matricea de
precedent a (vezi gura 4.11) asociata simbolurilor gramaticii G
E
.
4.2. ALGORITMI BOTTOM-UP 97
G :
_
A A0 [ B1
B 1
S a b
S
a
b ~ ~ ~
Figura 4.12: Exemplu de gramatica cu precedent a simpla
Regula Forma propozitionala
a a a b ~ aababbbabb
S ab a a S a a b ~ abbbabb
S ab a a S a S a b ~ bbabb
S ab a a S a S S b ~ babb
S aSSb a a S S b ~ abb
S aSSb a S a b ~ b
S ab a S S b
S aSSb S
Figura 4.13: Reconstruct ia derivarii cuvantului p = aaabaababbbabb
Deci gramatica G
E
nu are proprietatea de precedent a simpla, astfel ca nu
poate aplicat direct algoritmul de analiza sintactic a bottom up.
Vom exemplica algoritmul de analiza pentru gramatica din gura 4.12, ma-
tricea de precedent a asociata este cea alaturat a.
Reconstituirea derivarii cuvantului p = aaabaababbbabb este prezentata n
tabelul 4.13, unde ecare linie corespunde formei propozit ionale, n care fraza
simpla stanga este subliniata, precedata de regula identicat a.
4.2.6 Gramatici operatoriale
Gramaticile operatoriale sunt gramatici cu o structura speciala a regulilor de
rescriere, n care anumite simboluri sunt considerate operatori iar celelalte oper-
anzi, operatorii trebuind sa separe operanzii. Aceasta structura este preluata de
la gramaticile care genereaza expresiile aritmetice iar principiul de analiza este
de asemenea preluat de la algoritmul de evaluare a expresiilor aritmetice.

In con-
tinuare vom prezenta acest principiu pentru evaluarea expresiilor aritmetice far a
paranteze, cazul expresiilor cu paranteze putandu-se reduce la cel far a paranteze,
de exemplu utilizand tehnica de modicare a ponderilor operatorilor la ntalnirea
parantezelor.

In primul rand se atribuie operatorilor anumite ponderi care vor deni ordinea
de efectuare a operat iilor. De obicei, se considera p(+) = p() = 1 < 2 = p() =
98 CAPITOLUL 4. ANALIZA SINTACTIC

A
p(/), ceea ce nseamna ca mai ntai se fac adunarile si scaderile, apoi nmult irile
si mpart irile, etc. Efectuarea unei operat ii depinde de contextul n care se aa
operatorul respectiv, si anume, daca ponderea operatorului precedent este mai
mare sau egala cu ponderea operatorului curent, atunci se poate efectua operat ia
denita de operatorul precedent. Din acest motiv, acest tip de gramatici se
numesc cu operator de precedent a (operator precedence grammars).
Putem realiza un algoritm simplu de evaluare utilizand doua stive
P- stiva operatorilor;
S- stiva operanzilor.
Vom utiliza indicii i si k pentru a indica nivelele celor doua stive. Prin urmare,
notat ia p
i
, respectiv s
k
au sensul de operatorul, respectiv operandul din stiva aat
pe nivelul i, respectiv k. Pentru simplicare, vom utiliza aceiasi notat ie p
i
atat
pentru operator cat si pentru ponderea operatorului respectiv.
Algoritmul de evaluare:
PAS 1: Init ializari: Se introduce primul operator si primul operand n stivele P
si S si se init ializeaza nivelele celor doua stive, i = k = 2;
PAS 2: Se introduce urmatorul operator n stiva P si se actualizeaza nivelul,
i = i + 1;
PAS 3: Daca p
i1
< p
i
atunci se introduce urmatorul operand n lista S, se
actualizeaza nivelul stivei, k = k + 1, si se revine la pasul 2;
PAS 4: Daca p
i1
p
i
atunci:
n stiva P: p
i1
se nlocuieste cu p
i
;
n stiva S: s
k1
se nlocuieste cu s
k1
p
i1
s
k
;
se actualizeaza nivelele celor doua stive, i = i 1; k = k 1 si se revine la
pasul 3.
Observat ie. Pentru uniformitatea algoritmului se introduce operatorul mar-
caj, notat cu # , cu ponderea cea mai mica; orice expresie sencadreazantre doua
marcaje iar oprirea algoritmului are loc la pasul 4 n cazul n care p
1
= p
2
= #.
Schematic, acest algoritm este prezentat n gura 4.14.
Exemplu. Tabelul 4.15 cont ine starea dinamica a celor doua stive pentru
expresia #a +b c/d f#. Ment ion am ca n cadrul pasilor 2 si 4 s-a completat
cate un rand nou n tabel.
Observat ie. Ponderile operatorilor sunt legate de ierarhia lor n gramatica, cu
cat un operator este mai jos cu atat ponderea lui este mai mare. Acest fapt este
ilustat n gura 4.16.
Pentru cazul expresiilor aritmetice cu paranteze algoritmul se pastreaz a, dar
este aplicat dupa preprocesarea expresiei prin modicarea dinamica a ponder-
ilor operatorilor si renunt area la paranteze. Se parcurge expresia de la stanga la
dreapta alocand ponderi operatorilor; la ntalnirea unei paranteze deschise pon-
derile se incrementeaza cu 10, iar la ntalnirea unei paranteze nchise se decre-
menteaza ponderile operatorilor cu 10.

In continuare parantezele sunt ignorate.
4.2. ALGORITMI BOTTOM-UP 99
p
1
s
1
i=2,k =2
1.
2.
3.
4.
p
i
i=i+1
p
i-1
< p
i
s
k
k = k +1
p
i-1
p
i
dupa
prelucrare
i=i+1, k = k +1
s
k p
i-1
p
i-1
p
i
p
i
s
k - 1
p
i - 1
s
k
s
k -1
s
k -1
inaintede
prelucrare
Figura 4.14: Prelucrarile efectuate asupra celor doua stive
1 2 3 4 1 2 3 4
1 #
0
a
2 #
0
+
1
a b
3 #
0
+
1

1
a b
4 #
0

1
a + b c
5 #
0

1

2
a + b c d
6 #
0

1

2
/
2
a + b c d
7 #
0

1
/
2
a + b c d f
8 #
0

1
/
2
#
0
a + b c d f
9 #
0

1
#
0
a + b c d/f
10 #
0
#
0
a + b c d/f
Figura 4.15: Evaluarea expresiei #a +b c d/f#
100 CAPITOLUL 4. ANALIZA SINTACTIC

A
E
E + T
*
E
+
T
T E
*
T
F T
F
p(+)<p(*) p(*)>p(+)
Figura 4.16: Ierarhia operatorilor
De exemplu, expresia
a (b c d) (x +y/(z t)) h
devine prin preprocesare
a
2
b
11
c
12
d
1
x +
11
y/
12
z
21
t
2
ceea ce va asigura ordinea corecta de evaluare.
4.2.7 Gramatici operatoriale
Fie G = (V
N
, V
T
, x
0
, T) o gramatica de tipul 2. Vom considera ca simbolurile
neterminale V
N
sunt operanzii limbajului iar simbolurile terminale V
T
sunt oper-
atorii. Sa observam ca n cazul gramaticii G
E
care genereaza expresii aritmetice
simple o asemenea convent ie este justicata, deoarece oricare din neterminalele
E, T, F deriveaz a n terminalul a (generic, acest terminal reprezinta operanzii),
sau ntr-o expresie (eventual ntre paranteze) care are rolul de operand.
Denit ia 1. Vom spune ca o gramatica este operatoriala daca regulile de
rescriere au forma
X N
i
T
i
N
i+1
T
i+1
. . . T
j
N
j+1
,
unde N
k
sunt neterminale (operanzi), inclusiv cuvantul vid, iar T
k
sunt terminale
(operatori).
Observat ie.

Intr-o gramatica operatoriala orice forma propozit ional a are struc-
tura:
p = N
1
T
1
N
2
T
2
. . . T
n
N
n+1
4.2. ALGORITMI BOTTOM-UP 101
N
i
N
i +1
N
j +1
T
i
T
i +1
T
j
N'
i
N'
i +1
N'
j +1
x
Figura 4.17: Structura subarborelui
Aceasta nseamn a ca ntr-o forma propozit ionala a unei gramatici operatoriale
ntre oricare doi operanzi exista cel put in un operator; pot ns a exista mai mult i
operatori alaturat i, de exemplu, . . . ((a . . ..
Denit ia 2. Fie p = N
1
T
1
N
2
T
2
. . . T
n
N
n+1
o forma propozit ionala ntr-o
gramatica operatoriala. Vom spune ca f este o fraza simpla a lui p daca f =
N
i
T
i
N
i+1
T
i+1
. . . T
j
N
j+1
este un subcuvant al lui p care cont ine cel put in un simbol
terminal si n plus:
(1) x N

i
T
i
N

i+1
T
i+1
. . . T
j
N

j+1
T, si N

N
k
k = i, . . . , j.
(2) /
x,f
/
x
0
,p
.
Structura de arbore corespunzatoare unei fraze simple este prezentata n gura
4.17.
Ca si n cazul gramaticilor cu precedent a simpla, fraza simpla cea mai din
stanga poarta denumirea de fraza simpla stanga. Principiul de analiza sintactica
este identic cu cel de la gramatici cu precedent a simpla. Problema principala
este si aici determinarea frazei simple stangi. Aceasta operat ie poate facuta
utilizand relat iile de precedent a dintre simbolurile gramaticii care pentru gra-
matici operatoriale au o denit ie put in modicata.
Denit ia 3. Fie x, y V
T
. Vom spune ca:
(1) x

<y (x precede pe y) daca p astfel nc at p = rxNys, N V


N
, x / f
p
, y f
p
;
(2) x

=y (x este egal cu y) daca p astfel nc at p = rxNys, N V


N
, x / f
p
, y
f
p
;
(2) x

>y (y succede lui x) daca p astfel nc at p = rxys, N V


N
, x f
p
, y / f
p
;
Matricea de precedent a se deneste numai pe mult imea simbolurilor termi-
nale, ceea ce conduce la o simplicare a algoritmului de analiza.
Denit ia 4. O gramatica operatoriala se spune ca are precedent a simpla daca
ntre doua simboluri ale gramaticii exista cel mult o relat ie de precedent a.
Ca si la celelalte tipuri de gramatici, n vederea efectuarii pasului 3 din algo-
ritmul de analiza, vom presupune ca nu exista reguli cu part ile drepte identice.
102 CAPITOLUL 4. ANALIZA SINTACTIC

A
N
1
N
2
T
1
T
2
N
3
T
3
T
5
T
4
N
4
N
5
N'
3
N'
4
N'
5
N
1
N
2
T
1
T
2
N
3
T
3
T
5 T
4
N
4
N
5
N'
3
N'
4
N'
5
(a)
(b)
Ramificatii
spre dreapta
Ramificatii
spre dreapta
Figura 4.18: Structurile posibile de arbori
De asemenea, sunt valabile proprietat ile de caracterizare si de neambiguitate.
Proprietatea 1. Fie p = N
1
T
1
N
2
T
2
. . . T
n
N
n+1
o forma propozit ional a ntr-o
gramatica cu precedent a simpla. Atunci f
p
= N
i
T
i
N
i+1
T
i+1
. . . T
j
N
j+1
daca si
numai daca
T
1

<
=T
2
. . .

<
=T
i1

<T
i

=T
i+1
. . .

=T
j

>T
j+1
()
Schit a de demonstrat ie. Presupunem ca p = N
1
T
1
N
2
T
2
. . . T
n
N
n+1
si ca fraza
simpla stanga este f
p
= N
3
T
3
N
4
T
4
N
5
T
5
. Atunci din denit ia frazei simple stangi,
rezulta T
2

<T
3

=T
4

=T
5

>T
6
. Mai trebuie sa aratam ca T
1

<T
2
sau T
1

=T
2
.

In acest
scop analizam structurile posibile de arbori (gura 4.18).
Efectuam reduceri succesive pan a cand T
2
f
p
.

In acest moment avem T
1

<T
2
pentru cazul (a) si T
1

=T
2
pentru cazul (b). Pentru implicat ia invers a presupunem
ca f
p
= N
k
T
k
N
k+1
T
k+1
. . . T
l
N
l+1
, l ,= j, k ,= i si consideram toate cazurile de
pozit ionare a indicilor k, l n raport cu i, j. De exemplu, daca l < j atunci, n
conformitate cu implicat ia directa, rezulta T
l

>T
l+1
iar conform relat iei () din
ipoteza, avem T
l

<T
l+1
sau T
l

=T
l+1
ceea ce contrazice ipoteza init ial a conform
careia gramatica este cu precedent a simpla.
Proprietatea 2. O gramatica operatoriala cu precedent a simpla este neam-
bigua.
Schit a de demonstrat ie. Fie p o forma propozit ional a si /
x
0
,p
arborele de
derivare corespunzator. Vom arata ca acest arbore este unicul arbore de derivare
care are rad acina x
0
si frontiera p. Procedam prin induct ie asupra numarului de
noduri interne ni. Daca ni = 1 atunci arborele de derivare va avea forma din
gura 4.19 si unicitatea acestuia este evident a. Presupunem acum ca proprietatea
4.2. ALGORITMI BOTTOM-UP 103
N
1
T
1
T
n
N
n
x
0
...
Figura 4.19: Arborele de derivare pentru ni = 1
este adevarata pentru un ni oarecare si consideram cazul ni +1. Sa presupunem
ca ar exista doi arbori diferit i cu radacina x
0
si frontiera p; e acestia /

x
0
,p
si
/
x
0
,p
.
Deoarece gramatica este cu precedent a simpla, rezulta ca fraza simpla stang a,
care este aceiasi n cei doi arbori, este situata n aceiasi pozit ie, p = rf
p
s.
Efectuam reducerea frazei simple f
p
(conform regulii aplicate x f
p
) si vom
obt ine arborii /

x
0
,q
si /
x
0
,q
unde q = rXs iar cei doi arbori trebuie sa e diferit i.
Dar numarul de noduri interne este cel mult ni, ceea ce contrazice ipoteza induc-
tiva.
4.2.8 Determinarea relat iilor de precedent a pentru gra-
matici operatoriale
Vom deni mai nt ai relat iile F
1,2
si L
1,2
,analoage cu F si L de la gramaticile cu
precedent a simpla.
Denit ie Fie x V
N
si y V
G
. Vom spune ca
xF
1,2
y daca x yu T, sau x Nyu T, u V

G
, N V
N
xL
1,2
y daca x uy T, sau x uyN T, u V

G
, N V
N

Inchiderile tranzitive, respectiv, tranzitive si reexive ale acestor relat ii le


vom nota cu F
+
1,2
, L
+
1,2
si respectiv, F

1,2
, L

1,2
. Acum, determinarea relat iilor de
precedent a operatoriale se poate face cu ajutorul urmatoarei teoreme.
Teorema (determinarea relat iilor de precedent a). Avem
(1) x

<y u . . . xv . . . T, vF
+
1,2
y;
(2) x

=y u . . . xNy . . . T;
(3) x

>y u . . . vy . . . T, vL
+
1,2
x;
Schit a de demonstrat ie. Demonstrat ia se poate face prin analiza structurilor
posibile ale arborilor de derivare Pentru cazul (1), trebuie sa existe structura de
arbore ca n gura 4.20.
104 CAPITOLUL 4. ANALIZA SINTACTIC

A
u
v
x N'
i
y T
j
N'
j +1
N
i
N
j +1
Figura 4.20: Structura posibila de arbore
Aceasta teorema ne permite sa determinam matricea de precedent a a gra-
maticii pe baza careia putem apoi aplica algoritmul de analiza bottom-up. Prob-
lema neterminalelor de la capetele frazei simple stangi se poate rezolva analizand
part ile drepte ale regulilor de rescriere.

Intr-adev ar, teorema ne da numai ter-
minalele care intr a n fraza simpla stang a si neterminalele interioare; cele doua
eventuale neterminale de la capete vor apart ine sau nu frazei simple stangi de-
pinzand de forma part ii drepte ale regulii respective. Evident, se pot face si
ipoteze de neambiguitate suplimentare pentru gramatica, similare cu condit ia de
a nu exista reguli cu part ile drepte identice.
4.2.9 Studiu de caz
Sa consideram cazul gramaticii pentru generarea expresiilor aritmetice simple
G
E
, cu regulile obisnuite
_

_
E E + T[T
T T F[F
F (E)[a
Relat iile F
1,2
, L
1,2
si nchiderile acestora sunt:
E F
1,2
E, T, + E F
+
1,2
E, T, F, +, , (, a E F

1,2
E, T, F, +, , (, a
T F
1,2
T, F, T F
+
1,2
T, F, , (, a T F

1,2
T, F, , (, a
F F
1,2
(, a F F
+
1,2
(, a F F

1,2
F, (, a
E L
1,2
T, + E L
+
1,2
T, +, F, , a, ) E F

1,2
E, T, +, F, , a, )
T L
1,2
F, T L
+
1,2
F, , a, ) T F

1,2
T, F, , a, )
F L
1,2
a, ) F L
+
1,2
a, ) F F

1,2
F, a, )
4.2. ALGORITMI BOTTOM-UP 105
+ ( ) a
+

>

<

<

>

<


>

>

<

>

<
(

<

<

<

=

<
)

>

>

>
a

>

>

>
Figura 4.21: Matricea de precedent a operatoriala pentru G
E
Regula Forma propozitionala
a

>+

<(a + a) a a
F a F +

<(

<a

>+ a) a a
F a F +

<(

<F +

<a

>) a a
F a F +

<(

<F + F

>) a a
T T F , T F F +

<(T

=)

> a a
F (E) , E T F +

<F

<a

> a
F a F +

<F F

> a
T T F , T F F +

<T

<

<a
F a F +

<T F
T T F F + T
E E T , E T , T F E
Figura 4.22: Reconstruct ia derivarii cuvantului p = a + (a + a) a a
Conform teoremei de calcul a relat iilor de precedent a vom obt ine matricea de
precedent a (vezi gura 4.21) asociata simbolurilor gramaticii G
E
.
Deci gramatica G
E
are proprietatea de precedent a operatoriala simpla, astfel
ca se poate aplica direct algoritmul de analiza sintactic a bottom up.
Reconstituirea derivarii cuvantului p = a + (a + a) a a este prezentata
n tabelul 4.22, unde ecare linie corespunde formei propozit ionale, n care fraza
simpla stanga este subliniata, precedata de regula identicat a.
106 CAPITOLUL 4. ANALIZA SINTACTIC

A
Capitolul 5
Sinteza Programelor
5.1 Forme interne ale programelor
5.1.1 Tabelele compilatorului
Compilatoarele prelucreaza un num ar important de informat ii, variabile de di-
verse tipuri, date organizate n anumite structuri standard sau denite de utiliza-
tor, etc. De cele mai multe ori aceste informat ii sunt stocaten tabele si memorate
pe suporturile de informat ii ale sistemului. Organizarea si prelucrarea tabelelor
constituie o problema distincta, cu infuent a important a asupra performant elor
unui compilator, mai ales daca acestea sunt memorate pe un suport extern.

In
cele ce urmeaza vom prezenta pe scurt principalele tabele utilizaten mod obisnuit
n cadrul unui compilator si modul de organizare a informat iilor stocate n aceste
tabele. Ment ion am ca structura acestor tabele este denita de proiectantul de
compilator si ca prin urmare exista un anumit grad de subiectivitate n modul de
organizare al acestora.
Tabelul de variabile. Cont ine variabilele utilizate ntr-un program si infor-
mat ii asupra lor. Ment ion am ca variabilele cont in datele prelucrate de
program, n conformitate cu tipul acestora, cont inut care se modica n
mod dinamic pe parcursul evolut iei programului. Informat iile din ecare
linie a tabelului pot :
numele variabilei; asa cum s-a precizat la analiza lexicala, numele unei
variabile este de obicei un sir de caractere, litere sau cifre, primul
caracter trebuind sa o litera.
tipul variabilei; relativ la tipurile de variabile utilizate n programare
trebuie sa facem ment iunea ca acestea depindn mod esent ial de dome-
niul de aplicabilitate al limbajului. De exemplu, pentru un limbaj de
tip matematic (Pascal), tipul unei variabile este caracterizat n general
de trei atribute: structura (scalar, tablou), calitatea (intreg, otant,
107
108 CAPITOLUL 5. SINTEZA PROGRAMELOR
logic), dimensiunea ( simpla precizie, dubla precizie, etc).

In prin-
cipiu, ecare variabila poseda toate aceste trei caracteristici, putand
exista si anumite restrict ii, de exemplu, variabilele ntregi pot avea
dimensiunea numai simpla precizie sau dubla precizie.
adresa; adresa de nceput a zonei de memorie rezervat a variabilei;
Alte informat ii: sunt informat ii de tip semantic, utilizate la depanarea
programului; de exemplu, daca variabila a fost sau nu init ializat a
(adica daca nainte de prima utilizare i s-a atribuit valoare), daca a
fost utilizata sau nu, etc.
Pentru uniformitatea prelucrarii tabelului se poate prevedea o anumit a
lungime xa pentru elementele tabelului, chiar daca spat iul nu este folosit
n ntregime. De exemplu, n cazul variabilelor de tip tablou, se pot uti-
liza doua sau mai multe linii pentru a stoca valorile maxime ale indicilor
(aceste dimensiuni vor utilizate atat la rezervarea zonei de memorie cat
si la calculul deplasamentului unui element.
Observat ie asupra funct iilor. Denumirile funct iilor sunt deseori utilizate ca
variabile care cont in valoarea pe care funct ia respectiva o returneaza. Este
natural ca n acest caz numele funct iei sa e considerat variabil a si sa e
stocat n acest tabel mpreuna cu atributele respective; de exemplu, unul
din aceste atribute trebuie sa e contorul de amplasare, (CA), adica adresa
primei instruct ii executabile a rutinei corespunzatoare funct iei.
Tabelul de etichete. Cont ine etichetele utilizate ntr-un program si adresele
primelor instruct ii ale secvent elor de program corespunzatoare.

In esent a,
etichetele nu difera de variabilele obisnuite, dar exista anumite particu-
laritat i; de exemplu, numele unei etichete trebuie sa e constituit dintr-un
identicator urmat de un delimitator special (doua puncte, etc.) sau numai
din caractere numerice (cazul limbajului BASIC) iar valoarea unei etichete
este ntodeauna o valoare de adresa. De asemenea, n cazul etichetelor tre-
buie facuta analiza compatibilitat ii dintre etichetele denite si etichetele
referite.
Tabelul de variabile temporare. Cont ine variabile ale compilatorului nece-
sare pastr arii unor rezultate intermediare. Avand n vedere ca rezultatele
intermediare, la fel ca si variabilele denite de utilizator, pot avea tipuri
diferite, se pot constitui zone separate n care se vor memora rezultate de
un anumit tip bine precizat.

In acest caz, variabilele temporare pot avea o
structura liniara iar adresa unei astfel de variabile se determina cu o formul a
de tipul
adr = adr
0
+ c i
5.1. FORME INTERNE ALE PROGRAMELOR 109
unde adr
0
este adresa de nceput a zonei, c este lungimea elementelor iar i
num arul de ordine al variabilei temporare. Se poate adopta un sistem de
alocare dinamica a variabilelor temporare n scopul economisirii memoriei.
Tabelul de constante. Cont ine constantele de diverse tipuri utilizate ntr-un
program.

In general este un tabel de mai mici dimensiuni, de aceea nu
comporta probleme deosebite de organizare si prelucrare.
5.1.2 Cvadruple si triplete
Cvadruplele si tripletele sunt forme intermediare ale programelor n care ecare
operat ie elementara mpreun a cu operanzii ei se stocheaza ntr-o secvent a de
patru sau trei elemente.
Cvadruple
Ne vom referi n continuare numai la operat ii binare, pentru celelalte operat ii
putandu-se proiecta structuri similare. Consideram deci o secvent a de text de
forma A op B, unde A si B sunt operanzi (variabile, constante, variabile tem-
porare, etc.) iar op este un operator binar. Cvadrupul corespunzator acestei
secvent e va
op, A, B, t
i
unde op, A, B sunt codurile unitat ilor lexicale respective iar t
i
este o variabil a
temporara. Semnicat ia acestui cvadruplu este urmatoarea: se executa operat ia
denita de operatorul op ntre operanzii A si B, n aceasta ordine, iar rezultatul
este memorat la t
i
.

In continuare vom folosi aceiasi notat ie pentru un operand
si pentru codul operandului, posibilitatea de confuzie ind redusa, deci nu vom
mai utiliza notat ii de forma A, etc.
Exemplu. Cvadruplele corespunzatoare expresiei aritmetice a b + (c + d)/e
sunt
(1) , a, b, t
1
(2) +, c, d, t
2
(3) /, t
2
, e, t
3
(4) +, t
1
, t
3
, t
4

In cazul altor operat ii, chiar de n-aritate diferita de doi, se stabilesc structurile
specice ale cvadruplelor; pentru operat ii cu mai mult de doi operanzi, se pot
utiliza doua sau chiar mai multe cvadruple. Un exemplu de cvadruple pentru
structurile uzuale ale limbajelor de programare este prezentat n tabelul 5.1.
Observat ie asupra instruct iei if. Presupunem ca structura instruct iei este
if (expresie logica) then instruct iune bloc;
110 CAPITOLUL 5. SINTEZA PROGRAMELOR
Text Sursa Cvadruple
a+b +,a,b,t, idem -,*,/
a=b =,a,b,
goto i BR, i, ,
if (a==b) then BE, a,b, n
Figura 5.1: Exemplu de codicare prin cvadruple
Instructie
Bloc
Expresie logica
rezultatul int
Expresie
r ,a,b,n
Instructie
Bloc
t
fals
adevarat
if,_,_,_
Schema logica (b)Cvadruple (a)
Figura 5.2: Instruct iunea If logic
5.1. FORME INTERNE ALE PROGRAMELOR 111
Semantica acestei instruct ii este prezentata n gura 5.2. Ment ion am ca ex-
presie logica va avea forma particulara E
1
rE
2
, unde r este un operator relat ional.

In gura (a) prezinta schema logica a instruct iei iar (b) cvadruplele core-
spunzatoare. Partea de cod corespunzatoare expresiei logice va stoca valoarea
(logica ) a expresiei ntr-o variabil a temporara t; aceasta valoare va utilizata n
instruct ia de salt, n conformitate cu tipul de salt prevazut n programul sursa (<,
=, etc.).

In consecint a, cvadrupul de salt r va trebui sa prevada aceasta variabil a
temporara, plus num arul de ordine n al primului cvadruplu care urmeaza dupa
cvadruplele corespunzatoare instruct iei sau blocului. De exemplu, acest cvadru-
plu poate avea urmatoarea forma r, a, b, n unde n este numarul cvadruplului la
care trebuie sa se faca saltul.
Triplete
Este o alta posibilitate de format intermediar, asemanator cu cvadruplele, sin-
gura deosebire ind accea ca nu se prevede explicit o variabil a temporara pentru
stocarea rezultatului. Prin urmare, tripletul corespunzator unei operat ii binare
de forma A op B va op, A, B.

In cazul n care ca operand al unui triplet
trebuie specicat rezultatul unui triplet anterior, se va scrie num arul de ordine
al tripletului respectiv.
Exemplu. Pentru secvent a de program xx = a b +(c +d)/e sirul de triplete
generat va
(1) , a, b
(2) +, c, d
(3) /, (2), e
(4) +, (1), (3)
(5) =, xx, (4)
Notat ia poloneza
Notat ia poloneza a fost introdusa init ial pentru a se putea evalua expresii aritmet-
ice printr-o singura parcurgere secvent iala. Din punctul de vedere al proiectarii
compilatoarelor, aceasta notat ie poate utilizata ca un format intermediar al
programelor, n mod special pentru limbajele de programare algoritmice, For-
tran, Pascal.

In continuare vom ilustra ideea de evaluare secvent iala a expresiilor
aritmetice printr-un exemplu.
Consideram expresia aritmetica ab+(cde)f. Ideea sirului polonez consta
n scrierea operanzilor si a operatorilor acestei expresii (fara a utiliza paranteze)
ntr-un sir cu urmatoarea proprietate: se parcurge sirul secvent ial de la stanga la
dreapta si ecare operator nt alnit provoac a efectuarea operat iei respective ntre
cei doi operanzi din fat a, n ordinea aparit iei lor. Pentru exemplul considerat, un
112 CAPITOLUL 5. SINTEZA PROGRAMELOR
sir care satisface aceasta condit ie este
ab cde f +
Vom numi acest sir notat ia poloneza corespunzatoare expresiei, sau notat ia
poloneza inversa. Evaluarea se poate face utilizand o stiva cu urmatoarea pre-
lucrare: se parcurge secvent ial sirul, operanzii se introduc n stiva far a nici un
control, iar ecare operator citit provoac a efectuarea operat iei ntre operanzii
aat i n penultimul si ultimul element al stivei, n aceasta ordine si memorarea
rezultatului n penultimul element. Starea dinamica a stivei pentru exemplul
considerat este urmatoarea:
(1) a a*b a*b a*b a*b a*b+(c-d*e)*f
(2) b c c c-d*e (c-d*e)*f
(3) d d*e f
(4) e
Cont inutul stivei a fost rescris atunci cand un operator provoac a efectuarea
unei operat ii. Se poate observa ca sirul considerat de noi (notat ia poloneza a
expresiei) satisface condit ia de evaluare secvent ial a. De fapt, aceasta condit ie
este esent ial a si ea poate luata chiar ca o denit ie a sirului polonez.
Fie V un alfabet si B o mult ime de operatori binari.
Denit ia 1. Vom numi sir polonez orice cuvant peste alfabetul V B obt inut
recursiv cu ajutorul regulilor:
(1) daca a V atunci a este sir polonez;
(2) daca p si q sunt siruri poloneze si b B, atunci pqb este sir polonez.
Sa observam ca utilizand aceste doua reguli, putem sa obt inem succesiv toate
sirurile poloneze av and operanzii V si operatorii binari B. De exemplu, daca V =
a, b, c si B = +, , atunci sirurile poloneze vor a, b, c, ab+, ac+, bc+, ab,
. . . , aab + +, aac + +, . . ..

In cele ce urmeaza vom da o alta denit ie, tot constructiva, folosind gramati-
cile generative Chomsky. Este necesar sa precizam expresiile aritmetice pentru
care introducem aceste siruri.
Denit ia 2. Fie gramatica G
exp
= (E, T, F, a, +, , E, T) unde regulile
de rescriere sunt
_

_
E E + T[T
T T F[F
F a
Observat ie. Terminalul a desemneaza operanzii, deci a este de fapt o notat ie
simbolica pentru variabile de forma a, b, c, etc. Este usor de vazut ca aceasta gra-
matica genereaza expresii aritmetice far a paranteze, n care singurele operat ii
sunt + si . Utilizarea a trei neterminale E, T, F se face numai pentru a preciza
ponderea operat iilor, cresterea fac andu-se odata cu adancimea, deci p(+) < p().
5.1. FORME INTERNE ALE PROGRAMELOR 113
Acelasi limbaj al expresiilor aritmetice far a paranteze poate generat cu o gra-
matica cu un singur neterminal, e acesta A, si av and regulile
A A + A[A A[a
Darn acest caz trebuie introduse alte convent ii pentru a preciza ordinea operat iilor;
de exemplu, pentru expresia a+bc, n acest ultim caz, nimic nu arata ca operat ia
trebuie facut a nainte de +. Trebuie sa precizam ca prin considerarea a numai
doi operanzi nu se impune o constrangere asupra not iunii de expresie aritmetica,
foarte usor putem generaliza aceasta gramatica la un num ar oarecare de operatori
binari, de exemplu
A
1
A
1
op
1
A
2
[A
2
A
2
A
2
op
2
A
3
[A
3
etc.
De asemenea, putem considera operatori de n-aritate oarecare precum si reguli
de rescriere n concordant a cu sintaxa pe care dorim sa o satisfaca acestia. Uti-
lizarea unor paranteze pentru a indica o anumita ordine de efectuare a operat iilor,
iarasi nu difera esent ial de cazul expresiilor fara paranteze. Putem folosi algorit-
mul de modicare dinamica a ponderilor descris la gramatici operatoriale: par-
curgem expresia de la stanga la dreapta si atas am ecarui operator ponderea sa;
n momentul n care nt alnim o paranteza deschis a, marim toate ponderile cu o
constant a mai mare decat cea mai mare pondere iar la ntalnirea unei paranteze
nchise, scadem aceasta constant a. Apoi eliminam toate parantezele. Este evi-
dent ca n acest fel operat iile din interiorul parantezelor vor avea prioritatae mai
mare, mergandu-se spre parantezele din interior.
Denit ia 3. Fie G
p
= (V
N
, V
T
, x
0
, T), unde V
N
= A, V
T
= a, +, ,
x
0
= A iar regulile sunt
A AA +[AA [a
Orice cuvant p L(G
p
) va numit sir polonez. Este natural ca aceste
siruri poloneze sa e puse n legatur a cu expresiile aritmetice fara paranteze
prezentate mai sus. Gramatica G
p
nu stabileste o ordine intrinseca de efectuare
a operat iilor, ntocmai ca si gramatica cu un singur neterminal de generare a
expresiilor. Convenim ns a ca aceasta ordine sa e cea secvent iala.
Daca p L(G
p
) atunci convenim sa notam cu aes(p) cuvantul obt inut din p
cu ajutorul algoritmului de evaluare secvent ial a.
Urmatoarea teorema stabileste legatura ntre cele doua entit at i.
Teorema. Pentru orice cuvant e L(G
exp
) exista un p
e
L(G
p
) astfel ncat
aes(p
e
) = e.
Demonstrat ie. Procedam prin induct ie asupra num arului n de operatori din
e. Daca n = 1 atunci e = a+b sau e = ab si sirul polonez care satisface condit ia
din teorema va p
e
= ab+ sau p
e
= ab. Sa presupunem ca proprietatea este
114 CAPITOLUL 5. SINTEZA PROGRAMELOR
E
E
+
T
e
1
e
2
e
1
E
T
T * F
a
(a)
(b)
Figura 5.3: Structurile posibile ale arborelui de derivare
adevarat a pentru o expresie care cont ine un num ar de operatori mai mic sau egal
cu n si consideram o expresie e cu n operatori. Arborele de derivare al acesteia
va avea una din formele prezentate n gura 5.3.

In cazul (b) putem considera e


2
= a.

In ambele cazuri expresiile e
1
si e
2
au
un num ar de operanzi inferior lui n si n conformitate cu ipoteza inductiva avem
aes(p
e
1
) = e
1
si aes(p
e
2
) = e
2
. Luam p
e
= p
e
1
p
e
2
+ pentru cazul (a) si p
e
= p
e
1
p
e
2

pentru cazul (b). Este evident ca aes(p


e
) = e.
5.2 Generarea formatului intermediar

In aceasta sect iune vom analiza problema generarii formatului intermediar pentru
limbaje algoritmice de tip Fortran, Pascal, Basic. Formele intermediare avute n
vedere sunt cvadruplele si notat ia poloneza, ntr-un singur caz ne vom referi si
la triplete, av and n vedere ca principial generarea acestora nu difera esent ial de
cea a cvadruplelor.
Schema generala a algoritmilor este urmatoarea.
Fie G gramatica (de tipul 2) care genereaza limbajul de programare. Prima
faza consta n stabilirea unor elemente semantice n concordant a cu structura
limbajului; astfel, ecarui simbol x V
G
i se atribuie un anumit sens seman-
tic, notat S(x), sens care cont ine o anumit a informat ie depinzand de simbolul
respectiv, de contextul n care acesta apare, etc. De asemenea, ecarei reguli
de generare i se ataseaz a o anu- mita rutina semantica. Operat iile obisnuite
care se efectueaza n aceste rutine sunt: analize specice, atribuirea unui sens
semantic simbolului din stanga, generarea unui cvadruplu sau a unei secvent e
de sir polonez, etc. Faza a doua este faza de generare propriuzisa si ea com-
porta n principiu urmatoarele operat ii: Se efectueaza analiza sintactic a a tex-
5.2. GENERAREA FORMATULUI INTERMEDIAR 115
tului sursa cu un algoritm de analiza pe care proiectantul de compilator a decis
sa l utilizeze. Indiferent de algoritmul ales, analiza poate conceputa n doua
etape, mai ntai construct ia arborelui de derivare si apoi reducerea lui succesiva
prin eliminarea unor subarbori.

In mod natural acesti subarbori sunt cei core-
spunzatori frazelor simple stangi asa nc at act iunile care se realizeaza cu acest
prilej sunt cele corespunzatoare rutinelor semantice din prima faza. Ment ion am
ca frontierele subarborilor care se reduc vor constitui, prin denit ie, unitat ile sin-
tactice ale limbajului.

In momentul n care se ajunge la simbolul de start (s-a
efectuat ntreaga reducere) ntr-un sier de iesire se obt ine programul n format
intermediar, cvadruple, sir polonez, etc. Se poate observa ca analiza sintactica
joaca n acest proces un rol central.

In cele ce urmeaza vom presupune ca analiza
sintactic a se efectueaza cu un algoritm de tip bottom-up si deci subarborele care
se reduce are drept frontiera fraza simpla stang a.
5.2.1 Generarea cvadruplelor
Gramatica care genereaza expresiile aritmetice G
E
este cunoscuta; pentru a ne
situa ntr-un context cat mai apropiat de cazul real, vom completa aceasta gra-
matica cu operat iile - si / (diferent a si mp art ire). Prin urmare regulile acestei
gramatici vor
_

_
E E + T[E T[T
T T F[T/F[F
F (E)[a
Sensul semantic este prestabilit numai pentru simbolul terminal a, si anume,
S(a) este adresa zonei de memorie atasat a identicatorului desemnat de a. Pentru
celelalte simboluri neterminale, E, T, F sensul semantic se atribuie pe parcursul
efectuarii analizei. Rutinele semantice corespunzatoare regulilor sunt prezentate
n tabelul 5.4. Ment ion am ca act iunile prevazute n aceste rutine sunt stabilite
n conformitate cu nt elesul pe care proiectantul doreste sa l atribuie diverselor
structuri si nu au o rat iune intrinsec a. Ca o regula generala ns a, putem sa
facem precizarea ca n cazul cvadruplelor, variabila temporara n care se ret ine
rezultatul intermediar, va transmisa ca sens semantic simbolului din stanga.
Exemplu. Consideram urmatoarea expresie aritmetica (a +b) c d (e f).
Arborele de derivare corespunzator este prezentat n gura 5.5.

In dreapta ecarui nod al arborelui (nodurile sunt etichetate cu simboluri ale


gramaticii), se aa nscris sensul semantic corespunzator variabilei si contextului
n care aceasta se aa. Procesul de generare al cvadruplelor se desfasoara astfel:
la nceputul procesului, dupa cum se poate vedea pe arborele de generare, fraza
simpla stanga este a. Se efectueaza reducerea F a si se aplica rutina semantica
corespunzatoare acestei reguli (n tabelul rutinelor pozit ia (8) ); singura operat ie
care se face este transmiterea sensului semantic lui F.

In continuare, acest sens
116 CAPITOLUL 5. SINTEZA PROGRAMELOR
Regula Cvadruplu Sens
(1) E
1
E
2
+ T +, S(E
2
), S(T), t
i
S(E
1
) = t
i
(2) E
1
E
2
T , S(E
2
), S(T), t
i
S(E
1
) = t
i
(3) E T S(E) = S(T)
(4) T
1
T
2
F , S(T
2
), S(F), t
i
S(T
1
) = t
i
(5) T
1
T
2
/F /, S(T
2
), S(F), t
i
S(T
1
) = t
i
(6) T F S(T) = S(F)
(7) F (E) S(F) = S(E)
(8) F a S(F) = Adr(a)
Figura 5.4: Rutine semantice asociate regulilor
E
E , t
2
T , t
4
T , t
2
T , t
1
F , c
F , t
1
c
E , t
1 ( )
( ) E , t
3
* T ,d
F ,d
d
T ,b E ,a +
T ,a
F ,a
a
F ,b
b
e
F , e
T , e
E , e T , f
F , f
f
F , t
3
*
_
_
Figura 5.5: Arborele de derivare
5.2. GENERAREA FORMATULUI INTERMEDIAR 117
Regula Cvadruplu Sens
(1) E
1
E
2
+ T +, S(E
2
), S(T) S(E
1
) = (n)
(2) E
1
E
2
T , S(E
2
), S(T) S(E
1
) = (n)
(3) E T S(E) = S(T)
(4) T
1
T
2
F , S(T
2
), S(F) S(T
1
) = (n)
(5) T
1
T
2
/F /, S(T
2
), S(F) S(T
1
) = (n)
(6) T F S(T) = S(F)
(7) F (E) S(F) = S(E)
(8) F a S(F) = Adr(a)
Figura 5.6: Rutine semantice pentru generarea tripletelor
se transmite pan a la E, apoi fraza simpla stanga este b si se transmite sensul
semantic pana la T.

In acest moment fraza stang a este E + T iar cele doua
simboluri au sensurile S(E) = a, S(T) = b; se efectueaza reducerea E E + T
si se genereaza cvadruplul +, a, b, t
1
iar sensul semantic care se transmite lui E
este t
1
. Procesul continua n acelasi mod si se obt ine n nal sirul de cvadruple:
+, a, b, t
1
, t
1
, c, t
2
, e, f, t
3
, d, t
3
, t
4
, t
2
, t
4
, t
5
5.2.2 Generarea tripletelor
Modicarea ceva mai important a intervine la rutinele semantice precum si la
faptul ca dupa generarea unui triplet, sensul semantic care se transmite va
num arul de ordine al tripletului generat. Aceste rutine sunt prezentate n tabelul
5.6.
Generarea tripletelor se desfasoara la fel cu cea a cvadruplelor. Pentru expre-
sia considerata la generarea cvadruplelor se obt ine urmatorul sir de triplete
(1) +, a, b
(2) *, (1), c
(3) -, e, f
(4) *, d, (3)
(5) -, (2), (4)
118 CAPITOLUL 5. SINTEZA PROGRAMELOR
Regula Notat ia poloneza
(1) E E + T p
i
= +
(2) E E T p
i
=
(3) E T
(4) T T F p
i
=
(5) T T/F p
i
= /
(6) T F
(7) F (E)
(8) F a p
i
= Adr(a)
Figura 5.7: Metoda rutinelor semantice
5.2.3 Generarea sirului polonez
Tehnica rutinelor semantice
Dupa cum s-a precizat, notat ia poloneza constituie o interesant a si utila forma
intermediara a programelor.

In paragraful precedent aceasta notat ie s-a introdus
numai pentru expresii aritmetice far a paranteze, dar aceasta construct ie se poate
face pentru majoritatea structurilor sintactice ale limbajelor de programare. De-
sigur ca cea mai naturala tehnica de generare a notat iei poloneze pentru o expresie
este procedura generala prezentata la nceputul capitolului, bazata pe rutinele se-
mantice atasate regulilor de generare. Spre deosebire de procedura de generare a
cvadruplelor si a tripletelor, pentru sirurile poloneze nu mai avem nevoie de sensul
semantic al neterminalelor; acestea sunt utilizate n momentul aparit iei lor si deci
nu mai este necesara stocarea unor informat ii suplimentare.

In continuare sunt
prezentate rutinele semantice pentru generarea notat iei poloneze corespunzatoare
expresiilor aritmetice cu paranteze (vezi gura 5.7), generate de gramatica G
E
.
Notat ia p
i
o utilizam pentru a desemna elementul i din sirul polonez; indicele i
se actualizeaza dupa ecare prelucrare a sirului.
Exemplu. Vom aplica rutinele semantice de mai sus pentru generarea sirului
polonez corespunzator expresiei aritmetice ab+(cde)f. Analiza sintactica
se efectueaza cu un algoritm de tip bottom-up, asa nc at trasarea explicita a
arborelui de derivare nu mai este necesara. Prelucrarea efectiva se poate organiza
ntr-un tabel can gura 5.8; ment ion am ca fraza simpla stang a este indicata prin
sublinierea secvent ei corespunzatoare de text.
Tehnica parantezelor
Ideea de baza consta n aceea ca se plaseaza ntre doua paranteze ecare operator
mpreun a cu cei doi operanzi ai sai; apoi generarea notat iei poloneze se poate face
simplu, folosind o stiva de operatori.
5.2. GENERAREA FORMATULUI INTERMEDIAR 119
Textul sursa Regula aplicata Notat ia poloneza
a * b + (c - d * e) * f F a a
F * b + (c - d * e) * f F b ab
F * F + (c - d * e) * f T T F, T F ab*
T + (c - d * e) * f F c ab*c
T + (F - d * e) * f F d ab*cd
T + (F - F * e) * f F e ab*cde
T + (F - F * F) * f T T F, T F ab*cde*
T + (F - T) * f E E T, E T, T F ab*cde*-
T + (E) * f F (E) ab*cde*-
T + F * f F f ab*cde*-f
T + F * F T T F, T F ab*cde*-f*
T + T E E + T, E T ab*cde*-f*+
E ab*cde*-f*+
Figura 5.8: Generarea sirului polonez: tehnica analizei sintactice
Plasarea parantezelor. Se atribuie ecarui operator cate o pondere n con-
formitate cu convent ia de prioritat i sau cu gramatica care genereaza expresiile
considerate.

In cazul unei expresii aritmetice far a paranteze se poate proceda n
urmatorii pasi:
(1) Se ataseaza ecarui operator ponderea sa.
(2) Se parcurge expresia de la stanga la dreapta pan a cand ntre doi op-
eratori se gaseste relat ia ; de exemplu . . . a b + c . . . si, cu convent ia
uzuala, +. Se plaseaza ntre paranteze operatorul mpreuna cu cei
doi operanzi ai sai, adica . . . (a b) + c . . ..
(3) Se sterge ponderea operatorului curent (cel care a fost inclus ntre paran-
teze) si se reia procesul de la punctul (2) ncepand cu operatorul urmator
(n exemplul nostru de la +).
De exemplu, expresia a/b c + d e va avea forma ((((a/b)*c)+d)-e).

In cazul unor expresii aritmetice cu paranteze se foloseste un algoritm aseman ator


n care se modica pasul (1) si anume: se parcurge expresia de la stanga la dreapta
atas and ecarui operator ponderea sa. La nt alnirea unei paranteze deschise se
modica provizoriu ponderile prin adaugarea unei constante ntregi (aceasta con-
stant a trebuie sa e mare decat cea mai mica pondere) si se atribuie n con-
tinuare noile ponderi. La nt alnirea unei paranteze nchise, aceasta constant a
este scazuta, astfel ncat operatorii din interiorul parantezelor vor avea ponderi
superioare. Apoi toate parantezele se sterg. De exemplu, n expresia
(a + b) (c/(d e) f),
120 CAPITOLUL 5. SINTEZA PROGRAMELOR
dupa efectuarea acestei operat ii, presupunand ca init ial ponderile operatorilor
+, , , / sunt, respectiv, 1, 2, 3, 4 si constanta de majorare are valoarea 10, op-
eratorilor li se vor atribui ponderile:
a + b * c / d - e - f
11 3 14 22 12
Generarea sirului polonez. Pornind de la expresiile aritmetice n care au fost
plasate parantezelen conformitate cu prima parte, sirul polonez poate construit
cu ajutorul algoritmului:
Se parcurge expresia de la stanga la dreapta, parantezele deschise sunt
ignorate si se executa operat iile
operanzii se scriu succesiv n sirul polonez;
operatorii se scriu ntr-o stiva.
La citirea unei paranteze nchise, operatorul din varful stivei se scrie n sirul
polonez.
Tehnica stivei de operatori
Este probabil cea mai raspandit a metoda de generare a sirului polonez pentru
expresii aritmetice. Se utilizeaza doua liste liniare si o stiva. Prima lista cont ine
expresia aritmetica data iar n cealalta se obt ine succesiv sirul polonez core-
spunzator. Operatorii sunt plasat i n stiva t inandu-se cont de ponderile lor,
apoi sunt extrasi si scrisi n sir conform cu un algoritm care n esent a repro-
duce act iunea rutinelor semantice. Mecanismul care realizeaza acest proces este
prezentat n gura 5.9.
Algoritmul este urmatorul:
(1) Operanzii se scriu direct n sirul polonez.
(2) Operatorii si parantezele deschise se scriun stiva respectandu-se urmatoarele
reguli
Parantezele deschise au pondere 0 si se scriu fara condit ii;
Pentru ceilalt i operatori, se compara ponderea operatorului de introdus
cu ponderea operatorului din varful stivei; daca aceasta este mai mare,
introducerea are loc; daca este mai mica sau egala, se extrage varful stivei
(acesta trece n sirul polonez), se reia comparat ia cu operatorul din varful
stivei pana la prima paranteza deschisa sau pan a la baza stivei, si apoi se
introduce noul operator;
5.3. GENERAREAFORMATULUI INTERMEDIAR PENTRUINSTRUCT II CLASICE121
Stiva
Varful stivei
Intrare
( Expresie aritmetica)
Iesire
(Sirpolonez)
Figura 5.9: Structura dispozitivului
(3) Citirea unei paranteze nchise provoaca extragerea operatorilor din stiva
pan a la prima parantez a deschis a; aceasta este extrasa si ea din stiva (dar paran-
teza extrasa nu trece n sirul polonez) iar n continuare cele doua paranteze sunt
ignorate.
(4)

In nalul procesului, deci dupa ce ultimul operand a fost trecut n sirul
polonez, se extrag tot i operatorii din stiva si se scriu n sirul polonez.
Exemplu. Pentru expresia a * b + (c - d * e) * f, stare dinamica a stivei de
operatori este prezentat a n gura 5.10.
5.3 Generarea formatului intermediar pentru instruct ii
clasice
5.3.1 Instruct iunea de atribuire
to ll
5.3.2 Instructiunea If
to ll
5.3.3 Variabile indexate
to ll
122 CAPITOLUL 5. SINTEZA PROGRAMELOR
a*b+(c -d* e )* f ab * cde*- f *+
2 *
4
2
1
1
*
(
+
*
3 -
Figura 5.10: Starea dinamica a stivei
Capitolul 6
Masina Turing
6.1 Limbaje de tipul zero
Limbajele de tipul 0 sunt generate de gramatici Chomsky far a restrict ii asupra
regulilor de derivare. Se poate arata ca orice gramatica de tipul zero accepta
urmatoarea forma normala
S SA,
B C[i[,
DE FH,
unde A, C, F, H ,= S. Se observa ca singura deosebire fat a de gramaticile depen-
dente de context este aceea ca putem avea si reguli.
Demonstrat ia existent ei formei normale se face prin transformari succesive ale
regulilor.

In prealabil gramatica se completeaza cu neterminale noi astfel nc at
orice regula u v care nu este de stergere sa respecte condit ia de monotonie,
adica [u[ [v[. Acest lucru se poate realiza dupa cum urmeaza. Fie
X
1
. . . X
n
Y
1
. . . Y
m
, n > m,
o regula care nu respecta condit ia de monotonie. Vom pune
X
1
. . . X
n
Y
1
. . . Y
m
Z
m+1
. . . Z
n
, Z
m+1
, . . . , Z
n
.
Este clar ca orice derivare directa uv n gramatica init ial a se poate obt ine
si n gramatica modicata si reciproc (neterminalele Z nu pot aparea n stanga
altor relat ii).

In acest fel, gramatica se va transforma astfel ncat sa cont in a doua
categorii de reguli: reguli care respecta condit ia de monotonie si reguli.

In continuare reducem lungimea part ii drepte a regulilor folosind urmatoarea


transformare. Fie u v P, [v[ > 2; atunci v = Y
1
Y
2
Y
3
v

.
1. daca u = X
1
atunci regula se nlocuieste cu
X
1
Z
1
Z
2
,
Z
1
Y
1
,
Z
2
Y
2
Y
3
v

.
123
124 CAPITOLUL 6. MASINA TURING
2. daca u = X
1
X
2
u

atunci regula se nlocuieste cu


X
1
X
2
Z
1
Z
2
,
Z
1
Y
1
,
Z
2
u

Y
2
Y
3
v

In ambele cazuri Z
1
, Z
2
sunt neterminale noi.
Este clar ca noile lungimea part ii drepte a regulilor se reduce cu o unitate
pentru cazul n care exista minim 3 simbolurin dreapta. repetand procedura se
poate obt ine o gramatica echivalent a n care regulile au una din formele:
1. B C[i[,
2. DE FH,
3. X Y Z.
Regulile (1) si (2) satisfac condit iile de la forma normala, iar cele de forma (3)
presupunem ca nu satisfac aceste condit ii, deci ca X ,= S sau Y ,= S.

In general,
putem avea mai multe astfel de reguli; pentru simplicare presupunem ca exista
doua reguli de forma (3):
(3

); X
1
Y
1
Z
1
, X
2
Y
2
Z
2
.
Construim o gramatica echivalent a G

= (V
N
S

,

X
1
,

X
2
, V
T
, S

, P

), unde P

cont ine toate regulile care convin (de formele (1) si (2)) precum si
S

S,
S


X
1
[S


X
2
,
X
1

X
1
Y
1
Z
1
, X
2

X
2
Y
2
Z
2
.
De asemenea vom include n P

urmatoarel reguli de comutare (relativ la sim-


bolurile nou introduse

X
1
,

X
2
):
A

X
1


X
1
A,
A

X
2


X
2
A,
, A V
N
.
Se vede ca G

este o gramatica n forma normala. Este trivial sa arat am ca


L(G) = L(G

).
Fie p L(G), deci S

G
p. Presupunem ca n aceasta derivare exista o
singura secvent a u

v n care se aplica reguli de forma (3

), adica
G : S

u

v

p.
6.1. LIMBAJE DE TIPUL ZERO 125
Presupunem ca secvent a u

v are forma
u = u
1
X
1
u
2
X
2
u
3
X
2
u
4

u
1
Y
1
Z
1
u
2
Y
2
Z
2
u
2
Y
2
Z
3
u
4
= v,
unde u
1
, u
2
, u
3
, u
4
V

N
.

In G

putem scrie
S


X
2
S


X
2

X
2
S


X
1

X
2

X
2
S

X
1

X
2

X
2

u

X
1

X
2

X
2
= u
1
X
1
u
2
X
2
u
3
X
2
u
4

X
1

X
2

X
2

u
1
X
1

X
1
u
2
X
2

X
2
u
3
X
2

X
2
u
4

u
1
Y
1
Z
1
u
2
Y
2
Z
2
u
3
Y
2
Z
2
u
4
= v

p
Prin urmare, S

p si p L(G

).
Invers, e p L(G

), deci S

p. Daca n derivarea S

p apar sim-
bolurile

X
1
,

X
2
ele nu pot aparea dacat n urma aplicarii regulilor S


X
1
si S


X
2
, deci la nceputul derivarii, apoi singura posibilitate de continuare
este S

S; de asemenea, aceste simboluri nu pot eliminate decat cu regulile


X
1

X
1
Y
1
Z
1
si X
2

X
2
Y
2
Z
2
, etc. Astfel derivarea noastra trebuie sa aiba
forma descrisa mai sus, de unde rezulta S

G
p, p L(G).2
Relativ la puterea generativa a gramaticilor de tipul zero se poate arata ca
/
1
/
0
(strict). Demonstrat ia se face pe o cale indirecta.
Ment ionam si urmatoarea teorema a spat iului de lucru. Fie G o gramatica
de tipul zero. Pentru o derivare
D : S = u
0
u
1
. . . u
n
= p V

T
denim
WS
D
(p) = max[u
i
[
i = 1, . . . , n
si
WS(p) = minWS
D
(p).
D
Observat ie. WS este prescurtare de la working space.
Spunem ca o gramatica de tipul zero G are spat iul de lucru marginit daca
exista k N astfel nc at pentru p L(G) sa avem WS(p) k[p[. Sa observam
ca orice gramatica care nu are reguli de stergere (except ie S si atunci S nu
apare n dreapta) satisface aceasta condit ie cu k = 1.
Teorema 6.1 (teorema spat iului de lucru) daca o gramatica G are spat iul de
lucru marginit, atunci L(G) /
1
.
126 CAPITOLUL 6. MASINA TURING
i
1
i
2
i
3
i
5
Dispozitiv decitire/ scriere
Dispozitiv decomanda sS
Bandadeintrare/ iesire
i
4
p= i
1
i
2
i
3
i
4
i
5
, n =4
Figura 6.1: Reprezentarea schematic a a masinii Turing
6.2 Masina Turing
Conceptul de masina Turing. Masina Turing este un mecanism de recunoastere
a limbajelor de tipul zero.

In felul acesta, familiilor de limbaje din clasicarea
Chomsky le corespund automate specice de recunoastere.
Familia /
3
- automate nite,
Familia /
2
- automate pushdown,
Familia /
1
- automate liniar marginite,
Familia /
0
- masina Turing.
O masina Turing (prescurtat MT) se compune dintrun dispozitiv de comanda
care poseda un dispozitiv de scrierecitire si o banda de intrare. Banda de intrare
se considera marginit a la stanga si nemarginit a la dreapta; ea cont ine simboluri
ale unui alfabet de intrare, ncep and din prima pozit ie. Alfabetul are un sim-
bol special numit blanc si notat (sau spat iu), care se considera nregistrat n
toata partea neocupata a benzii. Indicele simbolului din dreptul dispozitivului de
scrierecitire l notam cu n si el va constitui un element al starii masinii Turing.
Dispozitivul de comanda se aa ntr-o anumit a stare intern a, element al unei
mult imi nite de stari.
Schema unei masini Turing este datan gura 6.1. O masin a Turing funct ioneaz a
n pasi discret i. Un pas de funct ionare consta din:
Dispozitivul de comanda citeste simbolul aat n dreptul dispozitivului de
scrierecitire; n funct ie de simbolul citit, masina Turing trece ntr-o noua stare
interna, scrie pe banda un nou simbol (ntotdeauna diferit de blanc) n locul
simbolului citit si mut a banda cu o pozit ie (spre stanga sau dreapta) sau o lasa
6.2. MASINA TURING 127
pe loc. Convent ional, vom nota cu +1 o miscare spre stanga, cu 1 spre dreapta
si cu 0 pe loc.
Din punct de vedere matematic, o masina Turing este un sistem
MT = (, I, f, s
0
,
f
)
unde:
este mult imea de stari;
I este alfabetul de intrare;
f : ( I)

(I ) 1, 0, 1, ( I)

I,
este funct ia de evolut ie;
s
0
este simbolul de start;

f
este mult imea de stari nale.
Observat ie. Funct ia f nu este denita pe ntregul produs I; daca masina
ajungentr-o stare s iar n dreptul dispozitivului de scrierecitire se aa simbolul i
si (s, i) , (I)

spunem ca masina se blocheaza. Exista si alte cazuri de blocare,


de exemplu situat ian care dispozitivul de scrierecitire se aan dreptul primului
simbol, iar pasul de funct ionare prevede o miscare a benzii spre dreapta.
O stare (sau congurat ie) a unei masini Turing este un triplet de forma =
(s, p, n) unde s este starea intern a, p este cuvantul scris pe banda iar n este
indicele simbolului din dreptul dispozitivului de scrierecitire.
Vom spune ca starea
1
= (s
1
, p
1
, n
1
) evolueaza direct n starea
2
= (s
2
, p
1
, n
2
)
si vom scrie
1

2
daca se efectueaza un pas de evolut ie.

In termenii funct iei
de evolut ie, avem
(1)f(s
1
, i
n
1
) = (s
2
, i, +1), p
2
= i
1
. . . i
n
1
1
ii
n
1
+1
. . . i
m
, n
2
= n
1
+ 1;
(2)f(s
1
, i
n
1
) = (s
2
, i, 1), p
2
= i
1
. . . i
n
1
1
ii
n
1
+1
. . . i
m
, n
2
= n
1
1;
(3)f(s
1
, i
n
1
) = (s
2
, i, 0), p
2
= i
1
. . . i
n
1
1
ii
n
1
+1
. . . i
m
, n
2
= n
1
;
(4)f(s
1
, ) = (s
2
, i, +1), p
2
= p
1
i, n
2
= n
1
+ 1;
(5)f(s
1
, ) = (s
2
, i, 1), p
2
= p
1
i, n
2
= n
1
1;
(6)f(s
1
, ) = (s
2
, i, 0), p
2
= p
1
i, n
2
= n
1
;
Vom spune ca

evolueaza (far a specicat ia direct) n

si vom nota

daca

sau daca exista


1
, . . . ,
n
astfel ncat

=
1

2
. . .
n
=

.
Limbajul recunoscut de o masin a Turing este prin denit ie
L(MT) = p[p I

, (s
0
, p, 1)

(s, q, ), s
f
.
Observat ie. Este posibil ca masina sa ajunga ntr-o stare nala nainte de
citirea integral a a lui p; analiza starii nale trebuie facut a numai dupa parcurgerea
cuvantului.
Exemplu. Consideram masina turing MT = (, I, f, s
0
,
f
) unde = s
0
, s
1
, s
2
,
I = 0, 1,
f
= s
1
iar funct ia de evolut ie este data de
128 CAPITOLUL 6. MASINA TURING
f s
0
s
1
s
2
(s
2
, 1, 1) (s
0
, 0, 1)
0 (s
1
, 0, 1)
1 (s
0
, 1, 1) (s
0
, 0, 1)
Evolut ia masinii pentru p = 001 este
(s
0
, 011, 1)(s
1
, 011, 2)(s
0
, 001, 3)(s
0
, 001, 4)
(s
2
, 0011, 5)(s
0
, 0011, 4)(s
0
, 00110, 5)(s
1
, 00110, 6)
Se poate observa ca dupa citirea ntregului cuvant masina poate sa efectueze
un numar de pasi suplimentari pan a la ajungerea ntr-o stare nala, deci este
posibil ca [p[ < [q[.
Situat ii n care o masina Turing se blocheaza (n aceste situat ii cuvantul scris
pe banda nu este recunoscut):
1. MT ajunge ntr-o stare s, n dreptul dispozitivului de citirescriere se aa
simbolul i si (s, i) , ( I)

;
2. MT esten starea s, a citit simbolul din prima pozit ie i si f(s, i) = (s

, i

, 1);
3. MT efectueaza un ciclu innit n interiorul cuvantului.
Denit ie 6.1 Vom spune ca o masina Turing este nestat ionara daca
f : ( I)

(I ) 1, +1.
Prin urmare, o masin a Turing nestat ionara nu lasa n nici o situat ie banda pe
loc.
Lema 6.1 Orice masina Turing este echivalenta cu o masina Turing nestat io-
nara.
Demonstrat ie. Pornind de la o MT data construim o MT

nestat ionara astfel:


Daca f(s, i) = (s

, i

, 1) vom pune f

(s, i) = f(s, i);


Daca f(s, i) = (s

, i

, 0) vom pune f

(s, i) = (s

, i

, 1) si f

(s

, j) = (s

, j, +1), j
I, unde s

este o stare nou introdusa.


Astfel, n cazul unei ram aneri pe loc a lui MT, noua masin a va face un pas
spre stanga si unul spre dreapta, far a sa modice nici starea si nici cont inutul
benzii. Evident, cele doua masini sunt echivalente.
Limbajele recunoscute de masini Turing.
Teorema 6.2 Un limbaj este recunoscut de o masina Turing daca si numai daca
este de tipul zero.
6.2. MASINA TURING 129
Demonstrat ie. Partea I. E = L(MT) E /
0
.
Fie MT = (, I, f, s
0
,
f
) o masin a Turing astfel ncat E = L(MT). Putem
presupune ca MT este nestat ionar a. Fie I

= (I ) .
Construim o gramatica de tipul zero astfel: G = (V
N
, V
T
, S, P) unde
V
N
= (i, j)[i I

, j I S, X
1
, X
2
; V
T
= I .
Denit ia lui P:
S s
0
X
1
, X
1
(i, i)X
1
, i I ,
X
1
X
2
, X
2
(, )X
2
, X
2
,
daca f(s, i) = (s

, i

, 1) atunci s(i
1
, i) (i
1
, i

)s

, i
1
I

,
daca f(s, i) = (s

, i

, 1) atunci (i
1
, i
2
)s(i
3
, i) s

(i
1
, i
2
)(i
3
, i

), i
1
, i
3
I

, i
2

I,
daca s
f
, atunci s(i
1
, i
2
) si
1
s si (i
1
, i
2
)s si
1
s.
Fie p L(MT), p = i
1
. . . i
n
. Presupunem ca MT utilizeaza n recunoastere
m pozit ii de pe banda situate la dreapta cuvantului p.

In G avem
Ss
0
X
1

s
0
(i
1
, i
1
) . . . (i
n
, i
n
)X
2

s
0
(i
1
, i
1
) . . . (i
n
, i
n
)(, )
m
.
Cuvantul p ind recunoscut de MT avem
(1) (s
0
, i
1
. . . i
n
, 1)

(s
f
, i

1
. . . i

h
, k), h n.
Vom arata ca (1) implica existent a unei derivari de forma
2)s
0
(i
1
, i
1
) . . . (i
n
, i
n
)(, )
m

(i
1
, i

1
) . . . (i
k1
, i

k1
)s
f
(i
k
, i

k
) . . . (i
n+m
, i

n+m
),
unde
i
1
, . . . , i
n
I , i
n+1
, . . . , i
n+m
= ,
i

1
, . . . , i

h
I , i

h+1
, . . . , i

n+m
= .
Demonstrat ie prin induct ie asupra lungimii l a evolut iei.
Pentru l = 0 avem
(s
0
, i
1
. . . i
n
, 1)

(s
0
, i
1
. . . i
n
, 1), k = 1, h = n, i

j
= i
j
.
Partea dreapta a lui 2) va avea forma s
0
(i
1
, i
1
) . . . (i
n
, i
n
)(, )
m
si deci 2) este
adevarat a.
Presupunem ca implicat ia este adevarat a pentru l oarecare si consideram o
evolut ie de lungime l + 1. Punem n evident a ultima evolut ie directa
(s
0
, i
1
. . . i
n
, 1)

(s, i

1
. . . i

g
, j)(s
f
, i

1
. . . i

h
, k).

In general h = g sau h = g + 1 n conformitate cu urmatoarele doua cazuri


(gura 6.2).
130 CAPITOLUL 6. MASINA TURING
i"
1
i"
2
i"
3
i"
g
. . .
s
i"
1
i"
2
i"
3
i"
g
. . .
s
h =g g + 1 h =
Figura 6.2: Congurat ii posibile ale masinii Turing

Intotdeauna k = j 1. apoi i

t
= i

t
, t = 1, . . . , g, t ,= j, adica
i

1
, i

2
, . . . , i

j1
, i

j
, i

j+1
, . . . , i

g
;
i

1
, i

2
, . . . , i

j1
, i

j
, i

j+1
, . . . , i

g
.

In urma ultimei evolut ii directe vor diferi numai simbolurile i

j
, i

j
.
Din ipoteza inductiva rezulta
s
0
(i
1
, i
1
) . . . (i
n
, i
n
)(, )
m

(i
1
, i

1
) . . . (i
j1
, i

j1
)s(i
j
, i

j
) . . . (i
n+m
, i

n+m
).

In conformitate cu denit ia evolut iei directe avem


f(s, i

j
) = (s
f
, i

j
, 1), k = j + 1, s(i
j
, i

j
) (i
j
, i

j
)s
f
;
f(s, i

j
) = (s
f
, i

j
, 1), k = j 1, (i
j1
, i

j1
)s(i
j
, i

j
) s
f
(i
j
, i

j1
)(i
j
, i

j
).

In ambele cazuri
s
0
(i
1
, i
1
) . . . (i
n
, i
n
)(, )
m

(i
1
, i

1
) . . . (i
k1
, i

k1
)s
f
(i
k
, i

k
) . . . (i
n+m
, i

n+m
).
Acum, deoarece s
f

f
, putem scrie
S

s
0
(i
1
, i
1
) . . . (i
n
, i
n
)(, )
m

(i
1
, i

1
) . . . (i
k1
, i

k1
)s
f
(i
k
, i

k
) . . . (i
m+n
, i

m+n
)
(i
1
, i

1
) . . . (i
k1
, i

k1
)s
f
i
k
s
f
(i
k+1
, i

k+1
) . . . (i
m+n
, i

m+n
)
(i
1
, i

1
) . . . (i
k2
, i

k2
)s
f
i
k1
s
f
i
k
s
f
i
k+1
s
f
(i
k+2
, i

k+2
) . . . (i
m+n
, i

m+n
)

s
f
i
1
s
f
i
2
s
f
. . . s
f
i
n
s
f

i
1
. . . i
n
= p.
Prin urmare p L(G) si L(MT) L(G). Analog se arata si incluziunea invers a
si deci L(MT) = L(G).2
Bibliograe
1. Octavian C. Dogaru, Bazele informaticii. Limbaje formale, Tipograa Uni-
versitat ii din Timisoara, 1989.
6.2. MASINA TURING 131
2. Gheorghe Grigoras, Limbaje formale si tehnici de compilare, Tipograa
Universit at ii Alexandru Ioan Cuza, Iasi, 1984.
3. J. E. Hopcroft si J. D. Ullman, Introduction to Automata Theory, Languages
and Computation, Reading Mass., 1979.
4. Solomon Marcus, Gramatici si automate nite, Editura Academiei, Bu-
curesti, 1964.
5. Stefan Maruster, Curs de Limbaje formale si tehnici de compilare, Ti-
pograa Universitat ii din Timisoara, 1980.
6. Gheorghe Orman, Limbaje formale, Editura tehnica, Bucuresti, 1982.
7. Gheorghe Paun, Probleme actuale n teoria Limbajelor formale, Editura
Stiint ica si Enciclopedica, Bucuresti, 1984.
8. Teodor Rus, Mecanisme formale pentru specicarea limbajelor, Editura Academiei,
Bucuresti, 1983.
9. Arto Salomma, Formal languages, Academic Press, New York, 1973.
10. Dan Simovici, Limbaje formale si tehnici de compilare, Editura didactica si
pedagogica, Bucuresti, 1978.
11. Luca Dan Serbanat i, Limbaje de programare si compilatoare, Editura Academiei,
Bucuresti, 1987.