Limbaje Limba je Formale ¸si si Tehnici de Compilare Compil are Dr˘agan agan Mircea April 19, 2006
1
˘ PREFAT ¸ A Materialul prezentat constituie notele de curs ¸inute t student¸ilor ¸ilor din primii doi ani la Sect¸ia ¸ia Informatic Infor matic˘˘a a Facult˘ acultat a˘¸ii ¸t ii de Matematic˘ a ¸si si Informatic Infor matic˘ a˘ de la Universitate Universi tateaa de Vest Timi¸soara. soara . ˆIn primul capitol, Introducere se Introducere se trec ˆın revist˘ a not¸iunile ¸iunile fundamentale din teoria limbajelor formale ¸si se prezint˘ a problema general˘ a a compil˘arii. arii. Capitolul al doilea, Limbaje regulate regulate ¸si si analiza anali za lexical˘ a , prezint˘ a chestiunile teoretice fundamentale privind teoria automatelor ¸si si echiv e chivalent alent ¸a cu limbajele de tipul trei, propriet˘ at a¸i ¸ti speciale ¸si si mecanisme mecan isme echivalente cu automatele au tomatele finite. Sunt prezentate de d e asemenea ¸si si principiile analizei lexicale, finalizate cu realizarea unui analizor lexical. lexical. Capitolul al treilea, Limbaje independente de context context este dedicat studiului teoretic al mecanismelor mecanismelor de generare ¸si si de recunoa¸ recunoa¸stere stere a limbajelor limbajelor de tipul doi. Sunt prezentate prezentate formele normale ale gramaticilor gramaticilor independente independente de context context ¸si cateva aˆteva propriet˘ at a¸i ¸t i speciale. Capitolul patru, patru, Analiza sintactic˘ a este dedicat prezent˘ arii arii principiilor generale de analiz˘ a sintactic˘ a ¸si si a algoritmilor specializat¸i ¸i de analiz˘ analiz ˘a. a. Pentru fiecare fieca re tip de algoritm analizat s-au considerat exemple practice de aplicare. Capitolul al cincilea, Sinteza cincilea, Sinteza programelor trateaz˘ trat eaz˘a formele for mele intermediare interme diare uzuale uzua le pentru pentru traducer traducerea ea programe programelor lor ¸si si generare generareaa codului codului obiect obiect pornind pornind de la formatul intermediar. Pentru cazul expresiilor aritmetice sunt prezentat¸i ¸si si algo al gori ritm tmii direct¸i ¸i de generarea a formatului intermediar, ˆımpreun˘ a cu proceduri standard de optimizare a codului generat. Ultimul capitol, Ma¸sina si na Turing Turin g prezint˘ a succint mecanismul formal ce define¸ste ste modelul de calculabilitate. La sfˆar¸ ar¸situ si tull fiec˘ fie c˘arui arui capitol sunt date cˆ ateva ateva exercit¸ii ¸ii (nerezolvate), aplicat¸ii ¸ii directe la chestiunile teoretice prezentate. prez entate. Acestea pot fi parcurse par curse ˆın cadrul orelor de seminar semina r ¸si si laborator labo rator.. ˆIn expunerea algoritmilor algoritmilor s-a folosit un limbaj mai put¸in rigid, f˘ar˘ ar˘a prea multe multe reguli stricte. ˆIn general s-a urm˘arit arit descrierea cˆ at at mai simpl˘a a structurilor care apar apa r ˆın text. tex t.
2
Cuprins 1 Introducere 1.1 Limba je formale . . . . . . . . . . . . 1.2 Gramatici generative de tip Chomsky 1.3 Ierarhia Chomsky . . . . . . . . . . . 1.4 Traducerea programelor . . . . . . . 1.5 Probleme propuse . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
2 Limbaje Regulate ¸si Analiza Lexical˘ a 2.1 Automate finite ¸si limbaje regulate . . . . 2.2 Propriet˘ a¸ti speciale ale limbajelor regulate 2.3 Expresii regulate s¸i sisteme tranzit ¸ionale . 2.4 Analiza lexical˘ a . . . . . . . . . . . . . . . 2.5 Probleme propuse . . . . . . . . . . . . . . 3 Limbaje Independente de Context 3.1 Arbori de derivare . . . . . . . . . 3.2 Ambiguitate ˆın familia L 2. . . . . . 3.3 Forme normale pentru gramatici de 3.4 Lema Bar–Hillel . . . . . . . . . . . 3.5 Automate push-down (APD) . . . . 3.6 Automate push–down deterministe 3.7 Probleme propuse . . . . . . . . . .
. . . . . . . . tipul 2 . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . . . .
. . . . .
. . . . .
. . . . . . .
. . . . .
. . . . .
. . . . . . .
. . . . .
. . . . .
. . . . . . .
. . . . .
. . . . .
. . . . . . .
. . . . .
. . . . .
. . . . . . .
. . . . .
. . . . .
. . . . . . .
. . . . .
. . . . .
. . . . .
23 . . . . . 23 . . . . . 29 . . . . . 34 . . . . . 37 . . . . . 48
. . . . . . .
51 51 54 56 62 65 73 76
. . . . . . .
4 Analiza Sintactic˘ a 4.1 Algoritmi TOP-DOWN . . . . . . . . . . . . . . . . . . . . 4.1.1 Algoritmul general de analiz˘ a top-down . . . . . . . 4.1.2 Analiza top-down f˘ ar˘a reveniri . . . . . . . . . . . . 4.1.3 Programarea unui analizor sintactic. Studiu de caz 4.2 Algoritmi BOTTOM-UP . . . . . . . . . . . . . . . . . . . 4.2.1 Gramatici cu precedent¸a˘ simpl˘a . . . . . . . . . . . 4.2.2 Relat¸ii de precedent¸˘a . . . . . . . . . . . . . . . . . 4.2.3 Propriet˘ a¸t i ale gramaticilor cu precedent¸a˘ simpl˘a . 3
. . . . .
. . . . . . .
. . . . .
. . . . . . .
. . . . .
. . . . . . .
. . . . .
5 5 8 12 17 20
. . . . . . .
79 . . . . 80 . . . . 80 . . . . 81 . . . . 84 . . . . 90 . . . . 90 . . . . 92 . . . . 93
4 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8 4.2.9
CUPRINS
Determinarea relat¸iilor de precedent¸a˘ pentru gramatici cu precedent¸a˘ simpl˘a . . . . . . . . . . . . . . . . . . . . . . . 95 Studiu de caz . . . . . . . . . . . . . . . . . . . . . . . . . 95 Gramatici operatoriale . . . . . . . . . . . . . . . . . . . . 97 Gramatici operatoriale . . . . . . . . . . . . . . . . . . . . 100 Determinarea relat¸iilor de precedent ¸˘ a pentru gramatici operatoriale . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Studiu de caz . . . . . . . . . . . . . . . . . . . . . . . . . 104
5 Sinteza Programelor 5.1 Forme interne ale programelor . . . . . . . . . . . . . . . . 5.1.1 Tabelele compilatorului . . . . . . . . . . . . . . . . 5.1.2 Cvadruple ¸si triplete . . . . . . . . . . . . . . . . . 5.2 Generarea formatului intermediar . . . . . . . . . . . . . . 5.2.1 Generarea cvadruplelor . . . . . . . . . . . . . . . . 5.2.2 Generarea tripletelor . . . . . . . . . . . . . . . . . 5.2.3 Generarea ¸sirului polonez . . . . . . . . . . . . . . 5.3 Generarea formatului intermediar pentru instruct ¸ii clasice . 5.3.1 Instruct¸iunea de atribuire . . . . . . . . . . . . . . 5.3.2 Instructiunea If . . . . . . . . . . . . . . . . . . . . 5.3.3 Variabile indexate . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
107 107 107 109 114 115 117 118 121 121 121 121
6 Masina Turing 123 6.1 Limbaje de tipul zero . . . . . . . . . . . . . . . . . . . . . . . . . 123 6.2 Ma¸sina Turing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Capitolul 1 Introducere 1.1
Limbaje formale
Not¸iunea general˘ a de limbaj. Se nume¸ste alfabet sau vocabular orice mult¸ime finit˘a ¸si nevid˘ a. Elementele unui alfabet V le vom numi simboluri (sau litere, caractere, variabile). Definit¸ie 1.1 Un cuvˆ ant peste un alfabet V este o secvent ¸˘ a p = a 1 a2 . . . an , ai ∈ V, i = 1, . . . , n. Num˘arul n, deci num˘arul simbolurilor cuvˆantului p, se nume¸ste lungimea cuvˆantului ¸si va fi notat cu | p| sau l( p). Vom considera ¸si cuvˆ antul vid λ sau e, care nu cont¸ine nici un simbol; evident | λ| = 0. Not¸iunea de cuvˆ ant este fundamental˘ a ˆın teoria limbajelor formale sau ˆın alte domenii ale informaticii; termeni sinonimi utilizat¸i ˆın literatur˘ a sunt propozit ¸ie, fraz˘ a sau ¸sir . S˘a observ˘ am c˘a nu exist˘ a o similitudine foarte bun˘a ˆıntre not¸iunile de ”alfabet”, ”cuvˆ ant”, etc. din teoria limbajelor formale ¸si not ¸iunile corespunz˘atoare din lingvistic˘a. Mult¸imea tuturor cuvintelor peste un alfabet V o not˘ a m cu V +. Aceast˘ a ∗ ˆ mult¸ime ˆımpreun˘a cu cuvˆantul vid va fi notat˘a cu V . In general, vom utiliza litere mari de la sfˆ ar¸situl alfabetului pentru notarea diverselor alfabete, U,V,W, etc.; litere de la ˆınceputul 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 sfˆar¸situl alfabetului, p,q, r, s, t, u, v,w,x,y,z, etc. (aceast˘a convent¸ie de notare nu va fi absolut˘ a). Fie p = a1 . . . an , q = b1 . . . bm . Definim pe mult¸imea V ∗ operat¸ia de concatenare sau juxtapunere prin pq = a 1 . . . an b1 . . . bm . Se poate verifica u¸sor c˘ a aceast˘ a operat¸ie este asociativ˘ a . Prin urmare, + mult¸imea V ˆınzestrat˘a cu aceast˘ a operat¸ie este un semigrup (semigrupul liber ∗ peste V ). Mult¸imea V cu aceia¸si operat¸ie este un semigrup cu unitate, deci un monoid, unitatea fiind cuvˆ antul vid (monoidul liber peste V ). Structura are ¸si 5
CAPITOLUL 1. INTRODUCERE
6
proprietatea de simplificare la stˆ anga ¸si la dreapta, adic˘ a: ua = ub ⇒a = b, respectiv, au = bu ⇒a = b, ∀a,b,u ∈ V ∗ Fie din nou p, q ∈ V ∗ . Vom spune c˘ a q este un subcuvˆat sau un infix (propriu) ∗ al lui p dac˘ a p = uqv, u, v ∈ V (u, v ∈ V +); q este prefix (propriu) al lui p dac˘ a ∗ + ∗ a p = uq, u ∈ V (u ∈ p = qv, v ∈ V (v ∈ V ); q este sufix (propriu) al lui p dac˘ V + ).
Definit¸ie 1.2 Un limbaj L peste alfabetul V este o parte a mult ¸imii tuturor ∗ cuvintelor peste V , deci L ⊆ V . S˘a observ˘ a m c˘a V ∗ (sau V + ) este ˆıntotdeauna o mult ¸ime infinit˘a (evident num˘arabil˘a); ˆın aceast˘ a accept¸iune general˘ a , un limbaj poate s˘a fie o mult¸ime finit˘a sau infinit˘a, uneori chiar vid˘ a. 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 L1 = {λ, 00, 11}, L2 = {1, 11, 111, . . .} = {1n |n ≥ 1 }. Observat ¸ie . Notat¸ia an , unde a este un simbol al unui alfabet, ˆınseamn˘ a cuvˆatul constituit din n simboluri a, adic˘a aa . . . a . ˆIn particular a0 = λ. Operat¸ii cu limbaje Limbajele fiind mult¸imi se pot efectua cu limbaje operat¸iile obi¸snuite cu mult¸imi: reuniune, intersect ¸ie, diferent ¸˘ a, complementariere ∗ (fat ¸˘ a de V ). Exist˘a ¸si operat¸ii specifice limbajelor. ˆIn general, o operat¸ie de n-aritate oarecare (cel mai adesea binar˘a sau unar˘ a) ∗ pe mult¸imea V define¸ste o operat¸ie corespunz˘atoare pe mult ¸imea limbajelor. Astfel, dac˘a α : V ∗ −→ P (V ∗ ) ¸si β : V ∗ × V ∗ −→ P (V ∗ )
sunt dou˘ a operat¸ii pe V ∗ (unar˘a ¸si respectiv binar˘ a) ¸si L1 , L2 sunt dou˘ a limbaje peste V , putem defini limbajele α(L1 ) respectiv β (L1 , L2 ) prin α(L1 ) =
x∈L1
Exemple :
α(x), β (L1, L2) =
x∈L1 ,y ∈L2
β (x, y).
1.1. LIMBAJE FORMALE
7
1. Produsul (concatenarea) a dou˘ a limbaje definit prin L1 L2 = { pq | p ∈ L 1 , q ∈ L 2 }. Dac˘a L1 = L2 = L vom nota LL = L2 . Prin recurent¸a˘, se define¸ste Ln astfel L0 = {λ}, Lk = L k−1 L, k ≥ 1. ˆ 2. Inchiderea (Kleene) a unui limbaj L este ∞
∗
L =
Lk .
k=0
3. Limbajul Sub(L). Fie V ∗ ¸si Sub(x) mult¸imea tuturor subcuvintelor lui x (evident S ub este o operat¸ie unar˘ a pe V ∗ ). Dac˘a L este un limbaj peste V , putem defini limbajul
Sub(L) =
{Sub(x)}.
x∈L
adic˘a limbajul constituit din toate subcuvintele tututor cuvintelor lui L. Semnificat¸ii analoage vor avea ¸si limbajele Pref (L) ¸si Suf (L). 4. Limbajul Mi(L). Fie x = a 1 . . . an un cuvˆant peste alfabetul V . Cuvˆantul asturnatul sau oglinditul lui x (M i este presMi(x) = a n . . . a1 se nume¸ste r˘ curtarea cuvˆ antului englez mirror ) . Se mai noteaz˘ a Mi(x) = x˜. Avem atunci ¸si r˘asturnatul unui limbaj Mi(L) =
{M i(x)}.
x∈L
5. Operat¸ia de substitut ¸ie . Fie U ¸si V dou˘a alfabete ¸si fie aplicat¸ia s : V −→ ∗ a aplicat¸ie la V ∗ prin P (U ). Extindem (prelungim) aceast˘ s(λ) = {λ}, s(xy) = s(x)s(y), ∀x, y ∈ V ∗ . O astfel de prelungire se nume¸ste canonic˘ a ; ea p˘ astreaz˘a operat¸ia de concatenare, ˆın sensul c˘ a dac˘a p = xy, atunci s( p) = s(x)s(y) este concatenarea limbajelor s(x), s(y). Operat¸ia de substitut¸ie a limbajelor este dat˘ a de s(L) =
s(x).
x∈L
S˘a observ˘ a m c˘a aceast˘ a operat¸ie transform˘ a un limbaj peste un alfabet V ˆıntr-un limba j peste un alfabet U ¸si c˘a p˘ astreaz˘a operat¸ia de concatenare. Dac˘a card(a) < ∞ , ∀a ∈ V , vom spune c˘a substitut¸ia este finit˘ a, iar dac˘a card(a) = 1, ∀a ∈ V vom spune c˘a s este un homomorfism. Operat¸iile reuniune, produs ¸si ˆınchidere Kleene se mai numesc operat¸ii regulate asupra limbajelor.
CAPITOLUL 1. INTRODUCERE
8
1.2
Gramatici generative de tip Chomsky
Un limbaj peste un alfabet poate s˘ a fie o mult¸ime finit˘a sau infinit˘a. Dac˘ a este o mult¸ime finit˘a, el poate fi definit prin scrierea efectiv˘ a a cuvintelor limbajului. ˆIn cazul ˆın care este o mult¸ime infinit˘a, el poate fi definit ˆın anumite cazuri punˆ and ˆın evident¸a˘ structura cuvintelor lui. De exemplu L2 = {01, 0011, 000111, . . .} = { 0n 1n |n ≥ 1 }. Exist˘a dou˘ a procedee mai generale pentru definirea limbajelor: 1. Procedee generative , care permit generarea tuturor cuvintelor limbajului. Exist˘a mai multe tipuri de mecanisme de generare a limbajelor, ˆıntre care gramaticile Chomsky, sisteme Lindenmayer,etc. 2. Procedee analitice , care determina dac˘ a un cuvˆ a nt dat apart¸ ine sau nu limbajului. Sunt a¸sa-numitele automate, automate finite, automate pushdown , etc. Un rol deosebit ˆın teoria limbajelor formale ˆıl au gramaticile Chomsky. Not¸iunea de gramatic˘ a Fie V N ¸si V T dou˘a alfabete disjuncte,V N ∩ V T = ∅ numite respectiv alfabetul simbolurilor neterminale (V N ) ¸si alfabetul simbolurilor terminale (V T ). Not˘ am V G = V N ∪ V T alfabetul general ¸si P ⊂ V G∗ V N V G∗ × V G∗ alfabetul regulilor . Mult¸imea P va fi deci format˘ a din perechi de forma (u, v), unde u = u Au , u , u ∈ V G∗ , A ∈ V N iar v ∈ V G∗ , deci u ¸si v sunt cuvinte peste V G , cu observat¸ia c˘a u trebuie s˘a cont¸in˘a cel put¸in un simbol neterminal. Vom spune c˘a o astfel de pereche este o regul˘ a de rescriere) ¸si o a (product¸ie, regul˘a de generare, regul˘ vom nota u → v (vom spune: u se transform˘ a ˆın v). Apartenent¸a unei reguli la P o vom nota ˆın mod obi¸snuit (u → v) ∈ P , sau mai simplu, u → v ∈ P (nu va exista confuzia cu faptul c˘ a v este un element al lui P ). a este un sistem G = (V N , V T , X 0 , P ), unde V N este Definit¸ie 1.3 O gramatic˘ alfabetul simbolurilor neterminale, V T este alfabetul simbolurilor terminale, X 0 ∈ ¸imea de reguli. V N ¸si se nume¸ste simbol de start al gramaticii, iar P este mult 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 gramatic˘ a ¸si p, q ∈ V G∗ . Vom spune c˘ a p se deriveaz˘a direct ˆın q ¸si vom scrie p ⇒ q (sau mai simplu p⇒q ) dac˘ a exist˘a cuvintele r,s,u,v ∈ V G∗ G
a ˆın p astfel ˆıncˆıt p = rus, q = rvs iar u → v ∈ P . Vom spune c˘ a p se deriveaz˘ (f˘ar˘a specificat¸ia direct) dac˘ a exist˘a p1 , p2 , . . . , pn n ≥ 1 astfel ˆıncˆ at p = p 1 ⇒ p2 ⇒ . . . ⇒ pn = p . G
G
G
1.2. GRAMATICI GENERATIVE DE TIP CHOMSKY +
9
+
Vom scrie p ⇒ p (sau p ⇒ p cˆand nu exist˘a nici o confuzie) dac˘ a n>1 G
∗
∗
¸si p ⇒ p (sau p ⇒ p ) dac˘ a n ≥ 1. S¸irul de mai sus va fi numit derivare iar G
num˘arul de deriv˘ ari directe din ¸sir ˆıl vom numi lungimea deriv˘ arii ; se mai spune c˘a p deriv˘ a ˆın p . + ∗ S˘a observ˘am c˘ a transform˘ arile astfel definite ⇒, ⇒, ⇒ sunt relat¸ ii pe V G∗ . + ∗ Este clar c˘ a relat¸ia ⇒ este ˆınchiderea tranzitiv˘ a a relat¸iei ⇒, iar relat¸ia ⇒ este ˆınchiderea tranzitiv˘a ¸si reflexiv˘a a relat¸iei de transformare direct˘ a.
Definit¸ie 1.4 . Limbajul generat de gramatica G este prin definit ¸ie mult ¸imea ∗
L(G) = { p ∈ V T ∗ , X 0 ⇒ p}. G
∗
Observat ¸ie . Dac˘ a p ∈ V G∗ ¸si X 0 ⇒ p se spune c˘ a p este o form˘ a propozit ¸ional˘ a G
ˆı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 aceast˘ a gramatic˘ a este, de exemplu A⇒0A1⇒00A11⇒000111 = 03 13 . Este evident c˘ a L(G) = {0n 1n |n ≥ 1 }. Observat ¸ie . ˆIn cazul ˆın care mai multe reguli au aceea¸si parte stˆ ang˘a , le vom scrie compact astfel u → v 1 |v2 | . . . |vn , simbolul | avˆ and sensul de sau; ˆın cazul nostru, A → 0A1|01. 2. G = (V N , V T , X 0 , P ), unde V N = {
, , , , , , , , }, V T = { o, orice, matrice, funct¸ie, derivabil˘a, continu˘ a, este }, X 0 =, P = {→, →, →, →, →, →o|orice, →matrice|funct¸ie, a, →derivabil˘a|continu˘ →este. Observat ¸ie . ˆIn acest exemplu, ””, ””, etc., reprezint˘ a fiecare cˆ ate un simbol neterminal; de asemenea, ”o”, ”orice”, ”matrice”,
10
CAPITOLUL 1. INTRODUCERE etc., reprezint˘ a simboluri terminale. Se poate u¸sor observa c˘ a aceast˘ a gramatic˘a genereaz˘ a propozit¸ii simple de forma subiect-atribut-predicatcomplement care exprim˘ a judec˘a¸t i asupra conceptelor de ”matrice” ¸si ”funct¸ie”. De exemplu, se poate forma propozit¸ia: ”orice funct¸ie derivabil˘a este continu˘ a”, care este din punct de vedere semantic corect˘ a, precum ¸si propozit¸ia ”orice funct¸ie continu˘ a este derivabil˘ a”, care, dup˘ a cum se ¸stie, este fals˘ a. Evident, se pot genera ¸si numeroase propozit¸ii care nu au sens. Ceea ce ne intereseaz˘ a ˆın acest moment este aspectul formal, deci din punct de vedere sintactic toate aceste propozit¸ii sunt corecte; semantic, unele propozit¸ii pot s˘a fie incorecte sau chiar s˘ a nu aibe sens. S˘a mai observ˘ a m c˘a o gramatic˘ a Chomsky este ˆın m˘ asur˘a s˘a constituie un model matematic pentru sintaxa unei limbi, f˘ ar˘a s˘a intereseze aspectele semantice. Este ceea ce a ˆıncercat s˘a fac˘ a Naom Chomsky pentru limba englez˘a ˆın lucr˘ arile sale din anii 50. 3. G = (V N , V T , X 0 , P ), unde V N = {, , , , , , , , }, V T = {begin, end, if, then, stop, t, i, +, *, (, ), =, ,, ; } , X 0 = P = { →begin end →; | → | | stop a>= →→if( ) then → + | → ∗ | →()| a>→t()|i →, | Gramatica din acest exemplu define¸ste un limbaj de programare simplu cu trei tipuri de instruct¸ii: atribuiri, if-then, stop. Expresiile aritmetice au numai operatorii + ¸si *; variabilele pot fi simple sau indexate (tablouri), iar i ¸t ine loc de identificator sau constant˘ a. Ment¸ion˘ am c˘a definirea ˆın acest mod a unui limbaj, inclusiv utilizarea cro¸setelor pentru desemnarea simbolurilor neterminale, poart˘ a adesea denumirea de notat¸ie Backus Naur; ˆın acest mod s-a definit limbajul ALGOL60.
Tipuri de gramatici Dup˘a forma regulilor de generare, gramaticile Chomsky se ˆımpart ˆın mai multe tipuri; clasificarea obi¸snuit˘ a este urm˘atoarea:
• Gramatici de tipul 0 ; sunt gramatici f˘ar˘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 dac˘ a 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 sau C → q
A → pB C → q
cu A, B,C ∈ V N ¸si p, q ∈ V T ∗ . Vom nota cu L 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 ). S˘a observ˘ a m c˘a este important˘ a structura cuvintelor unui limbaj ¸si nu modul ˆın care sunt notate simbolurile terminale. De exemplu , limbajele L2 = {0n 1n |n ≥ 1 }, L2 = {an bn |n ≥ 1 } sunt ˆın mod practic identice. Putem utiliza o unic˘ a notat ¸ie pentru afabetul simbolurilor terminale , de exemplu , V T = {i1 , . . . , in }. Clasificarea de mai sus este fundamental˘ a ˆın teoria limbajelor formale, ea a fost introdus˘ a de Naom Chomsky in 1958 ¸si prin tradit¸ie noile clase de limbaje sunt raportate la aceast˘ a clasificare. O alt˘ a clasificare este urm˘ atoarea
• Gramatici de tipul 0 ; f˘ar˘a restrict¸ii; • Gramatici monotone (de tipul 1): u → v, |u| ≤ | v |, u, v ∈ V G∗;
• Gramatici dependente de context : = λ, A ∈ V N ; uAv → upv, u,p, v ∈ V G∗ , p
• Gramatici independente de context (de tipul 2): A → p, A ∈ V N , p ∈ V G∗ ;
CAPITOLUL 1. INTRODUCERE
12
• Gramatici liniare : A → uBv, A ∈ V N , B ∈ V N ∪ {λ} u, v ∈ V T ∗ ; ang) drept liniare : • Gramatici (stˆ A → uB (A → Bv), A ∈ V N , B ∈ V N ∪ {λ} u, v ∈ V T ∗ ;
• Gramatici regulate (de tipul 3); gramatici stˆang liniare sau gramatici drept liniare. Gramaticile monotone ca ¸si cele dependente de context nu pot avea reguli cu partea dreapt˘ a vid˘a . Se introduce urm˘ atoarea convent¸ie de completare: ˆıntro gramatic˘ a monoton˘ a sau dependent˘ a de context se admite o regula de forma A → λ cu condit ¸ia ca A s˘ a nu apar˘ a ˆın partea dreapt˘ a a vreunei reguli . Dup˘a cum vom vedea , existent¸a sau inexistent¸a regulilor de forma A → λ, reguli numite de ¸stergere, poate modifica esent ¸ial puterea generativ˘ a a unei gramatici. O gramatic˘ a ˆın care nu avem astfel de reguli o vom numi gramatic˘ a λ−liber˘ a ; de asemenea, un limbaj care nu cont¸ine cuvˆ antul vid, ˆıl vom numi limbaj λ−liber . S˘a mai observ˘ am c˘a existent¸a regulilor de ¸stergere ˆıntr-o gramatic˘ a nu implic˘a ˆın mod necesar existent¸a cuvˆ antului vid ˆın limbajul generat. Dou˘a gramatici care genereaz˘ a acela¸si limbaj se numesc echivalente. Gramaticile monotone ¸si gramaticile dependente de context sunt echivalente; de asemenea, gramaticile drept ¸si stˆ ang liniare sunt echivalente, justificˆ andu-se astfel clasa gramaticilor regulate.
1.3
Ierarhia Chomsky
Lemele care urmeaz˘ a vor avea o utilizare frecvent˘ a ˆın cele ce urmeaz˘ a.
Lema 1.1 (Lema de localizare a gramaticilor independente de context) Fie G o gramatic˘ a independent˘ a de context ¸si fie derivarea ∗
x1 . . . xm ⇒ p, unde x j ∈ V G , j = 1, m , p ∈ V G∗. Atunci exist˘ a p1 , p2 , . . . , pm ∈ V G∗ astfel ˆıncˆ at ∗
p = p 1 . . . pm si x j ⇒ p j , j = 1, m. Demonstrat ¸ie . Proced˘ am prin induct¸ie asupra lungimii deriv˘ arii l. Dac˘a l = 0 atunci p = x 1 . . . xm ¸si lu˘am p j = x j . Presupunem c˘ a proprietatea este adev˘ arat˘ a pentru deriv˘ ari de lungime l ¸si ∗ fie o derivare de lungime l + 1, x1 . . . xm ⇒ p. Punem ˆın evident¸a˘ ultima derivare
1.3. IERARHIA CHOMSKY
13
∗
∗
direct˘a x1 . . . xm ⇒q ⇒ p. Conform ipotezei inductive, q = q 1 . . . qm ¸si x j ⇒q j , j = 1, . . . , m. Fie apoi A → u regula care se aplic˘ a ˆın derivarea direct˘ a q ⇒ p ¸si s˘a presupunem c˘a A intr˘a ˆın subcuvˆ antul q k , deci q k = q k Aq k . Vom lua p j =
= k q j ,j q k uq k , j = k
∗
Este evident c˘ a x j ⇒ p j , j = k, iar pentru j = k avem ∗
xk ⇒q k = q k Aq k ⇒q k uq k = p k . Vom pune ˆın evident¸a˘ ˆın continuare o proprietate asupra structurii regulilor gramaticilor Chomsky. Partea dreapt˘ a a unei reguli, pentru toate tipurile de gramatici, este un cuvˆ ant format din terminale sau neterminale. Este convenabil de multe ori ca partea dreapt˘ a a regulilor s˘ a cont¸in˘a un singur tip de simboluri, terminale sau neterminale. Acest lucru este posibil f˘ ar˘a modificarea tipului gramaticii.
Lema 1.2 (Lema A → i) Fie G = (V N , V T , S , P ) o gramatic˘ a de tipul 2. Exist˘ a o gramatic˘ a G echivalent˘ a, de acela¸si tip, cu proprietatea c˘ a dac˘ a o regul˘ a are ˆın partea dreapt˘ a un terminal, atunci ea este de forma A → i, A ∈ V N , i ∈ V T . Demonstrat ¸ie . Lu˘am 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 regul˘ a din P care nu convine (punem ˆın evident¸˘ a aparit¸ia terminalelor din partea dreapt˘ a): u → v 1 i1 v2 i2 . . . in vn+1 , ik ∈ V T , vk ∈ V N ∗ . Vom introduce ˆın P urm˘atoarele reguli: u → v 1 X i v2 X i . . . Xi n vn+1 , X ik → i k , k = 1, n , 1
2
unde X ik sunt neterminale noi pe care le ad˘aug˘a m la V N . Este evident c˘ a G p˘astreaz˘a tipul lui G ¸si c˘a L(G ) = L(G). Observat ¸ie . Construct¸ia din lem˘a se poate extinde u¸sor la gramatici de tipul 0, ˆınlocuind ¸si terminalele din partea stˆ ang˘a a regulilor (u poate fi un ¸sir arbitrar ce cont¸ine minim un neterminal). Gramatica astfel obt¸inut˘a este echivalent˘ a cu cea init¸ial˘ a ¸si p˘astreaz˘a tipul. Ierarhia Chomsky. Este evident c˘a L 3 ⊂ L2 ¸si c˘a L1 ⊂ L0, deoarece orice regul˘a a unei gramatici de tipul 3 respect˘ a prescript¸iile unei gramatici de tipul 2; analog pentru familiile L1 ¸si L0. Aparent, o regul˘ a de forma A → p (de tipul 2) este un caz particular a unei reguli de forma uAv → upv (de tipul 1), pentru
CAPITOLUL 1. INTRODUCERE
14
u = v = λ; totu¸si, realitatea nu este aceasta, deoarece la tipul 2 de gramatici sunt permise reguli de ¸stergere, pe cˆ and la tipul 1 se impune condit¸ia p = λ. Vom ar˘ata c˘ a avem L 2 ⊂ L1. S¸irul de incluziuni
L3 ⊂ L2 ⊂ L1 ⊂ L0 poart˘ a denumirea de ierarhia Chomsky (vom ar˘ ata pe parcursul acestui curs c˘a incluziunile sunt stricte). Aceast˘ a ierarhie caracterizeaz˘ a puterea generativ˘ a a celor patru tipuri de gramatici, aceast˘ a putere fiind cresc˘ a toare de la 3 la 0. Orice alte mecanisme generative se raporteaz˘a la aceast˘ a ierarhie fundamental˘ a. Vom demonstra mai ˆıntˆai urm˘atoarea lem˘ a.
Lema 1.3 ( Lema elimin˘arii regulilor de ¸stergere). Orice limbaj independent de context λ-liber poate fi generat de o gramatic˘ a de tipul 2 f˘ ar˘ a reguli de ¸stergere. Demonstrat ¸ie . Fie G = (V N , V T , X 0, P ) o gramatic˘ a independent˘ a de context ¸si aλ ∈ L(G). Definim prin recurent¸˘a ¸sirul de L(G) limbajul generat. Prin ipotez˘ 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. S˘a observ˘ a m c˘a ¸sirul de mult¸imi definite este cresc˘ ator ˆın raport cu relat¸ia de incluziune. Cum toate aceste mult¸imi sunt incluse ˆın V N ¸si V N este finit˘ a, rezult˘ a c˘a exist˘a o mult¸ime maximal˘a 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 aceast˘ a implicat¸ ie cu un exemplu. S˘ a presupunem c˘ a U f = U 3 ¸si fie X ∈ U 3 . Atunci ˆın mod necesar trebuie s˘ a 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 1Y 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 ∗
∗
X ⇒X 1 X 2 ⇒Y 1 Y 2 Y 3 Z 1 Z 2 ⇒λ. Definim acum urm˘atoarea gramatic˘ a independent˘ a de context f˘ ar˘a reguli de ¸stergere G = (V N , V T , X 0, P ) unde V N , V T , X 0 sunt ca ˆın gramatica dat˘ a, iar P se construie¸ste pornind de la P astfel. Fie X → p ∈ P, p = λ. Includem atunci ˆın P aceast˘a regul˘a precum ¸si toate regulile de forma X → p j , unde p j se obt¸ine din p l˘asˆand la o parte, ˆın toate modurile posibile, simbolurile din U f (se except˘ a cazul p j = λ). De exemplu dac˘ a X → AB C ∈ P ¸si A, B ∈ U f , vom induce ˆın P regulile X → ABC, X → BC, X → AC, X → C.
1.3. IERARHIA CHOMSKY
15
S˘a observ˘ am c˘a ˆın acest fel mult¸imea P a fost pe de o parte mic¸sorat˘ a (au fost excluse regulile de alegere), iar pe de alt˘ a parte ˆımbog˘ a¸tit˘a cu eventualele noi reguli. S˘ a mai obsev˘ a m c˘a G este independent˘ a de context ¸si c˘ a nu cont¸ine reguli de ¸stergere. Vom ar˘ata c˘ a L(G) = L(G ). Mai ˆıntˆai, s˘a ar˘ at˘am c˘a L(G) ⊆ L(G ). ∗ ∗ Fie p ∈ L(G), deci X 0 ⇒ p; vom ar˘a ta c˘ a X 0 ⇒ p. Vom ar˘ ata o implicat¸ie G
G
∗
∗
G
G
ceva mai general˘ a, X ⇒ p implic˘a X ⇒ p, pentru orice X ∈ V N (relat¸ia cerut˘ a se obt¸ine pentru X = X 0 ). Proced˘ am prin induct¸ie asupra lungimii deriv˘ arii l. Dac˘a l = 1 avem = λ deci X → p ∈ P X ⇒ p deci X → p ∈ P. Dar p G
∗
adic˘a X ⇒ p. G
Presupunem c˘ a afirmat¸ia este adev˘ arat˘ a pentru l = n ¸si lu˘am o derivare cu lungimea l = n + 1. Punem ˆın evident¸a˘ prima derivare direct˘ a ∗
X ⇒ X 1 . . . Xm ⇒ p G
G
∗
Conform lemei de localizare avem p = p1 . . . pm ¸si X j ⇒ p j , j = 1, . . . , m. G
Unele din cuvintele p j pot s˘ a fie vide; pentru precizarea ideilor s˘a presupunem c˘a ∗ = 2, 3, 5, care au lungimea p2 , p3 , p5 = λ. Atunci pentru deriv˘arile X j ⇒ p j , j G
∗
de cel mult n, conform ipotezei inductive avem X j ⇒ p j . G
∗
∗
∗
G
G
G
Pe de alt˘a parte , pentru j = 2, 3, 5 avem X 2 ⇒ λ, X 3 ⇒ λ, X 5 ⇒ λ, deci X 2 , X 3 , X 5 ∈ U f . Rezult˘ a c˘a X → X 1 X 4X 6 . . . Xm ∈ P a¸sa ˆıncˆ at putem scrie ∗
X ⇒ X 1 X 4 X 6 . . . Xm ⇒ p1 p4 p6 . . . pm = p. G
G
∗
Deci X ⇒ p ¸si luˆand X = X 0 obt¸inem p ∈ L(G ). Prin urmare L(G) ⊆ L(G ). G
S˘a ar˘ at˘am acum incluziunea invers˘ a , L(G ) ⊆ L(G). ∗ Fie p ∈ L(G), X 0 ⇒ p. Punem ˆın evident¸a˘ o derivare direct˘ a oarecare G
∗
∗
X 0 ⇒ u ⇒ v ⇒ p. G
G
G
CAPITOLUL 1. INTRODUCERE
16
Dac˘a ˆın derivarea direct˘ a u ⇒ v se aplic˘a o regul˘ a care exist˘ a ¸si ˆın G, atunci G
evident pasul respectiv poate fi f˘ acut ¸si ˆın G. S˘a presupunem c˘ a se aplic˘ a o regul˘ a nou introdus˘ a de exemplu X → BC , deci pasul respectiv va avea forma u = u Xu ⇒ u BC u = v G
Regula X → BC ∈ P a provenit dintr-o regul˘a din P , l˘asˆand la o parte simboluri din U f , ˆın cazul nostru din X → AB C , l˘asˆandu-l la o parte pe A ∈ U f . Deoarece ∗ A ⇒ λ, avem G
∗
u = u Xu ⇒ u ABCu ⇒ u ABCu = v. G
G
Prin urmare orice pas al deriv˘ arii considerate se poate obt¸ine ¸si ˆın gramatica G, ∗ deci X 0 ⇒ p ¸si p ∈ L(G), adic˘a L(G ) ⊆ L(G). G
Teorema 1.1 L2 ⊆ L1 . Demonstrat ¸ie . Fie L ∈ L2 un limbaj independent de context ¸si G o gramatica de tipul 2 care ˆıl genereaz˘ a, adic˘a L = L(G). Presupunem c˘ a λ ∈ L. Construim gramatica G ca ˆın lema precedent˘ a; orice cuvˆant p = λ din L(G) se poate obt¸ine ˆın G ¸si invers , deci L(G ) = L(G) − {λ}. Consider˘am atunci o gramatic˘ a G = (V N ∪ {X 0 }, V T , X 0 , P ∪ {X 0 → λ, X 0 → X 0 }). Evident L(G ) = L(G). Toate regulile lui G respect˘ a tipul 1 (cu u = a regul˘ a de ¸stergere X 0 → λ iar X 0 nu apare ˆın partea v = λ) ¸si cont¸ine o singur˘ dreapt˘a a vreunei reguli. Deci G este de tipul 1 ¸si orice limbaj independent de context este inclus ˆın L 1 , adic˘a L 2 ⊆ L1 . Fiind dat˘a o operat¸ie binar˘ a notat˘ a cu ”•” pe o familie de limbaje L, vom spuna c˘ a familia L este ˆınchis˘a la operat¸ia ”•” dac˘ a L 1 , L2 ∈ L implic˘a L 1 • L2 ∈ L. Definit¸ia not¸iunii de ˆınchidere pentru operat¸ii unare sau cu aritate oarecare este analoag˘ a. Relativ la propriet˘ a¸t ile de ˆınchidere a familiilor din clasificarea Chomsky ment¸ion˘ am urm˘atorul rezultat. ¸iile regulate. Teorema 1.2 Familiile L j , j = 0, 1, 2, 3 sunt ˆınchise la operat Demonstrat ¸ie . Fie Gk = (V Nk , V T k , S k , P k ), k = 1, 2 dou˘ a gramatici de acela¸si tip j, j = 0, 1, 2, 3. Putem presupune c˘a V N ∩ V N = ∅. Trebuie s˘ a ar˘ at˘a m c˘a limbajele L(G1 ) ∪ L(G2 ), L(G1 )L(G2), L(G1 )∗ , sunt de acela¸si tip j. ˆIn acest scop vom construi gramatici de tipul j care s˘ a genereze le genereze. Vom indica f˘ar˘a demonstrt¸ie modul de construct¸ie al gramaticilor (pentru detalii vezi [?]): Reuniune 1
2
1.4. TRADUCEREA PROGRAMELOR
17
j = 0, 1, 2, 3: G = V N ∪ V N ∪ {S }, V T ∪ V T , P 1 ∪ P 2 ∪ {S → S 1 |S 2 }). 1
2
1
2
Produs j = 0, 1, 2: G = V N ∪ V N ∪ {S }, V T ∪ V T , P 1 ∪ P 2 ∪ {S → S 1 S 2 }). 1
2
1
2
j = 3: G = V N ∪ V N ∪ {S }, V T ∪ V T , S 1 , P 1 ∪ P 2 ), 1
2
1
2
unde P 1 se obt¸ine din P 1 prin ˆınlocuirea 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 ∗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 preponderent˘ a), prelucrare care se realizeaz˘ a ˆın general cu ajutorul unui sistem de calcul. Exist˘a ˆın prezent un num˘ ar mare de limbaje de programare de nivel ˆınalt sau evoluate care se caracterizeaz˘ a printr-o anumit˘ a naturalet¸e, ˆın sensul c˘ a descrierea procesului de prelucrare cu ajutorul limbajului este apropiat˘ a de descrierea natural˘a 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 anumit˘a r˘ aspˆandire ˆın momentul de fat¸a˘ ment¸ion˘ am limbajele PASCAL, FORTRAN, C, JAVA, etc. O alt˘a clas˘ a important˘ a de limbaje, sunt limbajele de asamblare , sau de nivel inferior, ale c˘aror caracteristici depind de sistemul de calcul considerat. In general, fiecare sistem de calcul (sau tip de sistem de calcul), are propriul s˘au limbaj de asamblare; de exemplu, limbajul de asamblare ale sistemelor de calcul echipate cu procesoare de tip Intel Z-80 este denumit ˆın mod curent ASSEMBLER. 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 realizat˘ a direct de utilizator la nivelul locat¸iilor elementare ale memoriei. Exist˘ a 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 afar˘a de limbajele evoluate ¸si de limbajele de asamblare, exist˘ a numeroase limbaje specializate , numite uneori ¸si de comand˘ a , care se refer˘ a la o anumit˘ a clas˘a de aplicat¸ ii. Ment¸ion˘ am de exemplu limbajul pentru prelucrarea listelor LISP, limbajele utilizate ˆın cadrul softwarelui matematic (Mathematica, Maple, MATCAD, etc.) ¸si multe altele. ˆIn general ˆıns˘ a astfel de limbaje nu sunt considerate limbaje de programare propriuzise. Un program redactat ˆıntr-un limbaj de programare poart˘ a denumirea de program surs˘ a. Fiecare sistem de calcul, ˆın funct¸ie de particularit˘ a¸t ile sale, posed˘a un anumit limbaj propriu, numit cod ma¸sin˘ a , acesta fiind singurul limbaj ˆınt¸eles de procesorul sistemului. Un astfel de limbaj depinde de structura instruct ¸iilor procesorului, de setul de instruct¸ii, de posibilit˘a¸t ile de adresare, etc. Un program redactat ˆın limbajul cod ma¸sin˘ a al sistemului de calcul ˆıl numim program obiect. Procesul de transformare al unui program surs˘ a ˆın program obiect se nume¸ste compilare sau translatare , uneori chiar traducere . De obicei termenul de compilare este utilizat numai ˆın cazul limbajelor evoluate, ˆın cazul limbajelor de asamblare fiind utilizat termenul de asamblare . Compilarea (asamblarea) este efectuat˘ a 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 prelucr˘ari ulterioare devine program obiect. De exemplu, compilatoarele sistemelor de operare DOS produc un text numit obiect (fi¸siere cu extensia obj) care ˆın urma unui proces numit editare de leg˘ aturi ¸si a ˆınc˘arc˘ arii ˆın memorie devine program obiect propriuzis, numit program executabil (fi¸siere cu extensia exe). Exist˘a mai multe rat¸iuni pentru o astfel de tratare, ˆıntre care posibilitatea cupl˘arii mai multor module de program realizate separat sau provenite din limbaje surs˘ a diferite, posibilitatea cre˘ arii unor biblioteci de programe ˆın formatul intermediar ¸si utilizarea lor ˆın alte programe, etc. Un program surs˘ a poate de asemenea s˘ a fie executat de c˘ atre sistemul de calcul direct, f˘ar˘a transformarea lui prealabil˘ a ˆın program obiect. ˆIn acest caz, programul surs˘ a este prelucrat de un program al sistemului numit interpretor ; acesta ˆıncarc˘ a succesiv instruct¸iile programului surs˘ a, le analizeaz˘ a din punct de vedere sintactic ¸si semantic ¸si dup˘ a caz, le execut˘ a sau efectueaz˘ a anumite operat¸ii auxiliare. Procesul de compilare este un proces relativ complex ¸si comport˘ a 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, fiecare faz˘ a fiind o operat¸ie coerent˘ a, cu caracteristici bine definite. ˆIn principiu aceste faze sunt
1.4. TRADUCEREA PROGRAMELOR
19
Program Sursa Analiza Lexicala
Analiza sintactica
Tratarea erorilor
Generarea formatului intermediar
Prelucrarea tabelelor
Generarea codului
Optimizarea codului Program Obiect
Figura 1.1: Fazele compil˘ arii parcurse secvent¸ial (pot s˘a existe ¸si anumite reveniri) iar programul surs˘ a este transformat succesiv ˆın formate intermediare. Se poate considera c˘ a fiecare faz˘ a prime¸ste de la faza precedent˘ a un fi¸sier cu programul prelucrat ˆıntr-un mod corespunz˘ator fazei respective, ˆıl prelucreaz˘ a ¸si furnizeaz˘a un fi¸sier de ie¸sire, iar˘a¸si ˆıntr-un format bine precizat, fi¸sier utilizat ˆın faza urm˘ atoare. Exist˘ a cinci faze de compilare principale: analiza lexical˘ a, analiza sintactic˘ a, generarea formatului intermediar, generarea codului, optimizarea codului ¸si dou˘ a faze auxiliare, tratarea erorilor ¸si tratarea tabelelor (vezi figura 1.1). Analiza lexical˘ a are ca obiectiv principal determinarea unit˘a¸ilor t lexicale ale unui program, furnizarea codurilor acestora ¸si detectarea eventualelor erori lexicale. Pe lˆ ang˘a aceste operat¸ii de baz˘a, la analiza lexical˘ a se mai pot efectua anumite operat¸ii auxiliare precum: eliminarea blank-urilor (dac˘ a limbajul permite utilizarea f˘ ar˘a restrict¸ii a acestora), ignorarea comentariilor, diferite conversiuni ale unor date (care se pot efectua la aceast˘ a faz˘ a), completarea tabelelor compilatorului. Analiza sintactic˘ a determin˘ a unit˘a¸t ile sintactice ale programului (secvent¸e de text pentru care se poate genera format intermediar) ¸si verific˘ a programul din punct de vedere sintactic. Este faza central˘a a unui compilator, deseori toate celelalte faze sunt rutine apelate de analizorul sintactic pe m˘asur˘ a ce este posibil˘ a efectuara unei p˘ art¸i din faza respectiv˘a. Tot la analiza sintactic˘ a se definitiveaz˘ a
CAPITOLUL 1. INTRODUCERE
20
tabelele de informat¸ii ¸si se realizeaz˘ a prelucrarea erorilor sintactice. Faza de generare a formatului intermediar se refer˘ a la transformarea programului ˆıntr-o form˘a numit˘a intermediar˘ a pornind de la care se poate, printr-o procedur˘ a relativ simpl˘a , s˘a se obt¸in˘a programul obiect. Structura acestei faze depinde de formatul intermediar ales de c˘ atre proiectant ¸si de modalitatea de implementare; uzual se folosesc cvadruple, triplete sau ¸sirurile poloneze . Generarea codului este o faz˘a in care se realizeaz˘ a codul obiect corespunz˘ ator programului. Practic ˆın aceast˘ a faz˘ a se obt¸ine programul ˆın limbaj de asamblare corespunz˘ator programului surs˘ a redactat ˆıntr-un limbaj evoluat. ˆIn mod obi¸snuit generatorul de cod este constituit din rutinele generatoare de cod corespunz˘ atoare diverselor unit˘ a¸t i ale formatului intermediar. ˆIn faza de optimizare a codului se realizeaz˘a o anumit˘ a ˆımbun˘ at˘a¸t ire a codului obiect astfel ˆıncˆ at programul rezultat s˘ a fie cˆat mai performant (ˆın privint¸a consumului de timp ¸si memorie). Cele mai tipice exemple sunt eliminarea ˆınc˘ arc˘arilor ¸si a memor˘arilor redundante sau optimizarea ciclurilor. Fazele de Prelucrare a tabelelor ¸si de Tratare a erorilor vor fi atinse numai part¸ial ˆın aceast curs. Facem ˆıns˘ a ment¸iunea c˘ a prelucrarea tabelelor poate s˘ a aib˘a o influent¸a˘ important˘ a asupra performant¸elor unui compilator, ˆın mod special din punctul de vedere al timpului de execut¸ie (compilare) ¸si c˘ a tratarea erorilor are o anumit˘ a implicat¸ie ˆın eliminarea erorilor sintactice.
1.5
Probleme propuse
1. G˘asit¸i limbajul generat de gramatica G = (V N , V T , S , P ), precizˆ and tipul gramaticii (cf. clasific˘ arii Chomsky): (a) V N = {S }; V T = {0, 1, 2}; P = {S → 0S 0|1S 1|2S 2|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 = {x0}, V T = {A , B , . . . , Z } , S = x 0 , P = {x0 → x 1 D, x1 → x 2 N, x2 → 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 → P CR|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. G˘asit¸i gramatici pentru generarea urm˘ atoarelor limbaje: (a) L = {λ}; (b) L = ∅; (c) L = {0n |n ∈ N }; (d) L = {a,ab,aab,ba,baa }. (e) L = {an cbn |n ≥ 1 }. (f) L = {w ∈ {a,b,c}∗ |w cont¸ine cc ¸si se termin˘ a cu a }. (g) L = {BEGIN |EN D|IF |WHILE |U N T I L}. (h) L = {w ∈ {0, 1}∗ | reprezentarea binar˘ a pe 8 bit¸i a unui ˆıntreg } . (i) L = {an bn+3 an+1 |n ≥ 0 }. (j) L = {w ∈ {a,b,c}∗ |w ˆıncepe cu a ¸si are maxim 4 litere } . (k) L = {ai b j ck |i, j, k > 0 }. (l) L = {w ∈ {0, 1}∗ |w multiplu de 8 } . (m) L = { constante reale ˆın scrierea obi¸snuit˘ a cu punct zecimal pi .pz }.
CAPITOLUL 1. INTRODUCERE
22 (n) L = { ai b j ai b j }; (o) L = { awbbw |w, w ∈ { 0, 1}∗ };
(p) L = { w ∈ {0, 1}∗ |w cont¸ine maxim 2 de 0 } ; (q) L = { waw˜ |w ∈ {0, 1}∗ }; (r) L = { w|w octet ce reprezint˘ a un num˘ar par } ; (s) L = { A , B , C , . . . , Z } ; 4. Construit¸i o gramatic˘ a ce cont¸ine reguli de ¸stergere, dar genereaz˘ a un limbaj λ-liber. 5. Folosind teorema s˘ a se construiasc˘ a o gramatic˘ a independent˘ a de context, f˘ar˘ a reguli de ¸stergere care genereaz˘ a limbajul de la punctul precedent.
Capitolul 2 Limbaje Regulate ¸si Analiza Lexical˘ a 2.1
Automate finite s¸i limbaje regulate
Automate finite. Automatele finite sunt mecanisme pentru recunoa¸sterea limbajelor de tipul 3 (regulate). Un automat finit (AF ) se compune dintr-o band˘ a de intrare ¸si un dispozitiv de comand˘ a . Pe banda de intrare sunt ˆınregistrate simboluri ale unui alfabet de intrare , constituind pe band˘ a un cuvˆ ant p. La fiecare pas de funct¸ionare banda se deplaseaz˘ a cu o pozit¸ie spre stˆ anga. Dispozitivul de comand˘a posed˘ a un dispozitiv de citire de pe band˘a; dispozitivul se afl˘a permanent ˆıntr-o anumit˘ a stare intern˘ a , element al unei mult ¸imi finite de st˘ ari . Schema unui automat finit este redat˘ a ˆın figura 2.1. Automatul finit funct¸ioneaz˘ a ˆın pa¸si discret¸i. Un pas de funct¸ionare const˘a din: dispozitivul de comand˘ a cite¸ste de pe banda de intrare simbolul aflat ˆın dreptul dispozitivului de citire; ˆın funct¸ie de starea intern˘ a ¸si de simbolul citit, automatul trece ˆıntr-o nou˘a stare ¸si mut˘ a banda cu o pozit¸ie spre stˆanga. Automatul ˆı¸si ˆınceteaz˘a funct¸ionarea dup˘ a ce s-a citit ultimul simbol ˆınregistrat pe band˘ a; ˆın acest moment el se va afla ˆıntr-o anumit˘ a stare, care, dup˘ a cum vom vedea, va juca un rol important ˆın recunoa¸sterea cuvintelor. Din punct de vedere matematic, un automat finit este un sistem AF = (Σ, I , f , s0 , Σf ), unde Σ este alfabetul (mult¸imea) de st˘ ari; I este alfabetul de intrare; f : Σ × I −→ P (Σ) este funct¸ia de evolut¸ie; a; s0 ∈ Σ este starea init¸ial˘ Σf ⊆ Σ este mult¸imea de st˘ ari finale.
23
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
24
i1
i2
i3
...
ik
...
i n-1
in
...
Banda de intrare
Dispozitiv de citire
s
Dispozitiv de comanda
Figura 2.1: Reprezentarea schematic˘ a a unui automat finit Dac˘a pentru orice (s, i) ∈ Σ × I , avem |f (s, i)| ≤ 1 automatul se nume¸ste determinist ; ˆın caz contrar se nume¸ste nedeterminist . Observat ¸ii : 1. Funct¸ionarea unui automat finit se poate bloca ˆın situat ¸ia ˆın care el se afl˘ a ˆın starea s, cite¸ste de pe band˘ a simbolul i ¸si f (s, i) = ∅ ; evident c˘a ˆın acest caz funct¸ionarea ˆın continuare nu mai este posibil˘ a. 2. ˆIn cazul unui automat determinist vom scrie f (s, i) = s (ˆın loc de f (s, i) ∈ {s }. 3. Definit¸ia dat˘ a este specific˘ a teoriei limbajelor formale. O alt˘a definit¸ie (mai general˘a) , ˆıntˆ alnit˘a ˆın teoria automatelor este urm˘atoarea: un automat finit este un sistem AF = (Σ, I , O , f , g , s 0 , F ) unde, Σ, I , f , s0 , F au semnificat¸ia de mai sus, O este alfabetul de ie¸sire iar g : Σ × I −→ P (O) este funct ¸ie de ie¸sire . Funct¸ionalitatea unui astfel de automat finit este analoag˘ a cu cea descris˘ a mai sus, cu deosebirea c˘a la fiecare pas automatul furnizeaz˘ ao ie¸sire o ∈ g(s, i). Prin diagrama de st˘ari a unui automat finit ˆınt¸elegem un graf orientat care are nodurile etichetate cu st˘arile s ∈ Σ iar arcele se construiesc astfel: nodurile s, s se unesc cu un arc orientat de la s la s dac˘a exist˘a i ∈ I astfel ˆıncˆat s ∈ f (s, i); arcul respectiv va fi notat cu i. Exemplu AF = (Σ, I , f , s0 , Σf ) unde Σ = {s0 , s1 , s2 }, I = { i1 , i2 }, Σf = { s2 }, iar f este dat˘ a de tabelul i1 i2
s0 s1 s2 {s1 } { s2 } {s0 } ∅ {s0 , s1 } {s0 , s1}
2.1. AUTOMATE FINITE S¸I LIMBAJE REGULATE
25
i2 i1 i2
s1 i1
s0
i2 i2 s2
Figura 2.2: Diagrama de st˘ ari Diagrama de st˘ ari corespunz˘ atoare este prezentat˘ a ˆın figura 2.2. Funct¸ia de evolut¸ie Funct¸ia f se prelunge¸ste de la Σ × I la P (Σ) × I ∗ deci definim f : P (Σ) × I ∗ −→ P (Σ), astfel: (a) f (s, λ) = {s}, ∀s ∈ Σ, (b) f (∅, i) = ∅, ∀i ∈ I , (c) f (Z, i) = s∈Z f (s, i), Z ∈ P (Σ), Z = ∅, (d) f (Z,pi) = f (f (Z, p), i). Prin abuz de limbaj, vom folosi pentru noua funct¸ie tot notat¸ia f .S˘a observ˘ am c˘a relat¸iile de mai sus constituie o definit¸ie prin recurent¸a˘, corect˘ a; fiind dat f , putem defini mai ˆıntˆ ai toate valorile f (Z, i) (un num˘ ar finit, deoarece I este o mult¸ime finit˘a), apoi f (Z, p) pentru | p| = 2, ˆın continuare f (Z, p) pentru | p| = 3, etc. Propriet˘a¸t ile funct¸iei f: 1. Dac˘a Z k este o familie de p˘art¸i a lui Σ, avem
f (
Z k , i) =
k
f (Z k , i)
k
Demonstrat ¸ie . Utilizˆand (c) putem scrie
f (Z k , i) =
k
(
k
f (s, i)) =
s∈Z k
s∈∪Z k
f (s, i) = f (
Z k , i).
k
2. f (Z, p) = s∈Z (f (s, p)), p ∈ I ∗ . Demonstrat ¸ie . Prin induct¸ie asupra lungimii lui p. Pentru | p| = 1 avem f (Z, i) = s∈Z f (s, i), adic˘a (c). Presupunem c˘ a relat¸ia este adev˘arat˘ a pentru | p| = m ¸si consider˘ am un p astfel
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
26
ˆı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 ( s∈Z f (s, p ), i) = = s∈Z f (f (s, p ), i) = s∈Z f (s, p i) = s∈Z f (s, p).
3. f (s,pq ) = f (f (s, p), q ), p,q ∈ I ∗. Demonstrat ¸ie . Induct¸ie asupra lungimii lui q . Dac˘a | q | = 1, atunci q = i ¸si relat¸ia se reduce la (d). Presupunem c˘ a proprietatea este adev˘ arat˘ a pentru r ¸si consider˘ am |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 ).
Limbaje regulate. Definit¸ie 2.1 Limbajul recunoscut de automatul finit AF = (Σ, I , f , s0, Σf ) este = ∅} L(AF ) = { p| p ∈ I ∗ , f (s0 , p) ∩ Σf Deci p ∈ L(AF ) dac˘ a automatul aflˆ andu-se ˆın starea init¸ial˘a s 0, dup˘a | p| pa¸si de funct¸ionare poate s˘ a ajung˘ a ˆıntr-o stare final˘a. ˆIn cazul unui automat finit determinist limbajul recunoscut poate fi definit ˆın modul urm˘ator. Pentru fiecare s ∈ Σ definim funct¸ia f s : I ∗ −→ P (Σ) prin f s ( p) = f (s, p). Atunci = ∅ ⇔ f (s0 , p) = f s ( p) ∈ Σ f , f (s0 , p) ∩ Σf 0
deci = ∅} = f s−1 (Σf ) L(AF ) = { p|f (s0 , p) ∩ Σf 0
Limbajele recunoscute de automate finite le vom numi limbaje regulate ; familia acestor limbaje o vom nota cu R. Evident, familia limbajelor recunoscute de automate finite deterministe, Rd , este o parte a lui R, Rd ⊆ R. Vom ar˘ata c˘ a cele dou˘ a familii coincid.
Teorema 2.1 Rd = R. Demonstrat ¸ie . Fie AF = (Σ, I , f , s0 , Σf ) un automat finit (ˆın general nedeterminist). Construim urm˘ atorul automat finit determinist AF = (Σ , I , f , {s0}, Σf ) unde Σ = P (Σ), f = f (prelungirea la Σ×I ∗ ), Σ f = { Z | Z ∈ P (Σ), Z ∩Σf = ∅} . Evident, automatul AF este determinist. Fie p ∈ L(AF ). Atunci f (s0 , p) ∩ Σf = ∅ ¸si f (s0 , p) ∈ Σf . Pe de alt˘ a parte, conform cu proprietatea 2 a funct¸iei de evolut¸ie, avem f ({s0 }, p) = f (s0 , p)
2.1. AUTOMATE FINITE S¸I LIMBAJE REGULATE
27
¸si deci f (s0 , p) ∈ Σ f , adic˘a p ∈ L(AF ) ¸si L(AF ) ⊆ L(AF ). Pe o cale analoag˘a se arat˘ a c˘a L(AF ) ⊆ L(AF ). Observat ¸ie . Faptul c˘ a un cuvˆant este recunoscut de un automat finit se poate verifica prin calcul direct sau pe diagrama de st˘ ari. Exemplu . Consider˘ am automatul din exemplul anterior (figura 2.2) ¸si fie p = i 1i2 i1 . Prin calcul direct: f (s0 , i1 i2 i1 ) = f (f (f (s0, i1 ), i2 ), i1 ) = f (f ({s1 }, i2 ), i1) = = f ({s0 , s1 }, i1 ) = f ({s0 }, i1 ) ∪ f ({s1 }, i1 ) = { s1 } ∪ {s2 }. Astfel c˘a f (s0 , i1 i2 i1) ∩ Σf = { s2 } = ∅ ¸si p ∈ L(AF ). Pe diagrama de st˘ari exist˘a traiectoriile: i1
i2
i1
1
2
1
s0 −→s1−→s0 −→s1 ; i i i s0 −→s1−→s1 −→s2 ; A doua traiectorie ne duce ˆıntr-o stare final˘a, deci p ∈ L(AF ). Limbaje de tipul trei ¸si limbaje regulate. Vom ar˘ata ˆın cele ce urmeaz˘ a c˘a familia limbajelor de tipul 3 coincide cu familia limbajelor regulate. ˆIn prealabil vom pune ˆın evident¸a˘ o form˘a special˘ a a limbajelor de tipul 3, pe care convenim s˘a o numim form˘ a normal˘ a . a dac˘ Definit¸ie 2.2 Vom spune c˘ a o gramatic˘ a de tipul 3 este ˆın forma normal˘ a are reguli de generare de forma
A → iB, unde A,B, C ∈ V N , i, j ∈ V T C → j,
sau regula de completare S → λ ¸si ˆın acest caz S nu apare ˆın dreapta vreunei reguli.
Lema 2.1 Orice gramatic˘ a de tipul 3 admite o form˘ a normal˘ a. Demonstrat ¸ie . Dac˘a G = (V N , V T , S , P ) ∈ G 3 este gramatica dat˘a, elimin˘ am ˆın primul rˆand λ-regulile (ca ˆın lema elimin˘ arii regulilor de ¸stergere) apoi construim gramatica G = (V N , V T , S , P ), unde V N ¸si P se definesc astfel: introducem ˆın V N toate simbolurile din V N iar ˆın P toate regulile din P care convin; fie acum ˆın P o regul˘a de forma A → pB, p = i 1 . . . in Vom introduce ˆın P regulile: A → i1 Z 1 , Z 1 → i 2Z 2 , ..., Z n−1 → in B,
28
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
iar simbolurile Z 1 , . . . Zn −1 le includem in V N . ˆIn cazul unei reguli de forma A → p cu | p| > 1 proced˘ am analog, exceptˆ and ultima regul˘ a nou introdus˘ a care va avea forma Z n−1 → i n . S˘a mai facem observat¸ia c˘a simbolurile Z 1 , . . . , Zn −1 le lu˘am distincte pentru fiecare caz. Se poate ar˘ ata u¸sor c˘a L(G) = L(G ).
Teorema 2.2 Familia limbajelor de tipul 3 coincide cu familia limbajelor regulate. Demonstrat ¸ie . Partea I: E ∈ L3 ⇒ E ∈ R . Fie E un limbaj de tipul 3 ¸si G = (V N , V T , S , P ) gramatica care ˆıl genereaz˘ a; putem presupune c˘ a G este ˆın form˘ a normal˘ a. Construim automatul finit AF = (Σ, I , f , s0 , Σf ) unde Σ = V N ∪ {X } ( X simbol nou), I = V T , s0 = S ¸si Σf =
{X, S } , pentru λ ∈ E {X } ∈ E , pentru λ
Funct¸ia de evolut¸ie este definit˘ a de: dac˘a A → iB ∈ P lu˘am B ∈ f (A, i), dac˘a C → j ∈ P lu˘am X ∈ f (C, j), ˆın rest ∅ Observat ¸ie . Automatul astfel definit este ˆın general nedeterminist. De exemplu, dac˘a A → 0B |0 atunci f (A, 0) = {B, X }. ∗ Fie p ∈ L(G), p = i1 . . . in , deci S ⇒ p. Detaliat, aceast˘ a derivare va avea forma (1) S ⇒i1 A1⇒i1 i2 A2 ⇒i1i2 . . . in−1 An−1 ⇒i1 i2 . . . in . S-au aplicat regulile: S → i 1A1 , A1 → i 2 A2, (2) ... An−1 → i n . ˆIn automat avem corespunz˘ ator:
(3) :
A1 ∈ f (S, i1 ), A2 ∈ f (A1 , i2 ), ... X ∈ f (An−1 , in )
i1
i2
Putem scrie traiectoria i3
i
n X ∈ Σ f (4) S −→ A 1 −→A2 −→ . . . −→
˘ ¸ I SPECIALE ALE LIMBAJELOR REGULATE 2.2. PROPRIET AT
29
Deci p ∈ L(AF ). Dac˘a p = λ, atunci S ⇒λ ¸si S → λ ∈ P . Dar atunci λ ∈ L(AF ), c˘aci automatul este ˆın starea S ¸si r˘amˆıne ˆın aceast˘ a stare dup˘ a ”citirea” lui λ; cum ˆıns˘a ˆın acest caz S ∈ Σf rezult˘ a c˘a ¸si ˆın acest caz p ∈ L(AF ). ˆIn consecint¸a˘ L(G) ⊆ L(AF ). Fie acum p = i1 . . . in ∈ L(AF ); atunci avem traiectoria (4), relat¸iile (3), regulile de generare (2) ¸si putem scrie derivarea (1), adic˘ a p ∈ L(G) ¸si L(AF ) ⊆ L(G). Partea II E ∈ R ⇒E ∈ L3 . Vom indica numai modul de construct¸ie a gramaticii. Fie AF = (Σ, I , f , s0 , Σf ) automatul finit care recunoa¸ste limbajul E , pe care ˆıl presupunem determinist. Construim gramatica G = (Σ, I , s0 , P ) unde mult¸imea P este definit˘ a astfel f (A, i) = B genereaz˘a regula A → iB ∈ P , ˆın plus dac˘ a B ∈ Σ f se genereaz˘ a ¸si regula A → i ∈ P . Putem ar˘ ata c˘a L(G) = L(AF ).
2.2
Propriet˘ a¸t i speciale ale limbajelor regulate
Caracterizarea algebric˘ a a limbajelor regulate . Limbajele regulate, fiind ∗ p˘art¸i din I , se pot caracteriza algebric, independent de mecanismele de generare (gramaticile de tipul 3) sau de cele de recunoa¸stere (automatele finite). Teorema 2.3 Fie E ⊂ I ∗ un limbaj. Urm˘ atoarele afirmat ¸ii sunt echivalente. (a) E ∈ R; (b) E este o reuniune de clase de echivalent ¸e a unei congruent ¸e de rang finit; (c) Urm˘ atoarea congruent ¸˘ a µ = {( p, q )|χE (r1 pr2 ) = χ E (r1 qr 2 ), ∀r1 , r2 ∈ I ∗ }, unde χE este funct ¸ia caracteristic˘ a a lui E , este de rang finit. Demonstrat ¸ie : Vom ar˘ata urm˘ atoarele implicat¸ii: (a) ⇒ (b), (b) ⇒ (c), (c) ⇒ (a). (a) ⇒ (b). Fie AF = (Σ, I , f , s0 , Σf ) automatul finit care recunoa¸ste limba jul E . Definim pe I ∗ relat¸ia ξ = { ( p, q )|f (s, p) = f (s, q ), ∀s ∈ Σ }. Se poate vedea cu u¸surint¸˘ a c˘a ξ este o relat¸ie de echivalent¸a˘ (reflexiv˘a , simetric˘a , tranzitiv˘a). ˆIn plus , dac˘a 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 S¸I ANALIZA LEXICAL A
Prin urmare ξ este o relat¸ie de congruent¸a˘. S˘a ar˘ at˘am c˘a aceast˘a congruent¸a˘ este de rang finit, adic˘a mult¸imea cˆ at I ∗ /ξ este finit˘ a. Fie α : Σ −→ Σ o aplicat¸ie oarecare ¸si fie mult¸imea I ∗ (α) = { p| p ∈ I ∗ , f (s, p) = α(s), ∀s ∈ Σ }. S˘a observ˘ am c˘a dac˘ a α este funct¸ia identic˘ a atunci λ ∈ I ∗ (α). Deci nu toate a de echivalent¸a˘. ˆIntr-adev˘ a r, fie I ∗ (α) sunt vide; ˆın acest caz I ∗ (α) este o clas˘ ∗ ∗ p ∈ I (α) ⊆ I fixat ¸si fie C p clasa de echivalent¸a˘ a lui p. Ar˘at˘am c˘a C p = I ∗ (α). Dac˘a q ∈ I ∗ (α), atunci f (s, q ) = α(s), ∀s ∈ Σ, ceea ce ˆınseamn˘ a c˘a f (s, q ) = ∗ f (s, p), ∀s ∈ Σ, ¸si deci ( p, q ) ∈ ξ adic˘a q ∈ C p ¸si I (α) ⊆ C p . Invers dac˘ a q ∈ C p atunci f (s, q ) = f (s, p) = α(s), ∀s ∈ Σ ¸si q ∈ I ∗ (α), adic˘a C p ⊆ I ∗ (α). Aceasta ˆınseamn˘ a c˘a I ∗ (α) = C p , adic˘a I ∗(α) este o clas˘a de echivalent¸a˘ . ˆIntre mult¸imea cˆ at I ∗ /ξ ¸si mult¸imea funct¸iilor definite pe Σ cu valori ˆın Σ putem stabili urm˘atoarea corespondent¸a˘ biunivoc˘a: unei funct ¸ii α : Σ −→ Σ ˆıi corespunde clasa de echivalent ¸˘ a I ∗ (α). Invers, fiind dat˘a o clas˘a de echivalent¸a˘ C , lu˘am p ∈ C (oarecare) ¸si ata¸sa˘m lui C funct¸ia α(s) = f (s, p)∀s ∈ Σ. T ¸ inˆand cont c˘a dac˘ a q ∈ C atunci f (s, p) = f (s, q ), ∀s ∈ Σ, rezult˘a c˘ a funct¸ia α nu depinde de elementul p ales. Dar mult¸imea funct¸iilor definite pe Σ cu valori ˆın Σ este finit˘ a, deci I ∗ /ξ este finit˘a, adic˘a congruent¸a ξ este de rang finit. Fie acum p ∈ L(AF ) ¸si q astfel ca ( p, q ) ∈ ξ . Avem f (s0 , q ) = f (s0 , p) ∈ Σ f ; adic˘a q ∈ L(AF ). Aceasta ˆınseamn˘a c˘ a odat˘ a cu elementul p, L(AF ) cont¸ine clasa de echivalent¸a˘ a lui p. De aici rezult˘ a c˘a L(AF ) este constituit dintr-un anumit num˘ ar de clase de echivalent¸a˘ a lui ξ . (b)⇒(c) Fie ξ o congruent¸a˘ de rang finit ¸si E o reuniune de clase de echivalent¸a˘. Fie apoi ( p, q ) ∈ ξ ; aceasta ˆınseamn˘ a c˘a r1 pr2 ∈ E ⇔ r 1qr 2 ∈ E , deci χE (r1 pr2 ) = χ E (r1 qr 2 ), ∀r1 , r2 ∈ I ∗ . Prin urmare, ( p, q ) ∈ µ. Orice clas˘ a de echivalent¸a˘ din I ∗ /ξ este inclus˘ a ∗ ∗ ∗ ˆıntr-o clas˘a de echivalent¸a˘ din I /µ, a¸sa ˆıncˆ at card(I /µ) < card(I /ξ ), adic˘a congruent¸a µ este de rang finit. (c)⇒ (a) Presupunem c˘a µ este o congruent¸a˘ de rang finit; consider˘ am automatul finit ∗ AF = (I /µ,I,f,C λ , Σf ), unde funct¸ia de evolut¸ie f ¸si mult¸imea de st˘ari finale sunt f (C p , i) = C pi , Σf = {C p | p ∈ E }.
˘ ¸ I SPECIALE ALE LIMBAJELOR REGULATE 2.2. PROPRIET AT
31
Vom ar˘ata c˘ a E = L(AF ). ˆIn primul rˆand s˘a observ˘ a m c˘a f (C p , q ) = C pq (se poate ar˘ ata prin induct¸ie asupra lui | q |). Avem p ∈ E ⇔ C p ∈ Σ f ⇔ f (C λ , p) = C λp = C p ∈ Σ f ⇔ p ∈ L(AF ) adic˘a E = L(AF ) ¸si E este un limbaj regulat.
Corolar 2.4 Familia R este ˆınchis˘ a la operat ¸ia de r˘ asturnare.
Demonstrat ¸ie . Fie E ∈ R ¸si E r˘asturnatul lui E . Conform teoremei de caracterizare, card(I ∗/µE ) < ∞ . Avem ( p, q ) ∈ µ E ⇔ χ E (r1 pr2 ) = χ E (r1 qr 2 ) ⇔ ¸si
χE (r1 pr2 ) = χ E (r1 q r2) ⇔ ( p, q ) ∈ µ E
Cu alte cuvinte dac˘ a C este o clas˘ a de echivalent¸a˘ a lui µE atunci C (r˘asturnatul lui C ) este o clas˘ a de echivalent¸a˘ a lui µE . Aceasta ˆınseamn˘ a c˘a card(I ∗ /µE ) = card(I ∗ /µE ) < ∞ ¸si conform aceleia¸si teoreme de caracterizare E ∈ R . Observat ¸ie . Am v˘azut c˘ a limbajele de tipul 3 pot fi definite de gramatici cu reguli de dou˘ a categorii: drept liniare sau stˆ ang liniare. Este evident c˘ a limbajele stˆang liniare sunt r˘asturnatele limbajelor drept liniare. Cum familia limbajelor regulate (drept liniare) este ˆınchis˘ a la operat¸ia de r˘asturnare, rezult˘ a c˘a cele dou˘ a familii de limbaje coincid. ˆInchiderea familiei L3 la operat¸iile Pref ¸si complementariere . Operat¸iile Pref ¸si complementariere se definesc ˆın modul urm˘ ator
Pref (E ) = { p|∃r ∈ I ∗ , pr ∈ E }, C (E ) = I ∗ \ E. a la operat ¸iile Pref ¸si complementariere. Teorema 2.5 Familia L3 este ˆınchis˘ Demonstrat ¸ie . Fie AF = (Σ, I , f , s0 , Σf ) automatul finit care recunoa¸ste limbajul E . Putem presupune c˘ a AF este determinist. Limbajul Pref (E ). Construim automatul finit AF = (Σ, I , f , s0, Σf ) unde Σf = {s ∈ Σ |s = f (s0 , q ), q ∈ P ref (E )}. Este evident c˘ a P ref (E ) ⊆ L(AF ), c˘aci dac˘ a q ∈ P ref (E ) atunci s = f (s0 , q ) ∈ Σf conform definit¸iei lui Σf . S˘a ar˘ at˘am acum c˘a L(AF ) ⊆ P ref (E ). Fie r ∈ L(AF ), atunci f (s0 , q ) ∈ Σ f , deci exist˘a q ∈ P ref (E ) astfel ˆıncˆat f (s0 , r) = f (s0 , q ) . Cum q este prefixul unui cuvˆant din E, exist˘ a w ∈ I ∗ astfel ˆıncˆat qw ∈ E , adic˘a f (s0 , q ) ∈ Σ f . Dar f (s0 , rw) = f (f (s0 , r), w) = f (f (s0, q ), w) = f (s0 , qw) ∈ Σ f ,
32
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
i j
s j = s k
ik+1
s j-1 i1
s1
s k-1
s k+1
s j+1
s n-1
in
s0
sn
Figura 2.3: Traiectoria automatului finit deci rw ∈ E ¸si r ∈ Pref (E ). Aceasta ˆınseamn˘ a c˘a L(AF ) ⊆ Pref (E ) ¸si prin urmare Pref (E ) = L(AF ), adic˘a Pref (E ) este limbaj regulat. Limbajul C (E ). Avem
∈ E } = { p ∈ I ∗ |f (s0 , p) ∈ Σ f } = { p ∈ I ∗ , f (s0 , p) ∈ C (Σf )}. C (E ) = { p ∈ I ∗| p Prin urmare C (E ) = L(AF c ) unde AF c = (Σ, I , f , s0 , C (Σf )}, adic˘a C (E ) este un limbaj regulat. a denumire (sau lema Lema de pompare pentru limbaje regulate Sub aceast˘ uvw) este cunoscut˘ a o proprietate a limbajelor regulate (ca ¸si a altor familii de limbaje) care ne premite s˘ a descompunem cuvintele suficient de lungi ale limba jului ˆın forma uvw ¸si s˘a multiplic˘am subcuvˆ antul v de un num˘ ar arbitrar de ori, obt¸inˆand cuvinte care apart¸in de asemenea limbajului. Cu alte cuvinte, putem s˘a ”pomp˘ am” ˆın cuvˆantul dat o anumit˘ a parte a sa. Astfel de leme se utilizeaz˘ a deseori pentru a rezolva probleme de neapartenent¸˘ a, adic˘a pentru a ar˘ ata c˘a un anumit limbaj nu apart¸ine unei familii date de limbaje.
Lema 2.2 Fie E un limbaj regulat ¸si AF = (Σ, I , f , s0 , Σf ) automatul finit care ˆıl recunoa¸ste. Dac˘ a p ∈ E ¸si | p| ≥ card(Σ) atunci p se descompune ˆın forma = λ ¸si uv m w ∈ E, ∀m ∈ N . p = uvw, v Demonstrat ¸ie . Fie p = i1 . . . in , n ≥ card(Σ); fie s0, s1 , . . . , sn st˘arile parcurse de automat la citirea cuvˆ antului p. Atunci, s j = f (s j −1 , i j ), j = 1,n, sn ∈ Σf . Exist˘a ˆın mod necesar dou˘ a st˘ari egale, s j = sk , j < k. Traiectoria va avea o bucl˘a (vezi figura 2.3). Descompunem cuvˆ antul p ˆın forma p = uvw unde u = i 1 . . . i j , v = i j +1 . . . ik , w = a v = λ, c˘aci j < k. Pe de alt˘ a parte, putem parcurge traiecik+1 . . . in . Este clar c˘ toria f˘ acˆand de mai multe ori bucla, adic˘a f (s0 , uv m w) = s n ∈ Σ f . Prin urmare uvm w ∈ E .
˘ ¸ I SPECIALE ALE LIMBAJELOR REGULATE 2.2. PROPRIET AT
33
Consecint¸a ˘ 2.3 Incluziunea L3 ⊆ L2 este strict˘ a. ˆIn adev˘ ar, fie limbajul L 2 = { 0n 1n |n ≥ 1 }. S¸tim c˘ a acest limbaj este de tipul 2 ¸si c˘a poate fi generat de gramatica G = ({A}, {0, 1}, A, {A → 0A1|01}). S˘a ar˘at˘am c˘a L2 nu este de tipul 3. S˘a presupunem c˘a L2 este de tipul 3 ¸si fie AF = (Σ, I , f , s0 , Σf ) automatul finit care ˆıl recunoa¸ste. Cum L2 cont¸ine cuvinte oricˆ a t de lungi, fie p ∈ L2 astfel ˆıncˆat p ≥ card(Σ). Conform lemei de pompare, p se descompune ˆın forma = λ ¸si uv m w ∈ E . Putem avea una din situat¸iile: p = uvw, v (1) p = 0 . . . 0 0 . . . 0 0 . . . 01 . . . 1,
u
v
w
(2) p = 0 . . . 01 . . . 1 1 . . . 1 1 . . . 1, u
v
w
(3) p = 0 . . . 0 0 . . . 1 1 . . . 1 . u
v
w
Primele dou˘ a cazuri nu pot avea loc deoarece multiplicˆ andu-l pe v, num˘arul de simboluri 0 ¸si 1 nu s-ar p˘ astra egal. ˆIn al treilea caz, luˆand de exemplu, m = 2 obt¸inem p2 = 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 L2 nu este de tipul 3. Observat ¸ie . Este interesant de observat c˘ a limbajele simple de forma lui L2 sunt semnificative pentru clasele din clasificarea Chomsky. Astfel L1 = { an |n ≥ 1 }, L1 ∈ L3 ; ∈ L3 ; L2 = { an bn |n ≥ 1 }, L2 ∈ L2 , L2 n n n ∈ L2 ; L3 = { a b c |n ≥ 1 }, L3 ∈ L1 (?), L3 Ne-am putea a¸stepta ca limbajul L3 , un exemplu analog lui L2 , s˘a fie de tip 1, adic˘a L3 ∈ L1 , L3 ∈ L2 . ˆIn adev˘ar, se poate ar˘ata c˘a L3 ∈ L2 , dar dup˘a cuno¸stint¸a autorului, aparent¸a L3 ∈ L1 este o problem˘ a deschis˘ a.
Consecint¸a ˘ 2.4 Fie E un limbaj regulat ¸si AF = (Σ, I , f , s0 , Σf ) automatul finit care ˆıl recunoa¸ste. Atunci E este infinit dac˘ a ¸si numai dac˘ a exist˘ a p ∈ E astfel ˆıncˆ at | p| ≥ card(Σ). Dac˘a limbajul este infinit, este clar c˘a exist˘a p ∈ E cu | p| ≥ card(Σ). Invers, dac˘ a m exist˘a p ∈ E cu | p| ≥ card(Σ) atunci p = uvw, v = λ ¸si uv w ∈ E, ∀m ∈ N , deci limbajul este infinit.
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
34
2.3
Expresii regulate ¸si sisteme tranzit¸ionale
Expresii regulate Fie V un alfabet. Expresiile regulate sunt cuvinte peste alfabetul V ∪ {•, ∗, | } ∪ {(, )} la care se adaug˘ a simbolul ∅, Simbolurile ”|”-sau, ”•”-produs, ”∗”-ˆınchidere, le vom considera operatori. Expresiile regulate se definesc astfel: (1) λ ¸si ∅ sunt expresii regulate; (2) pentru orice a ∈ V , cuvˆantul a este o expresie regulat˘a; (3) dac˘ a R ¸si S sunt expresii regulate, atunci (R|S ) (R • S ) ¸si (R∗ ) sunt expresii regulate; (4) orice expresie regulat˘a se obt ¸ine prin aplicarea de un numar finit de ori a regulilor (1)-(3). Parantezele sunt utilizate pentru a pune ˆın evident¸˘ a ordinea de aplicare a operatorilor. Pentru simplificarea scrierii vom considera c˘ a operatorul ∗ are ponderea cea mai mare, apoi operatorul • ¸si | ponderea cea mai mic˘ a. Astfel parantezele redundante pot fi eliminate. De exemplu, prin R|S ∗ vom ˆınt¸elege (R|(S ∗ )). Observat ¸ie . Expresiile regulate se pot defini 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 c˘a expresia regulat˘ a reprezint˘ a (desemneaz˘ a, noteaz˘ a) acel limbaj. Modul ˆın care asociem un limbaj unei expresii regulate este (1) (1) (2) (3)
a limbajul {λ}; λ reprezint˘ a limbajul ∅ ; ∅ reprezint˘ a limbajul { a}; a reprezint˘ dac˘ a R ¸si S sunt expresii regulate ce reprezint˘ a limbajele LR respectiv LS atunci (i) R|S reprezint˘ a limbajul LR ∪ LS ; (ii) R • S reprezint˘ a limbajul LR LS ; (iii) R∗ reprezint˘ a limbajul (LR )∗ .
Fie R, S, P trei expresii regulate ¸si L R , LS , LP limbajele reprezentate. Avem : L(R|S )|P = (LR ∪ LS ) ∪ LP = L R ∪ (LS ∪ LP ) = L R|(S |P ) , ˆıntrucˆ at operat¸ia de reuniune este asociativ˘ a. Vom scrie (R|S )|P = R |(S |P ). ˆIn mod analog se pot obt¸ine ¸si alte propriet˘a¸t 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 S¸I SISTEME TRANZIT ¸ IONALE
35
ˆIn cazul ˆın care nu exist˘ a pericol de confuzie, vom nota cu L (f˘ar˘a indice) limbajul reprezentat de o anumit˘ a expresie regulat˘ a. Exemple .
1. R = a ∗ ; L = j∞=0 {a j } = {λ,a,a2 , . . .}. 2. R = aa ∗ ; L = a • {λ,a,a2 , . . .} = {a, a2 , a3 . . .}. 3. R = (a|b)∗ ; L = (La ∪ Lb )∗ = ({a} ∪ {b})∗ = {a, b}∗; {a, b}∗ = {λ}∪{a, b}1 ∪{a, b}2 ∪ . . . = { λ,a,b,aa,ab,ba,bb,... }, adic˘a (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 anumit˘ a familie de limbaje; o vom nota cu Llr . Apare urm˘ atoarea problem˘a: care este pozit ¸ia acestei familii ˆın ierarhia Chomsky ? Vom ar˘ata c˘ a Llr coincide cu familia limbajelor regulate. Sisteme tranzit¸ionale
Definit¸ie 2.3 Un sistem tranzit ¸ional este un sistem de forma ST = (Σ, I , f , Σ0 , Σf , δ ) unde: Σ este o mult ¸ime (finit˘ a) de st˘ari; I este alfabetul de intrare; ¸ia de tranzit ¸ie; f : Σ × I −→ P (Σ) este funct Σ0 ⊆ Σ este mult ¸imea de st˘ ari init ¸iale; Σf ⊆ Σ este mult ¸imea de st˘ ari finale; ¸ia de tranzit ¸ie . δ ⊂ Σ × Σ este relat Exemplu . Σ = { s0 , s1 , s2 }, I = { 0, 1}, Σ0 = { s0, s1 }, Σf = { s2 } iar funct¸ia ¸si relat¸ia de tranzit¸ie sunt date de: f 0 1
s0 s1 s2 {s1 } {s2 } {s0 } ∅ {s0 , s1 } {s0 , s2 } δ = { (s0 , s1 ), (s2 , s1 )}.
Ca ¸si ˆın cazul unui automat finit putem construi diagrama de st˘ ari completat˘a cu relat¸ia δ (arcele punctate). ˆIn cazul exemplului nostru diagrama de st˘ ari este prezenta ˆın figura 2.4 Observat ¸ie : δ fiind o relat¸ie, are sens δ ∗ (ˆınchiderea tranzitiv˘ a ¸si reflexiv˘ a). Fie i ∈ I ∪{λ}; vom spune c˘a sistemul tranzit¸ional evolueaz˘ a direct din starea s ˆın starea s dac˘a: (1) i = λ ¸si (s , s ) ∈ δ ∗. Pe diagrama de st˘ ari vom avea o traiectorie punctat˘a de la starea s la starea s ; s −→ O −→ O −→ . . . −→ O −→ s .
36
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
1
0 1
s1
s0 1
0
0,1 s2
Figura 2.4: Diagrama de st˘ ari a sistemului tranzit¸ional (2) i = λ ¸si exist˘a s 1 , s2 ∈ Σ astfel ˆıncˆat (s , s1 ) ∈ δ ∗ , s 2 ∈ f (s1 , i) ¸si (s2 , s ) ∈ ari, putem ajunge din s ˆın s pe o traiectorie punctat˘ a, δ ∗ . Pe diagrama de st˘ apoi un pas pe un arc plin ¸si din nou pe o traiectorie punctat˘a. i
s −→ O −→ . . . −→ s 1 −→ s 2 −→ O −→ . . . −→ s . i
Vom scrie s s . Fie acum p = i 1 . . . in . Vom spune c˘a sistemul evolueaz˘ a din starea s ˆın starea s dac˘a exist˘a s0 , s1 , . . . , sn astfel ˆıncˆat
i1
i2
in
s = s 0 s 1 . . . s n = s . p
Vom scrie s s .
Definit¸ie 2.4 Limbajul recunoscut de un sistem tranzit ¸ional ST este p
L(ST ) = { p| p ∈ I ∗, ∃s0 ∈ Σ 0 , s0 s, s ∈ Σ f }. Vom nota cu LST familia limbajelor recunoscute de sisteme tranzit¸ionale. Este evident c˘ a orice automat finit este un sistem tranzit¸ional particular ˆın care card(Σ0 ) = 1 iar δ = ∅ (nu exist˘ a arce punctate). Prin urmare R ⊆ LST .
Teorema 2.6 R = LST . Demonstrat ¸ie . Evident, trebuie s˘ a ar˘ at˘am incluziunea LST ⊆ R. Fie ST = (Σ, I , f , Σ0 , Σf , δ ) un sistem tranzit¸ional. Construim automatul finit AF = (P (Σ), I , f , Σ0 , Σf ) unde i f (Z, i) = {s|∃s ∈ Z, s s }, Σf = {Z |Z ∩ Σf = ∅} .
˘ 2.4. ANALIZA LEXICALA
37
a s0
s0
s1
s1
s0
s1
Figura 2.5: Sistemele tranzit¸ionale ce recunosc limbajele λ, a, ∅ . Fie p = i 1 . . . in ∈ L(ST ) ¸si fie urm˘ atoarea evolut¸ie a sistemului tranzit¸ional i1
i2
in
s0 s 1 . . . s n ∈ Σ f . Putem construi o traiectorie a lui AF de forma i1
i2
i
n Σ0 −→ Z 1 −→ . . . −→ Z n ,
unde Z 1 = f (Σ0 , i1 ), Z k = f (Z k−1 , ik ), k = 2, . . . , n. S˘a observ˘ a m c˘a s0 ∈ Σ0 ¸si c˘a dac˘ a sk−1 ∈ Z k−1 , atunci conform definit ¸iei funct¸iei f , avem sk ∈ f (Z k−1 , ik ) = Z k . Asftel, sk ∈ Z k , k = 1, . . . , n; pentru k = n avem sn ∈ Z n ¸si cum sn ∈ Σf rezult˘ a c˘a Z n ∩ Σf = ∅, adic˘a Z n ∈ Σf . Deci automatul ajunge ˆıntr-o stare final˘a, p ∈ L(AF ) ¸si L(ST ) ⊆ L(AF ). Incluziunea invers˘ a se arat˘ a ˆın mod analog. Construct¸ia sistemelor tranzit¸ionale pentru expresii regulate . Fiind dat˘a o expresie regulat˘ a putem ˆıntotdeauna construi un sistem tranzit ¸ional care recunoa¸ste limbajul reprezentat de expresia respectiv˘ a. Construct¸ia se face cu ajutorul diagramelor de st˘ari. Sistemele tranzit¸ionale (diagramele de st˘ ari) corespunz˘ atoare expresiilor regulate λ, a ¸si ∅ sunt prezentate ˆın figura 2.5. Dac˘a R ¸si S sunt expresii regulate ¸si not˘ am cu ST R ¸si ST S sistemele tranzit¸ionale corespunz˘atoare, atunci sistemele tranzit¸ionale pentru R|S , R • S ¸si R∗ sunt redate ˆın figura 2.6. ˆIn acest mod putem construi succesiv (recurent) un sistem tranzit¸ional corespunz˘ator unei expresii regulate. ator expresiei R = a |b • a∗ este redat Exemplu . Sistemul tranzit¸ional corespunz˘ ˆın figura 2.7. a, putem construi sistemul tranzit¸iConsecint ¸˘ a Dˆandu-se o expresie regulat˘ onal care recunoa¸ste limbajul reprezentat de expresia respectiv˘ a. Cum orice limbaj recunoscut de un sistem tranzit¸ional este regulat, rezult˘ a c˘a limbajele reprezentate de expresii regulate sunt limbaje regulate.
2.4
Analiza lexical˘ a
Procesul de analiz˘ a lexical˘a este o faz˘a a procesului de compilare ˆın care se determin˘a unit˘a¸t ile lexicale (cuvintele, atomii) ale unui program surs˘ a, se furnizeaz˘ a
38
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
ST R
ST S
ST R
ST L
ST R
Figura 2.6: Sistemele tranzit¸ionale ce recunosc limbajele R|S , R • S ¸si
a
b
a
Figura 2.7: Sistemul tranzit¸ional corespunz˘ ator expresiei regulate
˘ 2.4. ANALIZA LEXICALA
39
codurile interne ale acestora ¸si se detecteaz˘ a eventualele erori lexicale. Analizorul lexical mai poate efectua o serie de operat¸ii auxiliare precum: eliminarea blankurilor, ignorarea comentariilor, diferite conversiuni ale unor date, completarea tabelelor compilatorului, gestiunea liniilor textului surs˘ a. Unit˘ a¸t i lexicale O unitate lexical˘ a (Lexic = vocabular; totalitatea cuvintelor unei limbi) este o secvent¸a˘ din textul surs˘ a care are o anumit˘ a unitate logic˘ a. Definit¸ia riguroas˘ a a unit˘ a¸tilor lexicale ale unui limbaj particular se d˘a la definirea limbajului de programare respectiv. De obicei, ˆın ma joritatea limbajelor de programare, unit˘ a¸tile lexicale sunt: cuvinte cheie, identificatori, constante, operatori, delimitatori . Din punctul de vedere al analizei lexicale ¸si al modului de prelucrare, unit˘a¸t ile lexicale pot fi de dou˘ a categorii:
• Unit˘a¸t i lexicale simple, sunt unit˘a¸t i lexicale care nu comport˘a atribute suplimentare, de exemplu, cuvintele cheie, operatorii; a¸ti lexicale care comport˘a • Unit˘a¸t i lexicale compuse (atributive), sunt unit˘ anumite atribute suplimentare, de exemplu, identificatorii ¸si constantele. Atributele sunt informat¸ii specifice, de exemplu, tipul identificatorului sau al constantei (ˆıntreg, real, etc.). Este necesar˘ a specificarea tipului unui identificator sau al unei constante din startul programului deoarece structura programului obiect sau reprezentarea intern˘ a a constantelor depinde de acest tip. Reprezentarea intern˘ a a unit˘a¸tilor lexicale se face ˆın funct¸ie de categoria lor. Cele simple se reprezint˘ a printr-un cod specific(num˘ ar ˆıntreg). Unit˘a¸tile lexicale compuse se reprezint˘ a prin cod ¸si informat¸ii (de natur˘ a semantic˘ a) asupra sa. De obicei compilatoarele utilizeaz˘ a tabele pentru stocarea atributelor (tabel de constante, tabel de variabile, tabel de etichete, etc.). In acest caz unitatea lexical˘ a se reprezint˘ a intern printr-un cod urmat de o referint¸a˘ ˆıntr-un tabel. Informat¸ia cont¸inut˘a de tabel ar putea fi pentru constante: cod, tip, valoare, iar pentru identificatori: cod, tip, indicator de init¸ializare. Este posibil ca o clas˘ a de unit˘a¸t i lexicale simple s˘a se reprezinte printr-un cod unic ¸si un atribut pentru distingerea ˆın cadrul clasei. De exemplu, operatorii aritmetici cu aceia¸si prioritate au o tratare similar˘ a din punct de vedere al analizei sintactice. Lista unit˘ a¸tilor lexicale ¸si definit¸ia riguroas˘ a a acestora se d˘a la proiectarea compilatorului. Un exemplu de unit˘a¸t i lexicale ¸si coduri asociate ar putea fi cele din figura 2.8. Analizorul prime¸ste textul surs˘ a ¸si produce ¸sirul de unit˘ a¸ti lexicale ˆın codificarea intern˘ a. De exemplu secvent¸a de text surs˘ a urm˘atoare: {if (unu < 2) return 0; a=33; }
40
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
Unitate lexical˘a if else identificator constant˘ a ˆıntreag˘ a constant˘ a real˘ a + × / < > <= >= ( ) { }
COD if = 1 else = 2 ID = 3 NUM = 4 FLOAT = 5 op = 6 op = 6 op = 6 op = 6 opr = 7 opr = 7 opr = 7 opr = 7 LPAR = 8 RPAR = 9 LBRACE = 10 RBRACE = 11
ATRIBUT
Exemplu
referint¸˘ a referint¸a˘ referint¸a˘ 1 2 3 4 1 2 3 4 -
if, If, IF else ElSe Nelu v tabel 4 -3 233 4.32 -3.233
Figura 2.8: Coduri asociate unit˘ atilor lexicale
˘ 2.4. ANALIZA LEXICALA
41
va produce sirul de unit˘a¸ti 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 g˘asite atributul identificatorului este adresa relativa din tabela de identificatori, analog atributele constantelor numerice sunt adrese relative ˆın tabelele de constante. Majoritatea limbajelor evoluate cont¸in ¸si secvent¸e de text care nu sunt unit˘ a¸ti lexicale, dar au act¸iuni specifice asociate . De exemplu: comentarii
/* text */
directive de preprocesare
#include #define MAX 5.6
ˆInaintea analizei lexicale (sau ca subrutin˘ a) se preproceseaz˘a textul ¸si abia apoi se introduce rezultatul ˆın analizorul lexical. a a unit˘ a¸tilor lexicale se face Specificarea unit˘ at¸ilor lexicale Definirea riguroas˘ de c˘ atre proiectantul limbajului. O posibilitate de descriere este limbajul natural. De exemplu, pentru C ¸si JAVA: ”Un identificator este o secvent ¸a de litere ¸si cifre: primul caracter trebuie s˘ a fie liter˘ a. Liniut ¸a de subliniere conteaz˘ a ca liter˘ a. Literele mari ¸si mici sunt diferite. Dac˘ a ¸sirul de intrare a fost ˆımp˘ art ¸it ˆın unit˘ at ¸i lexicale pˆan˘ a la un caracter dat, noua unitate lexical˘ a se consider˘ a astfel ˆıncˆ at s˘ a includ˘ a cel mai lung ¸sir de caractere ce poate constitui o unitate lexical˘ a. Spat ¸iile, taburile, newline ¸si comentariile sunt ignorate cu except ¸ia cazului cˆ and servesc la separarea unit˘ at ¸ilor lexicale. Sunt necesare spat ¸ii albe pentru separarea identificatorilor, cuvintelor cheie ¸si a constantelor.” Orice limbaj rezonabil poate fi folosit pentru implementarea unui analizor lexical. Unit˘a¸t ile lexicale se pot specifica cu ajutorul limbajelor regulate, deci folosind gramatici de tipul 3 sau expresii regulate ce noteaz˘ a limbajele. Ambele specificat¸ii conduc la construirea de automate finite echivalente, care se pot u¸sor programa. ˆIn cele ce urmeaz˘a, vom folosi ambele variante de specificare pentru un set uzual de unit˘ a¸ti lexicale ˆıntˆalnit la majoritatea limbajelor evoluate. Consider˘am gramatica regulat˘a ce genereaz˘ a identificatori, 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|f or < op >→ + | − | ∗ |/ < opr >→< | <= | > | >=
42
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
unde l-litera, c-cifra. Pornind de la aceast˘ a gramatic˘ a se poate construi una echivalent˘ a ˆın form˘ a normal˘a , apoi se extrage funct¸ia de evolut¸ie a automatului finit determinist echivalent ce recunoa¸ste unit˘ a¸tile lexicale. Descrieri echivalente ale unit˘ a¸tilor 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˘ a m c˘a exist˘a programe specializate (Lex, Flex, JavaCC) ce genereaz˘a un analizor lexical (ˆın C sau Java) pornind de la expresiile regulate. Sintaxa folosit˘ a ˆın scrierea expresiilor regulate este dependent˘ a de programul folosit. Programarea unui analizor lexical Realizarea efectiv˘ a a unui analizor revine la simularea funct¸ion˘ a rii unui automat finit. O variant˘ a de programare este ata¸sarea unei secvent¸e de program la fiecare stare a automatului. Dac˘ a starea nu este stare final˘ a atunci secvent¸a cite¸ste urm˘ atorul caracter din textul surs˘a ¸si g˘ase¸ste urm˘atorul arc din diagrama de st˘ ari. Depinzˆ and de rezultatul c˘ aut˘arii se transfer˘ a controlul altei st˘ ari sau se returneaz˘ a e¸sec (posibil˘ a eroare lexical˘ a). Dac˘a starea este final˘ a atunci se apeleaz˘a secvent¸a de returnare a codului unit˘ a¸tii lexicale ¸si eventuala instalare a unit˘ a¸tii lexicale ˆın tabelele compilatorului. Pentru simplificarea implement˘ arii se caut˘ a urm˘atoarea unitate lexical˘ a prin ˆıncercarea succesiv˘ a a diagramelor corespunz˘ atoare fiec˘ arei unit˘ a¸ti lexicale (ˆıntro ordine prestabilit˘ a). Eroarea lexical˘ a se semnaleaz˘ a doar atunci cˆ and toate ˆıncerc˘arile se ˆıncheie cu e¸sec. De obicei textul surs˘ a cont¸ine ¸si secvent¸e ce se pot descrie cu ajutorul expresiilor regulate, dar care nu sunt unit˘ a¸t i lexicale (de exemplu comentariile). Aceste secvent¸e nu vor genera cod lexical, dar au asociate diverse act¸iuni specifice. Pentru a evita aparit¸ia unor caractere necunoscute in textul surs˘ a se consider˘ a ¸si limbajul ce const˘ a din toate simbolurile ASCII. Astfel, indiferent de unde ˆıncepe analiza textului, programul de analiz˘ a lexical˘a g˘ase¸ste o potrivire cu o descriere. Spunem c˘ a specificat¸ia este complet˘ a. Exist˘a posibilitatea ca mai multe secvent¸e cu aceea¸si origine s˘ a corespund˘ a la diferite descrieri ale unit˘ a¸t ilor lexicale. Se consider˘ a unitate lexical˘ a cel mai lung ¸sir ce se potrive¸ste unei descrieri (longest match rule). Dac˘a sunt dou˘ a reguli
˘ 2.4. ANALIZA LEXICALA
43
care se potrivesc la acela¸si ¸sir de lungime maxim˘ a atunci se consider˘ a o prioritate asupra descrierilor (rule priority). De exemplu, in textul urm˘ ator, i
if
if8
unit˘a¸tile lexicale delimitate vor fi i–identificator, if –cuvˆant cheie, if8–identificator. Regula de prioritate se aplic˘ a pentru potrivirea lui if cu identificator ¸si cuvˆ ant cheie, iar criteriul de lungime maxim˘a pentru if8. Pentru depistarea celei mai lungi potriviri, din punt de vedere al program˘ arii analizorului, este suficient s˘ a prevedem un pointer suplimentar pe caracterul ce corespunde ultimei st˘ ari finale atinse pe parcursul citirii. arii unui analizor lexical ce delimStudiu de caz. Se consider˘a problema realiz˘ iteaz˘a ˆıntr-un text surs˘a cuvinte din limbajul ce cont¸ine identificatori, cuvinte cheie (pentru simplificare folosim doar cuvˆ antul cheie if), constante numerice (ˆıntregi f˘ar˘a semn). De asemenea se face salt peste spat¸iile albe ¸si se ignor˘ a comentariile. Presupunem c˘ a un comentariu ˆıncepe cu dou˘ a caractere slash ¸si se termin˘a cu newline. Orice caracter ce nu se potrive¸ste 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
ator expresiilor avem urm˘ atoarele automate finite deterEtapa II. Corespunz˘ ministe echivalente, prezentate ˆın figura 2.9 (st˘ arile au fost notate prin numere ˆıntregi): Etapa III. Se construie¸ste sistemul tranzit ¸ional (vezi figura 2.10) ce recunoa¸ste limbajul reuniune, ad˘ augˆand o nou˘a stare init¸ial˘a (notat˘ a cu 1), pe care o conect˘ am prin arce punctate (ce corespund λ-tranzit¸iilor). Construct¸ia provine din legarea sistemelor tranzit¸ionale ˆın paralel . S-au renumerotat st˘ arile sistemului tranzit¸ional, asignˆand nume simbolice st˘arilor finale. Etapa III. Construct¸ia automatului finit determinist general ce recunoa¸ste reuniunea limbajelor. Pentru aceasta sistemul tranzit¸ional se transform˘a cu teorema de echivalent¸a˘ ˆın automat finit determinist (practic se trece de la st˘ ari ale sistemului tranzit¸ional la submult¸imi de st˘ari, ce devin st˘ arile automatului finit).
44
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
a-z 0-9
a-z 2
1
ID 0-9
0-9 NUM
2
1
\n \ \tb \n \ \tb WS
2
1
a-z,\b /
/ 2
1
orice 1
\n 3
2
4
COM
ERR
Figura 2.9: Automatele finite corespunz˘ atoare expresiilor regulate ˆIn cazul particular al automatului nostru, diagrama de st˘ ari este dat˘a ˆın figura 2.11. Etapa IV. Programarea analizorului lexical . Automatul finit obt¸inut are st˘ arile finale asociate cu clasele de cuvinte recunoscute. Se asociaz˘ a act¸iuni st˘arilor finale, corespunz˘ ator definit¸iilor unit˘a¸tilor lexicale (de exemplu pentru constante numerice se genereaz˘ a reprezentarea interna, se memoreaz˘a ˆın tabelul de constante ¸si se returneaz˘ a codul unit˘ a¸tii lexicale NUM). Pentru programarea analizorului se folosesc trei variabile de tip pointer in textul surs˘a: FirstSymbol, CurrentSymbol, LastFinalSymbol, ce ret¸in indicele caracterului de ˆınceput al secvent¸ei, indicele caracterului ce urmeaz˘a la citire, indicele ultimului caracter ce corespunde atingerii unei st˘ ari finale. Cei trei pointeri au fost reprezentat¸i prin semnele grafice | , ⊥ respectiv . De asemenea consider˘ am o variabil˘a State, ce ret¸ine starea curent˘ a a automatului. In tabelul 2.12 este indicat˘ a evolut¸ia analizorului lexical (inclusiv act¸iunile asociate) pentru cazul analizei urm˘ atorului text surs˘ a. if if8%// ha\n
Pentru simplificarea codific˘ arii, st˘arile automatului finit determinist au fost redenumite prin numere ˆıntregi ˆıncepˆ and cu starea init¸ial˘ a 1, starea {3, 6, 16} = 2, {4, 6} = 3, { 6, 16} = 4, ¸s.a.m.d. de la stˆanga la dreapta ¸si de sus ˆın jos. De obicei
˘ 2.4. ANALIZA LEXICALA
45
i 2
f 4
3
a-z 0-9
a-z 6
5
IF
ID 0-9
0-9 NUM
8
7
\n \b \t
1
\n \ \tb
/
/ 12
11
orice 15
WS a-z ,\b
10
9
16
\n 13
14
COM
ERR
Figura 2.10: Sistemul tranzit¸ional ce recunoa¸ste reuniunea limbajelor
46
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
ID
IF f
3,6,16
4,6
i 0-9
ID a-h j-z
a-e g-z
a-z 0-9
a-z 0-9
a-z 6
6,16
0-9 ID
0-9
NUM
1
0-9 8,16
\n \b \t
WS
\n \b \t
10,16
/
ERR 12,16
ERR orice altceva
COM /
\n 14
13
a-z, \b
16
Figura 2.11: Automatul finit determinist ce recunoa¸ste reuniunea limbajelor
˘ 2.4. ANALIZA LEXICALA
Last Final 0 2 3 0 7 0 2 3 5 0 11 0 0 0 ...
Current State 1 2 3 0 1 7 0 1 2 3 5 0 1 11 0 1 8 9 ...
Current Input
| ⊥ i f i f 8 % / / h a \ n | i ⊥ f i f 8 % / / h a \ n | i f ⊥ i f 8 % / / h a \ n | i f ⊥ i f 8 % / / h a \n i f | ⊥ i f 8 % / / h a \ n i f | ⊥ i f 8 % / / h a \ n i f | i⊥ f 8 % / / h a \n i f | ⊥ i f 8 % / / h a \ n i f | i ⊥ f 8 % / / h a \ n i f | i f ⊥ 8 % / / h a \ n i f | i f 8 ⊥ % / / h a \ n i f | i f 8 %⊥ / / h a \n i f i f 8| ⊥ % / / h a \ n i f i f 8| % ⊥ / / h a \ n i f i f 8| % /⊥ / h a \n i f i f 8 %| ⊥ / / h a \ n i f i f 8 %|/⊥ / h a \ n i f i f 8 %|/ /⊥ h a \ n ...
47
Accept Action
return cc =< if > resume
resume
return id =< if 8 > resume print (”illegal character: %”); resume
Figura 2.12: Evolut¸ia analizorului lexical pentru textul if if8 %// ha\n
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
48
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 finit funct¸ia de evolut¸ie asociat˘a automatului finit determinist se memoreaz˘ a sub forma unui tablou bidimensional de ˆıntregi, ca ˆın figura 2.13. Starea 0 este asociat˘ a cu blocarea automatului. Ajungerea ˆın aceast˘ a stare echivaleaz˘ a cu g˘ asirea ultimei unit˘a¸ti lexicale, ˆıntre pointerii | ¸si . Se execut˘a act¸iunea asociat˘ a st˘arii finale ¸si se reia c˘ autarea (resume ) urm˘ atoarei unit˘ a¸ti lexicale ˆıncepˆ and cu caracterul imediat urm˘ ator pointerului . a Observat ¸ie : Cele mai costisitoare operat¸iuni (ca timp) din analiza lexical˘ sunt ignorarea comentariilor ¸si tratarea erorilor lexicale. Primele generatoare automate de analizoare lexicale ¸si sintactice au ap˘ arut ˆın anii 70 ¸si au fost incluse ˆın sistemul de operare Unix.
2.5
Probleme propuse
1. Construit¸i automate finite pentru recunoa¸sterea limbajelor: (a) L = { PSDR,PNL,PUNR}; (b) L = { w| ¸siruri de 0 ¸si 1 terminate cu 1 } ; (c) L = { w|w identificator PASCAL } ; (d) L = { w|w constant˘ a ˆıntreag˘a cu semn ˆın PASCAL } ; (e) L = { w ∈ {0, 1}∗ |w multiplu de 3 } ; (f) L = { ai b j |i, j > 0 }; (g) L = ∅ . 2. Construit¸i automate finite echivalente cu gramaticile de tipul trei de la problema 1 capitolul 1.
2.5. PROBLEME PROPUSE
49
3. Construit¸i automate finite deterministe echivalente cu cele nedeterministe obt¸inute la problema precedent˘ a. 4. G˘asit¸i gramatici regulate echivalente cu automatele de la problema 1. 5. Folosind lema de pompare pentru limbaje regulate dovedit ¸i c˘a urm˘atoarele limbaje nu sunt regulate: 2
(a) L = {0i |i ≥ 1 }; n
(b) L = {02 |n ≥ 1 }; (c) L = {0n |n este num˘ ar prim } ; (d) L = {0m 1n 0m+n |m ≥ 1, n ≥ 1 }; 6. Specificat¸i limbajele denotate de urm˘ atoarele 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 specificate la problema precedent˘ a. Pentru fiecare sistem tranzit¸ional construit¸i un automat finit determinist echivalent.
50
˘ CAPITOLUL 2. LIMBAJE REGULATE S¸I ANALIZA LEXICAL A
Capitolul 3 Limbaje Independente de Context 3.1
Arbori de derivare
Caracterizarea familiei L2 cu arbori de derivare . Una din caracteristicile de baz˘a ale limbajelor independente de context este aceea c˘ a o derivare ˆıntr-un astfel de limbaj poate fi reprezentat˘ a de un arbore, numit in acest context arbore de derivare . Aceast˘ a reprezentare este important˘ a ˆın mod special pentru faptul c˘a permite o imagine intuitiv˘ a simpl˘a a unei deriv˘ ari ¸si deci posibilitatea de a lucra u¸sor cu limbaje de tipul 2. Vom prezenta ˆın primul rˆ a nd cˆ ateva not¸iuni elementare de teoria grafurilor, cu scopul de a preciza notat¸iile ¸si terminologia. Un graf orientat G este o pereche G = (V, Γ) unde V este o mult¸ime finit˘a iar Γ o aplicat¸ ie Γ : V −→ P (V ). Mult¸imea V se nume¸ste mult¸imea vˆarfurilor (nodurilor) grafului iar dac˘ a v2 ∈ Γ(v1 ), perechea (v1 , v2 ) este un arc ˆın graf; v1 este originea iar v2 este extremitatea arcului. Un drum de la vˆırful v la vˆarful v ˆın graful G este o mult¸ ime de arce (v1 , v2 )(v2 , v3) . . . (vn−1, vn ) cu v = v1 ¸si v = v n . Num˘arul n − 1 este lungimea drumului . Un drum pentru care v1 = vn se nume¸ste circuit . Un circuit de lungime 1 poart˘a numele de bucl˘ a . ar˘ a circuite, cu card(V ) ≥ 2 ¸si care satDefinit¸ie 3.1 Un arbore este un graf f˘ isface urm˘ atoarele dou˘ a condit ¸ii : 1. ∃v0 ∈ V astfel ˆıncˆ at v0 ∈ Γ(v), ∀v ∈ V ; v0 se nume¸ste r˘ad˘ acina arborelui; 2. ∀v ∈ V \ {v0}, ∃!w cu v ∈ Γ(w); altfel spus orice vˆ arf diferit de v0 este extremitatea unui singur arc. a de: Exemplu . V = {v0 , v1 , v2 , v3 , v4 } iar funct¸ia Γ este dat˘ x Γ(x)
v0 v1 {v1 , v2} ∅ 51
v2 v3 { v3 , v 2 } ∅
v4 ∅
52
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
Nivel 0 v0
Nivel 1 v2
v1
Nivel 2 v3
v4
Figura 3.1: Reprezentarea grafic˘ a a arborelui G = (V, Γ). Reprezentarea ˆın plan a acestui arbore este dat˘ a in figura 3.1 Nodurile v pentru care Γ(v) = ∅ se numesc noduri terminale (finale); celelalte se numesc interne . Mult¸imea nodurilor terminale constituie frontiera arborelui. ˆIn general vom nota un arbore cu litere mari, specificˆınd ca indici r˘ ad˘acina ¸si frontiera; de exemplu A v , v v v . Un arbore comport˘ a mai multe ramuri ; ˆın exemplu avem urm˘atoarele ramuri : v0 v1 , v0 v2v3 , v 0 v2 v4 . Fie G = (V N , V T , S , P ) o gramatic˘ a de tipul 2. 0
1
2
3
Definit¸ie 3.2 Un arbore de derivareˆın gramatica G este un arbore cu urm˘ atoarele dou˘ a propriet˘ at ¸i . (1) Nodurile sunt etichetate cu elementele din V G ; (2) Dac˘ a un nod v are descendent ¸i direct ¸i v1, . . . , vn atunci v → v 1v2 . . . vn ∈ P . Exemplu . G = ({A, B }, {a, b}, A , P ) unde P = {A → aBA|Aa|a, B → AbB |ba|abb}. Arborele AA, aabbaa reprezentat ˆın figura 3.2 (Varianta 1) este un arbore de derivare (poate fi desenat coborˆ and frontiera pe nivelul ultim , Varianta 2): ∗
Teorema 3.1 Fie G o gramatic˘ a de tipul 2. Atunci X ⇒ p dac˘ a ¸si numai dac˘ a exist˘ a un arbore AX, p . ∗
Demonstrat ¸ie . X ⇒ p implic˘a ∃A X, p . Proced˘am prin induct¸ie asupra lungimii deriv˘arii l. Dac˘a l = 1, X ⇒ p = i 1 . . . in ¸si X → i1 . . . in ∈ P . Arborele din figura 3.3 corespunde cerint¸elor teoremei.
3.1. ARBORI DE DERIVARE
53
Varianta 1
Varianta 2
A
a
A
A
B
A
a
b
a
B
b
A
B
A
a
b
a
a
B
b
Figura 3.2: Variante de reprezentare a arborelui A A, aabbaa .
X
i1
i2
...
in
Figura 3.3: Arbore corespunz˘ ator unei deriv˘ ari directe.
a
a
54
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
X
X1
p1
X2
p2
...
Xm
...
pm
Figura 3.4: Construct¸ia arborelui A X,p
1
...pm
.
Presupunem c˘ a proprietatea este adev˘ arat˘ a pentru deriv˘ ari de lungime l ¸si ∗ consider˘am o derivare de lungime l + 1, X ⇒ p. Punem ˆın evident¸a˘ prima derivare direct˘a ∗ X ⇒X 1 . . . Xn ⇒ p ∗
Conform lemei de localizare, p = p1 . . . pn ¸si X j ⇒ p j , j = 1, m. Putem face ∗ urm˘atoarea construct¸ie: conform ipotezei inductive, fiec˘ arei deriv˘ ari X j ⇒ p j ˆıi corespunde cˆ ate un arbore AX j ,pj ; unim apoi toate nodurile X j ˆın nodul X plasat la nivelul zero. Obt¸inem astfel un arbore AX,p ...pm = A X,p (vezi figura 3.4) care corespunde cerint¸elor teoremei. ∗ Pentru implicat¸ia , ∃AX,p ⇒ X ⇒ p, se parcurge o cale invers˘ a , f˘acˆand o induct¸ie asupra num˘ arului de nivele. De exemplu, dac˘ a acest num˘ a r este 2, arborele de derivare trebuie s˘ a arate ca ˆın 3.3 ¸si deci avem X → i 1 i2 . . . in = p ∈ P ∗ ¸si X ⇒ p, etc. 1
3.2
Ambiguitate ˆın familia L2.
Fie G o gramatic˘ a de tipul 2. O derivare S = u0 ⇒ u1 ⇒ . . . ⇒ un ˆın care la fiecare derivare direct˘ a se ˆınlocuie¸ste simbolul neterminal cel mai din stˆ anga (dreapta) se nume¸ste derivare extrem stˆ ang˘ a (dreapt˘ a). S˘a observ˘ am c˘a ˆın particular ˆıntr-o gramatic˘ a de tipul 3 orice derivare este extrem dreapt˘ a (scrierea drept liniar˘ a).
Definit¸ie 3.3 O gramatic˘ a G de tipul 2 ˆın care exist˘ a un cuvˆ ant p ∈ L(G) care se poate obt ¸ine cu dou˘ a deriv˘ ari extrem stˆ angi (drepte) distincte, se nume¸ste ambigu˘ a. In caz contrar este neambigu˘ a.
3.2. AMBIGUITATE ˆIN FAMILIA L2 .
55
Exemplu . Gramatica A → aBA |Aa|a, B → AbB |ba|abb este ambigu˘ a. ˆIntradev˘ar, avem A⇒aBA ⇒aBa ⇒aAbBa⇒aAbbaa⇒aabbaa; A⇒Aa⇒aBAa⇒aBaa⇒aabbaa. a toate gramaticile care ˆıl genereaz˘ a Definit¸ie 3.4 Un limbaj este ambigu dac˘ ˆ caz contrar (adic˘ sunt ambigue. In a dac˘ a exist˘ a o gramatic˘ a neambigu˘ a care s˘ a ˆıl genereze) limbajul este neambigu. Dac˘a G este ambigu˘ a ¸si p ∈ L(G) este un cuvˆ ant care se poate obt¸ine cu dou˘ a deriv˘ari extrem stˆ angi distincte, atunci exist˘ a arborii AS, p ¸si AS, p , diferit¸i, dar care au aceia¸si r˘ ad˘acin˘a ¸si frontier˘a.
Teorema 3.2 Dac˘ a L1 ¸si L2 sunt limbaje disjuncte neambigue, atunci L1 ∪ L2 este neambigu. Demonstrat ¸ie . Fie Gk = (V Nk , V T k , S k , P k ), k = 1, 2 dou˘ a gramatici de tipul 2 neambigue ¸si fie G = (V N ∪ V N , V T ∪ V T , S , P1 ∪ P 2 ∪ {S → S 1|S 2 }) gramatica ce genereaz˘ a limbajul L(G1 ) ∪ L(G2 ). S˘a presupunem c˘a L(G) este ambigu˘a. Atunci exist˘a p ∈ L(G) care se poate obt¸ine cu dou˘ a deriv˘ari extreme stˆ angi diferite. S˘ a presupunem c˘ a p ∈ L(G1 ), p ∈ L(G2 ). Atunci obt¸inem dou˘a deriv˘ari distincte ˆın gramatica G 1
2
1
2
∗
∗
G
G1
∗
∗
G
G2
(1) S ⇒ S 1 ⇒ p, deci S 1 ⇒ p; G
(2) S ⇒ S 1 ⇒ p, deci S 1 ⇒ p, G
deci ¸si dou˘ a deriv˘ari extrem stˆ angi ˆın gramatica G1 . Aceasta ar ˆınsemna c˘ a G1 este ambigu˘ a. Contradict¸ie cu ipoteza!
Teorema 3.3 Limbajele de tipul 3 sunt neambigue. Demonstrat ¸ie . Fie L un limbaj de tipul 3 ¸si G gramatica care ˆıl genereaz˘ a; fie apoi AF automatul finit care recunoa¸ste limba jul L ¸si AF D automatul finit echivalent determinist. Construim gramatica G astfel ˆıncˆat L(G ) = L(AF D). Reamintim c˘a regulile lui G se construiesc astfel f (A, a) = B ⇒ A → aB , f (A, a) ∈ Σ f ⇒ A → a. S˘a presupunem acum c˘ a L este ambigu; atunci orice gramatic˘ a care ˆıl genereaz˘ a, inclusiv G , este ambigu˘ a. Aceasta ˆınseamn˘ a c˘a exist˘a un p ∈ L(G ) astfel ˆıncˆ at S ⇒i1 A1 ⇒i1 i2 A2 ⇒ . . . ⇒i1 . . . in−1 An−1
⇒ i 1 . . . in An ⇒ ⇒ i 1 . . . in An ⇒
∗
⇒ p.
Deci exist˘a regulile An−1 → in An ¸si An−1 → i n An , adic˘a ˆın automatul AF D avem f (An−1 , in ) = A n , f (An−1 , in ) = A n , ceea ce contrazice faptul c˘ a AF d este determinist.
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
56
3.3
Forme normale pentru gramatici de tipul 2
Forma normal˘ a Chomsky. a ˆın forma normal˘a Chomsky este o gramatic˘ a cu reguli Definit¸ie 3.5 O gramatic˘ de forma A → BC, D → i, unde A, B,C,D ∈ V N ¸si i ∈ V T . Se accept˘ a ¸si regula de completare S → λ cu condit ¸ia ca S s˘ a nu apar˘ a ˆın dreapta vreunei reguli.
Lema 3.1 (lema substitut ¸iei). Fie G o gramatic˘ a de tipul 2 ¸si X → uY v precum ¸si Y → p 1 . . . pn toate regulile din G care au Y ˆın stˆ anga . Atunci G este echiva lent˘ a cu o gramatic˘ a G ˆın care am f˘ acut ”substitut ¸iile”; adic˘ a facem urm˘ atoarea ˆınlocuire X → uY v se ˆınlocuie¸ste cu X → up 1v | . . . |upn v (Regulile Y → p 1 | . . . | pn le vom p˘ astra neschimbate). ∗
Demonstrat ¸ie . Fie p ∈ L(G) ¸si S ⇒ p. Punem ˆın evident¸a˘ doi pa¸si consecutivi oarecare: ∗ ∗ G : S ⇒r ⇒s⇒t⇒ p. Dac˘a ˆın r⇒s se utilizeaz˘ a regula X → uY v atunci ˆın mod necesar ˆın pasul urm˘ator se utilizeaz˘ a una din regulile Y → p1 | . . . | pn , s˘a presupunem Y → p j (evident, este posibil ca aceast˘ a regul˘a s˘a nu se aplice ˆın pasul imediat urm˘ ator, dar ea poate fi ”adus˘ a” ˆın aceast˘ a pozit¸ie). Prin urmare (A) G : r = r Xr ⇒r uY vr ⇒r up j vr = t. Ace¸sti doi pa¸si se pot obt¸ine ¸si ˆın G (ˆıntr-un singur pas): (B) G : r = r Xr ⇒r up j r = t. ∗
Deci S ⇒ p, p ∈ L(G ) ¸si L(G) ⊆ L(G ). G
∗
Invers, dac˘ a p ∈ L(G ) ¸si S ⇒ p, atunci dac˘ a la un pas se utilizeaz˘a o regul˘ a G
nou introdus˘ a (pasul (B)), transformarea respectiv˘ a se poate obt¸ine ¸si ˆın G cu doi pa¸si (pa¸sii (A)); deci p ∈ L(G) ¸si L(G ) ⊆ L(G).
Corolar 3.4 Orice gramatic˘ a de tipul 2 este echivalent˘ a cu o gramatic˘ a de acela¸si tip ˆın care mult ¸imea de reguli nu cont ¸ine redenumiri. (O redenumire este o regul˘ a de forma A → B, A, B ∈ V N ).
3.3. FORME NORMALE PENTRU GRAMATICI DE TIPUL 2
57
Intr-adev˘ ar, dac˘ a A → B ∈ P este o redenumire ¸si B → p 1 | . . . | pn sunt toate regulile care au B ˆın stˆ anga, efectu˘ am substitut¸iile, deci ˆınlocuim regula A → B cu A → p1| . . . | pn . ˆIn cazul ˆın care printre acestea apare o nou˘ a redenumire, repet˘ am procedeul. Exemplu . Gramatica GE care genereaz˘ a expresii aritmetice E → E +T |T, T → atoarea form˘ a (f˘ar˘a redenumiri) : T ∗ F |F, F → (E )|i se poate pune sub urm˘ 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 gramatic˘ a independent˘ a de context este echivalent˘ a cu o gramatic˘ a ˆın forma normal˘ a Chomsky. ema2 Demonstrat ¸ie . Putem porni de la o gramatic˘ a G care nu are redenumire ¸si ale c˘ arei reguli cu terminale au forma A → i, A ∈ V N , i ∈ V T . De asemenea presupunem c˘a G nu are reguli de ¸stergere. Rezult˘a c˘a regulile lui G au una din formele: (1) A → BC, (2) D → i, (3) X → X 1 . . . Xn , n > 2. Construim o gramatic˘ a 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 regul˘ a de forma (3) o ˆınlocuim cu: X → X 1Z 1 , Z 1 → X 2 Z 2 , ... Z n−2 → X n−1 X n ¸si includem neterminalele Z 1 , . . . , Zn −2 (altele pentru fiecare regul˘ a de forma (3) ˆın V N . Se poate relativ u¸sor ar˘ ata c˘ a L(G) = L(G ). De exemplu, dac˘a u ⇒v (direct) ˆın G ¸si de aplic˘ a o regul˘ a de forma (1) sau (2), atunci evident derivarea respectiv˘ a se poate obt¸ine ¸si ˆın G ; ˆın cazul ˆın care se aplic˘ a o regul˘a de forma (3), avem
G : u = u Xu ⇒u X 1 . . . Xn u = v. Aceast˘a derivare se poate obt¸ine ¸si ˆın G ˆın mai mult¸i pa¸si ¸si anume
G : u = u Xu ⇒u X 1 Z 1 u ⇒u X 1 X 2 Z 2 u ⇒ . . . ⇒u X 1 . . . Xn u = v. Observat ¸ie . O gramatic˘ a ce are reguli de forma A → BC,A → B, A → a unde A, B,C ∈ V N ¸si a ∈ V T spunem c˘ a este ˆın forma 2–canonic˘ a . Este evident c˘a orice gramatic˘ a de tip 2 este echivalent˘ a cu o gramatic˘ a ˆın form˘ a 2–canonic˘ a. Gramatici recursive
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
58
Definit¸ie 3.6 Un simbol neterminal X al unei gramatici de tipul 2 este recursiv dac˘ a exist˘ a o regul˘ a de forma X → uXv, u, v ∈ V G∗ . Dac˘a u = λ (v = λ) simbolul X este stˆang (drept) recursiv. O gramatic˘ a ce are cel put¸in un simbol recursiv se nume¸ste recursiv˘ a. De exemplu, gramatica GE care genereaz˘ a expresiile aritmetice are dou˘ a simboluri stˆang recursive, E ¸si T . Existent¸a simbolurilor stˆ ang recursive poate provoca dificult˘ a¸tiˆın aplicarea algoritmilor de analiz˘ a top-down. ˆIntr-adev˘ ar, ˆıntr-o astfel de gramatic˘ a, ˆıncercarea de a construi arborele de derivare corespunz˘ ator unui cuvˆ ant p prin aplicarea ˆıntotdeauna a primei reguli pentru simbolul cel mai din stˆ anga, poate s˘ a conduc˘ a la un ciclu infinit (de exemplu ˆın GE s-ar obt¸ine E ⇒E + T ⇒E + T + T ⇒ . . .).
Teorema 3.6 Orice limbaj de tipul 2 poate s˘ a fie generat de o gramatic˘ a f˘ ar˘ a recursie stˆ ang˘ a. Demonstrat ¸ie . Fie G = (V N , V T , S , P ) o gramatic˘ a de tipul 2; presupunem c˘ aG are un singur simbol recursiv X ¸si fie (A) X → u 1|u2 | . . . |un |Xv1 | . . . |Xvm toate regulile care au X ˆın stˆ anga. 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 |u2 | . . . |un |u1 Y |u2 Y | . . . |un Y, Y → v 1 | . . . |vm |v1 Y | . . . |vm Y G este de tipul 2 ¸si nu are simboluri stˆ ang recursive; se vede ˆıns˘ a c˘a Y este un simbol drept recursiv. ∗ Fie p ∈ L(G), S ⇒ p. Dac˘ a ˆın aceast˘ a derivare nu intervine simbolul reG
∗
cursiv, atunci evident c˘ a S ⇒ p. S˘a presupunem c˘ a X intervine la un anumit G
pas: S ⇒u⇒ p, unde u = u Xu . Putem aplica, ˆıncepˆ and de la u spre dreapta, ˆın primul rˆand regulile pentru X ¸si s˘a urm˘arim numai subarborele respectiv, deci G : X ⇒ Xv j ⇒ Xv j v j ⇒ . . . ⇒ Xv js . . . v j ⇒ u j v js . . . v j . 1
G
2
1
G
1
G
G
1
G
Aceea¸si form˘ a propozit¸ional˘ a o putem obt¸ine ¸si ˆın gramatica G astfel G : X ⇒ u j Y ⇒ u j v js Y ⇒ . . . ⇒ u j v js . . . v j . 1
G
G
G
G
Prin urmare avem S ⇒ u ⇒ p, adic˘a p ∈ L(G ) ¸si L(G) ⊆ L(G ). Analog, G
G
L(G ) ⊆ L(G). Forma normal˘ a Greibach.
3.3. FORME NORMALE PENTRU GRAMATICI DE TIPUL 2
59
Definit¸ie 3.7 O gramatic˘ a ˆın forma normal˘ a Greibach este o gramatic˘ a cu reguli de forma A → ip, unde A ∈ V N , i ∈ V T p ∈ V N ∗ . Se accept˘ a ¸si regula de completare S → λ cu condit ¸ia ca S s˘ a nu apar˘ a ˆın dreapta vreunei reguli.
Teorema 3.7 (Teorema de existent ¸˘ a a formei normale Greibach). Orice gramatic˘ a de tipul 2 este echivalent˘ a cu o gramatic˘ a ˆın forma normal˘ a Greibach. Demonstrat ¸ie . Fie G o gramatic˘ a de tipul 2 ˆın forma normal˘ a Chomsky ¸si fie V N = {S = X 1 , X 2, . . . , Xn }. Vom construi o gramatic˘ a echivalent˘ a care s˘a satisfac˘a cerint¸ele din forma normal˘ a Greibach ˆın mai multe etape. at toate regulile care nu sunt Etapa I . Vom modifica regulile de generare astfel ˆıncˆ de forma X → i s˘a satisfac˘ a condit¸ia X j → X k p, j < k, p ∈ V N ∗ . Acest lucru ˆıl facem cu un algoritm pe care ˆıl prezent˘ am ˆıntr-un limbaj nestandard de publicare (tip PASCAL): j := 1; e1: begin Se elimin˘a recursiile stˆangi; neterminalele noi le not˘ am 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 . . . pm toate regulile care au X l ˆın stˆ anga; se efectueaz˘ a toate substitut¸iile. end l := l + 1; if l < j − 1 then goto e2 goto e1 S˘a observ˘ a m c˘a pentru j = 1 ¸si dup˘a eliminarea recursiilor stˆ angi condit¸ia cerut˘ a este evident ˆındeplinit˘a; ˆın plus, dac˘ a au fost recursii, vom avea reguli cu partea stˆang˘ a neterminale noi Y 1, Y 2 , . . .. Mai departe, lu˘ am toate regulile care au ˆın stˆanga X 2 ( j := j + 1 = 2) ¸si efectu˘ am substitut¸iile; acestea se vor transforma ˆın X 2 → X k p cu k ≥ 2 ¸si dup˘a o nou˘ a eliminare a recursiilor stˆ angi vom avea k > 2 plus reguli cu partea stˆang˘a neterminale noi. ˆIn felul acesta toate regulile care au ˆın stˆanga X 1 ¸si X 2 satisfac condit¸ia cerut˘ a; ˆın continuare j := j + 1 = 3, etc. Etapa II . Avem acum trei categorii de reguli:
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
60
(1) X j → i; (2) X j → X k p, j < k, p ∈ V N ∗ ; (3) Y → iq, q ∈ V N ∗ , i = 1, . . . , m. Aranj˘am toate neterminalele ˆıntr-un ¸sir unic, la ˆınceput Y 1, . . . , Ym apoi X 1, . . . , Xn ¸si le redenumim, de exemplu cu X 1 , . . . , Xm +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 stˆ anga vor avea forma (1). Fie X n−1 → ın stˆ anga ¸si care nu sunt de forma X N p 1 | . . . |X N p n toate regulile care au X N −1 ˆ (1). Efecu˘ am substitut¸iile lui X N ; ˆın acest fel regulile care au X N ¸si X N −1 ˆın stˆanga satisfac cerint¸ele din forma normal˘ a Greibach. ˆIn continuare, consider˘ am toate regulile care au X N −2 ˆın stˆ anga ¸si efectu˘ am substitut¸iile, etc. Forma normal˘ a operator Una din formele importante pentru gramatici independente de context, utilizat˘a ˆın analiza sintactic˘ a prin metoda precedent¸ei, este forma operator a acestor gramatici.
Definit¸ie 3.8 O gramatic˘ a independent˘ a de context G = (V N , V T , S , P ) se spune c˘ a este ˆın forma normal˘ a operator dac˘ a oricare ar fi product ¸ia A → β ∈ P , ˆın β nu apar dou˘ a neterminale ( variabile) consecutive, adic˘ a P ⊆ V N × [(V N ∪ V T )∗ \ (V N ∪ V T )∗ V 2 (V N ∪ V T )∗].
Teorema 3.8 Orice gramatic˘ a independent˘ a de context este echivalent˘ a cu o gramatic˘ a ˆın forma normal˘ a operator. Demonstrat ¸ie . Fie G = (V N , V T , S , P ) o gramatic˘ a de tipul 2 ¸si L(G) limbajul generat. F˘ ar˘a a restrˆ ange generalitatea presupunem c˘ a λ ∈ L(G) ¸si G este ˆın forma 2–canonic˘a (regulile sunt de forma A → BC, A → B, A → a vezi teorema ??). Definim o gramatic˘ a 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) ii) iii) iv)
P 1 = { S → (S, a)a| a ∈ V T }; P 2 = { (A, a) → λ | A ∈ V N , a ∈ V T , A → a ∈ P }; P 3 = { (A, a) → (B, a)| A, B ∈ V N , a ∈ V T , A → B ∈ P }; P 4 = { (A, a) → (B, b)b(C, a)| A, B,C ∈ V N , a , b ∈ V T , A → BC ∈ P }.
S˘a observ˘ a m c˘a G este ˆın forma normal˘ a operator. Pentru a demonstra c˘ a L(G) = L(G ) vom defini 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 NORMALE PENTR PENTRU U GRAMATICI GRAMATICI DE TIPUL 2
61
Funct¸ia φ ¸ia φ se extinde ˆın mod mo d natural natur al la φ la φ : (P 2 ∪ P 3 ∪ P 4 )∗ −→ P ∗ . Vom ar˘ata ata c˘ a ∗ ∗ ˆın gramat gra matica ica G, ∀w ∈ V T , ∀a ∈ V T a A ⇒ wa T are loc derivarea extrem dreapt˘ G
folosind product¸iile ¸iile π1 , π2 , . . . , πn dac˘a ¸si si numai dac˘ a exist˘a ˆın P product¸iile ¸iile π1 , π2 , . . . , πn astfel ca φ(πi ) = πi , 1 ≤ i ≤ n ¸si ˆın G are loc derivarea extrem ∗ dreapt˘ a (A, a) ⇒ w folosind product¸iile ¸iile π1 , π2 , . . . , πn . G
S˘a demonstr˘ am am afirmat¸ia ¸ia prin induct¸ie ¸ie dup˘a n, lungimea deriv˘arii. arii. P ¸si ˆın P exist˘a product¸ia Dac˘a n = 1 atunci w = λ, A → a ∈ P ¸ ¸ia (A, (A, a) → λ, deci (A, (A, a)⇒λ ¸si si φ((A, ((A, a) → λ) λ ) = A → a. a . Invers, dac˘a (A, a)⇒w ˆın G atunci w = λ (dup˘ a forma product¸iilor ¸iilor din G ) ¸si si are loc proprietatea enunt ¸at˘ a. a. S˘a presupunem afirmat¸ia ¸ia adev˘ arat˘ arat˘ a pentru deriv˘ ari ari de lungime cel mult n mult n − 1 ∗ ¸si sa˘ o demonstr˘ am am pentru deriv˘ ari ari de lungime n > 1. Fie a¸sadar sadar A ⇒ wa G
o derivare de lungime n ˆın ın gramat gra matica ica G ¸si si punem pun em ˆın evident evid ent¸˘ ¸a˘ prima derivare direct˘a. a. Distingem dou˘a cazuri: B . Atunci, I. Prima product¸ie ¸ie utilizat˘a ˆın ın derivare der ivare este est e A → B. ∗
A ⇒ B ⇒ wa G
G
∗
¸si si confo co nform rm ipote ip otezei zei induct ind uctive ive avem ˆın G ın G o derivare (B, (B, a) ⇒ w (de lungine n lungine n − 1) G
cu product¸ii ¸ii satisf˘acˆ acˆand and condit¸iile ¸iile ar˘atate. a tate. Da Darr cum A → B ∈ P , P , ˆın P avem ∗ product¸ia ¸ia (A, (A, a) → (B, ( B, a) deci (A, (A, a) ⇒ w ˆın gramat gra matica ica G . G
II. Prima product¸ie ¸ie este de forma A → B C . Atunci ∗
A ⇒ BC ⇒ wa. G
G
∗ ˆIn acest caz wa = ubva (conform (conform lemei de localiza localizare), re), astfel astfel c˘ a B ⇒ ub ¸si si G
∗
a, vom avea ˆın G deriv˘arile: arile: C ⇒ va. va . Dup˘a ipoteza inductiv˘a, G
∗
∗
G
G
(B, b) ⇒ u, (C, a) ⇒ v. Cum A → BC ∈ P vom avea ˆın P product¸ia ¸ia (A, (A, a) → (B, b)b(C, a) ¸si ˆın G putem scrie derivarea extrem dreapt˘a ∗
∗
G
G
(A, a)⇒(B, b)b(C, a) ⇒ (B, b)bv ⇒ ubv = ubv = w w ¸si si pro pr o duct du ct¸iile ¸iile care s-au aplicat ˆındeplinesc condit¸iile ¸iile din enunt¸. ¸. ˆIn mod analog se demonstreaz˘a reciproca. reciproca .
CAPITOLUL CAPITOLUL 3. LIMBAJE LIMBAJE INDEPENDE INDEPENDENTE NTE DE CONTEXT CONTEXT
62
Din aceast˘ a afirmat¸ie, ¸ie, luˆand and ˆın partic par ticula ularr A = S = S , obt¸inem: ¸inem: ∗
S ⇒ wa
⇔
∗
(S, a) ⇒ w, ∀w ∈ V T ∗ , ∀a ∈ V T T . G
G
L (G) dac˘ Cum ˆın G exist˘a ¸si si produc pro duct¸ia ¸tia S → (S, ( S, a)a, am g˘asit: asit: wa ∈ L( a ¸si si numai num ai wa ∈ L( L (G ), deci cele dou˘a gramatici sunt echivalente. Pentru a ˆıncheia demonstrat¸ia ¸ ia trebuie s˘a conside consider˘ r˘ am am ¸si si cazul λ ∈ L(G). L(G) \ {λ} ¸si ob¸inem Aplic˘am am construct¸ia ¸ia de mai sus unei gramatici ce genereaz˘ a L( ¸tinem atoare. atoare. Consider˘ am am acum graG = (V N , V T T , S , P ) gramatica operator corespunz˘ matica G1 = (V N = V ∪ {S 1 }, P 1 = P = P ∪ {S 1 → λ, S 1 → S } N , V T T , S 1 , P 1 ) unde V 1 = V care este ˆın forma normal˘ norma l˘ a opera op erator tor ¸si si L(G1 ) = L( L (G). 1
3.4 3.4
Lema Lema Ba Bar– r–Hi Hill llel el
Ca ¸si si ˆın ın cazul cazu l limbajelor limba jelor regulate, regu late, lema Bar–Hillel Bar–Hi llel pune ˆın evident eviden¸˘ ta urm˘ atoarea atoarea proprietate a unui limbaj independent de context: orice cuvˆ ant ant al unui astfel de limbaj, suficient de lung, cont¸ine ¸ine un subcuvˆant ant (nevid) pe care multiplicˆ andu– andu– l de un num˘ ar a r arbitrar de ori, obt¸inem ¸inem noi cuvinte care apart¸in ¸in de asemenea limbajului. Mai poart˘a denumirea de ”lema de pompare” sau ”lema uvwxy ”lema uvwxy”. ”. Ne vom referi ˆın ın cele ce urmeaz˘ a la gramatici gramatici de tipul 2 ˆın form˘ a normal˘ a ˆ Chomsky. Intr-o gramatic˘ a de aceast˘ a form˘ f orm˘a arbo a rborii rii de derivare sunt ˆıntotdeauna ıntotde auna arbori binari. ∗
Lema 3.2 Fie G o a ˆın forma fo rma normal˘ n ormal˘ a Ch Chom omsk skyy ¸si si X a G o gramatic˘ X ⇒ p, p ∈ V G∗ . Dac˘ p| ≤ 2 m−1. cea mai lung˘ a ramur˘ a din arborele AX,p cont ¸ine m noduri, atunci | p Demonstrat ¸ie . Proced˘ am am prin induct¸ie ¸ie asupra lui m. Pentru m = 2 arborele are dou˘ a nivele nive le ¸si si ˆın mod mo d evident evid ent | p| ≤ 2 = 2m−1 . Presupunem c˘ a proprietatea este adev˘ arat˘ arat˘ a pentru un m oarecare oarec are ¸si si conˆ sider˘am am un arbore care are pe cea mai lung˘ a ramur˘ a m + 1 noduri. In derivarea ∗ nem ˆın eviden evi dent¸˘ ¸ta˘ prima derivare direct˘ a X ⇒ p pu p punem ∗
X ⇒Y Z ⇒ p. ∗
∗
Conform lemei de localizare, p = p = p 1 p2 ¸si Y si Y ⇒ p1 , Z ⇒ p2. Arborii de derivare A Y,p ¸si si AZ,p cont¸in, ¸ in, fiecare pe cea mai lung˘ a ramur˘ a cel mult m noduri; noduri; conform m−1 m−1 ipotezei de induct¸ie, ¸ie, avem | p . Prin urmare p1 | ≤ 2 , | p p2 | ≤ 2 1
2
| p p| = | p1 p2 | = | p1 | + | p p2 | ≤ 2 m−1 + 2m−1 = 2m . ∗
Observat ¸ie . Dac˘a X ⇒ p ¸ si | p| > 2 arb orele le A X,p cel put¸in ¸in p ¸si > 2 m−1 atunci exist˘a ˆın arbore o ramur˘ a cu m + 1 noduri.
3.4. LEMA BAR–HILLE BAR–HILLEL L
63
S
v 1 =A
v 2 =A u
v
w
x
y
p
Figura 3.5: Descompunerea cuvˆ antului p antului p.. ∗
Lema 3.3 Fie G o a de d e tipu t ipull 2 ¸si si fie X G o gramatic˘ X ⇒X 1 . . . Xm ⇒ p. p. Atunci, conform ∗ m. Fie AY,q ⊆ AX,p . lemei de loc localizare, alizare, p = p1 . . . pm ¸si si X j ⇒ p j , j = 1, . . . , m. atunci q este este subcuvˆ ant ˆıntr–unul ıntr–un ul din cuvintele cuvinte le p j . Y apart¸ine Demonstrat ¸ie . Netermi Neterminal nalul ul Y ¸ine unuia din subarborii AX j ,pj , fie acesta si q ∈ AX k ,pk ; atunci A Y,q ⊆ A X k ,pk ¸si ∈ S ub( ub( pk ).
Lema 3.4 (Lema Bar–Hillel) Fie E limbaj independent independent de context. context. Atunci Atunci E un limbaj exist˘ a un num˘ ar natural k ast a stfe fell ˆıncˆ ın cˆ at, dac˘ a p ∈ E ¸si si | p p| > k atunci p se poate descompun des compunee ˆın forma form a p = uvwxy = uvwxy cu cu urm˘ atoarele propriet˘ at ¸i: λ ; 1. vx = λ; 2. |vwx vw x| ≥ k; k ; 3. uv j wx j y ∈ E, E , ∀ j ∈ N , N , Demonstrat ¸ie . Fie n = card( Luam a˘m k = 2n . Cum | p card(V N p| > k = 2n, conform N ). Lu˘ observat¸iei ¸iei de la prima lem˘a, a, exist˘a ˆın arbore arb orele le A S,p cel put¸in ¸in o ramur˘a cu n cu n + 2 noduri; pe aceast˘ a ramur˘ a ultimul nod este terminal, deci exist˘a n + 1 noduri etichetate cu acela¸si si simbol A. Descompu Descompunem nem cuvˆ cuvantul aˆntul p ca ˆın figura 3.5, p = uvwxy. uvwxy. ∗ (1) Consider˘ am am subarborele AA,vwx c˘aruia aruia ˆıi corespunde derivarea A⇒vwx vw x. Punem Pun em ˆın eviden evi dent¸˘ ¸ta˘ primul pas ∗
A⇒BC ⇒vwx, ∗
∗
wx se wx = p B pC , B ⇒ pB , C ⇒ pC ¸si p λ . Cum AA,w ⊆ ¸si v si vwx se descompune desco mpune ˆın v ın vwx = p si p B , pC = λ. s au ˆın pC . S˘a presupunem c˘ a w ∈ AA,vwx, rezult˘a c˘a w este subcuvˆant ˆın pB sa S ub( ub( pC ); atunci pB ∈ Sub S ub((v ) ¸si λ . si cum cu m pB = λ rezult˘ a v = λ.
64
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
(2)Putem alege nodurile v 1 ¸si v 2 astfel ˆıncˆ at pe ramura punctat˘ a ˆıncepˆ and de la v1 ˆın jos pˆan˘a la frontier˘ a s˘a avem exact n + 1 noduri. Rezult˘ a conform lemei n precedente, | vwx | ≥ 2 = k. ∗ ∗ (3) putem scrie deriv˘ arile A⇒w, A⇒vAx. Deci ∗
∗
∗
∗
∗
S ⇒uAy ⇒uvAxy ⇒uv2 Ax2 y ⇒ . . . ⇒uv j wx j y.
Problema ˆınchiderii familiei L2 la intersect¸ie a la intersect ¸ie. Teorema 3.9 Familia L2 nu este ˆınchis˘ Demonstrat ¸ie . Consider˘am limbajul L 3 = {an bn cn |n ≥ 1 }. S˘a r˘at˘am c˘a L3 ∈ L 2. ˆIntr–adev˘ ar, s˘a presupunem c˘ a L3 ∈ L2 ¸si fie k constanta din lema Bar–Hillel. n n n Lu˘am n > k/3 ¸si fie p = a b c ; 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 posibilit˘a¸tile de constituire a subcuvintelor v ¸si x. S˘a presupunem c˘a ˆın v (sau x) intr˘ a dou˘ a din simbolurile a,b,c; de exemplu v = aabbb. atunci consider˘am cuvˆ antul p2 = uv 2 wx2 y = uaabbaabbwx2 y care nu are structura cuvintelor lui L3 (”a” nu poate s˘ a urmeze dup˘ a ”b”) dar conform lemei Bar-Hillel apart¸ine lui L3 . Deci, ˆın v (sau x) nu pot intra dou˘ a (sau trei) din simbolurile a intr˘ a un singur simbol; de exemplu v ∈ {a}∗ ¸si x ∈ {b}∗ . a,b,c. S˘a presupunem c˘ Atunci multiplicˆand ˆın p subcuvintele v ¸si x, puterile simbolurilor ”a” ¸si ”b” se m˘aresc iar ”c” r˘ amˆane pe loc, contrazicˆ andu–se din nou structura cuvintelor din L3 . ˆIn concluzie L3 nu este independent de context. Fie acum limbajele L3 = {am bn cn |m, n ≥ 1 } L”3 = {an bn cm |m, n ≥ 1 }. Se poate vedea u¸sor c˘a aceste limba je sunt de tipul 2; gramaticile care le genereaz˘ a sunt S → aS |aA,A → bAc |bc ¸si respectiv S → S c|Ac,A → aAb |ab. Avem L3 ∩ L”3 = L 3 , deci intersect¸ia a dou˘ a limbaje de tipul 2 este un limbaj care nu apart¸ine lui L 2 .
Corolar 3.10 Familia L2 nu este ˆınchis˘ a la complementariere. ˆIntr–adev˘ ar, s˘a presupunem c˘ a L2 este ˆınchis˘a la complementariere ¸si fie E 1, E 2 ∈ L2 . Cum familia L2 este ˆınchis˘a la reuniune, ar rezulta C (E 1 ) ∪ C (E 2 ) ∈ L2 . Dar (de Morgan) C (E 1 ) ∪ C (E 2 ) = C (E 1 ∩ C (E 2 ) ∈ L2. Complementul limbajului C (E 1 ∩ E 2 ) este E 1 ∩ E 2 ¸si conform presupunerii ar trebui ca E 1 ∩ E 2 ∈ L2 , oricare ar fi E 1 , E 2 , ceea ce nu este adev˘ arat. Generaliz˘ ari ale lemei Bar–Hillel Lema lui Bar–Hillel reprezint˘ a o condit¸ie necesar˘a ca un limbaj s˘a fie independent de context. cu ajutorul ei se poate demonstra relativ u¸sor c˘ a anumite limbaje nu sunt independente de context. Ideea este aceea c˘ a prin multiplicarea subcuvintelor v ¸si x, de un num˘ ar suficient de ori, se contrazice structura limbajului.
3.5. AUTOMATE PUSH-DOWN (APD)
65
Totu¸si, nu orice limbaj care nu este de tipul 2 poate fi respins de lema lui Bar–Hillel. De exemplu, aceast˘a lem˘a nu poate respinge limbajul m
L = {an b2 |n, m ≥ 1 } ∪ {b}∗ , care nu este de tipul 2 (se demonstreaz˘ a pe alt˘a cale). ˆIntr–adev˘ ar, pentru orice m n 2 p = a b lu˘am m u = λ, v = a, w = λ, x = λ, y = a n−1 b2 . Putem itera subcuvintele v ¸si x f˘ar˘a s˘a contrazicem structura cuvintelor limba jului. O generalizare a lemei Bar–Hillel este
Lema 3.5 (Lema lui Ogden) pentru orice limbaj independent de context L exist˘ a o constant˘ a k astfel ˆıncˆ at orice p ∈ L pentru care cel put ¸in k simboluri sunt ”marcate”, se poate descompune ˆın forma p = uvwxy astfel ˆıncˆ at 1. sau u, v,w sau w, x, y cont ¸in fiecare cˆ ate 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 ar˘ ata c˘ a limbajul de mai sus nu este de tipul 2, considerˆ and marcate simbolurile b.
3.5
Automate push-down (APD)
Automatele push-down sunt mecanisme pentru recunoa¸sterea limbajelor independente de context. Un APD se compune din (vezi figura 3.6): 1. O band˘ a de intrare care cont¸ine simboluri ale unui alfabet de intrare ; aceste simboluri constituie pe o band˘ a un anumit cuvˆ ant peste alfabetul de intrare. Banda se mi¸sc˘a numai spre stˆanga; 2. O memorie push-down (memorie invers˘ a, stiv˘a, pil˘a, etc) care cont¸ine simboluri ale unui alfabet propriu, numit alfabetul memoriei push-down . Aceast˘a memorie funct¸ioneaz˘ a ca o stiv˘ a - ultimul introdus, primul extras (Last In, First Out); 3. Un dispozitiv de comand˘ a care se afl˘ a permanent ˆıntr-o anumit˘ a stare intern˘ a apart¸inˆand unei mult¸ imi finite de st˘ari. Dispozitivul de comand˘ a posed˘ a 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
Banda de intrare i1
i2
i3
...
ik
...
i n-1
in
...
Dispozitiv de citire /scriere
Dispozitiv de citire de pe banda
zm Dispoz itiv de comanda
s S z1 Memoria pushdown
z0
Figura 3.6: Reprezentare schematic˘ a a unui automat push-down. Ca ¸si un automat finit, un automat push-down funct ¸ioneaz˘ a ˆın pa¸si discret¸i; un pas de funct¸ionare comport˘ a: 1. Dispozitivul de comad˘ a cite¸ste simbolul de pe banda de intrare din dreptul dispozitivului de citire ¸si mut˘ a banda cu o pozit¸ie spre stˆ anga. 2. ˆIn funct¸ie de starea intern˘ a, de simbolul citit ¸si de simbolul din vˆ arful memoriei push-down dispozitivul de comand˘ a efectueaz˘ a operat¸iile: (a) Trece ˆıntr-o nou˘ a stare; (b) Scrie ˆın memoria push-down un anumit cuvˆ ant peste alfabetul memoriei push-down; ˆın particular, acesta poate s˘a fie cuvˆ antul vid, ceea ce are ca efect ¸stergerea simbolului din vˆ arful memoriei push-down. Funct¸ionarea unui APD se termin˘ a ˆın general dup˘a ce s-a citit ultimul simbol al cuvˆantului scris pe banda de intrare dar este posibil ca el s˘a efectueze un anumit num˘ar de pa¸si, citind de fiecare dat˘ a de pe band˘ a cuvˆantul vid λ. De asemenea, este posibil ca ˆın timpul funct¸ion˘ arii, deci ˆınainte de a a junge la ultimul simbol, automatul s˘ a se blocheze. De exemplu, automatul ajunge ˆıntr-o configurat ¸ie (stare, simbol pe band˘ a, simbol ˆın vˆarful memoriei push-down) inadmisibil˘ a sau se gole¸ste memoria push-down dar nu s-a epuizat cuvˆ antul de pe band˘ a, etc. Matematic, un APD se define¸ste astfel:
Definit¸ie 3.9 Un automat push-down este un sistem AP D = (Σ, I , Z , f , s 0, z 0 ) unde:
3.5. AUTOMATE PUSH-DOWN (APD)
67
Σ este mult ¸imea de st˘ari (finit˘ a ¸si nevid˘ a); I este alfabetul de intare; Z este alfabetul memoriei push-down; ¸ia de evolut ¸ie; f : Σ × (I ∪ {λ}) × Z −→ P (Σ × Z ∗ ) este funct ¸ial˘ a; s0 ∈ Σ este starea init ¸ial al memoriei push-down. z 0 ∈ Z este simbolul init Un APD are ˆın general o funct¸ioanre nedeterminist˘ a, card f (s,i,z ) ≥ 1; mult¸imea automatelor push-down deterministe formeaz˘ a o clas˘ a special˘a. ˆIn termenii funct¸iei de evolut¸ie, un pas de evolut¸ie comport˘ a citirea simbolului i de pe band˘a, citirea simbolului z din vˆarful memoriei push-down, apoi, ˆın funct¸ie de starea intern˘ a s ¸si de aceste dou˘a simboluri, automatul trece ˆıntr-o nou˘ a stare ∗ ant q ∈ Z astfel ˆıncˆat (s , q ) ∈ f (s,i,z ). s ¸si scrie ˆın memoria push-down un cuvˆ ˆIn cazul ˆın care f (s,i,z ) = ∅ evolut¸ia este oprit˘ a; este situat¸ia ˆın care automatul se blochez˘ a. O stare a automatului (sau configurat¸ie) este un sistem δ = (s,p,q ) unde a, p ∈ I ∗ este subcuvˆ antul de pe banda de intrare r˘ amas s ∈ S este starea intern˘ de citit (inclusiv simbolul din dreptul dispozitivului de citire), iar q ∈ Z ∗ este subcuvˆ antul din memoria push-down. Vom spune c˘ a un APD trece direct din starea δ 1 = (s1 , p1 , q 1 ) ˆın starea δ 2 = (s2 , p2 , q 2 ) ¸si vom scrie δ 1 −→δ 2 dac˘ a se execut˘ a un pas de evolut¸ie; dac˘ a p1 = ip1 , q 1 = zq 1 putem avea (s2 , q ) ∈ f (s1, i , z ) ¸si atunci p2 = p1 , q 2 = qq 1 sau (s2 , q ) ∈ f (s1 , λ , z ) ¸si atunci p2 = p 1 , q 2 = qq 1 . Vom spune c˘ a automatul evolueaz˘ a (f˘ar˘a specificat¸ia direct) din starea δ ˆın ∗ stare δ ¸si vom scrie δ −→δ dac˘ a: (1) δ = δ ; (2) ∃ δ 1 , . . . , δn astfel ˆıncˆat δ = δ 1 −→δ 2−→ . . . −→δ n−1 −→δ n = δ . Limbajul recunoscut de un APD se poate defini ˆın dou˘ a moduri: (1) Limbajul recunoscut de un APD cu golirea memoriei push-down , este, prin definit¸ie ∗
L(AP D) = { p| p ∈ I ∗ (s0, p , z0 )−→(s,λ,λ)}. Aceata ˆınseamn˘ a c˘a, pornind din starea intern˘ a s0 ¸si avˆand ˆın vˆ arful memoriei push-down simbolul z 0 , cu ajutorul cuvˆantului p de pe banda de intrare, automatul poate s˘ a evolueze astfel ˆıncˆ a t s˘a goleasc˘ a memoria push-down dup˘ a citirea cuvˆ antului. Ment¸ion˘ a m c˘a golirea memoriei push-down nu trebuie neaparat s˘ a coincid˘ a cu citirea ultimului simbol al lui p; este posibil ca automatul s˘a mai efectueze cˆ a¸tiva pa¸si citind de pe band˘ a simbolul λ. (2) Limbajul recunoscut de un APD cu st˘ ari finale ; ˆın definit¸ia automatului se adaug˘a o submult¸ime Σf a lui Σ numit˘a mult¸imea de st˘ari finale. Prin definit¸ie, limbajul recunoscut de un APD cu st˘ ari finale este: ∗
L(AP D) = { p| p ∈ I ∗ (s0 , p , z0 )−→(s,λ,q ), s ∈ Σ f , q ∈ Z ∗ }.
68
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
Prin urmare, este necesar ca dup˘ a citirea lui p, eventual dup˘a ˆınc˘ a cˆa¸tiva pa¸si, APD s˘a ajung˘a ˆıntr-o stare final˘ a. Vom vedea c˘ a cele dou˘ a definit¸ii sunt echivalente. Limbaje recunoscute de automate push-down cu golirea memoriei . Vom ar˘ata c˘ a familia limbajelor recunoscute de APD cu st˘ ari finale coincide cu familia ˆ limbajelor independente de context. In felul acesta, APD constituie mecanisme analitice de definire a limbajelor de tipul 2.
Teorema 3.11 Un limbaj este independent de context dac˘ a ¸si numai dac˘ a este recunoscut de un automat push–down cu golirea memoriei push–down. Demonstrat ¸ie . Partea I E ∈ L 2 ⇒E = L(AP D). Fie G = (V N , V T , S , P ) o gramatic˘ a de tipul 2 ˆın forma normal˘ a Greibach care genereaz˘a limbajul E . Construim un automat pushdown astfel: AP D = ({s}, V T , V N , f , s , S ) , funct¸ia de evolut¸ie fiind definit˘a de: A → ip ∈ P ⇒ (s, p) ∈ f (s,i,A), altfel ∅ . ∗ Fie p ∈ L(G), p = i1 . . . in , S ⇒ p. Aceast˘ a derivare trebuie s˘ a aib˘a forma G
(extrem stˆ ang˘a): (A) S ⇒i1 X 1u1 ⇒i1 i2 X 2 u2 u1 ⇒i1 i2 i3 X 3 u3 u2 u1 ⇒ . . . ⇒i1 . . . in , unde u 1 , u2 , u3 , . . . ∈ V N ∗ = Z ∗ . Observat ¸ie . Aparent, partea us us−1 . . . u1 se m˘are¸ste cu fiecare derivare diˆ rect˘a. In realitate, unele din cuvintele u j sunt vide, ¸si anume atunci cˆ a nd se aplic˘a o regul˘ a de forma X → i; ˆın particular, ˆın ultimele deriv˘ ari directe se aplic˘a numai reguli de aceast˘ a form˘ a. Avem S → i 1 X 1 u1 ⇒ (s, X 1 u1 ) ∈ f (s, i1 , S ), X 1 → i 2 X 2u2 ⇒ (s, X 2 u2 ) ∈ f (s, i2 , X 1 ), X 2 → i 3 X 3u3 ⇒ (s, X 3 u3 ) ∈ f (s, i3 , X 2 ), ... . Prin urmare automatul poate s˘ a aib˘a urm˘atoarea evolut¸ie: (s, i1 i2 i3i4 . . . in , S )−→(s, i2 i3 i4 . . . in , X 1 u1)−→
−→(s, i3 i4 . . . in , X 2 u2u1 )−→(s, i4 . . . in , X 3 u3u2 u1 )−→ . . . . Dac˘a compar˘ am aceast˘ a evolut¸ie cu derivarea (A) putem observa c˘ a pe banda de intrare avem la fiecare pas partea complementar˘ a a cuvˆ antului (fat¸a˘ de derivare) iar ˆın memoria push-down se repro duce partea de neterminale din formele propozit ¸ionale
3.5. AUTOMATE PUSH-DOWN (APD)
69
ale deriv˘arii. Cum ˆın derivare se ajunge la i1 . . . in , ˆın evolut¸ ie se va ajunge la (s,λ,λ). Deci p ∈ L(AP D) ¸si L(G) ⊆ L(AP D). ∗ Fie acum p ∈ L(AP D); va trebui s˘ a ar˘ at˘a m c˘a p ∈ L(G), deci c˘ a S ⇒ p. G
∗
Vom ar˘ata o implicat¸ie ceva mai general˘ a, ¸si anume, pentru orice u ∈ V N , avem ∗
∗
(s,p,u)−→(s,λ,λ) ⇒ u ⇒ p. G
ˆIn particular, dac˘ a u = S obt¸inem implicat¸ia dorit˘ a. Proced˘ am prin induct¸ie asupra lungimii lui p. Dac˘a | 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 ⇒ i = p. G
Presupunem c˘ a implicat¸ia este adev˘ arat˘a pentru un cuvˆ ant | p| = l ¸si consider˘a m un p astfel ˆıncˆat | p| = l + 1. Fie i ¸si X primele simboluri din p ¸si u, ∗ deci p = ip ¸si u = X u . ˆIn evolut¸ia (s,p,u)−→(s,λ,λ) punem ˆın evident¸a˘ prima evolut¸ie direct˘a ∗
(s,p,u) = (s,ip , Xu )−→(s, p , vu )−→(s,λ,λ). Din definit¸ia evolut¸iei directe rezult˘ a c˘a (s, v) ∈ f (s,i,X ) deci X → iv ∈ P . Pe ∗ de alt˘ a parte din ipoteza inductiv˘ a rezult˘ a c˘a vu ⇒ p . Avem G
∗
u = X u ⇒ ivu ⇒ ip = p, G
G
ceea ce demonstreaz˘ a implicat¸ia. Prin urmare p ∈ L(G) ¸si L(AP D) ⊆ L(G), de unde L(G) = L(AP D). Partea II. E = L(AP D) E ∈ L2 Fie AP D = (Σ, I , Z , f , s 0 , z 0 ). Construim G de forma G = (V N , V T , S , P ) unde V N = {s0} ∪ {(s,z,s )|s, s ∈ Σ, z ∈ Z }, V T = I , S = s0 , iar regulile de generare le definim astfel: (1) s 0 → (s0 , z 0 , s), ∀s ∈ Σ; (2) Dac˘ a (s1 , z 1 . . . zm ) ∈ f (s,i,z ) vom introduce ˆın P reguli de forma (s,z,s ) → i(s1 , z 1, s2 )(s2 , z 2, s3 ) . . . (sm , z m , s ), unde s , s2 , . . . , sm ∈ Σ; (3) Dac˘ a (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 ∈ Σ. S˘a observ˘ a m c˘a gramatica astfel construit˘ a este independent˘ a de context, ¸si anume ˆın forma normal˘ a Greibach. ∗ ∗ Fie p ∈ L(AP D), deci (s0 , p , z0 )−→(s , λ , λ); trebuie s˘a ar˘ at˘am c˘a s0 ⇒ p. G
Vom ar˘ata implicat¸ia ceva mai general˘a ∗
∗
(s,p,z )−→(s , λ , λ) ⇒ (s,z,s ) ⇒ p. G
∗ ∗ ˆIn particular pentru s = s 0 , z = z 0 rezult˘ a (s0 , z 0 , s ) ⇒ p ¸si putem scrie s0 ⇒(s0 , z 0 , s ) ⇒ p, G
G
adic˘a p ∈ L(G). Proced˘am prin induct¸ie asupra lungimii evolut¸iei l. Dac˘a l = 1 atunci (s,p,z )−→(s , λ , λ), deci p = i ¸si (s , λ) ∈ f (s,i,z ) ¸si (s,z,s ) → i este o regul˘ a, adic˘a putem scrie (s,z,s )⇒i = p. Presupunem c˘ a implicat¸ia este adev˘ arat˘a pentru evolut¸ii de lungime oarecare l ¸si consider˘am o evolut¸ie de lungime l + 1; punem ˆın evident¸a˘ prima evolut¸ie direct˘a ∗
(s,p,z ) = (s, i1 p , z )−→(s1 , p , z 1 . . . zm )−→(s , λ , λ). Descompunem cuvˆ antul p ˆın forma p = p 1 . . . pm astfel ˆıncˆat ∗
→ (s2 , λ , λ), − ∗ −→ (s3 , λ , λ), ... ∗ (sm , pm , z m ) −→ (s , λ , λ). (s1 , p1 , z 1 ) (s2 , p2 , z 2 )
Observat ¸ie . Putem pune ˆın evident¸a˘ felul ˆın care se define¸ste cuvˆ antul p1 urm˘arind evolut¸ia lui APD; (s1 , i1 i2 . . . in , z 1 z 2 . . . zm ) −→ (s1 , i2 i3 . . . in , qz 2 . . . zm ) −→ (a) (b) −→ (s2 , i j . . . in , z 2 . . . zm ) ... (c) 1
La primul pas (situat¸ia a) automatul este ˆın starea s1 , pe band˘a este i1 iar ˆın memoria push-down este z 1 . Dup˘a efectuarea unui pas, automatul trece ˆın starea a banda cu o pozit¸ie spre stˆ anga, extrage pe z 1 ¸si scrie ˆın memoria pushs1 , mut˘ down un cuvˆant q (situat¸ia b). Se poate observa c˘ a z 2 a ”coborˆ at”; cum ¸stim c˘ a memoria push-down se gole¸ste ( p ∈ L(AP D)), trebuie ca la un moment dat z 2 s˘a ajung˘a ˆın vˆarful stivei (situat¸ia c). ˆIn acest moment partea din p citit˘a va fi p1 iar starea ˆın care a ajuns automatul o not˘ am cu s2 . Este clar c˘a dac˘ a pe band˘ a am avea scris numai p1 am avea evolut¸ia (s1 , p1 , z 1 )−→(s2, λ , λ).
3.5. AUTOMATE PUSH-DOWN (APD)
71
Analog p2 , . . . , pm . Din definit¸ia deriv˘arii directe (s, i1 p , z )−→(s1 , p , z 1 . . . zm ) avem (s1 , z 1 . . . zm ) ∈ f (s, i1, z ) iar ˆın P va exista regula (s,z,s ) → i 1 (s1 , z 1 , s2 )(s2 , z 2 , s3 ) . . . (sm , z m , s ) unde lu˘am st˘arile s2, . . . , sm cele rezultate la descompunerea lui p . Pe de alt˘ a parte, din ipoteza inductiv˘a, avem ∗
(s1 , z 1 , s2 )⇒ p1 , ∗ (s2 , z 2 , s3 )⇒ p2 , ... ∗ (sm , z m , s )⇒ pm . Putem scrie derivarea ∗
(s,z,s )⇒i1 (s1 , z 1 , s2 )(s2, z 2 , s3 ) . . . (sm , z m , s )⇒i1 p1 . . . pm = i 1 p = p. Dup˘a cum am v˘ azut, rezult˘ a mai departe p ∈ L(G) ¸si L(AP D) ⊆ L(G). Pentru a demonstra incluziunea invers˘ a, vom ar˘ ata mai ˆıntˆ ai implicat¸ia ∗ ∗ (s,z,s )⇒ p(s1 , z 1 s2 ) . . . (sm , z m , s ) implic˘a (s,p,z )−→(s1 , λ , z1 . . . zm ). Proced˘ am prin induct¸ie asupra lungimii deriv˘arii l. Dac˘a l = 1 atunci p = i ¸si se aplic˘a regula (s,z,s ) → i(s1 , z 1 , s2 ) . . . (sm , z m , s ) deci (s1 , z 1 . . . zm ) ∈ f (s,i,z ) ¸si (s,i,z )−→(s1 , λ , z1 . . . zm ). Presupunem c˘ a implicat¸ia este adev˘ arat˘ a pentru l oarecare ¸si consider˘ am o derivare de lungime l + 1. Fie p = p i ¸si punem ˆın evident¸a˘ ultimul pas. ∗ (s,z,s )⇒ p (s j −1 , z j −1 , s j )(s j , z j , s j +1 ) . . . (sm , z m , s ) ⇒ p i(s1 , z 1 , s2 ) . . . (s j−1 , z j−1 , s j )(s j , z j , s j+1 ) . . . (sm , z m , s ), unde s j = s j ; la ultimul pas s-a aplicat regula (s j −1 , z j −1 , s j ) → i(s1 , z 1, s2 ) . . . (s j −1 , z j −1, s j ). Rezult˘a (s1 , z 1 . . . z j −1 ) ∈ f (s j −1 , i , z j −1 ) ¸si putem scrie evolut¸ia (s j −1 , i , z j −1 )−→(s1 , λ , z1 . . . z j −1 ). Pe de alt˘a parte, conform ipotezei inductive, avem ∗
(s, p , z )−→(s j −1 , λ , z j −1z j . . . zm ) Prin urmare ∗
(s,p,z ) = (s, p i, z )−→(s j −1 , i , z j −1 z j . . . zm )−→(s1 , λ , z1 . . . zm )
72
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
¸si implicat¸ia este demonstrat˘ a. ∗ Fie acum p ∈ L(G), deci s0 ⇒ p. T ¸ inˆand seama de forma regulilor din G, G
ˆın aceast˘ a derivare se va aplica prima dat˘ a o regul˘ a de forma (1), apoi regula de forma (2) iar la ¸sfˆar¸sit reguli de forma (3). La aplicarea regulilor (2) putem rescrie la fiecare pas simbolul neterminal cel mai din stˆ anga, deci s˘ a obt¸inem o derivare extrem stˆ ang˘a. S˘a observ˘ a m c˘a ˆın acest caz structura formelor propozit ¸ionale intermediare este cea ment¸ionat˘ a, p(s1 , z 1 , s2 )(s2 , z 2 , s3 ) . . . (sm , z m , s ). Prin urmare, derivarea va avea forma ∗
∗
s0⇒(s0 , z 0 , s )⇒ p(s1 , z 1, s2 ) . . . (sm , z m , s )⇒ p. Trebuie s˘ a avem regulile (s j , z j , s j +1 ) → λ, j = 1, . . . , m , s m+1 = s ¸si putem scrie ∗
(s0, p , z0 )−→(s1 , λ , z1 . . . zm )−→(s2 , λ , z2 . . . zm )−→ . . . −→(s , λ , λ) adic˘a p ∈ L(AP D) ¸si L(G) ⊆ L(AP D). Automate push–down cu st˘ ari finale. Vom nota un automat push-down cu st˘ ari finale cu AP Df .
Teorema 3.12 Un limbaj este recunoscut de un automat push–down dac˘ a ¸si numai dac˘ a este recunoscut de un automat push–down cu st˘ ari finale. Demonstrat ¸ie . Partea I E = l(AP D) ⇒ E ∈ L(AP Df ). Dac˘a AP D = (Σ, I , Z , f , s 0 , z 0 ) construim un automat push–down cu st˘ ari finale astfel AP Df = (Σ ∪ {s0 , sf }, I , Z ∪ {z 0 }, f , s0 , z 0 ) unde mult¸imea de st˘ ari finale este { s } iar funct¸ia de evolut¸ie este definit˘ a de: f (s,i,z ) = f (s,i,z ), s ∈ Σ, i ∈ I ∪ {λ}, z ∈ Z ; f (s0, λ , z0 ) = (s0 , z 0 z 0 ); f (s,λ,z 0 ) = (sf , λ), s ∈ Σ; ˆın rest ∅ . ∗ Fie p ∈ L(AP D); atunci (s0 , p , z0 )−→(s,λ,λ). Evident c˘ a aceia¸si evolut¸ie o poate avea ¸si automatul push–down cu st˘ ari finale. Putem scrie ˆın AP Df evolut¸ia (AP Df ) :
∗
(s0 , p , z0 )−→(s0 , λ , z0 )−→(s,λ,λ),
deci p ∈ L(AP Df ) ¸si L(AP D) ⊆ L(AP Df ). Invers, fie p ∈ L(AP Df ), atunci (ˆın AP Df ) ∗
(s0, p , z0 )−→(s,p,z 0z 0 )−→(sf , λ , q ) . Ultimul pas trebuie s˘a fie de forma (s,λ,z 0 )−→(sf , λ , λ) pentru c˘ a nu exist˘a alt˘a valoare a lui f care s˘a ne duc˘ a ˆıntr-o stare final˘a. Deci (ˆın AP Df ) ∗
(s0 , p , z0 z 0 )−→(s,λ,z 0 )−→(sf , λ , λ)
3.6. AUTOMATE PUSH–DOWN DETERMINISTE
73
∗
¸si putem scrie ˆın APD evolut¸ia (s0 , p , z0 )−→(s,λ,λ), adic˘ a p ∈ L(AP D) ¸si L(AP Df ) ⊆ L(AP D). Partea II E = L(AP Df ⇒ E ∈ L(AP D). Fie AP Df = (Σ, I , Z , f , s 0 , z 0, Σf ) un automat push–down cu st˘ ari finale (mult¸imea st˘ arilor finale este Σf ) ¸si construim un APD astfel AP D = (Σ ∪ {s0, s }, I , Z ∪ {z 0 }, f , s0 , z 0 ) unde f (s,i,z ) = f (s,i,z ), s ∈ Σ, i ∈ I ∪ {λ}, z ∈ Z ; f (s0 , λ , z0 ) = (s, z 0z 0 ); f (s,λ,z ) = (s , λ), s ∈ Σ f ∪ {s }, z ∈ Z ∪ {z 0 }; ˆın rest ∅ . ∗ Fie p ∈ L(AP Df ), atunci (s0 , p , z0 )−→(s,λ,q ), s ∈ Σf . Este evident c˘ a ˆın ∗ APD avem evolut¸ia (s0 , p , z0 )−→(s,λ,q ). Putem scrie ∗
∗
AP D : (s0 , p , z0 )−→(s0, p , z0 z 0 )−→(s,λ,qz 0 )−→(s , λ , λ), deci p ∈ L(AP D) ¸si L(AP Df ) ⊆ L(AP D). Invers, fie p ∈ L(AP D). Avem ∗
∗
AP D : (s0 , p , z0 )−→(s0 , p , z0 z 0 )−→(s,λ,λ). Simbolul z 0 nu poate fi ¸sters decˆ at cu o regul˘ a de forma f (s,λ,z ) = (s , λ), a ajung˘a ˆıntr-o stare s ∈ Σ f , apoi s˘a r˘amˆan˘a ˆın s ∈ Σ f ∪ {s }, deci APD trebuie s˘ s. ∗ AP D : (s0 , p , z0 z 0 )−→(s,λ,qz 0 ), s ∈ Σ f . Putem scrie ∗
AP Df : (s0 , p , z0 )−→(s,λ,q ), s ∈ Σ f ¸si deci p ∈ L(AP Df ), adic˘a L(AP D) ⊆ L(AP Df ).
3.6
Automate push–down deterministe
Funct¸ionarea unui APD este ˆın general nedeterminist˘ a, card f (s,i,z ) ≥ 1. Pentru ca un APD s˘a aib˘a o funct¸ionare determinist˘ a nu ete suficient s˘ a impunem condit¸ia card f (s,i,z ) = 1, deoarece dac˘ a pentru un anumit s ∈ Σ ¸si z ∈ Z avem = ∅ ¸si f (s,i,z ) = ∅ , putem face un pas citind λ sau citind i. f (s,λ,z )
Definit¸ie 3.10 Un automat push–down este determinist dac˘a (1) card f (s,i,z ) ≥ 1, s ∈ Σ, i ∈ I ∪ {λ}, z ∈ Z ; (2) dac˘ a f (s,λ,z ) = ∅, atunci f (s,i,z ) = ∅ , ∀i ∈ I .
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
74
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 inclus˘ a (strict) ˆın familia limbajelor de tipul 2 (dup˘ a cum vom vedea). Un APD se poate bloca ˆın urm˘atoarel dou˘ a situat¸ii 1. Automatul ajunge ˆın starea s, ˆın vˆarful memoriei push–down se afl˘ a simbolul z , pe banda de intrare urmeaz˘ a i ¸si f (s,i,z ) = f (s,λ,z ) = ∅; 2. Intr˘ a ˆıntr-un ciclu infinit citind de pe band˘ a λ; de exemplu f (s,λ,z ) = (s, z ) ¸si f (s,i,z ) = ∅ pentru o anumit˘a pereche (s, z ).
Definit¸ie 3.11 Un APD determinist este neblocabil dac˘ a pentru orice cuvˆ ant ∗ a o evolut ¸ie de forma (s0 , p , z0 )−→(s,λ,q ). p ∈ I ∗ exist˘ ˆIntr-un APD determinist neblocabil orice cuvˆ ant peste I poate fi citit. Evident, de aici nu rezult˘ a c˘a orice cuvˆ ant este recunoscut de APD. ari finale este echivalent cu un APD deterLema 3.6 Un APD determinist cu st˘ minist cu st˘ ari finale neblocabil (relativ la prima situat ¸ie de blocare). Demonstrat ¸ie .Fie AP Df = (Σ, I , Z , f , s 0 , z 0 , Σf ). Construim AP Df = (Σ ∪ {s0 , s }, I , Z ∪ {z 0 }, f , s0 , z 0 , Σf ) unde: (1) f (s,i,z ) = f (s,i,z ) dac˘ a f (s,i,z ) = ∅, s ∈ Σ, i ∈ I ∪ {λ}, z ∈ Z ; (2) f (s,i,z ) = (s , z ) dac˘ a 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 , λ , z0 ) = (s0 , z 0 z 0 ). Avem AP Df
p ∈ L(AP Df ) ⇔ (s0 , p , z0 ) (s0 , p , z0 )
AP Df
|= (s0 , p , z0 z 0 )
|= (s,λ,q ), s ∈ Σ f ⇔
AP Df
|= (s,λ,qz 0 ), s ∈ Σ f ⇔ p ∈ L(AP Df ).
Deci L(AP Df ) = L(AP Df . Observat ¸ie . ˆIntr-o situat¸ ie de blocare (s,ip,zq ) ¸si f (s,i,z ) = f (s,λ,z ) = ∅ putem scrie AP Df
AP Df
AP Df
(s,ip,zq ) |= (s ,p,zq ) |= . . . |= (s ,λ,zq ).
Teorema 3.13 Orice limbaj independent de context determinist este recunoscut de un APD determinist neblocabil.
3.6. AUTOMATE PUSH–DOWN DETERMINISTE
75
Demonstrat ¸ie . Fiind dat un APD determinist vom construi un APD determinist neblocabil echivalent. Conform lemei anterioare putem presupune c˘a nu are loc prima situat¸ie de blocare. Dac˘a are loc a doua situat¸ie de blocare, putem avea dou˘ a cazuri: 1. cont¸inutul memoriei push–down se m˘ are¸ste nelimitat; 2. lungimea cuvintelor scrise ˆın memoria push–down nu dep˘ a¸se¸ste un anumit num˘ar. Fie card(Σ) = n, card(Z ) = k, l = max {|q |, q ∈ Z ∗ | (s , q ) ∈ f (s,i,z )}. Cazul 1. Exist˘ a ˆın total un num˘ ar nk de perechi de forma (s, z ). Dac˘a ˆın evolut¸ia lui APD s-ar succede numai configurat¸ii cu perechi de forma (s, z ) distincte atunci lungimea cuvˆ antului din memoria push–down ar cre¸ste la maximum ∗ nkl simboluri. Prin urmare, dac˘ a (s , λ , α )−→(s” , λ , α” ) ¸si |α” | − |α | > nkl, atunci ˆın aceast˘ a evolut¸ie trebuie s˘ a existe dou˘ a configurat¸ii cu aceia¸si stare s ¸si cu acela¸si simbol z ˆın vˆarful memoriei push–down. Deci ∗
∗
∗
(s , λ , α )−→(s,λ,zr)−→(s,λ,zqr)−→(s” , λ , α” ), de unde urmeaz˘a c˘ a ∗
∗
(s , λ , α )−→(s,λ,zr)−→(s,λ,q m r), ∀m ∈ N. Cazul II Lungimea cuvˆ antului scris ˆın memoria push–down nu dep˘ a¸se¸ste nkl, ” c˘a ci dac˘ a |α | − |α | > nkl, ar rezulta c˘ a ˆın memoria push–down am avea m zq , ∀m ∈ N ¸si lungimea cuvˆ antului nu ar fi finit˘a. a E este un limbaj independent de context determinist atunci Teorema 3.14 Dac˘ limbajul complementar I ∗ \ E este de asemenea independent de context determinist. Demonstrat ¸ie . Fie AP Df = (Σ, I , Z , f , s 0 , z 0 , Σf ) automatul push–down determinist care recunoa¸ste limbajul E . Construim un automat push–down determinist care va recunoa¸ste limbajul I ∗ \ E ˆın modul urm˘ ator AP Df = (Σ × {σ1 , σ2 , σ3 }, I , Z , f , s0 , z 0 , Σf ) unde s0 =
(s0 , σ1 ) pentru s0 ∈ Σ f , (s0 , σ2 ) pentru s0 ∈ Σ f ,
mult¸imea de st˘ari finale este Σf = {(s, σ3 )|s ∈ Σ} iar funct¸ia de evolut¸ie este definit˘a de
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
76
(1) dac˘ a 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) dac˘ a f (s,λ,z ) = (s , q ) atunci f ((s, σ1 ), λ , z ) = ((s , k ), q ), f ((s, σ3 ), λ , z ) = ((s , k ), q ); unde k = 1 dac˘ a s ∈ Σ f ¸si k = 2 dac˘ a s ∈ Σ f . ∗ Fie p ∈ L(AP Df ), atunci ((s0 , σk ), p , z0 )−→((s, σ3 ), λ , q ) , k = 1, 2. ˆIn mod necesar, ultima configurat¸ie trebuie s˘ a fie precedat˘ a de o configurat¸ie de forma ((s , σ2 ), λ , q ) , deci ∗
(A) ((s0 , σk ), p , z0 )−→((s , σ2 ), λ , q ) −→((s, σ3 ), λ , q ) ∗
de unde rezult˘ a c˘a (s0 , p , z0 )−→(s , λ , q ) ¸si s ∈ Σ f . Deci p ∈ I ∗ \ E ¸si L(AP Df ) ⊆ I ∗ \ E . ∗ Invers, fie p ∈ I ∗ \ E , atunci ˆın AP Df avem evolut¸ia (s0 , p , z0 )−→(s,λ,q ), s ∈ ∗ Σf ¸si putem scrie evolut¸ia (A). Prin urmare p ∈ L(AP Df ), adic˘a I \ E ⊆ L(AP Df ). 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 ˆınchis˘ a la complementariere ¸si cum ea coincide cu familia limbajelor recunoscute de automatele push–down nedeterministe putem mai departe obt¸ine urm˘ atorul rezultat: APD nedeterministe nu sunt echivalente cu APD deterministe.
3.7
Probleme propuse
1. S˘a se arate c˘ a L(G) = {(ab)n a|n ≥ 0} unde G are product¸iile S → a o gramatic˘ a echivalent˘ a cu G care s˘ a SbS, S → a. S˘a se construiasc˘ fie neambigu˘ a. 2. Eliminat¸i redenumirile din gramatica G E ce genereaz˘ a expresiile aritmetice simple. 3. Aducet¸i la forma normal˘a Chomsky gramaticile ce au regulile: (a) S → TbT, T → T aT |ca; (b) S → aAC,A → aB |bAB,B → b, C → c; (c) S → A.A, A → 0A|1A| . . . 9A|λ. 4. G˘asit¸i forma normal˘ a Greibach pentru gramaticile:
3.7. PROBLEME PROPUSE
77
(a) A1 → A 2 A3 , A2 → A 1 A2 |1, A3 → A 1 A3 |0. (b) GE care genereaz˘ a expresiile aritmetice simple. 5. Construit¸i un automat push–down pentru recunoa¸sterea limbajului: (a) L = {w|w ∈ {a, b}∗ , num˘arul 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 cuvˆ ant ˆın care fiecare parantez˘ a deschis˘ a are o pereche, parantez˘ a ˆınchis˘ a } . 6. Folosind lema de pompare s˘ a se arate c˘ a urm˘atoarele limbaje nu sunt independente de context: (a) L = {ai b j ck |i < j < k }; (b) L = {ai b j | j = i 2 }; (c) L = {an bn cn |n ≥ 1 }; (d) L = {ai |i prim } ; (e) L = {ai bi c j | j ≥ i };
78
CAPITOLUL 3. LIMBAJE INDEPENDENTE DE CONTEXT
Capitolul 4 Analiza Sintactic˘ a Analiza sintactic˘ a este o faz˘ a a procesului de compilare care are urm˘ atoarele dou˘ a obiective principale: a un cuvˆant dat apart¸ine sau nu limbajului, deci dac˘a cuvˆantul • Stabile¸ste dac˘ este corect din punct de vedere sintactic. ˆIn particular limbajul poate fi definit de o gramatic˘ a generativ˘ a de tip Chomsky ¸si deci termenul de analiz˘a sintactic˘ a trebuie ˆınt¸eles ˆın sensul teoriei limbajelor formale. Mai ment¸ion˘ a m c˘a prin cuvˆ ant ˆınt¸elegem orice structur˘ a constituit˘ a cu simbolurile acceptate de limbaj, ˆın particular un ˆıntreg program, dar de obicei ne vom m˘argini la anumite entit˘ a¸t i, de exemplu, o linie sau un rˆand. ator cuvˆ antului. Odat˘ a • Determin˘a derivarea (arborele de derivare) corespunz˘ cu aceast˘ a operat¸ie sunt degajate anumite structuri pentru care se poate genera cod intermediar, structuri pe care le vom numi unit˘ at ¸i sintactice . Pe lˆang˘a aceste obiective principale se mai efectuaz˘ a ¸si alte operat¸ii, de exemplu, analiza ¸si tratarea erorilor, prelucrarea tabelelor, etc. Rezultatul analizei sintactice va fi un fi¸sier care cont ¸ine deriv˘ arile (arborii de derivare) corespunz˘atoare unit˘ a¸tilor sintactice ˆın care este descompus programul: expresii aritmetice, declarat¸ii, etc. Acest fi¸sier este utilizat ˆın faza de generare a formatului intermediar. ˆIn mod curent ˆıns˘ a, generatoarele de format intermediar sunt ni¸ste rutine, apelate de analizorul sintactic, astfel ˆıncˆ at formatul intermediar se obt¸ine succesiv. Teoretic, problema analizei sintactice este rezolvat˘ a de automatele corespunz˘ atoare diverselor tipuri de limbaje; aceast˘ a cale conduce ˆıns˘ a la algoritmi cu complexitate mare (num˘ a r mare de st˘ ari, funct¸ie de tranzit¸ie conmplex˘ a, etc.). Exist˘a algoritmi speciali de analiz˘a sintactic˘ a cu eficient¸a˘ supe- rioar˘ a. ˆIn continuare ne vom ocupa cu dou˘ a clase de astfel de algoritmi:
• Algoritmi top-down (de sus ˆın jos); • Algoritmi bottom-up (de jos ˆın sus). 79
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
80
4.1 4.1.1
Algoritmi TOP-DOWN Algoritmul general de analiz˘ a top-down
Algoritmul general de analiz˘ a top-down are un principiu foarte simplu: se aplic˘ a ˆın mod sistematic regulile de generare, ˆıncepˆ and cu simbolul de start; ˆın cazul unui e¸sec se revine ˆın sus ¸si se ˆıncearc˘ a o alt˘ a regul˘ a. Regulile se aplic˘ a ˆın ordinea ˆın care sunt scrise ˆın gramatic˘ a, f˘ ar˘ a s˘a existe o anumit˘ a ordine preferent ¸ial˘ a de scriere, ˆıntrucˆ at natura algoritmului nu permite nici un fel de ierarhizare a regulilor din punctul de vedere al frecvent ¸ei de utilizare . Pentru descrierea riguroas˘ a a acestui algoritm am urmat modelul din cartea lui D. Gries, Compiler construction for digital compters . Fie G = (V N , V T , x0, P ) o gramatic˘ a de tipul 2 ¸si p ∈ V T ∗ . Ne intereseaz˘ a urm˘atoarele dou˘ a probleme: (a) p ∈ L(G)?, (b) Dac˘ a p ∈ L(G) atunci s˘a se determine derivarea x0 ⇒ p. Consider˘am toate regulile care au X 0 ˆın stˆ anga: x0 → x 11 . . . x1n |x21 . . . x2n | . . . |x p1 . . . x pnp 1
2
Init¸ial x0 devine activ ¸si alege prima regul˘ a x0 → x11 . . . x1n . Dac˘ a aceast˘ a ∗ alegere este corect˘ a trebuie s˘ a avem x0 ⇒ x11 . . . x1n ⇒ p ¸si ˆın conformitate cu lema de localizare a gramaticilor de tipul 2, cuvˆ antul p se poate descompune ˆın ∗ forma p = p 1 p2 . . . pn , unde x1 j ⇒ p j , j = 1, . . . n1 . ∗ Simbolul x0 ˆıl activeaz˘a pe x11 ¸si ˆıi cere s˘a g˘aseasc˘a derivarea x11 ⇒ p1 ; dac˘a x11 reu¸se¸ste, transmite lui x0 succes . Simbolul x0 ˆıl dezactiveaz˘ a pe x11 , ˆıl activeaz˘ a pe ∗ x12 ¸si ˆıi cere s˘a g˘aseasc˘a derivarea x12 ⇒ p2 , etc. Dac˘a toate simbolurile activate de a presupunem c˘ a x1 j transmite x0 transmit succes, construct¸ia este terminat˘a. S˘ e¸sec ; atunci x0 ˆıl dezactiveaz˘ a pe x1 j , ˆıl reactiveaz˘ a pe x1 j −1 c˘aruia ˆıi transmite: Mi-ai dat o derivare, dar aceasta nu este bun˘ a, ˆıncearc˘ a alta . Dac˘a x1 j −1 reu¸se¸ste, procesul se continu˘ a spre dreapta; dac˘a nu, atunci x0 ˆıl dezactiveaz˘ a pe x1 j −1 , ˆıl reactiveaz˘ a pe x1 j −2 c˘aruia ˆıi cere o alt˘ a derivare. Procesul se continu˘ a ˆın acest mod fie spre dreapta, fie spre stˆ a nga. Dac˘ a se ajunge la x11 ¸si acesta nu reu¸se¸ste s˘ a g˘asasc˘ a o alt˘a derivare, x 0 decide c˘ a prima regul˘ a aleas˘ a nu este bun˘ a ¸si ˆıncearc˘ a cu urm˘atoarea regul˘a, adic˘a x0 → x 21 . . . x2n , ¸s. a. m. d. Observat¸ii 1
1
1
2
arintele s˘ au, alege • Fiecare simbol devenit activ, procedeaz˘a exact ca ¸si p˘ prima regul˘ a, activeaz˘ a primul simbol, etc.
• Nu se cunoa¸ste anticipat descompunerea p = p1 p2 . . . pn . Deci x1 j trans∗ mite succes dac˘ a reu¸se¸ste s˘a g˘aseasc˘a o derivare x1 j ⇒ p j , unde p j este un subcuvˆ ant oarecare al lui p, cu singura condit¸ie ca p1 j s˘a ˆınceap˘ a din punctul unde s-a terminat p 1 j −1 . De exemplu, dac˘a p = i 1i2 . . . i8 . . . ¸si p 1 = i 1 i2i3 i4 , 1
4.1. ALGORITMI TOP-DOWN
81 ∗
a g˘aseasc˘a o derivare de forma x 13 ⇒i7 i8 . . .. p2 = i 5 i6 , atunci x13 trebuie s˘ ˆIn particular, dac˘ a x1 j ∈ V T decizia de succes sau e¸sec depinde de faptul dac˘a x1 j coincide sau nu cu simbolul din p care urmeaz˘a (ˆIn exemplul de mai sus, dac˘a x13 coincide sau nu cu i7 ). a un simbol ¸si i se cere o nou˘ a derivare, acesta reactiveaz˘a • Cˆand se reactiveaz˘ ultimul simbol fiu ¸si ˆıi cere acela¸si lucru.
Exemplu Consider˘am urm˘atoarea gramatic˘ a GE care genereaz˘ a expresii aritmetice simple. Operanzii sunt notat¸i simbolic cu a, operatorii sunt + ¸si * iar ordinea natural˘ a a operat¸iilor este completat˘ a de paranteze.
E → T + E |T T → F ∗ T |F F → (E )|a
Procesul de analiza sintactic˘ a top-down pentru cuvˆ antul p = a ∗ a este prezentat ˆın figura 4.1. ˆIn aceast˘ a figur˘ a, revenirile ˆın sus au fost marcate prin ˆıncadrarea ˆıntr-un dreptunghi a subarborelui care a condus la un e¸sec. Dreptunghiurile interioare au semnificat¸ia unor e¸securi realizate mai devreme (este vorba de timpul de desf˘a¸surare al procesului). Arborele corespunz˘ ator cuvˆantului este cel neˆıncadrat ˆın vreun dreptunghi (ˆın figur˘ a acesta este situat ˆın partea dreapt˘ a).
4.1.2
Analiza top-down f˘ ar˘ a reveniri
ˆIn cazul unor gramatici cu o form˘ a special˘a se poate face o analiz˘ a de tip top-down f˘ar˘a reveniri. Principala condit¸ie este ca ˆın cazul mai multor alternative (reguli cu acela¸si simbol ˆın stˆ anga), s˘ a se poat˘ a decide cu precizie ramura corect˘ a. ˆIn general o astfel de decizie se poate realiza prin analiza unor simboluri care urmeaz˘ a ˆın cuvˆantul de analizat. Exemplu Consider˘am urm˘atoarea gramatic˘ a G care genereaz˘ a secvent¸ e de declarat¸ii ¸si instruct¸iuni cuprinse intre cuvintele cheie Program ¸si EndProgram. Declarat¸iile sunt notate simbolic cu d,iar instruct¸iunile cu i. Fiecare instruct¸ie sau declarat¸ie se ˆıncheie cu ;, exceptˆ and cazul celei ce precede EndProgram.
G
< program >→ Program D I EndProgram D → d; X X → d; X |λ I → iY Y →; iY |λ
S˘a consider˘ am urmatorul cuvˆ ant de analizat
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
82
E
E 7
T
5 1 (
F
+
T
T
* 3
E
E
)
F 2 (
E
*
T
)
*
F 8 (
10 E
)
F 9 (
i i
T
E
*
T
)
i i F
4 (
F E
)
11 (
E
i i F 6 (
E
)
i
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 stˆ ang˘a pentru acest cuvˆ ant 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 EndP rogram Pentru construct¸ia deriv˘arii extrem stˆ angi se procedeaz˘ a astfel: init¸ial se consider˘a simbolul de start < program > pentru care se alege singura regul˘a disponibil˘a (dac˘ a primul simbol din ¸sirul de analizat nu coincide cu primul terminal al regulii se poate decide imediat eroare sintactic˘a ).Urm˘atorul simbol neterminal pentru care trebuie aleas˘ a o regul˘ a este D iar ¸sirul r˘amas de analizat (de generat) ˆıncepe cu d, astfel c˘a regula aleas˘ a va fi D → d; X . Din cuvˆantul init¸ial trebuie generat˘a ˆın continuare secvent¸a d; i; i; i; EndProgram ce ˆıncepe cu d iar neterminalul cel mai din stˆanga este X , astfel c˘a se alege regula ce ˆıncepe cu d. ˆIn continuare, din cuvˆ antul init¸ial r˘amˆane de generat secvent¸a i; i; i; EndProgram ce ˆıncepe cu i iar neterminalul cel mai din stˆ anga este X , astfel c˘a se alege regula ce X → λ, ¸s.a.m.d. Dac˘a se consider˘ a gramatica ce genereaz˘ a expresii aritmetice simple, ˆın forma considerat˘a la algoritmul general top-down (4.2.9), atunci la primul pas al unei deriv˘ari extrem stˆ angi pentru cuvˆ antul (a + a ∗ a) + a nu se poate decide regula de ales prin citirea primului terminal ( deoarece ar fi necesar s˘ a consult˘ am ¸sirul rezultat pˆ an˘a la ˆıntˆalnirea operatorului + aflat dup˘ a paranteza ˆınchis˘ a. O gramatic˘ a pentru care alegerea regulii de aplicat este unic determinat˘ a de urm˘ atorul simbol terminal din ¸sirul de analizat se nume¸ste gramatic˘ a LL(1) (Left to right parsing, Leftmost derivation, 1 symbol lookahead). ˆIn multe cazuri exist˘a posibilitatea de a transforma gramatica ˆıntr-una echivalent˘ a de tip LL(1). Pentru cazul particular al gramaticii pentru generarea expresiilor aritmetice, o gramatic˘a echivalent˘ a este urm˘ atoarea:
E → T E E → +T E | − T E |λ T → F T T → ∗F T |/F T |λ F → (E )|id|num
84
˘ CAPITOLUL CAPITOLUL 4. ANALIZA ANALIZA SINTACT SINTACTIC IC A
< bloc >→ {< lista >} < lista >→< instr > L L → ; < instr > L | λ < instr >→ id = id = E E |if ( if (E )then < instr > | while( while(E )do < instr > |{ < lista >} E → T E E → +T + T E | − T E |λ T → F T T → ∗F T |/F T |λ ( E )|id|num F → (E 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 4.1.3
Progra Programa marea rea unui unui analiz analizor or sint sintac actic tic.. Studiu Studiu de caz caz
Programarea unui analizor sintactic top-down f˘ ar˘ ar˘a reveniri se poate face relativ u¸sor sor asociind aso ciind cˆ ate a te o funct¸ie ¸ie la fiecare netermin neterminal. al. Analiz Analizaa unui unui cuvˆ ant ant revine la un ¸sir sir de apeluri corespunz˘ corespunz˘ atoare atoare trat˘ arii simbolurilor ce apar pe parcursul arii construct¸iei ¸iei deriv˘arii arii extrem extre m stˆ angi. angi. Fiecare Fiecare funct funct¸ie ¸ie asociat˘ a cont¸ine ¸ine o singur˘a instruct¸iune switch ¸iune switch cu cu clauze clauze ce corepund corepund regulilo regulilorr gramatic gramaticii. ii. Alegere Alegereaa regulii regulii se face dup˘ a urm˘ atoarea atoarea unitate lexical˘ a din textul de analizat. S˘a consider˘ am am urm˘ atoarea atoarea gramatic˘ a (vezi figura 4.2) ce genereaz˘ a un bloc de instruct¸iuni ¸iuni de atribuir atribuire, e, condit condit¸ionale ¸ionale de tip if (expresie aritmetic˘ a) a) then instruct¸iune ¸iune sau repetitive de tip while. ˆInstruct¸iune ¸iune poate fi o instruct¸ie ¸ie simpl˘a sau bloc de instruct¸iuni ¸iuni separate prin delimitatorul ;(SEMICOLON). Un text surs˘a ce c e poate p oate fi analizat an alizat de aceast˘a gramatic˘ grama tic˘ a este cel din figura 4.3. Lista de unit˘ ati lexicale furnizate de analizorul lexical este pentru acest caz ati 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 ALGORITMI TOP-DOWN TOP-DOWN
85
Un program pentru analiza sintactic˘ a top-down f˘ar˘ ar˘a reveniri corespunz˘ ator ator gramaticii din figura 4.2 este reprezentat part¸ial ˆın figura 4.4. Lista codurilo co durilorr de unit un it˘˘at a¸i ¸t i lexicale (terminalele gramaticii) cont¸ine ¸ine SEMI LPAR RP R PAR ¸s.a.m.d. s.a.m.d . Presupunem Presupunem c˘ a analizo analizorul rul lexical lexical funct func¸ioneaz˘ ¸tioneaz˘ a ca funct¸ie ¸ie ce returnea returneaz˘ z˘ a codul urm˘atoarei atoarei unit˘ at a¸i ¸t i lexicale din textul surs˘ a. a. Variabila de d e tip t ip ˆıntreg token ıntreg token cont cont¸ine ¸ine codul returnat de analizorul lexical ALEX() lexical ALEX().. S-au mai definit dou˘a funct¸ii: ¸ii: err() pentru tratarea erorilor de sintax˘ a depist dep istate ate ¸si eat(int si eat(int tok) ce tok) ce consum˘ a din textul surs˘a unitatea lexical˘ a tok pe pe care ne a¸stept˘ steptam a˘m s˘a o g˘asim asi m ˆın text. tex t. Rularea programului pentru exemplul din figura 4.3 va produce o secvent ¸˘a de apeluri recursive ca ˆın ın figura 4.5. Un pic de algebr˘ a Vom da ˆın cele ce urmeaz˘ urmea z˘ a o definit¸ie ¸ie riguroas˘ riguroasa˘ a gramaticilor L gramaticilor LL L(k ) (k simboluri bol uri citite c itite ˆın avans) vom da d a ˆın cele cel e ce urmeaz u rmeaz˘ a˘ , ˆımpreun˘ ımpre un˘a cu condit¸iile ¸iile necesare ¸si si suficiente suficie nte ca c a o gramatic˘ grama tic˘ a s˘a intre ˆın aceast˘ acea st˘ a categorie. Fie G = = (V N a independent˘ a de context. G se Definit¸ie ¸ie Fie G N , V T T , S, P ) o gramatic˘ zice de tip LL a ¸si si numai numa i dac˘ daca˘ oricare ar fi dou˘a deriv˘ ari ari extrem stˆangi angi LL((k ) dac˘ ∗
∗
S ⇒uXv uX v ⇒ uαv ⇒uγ ∗ ∗ S ⇒uXv uX v ⇒ uβ v⇒uν unde X → α ∈ P , X → β ∈ P , γ , ν ∈ V T + din γ k = ν k rezult˘a α = (notat¸ia γ ¸ia γ k ˆınse ın seam amn˘ n˘a primele k simbolu simb oluri ri din ¸sirul sir ul γ ). α = β β (notat γ ). Pentru k Pentru k = = 1 se obt¸ine ¸ine cazul gramaticilor din sect¸iunile ¸iunile precedente. Restrict¸ia ¸ia asupra num˘ arului arului de simboluri citite ˆın avans avans restrˆ ange ange drastic mult¸imea ¸imea limba jelor ce por fi analizate cu astfel de gramatici. Un inconvenient inconvenient major ma jor pentru sterea exponent¸ial˘ ¸ial˘ a a dimensiunii tabelei de predict¸ie ¸ie (cˆate ate o ink > 1 este cre¸sterea trare ˆın tabel pentru fiecare combinat ¸ie de k simboluri. O variant˘a mai eficient˘ a de analiz˘ a se obt¸ine ¸ine cu gramatici LR gramatici LR(1) (1) (L (Left to right parsing, R parsing, Rightmost ightmost derivation, 1 symbol lookahead). Pentru orice α ∈ V G+ , X ∈ V N consi dera urm˘atoarele atoar ele N , X → α ∈ P vom considera mult¸imi: ¸imi: ∗
Prim( Prim(α) = {a ∈ V T ∈ V G∗ } T |α⇒aβ, β ∈ ∗ U rm( rm(α) = {a ∈ V T rim(v )} T |S ⇒uXv, a ∈ P rim ∗ SD( SD (X, α) = {a ∈ V T rim(α) sau ( sau (α α⇒λ si a ∈ U rm( rm(X ) )} T | a ∈ P rim ∗ NULL( NULL(G) = {X ∈ V N N |X ⇒λ} Dac˘a un terminal a terminal a ∈ P rim atunci a poate poate ap˘ area area pe prima pozit¸ie ¸ie ˆıntr-un ıntr -un rim(α) atunci a ¸sir si r der d erivat ivat din di n α. ¸imea SD a denumirea de mult de mult α . Mult¸imea S D(X, α) poart˘ ¸imea simbolurilor directoare asociate asociate regulii X → α, iar NULL((G) cont¸ine ¸ine neterminalele ce se pot α , iar NULL ¸sterge ste rge (ˆın unul sau mai mult¸i ¸i pa¸ p a¸si) si) cu reguli regu li din G. Teorem˘ a. G ∈ LL LL((k ) ⇔ S D(X, α) ∩ S D(X, β ) = Φ, ∀X → α, X → β ∈ P , β = α
˘ CAPITOLUL CAPITOLUL 4. ANALIZA ANALIZA SINTACT SINTACTIC IC A
86
final final int if=1, if=1, then=2 then=2, , LPAR=3 LPAR=3, , RPAR=4 RPAR=4, , LBRACE LBRACE=5, =5, RBRACE RBRACE=6, =6, PLUS=7, PLUS=7, MINUS=8, MINUS=8, ORI=9, ORI=9, DIV=10, DIV=10, SEMI=11, SEMI=11, id=12, id=12, while=13, while=13, do=14, do=14, LET=15; LET=15; void err(); err(); int ALEX(); ALEX(); int int toke token n = ALEX ALEX() (); ; void void eat(in eat(int t tok){ tok){ if (tok==tok (tok==token) en) token=ALEX token=ALEX else err() }; void bloc(){ bloc(){ eat(LBRAC eat(LBRACE); E); lista(); lista(); eat(RBRAC eat(RBRACE) E) }; void lista(){ lista(){ instr();L() }; void void L(){ L(){ switch(token){ case case SEMI: SEMI: eat(SE eat(SEMI) MI); ; instr( instr(); ); L(); L(); break; break; defaul default: t: break break } }; void instr(){ instr(){ switch(token){ case case if: eat(if eat(if); ); eat(LP eat(LPAR) AR); ; E(); E(); eat(RP eat(RPAR) AR); ; eat (then) (then); ; instr( instr(); ); break; break; case case id: eat(id eat(id); ); eat(LE eat(LET); T); E(); E(); break; break; case while: while: eat(while eat(while); ); eat(LPAR) eat(LPAR); ; E(); eat(RPAR); eat(RPAR); eat(do); instr(); instr(); break; break; case LBRACE: LBRACE: eat(LBRACE eat(LBRACE); ); instr(); instr(); eat(RBRAC eat(RBRACE); E); break; break; defaul default: t: printf printf("s ("synt yntax ax error: error: if, identi identif, f, while while or left left brace brace expect expected" ed"); ); err()} }; ... void void E(){ E(){ T(); Eprime(); Eprime(); }; void Eprime(){ Eprime(){ switch(to switch(token) ken) { case PLUS: eat(PLUS);T();Eprime();break; eat(PLUS);T();Eprime();break; case MINUS: eat(MINUS);T();Eprime();break; eat(MINUS);T();Eprime();break; default: default: break; break; } }; ...
Figura 4.4: Cod C corespunz˘ ator ator analizorului analizorului sintactic sintactic
4.1. ALGORITMI TOP-DOWN
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
87
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
88
Determinarea mult¸imilor definite anterior se poate face u¸sor. PentruNULL(G), se poate aplica algoritmul definit la eliminarea regulilor de ¸stergere pentru o gramatic˘a independent˘ a de context. NULL = {X ∈ V N |X → λ ∈ P} repeat (1) AU X = NU LL; (2) NULL = NU LL ∪ {X ∈ V N |X → p, p ∈ AU X +}; until NU LL = AU X Calculul mult¸imilor P rim(X ) ¸si U rm(X ) se poate face cu algoritmul urm˘ ator: Pas 1: { Init¸ializare } Prim(a) = {a}; ∀a ∈ V T Prim(X ) = U rm(X ) = Φ; ∀X ∈ V N Pas 2: Repeat Pentru fiecare regul˘ a X → Y 1 Y 2 . . . Yk Do For(i = 1; i ≤ k; i + +) (2.1)if (i = 1 sau Y 1 Y 2 . . . Yi ∈ NU LL+ ) Prim(X ) = P rim(X ) ∪ Prim(Y i ); (2.2)if (i = k sau Y i+1 . . . Yk ∈ NU LL+) U rm(Y i ) = U rm(Y i ) ∪ U rm(X ); (2.3)For ( j = i + 1 j ≤ k; j + +) if ( j = i + 1 sau Y i+1 . . . Y j −1 ∈ NU LL+) Urm(Y i ) = U rm(Y i ) ∪ Prim(Y j ); end for end for end do Until Prim(X ),Urm(X ) nu se schimb˘a la o iterat¸ie. Calculul mult¸imilor Prim(α) revine la definit¸ia recursiv˘ a Prim(Xα) =
Prim(X ) dac a X ∈ / NU LL(G) Prim(X ) ∪ Prim(α) dac aX ∈ NU LL(G)
Dac˘a se consider˘ a gramatica ce genereaz˘ a expresii aritmetice 4.1.2, atunci rezultatul aplic˘ arii algoritmilor este prezentat ˆın tabelul urm˘ ator: E E T T F
NU LL Prim U rm ( , i ) DA + , − ) , ( , i + , − , ) DA ∗ , / + , − , ) ( , i ∗ , / , )
4.1. ALGORITMI TOP-DOWN
89
iar mult¸imile simbolurilor directoare sunt SD(E , T E ) = {( , i} SD(E , +T E ) = { +} SD(E , λ) = {)} SD(T , F T ) = {( , i} SD(T , ∗F T ) = {∗} SD(T , λ) = {+ )} SD(F, (E )) = { (} SD(F,id) = {id} SD(F,num) = {num} Funct¸iile C sau Java corespunz˘ atoare neterminalelor se modific˘ a put¸in, ˆın sensul c˘a vom avea clauze corespunz˘atoare simbolurilor terminalelor ce se reg˘ asesc ˆın mult¸imile simbolurilor directoare asociate regulilor. Dac˘ a la reconstruct¸ia deriv˘arii trebuie aplicat˘a o regul˘ a pentru X ¸si urm˘atorul terminal din textul de analizat nu face parte din mult¸imea simbolurilor directoare asociate vreunei reguli cu X ˆın stˆ anga, atunci se apeleaz˘ a modulul de tratare a erorilor sintactice. Pentru cazul gramaticii anterioare, cˆ ateva din secvent¸ele de cod asociate neterminalelor 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() } }
a de proiectantul compilatorului ¸si limbaj. Tratarea erorilor este dependent˘ Principial, exist˘ a trei modalit˘ a¸t i de tratare.
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
90
a ˆın punctul unde s-a depistat o eroare, cu trans• Se opre¸ste analiza sintactic˘ miterea unui mesaj prietenos c˘ atre utilizator, de exemplu: Eroare sintactic˘ a: a¸steptam s˘ a urmeze delimitator de instruct ¸iune. Mai ˆınvat ¸˘ a sintaxa limbajului! BYE! . a inserˆ and ˆın textul surs˘a un simbol • Se ˆıncearc˘a repararea gre¸selii de sintax˘ din mult¸imea de simboluri directoare asociate regulii ce s-a aplicat. Desigur c˘a este suficient s˘ a presupunem c˘ a am inserat ˆın text, astfel ˆıncˆat analiza poate continua (desigur nu vom uita s˘ a anunt¸a˘m utilizatorul c˘ a nu cunoa¸ste regulile de sintax˘ a ¸si l-am corectat noi!). Inserarea poate conduce la cicluri infinite, astfel c˘a nu este recomandabil˘ a totdeauna. a g˘asirea unui simbol ce se potrive¸ste ignorˆ and toate terminalele • Se ˆıncearc˘ textului surs˘ a pˆan˘a se ˆıntˆ alne¸ste un simbol din mult¸imea simbolurilor directoare. Se transmite acela¸si mesaj prietenos c˘ atre autorul textului surs˘ a, apoi se continu˘ a analiza.
4.2 4.2.1
Algoritmi BOTTOM-UP Gramatici cu precedent ¸˘ a simpl˘ a
Fie G = (V N , V T , x0 , P ) o gramatic˘ a de tipul doi ¸si p ∈ L(G) o form˘ a propozit¸ional˘ a, ∗ adic˘a un cuvˆ ant peste alfabetul general V G astfel ˆıncˆ at x 0 ⇒ p. Vom nota cu Ax ,p arborele de derivare care are r˘ ad˘acina x0 ¸si frontiera p. a f este o fraz˘a simpl˘ a a lui p dac˘ a f este un Definit¸ ia 1. Vom spune c˘ subcuvˆ ant al lui p ¸si ˆın plus: 0
• ∃x ∈ V N , cu x → f ∈ P ; • Ax,f ⊂ Ax ,p . 0
Exemplu . Consider˘am gramatica GE 4.2.9 ¸si forma propozit¸ional˘ a p = T ∗ F + a ∗ (E + T ). Arborele de derivare este prezentat ˆın figura 4.6. Se poate observa c˘a frazele simple sunt T ∗ F,a,E + T . Observat ¸ie . Subcuvˆantul F respect˘ a prima condit¸ie dar nu este fraz˘ a simpl˘a, ˆıntrucˆ at nu este satisf˘ acut˘ a condit¸ia a doua din definit¸ie. a denumirea de fraz˘ Definit¸ ia 2. Fraza simpl˘a cea mai din stˆanga poart˘ a simpl˘ a stˆ ang˘ a . Vom nota fraza simpl˘ a stˆang˘a corespunz˘ atoare lui p cu f p ˆın exemplul nostru, a stˆang˘a are un f p = T ∗ F . Dup˘a cum vom vedea ˆın continuare, fraza simpl˘ rol important ˆın algoritmii de analiz˘ a sintactic˘ a bottom-up. ˆIn principiu, ace¸sti algoritmi prev˘ ad urm˘ atorii pa¸si (descri¸si de figura 4.7): Regulile determinate la pasul (3), aplicate ˆın ordine invers˘ a, ne vor da derivarea corespunz˘atoare lui p. S˘a mai observ˘am c˘a ˆın acest mod arborele de derivare se
4.2. ALGORITMI BOTTOM-UP
91
E
+
E
T
T
T
*
T
F
*
F
(
a
E
)
E
F +
T
Figura 4.6: Arborele de derivare corespunz˘ ator deriv˘arii lui p = T ∗ F +a ∗ (E +T )
(1) Init¸ializare p; (2) Se determin˘ a f p , fraza simpl˘a stˆang˘a a lui p; (3) Se determin˘ a regula x → f p ; (4) Se reduce fraza simpl˘ a stˆang˘a, adic˘a dac˘ a p = rf p s, se pune p = rxs; GOTO(2). Figura 4.7: Algoritmul bottom-up
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
92
construie¸ste de jos ˆın sus (bottom-up). Problema cea mai dificil˘a este desigur determinarea frazei simple stˆ angi de la pasul (2). ˆIn principiu ar trebui cunoscut anticipat arborele de derivare corespunz˘ ator lui p, dar tocmai acesta este scopul analizei sintactice. Dup˘ a cum vom vedea, aceast˘ a dificultate se poate elimina, deci putem determina fraza simpl˘ a stˆang˘a f˘ar˘a a cunoa¸ste acest arbore. De fapt, fraza simpl˘ a stˆang˘a este legat˘a de anumite propriet˘ a¸t i ale gramaticii pe care le trat˘am ˆın continuare.
4.2.2
Relat¸ii de precedent¸a ˘
Definit¸ia 3. Fie x, y ∈ V G dou˘a simboluri oarecare ale gramaticii. Vom spune c˘ a: (1) x ≺ y (x precede pe y ) dac˘ a ∃ p astfel ˆıncˆat p = rxys, x ∈ / f p , y ∈ f p ; (2) x ± y (x este egal cu y ) dac˘ a ∃ p astfel ˆıncˆat p = rxys, x ∈ f p , y ∈ f p ; (2) x y (y succede lui x ) dac˘a ∃ p astfel ˆıncˆat p = rxys, x ∈ f p , y ∈ / f p ; Relat¸iile ≺ ± se numesc relat ¸ii de precedent ¸˘ a simple (atunci cˆ and nu exist˘a posibilitatea de confuzie se folosesc denumirile mai mic, egal, mai mare pentru relat¸iile de precedent¸a˘). S˘a observ˘ am c˘a aceste relat¸ii nu se exclud reciproc, deci c˘a putem avea, de exemplu, x ≺ y ¸si ˆın acela¸si timp x y, ˆıntrucˆat pot exista cazuri de gramatici ˆın care putem g˘asi dou˘ a forme propozit¸ionale p1 , p2 astfel ˆıncˆat s˘a avem simultan cele dou˘a relat¸ii. S˘a mai facem de asemenea observat ¸ia c˘a exist˘a mai multe tipuri de astfel de relat¸ii, cu definit¸ii asem˘an˘atoare, ˆıntrucˆat relat¸iile trebuie s˘ a satisfac˘ a condit¸ii suplimentare care depind ¸si de gramatic˘ a; pentru toate aceste tipuri de relat¸ii vom utiliza acelea¸si notat¸ii. Definit¸ ia 4. O gramatic˘ a de tipul 2 spunem c˘a este cu precedent ¸˘ a simpl˘ a dac˘a ˆıntre oricare dou˘ a simboluri ale gramaticii exist˘ a cel mult o relat¸ie de precedent¸a˘. Pentru algoritmul de analiz˘ a sintactic˘ a ascendent˘ a este important ca s˘ a nu existe reguli cu p˘art¸ile drepte identice; altminteri, ˆın cadrul pasului (4) din algoritmul de analiz˘a sintactic˘ a nu se poate decide la cine s˘ a se fac˘ a reducerea frazei simple stˆangi. De asemenea regulile de ¸stergere nu sunt admise, pentru acest caz not¸iunea de fraz˘a simpl˘a neavˆ and sens. Aceste condit¸ii presupunem ˆın mod sistematic c˘ a sunt satisf˘ acute. Fie acum V G = {x1 , x2 , . . . , xn } alfabetul general, unde am adoptat o anumit˘ a ordine a simbolurilor. Definim matricea de precedent¸a˘ a gramaticii, M = (aij ), unde aij =
≺ daca xi ≺ x j ± daca xi ± x j daca xi x j
Exemplu . Consider˘am urm˘atoarea gramatic˘ a G = ({A, B }, {0, 1}, A, {A → A0|1B, B → 1 }).
4.2. ALGORITMI BOTTOM-UP
93
Matricea de precedent¸a˘ va fi 0 1 ≺ ± ≺
A B A B 0 1
4.2.3
Propriet˘ a¸t i ale gramaticilor cu precedent¸˘ a simpl˘ a
a cu Proprietatea 1 . Fie p = a1 . . . an o form˘a propozit¸ional˘a ˆıntr-o gramatic˘ precedent¸˘ a simpl˘a (ai sunt simboluri neterminale sau terminale ale gramaticii). Atunci f p = a i . . . a j dac˘ a ¸si numai dac˘ a ±
±
a1 ≺a2 . . . ≺ai−1 ≺ a i ± ai+1 . . . ± a j a j +1 (∗) Demonstrat¸ia acestei propriet˘ a¸t i se efectueaz˘ a considerˆ and toate structurile de arbori de derivare posibile ˆıntr-o situat¸ie dat˘ a. Vom exemplifica aceast˘ a idee pentru cuvˆ anul p = a 1 . . . a7 . Dac˘a presupunem c˘ a f p = a 3 a4 a5 , atunci, conform definit¸iei frazei simple stˆangi, avem a2 ≺ a 4 , a4 ± a5 , a5 a 6 ±
Mai trebuie ar˘ atat c˘ a a1 ≺a2 . ˆIn acest scop vom considera toate posibilit˘ a¸tile de structuri arborescente; o parte din ele sunt prezentate ˆın figura 4.8. Se poate observa c˘ a ˆın ipoteza c˘ a f p = a 3 a4 a5, singurele situat¸ii posibile sunt (a) ¸si (b). Celelalte situat¸ii contrazic aceast˘a ipotez˘a, de exemplu, ˆın cazurile (c) ¸si (d) fraza simpl˘a stˆang˘a ar fi , respectiv, a1a2 sau a2. Acum, ˆın cazul (a), prin reducerea succesiv˘ a a frazei simple stˆangi, vom obt¸ine un arbore ˆın care fraza simpl˘a stˆang˘a va fi a1 a2 , adic˘a a1 ± a2 iar ˆın cazul (b), fraza simpl˘ a stˆang˘a va fi a2 ¸si atunci a1 ≺ a 2. Implicat¸ia invers˘a se bazeaz˘ a pe cea direct˘ a; se presupune c˘ a f p = a l . . . ak cu = i ¸si k = j ¸si se consider˘a ˆın continuare toate posibilit˘ a¸t ile de pozit¸ionare a l indicilor l, k fat¸a˘ de i, j. De exemplu, dac˘a f p = a 2 a3 atunci, conform implicat¸iei directe, avem a1 ≺ a 2 ± a3 a 4 ceea ce contrazice relat¸ia (*), conform c˘ areia a3 ±a4 iar gramatica are precedent¸a˘ simpl˘a. Observat ¸ie La delimitarea frazei simple stˆ angi se procedeaz˘ a astfel: parcurgem ¸sirul de simboluri de la stˆ anga la dreapta pˆ an˘a se g˘ase¸ste relat¸ia (sau marginea dreapt˘ a a formei propozit¸ionale) pentru determinarea ultimului simbol din f p , apoi se parcurge ¸sirul spre stˆ anga, trecˆ and peste relat¸ii ±, pˆan˘a la g˘asirea unei
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
94
a1 a 2 a 3
a4
a5
a6
a7
a1 a2 a3
a4
a4
a6
a7
a6
a7
(b)
(a)
a1 a2 a3
a5
a5
a6
a1 a2 a3
a7
a4
a5 (d)
(c)
Figura 4.8: Arbori de derivare posibili
x0
a1
a2
. . .
an
Figura 4.9: Arborele de derivare pentru ni = 1 relat¸ii ≺ (sau marginea dreapt˘ a a formei propozit¸ionale) pentru determinarea primului simbol din f p . a. Proprietatea 2 . O gramatic˘a cu precedent¸a˘ simpl˘a este neambigu˘ Schit¸a˘ de demonstrat¸ie. Fie p o form˘a propozit¸ional˘ a ¸si Ax ,p arborele de derivare corespunz˘ ator. Vom ar˘ ata c˘ a acest arbore este unicul arbore de derivare care are r˘ ad˘acina x 0 ¸si frontiera p. Proced˘ am prin induct¸ie asupra num˘ arului de noduri interne ni. Dac˘ a ni = 1 atunci arborele de derivare va avea forma din figura 4.9 ¸si unicitatea acestuia este evident˘ a. Presupunem acum c˘ a proprietatea este adev˘ arat˘ a pentru un ni oarecare ¸si consider˘ am cazul ni + 1. S˘a presupunem c˘a ar exista doi arbori diferit¸i cu r˘ad˘ acina x0 ¸si frontiera p; fie ace¸stia Ax ,p ¸si Ax ,p . Deoarece gramatica este cu precedent ¸˘a simpl˘a, rezult˘ a c˘a fraza simpl˘a stˆang˘a, care este aceia¸si ˆın cei doi arbori, este situat˘ a ˆın aceia¸si pozit¸ie, p = rf p s. Efectu˘am reducerea frazei simple f p (conform regulii aplicate x → f p ) ¸si vom 0
0
0
4.2. ALGORITMI BOTTOM-UP
95
obt¸ine arborii A x ,q ¸si A x ,q unde q = rXs iar cei doi arbori trebuie s˘ a fie diferit¸i. Dar num˘arul de noduri interne este ni, ˆın contrazicere cu ipoteza. 0
4.2.4
0
Determinarea relat¸iilor de precedent ¸a ˘ pentru gramatici cu precedent¸˘ a simpl˘ a
A¸sa cum s-a precizat deja, relat¸iile de precedent¸a˘ sunt propriet˘ a¸t i intrinseci ale gramaticii, nu depind de contextul ˆın care se afl˘ a cele dou˘ a simboluri. Prin urmare, cunoa¸sterea anticipat˘ a a acestor relat¸ii ˆımpreun˘a cu proprietatea 1, rezolv˘ a complet problema pasului 2 de la algoritmul de analiz˘ a bottom-up, adic˘ a determinarea frazei simple stˆ angi. ˆIn acest subparagraf vom prezenta o teorem˘ a de caracterizare pe baza c˘ areia se pot determina relat¸iile de precedent¸a˘ simple ¸si implicit faptul dac˘a gramatica este sau nu cu precedent¸a˘ simpl˘a. Vom defini dou˘ a relat¸ii specifice gramaticilor ¸si care vor fi utilizate ˆın continuare, numite, respectiv, F (First) ¸si L (Last). Fie x ∈ V N ¸si y ∈ V G dou˘a simboluri ale gramaticii. Vom spune c˘a xFy daca ∃ x → yu ∈ P , u ∈ V G∗ xLy daca ∃x → uy ∈ P , u ∈ V G∗ ˆInchiderile tranzitive, respectiv, tranzitive ¸si reflexive ale acestor relat ¸ii le vom + + ∗ ∗ nota cu F , L ¸si respectiv, F , L . Exist˘ a numero¸si algoritmi direct¸i care permit calcularea acestei ˆınchideri,cu complexitate redus˘ a. Teorema 2. Avem (1) x ≺ y ⇔ ∃u → . . . xv . . . ∈ P , vF +y; (2) x ± y ⇔ ∃u → . . . xy . . . ∈ P ; (3) x y ⇔ ∃u → . . . vw . . . ∈ P , vL +x,wF ∗ y; Schit¸a˘ de demonstrat¸ie. Se analizeaz˘ a posibilit˘a¸t ile de arbori de derivare care r˘aspund cerint¸elor teoremei. De exemplu, pentru cazul (1), trebuie s˘ a existe structura de arbore ca ˆın figura 4.10. Este clar c˘ a dac˘ a x ≺ y, atunci conform definit¸ei frazei simple stˆ angi, trebuie s˘a existe p astfel ˆıncˆat p = rxys, x ∈ / f p , y ∈ f p , adic˘a s˘a existe structura din 4.10. Invers, dac˘ a exist˘ a o astfel de structur˘ a , atunci fie o form˘ a propozit¸ional˘ a care cont¸ine u. Efectu˘ am reduceri succesive pˆ an˘a cˆand vom obt¸ine o form˘ a propozit¸ional˘ a pentru care u apart¸ine frazei simple stˆ angi; la arborele astfel obt¸inut, ad˘ aug˘a m subarborele de mai sus. Vom avea ˆın mod evident x∈ / f p , y ∈ f p .
4.2.5
Studiu de caz
S˘a consider˘ am cazul gramaticii pentru generarea expresiilor aritmetice simple GE , cu regulile obi¸snuite
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
96
u v Ramificatii spre dreapta ...
y
x
...
Figura 4.10: Arborele de derivare corespunzator cazului x ≺ y F + ± ≺± ≺ ± ≺± ≺ ≺ E
E T F + ∗ ( ) a
T
∗
(
) a ±
≺ ≺ ≺
≺ ≺ ≺
±
Figura 4.11: Matricea de precedent¸a˘ pentru GE
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 } T L { F } F L {a, )}
E L+ {T,F,a, )} T L+ {F,a, )} F L+ {a, )}
E F ∗ {E,T,F,a, )} T F ∗ {T,F,a, )} F F ∗ {F,a, )}
Conform teoremei de calcul a relat¸iilor de precedent¸a˘ vom obt¸ine matricea de precedent¸a˘ (vezi figura 4.11) asociat˘ a simbolurilor gramaticii GE .
4.2. ALGORITMI BOTTOM-UP
G :
A → A0 | B1 B → 1
97
S S ± a ± b
a b ≺ ± ≺ ±
Figura 4.12: Exemplu de gramatic˘ a cu precedent¸a˘ simpl˘a Regula
F orma 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 → aS Sb a ≺ a ± S ± S ± b abb S → aS Sb a ± S ≺ a ± b b S → ab a ± S ± S ± b S → aS Sb S Figura 4.13: Reconstruct¸ia deriv˘arii cuvˆantului p = aaabaababbbabb Deci gramatica GE nu are proprietatea de precedent ¸˘ a simpl˘a , astfel c˘a nu poate fi aplicat direct algoritmul de analiz˘ a sintactic˘ a bottom up. Vom exemplifica algoritmul de analiz˘ a pentru gramatica din figura 4.12, matricea de precedent¸a˘ asociat˘ a este cea al˘aturat˘ a. Reconstituirea deriv˘ arii cuvˆantului p = aaabaababbbabb este prezentat˘ a ˆın tabelul 4.13, unde fiecare linie corespunde formei propozit¸ionale, ˆın care fraza simpl˘a stˆang˘a este subliniat˘ a, precedat˘ a de regula identificat˘ a.
4.2.6
Gramatici operatoriale
Gramaticile operatoriale sunt gramatici cu o structur˘ a special˘ a a regulilor de rescriere, ˆın care anumite simboluri sunt considerate operatori iar celelalte operanzi, operatorii trebuind s˘ a separe operanzii. Aceast˘ a structur˘ a este preluat˘ a de la gramaticile care genereaz˘ a expresiile aritmetice iar principiul de analiz˘ a este ˆ de asemenea preluat de la algoritmul de evaluare a expresiilor aritmetice. In continuare vom prezenta acest principiu pentru evaluarea expresiilor aritmetice f˘ ar˘a paranteze, cazul expresiilor cu paranteze putˆ andu-se reduce la cel f˘ ar˘a paranteze, de exemplu utilizˆ and tehnica de modificare a ponderilor operatorilor la ˆıntˆ alnirea parantezelor. ˆIn primul rˆand se atribuie operatorilor anumite ponderi care vor defini ordinea de efectuare a operat¸iilor. De obicei, se consider˘a p(+) = p(−) = 1 < 2 = p(∗) =
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
98
a c˘a mai ˆıntˆai se fac adun˘ arile ¸si sc˘aderile, apoi ˆınmult¸irile p(/), ceea ce ˆınseamn˘ ¸si ˆımp˘art¸irile, etc. Efectuarea unei operat ¸ii depinde de contextul ˆın care se afl˘ a operatorul respectiv, ¸si anume, dac˘ a ponderea operatorului precedent este mai mare sau egal˘ a cu ponderea operatorului curent, atunci se poate efectua operat ¸ia definit˘a 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 utilizˆ and dou˘a stive
• P- stiva operatorilor; • S- stiva operanzilor. Vom utiliza indicii i ¸si k pentru a indica nivelele celor dou˘ a stive. Prin urmare, notat¸ia pi , respectiv sk au sensul de operatorul, respectiv operandul din stiv˘ a aflat pe nivelul i, respectiv k. Pentru simplificare, vom utiliza aceia¸si notat¸ie pi atˆat pentru operator cˆ at ¸si pentru ponderea operatorului respectiv. Algoritmul de evaluare: PAS 1: Init ¸ializ˘ ari : Se introduce primul operator ¸si primul operand ˆın stivele P ¸si S ¸si se init¸ializeaz˘ a nivelele celor dou˘ a stive, i = k = 2; PAS 2: Se introduce urm˘ atorul operator ˆın stiva P ¸si se actualizeaz˘ a nivelul, i = i + 1; PAS 3: Dac˘ a pi−1 < pi atunci se introduce urm˘ atorul operand ˆın lista S , se actualizeaz˘a nivelul stivei, k = k + 1, ¸si se revine la pasul 2; PAS 4: Dac˘a pi−1 ≥ p i atunci: ˆın stiva P : pi−1 se ˆınlocuie¸ste cu pi ; ˆın stiva S : sk−1 se ˆınlocuie¸ste cu sk−1 pi−1 sk ; se actualizeaz˘ a nivelele celor dou˘ a stive, i = i − 1; k = k − 1 ¸si se revine la pasul 3. Observat ¸ie . Pentru uniformitatea algoritmului se introduce operatorul marcaj, notat cu # , cu ponderea cea mai mic˘ a; orice expresie se ˆıncadreaz˘ a ˆıntre dou˘ a marcaje iar oprirea algoritmului are loc la pasul 4 ˆın cazul ˆın care p1 = p 2 = #. Schematic, acest algoritm este prezentat ˆın figura 4.14. Exemplu . Tabelul 4.15 cont¸ine starea dinamic˘ a a celor dou˘ a stive pentru expresia #a + b ∗ c/d − f #. Ment¸ion˘ am c˘a ˆın cadrul pa¸silor 2 ¸si 4 s-a completat cˆate un rˆand nou ˆın tabel. Observat ¸ie . Ponderile operatorilor sunt legate de ierarhia lor ˆın gramatic˘a, cu cˆat un operator este mai jos cu atˆ at ponderea lui este mai mare. Acest fapt este ilustat ˆın figura 4.16. Pentru cazul expresiilor aritmetice cu paranteze algoritmul se p˘ astreaz˘a, dar este aplicat dup˘a preprocesarea expresiei prin modificarea dinamic˘a a ponderilor operatorilor ¸si renunt¸area la paranteze. Se parcurge expresia de la stˆ anga la dreapta alocˆ and ponderi operatorilor; la ˆıntˆ alnirea unei paranteze deschise ponderile se incrementeaz˘ a cu 10, iar la ˆıntˆ alnirea unei paranteze ˆınchise se decrementeaz˘a ponderile operatorilor cu 10. ˆIn continuare parantezele sunt ignorate.
4.2. ALGORITMI BOTTOM-UP
99
p1
1.
s1
i=2, k=2
pi 2.
p i-1
i=i+1 sk
3. p i-1 4.
s k-1
p i-1 < p i
k=k+1
pi
p i-1
pi
s k-1
inainte de prelucrare
sk
dupa prelucrare
s k-1 p i-1 s k
pi i=i+1, k=k+1
Figura 4.14: Prelucr˘arile efectuate asupra celor dou˘ a stive
1 1 #0 2 #0 3 #0 4 #0 5 #0 6 #0 7 #0 8 #0 9 #0 10 #0
2 +1 +1 −1 −1 −1 −1 −1 −1 #0
3
4
−1 ∗2 ∗2 /2 /2 /2 #0 #0
1 a a a a+b a+b a+b a+b a+b a+b a + b − c ∗ d/f
2 b b c c c c∗d c∗d c ∗ d/f
3 4
d d f f
Figura 4.15: Evaluarea expresiei #a + b − c ∗ d/f #
˘ CAPITOLUL CAPITOLUL 4. ANALIZA ANALIZA SINTACT SINTACTIC IC A
100
E
E
E +T
E + T
T
T * F
p(+)
T * F p(*)>p(+)
Figura 4.16: Ierarhia operatorilor De exemplu, expresia a ∗ (b − c ∗ d) − (x + y/( y/ (z − t)) ∗ h devine prin preprocesare a ∗2 b −11 c ∗12 d −1 x +11 y/ y /12 z −21 t ∗2 ceea ce va asigura ordinea corect˘ a de evaluare.
4.2.7 4.2.7
Grama Gra matic ticii operato operatoria riale le
Fie G = (V N a de tipul tipul 2. Vom consid considera era c˘ a simbolurile N , V T T , x0 , P ) o gramatic˘ neterminale V neterminale V N terminale V T N sunt operanzii limbajului iar simbolurile terminale V T sunt operatorii. S˘a observ˘ am am c˘a ˆın cazul cazu l gramaticii grama ticii GE care genereaz˘ a expresii aritmetice simple o asemenea convent¸ie ¸ie este justificat˘ a, deoarece oricare din neterminalele a, a ˆın termina ter minalul lul a (generic, acest terminal reprezint˘a operanzii), operanz ii), E , T , F deriveaz˘ sau ˆıntr-o expresie (eventual ˆıntre ıntre paranteze) care are rolul de operand. spunee c˘ a o gramatic˘ a este operatorial˘ a dac˘ a regulile de Definit¸ia ¸ ia 1. Vom spun rescriere au forma X → N i T i N i+1 T i+1 . . . T j N j +1 , unde N unde N k sunt neterminale (operanzi (operanzi ), ), inclusiv cuvˆantul antul vid, iar T iar T k sunt terminale (operatori ). ). Observat ¸ie . ˆIntr-o gramatic˘ a operatorial˘ operatoriala˘ orice form˘ a propozit¸ional˘ ¸ional˘ a are structura: p = p = N N 1 T 1N 2 T 2 . . . Tn N n+1
4.2. ALGORITMI ALGORITMI BOTTOM-UP BOTTOM-UP
101
x
N' i T i
Ni
N' i+1 T i+1 +1
N i+1 +1
T j
N' j j+1 +1
N j j+1 +1
Figura 4.17: Structura subarborelui Aceast Ace astaa ˆınseam ıns eamn˘ n˘ a c˘a ˆıntr-o ıntr -o form˘ for m˘ a propozit¸ional˘ ¸ional˘ a a unei gramatici operatoriale ˆıntre oricare doi operanzi exist˘ a cel put¸in ¸in un operator; pot ˆıns˘ a exista mai mult¸i ¸i .. operatori al˘ aturat aturat¸i, ¸i, de exemplu, . . . ((a ((a . . .. Definit¸ia ¸ ia 2. Fie p = N 1 T 1 N 2 T 2 . . . Tn N n+1 o form˘a propozit¸ional˘ ¸ional˘ a ˆıntrınt r-oo gramatic˘a operatorial˘ a. a . Vom spun spunee c˘ a f o fraz˘ a simpl˘ a a a lui p da d ac˘a f = f este o N i T i N i+1T i+1 . . . T j N j +1 este un subcuvˆ ant ant al lui p lui p care care cont¸ine cel ¸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 ∈ P , ¸si N k ⇒N k ∀k = i, i, . . . , j . (2) A x,f ⊂ Ax ,p . Structura de arbore corespunz˘ atoare atoare unei fraze simple este prezentat˘a ˆın figura 4.17. Ca ¸si si ˆın cazul gramaticilor cu precedent¸˘ ¸a˘ simpl˘a, a, fraza simpl˘a cea mai din stˆanga anga poart˘ a denumirea de fraz˘ de fraz˘ a simpl˘ a stˆ ang˘ a . Principiul de analiz˘a sintactic˘ sintactic˘ a este identic cu cel de la gramatici cu precedent¸˘ ¸a˘ simpl˘a. a. Problem Problemaa principal principal˘ a˘ este ¸si si aici determinarea determinarea frazei simple simple stˆ angi. angi. Aceasta Aceasta operat operat¸ie poate fi f˘acut˘ acut˘a utilizˆand and relat¸iile ¸iile de precedent¸˘ ¸a˘ dintre simbolurile gramaticii care pentru gramatici operatoriale au o definit¸ie ¸ie put¸in ¸in modificat˘ a. a. spu ne c˘a: a: Definit¸ia ¸ia 3. Fie x, y ∈ V T T . Vom spune ◦ y (y succede lui x ) dac˘ a ∃ p a stfe fell ˆıncˆ ın cˆat at p = rxys, = rxys, N ∈ V N p ast / f p p ; N , x ∈ f p p , y ∈ Matricea de precedent¸˘ ¸a˘ se define¸ste ste numai pe mult¸imea simbolurilor terminale, ceea ce conduce la o simplificare a algoritmului de analiz˘ a. a. Definit¸ia ¸ia 4. O gramatic˘a operatorial˘ operatoriala˘ se spune c˘ a are precedent are precedent ¸a˘ simpl˘ a dac˘ dac˘ a ˆıntre ınt re dou˘ do u˘a simboluri ale gramaticii exist˘ a cel mult o relat¸ie ¸ie de precedent¸˘ ¸a. a˘. Ca ¸si si la celelalte tipuri de gramatici, ˆın vederea efectu˘ arii arii pasului 3 din algoritmul de analiz˘ a, a, vom presupune c˘a nu exist˘a reguli cu p˘ art art¸ile ¸ile drepte identice. 0
˘ CAPITOLUL CAPITOLUL 4. ANALIZA ANALIZA SINTACT SINTACTIC IC A
102
Ramificatii spre dreapta
N1 T 1 N2 T 2
N' 3 T 3
N' 4 T 4
N' 5 T 5
N3
N4
N5
Ramificatii spre dreapta
N 1 T 1 N 2 T 2 N' 3
T 3 N' 4 T 4 N' 5 T 5
N3
N5
N4 (b)
(a)
Figura 4.18: Structurile posibile de arbori De asemenea, sunt valabile propriet˘ at a¸ile ¸tile de d e caracterizare ¸si si de neambiguitate. Proprietatea 1 . Fie p Fie p = = N ¸ional˘ a ˆıntrınt r-oo N 1 T 1N 2T 2 . . . Tn N n+1 o form˘a propozit¸ional˘ gramatic˘a cu precedent¸˘ ¸a˘ simpl˘a. a . Atunci tunci f p = N i T i N i+1 T i+1 . . . T j N j +1 dac˘a ¸si numai dac˘a ◦
◦
◦ ◦ < < ◦ ◦ T 1 =T 2 . . . =T i−1 T j +1 ( ∗)
Schit¸˘ ¸a˘ de demonstrat¸ie. ¸ie. Presupunem c˘ a p = N = N 1 T 1 N 2 T 2 . . . Tn N n+1 ¸si c˘a fraza simpl˘a stˆang˘ ang˘a este f este f p p = N = N 3T 3N 4 T 4 N 5 T 5. Atunci din definit¸ia ¸ia frazei simple stˆangi, angi, ◦ ◦ ◦ ◦ ◦ ◦ rezult˘a T 2 T 6 . Mai trebuie s˘ a ar˘ at˘ at˘am am c˘a T 1T l+1 iar conform relat¸iei ¸iei (∗) din ◦ ◦ ipotez˘ a, a, avem T l
4.2. ALGORITMI BOTTOM-UP
103
x0
N1
T1
...
Tn
Nn
Figura 4.19: Arborele de derivare pentru ni = 1 este adev˘ arat˘ a pentru un ni oarecare ¸si consider˘ am cazul ni +1. S˘a presupunem c˘a ar exista doi arbori diferit¸ i cu r˘ad˘acina x0 ¸si frontiera p; fie ace¸stia Ax ,p ¸si Ax ,p . Deoarece gramatica este cu precedent ¸˘ a simpl˘a, rezult˘ a c˘a fraza simpl˘a stˆang˘a, care este aceia¸si ˆın cei doi arbori, este situat˘ a ˆın aceia¸si pozit¸ie, p = rf p s. Efectu˘ am reducerea frazei simple f p (conform regulii aplicate x → f p ) ¸si vom obt¸ine arborii A x ,q ¸si A x ,q unde q = rXs iar cei doi arbori trebuie s˘ a fie diferit¸i. Dar num˘arul de noduri interne este cel mult ni, ceea ce contrazice ipoteza inductiv˘a. 0
0
0
4.2.8
0
Determinarea relat¸iilor de precedent ¸a ˘ pentru gramatici operatoriale
Vom defini mai ˆıntˆai relat¸iile F 1,2 ¸si L1,2 ,analoage cu F ¸si L de la gramaticile cu precedent¸˘ a simpl˘a. Definit¸ie Fie x ∈ V N ¸si y ∈ V G . Vom spune c˘a xF 1,2 y daca ∃x → yu ∈ P , sau x → N yu ∈ P , u ∈ V G∗ , N ∈ V N xL1,2 y daca ∃x → uy ∈ P , sau x → uyN ∈ P , u ∈ V G∗ , N ∈ V N ˆInchiderile tranzitive, respectiv, tranzitive ¸si reflexive ale acestor relat ¸ii le + + ∗ ∗ vom nota cu F 1,2, L1,2 ¸si respectiv, F 1,2 , L1,2 . Acum, determinarea relat¸iilor de precedent¸˘ a operatoriale se poate face cu ajutorul urm˘ atoarei teoreme. Teorema (determinarea relat ¸iilor de precedent ¸˘ a ). Avem ◦
(1) xy ⇔ ∃u → . . . vy . . . ∈ P , 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 s˘ a existe structura de arbore ca ˆın figura 4.20.
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
104
u
v
N' i
x
y
T j
Ni
N' j+1
N j+1
Figura 4.20: Structura posibil˘ a de arbore Aceast˘a teorem˘ a ne permite s˘ a determin˘ am matricea de precedent¸a˘ a gramaticii pe baza c˘ areia putem apoi aplica algoritmul de analiz˘ a bottom-up. Problema neterminalelor de la capetele frazei simple stˆ angi se poate rezolva analizˆ and p˘art¸ile drepte ale regulilor de rescriere. ˆIntr-adev˘ ar, teorema ne d˘ a numai terminalele care intr˘ a ˆın fraza simpl˘a stˆang˘a ¸si neterminalele interioare; cele dou˘ a eventuale neterminale de la capete vor apart ¸ine sau nu frazei simple stˆ angi depinzˆand de forma p˘ art¸ii drepte ale regulii respective. Evident, se pot face ¸si ipoteze de neambiguitate suplimentare pentru gramatic˘ a, similare cu condit¸ia de a nu exista reguli cu p˘art¸ile drepte identice.
4.2.9
Studiu de caz
S˘a consider˘ am cazul gramaticii pentru generarea expresiilor aritmetice simple GE , cu regulile obi¸snuite
E → E + T |T T → T ∗ F |F F → (E )|a
Relat¸iile F 1,2 , L1,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 L1,2 { T, +} T L1,2 { F, ∗} F L1,2 { a, )}
E L+ 1,2 { T, +, F, ∗, a, )} + T L1,2 { F, ∗, a, )} F L+ 1,2 { a, )}
E F 1∗,2 { E,T, +, F, ∗, a, )} T F 1∗,2 { T,F, ∗, a, )} F F 1∗,2 { F,a, )}
4.2. ALGORITMI BOTTOM-UP
+ ◦ + > ◦ ∗ > ◦ ( < ◦ ) > ◦ a >
105
∗ ◦ < ◦ > ◦ < ◦ > ◦ >
( ) a ◦ ◦ ◦ < > < ◦ ◦ ◦ < > < ◦ ◦ ◦ < = < ◦ > ◦ >
Figura 4.21: Matricea de precedent¸a˘ operatorial˘ a pentru GE Regula F → a F → a F → a T → T ∗ F , T → F F → (E ) , E → T F → a T → T ∗ F , T → F F → a T → T ∗ F E → E ∗ T , E → T , T → F
F orma propozitionala ◦ ◦ a> + <(a + a) ∗ a ∗ a ◦ ◦ ◦ F + <( + a) ∗ a ∗ a ◦ ◦ ◦ ◦ F + <() ∗ a ∗ a ◦ ◦ ◦ F + <() ∗ a ∗ a ◦ ◦ ◦ F + <(T =)> ∗ a ∗ a ◦ ◦ ◦ F + ∗ a ◦ ◦ F + ∗ a ◦ ◦ ◦ F +
Figura 4.22: Reconstruct¸ia deriv˘arii cuvˆantului p = a + (a + a) ∗ a ∗ a Conform teoremei de calcul a relat¸iilor de precedent¸˘a vom obt¸ine matricea de precedent¸˘ a (vezi figura 4.21) asociat˘ a simbolurilor gramaticii GE . Deci gramatica G E are proprietatea de precedent¸a˘ operatorial˘ a simpl˘a, astfel c˘a se poate aplica direct algoritmul de analiz˘ a sintactic˘ a bottom up. Reconstituirea deriv˘ arii cuvˆantului p = a + (a + a) ∗ a ∗ a este prezentat˘ a ˆın tabelul 4.22, unde fiecare linie corespunde formei propozit ¸ionale, ˆın care fraza simpl˘a stˆang˘a este subliniat˘ a, precedat˘ a de regula identificat˘ a.
106
˘ CAPITOLUL 4. ANALIZA SINTACTIC A
Capitolul 5 Sinteza Programelor 5.1 5.1.1
Forme interne ale programelor Tabelele compilatorului
Compilatoarele prelucreaz˘ a un num˘ar important de informat¸ii, variabile de diverse tipuri, date organizate ˆın anumite structuri standard sau definite de utilizator, etc. De cele mai multe ori aceste informat ¸ii sunt stocate ˆın tabele ¸si memorate pe suporturile de informat¸ii ale sistemului. Organizarea ¸si prelucrarea tabelelor constituie o problem˘ a distinct˘ a, cu infuent¸a˘ important˘ a asupra performant¸elor unui compilator, mai ales dac˘ a acestea sunt memorate pe un suport extern. ˆIn cele ce urmeaz˘ a vom prezenta pe scurt principalele tabele utilizate ˆın mod obi¸snuit ˆın cadrul unui compilator ¸si modul de organizare a informat¸iilor stocate ˆın aceste tabele. Ment¸ion˘ a m c˘a structura acestor tabele este definit˘ a de proiectantul de compilator ¸si c˘a prin urmare exist˘a un anumit grad de subiectivitate ˆın modul de organizare al acestora.
• Tabelul de variabile . Cont¸ine variabilele utilizate ˆıntr-un program ¸si informat¸ii asupra lor. Ment¸ion˘ a m c˘a variabilele cont¸in datele prelucrate de program, ˆın conformitate cu tipul acestora, cont ¸inut care se modific˘ a ˆın mod dinamic pe parcursul evolut¸iei programului. Informat ¸iile din fiecare linie a tabelului pot fi: – numele variabilei; a¸sa cum s-a precizat la analiza lexical˘ a, numele unei variabile este de obicei un ¸sir de caractere, litere sau cifre, primul caracter trebuind s˘ a fi o liter˘ a. – tipul variabilei; relativ la tipurile de variabile utilizate ˆın programare trebuie s˘ a facem ment¸iunea c˘ a acestea depind ˆın mod esent¸ial de domeniul 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, flotant, 107
108
CAPITOLUL 5. SINTEZA PROGRAMELOR logic), dimensiunea ( simpl˘a precizie, dubl˘ a precizie, etc). ˆIn principiu, fiecare variabil˘ a posed˘ a toate aceste trei caracteristici, putˆ and exista ¸si anumite restrict¸ii, de exemplu, variabilele ˆıntregi pot avea dimensiunea numai simpl˘ a precizie sau dubl˘ a 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, dac˘ a variabila a fost sau nu init¸ializat˘ a (adic˘a dac˘ a ˆınainte de prima utilizare i s-a atribuit valoare), dac˘ a a fost utilizat˘ a sau nu, etc. Pentru uniformitatea prelucr˘ arii tabelului se poate prevedea o anumit˘ a lungime fix˘a pentru elementele tabelului, chiar dac˘ a spat¸iul nu este folosit ˆın ˆıntregime. De exemplu, ˆın cazul variabilelor de tip tablou, se pot utiliza dou˘a sau mai multe linii pentru a stoca valorile maxime ale indicilor (aceste dimensiuni vor fi utilizate atˆ at la rezervarea zonei de memorie cˆ at ¸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 respectiv˘ a o returneaz˘ a. Este natural ca ˆın acest caz numele funct ¸iei s˘a fie considerat variabil˘ a ¸si s˘a fie stocat ˆın acest tabel ˆımpreun˘ a cu atributele respective; de exemplu, unul din aceste atribute trebuie s˘ a fie contorul de amplasare, (CA), adic˘ a adresa primei instruct¸ii executabile a rutinei corespunz˘ atoare funct¸iei.
• Tabelul de etichete . Cont¸ine etichetele utilizate ˆıntr-un program ¸si adresele primelor instruct¸ii ale secvent¸elor de program corespunz˘ atoare. ˆIn esent¸a˘, etichetele nu difer˘ a de variabilele obi¸snuite, dar exist˘ a anumite particularit˘a¸t i; de exemplu, numele unei etichete trebuie s˘ a fie constituit dintr-un identificator urmat de un delimitator special (dou˘ a puncte, etc.) sau numai din caractere numerice (cazul limbajului BASIC) iar valoarea unei etichete este ˆıntodeauna o valoare de adres˘ a. De asemenea, ˆın cazul etichetelor trebuie facut˘ a analiza compatibilit˘ a¸tii dintre etichetele definite ¸si etichetele referite. • Tabelul de variabile temporare . Cont¸ine variabile ale compilatorului necesare p˘ astr˘ arii unor rezultate intermediare. Avˆ and ˆın vedere c˘ a rezultatele intermediare, la fel ca ¸si variabilele definite 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 structur˘a liniar˘a iar adresa unei astfel de variabile se determin˘ a cu o formul˘ a de tipul adr = adr 0 + c × i
5.1. FORME INTERNE ALE PROGRAMELOR
109
unde adr0 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 dinamic˘ a 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 comport˘ a probleme deosebite de organizare ¸si prelucrare.
5.1.2
Cvadruple ¸si triplete
Cvadruplele ¸si tripletele sunt forme intermediare ale programelor ˆın care fiecare operat¸ie elementar˘ a ˆımpreun˘a cu operanzii ei se stocheaz˘ a ˆıntr-o secvent¸˘a de patru sau trei elemente.
Cvadruple Ne vom referi ˆın continuare numai la operat ¸ii binare, pentru celelalte operat¸ii putˆ andu-se proiecta structuri similare. Consider˘ am deci o secvent¸a˘ de text de forma A op B, unde A ¸si B sunt operanzi (variabile, constante, variabile temporare, etc.) iar op este un operator binar. Cvadrupul corespunz˘ ator acestei secvent¸e va fi op, A, B, ti unde op, A, B sunt codurile unit˘ a¸t ilor lexicale respective iar ti este o variabil˘ a temporar˘ a. Semnificat¸ia acestui cvadruplu este urm˘ atoarea: se execut˘ a operat¸ia definit˘a de operatorul op ˆıntre operanzii A ¸si B, ˆın aceast˘ a ordine, iar rezultatul este memorat la ti . ˆIn continuare vom folosi aceia¸si notat¸ie pentru un operand ¸si pentru codul operandului, posibilitatea de confuzie fiind redus˘ a, deci nu vom mai utiliza notat¸ii de forma A, etc. Exemplu . Cvadruplele corespunz˘ atoare expresiei aritmetice a − b + (c + d)/e sunt (1) − , a, b, t 1 (2) +, c, d, t2 (3) /, t2, e, t3 (4) +, t1 , t3 , t4 ˆIn cazul altor operat¸ii, chiar de n-aritate diferit˘a de doi, se stabilesc structurile specifice ale cvadruplelor; pentru operat¸ii cu mai mult de doi operanzi, se pot utiliza dou˘ a 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 c˘ a structura instruct¸iei este if (expresie logica) then instruct¸ iune bloc;
CAPITOLUL 5. SINTEZA PROGRAMELOR
110
Text Surs˘ a a+b a=b goto i if (a==b) then
Cvadruple +,a,b,t, idem -,*,/ =,a,b, BR, i, , BE, a,b, n
Figura 5.1: Exemplu de codificare prin cvadruple
Expresie logica rezultatul in t
Expresie
fals
t
r,a,b, n
adevarat Instructie Bloc
Instructie Bloc
if,_,_,_
(a) Schema logica
(b) Cvadruple
Figura 5.2: Instruct¸iunea If logic
5.1. FORME INTERNE ALE PROGRAMELOR
111
Semantica acestei instruct¸ii este prezentat˘ a ˆın figura 5.2. Ment¸ion˘ a m c˘a expresie logic˘ a va avea forma particular˘ a E 1 rE 2 , unde r este un operator relat¸ional. ˆIn figur˘ a (a) prezint˘ a schema logic˘ a a instruct¸iei iar (b) cvadruplele corespunz˘atoare. Partea de cod corespunz˘ atoare expresiei logice va stoca valoarea (logic˘a ) a expresiei ˆıntr-o variabil˘ a temporar˘ a t; aceast˘ a valoare va fi utilizat˘a ˆın instruct¸ia de salt, ˆın conformitate cu tipul de salt prev˘ azut ˆın programul surs˘ a (<, =, etc.). ˆIn consecint¸a˘, cvadrupul de salt r va trebui s˘a prevad˘ a aceast˘ a variabil˘a temporar˘ a, plus num˘arul de ordine n al primului cvadruplu care urmeaz˘ a dup˘ a cvadruplele corespunz˘ atoare instruct¸iei sau blocului. De exemplu, acest cvadruplu poate avea urm˘ atoarea form˘ a r, a, b, n unde n este num˘arul cvadruplului la care trebuie s˘ a se fac˘a saltul.
Triplete Este o alt˘ a posibilitate de format intermediar, asem˘ an˘ator cu cvadruplele, singura deosebire fiind accea c˘ a nu se prevede explicit o variabil˘ a temporar˘ a pentru stocarea rezultatului. Prin urmare, tripletul corespunz˘ ator unei operat¸ii binare ˆ de forma A op B va fi op, A, B. In cazul ˆın care ca operand al unui triplet trebuie specificat 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 fi (1) − , a, b (2) +, c, d (3) /, (2), e (4) +, (1), (3) (5) =,xx, (4)
Notat¸ia polonez˘ a Notat¸ia polonez˘ a a fost introdus˘ a init¸ial pentru a se putea evalua expresii aritmetice printr-o singur˘ a parcurgere secvent¸ial˘ a. Din punctul de vedere al proiect˘ arii compilatoarelor, aceast˘ a notat¸ie poate fi utilizat˘ a ca un format intermediar al programelor, ˆın mod special pentru limbajele de programare algoritmice, Fortran, Pascal. ˆIn continuare vom ilustra ideea de evaluare secvent¸ial˘a a expresiilor aritmetice printr-un exemplu. Consider˘am expresia aritmetic˘ a a ∗b+(c − d∗ e)∗f . Ideea ¸sirului polonez const˘ a ˆın scrierea operanzilor ¸si a operatorilor acestei expresii (f˘ ar˘a a utiliza paranteze) ˆıntr-un ¸sir cu urm˘atoarea proprietate: se parcurge ¸sirul secvent ¸ial de la stˆ anga la dreapta ¸si fiecare 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
CAPITOLUL 5. SINTEZA PROGRAMELOR
112
¸sir care satisface aceast˘ a condit¸ie este ab ∗ cde ∗ −f ∗ + Vom numi acest ¸sir notat¸ia polonez˘a corespunz˘ atoare expresiei, sau notat ¸ia polonez˘ a invers˘ a . Evaluarea se poate face utilizˆ and o stiv˘a cu urm˘ atoarea prelucrare: se parcurge secvent ¸ial ¸sirul, operanzii se introduc ˆın stiv˘ a f˘ar˘a nici un control, iar fiecare operator citit provoac˘ a efectuarea operat¸iei ˆıntre operanzii aflat¸i ˆın penultimul ¸si ultimul element al stivei, ˆın aceast˘ a ordine ¸si memorarea rezultatului ˆın penultimul element. Starea dinamic˘ a a stivei pentru exemplul considerat este urm˘atoarea: (1) a (2) b (3) (4)
a*b a*b a*b a*b a*b+(c-d*e)*f c c c-d*e (c-d*e)*f d d*e f e
Cont¸inutul stivei a fost rescris atunci cˆ and un operator provoac˘ a efectuarea unei operat¸ii. Se poate observa c˘ a ¸sirul considerat de noi (notat ¸ia polonez˘ a a expresiei) satisface condit¸ia de evaluare secvent¸ial˘ a . De fapt, aceast˘ a condit¸ie este esent¸ial˘ a ¸si ea poate fi luat˘ a chiar ca o definit¸ie a ¸sirului polonez. Fie V un alfabet ¸si B o mult¸ime de operatori binari. ant peste alfabetul V ∪ B obt¸inut Definit¸ia 1. Vom numi ¸sir polonez orice cuvˆ recursiv cu ajutorul regulilor: (1) dac˘ a a ∈ V atunci a este ¸sir polonez; (2) dac˘ a p ¸si q sunt ¸siruri poloneze ¸si b ∈ B, atunci pqb este ¸sir polonez. S˘a observ˘ am c˘a utilizˆand aceste dou˘a reguli, putem s˘ a obt¸inem succesiv toate ¸sirurile poloneze avˆ and operanzii V ¸si operatorii binari B. De exemplu, dac˘a V = {a,b,c} ¸si B = {+, ∗}, atunci ¸sirurile poloneze vor fi a,b,c,ab+, ac+, bc+, ab∗, . . . , a a b + +,aac + +, . . .. ˆIn cele ce urmeaz˘ a vom da o alt˘a definit¸ie, tot constructiv˘ a, folosind gramaticile generative Chomsky. Este necesar s˘a preciz˘ am expresiile aritmetice pentru care introducem aceste ¸siruri. Definit¸ia 2. Fie gramatica Gexp = ({E , T , F }, {a, +, ∗}, E, P ) unde regulile de rescriere sunt
E → E + T |T T → T ∗ F |F F → a
Observat¸ie. Terminalul a desemneaz˘ a operanzii, deci a este de fapt o notat¸ie simbolic˘a pentru variabile de forma a, b, c, etc. Este u¸sor de v˘ azut c˘ a aceast˘ a gramatic˘a genereaz˘ a expresii aritmetice f˘ar˘ 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, cre¸sterea f˘ acˆandu-se odat˘ a cu adˆ ancimea, deci p(+) < p(∗).
5.1. FORME INTERNE ALE PROGRAMELOR
113
Acela¸si limbaj al expresiilor aritmetice f˘ar˘ a paranteze poate fi generat cu o gramatic˘a cu un singur neterminal, fie acesta A, ¸si avˆand regulile A → A + A|A ∗ A|a Dar ˆın acest caz trebuie introduse alte convent ¸ii pentru a preciza ordinea operat¸iilor; de exemplu, pentru expresia a+b ∗ c, ˆın acest ultim caz, nimic nu arat˘ a c˘a operat¸ia a ˆınainte de +. Trebuie s˘ a preciz˘ am c˘a prin considerarea a numai ∗ trebuie f˘acut˘ doi operanzi nu se impune o constrˆ angere asupra not¸iunii de expresie aritmetic˘ a, foarte u¸sor putem generaliza aceast˘ a gramatic˘ a la un num˘ar oarecare de operatori binari, de exemplu A1 → A 1 op1 A2 |A2 A2 → A 2 op2 A3 |A3 etc. De asemenea, putem considera operatori de n-aritate oarecare precum ¸si reguli de rescriere ˆın concordant¸a˘ cu sintaxa pe care dorim s˘a o satisfac˘ a ace¸stia. Utilizarea unor paranteze pentru a indica o anumit˘ a ordine de efectuare a operat¸iilor, iar˘a¸si nu difer˘a esent¸ial de cazul expresiilor f˘ ar˘a paranteze. Putem folosi algoritmul de modificare dinamic˘ a a ponderilor descris la gramatici operatoriale: parcurgem expresia de la stˆanga la dreapta ¸si ata¸sam ˘ fiec˘ arui operator ponderea sa; ˆın momentul ˆın care ˆıntˆ alnim o parantez˘a deschis˘a, m˘arim toate ponderile cu o constant˘ a mai mare decˆ at cea mai mare pondere iar la ˆıntˆ alnirea unei paranteze ˆınchise, sc˘adem aceast˘ a constant˘ a. Apoi elimin˘ am toate parantezele. Este evident c˘ a ˆın acest fel operat¸iile din interiorul parantezelor vor avea prioritatae mai mare, mergˆ andu-se spre parantezele din interior. Definit¸ ia 3. Fie G p = (V N , V T , x0, P ) , unde V N = {A}, V T = {a, +, ∗}, x0 = A iar regulile sunt A → AA + |AA ∗ |a Orice cuvˆ ant p ∈ L(G p ) va fi numit ¸sir polonez. Este natural ca aceste ¸siruri poloneze s˘ a fie puse ˆın leg˘ atur˘ a cu expresiile aritmetice f˘ ar˘a paranteze prezentate mai sus. Gramatic˘ a G p nu stabile¸ste o ordine intrinsec˘ a de efectuare a operat¸iilor, ˆıntocmai ca ¸si gramatica cu un singur neterminal de generare a expresiilor. Convenim ˆıns˘a ca aceast˘a ordine s˘a fie cea secvent ¸ial˘ a . Dac˘a p ∈ L(G p ) atunci convenim s˘a not˘ am cu aes( p) cuvˆantul obt¸inut din p cu ajutorul algoritmului de evaluare secvent¸ial˘a. Urm˘atoarea teorem˘ a stabile¸ste leg˘ atura ˆıntre cele dou˘ a entit˘ a¸ti. ant e ∈ L(Gexp ) exist˘a un pe ∈ L(G p ) astfel ˆıncˆ at Teorem˘ a. Pentru orice cuvˆ aes( pe ) = e. Demonstrat¸ie. Proced˘ am prin induct¸ie asupra num˘ arului n de operatori din e. Dac˘a n = 1 atunci e = a + b sau e = a ∗ b ¸si ¸sirul polonez care satisface condit¸ia din teorem˘ a va fi pe = ab+ sau pe = ab∗. S˘a presupunem c˘ a proprietatea este
CAPITOLUL 5. SINTEZA PROGRAMELOR
114
E E T E
+
T T
e1
e2
*
F
a
e1
(a)
(b)
Figura 5.3: Structurile posibile ale arborelui de derivare adev˘arat˘ a pentru o expresie care cont¸ine un num˘ar de operatori mai mic sau egal cu n ¸si consider˘ am o expresie e cu n operatori. Arborele de derivare al acesteia va avea una din formele prezentate ˆın figura 5.3. ˆIn cazul (b) putem considera e2 = a. ˆIn ambele cazuri expresiile e1 ¸si e2 au un num˘ar de operanzi inferior lui n ¸si ˆın conformitate cu ipoteza inductiv˘ a avem aes( pe ) = e 1 ¸si aes( pe ) = e 2 . Lu˘am pe = p e pe + pentru cazul (a) ¸si pe = p e pe ∗ pentru cazul (b). Este evident c˘ a aes( pe ) = e. 1
5.2
2
1
2
1
2
Generarea formatului intermediar
ˆIn aceast˘ a sect¸iune vom analiza problema gener˘arii formatului intermediar pentru limbaje algoritmice de tip Fortran, Pascal, Basic. Formele intermediare avute ˆın vedere sunt cvadruplele ¸si notat¸ia polonez˘ a, ˆıntr-un singur caz ne vom referi ¸si la triplete, avˆand ˆın vedere c˘ a principial generarea acestora nu difer˘ a esent¸ial de cea a cvadruplelor. Schema general˘a a algoritmilor este urm˘ atoarea. Fie G gramatica (de tipul 2) care genereaz˘ a limbajul de programare. Prima faz˘a const˘ a ˆın stabilirea unor elemente semantice ˆın concordant ¸˘ a cu structura limbajului; astfel, fiec˘arui simbol x ∈ V G i se atribuie un anumit sens semantic , notat S (x), sens care cont¸ine o anumit˘ a informat¸ie depinzˆ and de simbolul respectiv, de contextul ˆın care acesta apare, etc. De asemenea, fiec˘ arei reguli de generare i se ata¸seaz˘ a o anu- mit˘a rutin˘ a semantic˘ a . Operat¸iile obi¸snuite care se efectueaz˘ a ˆın aceste rutine sunt: analize specifice, atribuirea unui sens semantic simbolului din stˆanga, generarea unui cvadruplu sau a unei secvent¸e de ¸sir polonez, etc. Faza a doua este faza de generare propriuzis˘ a ¸si ea comport˘ a ˆın principiu urm˘atoarele operat¸ii: Se efectueaz˘ a analiza sintactic˘ a a tex-
5.2. GENERAREA FORMATULUI INTERMEDIAR
115
tului surs˘a cu un algoritm de analiz˘a pe care proiectantul de compilator a decis s˘a ˆıl utilizeze. Indiferent de algoritmul ales, analiza poate fi conceput˘a ˆın dou˘ a etape, mai ˆıntˆai construct¸ia arborelui de derivare ¸si apoi reducerea lui succesiv˘ a ˆ prin eliminarea unor subarbori. In mod natural ace¸sti subarbori sunt cei corespunz˘atori frazelor simple stˆ angi a¸sa ˆıncˆa t act¸iunile care se realizeaz˘a cu acest prilej sunt cele corespunz˘ atoare rutinelor semantice din prima faz˘a. Ment ¸ion˘ am c˘a frontierele subarborilor care se reduc vor constitui, prin definit¸ie, unit˘a¸tile sintactice ale limbajului. ˆIn momentul ˆın care se ajunge la simbolul de start (s-a efectuat ˆıntreaga reducere) ˆıntr-un fi¸sier de ie¸sire se obt ¸ine programul ˆın format intermediar, cvadruple, ¸sir polonez, etc. Se poate observa c˘ a analiza sintactic˘a joac˘a ˆın acest proces un rol central. ˆIn cele ce urmeaz˘ a vom presupune c˘ a analiza sintactic˘ a se efectueaz˘a cu un algoritm de tip bottom-up ¸si deci subarborele care se reduce are drept frontier˘ a fraza simpl˘a stˆang˘a.
5.2.1
Generarea cvadruplelor
Gramatica care genereaz˘a expresiile aritmetice GE este cunoscut˘ a ; pentru a ne situa ˆıntr-un context cˆ at mai apropiat de cazul real, vom completa aceast˘ a gramatic˘a cu operat¸iile - ¸si / (diferent¸a˘ ¸si ˆımp˘ art¸ire). Prin urmare regulile acestei gramatici vor fi
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, a identificatorului desemnat de a. Pentru S (a) este adresa zonei de memorie ata¸sat˘ celelalte simboluri neterminale, E, T , F sensul semantic se atribuie pe parcursul efectu˘ arii analizei. Rutinele semantice corespunz˘ atoare regulilor sunt prezentate ˆın tabelul 5.4. Ment¸ion˘ a m c˘a act¸iunile prev˘ azute ˆın aceste rutine sunt stabilite ˆın conformitate cu ˆınt¸elesul pe care proiectantul dore¸ste s˘ a ˆıl atribuie diverselor structuri ¸si nu au o rat¸iune intrinsec˘ a . Ca o regul˘ a general˘ a ˆıns˘a , putem s˘ a facem precizarea c˘ a ˆın cazul cvadruplelor, variabila temporar˘ a ˆın care se ret¸ine rezultatul intermediar, va fi transmis˘ a ca sens semantic simbolului din stˆanga. Exemplu . Consider˘am urm˘atoarea expresie aritmetic˘ a (a + b) ∗ c − d ∗ (e − f ). Arborele de derivare corespunz˘ ator este prezentat ˆın figura 5.5. ˆIn dreapta fiec˘ arui nod al arborelui (nodurile sunt etichetate cu simboluri ale gramaticii), se afl˘ a ˆınscris sensul semantic corespunz˘ ator variabilei ¸si contextului ˆın care aceasta se afl˘ a. Procesul de generare al cvadruplelor se desf˘ a¸soar˘ a astfel: la ˆınceputul procesului, dup˘ a cum se poate vedea pe arborele de generare, fraza simpl˘a stˆang˘a este a. Se efectueaz˘ a reducerea F → a ¸si se aplic˘ a rutina semantic˘ a corespunz˘atoare acestei reguli (ˆın tabelul rutinelor pozit¸ia (8) ); singura operat¸ie care se face este transmiterea sensului semantic lui F . ˆIn continuare, acest sens
CAPITOLUL 5. SINTEZA PROGRAMELOR
116
Regula (1) E 1 → E 2 + T (2) E 1 → E 2 − T (3) E → T (4) T 1 → T 2 ∗ F (5) T 1 → T 2 /F (6) T → F (7) F → (E ) (8) F → a
Cvadruplu Sens +, S (E 2 ), S (T ), ti S (E 1) = t i −, S (E 2 ), S (T ), ti S (E 1) = ti S (E ) = S (T ) ∗, S (T 2 ), S (F ), ti S (T 1 ) = t i /, S (T 2 ), S (F ), ti S (T 1 ) = t i S (T ) = S (F ) S (F ) = S (E ) S (F ) = Adr(a)
Figura 5.4: Rutine semantice asociate regulilor
E
E,t T,t
_
2
T,t
2
T,d T,t
1
F,t
1
4
F,t
3
(
E,t
3
E,e
_
*
F,c
*
F,d
)
c (
E,a
E,t
+
1
)
d
T,e
T,b
T,f
F,f
F,e T,a
F,b
f e
F,a b a
Figura 5.5: Arborele de derivare
5.2. GENERAREA FORMATULUI INTERMEDIAR
Regula (1) E 1 → E 2 + T (2) E 1 → E 2 − T (3) E → T (4) T 1 → T 2 ∗ F (5) T 1 → T 2 /F (6) T → F (7) F → (E ) (8) F → a
117
Cvadruplu Sens +, S (E 2 ), S (T ) S (E 1 ) = (n) −, S (E 2 ), S (T ) S (E 1 ) = (n) S (E ) = S (T ) ∗, S (T 2 ), S (F ) S (T 1 ) = (n) /, S (T 2 ), S (F ) S (T 1 ) = (n) S (T ) = S (F ) S (F ) = S (E ) S (F ) = Adr(a)
Figura 5.6: Rutine semantice pentru generarea tripletelor se transmite pˆ an˘a la E , apoi fraza simpl˘ a stˆang˘a este b ¸si se transmite sensul semantic pˆ an˘a la T . ˆIn acest moment fraza stˆ ang˘a este E + T iar cele dou˘ a simboluri au sensurile S (E ) = a, S (T ) = b; se efectueaz˘ a reducerea E → E + T ¸si se genereaz˘a cvadruplul +,a,b,t1 iar sensul semantic care se transmite lui E este t1 . Procesul continu˘ a ˆın acela¸si mod ¸si se obt¸ine ˆın final ¸sirul de cvadruple: +,a,b,t1 ∗, t1 , c , t 2 −, e , f , t3 ∗, d , t3 , t4 −, t2, t4 , t5
5.2.2
Generarea tripletelor
Modificarea ceva mai important˘ a intervine la rutinele semantice precum ¸si la faptul c˘ a dup˘ a generarea unui triplet, sensul semantic care se transmite va fi num˘arul de ordine al tripletului generat. Aceste rutine sunt prezentate ˆın tabelul 5.6. Generarea tripletelor se desf˘ a¸soar˘ a la fel cu cea a cvadruplelor. Pentru expresia considerat˘ a la generarea cvadruplelor se obt¸ine urm˘ atorul ¸sir de triplete
(1) +, a, b (2) *, (1), c (3) -, e, f (4) *, d, (3) (5) -, (2), (4)
CAPITOLUL 5. SINTEZA PROGRAMELOR
118
(1) (2) (3) (4) (5) (6) (7) (8)
Regula E → E + T E → E − T E → T T → T ∗ F T → T/F T → F F → (E ) F → a
Notat¸ia polonez˘ a pi = + pi = pi = ∗ pi = /
pi = Adr(a)
Figura 5.7: Metoda rutinelor semantice
5.2.3
Generarea ¸sirului polonez
Tehnica rutinelor semantice Dup˘a cum s-a precizat, notat¸ia polonez˘ a constituie o interesant˘ a ¸si util˘a form˘ a ˆ intermediar˘ a a programelor. In paragraful precedent aceast˘ a notat¸ie s-a introdus numai pentru expresii aritmetice f˘ ar˘a paranteze, dar aceast˘ a construct¸ie se poate face pentru majoritatea structurilor sintactice ale limbajelor de programare. Desigur c˘a cea mai natural˘ a tehnic˘ a de generare a notat¸iei poloneze pentru o expresie este procedura general˘ a prezentat˘ a la ˆınceputul capitolului, bazat˘a pe rutinele semantice ata¸sate 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 necesar˘ a stocarea unor informat¸ii suplimentare. ˆIn continuare sunt prezentate rutinele semantice pentru generarea notat ¸iei poloneze corespunz˘ atoare expresiilor aritmetice cu paranteze (vezi figura 5.7), generate de gramatica GE . Notat¸ia pi o utiliz˘am pentru a desemna elementul i din ¸sirul polonez; indicele i se actualizeaz˘ a dup˘ a fiecare prelucrare a ¸sirului. Exemplu . Vom aplica rutinele semantice de mai sus pentru generarea ¸sirului polonez corespunz˘ ator expresiei aritmetice a ∗ b + (c − d ∗ e) ∗ f . Analiza sintactic˘a se efectueaz˘ a cu un algoritm de tip bottom-up, a¸sa ˆıncˆ at trasarea explicit˘ a a arborelui de derivare nu mai este necesar˘ a. Prelucrarea efectiv˘ a se poate organiza ˆıntr-un tabel ca ˆın figura 5.8; ment¸ion˘ am c˘a fraza simpl˘ a stˆang˘a este indicat˘ a prin sublinierea secvent¸ei corespunz˘ atoare de text.
Tehnica parantezelor Ideea de baz˘ a const˘a ˆın aceea c˘ a se plaseaz˘ a ˆıntre dou˘ a paranteze fiecare operator ˆımpreun˘a cu cei doi operanzi ai s˘ai; apoi generarea notat ¸iei poloneze se poate face simplu, folosind o stiv˘a de operatori.
5.2. GENERAREA FORMATULUI INTERMEDIAR
Textul surs˘ a a * b + (c - d * e) * f F * b + (c - d * e) * f F * F + (c - d * e) * f T + (c - d * e) * f T + (F - d * e) * f T + (F - F * e) * f T + (F - F * F) * f T + (F - T) * f T + (E) * f T + F * f T+F*F T+T E
Regula aplicat˘ a F → a F → b T → T ∗ F, T → F F → c F → d F → e T → T ∗ F, T → F E → E − T, E → T , T → F F → (E ) F → f T → T ∗ F, T → F E → E + T, E → T
119
Notat¸ia polonez˘ a a ab ab* ab*c ab*cd ab*cde ab*cde* ab*cde*ab*cde*ab*cde*-f ab*cde*-f* ab*cde*-f*+ ab*cde*-f*+
Figura 5.8: Generarea sirului polonez: tehnica analizei sintactice Plasarea parantezelor. Se atribuie fiec˘ arui operator cˆ ate o pondere ˆın conformitate cu convent¸ia de priorit˘ a¸t i sau cu gramatica care genereaz˘ a expresiile considerate. ˆIn cazul unei expresii aritmetice f˘ar˘a paranteze se poate proceda ˆın urm˘atorii pa¸si: a fiec˘ arui operator ponderea sa. • (1) Se ata¸seaz˘ anga la dreapta pˆ an˘a cˆand ˆıntre doi op• (2) Se parcurge expresia de la stˆ eratori se g˘ ase¸ste relat¸ia ≥; de exemplu . . . a ∗ b + c . . . ¸si, cu convent¸ia uzual˘a, ∗ ≥ +. Se plaseaz˘ a ˆıntre paranteze operatorul ∗ ˆımpreun˘a cu cei doi operanzi ai s˘ ai, adic˘a . . . (a ∗ b) + c . . ..
• (3) Se ¸sterge ponderea operatorului curent (cel care a fost inclus ˆıntre paranteze) ¸si se reia procesul de la punctul (2) ˆıncepˆ and cu operatorul urm˘ ator (ˆı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 folose¸ste un algoritm asem˘ an˘ator ˆın care se modific˘ a pasul (1) ¸si anume: se parcurge expresia de la stˆ anga la dreapta ata¸saˆnd fiec˘ arui operator ponderea sa. La ˆıntˆ alnirea unei paranteze deschise se modific˘ a provizoriu ponderile prin ad˘ augarea unei constante ˆıntregi (aceast˘ a constant˘ a trebuie s˘a fie mare decˆ at cea mai mic˘ a pondere) ¸si se atribuie ˆın continuare noile ponderi. La ˆıntˆ alnirea unei paranteze ˆınchise, aceast˘a constant˘ a este sc˘azut˘ a, astfel ˆıncˆ at operatorii din interiorul parantezelor vor avea ponderi superioare. Apoi toate parantezele se ¸sterg. De exemplu, ˆın expresia (a + b) ∗ (c/(d − e) − f ),
CAPITOLUL 5. SINTEZA PROGRAMELOR
120
dup˘a efectuarea acestei operat¸ii, presupunˆ a nd c˘ a init¸ial ponderile operatorilor +, −, ∗, / sunt, respectiv, 1, 2, 3, 4 ¸si constanta de majorare are valoarea 10, operatorilor li se vor atribui ponderile: a
+ b * 11 3
c
/ 14
d
- e 22
- f 12
Generarea ¸sirului polonez. Pornind de la expresiile aritmetice ˆın care au fost plasate parantezele ˆın conformitate cu prima parte, ¸sirul polonez poate fi construit cu ajutorul algoritmului:
• Se parcurge expresia de la stˆanga la dreapta, parantezele deschise sunt ignorate ¸si se execut˘a operat ¸iile – operanzii se scriu succesiv ˆın ¸sirul polonez; a. – operatorii se scriu ˆıntr-o stiv˘ arful stivei se scrie ˆın ¸sirul • La citirea unei paranteze ˆınchise, operatorul din vˆ polonez.
Tehnica stivei de operatori Este probabil cea mai r˘ aspˆandit˘a metod˘ a de generare a ¸sirului polonez pentru expresii aritmetice. Se utilizeaz˘ a dou˘ a liste liniare ¸si o stiv˘ a. Prima list˘a cont¸ine expresia aritmetic˘ a dat˘ a iar ˆın cealalt˘ a se obt¸ine succesiv ¸sirul polonez corespunz˘a tor. Operatorii sunt plasat ¸i ˆın stiv˘a ¸tinˆandu-se cont de ponderile lor, apoi sunt extra¸si ¸si scri¸si ˆın ¸sir conform cu un algoritm care ˆın esent ¸˘ a reproduce act¸iunea rutinelor semantice. Mecanismul care realizeaz˘a acest proces este prezentat ˆın figura 5.9. Algoritmul este urm˘ atorul: (1) Operanzii se scriu direct ˆın ¸sirul polonez. (2) Operatorii ¸si parantezele deschise se scriu ˆın stiv˘ a respectˆ andu-se urm˘ atoarele reguli ar˘a condit¸ii; • Parantezele deschise au pondere 0 ¸si se scriu f˘ a ponderea operatorului de introdus • Pentru ceilalt¸i operatori, se compar˘ cu ponderea operatorului din vˆ arful stivei; dac˘a aceasta este mai mare, introducerea are loc; dac˘ a este mai mic˘a sau egal˘ a, se extrage vˆ arful stivei (acesta trece ˆın ¸sirul polonez), se reia comparat ¸ia cu operatorul din vˆ arful stivei pˆan˘a la prima parantez˘ a deschis˘ a sau pˆan˘a la baza stivei, ¸si apoi se introduce noul operator;
5.3. GENERAREA FORMATULUI INTERMEDIAR PENTRU INSTRUCT ¸ II CLASICE 121
Intrare (Expresie aritmetica )
Iesire (Sir polonez )
Varful stivei
Stiva
Figura 5.9: Structura dispozitivului (3) Citirea unei paranteze ˆınchise provoac˘ a extragerea operatorilor din stiv˘a pˆan˘a la prima parantez˘ a deschis˘ a; aceasta este extras˘a ¸si ea din stiv˘ a (dar paranteza extras˘ a nu trece ˆın ¸sirul polonez) iar ˆın continuare cele dou˘ a paranteze sunt ignorate. (4) ˆIn finalul procesului, deci dup˘ a ce ultimul operand a fost trecut ˆın ¸sirul polonez, se extrag tot¸i operatorii din stiv˘ a ¸si se scriu ˆın ¸sirul polonez. Exemplu . Pentru expresia a * b + (c - d * e) * f, stare dinamic˘ a a stivei de operatori este prezentat˘ a ˆın figura 5.10.
5.3 5.3.1
Generarea formatului intermediar pentru instruct ¸ii clasice Instruct ¸iunea de atribuire
to fill
5.3.2
Instructiunea If
to fill
5.3.3 to fill
Variabile indexate
CAPITOLUL 5. SINTEZA PROGRAMELOR
122
ab*cde *-f*+
a*b+( c-d*e)*f
2 * 4 3 2
* -
1
+
1
*
(
Figura 5.10: Starea dinamic˘ a a stivei
Capitolul 6 Masina Turing 6.1
Limbaje de tipul zero
Limbajele de tipul 0 sunt generate de gramatici Chomsky f˘ar˘ a restrict¸ii asupra regulilor de derivare. Se poate ar˘ a ta c˘ a orice gramatic˘ a de tipul zero accept˘a urm˘atoarea form˘ a normal˘a S → SA, B → C |i|λ, DE → F H, unde A, C, F,H = S . Se observ˘ a c˘a singura deosebire fat¸a˘ de gramaticile dependente de context este aceea c˘ a putem avea ¸si λ–reguli. Demonstrat¸ia existent¸ei formei normale se face prin transform˘ ari succesive ale ˆ regulilor. In prealabil gramatica se completeaz˘a cu neterminale noi astfel ˆıncˆ at orice regul˘ a u → v care nu este de ¸stergere s˘ a respecte condit¸ia de monotonie, adic˘a | u| ≤ |v |. Acest lucru se poate realiza dup˘ a cum urmeaz˘ a . Fie X 1 . . . Xn → Y 1 . . . Ym , n > m, o regul˘ a care nu respect˘a condit¸ia de monotonie. Vom pune X 1 . . . Xn → Y 1 . . . Ym Z m+1 . . . Zn , Z m+1 → λ, . . . , Z n → λ. Este clar c˘ a orice derivare direct˘ a u⇒v ˆın gramatica init¸ial˘ a se poate obt¸ine ¸si ˆın gramatica modificat˘ a ¸si reciproc (neterminalele Z nu pot ap˘ area ˆın stˆanga altor relat¸ii). ˆIn acest fel, gramatica se va transforma astfel ˆıncˆ at s˘a cont¸in˘a dou˘a categorii de reguli: reguli care respect˘ a condit¸ia de monotonie ¸si λ–reguli. ˆIn continuare reducem lungimea p˘ art¸ii drepte a regulilor folosind urm˘ atoarea transformare. Fie u → v ∈ P, |v | > 2; atunci v = Y 1 Y 2Y 3 v . 1. dac˘ a u = X 1 atunci regula se ˆınlocuie¸ste cu X 1 → Z 1 Z 2 , Z 1 → Y 1 , Z 2 → Y 2 Y 3 v . 123
CAPITOLUL 6. MASINA TURING
124
2. dac˘a u = X 1 X 2 u atunci regula se ˆınlocuie¸ste cu X 1X 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 c˘ a noile lungimea p˘art¸ii drepte a regulilor se reduce cu o unitate pentru cazul ˆın care exist˘ a minim 3 simboluriˆın dreapta. repetˆ and procedura se poate obt¸ine o gramatic˘ a echivalent˘ a ˆın care regulile au una din formele: 1. B → C |i|λ, 2. DE → F H , 3. X → Y Z . Regulile (1) ¸si (2) satisfac condit¸iile de la forma normal˘ a, iar cele de forma (3) presupunem c˘ a nu satisfac aceste condit¸ii, deci c˘a X = S sau Y = S . ˆIn general, putem avea mai multe astfel de reguli; pentru simplificare presupunem c˘ a exist˘a dou˘a reguli de forma (3): (3 ); X 1 → Y 1 Z 1 , X 2 → Y 2 Z 2. ¯1 , X ¯2 }, V T , S , P ), unde P Construim o gramatic˘a echivalent˘ a G = (V N ∪ {S , X cont¸ine toate regulile care convin (de formele (1) ¸si (2)) precum ¸si S → S, ¯1 |S X ¯2 , S → S X ¯1 → Y 1 Z 1 , X 2 X ¯2 → Y 2 Z 2. X 1 X De asemenea vom include ˆın P urm˘atoarel reguli de comutare (relativ la sim¯1 , X ¯2 ): bolurile nou introduse X ¯1 → AX ¯2 → AX
¯1 A, X ¯2 A, , ∀A ∈ V N . X
Se vede c˘ a G este o gramatic˘ a ˆın form˘ a normal˘ a. Este trivial s˘ a ar˘ at˘a m c˘a L(G) = L(G ). ∗ Fie p ∈ L(G), deci S ⇒ p. Presupunem c˘a ˆın aceast˘ a derivare exist˘ a o G
∗
singur˘a secvent¸a˘ u⇒v ˆın care se aplic˘a reguli de forma (3 ), adic˘a ∗
∗
∗
G : S ⇒u⇒v ⇒ p.
6.1. LIMBAJE DE TIPUL ZERO
125
∗
Presupunem c˘ a secvent¸a u⇒v are forma ∗
u = u 1 X 1 u2 X 2u3 X 2 u4 ⇒u1 Y 1 Z 1 u2 Y 2 Z 2 u2 Y 2 Z 3 u4 = v, unde u1 , u2 , u3 , u4 ∈ V N ∗ . ˆIn G putem scrie ¯2 ⇒S X ¯2 X ¯2 ⇒S X ¯1X ¯2 X ¯2⇒S X ¯1X ¯2 X ¯2 S ⇒S X ∗ ∗ ¯1 X ¯2 X ¯2 = u 1 X 1 u2 X 2 u3 X 2 u4X ¯1 X ¯2X ¯2 ⇒ ¯1 u2X 2 X ¯2 u3 X 2 X ¯2 u4 u1 X 1X ⇒uX ∗ ∗ ⇒u1Y 1 Z 1u2 Y 2 Z 2 u3 Y 2Z 2 u4 = v ⇒ p ∗
Prin urmare, S ⇒ p ¸si p ∈ L(G ). G
∗
∗
G
G
Invers, fie p ∈ L(G ), deci S ⇒ p. Dac˘a ˆın derivarea S ⇒ p apar sim¯1 , X ¯2 ele nu pot ap˘area dacˆat ˆın urma aplic˘arii regulilor S → S X ¯1 bolurile X ¯2 , deci la ˆınceputul deriv˘ ¸si S → S X arii, apoi singura posibilitate de continuare este S → S ; de asemenea, aceste simboluri nu pot fi eliminate decˆ at cu regulile ¯1 → Y 1 Z 1 ¸si X 2 X ¯2 → Y 2 Z 2 , etc. Astfel derivarea noastr˘ X 1 X a trebuie s˘ a aib˘a ∗ forma descris˘ a mai sus, de unde rezult˘ a S ⇒ p, p ∈ L(G). G
Relativ la puterea generativ˘ a a gramaticilor de tipul zero se poate ar˘ ata c˘ a a. L1 ⊂ L0 (strict). Demonstrat¸ia se face pe o cale indirect˘ Ment¸ion˘ am ¸si urm˘atoarea ”teorem˘ a a spat¸iului de lucru”. Fie G o gramatic˘ a de tipul zero. Pentru o derivare D : S = u 0⇒u1⇒ . . . ⇒un = p ∈ V T ∗ definim W S D ( p) = max|ui | i = 1, . . . , n ¸si W S ( p) = min{W S D ( p)}. D Observat ¸ie . W S este prescurtare de la working space . Spunem c˘a o gramatic˘a de tipul zero G are spat¸iul de lucru m˘arginit dac˘ a exist˘a k ∈ N astfel ˆıncˆat pentru ∀ p ∈ L(G) s˘a avem W S ( p) ≤ k | p|. S˘a observ˘ am c˘a orice gramatic˘ a care nu are reguli de ¸stergere (except ¸ie S → λ ¸si atunci S nu apare ˆın dreapta) satisface aceast˘ a condit¸ie cu k = 1.
Teorema 6.1 (teorema spat ¸iului de lucru) dac˘ a o gramatic˘ a G are spat ¸iul de lucru m˘arginit, atunci L(G) ∈ L1.
CAPITOLUL 6. MASINA TURING
126
p=i 1 i 2 i 3 i 4 i 5, n=4 i1
i2
i3
i4
i5
Banda de intrare /iesire
Dispozitiv de citire /scriere
s
Dispozitiv de comanda
Figura 6.1: Reprezentarea schematic˘ a a ma¸sinii Turing
6.2
Ma¸sina Turing
Conceptul de ma¸sin˘ a Turing . Ma¸sina Turing este un mecanism de recunoa¸stere a limbajelor de tipul zero. ˆIn felul acesta, familiilor de limbaje din clasificarea Chomsky le corespund automate specifice de recunoa¸stere. Familia L 3 - automate finite, Familia L 2 - automate push–down, Familia L 1 - automate liniar m˘ arginite, Familia L 0 - ma¸sina Turing. O ma¸sin˘a Turing (prescurtat MT) se compune dintr–un dispozitiv de comand˘ a care posed˘ a un dispozitiv de scriere–citire ¸si o band˘ a de intrare. Banda de intrare se consider˘ a m˘arginit˘a la stˆanga ¸si nem˘ arginit˘a la dreapta; ea cont¸ine simboluri ale unui alfabet de intrare, ˆıncepˆ and din prima pozit¸ie. Alfabetul are un simbol special numit blanc ¸si notat (sau spat¸iu), care se consider˘ a ˆınregistrat ˆın toat˘a partea neocupat˘ a a benzii. Indicele simbolului din dreptul dispozitivului de scriere–citire ˆıl not˘am cu n ¸si el va constitui un element al st˘ arii ma¸sinii Turing. Dispozitivul de comand˘a se afl˘ a ˆıntr-o anumit˘a stare intern˘ a, element al unei mult¸imi finite de st˘ari. Schema unei ma¸sini Turing este dat˘ a ˆın figura 6.1. O ma¸sin˘ a Turing funct¸ioneaz˘ a ˆın pa¸si discret¸i. Un pas de funct¸ionare const˘ a din: Dispozitivul de comand˘ a cite¸ste simbolul aflat ˆın dreptul dispozitivului de scriere–citire; ˆın funct¸ie de simbolul citit, ma¸sina Turing trece ˆıntr-o nou˘ a stare intern˘ a , scrie pe band˘ a un nou simbol (ˆıntotdeauna diferit de blanc) ˆın locul simbolului citit ¸si mut˘a banda cu o pozit¸ie (spre stˆ anga sau dreapta) sau o las˘ a
6.2. MAS¸INA TURING
127
pe loc. Convent¸ional, vom nota cu +1 o mi¸scare spre stˆ anga, cu − 1 spre dreapta ¸si cu 0 pe loc. Din punct de vedere matematic, o ma¸sin˘ a Turing este un sistem M T = (Σ, I , f , s0 , Σf ) unde: Σ este mult¸imea de st˘ ari; I este alfabetul de intrare; f : (Σ × I ) −→ Σ × (I − {}) × {1, 0, −1}, (Σ × I ) ⊆ Σ × I , este funct¸ia de evolut¸ie; s0 ∈ Σ este simbolul de start; Σf ⊆ Σ este mult¸imea de st˘ ari finale. Observat ¸ie . Funct¸ia f nu este definit˘ a pe ˆıntregul produs Σ × I ; dac˘a ma¸sina ajunge ˆıntr-o stare s iar ˆın dreptul dispozitivului de scriere–citire se afl˘ a simbolul i ¸si (s, i) a. Exist˘a ¸si alte cazuri de blocare, ∈ (Σ × I ) spunem c˘a ma¸sina se blocheaz˘ de exemplu situat¸iaˆın care dispozitivul de scriere–citire se afl˘ a ˆın dreptul primului simbol, iar pasul de funct¸ionare prevede o mi¸scare a benzii spre dreapta. O stare (sau configurat¸ie) a unei ma¸sini Turing este un triplet de forma σ = (s,p,n) unde s este starea intern˘ a, p este cuvˆ antul scris pe band˘ a iar n este indicele simbolului din dreptul dispozitivului de scriere–citire. Vom spune c˘ a starea σ1 = (s1, p1 , n1 ) evolueaz˘ a direct ˆın starea σ2 = (s2 , p1 , n2 ) ¸si vom scrie σ1 −→σ2 dac˘ a se efectueaz˘ a un pas de evolut¸ie. ˆIn termenii funct¸iei de evolut¸ie, avem (1)f (s1, in ) = (s2 , i, +1), p2 = i 1 . . . in −1 iin +1 . . . im , n2 = n 1 + 1; (2)f (s1, in ) = (s2 , i, −1), p2 = i 1 . . . in −1iin +1 . . . im , n2 = n 1 − 1; (3)f (s1, in ) = (s2 , i, 0), p2 = i 1 . . . in −1 iin +1 . . . im , n2 = n 1 ; (4)f (s1, ) = (s2 , i, +1), p2 = p 1i, n2 = n 1 + 1; (5)f (s1, ) = (s2 , i, −1), p2 = p 1 i, n2 = n 1 − 1; (6)f (s1, ) = (s2 , i, 0), p2 = p 1i, n2 = n 1 ; ∗ Vom spune c˘a σ evolueaz˘ a (f˘ar˘a specificat¸ia direct) ˆın σ ¸si vom nota σ −→σ dac˘ a σ = σ sau dac˘ a exist˘a σ1, . . . , σn astfel ˆıncˆ at 1
1
1
1
1
1
1
1
1
σ = σ 1 −→σ2 −→ . . . −→σn = σ . Limbajul recunoscut de o ma¸sin˘ a Turing este prin definit¸ie ∗
L(MT ) = { p| p ∈ I ∗ , (s0 , p, 1)−→(s,q,), s ∈ Σ f }. Observat ¸ie . Este posibil ca ma¸sina s˘ a ajung˘ a ˆıntr-o stare final˘ a ˆınainte de citirea integral˘ a a lui p; analiza st˘arii finale trebuie f˘acut˘a numai dup˘a parcurgerea cuvˆantului. Exemplu . Consider˘am ma¸sina turing M T = (Σ, I , f , s0 , Σf ) unde Σ = { s0 , s1 , s2 }, I = {0, 1}, Σf = {s1 } iar funct¸ia de evolut¸ie este dat˘ a de
CAPITOLUL 6. MASINA TURING
128
f s0 (s2, 1, 1) 0 (s1, 0, 1) 1 (s0, 1, 1)
s1
s2 (s0, 0, −1)
(s0 , 0, 1)
Evolut¸ia ma¸sinii pentru p = 001 este (s0 , 011, 1)−→(s1, 011, 2)−→(s0 , 001, 3)−→(s0 , 001, 4)−→ (s2 , 0011, 5)−→(s0 , 0011, 4)−→(s0 , 00110, 5)−→(s1 , 00110, 6) Se poate observa c˘ a dup˘ a citirea ˆıntregului cuvˆant ma¸sina poate s˘ a efectueze un num˘ar de pa¸si suplimentari pˆ an˘a la ajungerea ˆıntr-o stare final˘ a, deci este posibil ca | p| < | q |. Situat¸ii ˆın care o ma¸sin˘ a Turing se blocheaz˘ a (ˆın aceste situat¸ii cuvˆantul scris pe band˘a nu este recunoscut): 1. MT ajunge ˆıntr-o stare s, ˆın dreptul dispozitivului de citire–scriere se afl˘ a simbolul i ¸si (s, i) ∈ (Σ × I ) ; 2. MT este ˆın starea s, a citit simbolul din prima pozit¸ie i ¸si f (s, i) = (s , i , −1); 3. MT efectueaz˘ a un ciclu infinit ˆın interiorul cuvˆ antului.
Definit¸ie 6.1 Vom spune c˘ a o ma¸sin˘ a Turing este nestat ¸ionar˘ a dac˘ a f : (Σ × I ) → Σ × (I \ {}) × {−1, +1}. Prin urmare, o ma¸sin˘ a Turing nestat¸ionar˘ a nu las˘a ˆın nici o situat¸ie banda pe loc.
Lema 6.1 Orice ma¸sin˘ a Turing este echivalent˘ a cu o ma¸sin˘ a Turing nestat ¸ionar˘ a. Demonstrat ¸ie . Pornind de la o M T dat˘ a construim o M T nestat¸ionar˘ a astfel: Dac˘a f (s, i) = (s , i , ±1) vom pune f (s, i) = f (s, i); Dac˘a 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 introdus˘a. Astfel, ˆın cazul unei r˘ amˆaneri pe loc a lui MT, noua ma¸sin˘ a va face un pas spre stˆ anga ¸si unul spre dreapta, f˘ ar˘a s˘a modifice nici starea ¸si nici cont¸inutul benzii. Evident, cele dou˘ a ma¸sini sunt echivalente. Limbajele recunoscute de ma¸sini Turing . a Turing dac˘ a ¸si numai dac˘ a Teorema 6.2 Un limbaj este recunoscut de o ma¸sin˘ este de tipul zero.
6.2. MAS¸INA TURING
129
Demonstrat ¸ie . Partea I. E = L(MT ) ⇒ E ∈ L 0 . Fie MT = (Σ, I , f , s0 , Σf ) o ma¸sin˘a Turing astfel ˆıncˆat E = L(MT ). Putem presupune c˘ a MT este nestat¸ionar˘ a . Fie I λ = (I \ {}) ∪ {λ}. Construim o gramatic˘ a 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 \ {}. Definit¸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 → λ, dac˘ a f (s, i) = (s , i , 1) atunci s(i1 , i) → (i1 , i )s , ∀i1 ∈ I λ , dac˘ a f (s, i) = (s , i , −1) atunci (i1 , i2 )s(i3 , i) → s (i1 , i2 )(i3 , i ), i1, i3 ∈ I λ , i2 ∈ I , dac˘ a s ∈ Σ f , atunci s(i1 , i2 ) → si 1s ¸si (i1 , i2 )s → si 1 s. Fie p ∈ L(M T ), p = i1 . . . in . Presupunem c˘ a MT utilizeaz˘ a ˆın recunoa¸stere ˆ a situate la dreapta cuvˆ antului p. In G avem m pozit¸ii de pe band˘ ∗
∗
S ⇒s0 X 1 ⇒s0 (i1 , i1 ) . . . (in , in )X 2 ⇒s0 (i1 , i1 ) . . . (in , in )(λ, )m . Cuvˆantul p fiind recunoscut de MT avem ∗
(1) (s0, i1 . . . in , 1)−→(sf , i1 . . . ih , k), h ≥ n. Vom ar˘ata c˘ a (1) implic˘a existent¸a unei deriv˘ari de forma ∗
2)s0 (i1 , i1 ) . . . (in , in )(λ, )m ⇒(i1 , i1 ) . . . (ik−1, ik−1 )sf (ik , ik ) . . . (in+m , in+m ), unde
i1 , . . . , in ∈ I \ {}, in+1, . . . , in+m = λ, i1 , . . . , ih ∈ I \ {}, ih+1 , . . . , in+m = λ.
Demonstrat¸ie prin induct¸ie asupra lungimii l a evolut¸iei. Pentru l = 0 avem ∗
(s0 , i1 . . . in , 1)−→(s0 , i1 . . . in , 1), k = 1, h = n, i j = i j . Partea dreapt˘ a a lui 2) va avea forma s0 (i1 , i1 ) . . . (in , in )(λ, )m ¸si deci 2) este adev˘arat˘ a. Presupunem c˘ a implicat¸ia este adev˘ arat˘ a pentru l oarecare ¸si consider˘ am o evolut¸ie de lungime l + 1. Punem ˆın evident¸a˘ ultima evolut¸ie direct˘ a ∗
(s0 , i1 . . . in , 1)−→(s, i1 . . . ig , j)−→(sf , i1 . . . ih , k). ˆIn general h = g sau h = g + 1 ˆın conformitate cu urm˘ atoarele dou˘ a cazuri (figura 6.2).
CAPITOLUL 6. MASINA TURING
130
i"1
i"3
i"2
...
i"g
i"1
i"3
i"2
...
s
i"g s
h=g
h= g+1
Figura 6.2: Configurat¸ii posibile ale ma¸sinii Turing ˆIntotdeauna k = j ± 1. apoi it = i t , t = 1, . . . , g , t = j , adic˘a i1 , i2 , . . . , i j−1 , i j , i j+1 , . . . , ig ; i1 , i2 , . . . , i j −1 , i j , i j +1 , . . . , ig . ˆIn urma ultimei evolut¸ii directe vor diferi numai simbolurile i j , i j . Din ipoteza inductiv˘ a rezult˘ a ∗
s0 (i1 , i1 ) . . . (in , in )(λ, )m ⇒(i1 , i1 ) . . . (i j −1 , i j−1 )s(i j , i j ) . . . (in+m , in+m ). ˆIn conformitate cu definit¸ia evolut¸iei directe avem f (s, i j ) = (sf , i j , 1), k = j + 1, s(i j , i j ) → (i j , i j )sf ; f (s, i j ) = (sf , i j , −1), k = j − 1, (i j −1 , i j−1 )s(i j , i j ) → s f (i j , i j−1 )(i j , i j ). ˆIn ambele cazuri ∗
s0 (i1 , i1 ) . . . (in , in )(λ, )m ⇒(i1 , i1 ) . . . (ik−1 , ik−1 )sf (ik , ik ) . . . (in+m , in+m ). Acum, deoarece sf ∈ Σ f , putem scrie ∗
S ⇒s0 (i1 , i1) . . . (in , in )(λ, )m ∗ ⇒(i1 , i1 ) . . . (ik−1 , ik−1 )sf (ik , ik ) . . . (im+n , im+n ) ⇒(i1 , i1 ) . . . (ik−1 , ik−1 )sf ik sf (ik+1, ik+1 ) . . . (im+n , im+n ) ⇒(i1 , i1 ) . . . (ik−2 , ik−2 )sf ik−1 sf ik sf ik+1 sf (ik+2 , ik+2 ) . . . (im+n , im+n ) ∗ ∗ ⇒sf i1sf i2 sf . . . sf in sf ⇒i1 . . . in = p. Prin urmare p ∈ L(G) ¸si L(MT ) ⊆ L(G). Analog se arat˘a ¸si incluziunea invers˘ a ¸si deci L(MT ) = L(G).
Bibliografie
1. Octavian C. Dogaru, Bazele informaticii. Limbaje formale , Tipografia Universit˘ a¸tii din Timi¸soara, 1989.