Sunteți pe pagina 1din 48

IRINA ATHANASIU DIANA RAICIU RADU SION IRINA MOCANII

Universitatea "Politehnica" din Bucureti Catedra de Calculatoare

LIMBAJE FORMALE
i

AUTOMATE
(ndrumar pentru aplicaii)

C P . 16 - 162 77500 - BUCURETI tel. 01.4113617, fax 01.4114280 e-mail: matrix@fx.ro

MATRIX ROM

Despre autori, Acest ndrumar are muli autori cu o contribuie secvenial. A nceput cu nite foi scrise de mn care conineau probleme i schie de rezolvri, a mai existat i un text introductiv n lex n format electronic. n 1992 Diana Raiciu (n prezent Diana Mrculescu, profesor n Department of Electrical and Computer Engineering din Universitatea Carnegie Mellon, SUA) a realizat prima form electronic a acestui ndrumar. Urmtorul autor (1999) a fost Radu Sion (n prezent doctorand n departamentul de calculatoare din Universitatea Purdue, SUA). A urmat n 2001 doamna asistenta Irina Mocanu. Fiecare dintre autori a corectat textul anterior i a mai adugat probleme noi. Cu fiecare nou autor textul prea c devine gata. Am hotrt s public textul n formatul curent care desigur este nc departe de ce putea s fie, pentru c se aniverseaz anul acesta 10 ani de cnd credeam c ndrumarul va fi foarte curnd gata de publicare.

Descrierea CIP a Bibliotecii Naionale a Romniei Limbaje formale i automate. ndrumar pentru aplicaii/ Irina Athanasiu, Diana Raiciu, Radu Sion, Irina Mocanu, Bucureti, Matrix Rom, 2002 98 pagini, 25 cm Bibliogr. ISBN 973-685-407-8 Athanasiu, Irina Raiciu, Diana Sion, Radu Mocanu, Irina

Martie 2002

Irina Athanasiu

IV. 004.43

ISBN 973 - 685 - 407 - 8

Elemente de teoria limbajelor formale 1.1 Gramatici 1.1.1 Ierarhia Chomsky Probleme 1.1.2 Lema de pompare Probleme 1.1.3 Transformri asupra GIC 1.1.3.1 Eliminare recursivitate stnga 1.1.3.2 Eliminare X producii 1.1.3.3 Eliminare simboli neutilizai 1.1.3.4 Eliminare simboli inaccesibili Probleme 1 2 Mulimi regulate. Expresii regulate Probleme

2 2 3 4 16 17 18 18 18 19 20 20 23 24 27

1.3 Acceptoare 1.3.1 Automate finite Probleme 1.3.2 Automate cu stiv (push-down) Probleme 1.3.3 Maina Turing Probleme 2 Lex - generator de analizoare lexicale 2.1 Expresii regulate. Structura unei specificaii lex. 2.2 Elemente avansate 2.2.1 Funcionarea analizorului lexical generat de lex 2.2.2 Stri de start 2.2.3 Macrodefiniii, funcii i variabile predefmite 2.2.4 Fiiere de intrare multiple 2.3 3 4 Exemple comentate Teme pentru acas Bibliografie

27
28 44 45 52 54 66 70 71 72

65

73

.73 74 87 91

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

1.1.1 Ierarhia Chomsky

1 Elemente de teoria limbajelor formale


Definiia 1.1. Se numete alfabet orice mulime finit T de simboli. Definiia 1.2. Se numete limbaj peste un alfabet T orice submulime a mulimii T*. Gramaticile pot s fie clasificate conform complexitii produciilor n urmtoarea ierarhie: gramatici de tip 0 (fr restricii) - au produciile de forma: a - P cu a e (N u T)* N (N u T)* , P e (N u T)* gramatici de tip 1 (dependente de context - GDC) - au produciile de forma: a A P - > a y p , a, P e ( N u T)*, A e N, y e (N U T)+ sau de forma S -> k. n al doilea caz S nu apare n membrul drept al nici unei producii. gramatici de tip 2 (independente de context - GIC) au produciile de forma: A - ^ a , A s N , a e ( N U T)*. gramatici de tip 3 (regulate la dreapta - GR) - au produciile de forma: A - H > o c B c u A e N , B e ( N u {A,}) i a e T*. Corespunztor mulimii gramaticilor G[k], k = 0,1, 2, 3 exist mulimea L[k] care reprezint mulimea limbajelor ce pot fi generate de o gramatic din G[k]. L[0] este mulimea limbajelor generale care pot fi generate de o gramatic de tip 0 (fr restricii), L[l] este mulimea limbajelor dependente de context (generate de o GDC), L[2] mulimea limbajelor independente de context (generate de o GIC), iar L[3] mulimea limbajelor regulate (generate de o GR). Se poate arta c are loc incluziunea: L[3]cL[2]cL[l]cL[0]. Termenul de "dependent de context" provine din faptul c producia ocAp > ayP, poate s fie interpretat ca - neterminalul A poate s fie nlocuit cu irul y doar n contextul dat de irurile a i p. Similar termenul "independent de context" provine din faptul c o producie de forma A a se poate interpreta ca - neterminalul A poate s fie nlocuit cu irul a indiferent de > context (indiferent de simbolii ntre care apare). Se observ c ntr-o gramatic independent de context prin aplicarea unei producii de form A a asupra unei forme propoziionale, lungimea acesteia poate s devin mai mic (dac a este irul vid), egal (dac a este un terminal sau neterminal) sau mai mare (dac a este un ir de lungime mai mare dect 1). Acest lucru nu este valabil pentru gramaticile dependente de context unde lungimea unei forme propoziionale n urma aplicrii unei producii de forma a A P - > a y P , a , P ( N u T)*, A e N, y e (N U T)+ devine mai mare (dac y este un ir de lungime mai mare dect 1), cel mult egal (dac y este un ir format dintr-un neterminal sau un terminal). Prin urmare, nu este evident c orice gramatic independent de context este i dependent de context. Se poate demonstra c pentru orice gramatic independent de context exist o alt gramatic independent de context echivalent obinut prin transformri, astfel nct modul de cretere a lungimii formelor propoziionale s fie similar cu cea a gramaticilor dependente de context. Intuitiv, o caracterizare a gramaticilor de mai sus poate fi fcut din punctul de vedere al "numrrii" simbolilor. Astfel, gramaticile regulate pot "numra" pn la o limita finit. De exemplu, limbajul specificat prin L = { 0 T | 0 < i < 5 } poate fi generat de o gramatic regulata 3

1.1 Gramatici
Definiia 1.1.1. O gramatic este un cvadruplu G = (N, T, P, S) unde: N este o mulime finit de simboli numii simboli neterminali T este o mulime finit de simboli numii terminale ( N n T = 0) P este o submulime a mulimii (N u T)* N ( N u T)* x ( N u T)* i reprezint mulimea produciilor gramaticii G. Un element p e P , p = (a,P) se reprezint sub forma: oc -> p S e N se numete simbolul de start al gramaticii Definiia 1.1.2. Se numete form propoziional n gramatica G orice ir din (N u T)* obinut prin aplicarea recursiv a urmtoarelor reguli: 1. S este o form propoziional; 2. Dac ocpy este o form propoziional i exist o producie p -> 8 atunci i a5y este o form propoziional. Definiia 1.1.3. Se numete propoziie generat de gramatica G o form propoziional n G care conine numai terminale. Definiia 1.1.4. Se spune c ntre dou forme propoziionale a i p n gramatica G exist relaia de derivare notat cu a =>p dac exist dou iruri wl, w2 i o producie y > 8 astfel nct a = wlyw2 i P = wl8w2. Se spune c ntre formele propoziionale a i P exist relaia de derivare notat a =>k P dac exist formele propoziionale 80, Si, 82,..., k astfel nct a = 80 => 81 =>... =>8k = p. nchiderea tranzitiv a relaiei de derivare se noteaz cu =>"* Definiia 1.1.5. Fie G o gramatic. Se numete limbaj generat de gramatic G i se noteaz L(G) mulimea propoziiilor generate de G. Altfel spus: L(G)={weT*|S=>" w w} Definiia 1.1.6. Dou gramatici Gl, G2 se numesc echivalente dac genereaz acelai limbaj adic L(G1) = L(G2).

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

G astfel: S-> 0000011111 | 00001111 | 000111 | 0011 | 01 | X De asemenea, o gramatic independent de context poate pstra un singur contor (limita nu este cunoscut sau fixat). De exemplu, limbajul L = { 0T j n > 0 } poate s fie generat de gramatic independent de context G = ({ S }, {0, 1}, P, S) unde P = { S - OS 1 | X }.

problem l.-3 L={anbncmdmjn>l im>l } Soluie: Observm c pentru orice ir w din L exist dou subiruri independente wl = anbn respectiv w2 = cradm care pot fi generate separat. Vom utiliza dou neterminale A,B pentru generarea : celor dou subiruri independente wl i w2. Primul subir ncepe ntotdeauna cu a i se termin cu b, adic wl = anbn se poate scrie sub forma wl = a v b cu v un ir care este de : aceeai form cu wl, i va fi generat n acelai mod, sau este irul vid. n mod analog, subirul w2 = cmdm poate fi generat astfel: w2 ncepe n mod sigur cu simbolul c i se ; termin cu simbolul d. Prin urmare, w2 se poate scrie w2 = c v d, unde v este de aceeai form cu w2 sau este irul vid. Astfel, mulimea produciilor va conine producii de forma: ; A - aAb | ab i B -> cBd | cd. Pentru concatenarea celor dou subiruri, vom introduce producia S - AB. Prin urmare o gramatic care genereaz limbajul L este: G = ({ S, A, B }, i { a, b, c, d }, P, S) unde: P = { S->AB, A-aAb | ab, B ->cBd | cd }. Verificare; Pentru irurile a b c c d d (n = 1 i m = 2), respectiv a a b b c d (n = 2 i m = 1) se obin urmtoarele secvene de derivri: S=> A B=> a b B=> a b c B d=> a b c c d d respectiv S=> A B=> a A b B=> a a b b B=> a a b b c d. Comentarii: Gramatica G este independent de context

Probleme
S se construiasc gramaticile care genereaz urmtoarele limbaje: proHeiTu 1.1-1 : L={anbnjn>0} Soluie: i Orice ir nevid w e L ncepe cu simbolul a i se termin cu simbolul b, astfel nct poate s ! fie scris sub forma w = a x b unde x este un ir de terminale care fie este vid, fie este de ; aceeai form cu irul w. Prin urmare o gramatic G care genereaz limbajul L poate s fie: : G = ({ S }, { a, b }, P, S) unde: P = { S- a S b | X }. Verificare: \ Pentru irul vid (X) secvena de derivri este S => L Pentru irul aaabbb secvena de derivri este S ; = > a S b = > a a S b b = > a a a S b b b = > a a a b b b Comentarii: Gramatica G este independent de context. Se poate arta c n acest caz nu se poate construi o gramatic regulat care s genereze acelai limbaj, adic s fie echivalent cu prima.

* problema-4,1^-

' "_

^>l\:-\'-f"f%V--/./T':T.''ij"-j~V.""''"''*'i"--"---"t^".<v'> ST.'

L = { a n b n c m d m | n > 0 i m > 0 } L = { anbn i n > 0 }

Soluie: Orice ir nevid w e L ncepe cu simbolul a i se termin cu simbolul b, astfel nct poate s fie scris sub forma w = a x b unde x este un ir de terminale care fie este irul ab (n > 0, nu se accept irul vid), fie este de aceeai form cu irul w. Prin urmare o gramatic G care genereaz limbajul L poate s fie: G = ({ S }, { a, b}, P, S) unde: P = { S-> a S b | ab }.

Pentru irul aaabbb secvena de derivri este S = > a S b = a a S b b = > a a a b b b


Comentarii: . . . . Gramatica G este independent de context . . . . -

Verificatei

Soluie: Observm c pentru orice ir w din L exist dou subiruri independente wl = anbn respectiv m m care pot fi generate separat. Vom utiliza dou neterminale A,B pentru generarea , : w2 = c d ; celor dou subiruri independente wl i w2. Primul subir ncepe ntotdeauna cu a i se ; termin cu b, deci wl = anbn se poate scrie sub forma wl = a v b cu v un ir care este de ; aceeai form cu wl, i va fi generat n acelai mod; deoarece n > 0 wl poate fi i irul vid. m m poate fi generat astfel: w2 ncepe n mod sigur cu : In mod analog, subirul w2 = c d simbolul c i se termin cu simbolul d. Prin urmare, w2 se poate scrie w2 = c v d, unde v este : de aceeai form cu w2; deoarece m > 0 w2 poate fi i irul vid. Astfel, mulimea > produciilor va conine producii de forma: A -> aAb | X i B - cBd | X. Pentru concatenarea celor dou subiruri, vom introduce producia S - AB. Prin urmare o gramatic care ; genereaz limbajul L este: G = ({ S, A, B }, { a, b, c, d }, P, S) unde: P = { S->AB, A->aAb | AB

Pentru irurile a b (n = 1 i m = 0), respectiv c d (n = 0 i m = 1) se obin urmtoarele secvene de derivri: S=> A B=> a A b B=> a b B => ab i S=> A B=> B=> c B d => cd.

Verificare:

limbaje formale si translatoare

.. . .

Seminar LFA

limbaje formale si translatoare

Seminar LFA

problema 1.1-5 L = { a b c d | n > 1 i m y 1 } Soluie: Orice ir w din L ncepe cu simbolul a, i se termin cu simbolul d. w se poate scrie ca w = a u d unde u este un ir care fie este de tipul celui din mulimea L, fie este de forma b m c m , m > 1. Acesta din urm se poate scrie sub forma b v c cu v de aceeai form sau v este irul vid. Astfel, innd seama de observaiile anterioare, o gramatic ce genereaz limbajul L este: G = ({ S, A-}, { a, b, c, d }, P, S) unde P = { S - * a S d | a A d , A - > - b A c | b c } . Verificare:
Pentru irul a a b c d d ( n = 2 i m = l ) s e obine urmtoarea secven de derivri: d=> a a A d d=> a a b c d d.
n m m n

aS

Soluie: Presupunem c parcurgem un ir din limbajul L ncepnd cu simbolul cel mai din stnga. Se observ c pot s existe mai multe situaii n ceea ce privete simbolul curent: 1 Simbolul curent este 1 i cel anterior a fost tot 1. Atta timp ct simbolul curent este 1 nu suntem la un nceput al unui sub ir de forma 011. 2. Simbolul analizat este 0 adic suntem la nceputul unei posibile secvene 011 care trebuie rejectat. Atta timp ct simbolul curent este 0 este aceai situaie. Dac simbolul curent este 1 se trece n situaia urmtoare (3). 3. Simbolul curent este 1 i cel precedent a fost 0, adic suntem n interiorul unei posibile secvene 011 care trebuie rejectat. De aici, singurul simbol posibil este 0 (1 ar genera secvena 011), care ar putea s nceap o nou posibila secven 011. Ca urmare, pentru un simbol 1 suntem n situaia 2. Vom codifica cele trei situaii posibile prin neterminalele S, A, B. Corespunztor celor de mai sus o gramatic G care genereaz limbajul L este: G = ({ S, A, B }, { 0,1 }, P, S), P = { S -> S | 0A | X, A - 0A 11B | X, B - 0A | X }. Verificare: Pentru irurile: 10 1, respectiv 0 10 1, secvenele de derivri sunt: S=> 1 S=> 1 0 A=> 10 1 B=> 1 0 1 i S=> 0 A=> 0 1 B=> 0 1 0 A=> 0 1 0 1 B=> 0 1 0 1. Comentarii: Gramatic G este regulat, iar limbajul L este de un limbaj regulat.
pichk-iis.i I.l-K

Comentarii: Se observ c neterminalul A este utilizat pentru a genera subiruri de forma b m c m . Gramatica G este independent de context. problema 1.1-6 L = {w e { 0,1 }* | w conine un numr egal de 0 i 1 } Soluie: Fie w un ir oarecare astfel nct w e { 0, 1 }* i #0(w) = #,(w) unde prin #a(w) am notat numrul de apariii ale simbolului a n irul w. Dac w ncepe cu simbolul 0, atunci exist u i v, u,v e { 0, 1 }* cu u i v avnd fiecare un numr egal de 0 i 1 (eventual zero) astfel nct irul w se poate scrie w = 0 u 1 v, cu u, v e { 0,1 }* cu numr egal de 0 i 1 astfel nct w = 0 u 1 v. Producia care genereaz acest tip de iruri este: S -> 0 S 1 S. De asemenea, dac w e L ncepe cu 1, se arat n mod analog c w se poate scrie w = l u 0 v c u u , v iruri cu numr egal de 0 i 1. Pe baza celor de mai sus, rezult c o gramatic care genereaz limbajul L este G = ({ S }, { 0, 1 }, P, S) unde: P = { S - > O S 1 S | 1 S O S | A . } . Verificare: Pentru irul 0 1 0 1 1 0, se obine urmtoarea secven de derivri: S => 0 S 1 S l S = > 0 1 0 S l S = ^ 0 1 0 1 S = ^ 0 1 0 1 1 S O S = > b l 0 1 1 0 S = * 0 1 0 110. Comentarii: Gramatica G este o gramatic de independent de context. problema 1.1.-7 _ ! ..

L = { w 6 { 0 , l } * |w| divizibil cu 3 } Soluie: Vom presupune c parcurgem irul w de la stnga la dreapta considernd un prefix al acestuia: w = u a v unde u este prefixul, a este simbolul curent (0 sau 1), iar v este restul irului (u, v e { 0,1 }*). Sunt posibile urmtoarele situaii: 1. Numrul de simboli din prefixul u este de forma 3 *n, n e N 2. Numrul de simboli din prefixul u este de forma 3*n + 1 3. Numrul de simboli din prefixul u este de forma 3*n+2 Asociem neterminalul S primei stri (care este de altfel cea corespunztoare generrii unui ir din limbajul L), iar celorlalte dou stri neterminalele A, respectiv B. Din prima stare se trece n a doua dup ce se "citete" simbolul curent (numrul de simboli citii devine 3*n+l), iar de aici, dup "citirea" unui nou simbol, se trece n starea 3 i apoi din nou n starea 1 dup "citirea" urmtorului simbol din ir, etc. Gramatica care genereaz limbajul L este: G = ({ S, A, B }, { 0,1 }, p, S) unde P = { S - 0A | IA | X , A -> 0B 11B, B -> OS | S }. Verificare: Pentru irul 010011, se obine secvena de derivri S=> 0A=> 01B=> 010S=> 0100A=> 01001B=> 010011S=> 010011. Comentarii: Alt gramatic regulat echivalent este Gl = ({ S }, { 0, 1 }, P, S) unde: P = { S - > 0 0 0 S | 0 0 1 S 10 1 0 S I 0 1 1 S I 1 0 0 S | 1 0 1 S 11 1 0 S 11 1 1 S | X }.

0 1 SOS

L = { w e { 0,1 }* | w nu conine subirul 011 }

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

l'rnliluii.i I l-'>

p i n l i l ' . l l l . l 1.1-l 1

L = { ambncpdq | m + n = p + q , m, n, p, q > 0 } Soluie: irurile din L pot fi de dou tipuri: cu i > j, respectiv i < j. Astfel, un ir w e L poate fi scris fie sub forma w = 0)0nlJ dac i > j i n = i - j, fie sub forma w = OTl' dac i < j i n = j - i. n ambele cazuri, n > 0. Pentru generarea primului ir, vom observa c acesta ncepe cu 0 i ; se termin cu 1 i poate fi scris sub forma w = 0 u 1 unde u este fie de aceeai form, fie de form 0", cu n > 0. n mod analog, cel de-al doilea ir ncepe cu 0 i se termin cu 1 i poate i fi scris sub form w = 0 u 1 unde u este fie un ir de aceeai form, fie de forma 1", cu n > 0. i innd cont de observaiile de mai sus, o gramatic ce genereaz limbajul L este G = ({ S, A, | B } , {0,1 } , P , S ) u n d e P = { S - 0 S l | 0 A | l B , A - > 0 A | A . , B - > IB | A.}. Verificare: Pentru irul 0 0 0 1 se obine urmtoarea secven de derivri: S => 0 S 1 = > 0 0 A 1=> 0 0 = 0Al=>0001. Comentarii: G este o gramatic independent de context. Problema 1.1-10 L = { xmyn | n < m sau 2*m < n, n, m > 1 } Soluie: Limbajul L conine dou tipuri de iruri: iruri de forma xmyn cu 2*m < n, respectiv cu n < m. , Primul tip de ir poate s fie scris sub forma xrayry2*m unde n = 2 * m + r, cu r > 0 i m > 1 : iar pentru generarea lui pot s fie utilizate produciile: Sj - > x A y y , A - > x A y y | y C i C n t i -> y C | A. Al doilea tip de ir poate s fie scris sub forma x x y" unde m = n + r c u r > 0 i n > 1. Pentru generarea acestui ir se pot utiliza produciile: S2 -> x B y, B -> x B y | x D, D ; -> x D | X. Prin urmare, o gramatic care genereaz limbajul L este: G = ({ S, Si, S2, A, B, C, \ D }, { x, y }, P, S) unde P = { S -> Si | S2, S, -> x A y y, A - x A y y | y C, S2 - x B y, B - > x B y [ x D , C -> y C | A, D -> x D | A }. Verificare: Pentru irul x x x y y (pentru care m = 3 i n = 2, adic m > n) se obine secvena de derivri: s= S * 2=> x B y=> x x B y y=> x x x D y y=> x x x y y. Fie irul x x y y y y y (pentru care m = 2 i n = 5 adic 2 * m< n). Pentru acest ir se obine secvena de derivri: S=> Si=> x A y y=> x x A y y y y=> x x y C y y y y = > x x y y y y y . Comentarii: G este o gramatic independent de context Soluie: Relaia din enun poate fi scris sub forma m - q = p - n. Pot apare dou cazuri: 1 m > q- Notm r = m - q = p - n , unde r > 0 i m = q + r & p = n + r. Fie LI limbajul generat n acest caz. Atunci LI poate fi descris prin: LI = { aqarbncncrdq | n,q > 0, r > 0 }.Orice ir de aceasta form, poate s fie scris ca w = a u d unde u este de aceeai form cu w sau de forma arbncncr i n acest caz poate fi scris sub forma: u = a v c unde v este fie de aceeai form cu u, fie este de forma bncn. n acest caz, v poate fi scris sub form v = b z c unde irul z este de aceeai form cu v, fie irul vid. Prin urmare, vor fi utilizate produciile: S -> aSd | A, A -> aAc | B, B - bBc | A 2. m <q. Notm r = q - m = n - p , unde r > 0 i prin urmare n = p + r & q = m + r. Fie L2 limbajul generat n acest caz. Prin urmare L2 = {ambrbpcpdrdm | m, p>0, r>0}.Un ir | oarecare w eL2, poate fi scris sub form w = a u d, unde u este de aceeai form cu w, j sau w este de form brbpcpdr i n acest caz u fie se poate scrie sub forma u - b v . d c u v ; un ir de aceeai form cu u, sau u este de forma x = b p c p . irul nou obinut poate fi ; generat observnd c se poate scrie sub forma x = b z c unde z este un ir de aceeai ' I form cu x. Pot s fie utilizate, produciile: S - aSd | bCd, C - bCd | D, D -> bDc | X. \ Se observ c L = LI u L2 i c cele dou neterminale B i D se comport la fel (adic i genereaz acelai limbaj), i putem renuna la neterminalul D. | Prin urmare, o gramatic G care genereaz limbajul L este: G = ({ S, A, B, C }, { a, b, c, d }, j P, S) unde P = { S -> aSd | A | bCd, A - aAc | B, B -> bBc | X, C H> bCd | B }. Verificare: Vom considera dou exemple de derivare: a a b c c c (cazul m > q), respectiv a b b c d d ! (cazul m < q). Pentru irul a a b c c c se obine secvena de derivri: S => A => a A c=> a a ; A c c=> a a B c c=> a a b B c c c = > a a b c c c , respectiv pentru cel de-al doilea ir: S=> a S |

G este o gramatic independent de context.

Problema li-42-7
:

"1

* ;"'

<^*f.'
;

L={ambn|n<m<2*n,n,m>l }

Soluie: Notm cup = m - n i q = 2 * n - m unde p > 0, q > 0. Prin urmare, n = p + q i m = 2 * p + i : q i limbajul poate fi scris sub forma: L = { a2*paqbqbp | p, q > 0 } : ; Un ir care aparine acestui limbaj, poate s fie scris sub forma wl = a a u b unde u este de ; : aceeai form cu wl sau de form aqbq. j irul aqbq poate s fie generat n mod asemntor lui wl, observnd c poate s fie scris sub i 1 forma w2 = a v b unde v este de aceeai form cu w2 sau este irul ab. Prin urmare o [gramaticaeste G = ({ S, A }, { a, b }, P, S)unde P = { S -> aaSb | aaAb, A - aAbij ab}

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Verificare:
Fie irul: a a a b b (n = 2, m = 3). irul poate s fie obinut utiliznd urmtoarea secven de derivri: S=> a a A b=> a a a b b. Comentarii: . G este o gramatic, independent de context problema 1.1-13 L = { wcwR | w e {a,b}* } unde prin u = wR am notat irul care are proprietatea u, = wn.i+i pentru orice i = 1, 2,..., n unde n = |wj = |u| i w = wi w 2 ... wn, u = ui U2... un (irul reflectat corespunztor lui w). Soluie: Orice ir din limbajul I, are proprietatea c ncepe i se termin cu acelai simbol sau este doar simbolul c. n primul caz irul poate s fie scris sub forma w = x u x unde x e { a, b }, iar u are aceeai proprietate ca w. Lund n considerare cele de mai sus, gramatica G care genereaz limbajul L este G = ({ S }, { a, b, c }, P, S) unde P = { S -> aSa | bSb | c }. ntradevr, orice ir u generat de G are proprietatea c exist w e {a,b}* astfel nct u = wcwR i pentru orice ir u e L, exist o derivare S =*> u. Verificare: Pentru irul a b a c a b a, se obine urmtoarea secven de derivri: S => a S a: =>abaSbaba=>abacaba Comentarii: G este o gramatic independent de context problema 1.1-14 L = { w e { a , b } * w = wR} Soluie: Un ir w care respect condiia de mai sus poate s aib una din urmtoarele forme: v vR,vavR, vbvR unde v e { a, b }* este un ir oarecare. Pentru a genera aceste iruri, putem s utilizm gramatica G = ({ S }, { a, b }, P, S) cu P = { S -> aSa | bSb | a | b | X}. Verificare: Fie irul a b a a b a a b a . Pentru obinerea acestui ir p u t e m s considerm u r m t o a r e a secven d e derivri: S = > a S a = > a b S b a = > a b a S a b a = > a b a a S a a b a = > a b a a b a a b a. Comentarii: . , . G este o gramatic independent de context

IMLIII.I I.! 15

L= Soluie: Orice ir nevid w e L conine la nceputul irului toate simbolurile a, dup care urmeaz toate simbolurile b i se termin cu simbolurile c. Pentru a genera toate a-urile se va folosi neterminalul Si, pentru a genera toate b-urile se va folosi neterminalul S2, iar pentru a genera toate c-urile se va folosi neterminalul S3. Prin urmare, gramatica G care genereaz limbajul L poate s fie: G = ({ S, S,, S2, S3 }, { a, b, c }, P, S) unde: P = {S-> S,S2S3, S, - a S, | a, S2 ->bS2|b, S3->cS3|c}. ] erificare: Fie irul aabbbcccc. Pentru obinerea acestui ir putem s considerm urmtoarea secven de derivri: S=> SiS2S3=> a SiS2S3 => a a S 2 S 3 => a a b S2S3=> a a b b S 2 S 3 => a a b b b S3=> a a ; bbcS3=>aabbccS3=>aabbcccS3=>aabbbcccc : Comentarii: G este o gramatic independent de context problema 1.1-16 L= {aVck\ i#j s a u j # c , i , j , k > 0 } i ,

abSba

', : I
:

Soluie: Pot apare 4 cazuri: 1. Dac i < j, notm p = j - I, rezult j = p + i, p > 0. Fie LI limbajul generat n acest caz. j Atunci LI poate fi descris prin: LI = { aibibpck | p > 0, i, k > 0 }. Vom folosi j netermmalul S1 pentru generarea subirului aibi, pentru a genera subirul bp se va folosi | neterminalul S2, iar pentru a genera subirul ck se va folosi neterminalul S3. Prin urmare | vor fi utilizate produciile S - SI S2 S3, SI - a SI b | a b, S2 - b S2 j b,.S3 -> c S3 '| j c. i : j ; j j

: 2. Dac i > j, notm p = i - j, rezult i = p + j, p > 0. Fie L2 limbajul generat n acest caz. : Atunci L2 poate fi descris prin: L2 = { a'VbV | p > 0, j, k > 0 }. Vom folosi neterminalul ; Si pentru generarea subirului ap, pentru a genera subirul a'b' se va folosi neterminalul i S2, iar pentru a genera subirul ck se va folosi neterminalul S3. Prin urmare vor fi utilizate produciile S ^ Si S2 S3, SI - a S, | a, S 2 - a S 2 b | ab, S 3 - > c S 3 | c .
:

3. Dac j < k, notm p = k - j, adic k = j + p, p > 0. Fie L3 limbajul generat n acest caz. j Atunci L3 poate fi descris prin: L3 = { aWc 1 5 1 p > 0, i,j > 0 }. Vom folosi neterminalul j Sj pentru generarea subirului a1, pentru a genera subirul bV se va folosi neterminalul j S2, iar pentru a genera subirul cp se va folosi neterminalul S3. Prin urmare vor fi utilizate j ... .produciile S- Si S 2 S 3 , Si-ai | a , S 2 - b S 2 c | b c , S 3 - ^ c S 3 | c . I 11

10

10

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

4. Dac j > k, notm p = j - k, i j = p + k, p > 0. Fie L4 limbajul generat n acest caz Atunci L4 poate fi descris prin: L4 = { a'bpbkck | p > 0, i, k > 0 }. Vom folosi neterminalul Si pentru generarea subirului a', pentru a genera subirul bp se va folosi neterminalul S2, iar pentru a genera subirul b k c k se va folosi neterminalul S3. Prin urmare vor fi utilizate i produciile S - S, S2 S3, S, -* a Si | a, S2 -> b S21 b, S3 - b S3 c | b c.
:

1.1-1")
I \\ I MI

: Corespunztor celor 4 cazuri notm neterminalele Si, S2, S3 cu Sia, S] b , Sic, S ! d , S2a, S2b, S2c, : S2d, S3a, S3b, S4c, S3d. Prin urmare gramatica ce genereaz limbajul este: G = ({ S, Sia, S2a, S3a, S,b, S2b, S 3 b , S,c> S2c, S 3 c , Sid, S2d, S 3d }, { a, b, c }, P, S) unde: P = { S- Si a S 2 a S 3 a | SibS2bS3b | Si c S 2c S 3c j Si d S 2d S 3 d, Si a a Sj a b | a b, S 2a > b S2a | b, S 3a c S 3a | c , Sjb > a > Sib | a, S 2b -> a S 2b b | a b, S 3b - c S 3b | c, Sic -> a Sic | a , S 2c -> b S 2c c | b c, S 3c - c S 3c | c, Sid -> a Sid | a, S 2d -> b S 2d | b, S 3d H> b S3d c | b c }.

G este o gramatic independent de context

Soluie: Vom presupune c pai curgem .-.irul \\ de la ainga ia Jivapia considernd un prefix al acestuia: w = u a v unde u este prefixul, a este simbolul curent (a sau b), iar v este restul irului (u, v { a, b }*). Sunt posibile urmtoarele situaii: 1. Numrul de simboli a din prefixul u este par : 2. Numrul de simboli a din prefixul u este impar ; Asociem neterminalul S primei stri (care este de altfel ceea corespunztoare generrii unui ir din limbajul L), iar celeilalte stri neterminalul A. Din prima stare se trece n a doua dac : simbolul curent a fost un a i se rmne n starea S dac simbolul curent a fost un b. Din starea A se trece n starea S dac simbolul curent a fost un a i se rmne n starea A dac simbolul curent a fost un b. Deci gramatica care genereaz limbajul L este: G =.({ S, A }, { i a,b},P,S)undeP={S->aA|bS|/,A^bA|aS}. Comentarii:

L={a i b j c k |i<j,i,j,k>0} Notm p = j - i, adic j = i + p, p > 0. Atunci L poate fi descris prin: L = { a'b'bpck j p>0, i, k : > 0 }. Vom folosi neterminalul A pentru generarea subirului a'b1, pentru a genera subirul bp se va folosi neterminalul B, iar pentru a genera subirul ck se va folosi neterminalul C. Prin urmare, gramatica G care genereaz limbajul L poate s fie: G = ({ S, A, B, C }, { a, b, c }, j P, S) unde: P = { S->ABC, A -> a A b | A,, B -> b B | b, C -> c C | A.}. ; G este o gramatic independent de context '

G este o gramatic regulat


j i i u i i l i i n . i 1.1 IU ; " "--

L={we{a,b}*|#a(w) = 2*#b(w)} Soluie: Pentru a genera irurile din limbaj de cte ori apare un simbol b trebuie sa apar doi simboli a. Nu este important ordinea n care apar simbolii. Deci gramatica care genereaz limbajul L este: G = ({ S }, { a, b }, P, S) unde P = { S - > a S a S b S | a S b S a S | b S a S a S | , } . Comentarii: G este o gramatic independent de context

L={aibick|i+j=k,i,j,k>0} Limbajul parantezelor bine formate Soluie:


Gramatica care genereaz limbajul L este: G = ({ S } , { ( , ) } , P, S) unde P = { S -> S S | (S )
! ( ) } sau G = ({ S } , { ( , ) } , P, S) unde P = { S ^ S S | ( S ) | X } dac este acceptat irul vid.

Dac k = i + j atunci L poate fi descris prin: L = { a'Wc'c' | i, j > 0 }. Orice ir w din limbaj ncepe cu simbolul a, i se termin cu simbolul c. Deci, w se poate scrie ca w = a u c unde u ; este un ir care fie este de tipul celui din mulimea L, fie este de forma Vd, j > 0 . Acesta din i urm se poate scrie sub forma b v c cu v de aceeai form sau v este irul bc. Prin urmare : gramatica G care genereaz limbajul L poate s fie: G = ({ S, A }, { a, b, c }, P, S) unde: P = {Sn>aSc|aAc, A->bAc|bc}. ; G este o gramatic independent de context 12

Comentarii: G este o gramatic independent de context

12*

13

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

problema 1.1-22 L= { wwjwe {0, 1 }* } Soluie: Analiznd forma general a irurilor ce fac parte din limbajul L se observ c n generarea : acestor iruri este necesar " memorarea " primei jumti a irurilor pe msur ce se face : aceast generare, pentru a putea utiliza apoi informaia memorat n generarea celei de-a : doua jumti a irului. n mod evident, aceast "memorare" nu se poate realiza utiliznd i mecanismele oferite de gramaticile regulate sau independente de context. Am vzut c se pot : genera iruri de form w / c u ajutorul unor gramatici independente de context. ; Vom genera un ir n care unui simbol 1 din prima jumtate a irului i va corespunde un , simbol notat U n a doua jumtate a irului. n mod corespunztor, unui simbol 0 din prima ; jumtate a irului i va corespunde un simbol notat Z n a doua jumtate a irului. Pentru a : marca sfritul irului vom utiliza un neterminal B. Se observ c n acest mod s-a memorat j prima jumtate a irului ntr-o form inversat. n continuare, din modul n care se utilizeaz urmtoarele derivri ar trebui s rezulte i restul irului. Astfel, transformrile pe care le vom i opera asupra unui ir generat ca mai sus, pot s fie exprimate n termeni intuitivi astfel: orice , Z sau U se transform n 0, respectiv 1 dac sunt urmate de terminatorul B, iar orice simbol 0' : sau 1 se deplaseaz ctre captul din stnga, respectiv orice simbol Z sau U se deplaseaz : ctre dreapta (pentru a ajunge la terminatorul B). I De exemplu: 001UZZB => 001UZ0B => 001UOZB => 001U00B => 0010U0B => 00100UB ! => 001001B => 001001. Astfel, mulimea produciilor gramaticii va conine S -> A B cu | neterminalul A utilizat pentru crearea unui ir de forma wt w2 unde wi e { 0, 1 }*, w2 e { U, ; Z}*, iar ntre wi i w2 exist relaia: wi = w 2 R n care U = 1, Z = 0. ; Acest ir este generat prin produciile: A -> 0 A Z | 1 A U | X. Pentru generarea limbajului L \ mai sunt necesare produciile care realizeaz nlocuirea neterminalelor U, Z cu 1, respectiv 0 '. dac sunt urmate de neterminalul B i dubla deplasare a simbolilor: Z B -> 0 B, U B -> 1 B, : Z 0 -> 0 Z, U 0 - 0 U, Z 1 -> 1 Z, U 1 -> 1 U. De asemenea, este necesar producia B - A. pentru a elimina simbolul utilizat ca terminator. Deci o gramatic G care genereaz limbajul ; L este G = ( { S, A, B, U, Z }, { 0, 1 }, P, S) unde: P = { S ^ A B , A - > O A Z | 1 A U | A . , Z B->0B,UB->lB,Z0-0Z,U0->0U,Zl->lZ,Ul->lU,B->A.}. ' criticare: Pentru irul 0 1 0 1 se obine irul de derivri: S = > A B : 0AZB=>0 1 A U Z B = > 0 Z B = > 0 1 U 0 B = > 0 1 0 U B = > 0 1 0 1 B => 0101 Comentarii: : Se observ c G este o gramatic de tip 0 (tar restricii). Dac se utilizeaz producia B -* l ntr-un ir de derivri naintea transformrii tuturor neterminalelor U i Z, se poate obine o form propoziional din care nu se mai poate obine un ir din limbajul L.

De exemplu: S => AB => 0AZB => 0AZ i nu mai exist nici o producie care s poat s fie aplicat. Din forma propoziional obinut nu se mai poate obine un ir care s aparin limbajului L. Astfel de rezultate in de aspectul nedeterminist al gramaticii respective. 1.1-23 L={anbV|n>l} Soluie: Problema poate s fie abordat ntr-o manier similar cu cea anterioar adic se memoreaz" prima parte a irului (an), ns generarea nu poate continua verificnd c exist un numr corespunztor de simboli b i de simboli c. Prin urmare, va trebui s memorm" prima parte a irului (a11) i apoi s generm acelai numr de perechi de forma (BC) unde B, C sunt neterminale asociate cu terminalele b, c. n continuare, din derivrile ulterioare, va rezulta transformarea celei de-a doua pri a irului n irul bncn. Vom considera deci, irurile de forma an(BC)n unde B,C sunt neterminale prin intermediul crora se va face generarea subirului bncn. Pentru aceasta este necesar substituia oricrui subir de forma CB cu irul BC, respectiv nlocuirea neterminalelor B,C cu b, respectiv c. Astfel, o gramatic G care genereaz limbajul L este G = ({ S, B, C }, { a, b, c }, P, S) unde: P = { S- aSBC | abC, CB -> BC, bB - bb, bC ->' bc, cB -> Bc, cC -> ce }. Verificare: Pentru irul a3b3c3 de exemplu, se obine irul de derivri: S = > a S B C = > a a S B C B C = > aaabCBCBC=>aaabBCCBC=>aaabBCBCC=>aaabBBCCC=>aaab b B C C C = > a a a b b b C C C = > a a a b b b c C C=> a a a b b b c c C=> a a a b b b c c c = a3b3c3. Comentarii: G este o gramatic fr restricii 1.1-24 ! L = {a b c d |m,n>l} Soluie: Vom genera nti forme propoziionale de tipul a m b n D n C m unde C, D sunt neterminale asociate terminalelor c, d. ntr-adevr, o form propoziional ca mai sus poate fi generat de produciile: S - > a S C j a A C , A - > b A D | b D . Urmtorul pas este deplasarea simultan a simbolilor C spre stnga i respectiv D spre dreapta, nlocuirea cu terminalele corespunztoare c, d fcndu-se de la stnga la dreapta: DC -> CD, bC -> bc, cC - ce, cD -> cd, dC -> Cd, dD -> dd. Astfel, o gramatic G care genereaz limbajul L este G = ({ S, A, C, D }, { a, b, c, d }, P, S) unde: P = { S H > a S C | a A Q A -> b A D | b D, DC -> CD, bC -> bc, cC -> ce, cD-> cd, dC -> Cd, dD -> dd }.
m n m n

14

14

15

limbaje formale si translatoare

Seminar LFA

Verificare: 2 3 2 3 Pentru irul a b c d se obine urmtoarea secven de derivri: S => aSC =?>aaACC=>aa bADCC=>aabbADDCC=*aabbbDDDCC=>aabbbDDCDC=>aabbb DCDDC=>aabbbCDDDC=>aabbbcDDDC=>aabbbcDDCD=^aabb bcdDCD=>aabbbcddCD=>aabbbcdCdD=>aabbbcCddD=>aabbbc 2 3 2 3 cddD=>aabbbccddd = a b c d . Comentarii: Aceast gramatic realizeaz abstractizarea corespondenei numrului de parametri cu care a : fost definit o procedur i numrul de parametri cu care aceasta se apeleaz. Deoarece n procesul de compilare analiza sintactic utilizeaz gramatici independente de context, aceast verificare (care comport o gramatic fr restricii) se va face n faza de analiz semantic i nu n cea de analiz sintactic. problem;! 1.1-25 L={aVc n d n |n>l } Soluie: Vom considera deci, irurile de forma an(bCD)" unde C, D sunt ncterminale prin intermediul crora se va face generarea subirului c"dn. Pentru aceasta este necesar substituia oricrui subir de forma DC cu irul CD, respectiv nlocuirea neterminalelor C, D cu c, respectiv d. Astfel, o gramatic G care genereaz limbajul L este G = ({ S, C, D}, { a, b, c, d }, P, S) unde: P = { S-> aSbCD | abCD, DC - CD, Db -> bD. Cb -> bC, bC -> bc, cC H> CC, CD - cd,dD->dd}. ('oinenlarii: G este o gramatic fr restricii 1.1.2 Lema de pompare

limbaje formale si translatoare

Seminar LFA

Probleme
S se demonstreze c urmtoarele limbaje nu sunt independente de context. problem 1.1-26 L={anbncn|n>0} Soluie: Presupunem prin absurd c L este independent de context, deci este aplicabil lema de pompare. Fie n = k i fie irul: z = akbkck. ntr-adevr, |z| > k, deci exist irurile u, v, w, x, y i astfel nct z = uvwxy cu vx 4 X i |vwx| < k. ; Deoarece |vwx| < k, rezult c vwx nu poate conine i a i c. 1) Dac vwx nu conine a, atunci u trebuie s conin toi simbolii a din irul z (adic ak). Pentru i = 0, rezult uwy e L, adic: uwy = a k b k c k i deci |uwy| = 3*k. Dar, [uvwxy| = jz| = i 3*k i deci |v| = |x| = 0, ceea ce contrazice condiia vx 4 X. . 2) Dac vwx nu conine c, atunci toi simbolii c trebuie coninui n irul y (adic c k ). Pentru ' i = 0, rezult uwy e L, adic: uwy = a k b k c k i |uwy| = 3*k. Cum |uvwxy| = 3*k, rezult c |v = |x| = 0 (contradicie). Prin urmare, L nu poate fi independent de context. pi'ob'eiitu 1.1-27 L={ai|i = 2jJ>0}

Presupunem prin absurd c L este independent de context, i este aplicabil lema de pompare. Fie k = n i fie irul: z = a1". ntr-adevr, |z| > n, atunci exist irurile u, v, w, x, y . : astfel nct z = uvwxy cu vx 4 X i |vwx| < n.
:

Propoziie. Pentru orice limbaj L independent de context exist un numr natural kj caracteristic limbajului, astfel nct dac z e L i |z| > k, atunci z poate fi scris sub forma z = uvwxy ndeplinind urmtoarele condiii: 2. |vwx|<k 3. uv'wx'y e L pentru orice i

Considerm z = a p aVa s a 2 "' p " q " r " s , p,q, r, s > 0. Rezult u = ap, v = aq, w = ar, x = as i y = ; a p q"' "s de unde rezult |vwxj = q + r + s < n i |vx| = q + s > lceea ce nseamn vx 4 h. i Dac i = 2 atunci uvW'y e L, adic a 2 " + q + s e L, de unde rezult 2n + q + s = 2 n+j = 2" +(2* ; : - l)*2 n adic q + s = (2j - 1)* 2" pentru j > 1=> q + s > 2" (deoarece 2 j - l > l ) = i > q + s > n | \=> contradicie (q + r + s < n). Prin urmare, L nu poate fi independent de context. . I

16

16

17

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

1.1.3 Transformri asupra GIC Gramaticile independente de context (GIC) sunt utilizate pentru analiza sintactic n cadrul,] compilatoarelor. Pentru c procesul de analiza sintactic se simplific mult dac gramaticile 1 utilizate satisfac anumite condiii, este. util s se fac transformri asupra acestui tip dej gramatici, transformri care s produc gramatici echivalente (care genereaz acelai limbaj). 1.1.3.1 Eliminare recursivitate stnga

Intrare: o gramatic G = (N, T, P, S) Teire: o gramatic G' = (N', T, P', S') care satisface condiiile L(G) = L(G') i G' nu are X producii i=0 = { A 1 A ^ X 6 P} repet
No

= { A I A - a e ?, a<EN,_*} \J Ni-i pn cnd Ni = Nj-i


Nl

Spunem c o gramatic este recursiv stnga dac exist un neterminal A astfel nct existai o derivare A =>+ Ax pentru A e N, x e (N UT)* . Dac pentru un neterminal A exist] produciile AB 2 f... | AB m |y,| ... | yn unde Yi nu ncepe cu A, 1 < i < n , produciile anterioare se pot nlocui cu: A-Y,A'|y 2 A'|...|y n A' A'-BiA'|B2A'|...|BmA'|X Aceast construcie elimin recursivitatea stng imediat. Dac gramatica nu permite i derivri de tipul A =>+ A (nu are cicluri) i nu conine X producii poate s fie transformat n: vederea eliminrii recursivitii stnga utiliznd urmtorul algoritm. Intrare: o gramatic fr cicluri i X producii Ieire; o gramatic echivalent fr recursivitate stnga. Se alege o ordine a neterminalelor, fie ea: Ai, Aj, ..., A pentru i = 2 .. n execut pentru j = 1 .. i-1 execut nlocuiete fiecare producie de forma Ai -^ r cu produciileAi- ->-.Ui r | u? r I ... | uk r unde A, -> ui I u2 .. | uk sunt toate produciile pentru Aj.
' D

dac S e Nf N' = N U {S'} P' = {S' -> A , S' -> . . ? altfel N' = N S' = S" P' = O
CI

se spune c avem recursivitate stnga imediat i]

pentru fiecare p e P execut dac p este de forma ^->aoB1a1...Bkak,k>O,B,eNf,l<i<k,aJe((N-Nf)uT)*,O<j<k P' = P u({A-a 0 X| <x] Xk ak Xj 6 {B;, }} - {A > }) altfel P' = P' U P
D

1.1.3.3

Eliminare simboli neutilizai

Un simbol neterminal este nefinalizat dac din el nu se poate deriva un ir format numai din simboli terminali. Algoritmul de transformare este: Intrare: o gramatic G = (N, T, P, S) ^ Ieire: o gramatic G' = (N', T, P', S) care satisface condiiile L(G) = L(G') i + VA 6N, A => w, w 6T*. i = 0; o = {A-> a , aeT'} repet i++ Ni = {A | A ->'/eP, /?e(Nwur)*}u N^ Pn cnd Nt = Nj-i N' =N. p ' c: P i este format numai produciile din P care au n partea stng simboli din N'
N

elimin recursivitatea stng imediat ntre produciile Ai. 1.1.3.2 Eliminare A producii O gramatic nu are X producii dac satisface una din-urmtoarele condiii: Nu exist nici o producie care s aib n partea dreapt irul vid sau Exist o singur producie care are n partea dreapt irul vid i anume producia S -> X. Simbolul S nu apare n acest caz n partea dreapt a nici unei producii. Algoritmul de transformare este:

18

18

19

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

1.1.3.4

Eliminare simboli inaccesibili

Un simbol neterminal este inaccesibil dac nu poate apare ntr-o form propoziional. Algoritmul de transformare este:
Intrare : o gramatic G = (N, T, P, S) Ieire: o gramatic G' = (N', T, P', S) care satisface condiiile L(G) = L(G') i V A eN' exist w e (N U T ) *, s =>w i A apare n w. i = 0; N o = {S} repet N^+= { Ae N | A apare n partea dreapt a produciilor pentru un neterminal din Nj-j} U N , pn cnd Ni = N^ N' = Ni P' c: P conine numai ;produciile corespunztoare neterminalelor din N'

A -> Aa | Ba | a |Bb din care se elimin recursivitatea imediat i rezult: A ~> BaA' | aA' | BbA', A' -> aA' | X Pentru producia B - Sb | Aa se substituie cu S -> Sb | Aa | X i rezult B H> Ab | Bb | b| Aa iar apoi se nlocuiete A -> BaA' | aA' | BbA' i rezult B - BaA'b | aA'b j BbA'b | Bb | b | B a A' a | a A' a | B b A' a. Din care se elimin recursivitatea imediat i rezult: ; B _> a A' b B' | bB' | a A' aB', B' -> aA'b B' | b A' b B' | b B' | a A' a B' | b A'a B' | X n final dup eliminarea recursivitii stnga gramatica este: ; G = ({ S, A, A', B, B' }, { a, b }, P, S) unde: P = { S- A | B, A -> BaA' | aA' | BbA', A' -> aA' i X, B -> a A' b B' | bB' | a A' aB' ,B' - aA'b B' | b A' b B' | b B' | a A' a B' | b A'a B' probli-Pia 1.1-30 S se elimine recursivitatea stng pentru urmtoarea gramatic: G = ({ A, B, C }, { a, b, c }, P, A) unde P = {A -> BC | a, B - Ca | Ab, C -> Ab | cC | b} Soluie: Se alege o ordine pentru neterminale A < B < C. Pentru producia A - BC | a nu se face nici o modificare. Pentru producia B -> Ca ] Ab deoarece A < B se va folosi A - BC j a i rezult B - Ca | BCb | ab din care se elimin recursivitatea imediat i rezult: B -> CaB' | jabB', B ' - > C b B ' | L Pentru producia C - AB j cC | b se substituie cu A - BC | a i rezult C - BCb | aB | cC | b iar apoi se nlocuiete B -> CaB' | abB' i rezult C - CAB'CB | abB'Cb | aB | cC | b : Din care se elimin recursivitatea imediat i se obine: C -> abB'CbC | aBC | cCC | b C , C -> AB'CBC [ X. n final dup eliminarea recursivitii stnga gramatica este: G = ({ A, B, B\ C, C }, { a, b, c }, P, A) unde: P = { A- BC | a, B -> CaB' | abB', B" -+ CbB' | X, C -> abB'CbC | aBC j cCC | b C , C - AB'CBC j X} 1.1-31
s

Probleme
problema 1.1-28
S se elimine recursivitatea-stng pentru urmtoarea gramatic: G = ( { S , L } , { a , , , ( , ) } , P, S) u n d e P = {S -> ( L ) | a, L -> L, S| a}

Soluie: Se alege o ordine pentru neterminale, fie ea: S < L . Pentru producia S -> (L) | a nu se face nici o modificare. La fel pentru S - a. Pentru producia L L,S | a se elimin recursivitatea imediat i rezult: L - aL' L'-> ,SL' | X In final dup eliminarea recursivitii stnga gramatica este: G = ({ S, L, L'}, { a,,, G)}, P, S) unde: P = { S-> (L) | a, L,-> aL', L' -> ,SL' \X}
pro bit mu 1.1-29

i - elimine ' piiHluciiili.- Jiu y.nn iik\i li >

iv[ s. \. li. l ',. [ J. l ; I'. M unde P = {S -

ABC, A -> BB | X, B -> CC | a, C -> AA | b}

S se elimine recursivitatea stng pentru urmtoarea gramatic: G = ({ S, A, B }, { a, b }, P, S) unde P = {S -> A | B, A -> Sa | Bb, B -> Sb | Aa} Soluie: Se alege o ordine pentru neterminale S < A < B Pentru producia S > A | B nu se face nici o modificare. Pentru producia A -> Sa | Bb avem S < A deci se va folosi S -> A | B | X i rezult

Soluie: No = {A}, Ni = {A, C}, N 2 = {A, B, C}, N 3 = {S, A, B, C} = N f : S e Nf deci se introduc produciile S' -> S i S' -> X \ Producia S -> ABC devine S '-> ABC | AB | AC | BC | A |B | C , Producia A - BB devine A - BB | B : Producia B -> CC \ a devine B -> CC | C | a ! Producia CC -> AA | b devine C -> AA | A | b ; Dup eliminarea X produciilor gramatica este G = ({ S', S, A, B, C }, { a, b }, P, S') unde: P = { S' -> S , S' -> X, S ->' ABC | AB | AC | BC | A |B | C, A -> BB 1 B, B ->C | C | a, C -> ,AA|A|b} . 21

20

20

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

probleniii 1.1-32 S se elimine simbolii nefinalizai, iar apoi cei inaccesibili pentru gramatica G = ({ S, A, B }, {a, b }, P, S) unde P = {S-> A | a, A-> AB, B-> b} Soluie: Eliminare simboli nefinalizati: No = {S, B}, Ni = {S, B}, N f =Ni. Rezult c A este simbol nefinalizat, se vor elimina produciile corespunztoare neterminalului A i gramatica va deveni: G = ({S, B}, {a, b }, P, S) unde P = {S -> a, B -> b}. Eliminare simboli inaccesibili :No = {S},Ni = {S},Nf=Ni B este inaccesibil, d rmne producia S a. Dup eliminarea simbolilor nefinalizati i inaccesibili G = ({S}, {a},P,S)undeP={S->a} Coaientati: Ordinea corect de aplicare a celor doi algoritmi este eliminare simboli nefinalizai i apoi eliminare simboli inaccesibili. problema 1.1-33 S se elimine simbolii nefinalizai, iar apoi cei inaccesibili pentru gramatica G = ({S, A, B, C, D}, { a, b, d}, P, S) unde P = { S - b A | a B , A - a | a C | a D | a S | bAA, B -> b | Cb | Db | bS | aBB, C - Cb | Db, D -> Cb | Db, D - Cd | dAC} Soluie: Eliminare simboli nefinalizati: N 0 ={A,B},N, = {S,A,B},Nf=Ni Rezult c C, D Nf, adic sunt simboli nefinalizati, se vor elimina produciile corespunztoare lor i gramatica va deveni: G = ({S, A, B }, {a, b, d}, P, S) unde P = {S -> bA | aB, A -* a | aS | bAA, B->b|bS|aBB} Eliminare simboi inaccesibili: No={S},N,= {S,A,B},Nf=N, Nu exist simboli inaccesibili. n final gramatica este: G = ({ S, A, B }, {a, b, d}, P, S) unde P = {S -> bA | aB, A - a | aS | bAA, B-b|bS|aBB} problema 1.1-34 S se elimine recursivitatea stng, X produciile, simbolii neutilizai i inaccesibili pentru gramatica G = ({S, B, C, D, E}, {a, b}, P, S) unde P = {S-> aBa, B -> Sb | bCC |DaB, C -> abb | DD, E -> aC, D -> aDB}

Soluie: Eliminare recursivitate stnga. Se alege ordinea neterminalelor S < B < C< E< D Pornind de la B -> Sb | bCC | DaB, S -aBa. Rezult B -> aBab | bCC | DaB care nu este recursiv stngaEliminare Xproducii. Gramatica nu are X producii. Eliminare simboli nefinalizai. No = {C}, Ni = {B, C, E}, N2 = {S, B, C, E} = Nf D < Nf, se elimin toate produciile corespunztoare neterminalului D. Gramatica devine G = ({S, B, C, E}, {a, b}, P, S) unde P = {S H> aBa, B -> Sb | bCC, C -> abb, E Eliminare simboli inaccesibili. No = {S}, Ni = {S, B}, N2 = {S, B, C} = N E Nf, rezult E simbol inaccesibil. n final rezult: G = ({S, B, C}, {a, b}, P, S) undeP = {S -> aBa, B-> Sb [bCC, C -> abb} problema 1.1-35 S se elimine recursivitatea stnga, X produciile, simbolii neutilizati i inaccesibili pentru gramatica G = ({S, T}, {a, b, c}, P, S) unde P = {S-> TbT, T -> TAT |ca} Soluie: Eliminare recursivitate stnga. Alegem ordinea neterminalelor S < T. Se consider producia T -> TaT | se elimin recursivitatea stnga i rezult T - caT' i T' > aTT' | X RezultG = ({S, T, T'}, {a, b, c}, P, S) undeP = {S -> TbT, T -> caT', T' -> aTT' | X} Eliminare Xproducii. No = {T'}, Ni = {T'}, N f =Ni, Rezult G = ({S, T, T'}, {a, b, c}, P, S) unde P={S->TbT, T-caT'|ca,T'->aTT'|aT} Eliminare simboli nefinalizai. No = {T}, Ni = {S, T, T'}. Nu exisist simboli nefinalizai. Eliminare simboli inaccesibili. No = {S}, Ni = {S, T}, N2 = {S, T, T'}, Nf = N2. Nu exist simboli inaccesibili. n final se obine G = ({S, T, T'}, {a, b, c}, P, S) unde P = {S - TbT, T - caT' | ca, T' -> aTT' | aT}.

1.1 Mulimi regulate. Expresii regulate


Definiia 1.2.1. Fie T un alfabet finit. Se numete mulime regulat asupra alfabetului T mulimea definit recursiv astfel: 1- 0 este o mulime regulat asupra alfabetului T. 2. Dac a e T, atunci { a } este o mulime regulat asupra alfabetului T. 3. Dac P, Q sunt mulimi regulate, atunci P u Q , PQ, P* sunt mulimi regulate asupra alfabetului T. 4. O mulime regulat asupra alfabetului T nu se poate obine dect aplicnd regulile 1-3. Am notat prin P u Q , PQ, respectiv P* reuniunea, concatenarea a dou mulimi, respectiv nchiderea tranzitiv a unei mulimi. Definiia 1.2.2. O expresie regulat este definit recursiv n modul urmtor: 1. X este o expresie regulat care genereaz mulimea 0. 2. Dac a e T, atunci a este o expresie regulat care genereaz mulimea { a }. 3. Dac p, q sunt expresii regulate care genereaz mulimile P, Q, atunci: (p + q) sau (p | q) este o expresie regulat care genereaz mulimea P u Q . 22
23

22

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

(pq) este o expresie regulat care genereaz mulimea PQ. (p)* este o expresie regulat care genereaz mulimea P*. 4. O expresie regulat nu se poate obine dect prin aplicarea regulilor 1-3. Proprieti ale expresiilor regulate: l . a | P = B|oc 2.a|(B|y) = ( a | P ) | y 3.ct(py) = ( a p ) y 4.a(P|y) = a P | a y 5.(a|P)y=ay|py 6. a^. = A,a = a 7. a* = a I a* 8. (a *)* = a* 9. a | a = a (comutativitate reuniune) (asociativitate reuniune) (asociativitate concatenare) (distributivitate la stnga a concatenrii fa de reuniune) (distributivitate la dreapta a concatenrii fa de reuniune) (element neutru pentru concatenare)

Soluie: Din ultima ecuaie obinem X3 = 1* 0 XI. nlocuind n a doua ecuaie obinem X2 = 1 X2+0 1* 0 xl, de unde rezult X2 = 1 * 0 1 * 0 XI. Dac se nlocuiete n prima ecuaie rezult XI = 0 1 * 0 1 * 0 XI + 1 XI + X. Deci XI = (01*01*0 + 1)*. Dac se nlocuiete rezultatul obinut pentru XI n formulele corespunztoare lui X2 i X3 obinem X2 = 1* 0 1* 0 (0 1* 0 1* 0 + 1)* i X3 = 1* 0 (0 1*01*0+1)*. Comentarii: Se poate demonstra c n expresia regulat XI numrul de simboli 0 este divizibil cu 3. Prin urmare, XI poate fi scris sub form echivalent: XI =(1*0 1*0 1*0)* 1*. problema 1.12-3 S se construiasc expresia regulat care genereaz mulimea regulat egal cu limbajul generat de gramatica regulat cu produciile: P-> 0 Q11 P, Q- 0 R11 P, R- 0 R11 R10 Soluie: Asociem fiecrui netcrminal o expresie regulat i fiecrei producii de forma A-> a | p, o ecuaie de forma A = a + p unde a i p sunt tot expresii regulate. Corespunztor setului de producii de mai sus, se obine urmtorul sistem de ecuaii:

Utiliznd expresii regulate se pot construi ecuaii regulate. Soluia general a ecuaiei de forma: X = a X + b unde a, b, X sunt expresii regulate, este: X = a* (b + y) unde y este o expresie regulat oarecare. Soluia minimal (punctul fix al ecuaiei) este: X = a* b. Propoziie Fie G o gramatic regulat. L(G) este o mulime regulat. Definiia 1.2.3. Dou expresii regulate se numesc echivalente dac descriu aceeai mulime regulat.

10.(a*p*)* = (a + P)*

Probleme
problema 1.12-1 S se rezolve sistemul de ecuaii: X = a l X + a2Y + a3 Y = b l X + b2Y + b3 Soluie: Pentru prima ecuaie, soluia este X = al* (a2 Y + a3), nlocuind n cea de-a doua ecuaie, obinem Y = bl al* (a2 Y + b3) + b2 Y + b3 sau echivalent, folosind proprietile expresiilor regulate: Y = bl al*a2 Y + bl al*b3 +b2 Y + b3 sauY = (bl al*a2+b2) Y + (bl al*b3 +b3).Deci,pentruYse obine soluia Y = (bl al* a2 + b2)* (bl al* b3 + b3). n mod corespunztor, nlocuind n prima ecuaie, se obine urmtoarea soluie pentru X: X = al* a2 Y + al* a3 sau X = al* a2 (bl al* a2 + b2)*(blal*b3+b3) + al*a3. problema 1.12-2 S se rezolve sistemul de ecuaii: X1=OX2+1X1+, X2 = OX3 + 1X2 X3 = OX1 + 1X3 24 24

P=0Q+lP Q=0R+lP R=0R+lR+0


Din ultima ecuaie, se obine folosind proprietatea de distributivitate a concatenrii fa de reuniune R = (0 + 1) R + 0 care are soluia R = (0 + 1)* 0. nlocuind n a doua ecuaie, obinem: Q = 0 (0 + 1)* 0 +1P. nlocuind Q n prima ecuaie: P = 00(0+1)*0 + 0 1 P + 1 P adic P = (01 + l)P + 00 (0 + 1)* 0. Aceast ecuaie are soluia P = (0 1 + 1)* 0 0 (0 +1)* 0.

S se construiasc expresia regulat care genereaz mulimea regulat egal cu limbajul regulat generat de gramatica regulat: S- 0 A [ 1 S | X A-0B|l A B->0S|lB Soluie: Corespunztor setului de producii de mai sus, se obine urmtorul sistem de ecuaii: S=0A+lS+X A=0B+lA B=0S+lB

25

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

! Din ultima ecuaie, obinem B = 1 * 0 S. nlocuind n a doua ecuaie, aceasta devine: A = 0 1 * : 0 S + I A care are soluia A = l * 0 1 * 0 S . Prima ecuaie devine n urma nlocuirii expresiei : regulate A, S = O 1 * O 1 * O S + 1 S + X sau, folosind distributivitatea concatenrii fa de reuniune. S = (0 1* 0 1* 0 + 1) S + X care are soluia S = (0 1* 0 1* 0 + 1)* X = (0 1* 0 1* 0
+ !)*'

problema 1.2-7 se construiasc gramatica care genereaz limbajul descris de expresia regulat: ( a | b)* a (a | b) (a 1 b) Soluie: . Notm S = (a | b)* a (a | b) (a | b) i respectiv A1 = a (a | b) (a | b). S este soluia ecuaiei: S = (a + b) S + A' care poate s fie scris echivalent S = a S + b S + A' (1). Dar A' = a A unde A = (a | b) (a S b). Prin urmare, relaia (1) devine S = aS + bS + aA (2). Dac notm B = (a | b), atunci A devine - A = a B + b B (3) i B = a + b (4) Corespunztor relaiilor (2) - (4), setul de producii al gramaticii G care genereaz limbajul descris de expresia regulat S este : S-aS|bS|aA A-> a B | b B B-> a | b Gramatica ce genereaz limbajul descris de expresia regulat dat este G = ({S, A, B}, {a, b}, P, S) unde P conine produciileJS- a S | b S [ a A, A-> a B | b B, B-> a | b}

problema 1.2-5 S se construiasc gramatica regulat care genereaz limbajul generat de expresia regulat: (a I b)* a* b+ a* Soluie: Notm S = (a | b)* a* b+ a* i A = a* b+ a*. Corespunztor, se poate scrie ecuaia ce are soluia S: S = (a + b) S + A. De asemenea, dac notm B' = b+ a* i B = b* a*, putem scrie urmtoarea relaie B' = b B (deoarece b+ = b b*). Pe de alt parte, A = a* B' i deci se poate scrie relaia A = aA + B'sauA = aA + bB unde B = b* a*. Notnd C = a*, B devine B = b* C care este soluia ecuaiei B = b B + C. De asemenea, C = a* este soluia ecuaiei C = a C + X. Prin urmare, corespunztor expresiei regulate de mai sus se obine urmtorul sistem de ecuaii: S=aS+bS+A A=aA+bB B=bB+C C = aC + A , i respectiv urmtorul set de producii: S->aS bSjA A->aA|bB B->bB Gramatica G care genereaz limbajul descris de expresia de mai sus, este G = ({ S, A, B, C }, { a, b }, P, S) cu P mulimea de producii de mai sus. problema 1.2-6 S se construiasc gramatica regulat care genereaz limbajul descris de expresia regulat: :(a|b)*a(a|b) Soluie: Notm S = (a | b)* a (a | b) i A' = a (a | b). Deci, S este soluia ecuaiei S = (a + b) S + A' iar A' poate fi scris sub forma A' = a A unde A = a + b. Deci, corespunztor expresiei regulate S, poate s fie scris urmtorul sistem de ecuaii: S = a S + b S + A', A' = a A, A = a + b sau S = aS + bS + aA, A = a + b. Gramatica ce genereaz limbajul generat de expresia S este G = ({ S, A }, { a, b }, P, S) unde P conine produciile: { S - a S | b S | a A, A-> a | b }.

1.3 Acceptoare
Spre deosebire de gramatici i expresii regulate care genereaz limbaje formale acceptparele sunt dispozitive care sunt n strare s recunoasc" dac un ir de simboli face parte dintr-un limbaj pentru care mecanismul este acceptor. 1.3.1 Automate finite Definiia 1.3.1. Se numete automat finit un obiect matematic AF = (Q, T, m, sO, F) unde: Q reprezint mulimea finit a strilor T este o mulime finit de elemente numit alfabet de intrare m este funcia parial a strii urmtoare m: Q x (T U { X }) - P(Q) unde prin P(Q) s-a notat mulimea prilor lui Q sO e Q este o stare numit starea de start F c Q este o mulime de stri numit mulimea strilor finale sau de acceptare Definiia 1.3.2. Se numete graf de tranziie pentru automatul finit AF = (Q, T, m, sO, F) un graf orientat cu arce etichetate G = (N, A) n care nodurile (mulimea N) reprezint strile automatului finit, iar arcele (mulimea Ac N x N) sunt definite astfel: (si; Sj) e A dac exist a e T astfel nct Sj e m(s i; a). n acest caz, arcul (SJ, sj) este etichetat cu simbolul a. Definiia 1.3.3. Se spune c un ir w G T * este acceptat de automatul finit AF dac exist o cale n graful de tranziie ntre starea de start i o stare final, astfel nct irul simbolilor care eticheteaz arcele este irul w. Mulimea irurilor acceptate de un automat finit formeaz limbajul acceptat de automatul finit respectiv. Definiia 1.3.4. Se numete automat finit determinist un automat finit AF = (Q, T, m, sO, F) pentru care funcia de tranziie m: Q x T-> Q. Se observ c n acest caz: nu exist X-tranziii 27

26

26

limbaje formale si translatoare

Seminar LFA

pentru orice s e Q i orice a e T exist o unic stare s' e S astfel nct m(s, a)=s'. Propoziie. Pentru orice automat finit nedeterminist (AFN) exist un automat finit determinist (AFD) care accept acelai limbaj. Propoziie Limbajele acceptate de automate finite sunt limbaje regulate (generate de gramatici regulate). Avnd n vedere c limbajele regulate sunt generate i de expresii regulate, exist o echivalen ca putere ntre gramatici regulate, expresii regulate i automate finite. Automatele; finite deterministe sunt utilizate pentru implementarea analizoarelor lexicale. Expresiile regulate' sunt utilizate pentru specificare atomilor lexicali recunoscui de un analizor lexical n mod; corespunztor au fost elaborai algoritmi pentru construirea de automate finite deterministe direct din expresii regulate.

limbaje formale si translatoare

Seminar LFA

problema 1.3-2 ga se construiasc automatul finit care accept limbajul generat de gramatica G: S-> 0 A | 1 S X, A- 0 B | 1 A, B-> 0 S | 1 B S se reprezinte graful de tranziie asociat. Soluie: ' . - ' . " _ - . Fie urmtoarea mulime de stri Q = { qO, ql, q2 } astfel nct asociem fiecrui neterminal o stare din Q: lui S i se asociaz qO, lui A i se asociaz ql, lui B i se asociaz q2. Corespunztor construim funcia de tranziie n modul urmtor: m(qO, 0) = ql, m(qO, 1) = qO, m(ql, 0) = q2, m(ql, 1) = ql, m(q2, 0) = qO, m(q2, 1) = q2 Automatul finit este AF = ({ qO, ql, q2 }, { 0, 1 }, m, qO, { qO }). Se observ c AF este determinist. Graful de tranziie corespunztor este:

Probleme
problema 1.3-1 i S se construiasc automatul finit care accepta limbajul generat de gramatica: ; P->0 Q | 1 P Q-> 0 R | 1 P R-> 0 R 11 R | 1 S se reprezinte graful de tranziie corespunztor. Soluie; Gramatica este n mod evident regulat, prin urmare exist un automat finit care accept limbajul generat de aceasta. Vom construi acest automat asociind fiecrui neterminal o stare i fiecrei producii o tranziie. Rezult c putem construi urmtoarea funcie de tranziie: m(P,0) = {Q},m(P, 1) = { P } m(Q,0) = { R } , m ( Q , l ) = { P } m(R,0)={R},m(R, 1) = { R, U } unde U este o stare nou introdus, n care se va produce acceptarea (deci va fi singura stare final). Prin urmare, automatul finit care accept limbajul generat de gramatica de mai sus este: AF = ({ P, Q, R, U }, { 0, 1 }, m, P, { U }). Corespunztor, graful de tranziie asociat este:

Comentam; irurile acceptate conin un numr de simboli 0 divizibil Cu 3. Automatul obinut este determinist. proMcma 1,3-1 \ S se construiasc gramatica regulat pentru limbajul L = { w e {a,b}* [ w = ubbab, u E {a, j b}* } construind mai nti graful de tranziie asociat. . , | Soluie: Fie S starea iniial a automatului. Trebuie s accepte irurile care se termin cu bbab. Din i starea S trecem n starea A n momentul n care apare un b (am recunoscut primul b din subirul bbab). Din starea A se trece n starea B dac s-a ntlnit un b (s-a recunoscut irul bb) i se trece n starea S dac s-a primit un a (n continuare se ncearc s se identifice i subirul bbab). Din starea B se trece n starea C dac s-a ntlnit un a (s-a recunoscut bba) i se rmne n B ! pentru b. Din starea C se trece n starea D dac s-a ntlnit un a, adic n starea D arii gsit \ bbab, deci D este stare final. Din starea C se revine n S dac s-a ntlnit un a, se rencearc i s se identifice subirul bbab. n starea S se poate rmne dac s-a ntlnit a sau b (pentru a ; se putea accepta irul u).

Comentarii: Se observ c n acest caz, automatul finit obinut este nedeterminist (pentru starea R i simbolul 1 exist dou stri succesoare posibile: R i U).

28

29

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Comentarii: Automatul AF astfel construit este nedeterminist (are X-tranziii). prolrfcnta 1,3-6 Pentru a construi gramatica fiecrei stri i se asociaz un neterminal. Rezult gramatica G = ' ({ S, A, B, C}, { a, b }, P, S) unde: P = { S- a S | b S | b A, A -> b B | a S, B -> b B | a C, C ' S se construiasc automatul finit care accept limbajul descris de expresia regulat: (a i b)* a (a I b) Soluie: Gramatica G care genereaz limbajul descris de expresia regulat (a | b)* a (a | b) este (vezi Problema 1.2.6.): S - a S | b S | a A , A- a | b. Asociem fiecrui neterminal o stare i fiecrei producii o tranziie. Corespunztor, obinem urmtoarea funcie de tranziie parial: m(S, a) = { S, }, m(S, b) = { S }, m(A, a) = { B }, m(A, b) = { B } unde B este o stare de acceptare (finala) nou introdus. Se observ ca automatul finit este nedeterminist. Graful de tranziie corespunztor este: a,b

! .3-4 S se construiasc gramatica regulat care genereaz limbajul L = { aia2 ... an | n > 3, a, e {x, y}, an.2 = y } construind mai nti graful de tranziie asociat. Soluie: Fie S starea iniial a automatului. n starea S se accept x i y pentru a se genera orice prefix. De asemenea din S se trece n starea A dac s-a ntlnit y (s-a recunoscut a n . 2 ). Din starea A se trece n starea B dac s-a ntlnit x sau y. Din starea B se trece n starea C dac sa ntlnit x sau y (C este i stare final).

; Pentru a construi gramatica, fiecrei stri i se asociaz un neterminal. Rezult gramatica G = i ({ S, A, B}, { x, y }, P, S)unde: P = { S-> x S | y S | y A, A -x B | y B, B - x j y). problema !.3-5 i S se construiasc automatul finit care accept limbajul descris de expresia regulat: ; (a | b)* a* b+ a* S se reprezinte graful de tranziie corespunztor. Soluie: i Expresia regulat (a | b)* a* b+ a* genereaz limbajul generat i de gramatica G determinat i- n Problema 1.2.5, adic: S- a S | b S | A, AH> a A | b B, B-> b B | C, C-> a C | X ' Construim automatul finit care accept limbajul descris de expresia regulat de mai sus. : Funcia de tranziie parial pentru automatul finit care accept limbajul descris de gramatica i G este: m(S, a) = { S }, m(S, b) = { S }, m(S, X) = { A }, m(A, a) = { A }, m(A, b) = { B }, | m(B, b) = { B }, m(B, X) = { C }, m(C, a) = { C } ! Deoarece exist producia C - X, starea asociat neterminalului C este de acceptare (sau final). Acelai lucru s-ar fi ntmplat pentru orice producie de forma A > a, cu a e T. : Automatul finit care accept limbajul descris de expresia (a | b)* a* b+ a* este AF = ({ S, A, ; B, C }, { a, b, c }, m, S, { C }).
30 30

Dac dorim s construim automatul finit determinist care accept limbajul descris de (a | b)* a (a | b), putem s efectum transformri asupra gramaticii G astfel nct din mulimea produciilor s rezulte o funcie de tranziie de tipul: m: Q' x T-> Q'. Pentru aceasta, transformm gramatic G prin factorizare stnga (terminalul a ncepe i n producia S a S . i producia S- a A). Obinem: S- a C | b S, A- a | b, C-> S | A. Prin substituie de nceputuri (" corner substitution "), obinem: S-> a C | b S, A-> a | b, C-> a C b S a | b, unde observm c neterminalul A este neutilizat (deci l putem elimina). Aplicnd din nou factorizarea stnga urmat de substituie de nceputuri, obinem: SH> a C | b S, C-> a D | b E, D-> C | X, E-> S | X, respectiv, S-> a C | b S, C-> a D | b E, D-> a D | b E | X, E-> a C | b S | X. Se observ c n acest caz se poate construi o funcie de tranziie total de forma: m(S, a) = C, m(S, b) = S, m(C, a) = D, m(C, b) = E, m(D, a) = ; D, m(D,'b) = E , m(E, a) = C, m(E, b) = S ; Graful de tranziie pentru acest automat finit determinist este:

Strile asociate neterminalelor D, respectiv E sunt stri de acceptare datorit existenei produciilor: DH> X i E -* X. 31

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Comentarii: Se poate construi automatul finit determinist care accept limbajul de mai sus pornind direct de la.expresiaregulat.
proMwii i I ' - "

S se construiasc automatul finit care accept limbajul generat de expresia regulat


(a I b) * a (a \ b) (a | b)

Soluie. Fie gramatica G care genereaz limbajul descris de expresia regulata (a | b)* a (a | b) (a | b) (vezi Problema 1.2.7.): S-> a S | b S | a A, A- a B | b B, B-> a | b. Construim pe baza mulimii de producii de mai sus urmtoarea funcie de tranziie: m(S, a) = { S, A }, m(S, b) = { S }, m(A, a) = { B }, m(A, b) = { B }, m(B, a) = { C }, m(B, b) = { C } unde C este o stare de acceptare nou introdus. Se observ c automatul finit obinut: AF = ({ S, A, B, C }, { a, b }, m, S, { C }) este nedeterminist. Graful, corespunztor este:

problema ;3>#

S se construiasc AFN (automatul finit nedeterminist) care genereaz acelai limbaj ca i ; urmtoarea expresie regulat i apoi s se construiasc AFD-ul (automatul finit determinist) corespunztor. S se fac i construcia direct: expresie regulat-AFD (a|b)*a(a|b) Soluie: AFN corespunztor expresiei regulate (a | b)* a (a | b) este:

Pentru a obine automatul finit determinist care accept limbajul generat de gramatica G de mai sus, se pot face transformri asupra gramaticii. Prin factorizare stnga (terminalul a ncepe i producia S- a S i producia S-> a A) se obine: S - a D | b S , A - a B | b B, B -> a | b, D -> S | A. Prin substituie de nceputuri (" corner substitution " ) , obinem: S -> a D | b S , B -> a [ b, D - > a D [ b S | a B | b B , unde observm c neterminalul A este neutilizat (deci l putem elimina). Aplicnd din nou factorizarea stnga urmat de substituie de nceputuri, obinem: S -> a D | b S, B ^ a | b, D - a E | b F, E -> D | B, F -> S | B, respectiv, S - a D | b S, D - a E | b F, E - > a E | b F | a | b , F - > a D | b S j a | b . Aplicnd din nou factorizarea stnga urmat de substituie de nceputuri, obinem: S - a D | b S, D -> a E | b F , E -> a G | b H, F -> a 11 b J, G - E | A,, H - F | A,, I - D | A,, J ->S | A., respectiv, S -aD|bS,D->aE|bF,E-aG|bH,F->aI|bJ,G->aG|bH|X,H->aI|bJ|A.,I ~>aE|bF|A,,J->aD|bS|A.. Se observ c n acest caz se poate construi o funcie de tranziie total de forma: m(S, a) = D, m(S, b) = S, m(D, a) = E, m(D, b) = F, m(E, a) = G, m(E, b) = H , m(F, a) = I, m(F, b) = J, m(G, a) = G, m(G, b) = H, m(H, a) = I, m(H, b) = J, m(I, a) = E, m(I, b) = F, m(J, a) = D, m(J, b) = S. Graful de tranziie al automatului determinist este:

da

Construcia AFD se face pe baza algoritmului de construire a unui AFD echivalent unui AFN t (vezi curs pentru notaii i algoritm). Starea iniial a AFD va fi: qO = X inchidere({ 0 }) = n continuare, celelalte stri precum i tranziiile corespunztoare se vor determina astfel: ( x) = qj unde qj = _inchidere(move(qi, x)), obinem:

i 0 1 , 2 , 3 , 7 } .

q! = A._inchidere(move(qO, a)) = A,_inchidere({ 4, 8 }) = { 1,2, 3, 4, 6, 7, 8, 9, 10 } q2 = \_inchidere(move(qO, b)) = jnchidere({ 5 }) = { 1, 2, 3, 5, 6, 7 } q3 = Mnchidere(move(ql, a)) = A._inchidere({4, 8,11}) = {1,2, 3, 4, 6, 7, 8, 9, 10, 11,13 } ( 4= 3 Unchidere(move(ql, b)) = ljnchidere({ 5, 12 }) = { 1, 2, 3, 5, 6, 7,12, 13 }

32

321

33

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Se obine urmtoarea tabel de tranziii: stare


a qO ql q2 q3 q4 qi q3 ql q3 ql

stare urmtoare
b q2 q4 q2 q4 q2

, Am notat n stnga fiecrui nod firstpos(nod), iar n dreapta lastpos(nod). Calculnd pentru i fiecare nod frunz followpos(i) (i codul unui nod frunz), se obine:
nod

a 1
b2

i corespunztor, graful de tranziie:

a3 a4 b5
#6

followpos { 1, 2, 3 } { 1, 2, 3 } {4,5}
{ 6 } { 6 } -

Dac dorim acum s construim direct automatul finit determinist care accept expresia de mai sus, trebuie s utilizm algoritmul de construire a AFD direct din expresia regulat (vezi curs). Considerm arborele corespunztor expresiei regulate, terminate cu terminatorul #: (a | b)* a (a | b) # 1 23456 Arborele este:
{1,2,3} . {6} / \ / \ {1,2,3} . {4,5} \

Corespunztor tabelei de mai sus, se obine automatul finit nedeterminist reprezentat prin : urmtorul graf de tranziie (vom asocia fiecrui nod frunz o stare n graful de tranziie), arcele ; sunt stabilite dup urmtoarea regul: exist un arc ntre nodul i i nodul j dac j 6 followpos(i). Arcul se eticheteaz cu simbolul corespunztor codului j. De asemenea, se introduce o stare : iniial 0 din care exista .-tranziii n strile din firstpos(rad) (rad este rdcina arborelui corespunztor expresiei regulate). Vom obine urmtorul graf de tranziie: % '

/ \ {6} # {6} / \ 6 / \ / \ {1,2,3} . {3} {4,5}[ {4,5} / \ /\ / \ / \ / {3} a {3} / \ * 3 / \ {1,2} | {1,2} / \ /\ {4} a {4} {5} b {5} / \ 4 5 / \ / \ {1} a {1} {2} b {2}

Se observ c n strile 4, respectiv 5 este acceptat sufixul aa, respectiv ab. Automatul finit determinist corespunztor expresiei regulate se obine considernd c stare iniial firstpos(rad) = { 1, 2, 3}. Tranziiile se determin astfel: m(qi, x) = U { followpos(i)} = qj i = cod(x) Se obine urmtorul graf de tranziie pentru AFD:

i j

34

34

35

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Am subliniat n fiecare mulime nodurile i pentru care este ndeplinit condiia i = cod (a).

Comentarii:
Se observ c n starea { 1,2,3,4,5,6 } se accept sufixul aa, iar n starea {1,2,3,6} se accept! sufixul ab. Ambele sunt stri terminale deoarece conin codul pentru # (terminatorul expresiei] regulate).

S se construiasc AFN pentru urmtoarea expresie regulat i apoi s se construiasc AFDul corespunztor. S se fac i construcia direct: expresie regulat-AFD: (a|b)*a(a|b)(a|b) Soluie: AFN corespunztor expresiei regulate de mai sus este:

Vom obine: m(qO, a) = A_inchidere(move(qO, a)) = X_inchidere({ 4, 8 }) = { 1, 2, 3, 4, 6, 7, 8, 9, 10 } = ql, m(qO, b) = A,_inchidere(move(qO, b)) = A,_inchidere({ 5 }) = { 1, 2, 3, 5, 6, 7 } = q2, m(ql, a) = X_inchidere(move(ql, a)) = X_jnchidere({ 4, 8, 11 }) = { 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16 } = q3, m(ql, b) = \_inchidere (move(ql, b)) = Jnchidere ({ 5^ : 12 }) = { 1, 2, 3, 5, 6, 7, 12, 13, 14, 15, 16 } = q4, m(q2, a) = A._inchidere(move(q2, a)) = : X_inchidere({ 4, 8 }) = ql, m(q2, b) = A,_inchidere(move(q2, b)) = A._inchidere({ 1, 2, 3, 5, ; 6, 7 }) = q2, m(q3, a) = X_inchidere(move(q3, a)) = X_inchidere({ 4, 8, 11, 17 } = { 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19 } = q5, m(q3, b) = \._inchidere(move(q3, b)) = X_mchidere({ 5, 12, 18 }) = { 1, 2, 3, 5, 6, 7, 12, 13, 14, 15, 16, 18, 19 } = q6, m(q4, a) = X_inchidere(move(q4,a)) = X_inchidere({ 4, 8, 17 })={ 1, 2, 3, 4, 6, 7, 8, 9, 10, 17, 19 } = : q7, m(q4, b) = A._mchidere(move(q4, b)) = A,_inchidere({ 5, 18 }) = { 1, 2, 3, 5, 6, 7, 18, 19 } = q8, m(q5, a) = A,_inchidere(move(q5, a)) = A,_inchidere({ 4, 8, 11, 17 } = { 1, 2, 3, 4, 6, 7, : 8, 9, 10, 11, 13, 14, 15, 16, 17, 19 } = q5, m(q5, b) = X_inchidere(move(q5, b))' = ; X_inchidere({ 5, 12, 18 }) = { 1, 2, 3, 5, 6, 7, 12, 13, 14, 15, 16, 18, 19 } = q6, m(q6, a) = X_inchidere(move(q6, a)) = \jnchidere({ 4, 8, 17 }) = { 1, 2, 3, 4, 6, 7, 8, 9, 10, 17, 19 } = \ q7, m(q6, b) = ^_inchidere(move(q6, b)) = A,_inchidere({ 5, 18 }) = { 1, 2, 3, 5, 6, 7, 18, 19 } \ = q8, m(q7, a) = X_inchidere(move(q7, a)) = ^_inchidere({ 4, 8, 11 }) = { 1, 2, 3, 4, 6, 7, 8, i : 9, 10, 11,13, 14, 15, 16 } = q3, m(q7, b) = ;Wnchidere(move(q7, b)) = X_inchidere({ 5, 12 j }) = { 1, 2, 3, 5, 6, 7, 12, 13, 14, 15, 16 } = q4, m(q8, a) = X_inchidere(move(q8, a)) = i ; X,_inchidere({ 4, 8 }) = { 1, 2, 3, 4, 6, 7, 8, 9, 10 } = ql, m(q8, b) = A._inchidere(move(q8, b)) i ; = A,_inchidere({ 5 }) = { 1, 2, 3, 5, 6, 7 } = q2. j ' O alt soluie se obine pornind direct de la expresia regulat construind AFN, respectiv AFD ! corespunztoare. n mod corespunztor funciei de tranziie de mai sus, obinem urmtorul i graf de tranziie asociat AFD. Strile finale vor fi toate strile care conin starea final 19 din i i AFN iniial: i

Pentru a obine AFD din AFN-ul de mai sus, starea iniial a noului automat determinist va fi: qO = A._inchidere({ 0 }) = { 0, 1, 2, 3, 7 } deoarece starea iniial a AFN este starea 0. n continuare, vom determina strile urmtoare si tranziiile utiliznd: m(qi, x) = ^_inchidere(move(qi, x))

36

36

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Arborele corespunztor expresiei regulate este:

Procednd n mod analog problemei precedente obinem urmtorul AFN:

{1,2,3} . {8} / \ /{8}#{8} / 8 {1,2,3} . {6,7} / \ / \ / \ {1,2,3} . {4,5} \

\{6}a{6}{7}b{7} / \ 6 7 / \ {1,2,3} . {1,2,3}{4,5} 1 {4,5} / \ / \ / \ / \ / {3} a {3} / \

/ \

\ \

{6,7} | {6,7}

{1,2} | / / / / / {1} a {1} 1

\ {4} a {4} \ 4 \ \ \ {2} b {2} 2

{1,2}

{5} b {5} 5

Dac dorim s obinem AFD corespunztor automatului de mai sus, considerm ca stare iniial firstpos(rad) = { 1, 2, 3 }. Tranziiile se obin astfel: m(qi, x) = v followpos(j) = qk j = cod(x) Obinem urmtorul automat finit determinist (n care sunt marcate ca fmale strile ce conin codul 8 corespunztor simbolului terminator # ) :

n stnga fiecrui nod se afl firstpos(nod), iar n dreapta lastpos(nod). Calculnd pentru fiecare frunz followpos(i) (i este codul frunzei), obinem:

nod a1 b2 a3 a4 b5 a6 b7 #8

followpos { 1, 2, 3 } { 1, 2, 3 } {4,5} {6,7} {6,7} {8} {8} -

38

38

39

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

problem;! 1.3-10 S se construiasc automatul finit determinist pentru expresia regulat: (a|b)*. Soluie; . Considerm expresia regulat terminat cu simbolul # i codificm n mod corespunztor simbolii: (a | b)* # 12 3 Pentru expresia regulat de mai sus, arborele corespunztor este:
{1,2,3} . {3} / / \ \

Am introdus o stare de start (0) din care exist ^-tranziii n strile corespunztoare elementelor din mulimea firstpos(rad) = { 1, 2, 3 }. De asemenea, starea 3 corespunztoare simbolului terminal # este stare final. Automatul fmit obinut astfel este nedeterminist. Dac dorim s obinem automatul finit determinist, vom considera starea de start firstpos(rad) = { 1, 2, 3 }, iar tranziiile se determin ca n problema anterioar. Obinem urmtorul automat finit determinist:

1,2,3

S se minimizeze automatele specificate prin graf urile de tranziie: prolik'ma 1.3-11

{1,2}*{1,2}{3} # {3} {1,2}|{1,2} 3 /\ / \ / \ {1} a {1} {2} b {2} 1 2

Determinnd pentru fiecare cod i followpos(i) pe baza mulimilor firstpos(nod) (specificat n stnga nodurilor), respectiv lastpos(nod) (specificat n dreapta nodurilor), se obine urmtorul tabel: nod followpos

a1
b2 #3

{ 1, 2, 3 } { 1, 2, 3 }
Soluie; Introducem o nou stare d astfel nct funcia de tranziie s fie total, adic pentru orice stare q pentru care m(q, x) nu este definit (x e{ a, b }), adugm m(q, x) = d. Noul graf de tranziie devine:

Graful de tranziie corespunztor automatului finit se determin asociind fiecrui cod o stare, iar arcele se determin astfel: exist un arc ntre starea i i starea j dac j e followpos(i), iar eticheta arcului este simbolul cu codul j. Obinem:

40

40

41

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoan

Seminar LFA

Fie partiia disjunct pe mulimea strilor: P = { { 0, 1, 2, 4 }, { 3, 5, 6, 7 }, { d } }unde prima mulime este mulimea strilor nefmale, iar a doua este mulimea strilor finale. n continuare, pentru fiecare mulime Q e P si toate strile q e Q pentru care: m(q, x) g Q1 astfel nct exist q' cu m(q', y) e Q' (1). Se construiete o nou partiie: P = (P \ { Q }) u { Q \ new, new } unde new este mulimea strilor care ndeplinesc condiia (1). ntr-adevr, n cazul nostru obinem. Pentru Q = { 0, 1, 2,4 }, tranziiile strilor componente sunt: m(0, a) = 1 e Q m(0, b) = 2 e Q, m(l, a) = 4 e Q m(l, b) = 5 g Q deci 1 e new m(2, a) = 3 Q deci 2 e new, m(4, a) = 4 e Q m(4, b) = 2 e Q Prin urmare, noua partiie pe mulimea strilor este: P = {{0,4}, {1,2}, {3,5,6,7}, {d}}. Pentru Q = { 0, 4 }, tranziiile strilor sunt: m(0, a) = 1 e { 1, 2 } m(0, b) = 2 e { 1, 2 }, m(4, a) = 4 g { 1, 2 } deci 4 e new. Partiia obinut pe mulimea strilor devine: P = {{0 }, { 4 }, { 1, 2 }, { 3, 5, 6, 7 }, { d } }. Pentru Q = { 1, 2 } (este prima mulime din partiie care conine mai mult de un element) rezult: m(l, a) = 4 e {4 } m(l, b) = 5 e { 3, 5, 6, 7 }, m(2, a) = 3 < { 4 } deci 3 e new. Partiia astfel obinut este: P = { { 0 }, { 1 }, { 2 }, { 4 }, { 3, 5, 6, 7 }, { d } } Pentru Q = { 3 , 5 , 6 , 7} tranziiile strilor componente sunt: m(3, a) = d e { d } m(3, b) = d e { d }, m(5, a) = 6 i { d } deci 5 e new, m(6, a) = 7 g { d } deci 6 e new, m(7, a) = 7 { d } deci 7 e new. Partiia obinut n acest caz este: P = { { 0 }, { 1 }, { 2 }, { 3 }, {4}, { 5, 6, 7 }, { d } }. Fie acum Q = { 5, 6, 7 }. Tranziiile strilor componente sunt: m(5, a) = 6 e { 5, 6, 7 } m(5, b) = d e { d }, m(6, a) = 7 e { 5, 6, 7 } m(6, b) = d e { d } m(7, a) = 7 {5,6,1} m(7, b) = d e { d }, adic nu mai apare o nou partiie pe mulimea strilor. Prin urmare, automatul finit minimizat este:

|.i.ihluii.il.*-12

Soluie; Funcia de tranziie este total, deci putem considera urmtoarea partiie pe mulimea strilor: ; P={jql,q2,q3},{q4,q5}} Aplicnd acelai algoritm de la punctul a), considerm mulimea: Q = { ql, q2, q3 } pentru care tranziiile strilor componente sunt: m(ql, a) = q2 e { q2 }, m(ql, b) = q3 e { ql, q3 }, m(q2, a) = q4 { ql, q2, q3 } deci q2 e new, m(q3, a) = q2 6 { q2 }, m(q3, b) = q3 e {ql,q3 }. Noua partiie pe mulimea strilor devine: P= {{ql, q3}, q2}, {q4, q5} }. Fie Q = { ql, q3 }. Tranziiile pentru aceast mulime de stri: m(ql, a) = q2 { q2 },

m(ql, b) = q3 e { ql, q3 }, m(q3, a) = q2 e { q2 }, m(q3, b) = q3 e { ql, q3 }


Fie acum Q = {q4, q5}. Tranziiile pentru strile componente sunt: m(q4, a) = q4 {q4, q5 } m(q4, b) = q5 { q4, q5 }, m(q5, a) = q2 { q4, q5 } deci q5 e new. Noua partiie pe mulimea strilor este: P = { { ql, q3 }, { q2 }, { q4 }, { q5 } }. Automatul finit minimizat, P e n tru care starea corespunztoare mulimii { ql, q3 } este notat cu ql, este:

42

421

43

limbaje formale si translatoan

Seminar LFA

limbaje formale si translaitoare

Seminar LFA

1.3.2 Automate cu stiv (push-down) Definiia 1.3.5. Se numete automat cu stiv un obiect matematic definit n modul urmtor: P = (Q, T, Z, m, qO, zO, F) unde: Q - este o mulime finit de simboli ce reprezint strile posibile pentru unitatea de control a automatului; T - este mulimea finit a simbolilor de intrare; Z - este mulimea finit a simbolilor utilizai pentru stiv; m - este o funcie, m : Q x (T u {X}) x Z -> P(S x Z*) (prin P(Q) s-a notat mulimea prilor lui Q) este funcia care descrie modul n care se obine starea urmtoare i j informaia care se introduce n stiv pentru o combinaie (stare, intrare, coninut stiv) | dat; qO s Q este starea iniial a unitii de control; zO e Z este simbolul aflat n vrful stivei n starea iniial; F c Q reprezint mulimea finit a strilor finale. Definiia 1.3.6. O configuraie de stare a automatului este un triplet (q, w, a) e Q x T* x Z* unde: q - reprezint starea curent a unitii de control; w - reprezint partea din banda de intrare care nu a fost nc citit. Dac w = X nseamn c s-a ajuns la sfritul benzii de intrare; a - reprezint coninutul stivei. automatului este relaia |- definit asupra mulimii [ urmtor: (q, aw, za) |- (qF, w, Pa) unde (q1, P) e m(q, a, z),qe Q,aeTu{l},weT*,zeZ,aeZ*, fieZ*. Dac a * X nseamn c, dac unitatea de control este n starea q, capul de citire este pe simbolul a iar simbolul din vrful stivei este z atunci automatul poate s i schimbe configuraia n modul urmtor: starea unitii de control devine q', capul de citire se deplaseaz cu o poziie la dreapta iar simbolul din vrful stivei se nlocuiete cu p. Dac a = X nseamn c avem o A.-tranziie pentru care simbolul aflat n dreptul capului de citire pe banda de intrare nu conteaz (capul de citire nu se va deplasa), ns starea unitii de control i coninutul memoriei se pot modifica. O astfel de tranziie poate s aib loc i dup ce s-a parcurs ntreaga banda de intrare. 44 Dac se ajunge ntr-o configuraie pentru care stiva este goal nu se mai pot executa tranziii. 44

Relaia j- se poate generaliza la |-\ |-*, |-*, ntr-o manier similar relaiei de derivare pentru forme prepoziionale. Definiia 1.3.8. O configuraie iniial pentru un automat cu stiv este o configuraie de forma (qO, w, zO) unde w e T*. O configuraie final este o configuraie de forma (q, X, a) cu q F, a e Z*. e Definiia 1.3.9. Spunem c un ir w este acceptat de un automat cu stiv prin stri finale dac (qO, w, zO) |-* (q, X, a) pentru q e F i a e Z * . Mulimea irurilor acceptate de un automat cu stiv se noteaz cu L(P). Definiia 1.3.10. Spunem c un ir w este acceptat de un automat cu stiv prin stiv goal dac (qO, w, zO) |-* (q, X, X) pentru q e Q. Limbajul acceptat de un automat pushdown P n acest mod se noteaz cu Le(P). Propoziie. Dac L(P) este limbajul acceptat de automatul P prin stri finale atunci se poate construi un automat pushdown P' astfel nct L(P) = Le(P'). Propoziie. Dac Le(P) este limbajul acceptat de automatul P prin stiv goal atunci se poate construi un automat pushdown P' astfel nct Le(P) = L(P'). Propoziie. Mulimea limbajelor acceptate de automate cu stiv este mulimea limbajelor independente de context.

Probleme

S se determine limbajul acceptat de urmtorul automat cu stiv: PD = ({qO, ql, q2, q3}, {a, b, c}, {a, b, c, z}, m, qO, z, {q3 }) m(qO, a, z) = { (qO, az) } m(qO, a, a) = {(qO, aa)} m(qO,c,a)={(ql,a)} m(ql,b,a)={(ql,A.)} m(ql,b,z)={(ql,bz)} m(ql,b,b)={(ql,bb)} m(ql,c,b)={(q2,b)} m(q2,b,b)={(q2,X)} m(q2, X, z) = { (q3, X) } S; Soluie: Evoluia automatului PD pentru un anumit ir de intrare poate fi caracterizat n modul urmtor: din starea iniial qO se poate face o tranziie dac irul ncepe fie cu simbolul a fie cu simbolul c. Se observ c simbolii a sunt introdui n stiv. Fie n numrul de simboli a din prefixul irului de intrare, deci irul de intrare poate fi de forma: w = a" ev unde n > 0, iar v este un sufix al irului de intrare. n continuare, se trece n starea ql n care poate urma doar simbolul b n irul de intrare i pentru fiecare simbol b de pe banda de intrare, se descarc un simbol a din vrful stivei.

45

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Deci, numrul de simboli b care poate urma dup c este tot n, iar w este de forma; w = a"cb u, u este un sufix al irului de intrare. Simbolul care poate urma pe banda de intrare n momentul n care stiva este vid (s-au descrcat toi simbolii a din stiv) este tot b. n continuare, pot apare doar simbolii b care se introduc n stiv. Fie m numrul acestora. n m Configuraia n acest moment a prefixului analizat din irul de intrare este: w = a" c b b x, unde x este restul din ir rmas neanalizat. Se observ c din starea ql, dac pe banda de intrare nu urmeaz un b, poate urma doar un c. Se trece n starea q2 n care sunt acceptai doar simboli b pe banda de intrare. Ori de cte ori apare un b pe banda de intrare, se descarc un b din vrful stivei. n momentul n care stiva s-a golit, se trece n starea finala q3. Deci irurile acceptate de automat sunt de forma: w = a n cb n b m cb m cum,n>0. Pentru irul de intrare aacbbbcb, micrile efectuate de automat sunt: (qO, aacbbbcb, z) |- (qO, acbbbcb, az) |- (qO, cbbbcb, aaz) |- (ql, bbbcb, aaz) |- (ql, bbcb, az) |- (ql, bcb, z) |- (ql, cb, bz) |- (q2, b, bz) Hq2,A,z)|-(q3,Aa) deci irul este acceptat. prohlcm 1.3-14 S se construiasc automatul cu stiv care accept urmtorul limbaj: L = { w c w R | w e {a,b}*} Soluie: Vom folosi n construcia automatului PD care accept limbajul L faptul c irul de intrare este simetric i are numr impar de simboli, simbolul din centru fiind c. Prin urmare, pentru a putea stabili dac irul de intrare poate fi acceptat sau nu, trebuie memorat prima jumtate a irului (pn se ntlnete simbolul c) n stiv i apoi comparat cu a doua jumtate a irului (vom compara simbolul analizat n mod curent de pe banda de intrare cu simbolul din vrful stivei; dac sunt egali, se descarc stiva). Prin urmare, automatul cu stiv care accept limbajul L, este: PD = ({qO, ql, q2 }, {a,b,c}, {a,b,c,z},m,qO,z, {q2}) m(qO,d,e)={(qO,de)} V d e {a,b},Vee {a,b,z} m(qO,c,d)={(ql,d)}Vde{a,b,z} m(ql,d,d)={(ql,A)}Vde{a,b} m(qU,z)={(q2,A.)} Comentarii: Se observ ca automatul este determinist i acceptarea este prin stri finale.

Soluie: ]vfumrul de simboli 0 este mai mare sau egal dect numrul de simboli 1. Vom proceda n mod analog exemplului precedent introducnd iniial n stiv toi simbolii 0 din prima parte a irului i ulterior descrcnd stiva pentru fiecare simbol 1 ntlnit pe banda de intrare. Condiia ca un ir s fie acceptat este ca stiva s nu se goleasc nainte de a ajunge la sfritul irului. Rezult deci automatul: = ({q0,ql,q2}, { 0,1 }, { 0,z },m, qO,z, { q2
m

(q0,0,a)={(q0,0a)}Vae {O,z} (q0,l,0)={(ql,X)} m(ql,l,O)={(ql,X)} m(ql,^a)={(q2,X)}Vae{0,z}


m

Verificare: Pentru irul de intrare 00011, evoluia automatului este: (qO, 0001 l,z)i-(q0,0011, Oz) |-(q0,011,00z) j-(qO, ll,000z) |-(ql, l,00z) |-(ql,A,0z) |-(q2,A,z) prin urmare irul este acceptat. De asemenea, pentru irul de intrare 011, evoluia automatului este:

funcia de tranziie nu este definit n acest caz, prin urmare irul nu este acceptat (starea ql nu este de acceptare). Comentarii: Automatul PD este nedeterminist deoarece exist dou tranziii din starea ql nedistinctibile:

m(qU,0)={(q2,A.)}

problema 1.3-16 S se construiasc automatul cu stiv care accept urmtorul limbaj: L={O i l j |O<j i} S se construiasc automatul cu stiv pentru limbajul generat de urmtoarea gramatic: s -aSb|aAb A->c

46 47

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Soluie: Putem construi un automat cu stiv care accept limbajul generat de gramatic prin stiv goal: PD' = ({ qO }, { a, b, c }, { a, b, c, S, A }, m, qO, S, { }), m(qO, X, S) = { (qO, a S b), (qO, a A b) }, m(qO, , A ) = { ( q O , c ) } , m ( q O , x , x ) = { ( q ( U ) } V x e {a,b,c} O alt soluie se poate obine considernd un automat cu stiv extins (n acest caz considerm c stiva crete spre dreapta): PD" = ({qO, ql}, {a, b, c}, {a, b, c, z, S, A}, m, qO, z, {ql }), m(qO, x, X) = {(qO, x)} V x e {a, b, c } , m(qO, X, aSb) = {(qO, S)} m(qO, X, aAb) = {(qO, S)}, m(qO, X, c) = {(qO, A)}, m(qO, X, zS) = {(ql, X)} Verificare; Pentru irul de intrare aacbb, se obin evoluiile celor dou automate: (qO, aacbb, S) |- (qO, aacbb, aSb) |- (qO, acbb, St) |- (qO, acbb, aAbb) |- (qO, cbb, Abb) |- (qO, cbb, cbb) |- (qO, bb, bb) |- (qO, b, b) |- (qO, X, X) iar pentru a doua variant: (qO, aacbb, z) |- (qO, acbb, za) |- (qO, cbb, zaa) |-(qO, bb, zaac) |- (qO, bb, zaaA) |-(qO, b, zaaAb) |- (qO, b, zaS) |-(qO, X, zaSb) |- (qO, X, zS) |-(ql, X, z) problema 1.3-17 S se construiasc automatul cu stiv care accept urmtorul limbaj: L = {w | w conine un numr egal de a i b} Soluie: Vom utiliza aceeai tehnic ca i n problemele precedente i anume: deoarece numrul de simboli a este egal cu numrul de simboli b din irul de intrare, putem introduce n stiv toi simbolii a, dac irul ncepe cu a, respectiv toi simbolii b, dac irul ncepe cu b. n continuare, de fiecare dat cnd pe banda de intrare se afl un simbol diferit de cel din vrful stivei se descarc stiva, altfel se introduce n stiv. irul este acceptat dac n final stiva este vid. Rezult: PD = ({qO},{a,b},{a, b,z},m,qO,z, {qO}), m(qO, x, z) = {(qO, xz)} V x e { a , b } , m(qO,x,x) = {(qO,xx)} Vx e { a , b } , m ( q O , x , y ) = { ( q ( U ) } V x , y e {a,b}x #y,m(qO,X,z)= {(qO,z)} O alt soluie se poate construi observnd c limbajul L este generat de gramatica: S-> a S b S | b S a S | X(vezi, de exemplu, Problema 1.1.6 din paragraful 1.1.1.). Prin urmare putem construi un automat cu stiv care accept limbajul L prin siv goal: PD' = ({qO}, {a, b } , {a, b, S } , m, qO, S, {}), m(qO, X, S) = {(qO, a S b S), (qO, b S a S),(qO, X)}, m(qO, c, c) = {(qO, X)} V c e {a, b} n fine, o a treia soluie se poate obtine considernd un automat cu stiv extins (n acest caz considerm stiva crete spre dreapta): PD" = ({ qO, ql }, { a, b }, { a, b, z, S }, m, qO, z, { ql }), m(qO, x, X) = {(qO, x ) } V x 6 { a, b }, n # , X, X) = {(qO, S ) } , m(qO, X, aSbS) = {(qO, S ) } , m(qO, X, bSaS) = {(qO, S)}, m(qO, X, zS) = {(ql, X)}

Verificare: Pentru irul de intrare abbbaa, se obin evoluiile celor trei automate: (qO, abbbaa, z) |- (ql, bbbaa, az) |- (ql, bbaa, z) |- (ql, baa, bz) |- (ql, aa, bbz) | sau: (qO, abbbaa, S) |- (qO, abbbaa, aSbS) |- (qO, bbbaa, SbS) |- (qO, bbbaa, bS) |- (qO, bbaa, S) |- (qO, bbaa, bSaS) |- (qO, baa, SaS) |- (qO, baa, bSaSaS) |- (qO, aa, SaSaS) |- (qO, aa, aSaS) |- (qO, a, SaS) |- (qO, a,aS) |- (qO, X, S)

iar pentru ultima variant:

(qO, abbbaa, z) |- (qO, bbbaa, za) |- (qO, bbbaa, zaS) |- (qO, bbaa, zaSb) |- (qO, baa, zaSbb) |-(qO, aa, zaSbbb) |- (qO, aa, zaSbbbS) |-(qO, a, zaSbbbSa) |- (qO, a, zaSbbbSaS) |-(qO, a, zaSbbS) |-(qO,A,,zaSbbSa) |- (qO, X, zaSbbSaS) |- (qO, X, zaSbS) |-(q(U,zS)|-(ql,A,z)
Comentarii: Considernd noiunea de derivare putem s introducem dou noi notaii. Derivarea stnga este o derivare n care se nlocuiete ntotdeauna cel mai din stnga neterminal n timp ce ntr-o derivare dreapta se nlocuiete ntotdeauna cel mai din dreapta neterminal. Ultimele dou variante corespund derivrilor stnga, respectiv dreapta,^le irului de intrare. S => aSbS => abS => abbSaS => abbbSaSaS => abbbaSaS => abbbaaS = abbbaa Respectiv: S => aSbS => aSbbSa => aSbbSa => aSbbbSaSa => aSbbbSaa=> aSbbbaa => abbbaa 1.3-18 S se construiasc automatul cu stiv care accept urmtorul limbaj: L={anbm|n l,m l,n msaum<2*n} Soluie: Deoarece ntre numrul de simboli a (n), respectiv numrul de simboli b (m) exist fie relaia n < m (cazul 1), fie relaia m < 2 * n (cazul 2 ) , vom trata cele dou cazuri n acelai mod: se depun n stiv toi simbolii a de pe banda de intrare prin simpla copiere n stiv (cazul 1), deci vom avea n stiv cei n simboli a sau prin duplicare (cazul 2), caz n care vor exist n stiva 2 * n simboli a. n continuare, att n cazul 1 ct i n cazul 2 se descarc stiva pentru fiecare simbol b de pe banda de intrare. n cazul 1 se trece n starea de acceptare dac nu s-a ajuns la sfritul irului nainte de a se goli stiva, iar n cazul 2 daca la terminarea irului, stiva este nevid. Prin urmare, un automat PD care accept iimbajulLeste: PD = ( { q 0 , ql, q 2 , q3, q4, q5, q6 }, {a,b}, {a, z},m, qO, z, {q3, q6}) m(qO, a, z) = {(ql, az), (q4, aaz)}

48

481

49

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

(tratare cazul 1:) | m(ql, a, a) = { (ql, aa) }, m(ql, b, a) = { (q2, A)}, m(q2, b, a) = { (q2, A) } : m(q2, X, z) = { (q3, z)} cazul n = m, m(q2, b, z) = { (q3, z) } cazul n < m ' m(q3, b, z) = { (q3, z) } (tratare cazul 2:) j m(q4, a, a) = {(q4, aaa) }, m(q4, b, a) = { (q5, X)}, m(q5, b, a) = {(q5, A,) } m(q5, X, a) = { (q6, X)} Verificare: Pentru irul de intrare aabbb se obine urmtoarea evoluie a automatului cu stiv: (qO, aabbb, z) |- (ql, abbb, az) |- (ql, bbb, aaz) |- (q2, bb, az) |- (q2, b, z) |- (q3, X, z) sau (qO, aabbb, z) |- (q4, abbb, aaz) |- (q4, bbb, aaaaz) j- (q5, bb, aaaz) |- (q5, b, aaz) |- (q5, X, az) |- (q6, X, z) Deci irul aabbb este acceptat de automat. Pentru irul de intrare aabb, evoluia automatului PD este: (qO, aabb, z) |- (ql, abb, az) |- (ql, bb, aaz) |- (q2, b, az) |- (q2, X, z) |- (q3, X, z) sau (qO, aabb, z) |- (q4, abb, aaz) |- (q4, bb, aaaaz) |- (q5, b, aaaz) |- (q5, X, aaz) |- (q6, X, az) Deci irul aabb este acceptat de automat conform ambelor condiii. Pentru irul aabbbb evoluia automatului este: (qO, aabbbb, z)J- (ql, abbbb, az) |- (ql, bbbb, aaz) |- (q2, bbb, az) |( q 2,bb,z)|-(q3,b,z)|-(q3,A,z) Deci irul este acceptat de automat (conform primei condiii). De asemenea, pentru irul de intrare aab, evoluia automatului este: (qO, aab, z) |- (ql, atf, az) |- (ql, b, aaz) |- (q2, A., az) i n acest caz nu mai este aplicabil nici o tranziie sau: (qO, aab, z) |- (q4, ab, aaz) |- (q4, b, aaaaz) j- (q5, X, aaaz) |- (q6, X, aaz). Adic irul este acceptat de automat (conform condiiei a doua). problema 1.3-19 S se construiasc automatul cu stiv care accept urmtorul limbaj: L = { an bm an | n, m >= 1 } u { an bm cm | n, m >= 1 } Soluie: Deoarece limbajul specificat de L este de fapt reuniunea a doua limbaje, va trebui ca n specificarea automatului PD s realizm nite mecanisme prin care s fie acceptate iruri din ambele limbaje. Astfel, irurile nu pot ncepe dect cu simbolul a. Toi simbolii a din prefixul irului se introduc n stiv. De asemenea, toi simbolii b care urmeaz sunt introdui n stiv. In continuare: Dac urmtorul simbol de pe banda de intrare (dup ce s-au epuizat n m toi simbolii b) este a, atunci se ncearc acceptarea unui ir de forma: a b a", caz n care se descarc toi simbolii b din stiv i se verific dac numrul de simboli a din stiv este egal cu numrul de simboli a rmai pe banda de intrare. Dac urmtorul simbol de pe banda de intrare este c, se ncearc acceptarea unui ir de forma: an bm cm, caz n care se verific dac numrul de simboli c din sufixul irului este egal cu numrul de simboli b din stiv. n final, se descarc din stiv toi simbolii a.

Rezult automatul: PD = ({ qO, ql, q2, q3, q4, q5, q6}, {a, b, c}, {a, b, z}, m, qO, z, { q5 }) i (ncarcsimbolii a i b n stiv:) : m(qO, a, z) = {(ql, az)}, m(ql, a, a) = {(ql, aa)}, m(ql, b, a) = {(ql, ba)} .m(ql,b,b) = {(ql,bb)} (varianta 1:) : rn(ql, a> b) = { (i^, A,)} am consumat un simbol a de la intrare : m(q2, X, b) = {(q2, X)} descarc simbolii b din stiv : m (q2, a, a) = {(q3, X)} m(q3, A, ,a) = {(q4, A-)} scot un a din stiv ce corespunde simbolului a consumat n starea ql m(q4!a,a)={(q4,A)} : m (q4, X, z) = {(q5, z)} stare final (varianta 2:) m(ql, c, b) = {(q6, A.) }, m(q6, c, b) = { (q6, A) }, m(q6, X, z) = { (q5, z) } (descarc simbolii a din stiv:) ; m(q4, A,, a) = {(q4, A.)}, m(q4, A, z) = {(q5, z)} (stare final)

problem:! 1.3-20 S se construiasc automatul cu stiv care accept limbajul expresiilor aritmetice cu paranteze Soluie: Vom considera c exist dou stri ql, respectiv q2 pentru care sunt valabile urmtoarele semnificaii: ql este starea de start. Att timp ct pe banda de intrare simbolul analizat este "(", se copiaz n stiv. Dac simbolul de pe banda de intrare este a, se trece n starea q2. n starea q2, dac simbolul de pe banda de intrare este operator (+, *), se trece n starea.ql. Dac simbolul este ")", se descarc din stiv un simbol "(" Rezult automatul PD = ({ ql, q2, q3 }, { a, +, *, (,)}, { z, (}, m, ql, z, { q3 }), m(ql, (, x) = { (ql, (x) } x e { (, z }, m(ql, a, x) = { (q2, x) } x e { (, z } m(q2, ),()={ (q2, A) }, m(q2, y, x) = { (ql, x)} y e { + , * } , m(q2, X, z) = { (q3, X) } Verificri:: Pentru irul de intrare a+a*(a+(a)*a), evoluia automatului este: : (ql, a+a*(a+(a)*a), z) |- (q2, +a*(a+(a)*a), z) |- (ql, a*(a+(a)*a), z) ; |- (q2, *(a+(a)*a), z) |- (ql, (a+(a)*a), z) |- (ql, a+(a)*a),(z) : |- (q2, +(a)*a),(z) |- (ql, (a)*a), (z) |- (ql, a)*a), ((z) j-(q2,)*a), ((z) |- (q2, *a), (z) |- (ql, a), (z) |-(q2,), (z) |-(q2, A, z) |-(q3, A, X)

Comentarii: irurile sunt acceptate prin stiv goal.

50

50

51

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

1.3.3 Maina Turing Definiia 1.3.11. Se numete main Turing obiectul matematic: MT = (Q, T, m, q0) unde Q este o mulime finit a strilor mainii Turing, hg Q; T este alfabetul finit de intrare care conine simbolul # dar nu conine simbolii L i R; m este funcia de tranziie m : Q x T -> (Q u {h}) x (T u {L, R}). qo e Q este starea iniial a mainii Turing. Dac q e Q, a e T i m(q, a) = (p, b) nseamn c fiind n starea q, avnd simbolul a sub capul de citire maina trece n starea p. Dac b e T atunci simbolul a va fi nlocuit cu b, altfel capul se va deplasa cu o poziie la stnga sau la dreapta n funcie de valoarea simbolului b 6 {L, R}. Se observ c maina Turing a fost definit ca un acceptor determinist. Definiia 1.3.12. O configuraie pentru o main Turing este (q, a, a, /?) notat i (q, aay?)undeq e (Qujh}), ae T*, a e T, J3e (T* (T - {#}) u {X}) n care q este starea curent a este irul aflat pe banda de intrare la stnga capului de citire / scriere a este simbolul aflat sub capul de citire / scriere /? este irul aflat la dreapta capului de citire / scriere. Definiia 1.3.13. Relaia de tranziie |- se definete asupra configuraiilor n modul urmtor. Fie (ql, wl, al, ui) i (q2, w2, a2, u2) dou configuraii. Atunci: (ql,wl,al,ul) |- (q2sw2,a2,u2) dac i numai dac exist b e T u{L, R} astfel nct m(ql, al) = (q2, b) i este ndeplinit una din urmtoarele condiii: 1. b e T, wl = w2, ui = u2, a2 = b; 2. b = L, wl = w2a2 dac al * # sau ui * X u2 = al ui altfel u2 = X 3. b = R, w2 = wlal daca ui = X u2 = X a2 = # altfel ui = a2 u2 Un calcul efectuat de o maina Turing este o secven de configuraii cO, ci, ..., cn astfel nct n > 0 i cO |- ci |-... |- cn. Se spune despre calcul c are loc n n pai. O main Turing poate s fie utilizat i ca acceptor de limbaj. i anume s considerm un limbaj L definit asupra alfabetului T care nu conine simbolii #, D i N. Fie dL : T* -* {D, N} o funcie definit n modul urmtor - pentru V w e T * Ddacw GL dL(w) = \ N dac w 0 L 52 52

Se spune ca limbajul L este decidabil n sens Turing (Turing decidable) dac i numai dac funcia dL este calculabil Turing. Dac dL este calculat de o maina Turing MT spunem ca MT decide L. Noiunea de acceptare este mai larg dect noiunea de decidabilitate n legtura cu limbajele. i anume dac L este un limbaj asupra alfabetului T, spunem ca limbajul L este Turing acceptabil dac exist o maina Turing care se oprete dac i numai dac w e L. Propoziie. Limbajele Turing decidabile sunt i Turing acceptabile. Reciproca nu este ns adevrat. Definiia 1.3.14. O schem de main Turing este tripletul *F = (M, r\, MO) unde M este o mulime finit de maini Turing care au toate un alfabet comun T i mulimi de stri distincte; MO e M este maina iniial; T] este o funcie parial, r\ : M x T-> M. O schem de main Turing reprezint o maina Turing T compus din mainile care formeaz mulimea M. Funcionarea acesteia ncepe cu funcionarea mainii MO. Dac MO se oprete atunci poate continua eventual funcionarea conform altei maini din M. Dac MO se oprete cu capul de citire / scriere pe caracterul a atunci exist urmtoarele situaii: t|(M0, a) este nedefinit, n acest caz se oprete; -n(M0, a) = M', n acest caz funcionarea continu cu starea iniial a mainii M'. 4> = (M, r|, MO) o schem de main Turing reprezint maina MT = (Q, T, m, s) unde Q = QOu...uQku{qO,..., qk} s = sO m este definit n modul urmtor: a. dac q e Qj, 0 < i < k, a e T i nij(q,a) = (p, b), p * h atunci m(q, a) = iij(q, a) = (p, b); b. dac q e Qb 0 < i < k, a e T i mi(q, a) = (h, b) atunci m(q, a) = (qi, b); c. dac r|(Mi, a) (0 < i < k, a e T) este nedefinit atunci m(qi, a) = (h,a); d. dac r)(Mi, a) = Mj (0 < i < k, a e T) i mj(sj, a) = (p, b) atunci (p,b) m(qi, a) = \

(qj,b)p = h

Propoziie. Adugarea unor faciliti la definiia Mainii Turing ca de exemplu : banda de intrare infinit la ambele capete; mai multe capete de citire / scriere; mai multe benzi de intrare; band de intrare organizat n dou sau mai multe dimensiuni (eventual ca o memorie); nu crete puterea de calcul oferit. Nu se schimb nici clasa funciilor care pot s fie calculate i nici a limbajelor acceptate sau decise. 53

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Probleme
problema 1.3-21 ', Fie maina Turing MT = ( {qO, ql, q2}, {a, #}, m, qO) cu m(qO,a) = (ql,L) m(qO, #) = (qO, #) ;m(ql,a) = (q2,#)
:m(ql,#) = (h,#) . , .

Descriei n cuvinte transformarea efectuat de urmtoarea maina Turing. MT = ({qO, ql, q2}, {a, b, #}, m, qO) cu m(qO, x) = (qO, x) x e {a, b} arbitrar m(qO,#) = (ql,L) m(ql,a) = (ql,L) m(ql,b) = (ql,L) m(ql,#) = (q2,b) m(q2,a) = (q2R) m(q2,b) = (q2,R) m(q2,#) = (h,#) Soluie: S considerm de exemplu comportarea pentru configuraia iniial (qO, #ab#). (qO, #ab#) |- (ql, #ab#) |-+ (ql, #ab#) |- (q2, bab#) |-+ (ql, bab#) |- (h, bab#) Maina transform o band de intrare de forma #w# n bw#.

m(q2, a) = (ql, a) m(q2,#) = (qO,L) care este evoluia mainii dac pleac din configuraia iniial: (qO, #an a) n > 0 ?
; Soluie: S presupunem c n este un numr impar de exemplu n = 1. n acest caz evoluia mainii Turing este:

(qO, #aa) |- (ql, #aa) j- (q2, ##a) |- (qO, ##a) se aga : Dac n este par, de exemplu 2 atunci: ! (qO, #a2a) j- (ql, #aaa) |- (ql, #a#a) |- (qO, #a#a) j- (ql, #a#a) |- (h, #a#a) Deci maina se oprete pentru iruri de forma: #a a i le transform n #a#a...#a. Pentru 2k+l iruri de forma #a a maina nu se oprete. prohkma 1.3-22
! ; 2k

Considernd reprezentarea unar a numerelor naturale, care este funcia pe numere naturale : calculat de urmtoarea main Turing: MT = ( {qO, ql, q2, q3}, {I, #}, m, qO) cu m(qO,#) = (ql,L) m(qO, I) = (qO, I) arbitrar m(ql,#) = (h,R) m(ql,I) = (q2,#) m(q2,#) = (q3,L) m(q2,1) = (q2,1) arbitrar m(q3,#) = (h,R) m(q3,I) = (h,#)

S se construiasc maina Turing care accept limbajul L = { w e {a, b}* j w conine doi simboli a consecutivi}.

Soluie: Se pleac din starea iniial qO i se merge spre dreapta, dac se ntlnete un simbol a se va trece ntr-o stare nou i se continu deplasarea la dreapta. Maina se va opri pe al doilea ; simbol a ntlnit. MT = ({qO,ql},{a,b,#},m,qO)cu ;m(qO,a) = (ql,R) i m(qO, x) = (qO, R) x e {b,#} i m(ql, a) = (h, a) | m(ql,x) = (qO, R) x e {b, #} 54

Soluie: S considerm cteva exemple de evoluie. (qO, ##) |- (ql, ## ) |- (h, ## ), (qO, #I#)|- (ql, #I# )|- (ql, ### )|- (q3, ##)|- (h, ## ) i (qO, #In#)|- (ql, #I""'I# )l- (q2, #r{##)\- (q3, #In"2I#) |- (h, #In"2# ) ; 0 n<2 Se observ c f(n) = "! : n- 1 n >= 2 54

55

limbaje formale si translatoare

Seminar LFA

limbaie formale si translatoare

Semrnar LFA

proMt-niii 1.3-2^ S se construiasc maina Turing care decide limbajul: L = {w e {a, b}* | w conine cel puin un simbol a}. Soluie: Maina Turing trebuie s lase pe banda de intrare rspunsul D sau N dup cum irul aparine sau nu limbajului. : MT = ( {qO, ql, q2, q3, q4, q5, q6, q7, q8}, {a, b, #}, m, qO) cu m(qO,#) = (ql,L) m(ql,a) = (q3, #) a gsit :m(ql,b) = (q2,#) ; m(ql, #) = (q7, R) captul din stnga nu a gsit m(q2, #) = (ql, L) mai caut m(q7, #) = (q8, N) a scris rspuns NU ; m(q8, N) = (h, R) gata ' m(q3, #) = (q4, L) mai terge i m(q4, #) = (q5, R) captul din stnga a gsit ''. m(q4, x) = (q3, #) x e {a, b} mai terge i m(q5, #) = (q6, D) a scris rspuns DA ; m(q6, D) = (h, R) gata

pinlili-ni.i 1 -2"

S se construiasc maina Turing care decide limbajul: L = {w e {a, b} | ]w| este divizibil cu 2}. Soluie; MT = ( {qO, ql, q2, q3, q4, q5, q6, q7, q8}, {a, b, #}, m, qO) cu m(qO,#) = (ql,L) m(ql,x) = (q2,#)xe{a,b} m(q2,#) = (q3,L) m(q3,x) = (q4,#)xE{a,b} m(q4,#) = (ql,L) m(q3, #) = (q7, R) scrie N pe banda de intrare m(q7,#) = (q8,N) m(q8,N) = (h,R) m(ql, #) = (q5, R) scrie D pe banda de intrare m(q5 #) = (q6,D) m(q6,D) = (h,R)

problema 1.3-26 S se construiasc maina Turing care accept limbajul: L = {w e {a, b} | w conine cel puin un simbol a}. Soluie: Maina Turing trebuie s se opreasc dac i numai dac irul de pe banda de intrare aparine limbajului. Iniial pe banda de intrare se afl irul sub forma #w# iar n final dac irul aparine limbajului pe banda de intrare trebuie s se gseasc #w#. MT = ( {qO, ql, q2}, {a, b, #}, m, qO) cu m(qO, #) = (ql, L) m(ql,b) = (ql,L) m(ql, a) = (q2, R) m(q2, x) = (q2, R) x e {a, b} m(q2, #) = (h, #)

S se construiasc maina Turing care avnd alfabetul de intrare T = {a. b, #}, nlocuiete aurile cu b-uri i invers. Iniial pe banda de intrare se afl irul #w#, iar n final trebuie s fie #w'# (w' irul modificat). Soluii': M 1 i :q<!. qi. ql. u.\). !a. l\ "1. r.\. qiu cu m(qO,#) = (ql,L) m(ql, a) = (q2, b) nlocuiesc a cu b m(ql, b) = (q2, a) nlocuiesc b cu a m(q2, x) = (ql, L) x e {a, b}, m deplasez spre stnga dup nlocuire m(ql, #) = (q3, R) am ajuns la marginea din stnga a irului, m ntorc la marginea din dreapta irului m(q3, x) = (q3, R) x e {a, b} m(q3,#) = (h,#) problema 1.3-29 S se construiasc MT compus care calculeaz f(x, y) = x + y, unde x i y sunt numere naturale

56

56

57

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Soluie: Considerm c pentru x, y i rezultat se utilizeaz reprezentarea unar utiliznd simbolul 1. Iniial banda de intrare conine #x#y#, n final banda va conine #x+y#. Maina Turing se va deplasa cu o poziie la stnga. Dac simbolul curent este # (y = 0) atunci i ea se va opri (banda de intrare va conine rezultatul). Dac simbolul curent este I (y * 0), ; atunci fiecare I din y va fi deplasat cu o poziie la stnga.

Fie x i y numere naturale. S se construiasc maina Turing compus care calculeaz funcia x y x > y

x< y

Verificare:
(q, ###)

l - (q, (q, (q, (q, (q, (q, (q, (q, (q, (q, (q, (q, (q, (q, (q, (h, (q, (q, (q, (q, (q, (q, (q, (q, (q, (q, q, (q, (q, (h,

i - (h, ###; ##II#) ##II#) #|II#) #IH#) #III#) #I#I#) #I#I#) #I#I#)

Considerm c pentru x, y i rezultat se utilizeaz reprezentarea unar utiliznd simbolul I. Iniial pe banda de intrare se afl #x#y#, iar n final va trebui s fie #x-y# pentru x y i ## pentru x < y. Pentru a realiza operaia de scdere maina Turing trebuie s tearg, de la dreapta la stnga, cte un simbol I din y. Corespunztor simbolului I ters din y trebuie ters un simbol I din x, tot de la dreapta la stnga. Dup care procedeul se repet. Dup ce s-a ters (a fost nlocuit cu #) un simbol I din y, respectiv x, nu mai tim care este simbolul # ce delimita cele dou numere. Corespunztor pentru fiecare nlocuire este necesar s cunoatem captul din dreapta a fiecrui ir (x i y), pentru care irurile de pe banda de intrare sunt transformate nainte de efectuarea operaiei de scdere sub forma axaya_(se introduce un nou simbol a care va delimita cele dou numere). Dup ce s-a ters un simbol I din y i se ncerc tergerea unui simbol I din x se poate ntmpla s nu mai existe I n x, caz n care trebuie teri toi simbolii I din y (cazul y > x). n final simbolurile a ce au fost introduse pentru a delimita cele dou numere trebuie refcute cu #. Maina Turing compus care calculeaz funcia f(x, y) este:

x = 0 i y = 2
(q, ##II#)

y= I

V=j
*

| #II##) #II|#) #II#) #II#II#)

=a

x=a x=l x= R3#


- * #

R, # L, # L, # R, # R, # R *

x = 2 i y = 2
(q, #II#II#)

#III#I#) #III#I#) #III#I#) #III#I#) #IIII##) #IIII##)

prnhli-m.i 1.3-31 S se construiasc maina Turing care accept limbajul: L={we

58

58

59

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Soluie: Pentru a se verifica #a( w) = #t,( w) = #c( w) se caut de la stnga la dreapta primul a, dup care tot de la stnga la dreapta primul b, respectiv primul c. La fiecare cutare (un simbol a, b, respectiv c) dac simbolul respectiv este gsit, atunci acesta va fi ters. Pentru a terge fiecare simbol gsit a, b, respectiv c se va folosi un simbol d g {a, b, c} (dac tergerea s-ar realiza cu # nu am mai ti care este captul din dreapta al irului iniial). Maina Turing se oprete dac irul de pe banda de intrare aparine limbajului L. Pentru aceasta nainte de a cuta a, b, respectiv c trebuie s vedem dac primul simbol cutat la dreapta (diferit de d) nu este #, caz n care irul aparine limbajului, deci maina Turing se oprete. Pentru iruri care nu aparin limbajului maina va cicla cutnd la dreapta un simbol a sau b sau c.

=#
RCl)

tfDLCO

=#
R0) Pentru a copia o singur dat pe x, dup simbolul a pe banda bl vom scrie maina Turing compus copy, care lucreaz numai cu banda bl. Iniial bl conine #wa#, iar n final #waw# sau iniial bl conine #waw'#, iar n final #waw'w#_(w' reprezint irul w copiat de un : : numr de ori). Maina Turing compus care realizeaz copierea este:

x!=#

Halt

S se construiasc maina Turing care calculeaz funcia f(x, y) = x * y, unde x i y sunt numere naturale Soluie: Considerm c pentru x, y i rezultat se utilizeaz reprezentarea unar utiliznd simbolul 1. Vom construi maina Turing cu dou benzi: bl conine #x# i b2 conine #y#, rezultatul va fi pe bl #x*y#. Sunt posibile urmtoarele situaii: l.Dacx = Oiy 0 rezultatul nmulirii este 0. 2.Dacx 0 i y=0 trebuie tears banda 1. Dac x 0 i y 0 atunci va trebuie copiat de y - 1 ori coninutul iniial al benzii 1 la sfritul benzii 1. Pentru a pstra valoarea iniial de pe banda 1 se marcheaz sfritul irului cu a, iar n final dup terminarea calculrii nmulirii se nlocuiete a cu I i se mut cu o poziie la stnga sfritul irului de pe banda 1. Astfel maina Turing testeaz mai nti dac x = 0 sau y = 0, caz n care rezultatul este 0.

problem 1.3-33 S se construiasc maina Turing care decide limbajul: L- {vw\ j w e {a. b] * ] Soluie: Pentru a determina n mod determinist mijlocul irului se folosete un caracter c care se propag spre stnga irului. Pentru a verifica dac cele dou "jumti" ale irului, delimitate de simbolul c, sunt egale se vor folosi dou benzi. 1. se propag simbolul c pe banda bl spre stnga cu o poziie i apoi se copiaz pe banda bl pe banda b2 (copierea se face parcurgnd banda bl de la stnga la dreapta, iar banda b2 de la dreapta la stnga) 2. se compar cele dou jumti gsite (banda bl este parcurs de la stnga la dreapta pornind iniial de la simbolul c, banda b2 este parcursa de la dreapta la stnga). Compararea are loc pn se ntlnete pe banda 1 #. Dac cele dou jumti astfel determinate sunt egale trebuie tears banda 1 i se scrie D. Dac cele dou jumti determinate nu sunt egale se propag cu nc o poziie la stnga pe banda 1 simbolul j c, dup care se repet copierea pe banda 1 i apoi compararea. Propagarea la stnga cu o poziie a simbolului c pe banda 1 are loc pn se ntlnete # (marginea din , stnga a irului), caz n care banda 1 este tears i trebuie scris N. j 60

60

limbaje formale si translatoare

Seminar LFA'

limbaje formale si translatoare

Seminar LFA

Pentru aceasta se vor construi mainile Turing compuse: copy pentru a realiza copierea pe banda 2 cmp pentru a compara cele dou jumti gsite copy (maina Turing compus de copiere) De exemplu: Iniial bl:#abbabcb# b2:##

l=

dup copiere bl: #abbabcb# b2: #bcbabba#

Maina Turing care decide limbajul L este:

I *<<> =
cmp (maina Turing compus de comparare) Fie cmp maina Turing compus care compar cele dou jumti delimitate de simbolul c. Cele dou jumti se afl pe banda bl, respectiv banda b2. Iniial: bl:#abbabcb# b2: #bcbabba# Banda bl este parcurs de la stnga la dreapta, iar banda b2 de la dreapta la stnga. n final: bl:#abbabcb# b2: #bcbabba# Dac cele dou jumti sunt egale: Iniial bl:#abbcabb# t>2: #bbacbba# n final: bl:#abbcabb# b2: #bbacbba#

cmp

R(1) NO) RtD

R(1)

00) RC)

problema 1.3-34 S se construiasc maina Turing compus care decide limbajul: L = { w e {a, b} * | w= wR } Soluie: Iniial banda de intrare conine #w#, iar n Ikul !^ sau #N#, dup cum w aparine sau nu limbajului L. Se verific egalitatea simbolilor de pe poziii egale fa de capetele irului. Pe msur ce se parcurge irul caracterele se terg i se nlocuiesc cu #.

62

62

63

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

2 Lex - generator de analizoare lexicale


lex este un generator de analizoare lexicale prezent n orice versiune UNIX. Fa de varianta standard (anii 70 - '80) exist numeroase variante mai noi. Cea mai cunoscut variant se numete flex (Fast lexical analyzer generator) i face parte dintre instrumentele realizate de FSF (Free Software Foundation) n cadrul proiectului GNU (GNU is Not UNIX). Spre deosebire de lex pentru flex (ca i pentru alte programe din domeniu public) programul surs este disponibil, i n acelai timp performanele exprimate n timp de execuie i memorie ocupat sunt mai bune. Din acest motiv n cele ce urmeaz vom prezenta de fapt varianta flex. lex poate s fie utilizat n programare i pentru alte aplicaii dect scrierea de compilatoare. Astfel, ori de cte ori un program trebuie s identifice n fiierul de intrare iruri de caractere avnd o structur de tip "atom lexical" (adic numere ntregi sau reale n diferite formate, cuvinte cheie, identificatori, caractere speciale, etc.) pentru care se execut aciuni speciale, putem s folosim o funcie generat de lex. Un generator de programe este de fapt un translator care realizeaz traducerea unui text care reprezint specificaiile programului ce trebuie generat (sursa) ntr-un text scris ntr-un limbaj de programare (obiect). n cazul lex-ului generarea analizorului lexical utilizeaz i un cod fix care reprezint emulatorul automatului determinist corespunztor. Cu alte cuvinte algoritmul de analiz propriu-zis. n cazul lex-ului acest cod este scris n C, i programele generate vor fi programe C. Formularea "execuia programului lex" se refer printr-un abuz de limbaj la execuia programului generat pe baza specificaiilor i nu la execuia programului care realizeaz traducerea. Pentru a obine un program executabil din textul generat de ctre lex, textul C generat trebuie s fie compilat (utiliznd un compilator de C) obinndu-se un modul obiect. Specificaiile surs pentru lex constau dintr-o descriere a unitilor lexicale ce urmeaz s fie recunoscute de ctre programul generat. Pentru fiecare unitate lexical se specific eventual i o aciune reprezentat de o secven de cod C care urmeaz s se execute la recunoaterea unui ir ce corespunde formei generale. Dac specificaia este corect atunci se va genera un fiier lex.yy.c (lexyy.c sub MS-DOS). n cadrai acestui fiier apare cel puin o funcie numit yylexO c a r e reprezint de fapt analizorul lexical. Execuia acesteia realizeaz cutarea n irul de intrare a unui subir care s "se potriveasc" cu unul din modelele descrise n specificaii. Dac un astfel de ir este gsit atunci se va executa aciunea asociat modelului respectiv. Pentru a nelege modul n care se utilizeaz programul lex trebuie s precizm cteva lucruri. i anume, funcionarea oricrui analizor lexical are o parte fix care nu depinde de modelele de atomi lexicali cutate n irul de intrare. Algoritmul corespunztor este de fapt simularea unui automat finit determinist. Aceast parte constituie scheletul analizorului lexical. Acest schelet este un text scris n limbajul C. Partea care variaz de la un analizor lexical la altul are de fapt dou componente i anume modelele de atomi lexicali cutate n irul de intrare i aciunile pe care eventual analizorul lexical trebuie s le execute la identificarea unui ir care se "potrivete" cu un model de atom lexical. Specificaiile lex conin descrierea prii variabile. Deoarece ce se genereaz n final este un text C, aciunile sunt descrise ca secvene de instruciuni C. n aceste secvene pot s apar orice instruciuni C inclusiv apeluri de funcii. Secvenele respective vor "mbrca" scheletul prii fixe. Specificarea modelelor de atomi 64 65

DR
NR

64

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

lexicali se face sub form de expresii regulate. Pornind de la ele programul lex va genera tabelele care descriu funcia de tranziie a automatului determinist corespunztor. Aceste tabele reprezint o parte din structurile de date pe care lucreaz "scheletul". Utiliznd "scheletul" i secvenele de instruciuni oferte de ctre programator programul lex va genera un text care reprezint analizorul lexical. Programul lex "nu nelege" nici scheletul i nici aciunile specificate de ctre programator, aceste elemente reprezint numai iruri de caractere pe care lex tie s le combine. n mod corespunztor cel care scrie specificaiile lex trebuie s aib n vedere aspecte ca domeniul de valabilitate al variabilelor utilizate n programul generat. i asta innd cont c exist de fapt dou tipuri de variabile, variabile pe care le controleaz numai cel care scrie specificaiile lex i pentru ele se face att declararea ct i utilizarea n cadrul secvenelor specificate de ctre programator i variabile care sunt declarate n cadrul scheletului (sunt predefmite din punct de vedere al celui care scrie specificaiile). Declararea acestor variabile apare n textul generat nainte de nceputul funciei yylex() Referirea acestora se poate face att n secvenele de cod care se execut asociat diferitelor modele de atomi (aceste secvene vor fi interne funciei yylex()) ct i n funcii care vor fi incluse n textul generat dup textul funciei yylex().

2.1 Expresii regulate. Structura unei specificaii lex.


n cele ce urmeaz vom numi program lex (flex) textul ce conine descrierea unitilor lexicale i a aciunilor corespunztoare. S considerm un exemplu foarte simplu pentru a oferi o idee despre cum arat specificaiile programele lex.
rcma 2-1

Nu este cel mai simplu program lex posibil. Conine ns majoritatea elementelor Unui program lex. Se observ c programul este format din trei seciuni separate de caracterele %%. Prima seciune poate conine text de program C care va fi copiat nemodificat n textul programului generat i macrodefiniii. Textul care se copiaz conine declaraiile de variabile i funcii ce vor fi utilizate n aciunile asociate irurilor recunoscute. Acest text trebuie inclus ntre caracterele %{ i respectiv %} (fiecare aprnd pe un rnd separat). Macrodefinitiile sunt utilizate pentru a scrie mai compact descrierea modelelor de atomi lexicali. Pentru exemplul considerat au fost definite dou nume cifra i litera. Primul nume are asociat o descriere a unei liste de caractere care conine numai cifre, n timp ce al doilea nume are asociat o list care conine orice liter (mare sau mic). Pentru caractere se consider ordonarea lexicografic obinuit. Conform acestei ordonri cifrele sunt caractere care au valori ntr-un interval n care '0' este cel mai mic iar '9' este cel mai mare, literele mici sunt caractere care au valori mai mari dect literele mari, literele mari i respectiv mici au valori n cte un interval astfel nct 'A' este caracterul cu valoarea cea mai mic dintre literele mari iar 'Z' este caracterul cu valoarea cea mai mare dintre literele mari, etc. Corespunztor definiia unei cifre este un caracter avnd codul cuprins n intervalul nchis [0-9] iar o litera este un caracter avnd codul cuprins n unul dintre intervalele [A-Z] i respectiv fazi, n programele lex utilizarea caracterelor este destul de rigid. Astfel dac definiia literei s-ar fi fcut sub forma: l i t e r a [A-Z a-z] atunci i caracterul blanc ar fi fost considerat liter. A doua seciune conine specificarea modelelor i a prelucrrilor asociate. Fiecare model este scris pe o linie separat ncepnd din prima coloan. Pe aceeai linie separat de un blanc sau un caracter de tabulare este specificat aciunea corespunztoare. A treia seciune conine text C care va fi copiat n programul generat. De obicei aici apar funciile referite n aciunile din seciunea a doua i care refer variabile predefmite. Deoarece n cazul nostru generm un program care se va executa independent (adic nu generm o funcie care va fi referit din alte module compilate) n seciunea a treia este coninut codul pentru programul principal. n programul principal se apeleaz funcia yylex() care va fi generat conform specificaiilor din a doua seciune. n exemplul considerat execuia funciei yylex() se termin cnd se ajunge la sfritul fiierului de intrare. n general dac funciile apelate n cadrul aciunilor sunt semnificative ca dimensiuni este de preferat ca acestea s apar n module de program compilate separat. n acest mod se simplific depanarea programului generat. Pentru descrierea unitilor lexicale ce urmeaz s fie recunoscute se utilizeaz expresii regulate. n acest caz o expresie regulat este interpretat ca un ablon (model) care descrie o mulime de iruri. Un astfel de ablon poate s fie utilizat pentru clasificarea irurilor de caractere n iruri care corespund sau nu ablonului. Pentru lex se utilizeaz a doua interpretare a expresiilor regulate. Adic, programul generat va identifica ntr-un ir de intrare subirurile care "se potrivesc" cu descrierile fcute n specificaii. n notaia utilizat de lex pentru reprezentarea expresiilor regulate se utilizeaz caracterele obinuite utilizate pentru limbajul C. O serie de caractere ca de exemplu: *, +, |, ? au semnificaie special n scrierea expresiilor regulate. Aceste caractere se numesc rnetacaractere. n afar de : *, +, I, ? se mai utilizeaz ca metacaractere:", \, {,}, A, <, >, $, /, (, ) n tabelul 2.1 > sunt coninute construciile lex n care se utilizeaz metacaractere. 67

/* declaraii de variabile utilizate in programul generat */ int numar_cifre = 0, numar__litere = 0; %} /* declaraii de macrodefiniii utilizate in specificarea regulilor */ cifra [0-9] litera [A-Za-z]

{cifra} { numar__cifre++; } {litera} { numr litere++;} main () { yylex(); printf("\n numr cifre = %i, numr litere = %i\n", numar_cifre, numar_litere) ;

Descriere; . Programul numr literele i cifrele care apar n fiierul de intrare. 66 66

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

notaie "ir" \x [lista]

[Alist]

e e$ <y>e e/f

e? e* e+ e{m,n} e{m,} e{m} e|f (x) {XX}

Semnificaie irul de caractere ir; chiar dac conine numai un metacaracter, de exemplu "*", permite specificarea blancurilor i mctacaracterelor n expresii regulate (n mod normal un blanc ncheie irul de caractere care descrie o expresie regulat). dac "x" este unul din caracterele speciale din limbajul C ca de exemplu t sau n arunci notaia reprezint caracterul respectiv, altfe) notaia reprezint caracterul "x" chiar dac este un metacaracter. unul dintre caracterele din list. Lista este format din caractere individuale sau din intervale. De exemplu [ABC] reprezint unul dintre caracterele A, B, C, iar [A-Za-z] reprezint orice liter. Dac primul caracter din list este ] sau - aiunci el este tratat ca atare (i pierde semnificaia de metacaracter). orice caracter mai puin cele din list. De exemplu [ A 0-9] nseamn orice caracter, cu excepia cifrelor. orice caracter mai puin caracterul linie nou (\n). un ir reprezentat de expresia regulat e dar numai la nceput de linie. un ir reprezentat de expresia regulat e dar numai la sfrit de linie. un ir reprezentat de expresia regulat e dac analizorul este n starea y (noiunea de stare va fi explicat ulterior). un ir reprezentat de expresia regulat e dac urmeaz un ir reprezentat de expresia regulat f. ntr-o expresie regulat poate s apar o singur dat aceast condiie (la sfritul expresiei). un ir reprezentat de expresia regulat e sau irul vid. 0,1,2,... apariii ale unor iruri reprezentate de expresia regulat e. 1,2,3,... apariii ale unor iruri reprezentate de expresia regulat e. ntre m i n apariii ale unor iruri reprezentate de expresia regulat e. cel puin m aparii i ale unor iruri reprezentate de expresia regulat e. exact m apariii ale unor iruri reprezentate de expresia regulat e. un ir de caractere provenind din expresia regulat e sau din expresia regulat f dac x un caracter atunci are acelai efect ca i includerea caracterului ntre ghilimele. Dac x este o expresie regulat atunci notaia poate s fie utilizat pentru schimbarea prioritii operatorilor utilizai. dac xx este un nume definit n prima seciune a unui program lex atunci notaia reprezint rezultatul substituirii numelui xx cu definiia asociata.

De exemplu expresia: [a-z][4-5]+/123+9 reprezint irul a444555555551233333339, dar nu reprezint irul a444555555551231231239, deoarece interpretarea expresiei este: ([a-z]([4-5]+))/(12(3+)9). Pentru a uura citirea textului programului i pentru a obine programe portabile ntre diferitele variante de lex trebuie s se utilizeze paranteze pentru stabilirea ordinii de considerare a operatorilor. Din Tabelul 2-1 mai rezult faptul c semnificaia unui metacaracter poate s depind de contextul n care acesta apare. Astfel, n expresia:

cele patru puncte care apar nu au toate aceeai semnificaie. Primul i ultimul reprezint un caracter oarecare (diferit de linie nou, dar care poate ns s fie i un punct). Al doilea punct indic faptul c pe a doua poziie n irul cutat poate s apar i un punct. Al treilea caracter precedat de metacaracterul \ indic faptul c pe poziia 3 trebuie s apar un punct. Rezult c att irul "a!.x" ct i irul".... "se potrivesc" cu expresia regulat. Dup cum am mai amintit un program lex este format din maxim 3 seciuni separate de o linie care conine caracterele %%. Structura general pentru un program este : secvene de cod care se copiaz n programul generat tracrodefiniii

I: i

reguli aa -secvene de cod care se copiaz n programul generat mprirea secvenei de cod care se copiaz n programul generat ntre cele dou seciuni se face n aa fel nct s se permit definirea variabilelor nainte de utilizare. Astfel toate variabilele definite de ctre programator i care urmeaz s fie referite n aciuni trebuie s fie definite n prima seciune. Dac n funciile care sunt apelate din aciuni apar referiri la variabile care vor fi definite n mod implicit n funcia yylex (de exemplu variabilele yytext sau yyleng) atunci aceste funcii trebuie s apar n a treia seciune a programului. Existena unor secvene de cod este opional. Secvenele de cod care apar n prima seciune sunt cuprinse ntre caracterele "%{" i respectiv "%}" coninute fiecare pe cte o linie separat. Este foarte important s se fac distincia ntre codul care este "neles" i prelucrat de ctre lex i cel care va fi neles de ctre compilatorul de C. Astfel lex nu face nici o verificare asupra textului cuprins ntre caracterele %{ i respectiv %}. Abia cnd se face compilarea programului generat de ctre lex se va face i verificarea acestor secvene. Prima seciune conine macrodefmiii utilizate pentru simplificarea scrierii modelelor. Forma general a unei macrodefiniii este: nome expresie regulat unde nume este un cuvnt care ncepe cu o liter sau caracterul"_" i continu cu litere, cifre sau caractere "-", "_"; expresieregulat este construit pe baza regulilor din Tabelul 2-1. Utilizarea unei macrodefiniii se poate face n orice expresie regulat care apare ulterior prin utilizarea numelui macrodefmitiei ntre acolade. 69

Tabelul 2-1 Mai exist o construcie special E O F , care apare numai in Qex i care reprezint condiia de sfrit de fiier. Aceast construcie nu poate s intre n compunerea unei expresii regulate. n Tabelul 2-1 au aprut o serie de operaii care sunt utilizate pentru formarea expresiilor regulate. Se pune problema care sunt regulile de preceden pentru aceste operaii. Din pcate aici apar diferene ntre lex i flex. n general ordinea operaiilor este n ordine descresctoare:

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Deoarece notaiile utilizate n expresiile regulate sunt destul de greoaie, este indicat utilizarea unor macrodefniii pentru a uura citirea acestora. De exemplu se poate considera pentru construirea expresiei regulate care reprezint un numr real secvena de macrodefniii:
c i f r a [0-9] semn [+-]? IntregFaraSemn {cifra}+ Exponent ([Ee]{semn}{IntregFaraSemn}) Real ({semn}{IntregFaraSemn}\.{IntregFaraSemn}?{Exponent}?)

sau direct:
Real [+-]?[0-9]+\. ([0-9]+)?([Ee] [+-] ?[0-9]+) ?

Cele dou definiii sunt echivalente ca efect, dar prima soluie este mai uor de urmrit. Regulile au forma general: expresie regulat aciune Expresia regulat este scris ncepnd din prima coloan a liniei pe care apare. Sfritul expresiei regulate este reprezentat de un caracter delimitator: blanc, linie nou, un caracter de tabulare, etc. Aciunea are forma unei instruciuni n limbajul C. Dac pentru o aciune sunt necesare mai multe instruciuni atunci ele vor fi grupate ntre caracterele "{" i "}". De fapt pentru claritate i pentru evitarea unor efecte laterale neplcute este de preferat s se ncadreze ntotdeauna aciunile ntre acolade. In orice caz aciunea trebuie s nceap pe linia pe care este scris expresia regulat. Dac pentru mai multe expresii regulate corespunde o aceeai aciune atunci se poate utiliza o notaie de forma: expresie_regulatl ] expresie_regulat2 | ... | expresie_regulatn aciune Pentru toate cele n expresii regulate se va executa aceeai aciune. Dintre cele trei seciuni este obligatorie numai seciunea de reguli, care trebuie ns s fie precedat de perechea de caractere "%%". Cel mai simplu text de specificaii conine numai aceste caractere. n acest caz efectul funciei generate const din tiprirea irului de intrare. 2.2 Elemente avansate Pentru a nelege modul n care se utilizeaz programul lex trebuie s precizm cteva lucruri. i anume, funcionarea oricrui analizor lexical are o parte fix care nu depinde de modelele de atomi lexicali cutate n irul de intrare. Algoritmul corespunztor este de fapt simularea unui automat finit determinist. Aceast parte constituie scheletul analizorului lexical. Acest schelet este un text scris n limbajul C la care se adaug o serie de variabile i structuri de date. Partea care variaz de la un analizor lexical la altul are de fapt dou componente i anume 70 70

modelele de atomi lexicali cutate n irul de intrare i aciunile pe care eventual analizorul lexical trebuie s le execute la identificarea unui ir care se "potrivete" cu un model de atom lexical. Specificaiile lex conin descrierea prii variabile. Deoarece ce se genereaz n final este un text C, aciunile sunt descrise ca secvene de instruciuni C. n aceste secvene pot s apar orice instruciuni C inclusiv apeluri de funcii. Secvenele respective vor "mbrca" scheletul prii fixe. Specificarea modeleelor de atomi lexicali se face sub form de expresii regulate. Pornind de la ele programul lex va genera tabelele care descriu funcia de tranziie a automatului determinist corespunztor. Aceste tabele reprezint o parte din structurile de date pe care lucreaz "scheletul". Utiliznd "scheletul" i secvenele de instruciuni oferite de ctre programator, programul lex va genera un text care reprezint analizorul lexical. Programul lex "nu nelege" nici scheletul i nici aciunile specificate de ctre programator, aceste elemente reprezint numai iruri de caractere pe care lex tie s le combine. n mod corespunztor cel care scrie specificaiile lex trebuie s aib n vedere aspecte ca domeniul de valabilitate al variabilelor utilizate n programul generat, i asta innd cont c exist de fapt dou tipuri de variabile, variabile pe care le controleaz numai cel care scrie specificaiile lex i pentru ele se face att declararea ct i utilizarea n cadrul secvenelor specificate de ctre programator i variabile care sunt declarate n cadrul scheletului (sunt predefinite din punct de vedere al celui care scrie specificaiile). Declararea acestor variabile apare n textul generat nainte de nceputul funciei yylexQ Referirea acestora se poate face att n secvenele de cod care se execut asociat diferitelor modele de atomi (aceste secvene vor fi interne funciei yylex()) ct i n funcii care vor fi incluse n textul generat dup textul funciei yylexQ2.2.1 Funcionarea analizorului lexical generat de lex Analizorul lexical generat este de fapt o funcie yylex(). n execuia acestei funcii se parcurge textul de intrare i se caut un subir care ncepe cu primul caracter i "se potrivete" cu o expresie regulat specificat n reguli. Dac exist mai multe soluii se va lua n considerare cel mai lung subir care "se potrivete". Pentru mai multe soluii avnd aceeai lungime se consider soluia care a fost gsit prima (n ordinea de parcurgere secvenial a regulilor). n cazul expresiilor regulate care descriu i contextul dreapta al irului analizat (de exemplu expresiile regulate care termin cu $ sau care conin condiii de tip-/) n determinarea lungimii "de potrivire" particip i contextul dreapta. De exemplu pentru expresiile: "ab" {printf(" s-a recunoscut ab");} "abc" {printf(" s-a recunoscut abc");} "ab'V'cc" {printf(" s-a recunoscut ab urmat de ce");} pentru irul abec se va afia textul: s-a recunoscut ab urmat de ce Variabila global yytext este un pointer spre nceputul irului care "s-a potrivit". Lungimea irului este memorat n yyleng. Dup ce se actualizeaz valorile variabilelor yytext i yyleftg. conform identificrii unei expresii regulate se va executa aciunea asociat expresiei, care poate s utilizeze variabilele yytext i yyleng. 71

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

Dup execuia aciunii asociate unui subir gsit se va continua parcurgerea irului de intrare ncepnd cu caracterul care urmeaz subirului selectat. Dac nu se gsete un subir care s se potriveasc cu o regul se execut aciunea implicit, adic se va copia caracterul curent n fiierul de ieire. Din acest motiv dac acest efect nu este dorit trebuie s se prevad o ultim regul de forma:
|\n /* se potrivete cu orice caracter */

2.2.3 Macrodefiniii, funcii i variabile predefinite n cadrul aciunilor pot s apar orice instruciuni C valide, deoarece generatorul de programe lex nu face nici o analiz a acestora. Exist ns cteva macrodefiniii lex predefmite care pot s apar n orice aciune. n discuia despre stri am ntlnit deja una dintre aceste macrodefiniii (BEGIN). Mai exist alte dou macrodefiniii: ECHO i REJECT. Efectul apelului macroinstruciunii ECHO const din copierea valorii yytext la ieire. Cu alte cuvinte, efectul acestei macroinstruciuni const din copierea la ieire a subirului pentru care se execut aciunea. Macroinstruciunea REJECT este utilizat atunci cnd se dorete modificarea algoritmului de alegere a subirului care "se potrivete". i anume s-a precizat c dac exist mai multe soluii se alege cel mai lung subir. n caz de egalitate, dicteaz ordinea n care au fost scrise expresiile regulate. Dac se utilizeaz macroinstruciuea REJECT se renun la cea mai bun soluie i se consider a doua. A se vedea programele 2.7. - 2.9. Se recomand ns s se evite utilizarea macrodefmiiei REJECT deoarece reduce viteza programului generat i n acelai timp conduce la programe greu de citit. n aciuni se pot utiliza i o serie de funcii predefmite: yymoreO adaug ca prefix la urmtorul ir care "se potrivete" irul pentru care se execut aciunea curent (irul indicat de yytext). Vezi programul 2.10. yyless(n) se renun la ultimele yyleng - n caractere din yytext care vor fi reutilizate pentru formarea subirului urmtor. Vezi programul 2.11. unput(c) caracterul c este "pus" n bufferul de intrare devenind urmtorul caracter de intrare. Vezi programul 2.12. inputO citete un caracter din irul de intrare. Aceast funcie permite amestecarea recunoaterilor de subiruri fcut de ctre analizor cu cea fcut n cadrul aciunilor. Vezi programul 2.13. yyterminate() - este de fapt o macroinstruciune care poate s fie redefinit, reprezint o instruciune return. Ca efect se abandoneaz execuia funciei yylex(), adic se produce o revenire forat din analizor. n mod implicit la ntlnirea sfritului de fiier se produce execuia acestei macroinstruciuni. 2.2.4 Fiiere de intrare multiple n toate exemplele considerate pn acum fiierul de intrare a fost considerat n mod implicit fiierul standard de intrare. Dar, pentru situaiile reale, fiierul de intrare este un fiier disc. Din acest motiv este necesar un mecanism de specificare a fiierului pe care analizorul generat l va prelucra. Variabila yyin conine ntotdeauna numele fiierului din care se citete textul prelucrat de ctre analizorul generat. Vezi programul 2.14. Tratarea fiierelor multiple depinde de modul n care acestea sunt utilizate n timp. Evident exist dou situaii. n prima situaie este vorba de o nlnuire de fiiere (adic dup ce este tratat un fiier se trece la al doilea apoi la al treilea etc. n orice caz nu este necesar o revenire la un fiier anterior). n a doua situaie trecerea la un nou fiier se face nainte de a se termina prelucrarea fiierului curent. La terminarea prelucrrii unui fiier se face revenirea la fiierul 73

care va "nghii" orice caracter care nu "s-a potrivit". n continuare se va ncerca gsirea unei "potriviri" ncepnd cu urmtorul caracter, etc. A se vedea programele 2.2. - 2.4. 2.2.2 Stri de start Pentru toate exemplele considerate pn acum analizorul generat ncearc n ordine toate regulile specificate pentru a determina cel mai lung subir care "se potrivete" cu o regul. Uneori n funcie de context anumite reguli trebuie s fie ignorate. n acest scop ntr-un program lex se pot utiliza stri de start. Dac nu se specific altfel, analizorul este n starea 0 numit simbolic INIIAL. Se pot declara i alte nume de stri n prima seciune sub forma: hs numei sau
% x

numen

numen

n primul caz dac o aciune este prefixat de <numep atunci aciunea respectiv se va executa numai dac starea curent este numej. n acelai caz toate aciunile care nu au nici un prefix vor fi luate n considerare indiferent de starea curent. A doua notaie nu este recunoscut de lex dar este recunoscut de flex i de alte variante ale programului lex. Dac declararea numelui strii s-a fcut cu x (starea nume; este denumit n acest caz stare exclusiv) atunci aciunile care nu au prefixul <numep nu vor fi executate dac starea curent este nume-j. Se poate prefixa o regul i cu o list de stri. n acest caz regula va fi considerat dac starea curent este una dintre strile din list. Trecerea dintr-o stare n alta se face prin apelarea unei macrodefiniii predefmite BEGIN. Forma de apel a acestei macrodefmiii este:
BEGIN(nume);

unde nume este numele strii n care trebuie s treac analizorul generat. A se vedea programele 2.5. - 2.6. Utilizarea strilor exclusive este de preferat celor obinuite pentru c mresc claritatea programului. Strile exclusive exist ns numai n flex. Pentru lex se poate obine o comportare de tip stare exclusiv utiliznd o variabil din programul generat care va fi testat nainte de fiecare verificare. 72 72

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare itiain() {

Seminar LFA

anterior (ca de exemplu dac se trateaz directiva #include). S considerm situaia n care se face o nlnuire a fiierelor. In acest caz ceea mai bun soluie este utilizarea funciei yywrap. Aceast funcie este apelat n mod automat de ctre analizorul generat n momentul n care se detecteaz un sfrit de fiier. Dac rezultatul apelului funciei este unu nseamn c nu exist un alt fiier de tratat i execuia funciei yylex s-a terminat. Dac rezultatul apelului funciei este zero nseamn c prelucrarea nu s-a terminat. n acest ultim caz funcia yywrap realizeaz i comutarea yyin pe noul fiier de intrare. Vezi programul 2.15. 2.3 Exemple comentate
1 : 1 : 2-2 1111

yylex();

Descriere: terge apariiile irului de caractere "terge" din text i nlocuiete irul "alfa" cu "beta", respectiv "gama" cu "delta". Dac se utilizeaz un fiier de intrare de forma: alfa terge alfa alfa beta gama delta Se va obine un fiier de ieire de forma: beta beta beta beta delta delta Comentarii: , ' ' . ' . :. .'-"' . ... n program se utilizeaz cele dou forme echivalente de reprezentare a irurilor de caractere. S considerm i o modificare a programului anterior: %% terge ; "alfa"+ gama+
9-2

blanc [ \t]+ %% {blanc} { printf (" ");}. {blanc}$ { printf("#");/* ignor blancurile de la sfrit */ } main() { yylex();} Descriere; ~ Programul nlocuiete secvenele de blancuri i caractere de tabulare ("\t") cu cte un singur blanc. De asemenea terge blancurile de la sfritul liniilor nlocuindu-le cu un caracter #. Adic pentru un fiier de intrare de forma: a bc a b d se va obine un fiier de ieire de forma: a b c# abd# . . . :

printf(' beta"); printf{' delta");

main(){ yylex (); } ' . . De data aceasta dac vom executa programul generat asupra fiierului de intrare: alfaalfa terge alfaaaaaaaaaaaaaaaa gamagama terge gamaaaaaaaaaaaaaaaa Se va obine fiierul de ieire: beta betaaaaaaaaaaaaaaaa deltadelta delta Se observ c operatorul "+" se aplic n primul caz asupra ntregului ir ("alfa"+) respectiv asupra ultimului caracter, n al doilea caz (gama+). Aciunile asociate expresiilor regulate pot s conin instruciuni de forma return expresie. In cazul n care se produce o "potrivire" ntre un ir de caractere i un astfel de model execuia funciei yylex se termin i se "ntoarce" valoarea expresiei. n cazul n care nu se execut o astfel de instruciune se continu parcurgerea irului de intrare pn cnd acesta se termin. S considerm tema 2-4. pentru care fiecare aciune se ncheie cu o instruciune return. 74 75

Comentarii: Se observ c o secven de blancuri aflat la sfritul unei linii satisface ambele reguli, dar este luat n considerare cea de a doua regul care se potrivete subirului mai lung (cel care conine i caracterul linie nou, care nu este ns luat n considerare).

terge "alfa" gama

{ printf("beta"); } { printf ("delta"); }

74

limbaje formale si translatoare

Semmai LFA

limbaje formale si translatoare

Seminar LFA

<0KMATOR>{litera}+ { if ( !strcmp(a, yytext)) numr aparitii++; /* declaraii de inacrodefiniii utilizate n specificarea regulilor */ cifra [0-9] semn [+-]? IntregFaraSemn {cifra}+ Exponent ([Ee]{semn}{IntregFaraSemn}) Real ({semn}{IntregFaraSemn}\.{IntregFaraSemn}?{Exponent}?) {cifra} {numr cifre++;} main() { yylex() ; printf(primul cuvnt %s apare de %i ori\n au fost %i cifre", a, numr apariii, numr cifre); free(a); }

% % main () {

. { return - 1 ; } \n { return -2; }

{Real} { printf("real\n"); return yyleng;} {IntregFaraSemn} { printf("intreg\n"); ; return yyleng;}

Descriere: Programul numr apariiile primului cuvnt (ir care conine numai litere) dintr-un text n textul care urmeaz. De asemenea, programul contorizeaz i cifrele care apar n text. A fost declarat o stare numit URMTOR TIVIVIWI n jLvi execuia macroinstruciunii:
BEGIN (URMTOR) ;

Comentarii:

printf("lungime = %i\n", yylex());

si.iiv c^iv comandat prin

Descriere: Executnd programul generat asupra irului de intrare: 123.56 Se va obine fiierul de ieire:
real lungime = 6

apelat pentru aciunea corespunztoare gsirii primului cuvnt. Dac se execut analizorul generat asupra fiierului de intrare:
123$ % &456 abbb bribnbnb abb nbnbnb abbb nbnbnbn abbbbbbbbbb 789 abbb hjhjhjhjh abb

se va obine fiierul de ieire:


primul cuvnt abbb apare de 3 ori au fost 9 cifre

Comentarii: n programul 2.4 sunt tratate toate cazurile. Adic dac primul caracter care apare n fiierul de intrare nu reprezint un nceput de numr ntreg sau real atunci analiza se oprete cu rezultat -l iar pentru caracterul linie nou rezultatul este -2. #ina 2-5

Dac programul se schimb prin declararea strii URMTOR ca stare exclusiv execuia programului generat pentru acelai fiier de intrare va produce: 789
primul cuvnt abbb apare de 3 ori au fost 6 cifre

char * a; int numar_aparitii = 0, numar_cifre = 0; %} litera [A-Za-z] cifra [0-9] %s URMTOR %% <INITIAL>{litera}+ { a = malloc(yyleng); strcpy(a, yytext); numar_aparitii = 1;
BEGIN (URMTOR);

Cifrele nu au fost luate n considerare dect atta timp ct starea curent a fost starea INIIAL.
t i 111.1 2-(i
x COMENTARIU {

int NumarLinieComentariu = 0; int NumarLinieProgram = 0;

76

76

77

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

/*" { BEGIN(COMENTARIU); ++NumarLinieComentariu; } <CXMENTARIU>[A*\n]* /* se ignora orice nu este ,*'sau \n */ <CCMENTARIU>"*''+P*An]* {/* se ignora orice * care nu este urmat de ,/' sau linie noua */ } <CCMENTARIU>\n ++NumarLinieComentariu; <CCMENTARIU>" *"+"/" BEGIN (INIIAL) ; \n ++NumarLinieProgram;

Descriere: , . . Dac se execut programul generat pentru programul asupra unui fiier de intrare care conine textul:
acesta este un test ciudat

se va obine textul:
acesta este un test ciudatacesta este un testacesta este unacesta esteacesta C&mmKarik

main{) { yylex(); printf(au fost %i linii de comentariu \n", NumarLinieComentariu); printf(au fost %i linii de program\n", NumarLinieProgram);

Se observ c nti s-a "potrivit" cel mai lung subir pentru care s-a executat aciunea ECHO care 1-a tiprit apoi s-a executat aciunea REJECT prin care s-a renunat la soluia respectiv. Se va considera urmtorul subir (mai scurt). i pentru acesta se execut aciunea { ECHO; REJECT} deci se va face afiarea, etc. Macrodefiniia REJECT este util dac pentru un acelai ir trebuie s se execute dou aciuni diferite. De exemplu n programul 2.8. se recunosc cteva cuvinte cheie, dar n acelai timp se face i contorizarea tuturor cuvintelor care apar n text (inclusiv cuvintele cheie). tenia 2-8

Beseriere: Programul generat numr liniile ce conin comentarii respectiv text obinuit" ntr-un program. Comentariile ncep i se termin cu caracterele /*" respectiv */". Comentarii: ^ La nceputul comentariului i la sfritul su se face comutarea ntre strile INIIAL i COMENTARIU. n starea COMENTARIU se ignor orice caracter mai puin caracterele *" i respectiv \n". Pentru caracterul *" se verific ce caracter urmeaz. Se ignor irurile de caractere *" care nu sunt urmate de /" sau de \n". Cazul n care urmeaz caracterul /" corespunde sfritului de comentariu, caracterele \n" sunt tratate separat.. Pentru caracterele \n" se face incrementarea numrului de linii din comentariu. Se observ c o linie este contorizat fie ca linie program fie ca linie comentariu dup cum caracterul \n a fost ntlnit n starea INIIAL sau n starea URMTOR. Dac comentariul este inclus ntr-o linie care conine i text de program dup el atunci linia respectiv va fi contorizat att ca linie program ct i ca linie comentariu.
}

int NumarCuvinte = 0;

cuvnt [A-Za-z][A-Za-zO-9] * %% .... . bun | rau | urit | frumos { ECHO; printf" este adjectiv\n"); REJECT;} maninca | doarme I scrie I ' ' . . citete { ECHO; printff" este verb\n"); REJECT;} {cuvnt} { NumarCuvinte++;} /* ignor orice altceva */

%% acesta" 1 acesta este" I acesta este un" ! acesta este un test" | acesta este un test ciudat" { ECHO; REJECT;} /* sg ignor ce nu se potrivete */ main () { yylex 0 r }

main () { yylex(); prinf("\n au fost %i cuvinte\n", NumarCuvinte);


}

Descriere: .

- '

'

* -

Dac se execut programul generat pentru programul asupra unui fiier de intrare care conine textul: , aaa bun Se va obine textul:
bun este adjectiv au fost 2 cuvinte

78

78

limbaje formale si translatoare

Seminar T-FA

limbaje formale si translatoare

Seminar LFA

Comentarii: Subirul "aaa" se potrivete cu a treia regula, deci el este numrat. Pentru subirul "bun", acesta se potrivete cu prima regula, deci se afieaz mesajul corespunztor i se execut ! macrodefmiia REJECT, adic se renun la potrivirea gsit. Urmtoarea potrivire aleas este regula a treia n care se numr cuvintele. Deci n final numrul de cuvinte este 2.

REJECT se va ncerca cu alt variant i aceasta este potrivirea cu a doua regul pentru care se consider aceeai lungime. Aceast regul "nghite" subirul "bun" care deci este numrat o singur dat. tema 2-10 Cuvnt [A-Za-z]* CuvintSpecial {Cuvnt}"$" CuvintObisnuit {Cuvnt}[\t \n]+
%S DUP

int NumarCuvinte = 0;
%} c u v i n t [-Za-z][A-Za-zO-9]* % % {cuvint} { NumarCuvinte++; REJECT;} bun I rau I urit I frumos { ECHO; printfC este adjectiv\n") ; } maninca I doarme I scrie | citete { ECHO; printff" este verb\n");} /* ignora orice altceva */ %% main (){ yylex(); printf("\nau fost %i cuvinte\n", NumarCuvinte);

% % < I N I T I A L > { C u v i n t S p e c i a l } { BEGIN(DUP); p u t c h a r ( ' ( ' ) ; } <INITIAL>{CuvintObisnuit} / * s e i g n o r a * / <DUPA>{CuvintObisnuit} { y y m o r e O ; } <DUPA>{CuvintSpecial} { y y t e x t [ y y l e n g -1] = ' ) ' ; ECHO; BEGIN(INIIAL);

main(){ yylex();

Deseriere: S presupunem c schimbm ordinea regulilor i poziia macroinstruciunii REJECT din 2. ca in programul curent. Pentru acelai text de intrare ca n tema 2-8: aaa bun se va obine un text de ieire ca:
bun este adjectiv au fost 7 cuvinte

I
f

Descriere: Programul generat extrage irurile de caractere cuprinse ntre caractere "$" din irul de intrare i le copiaz la ieire ntre paranteze simple. Astfel pentru irul: a$a b$c a $a b$c aa$ a b$c aa$ a b $c aa$ a b $ c se va obine:
(a b) (a b) ( a b) ( a b ) ( a b )

Comentarii: Soluia din program nu este unic, nici mcar nu este cea mai simpl, dar nelegerea ei reprezint un bun exerciiu.
Unu 2-11
%s DUP Cuvnt [A-Za-z]* CuvintSpecial {Cuvnt}"$" CuvintObisnuit {Cuvnt}[\t \n]+

Comentarii: ' ' .. ' " . , v : . ' .' , " Rspunsul pare ciudat, dar ceea ce se ntmpl de fapt este c nti subirul "aaa" se potrivete cu prima regul, deci el este numrat, apoi se renun la aceast soluie i se caut ! alt "potrivire". Se va gsi o potrivire pentru un ir mai scurt "aa", deci i acest cuvnt se numr. Iar se renun, urmeaz o potrivire cu subirul "a", deci contorul ajunge la 3. n acest -'. caz cu prima regul nu mai exist nici o potrivire, nici cu a doua, dar a treia regul reuete I s "nghit" un "a". Se continu de la al doilea caracter "a". La terminarea parcurgerii ; subirului "aaa" contorul este 6. n cazul subirului "bun" dup ce prima regul a executat macrodefimia ' 80 . 80

81

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

<INITIAL>"$" { BEGIN(DUPA); putchar ('('); } <INITIAL>{CuvintObisnuit} /* se ignora ce a mai rainas */ <INITIAL>{CuvintSpecial} { yyless(yyleng - 1); } <DUPA>"$" { BEGIN(INIIAL); yytext[yyleng -1] =')'; ECHO; } <DUPA>{CuvintObisnuit} { y y m o r e ( ) ; } % % main(){ yylex() ;

Comentarii: . " Se observ c subirul recunoscut abcde a fost "prelungit" dar numai la un capt, primul caracter care este "dat napoi" (")") nlocuiete ultimul caracter din subir "e". Apelul yyless(yyleng -1) este echivalent cu unput(yytext[yyleng - 1]).

Descriere: O soluie mai complicat cu efect similar cu 2.10. Comentarii: Se folosete n acest caz funcia yyless pentru a extrage caracterul "$

"/*" { int c; for(;;){ while((c = inputO) != '*' && c ! = EOF) ; /* se ignora ce nu poate sa fie sfrit */ if (c = '*') {

while ((c = inputO) = '*')


if (c = '/') { break; /* s-a gsit sfrit */ printf(" a fost comentariu\n") ;

Cuvnt ([a-zA-Z][a-zA-ZO-9]*) CuvintSpecial (\ ({Cuvnt}\)) {Cuvnt} {


int i;

if (c = EOF) { printf(" comentariu neterminat \n"); break;

'

.

.

printf("l leng = %i, text = %s\n", yyleng, yytext); unput (')'); for (i = yyleng - 1; i >= 0; i ) unput(yytext[i]); unput('('); . . . '. printf("2 leng = %i, text = %s\n", yyleng, yytext);

Descriere: Un exemplu de utilizare al funciei input() n tratarea comentariilor cuprinse ntre caractere duble cum sunt cele din limbajul C.

{CuvintSpecial} | \(\) ECHO; main () { yylex();

2-14 %{ #define #define #define #define #define #define #define #define #define

Descriere: Dac se execut pentru irul de intrare


abcde

J 5

LT LE EQ NE GT GE IF
THEN ELSE

se va obine:
1 leng = 5, text = abcde 2 leng = -l, text = abcd) (abcd)

ttdefine
#define

ID
NUMR

0 1 2 3 4 5 10 11 12 13 14

82

82

83

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

#define #define

OPREL ATRIB

15 16

int yyval; char x[30]; /* tabela de simboli ( o intrare) */

Descriere: Programul reprezint specificaiile flex pentru un subset al limbajului Pascal. Analizorul va recunoate identificatori i numere, pentru care va apela funcii corespunztoare i o parte din operatorii i cuvintele cheie care pot s apar ntr-un program Pascal. Comentarii: Funcia TratareNumar ar fi putut s fie inclus i n prima seciune de program deoarece nu refer variabile ce nu au fost nc definite. n schimb funcia Tratareld utilizeaz variabilele yytext i yyleng, deci nu poate s apar dect n a treia seciune de program. Programul principal este mai complicat fa de variantele anterioare i anume, nainte de apelul funciei yylex se va stabili valoarea variabilei yyin care poate s fie stdin sau un nume specificat de utilizator. linia 2-15

/* macroinstruciuni */ DELIMITATOR [ \t\n] {DELIMITATOR}+ BLANC litera [A-Za-z] [0-9] ifra {litera}({litera}|{cifra})* id

numr

{cifra}+(\.{cifra}+)?(E[+-]?{cifra}+)?

{BLANC}

if then else {id}

{ /* nici o aciune */} { printf (" I F " ) ; } { printf(" THEN"); } { printf(" ELSE"); } { yyval = TratareldO; printf("%i, %i", yyval,ID); { yyval = TratareNumar(); printf("%i, %i", yyval,NUMR); { { { '{ { { { yyval yyval yyval yyval yyval yyval yyval = LT; printf(" %i, %j = LE; printf(" %i, %J = EQ; printf (" li, %i = NE; printf(" %i, %: = GT; printf(" %i, %: = GE; printf(" %i, li = ATRIB; printf (" %i, yyval,OPREL);} yyval,OPREL);} yyval,OPREL);} yyval,OPREL);} yyval,OPREL);} yyval,OPREL);} ", yyval, ATRIB),

fundef yywrap int NumarCaractere = 0, NumarCuvinte = 0, NumarLinii= 0;

BLANC NOBLANC

[ \t] [ A \t\n]

{numr}

"o"

{NOBLANC}+NumarCaractere += yyleng; ++NumarCuvinte; {BLANCJ+ NumarCaractere += yyleng; \n ++NumarLinii; ++NumarCaractere; E O F yyterminate () ;

int TratareNumar(void){ printf("\n numr"); return 1;


main( int argc, char **argv ){ ++argv, argc; if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex ();

char **ListaFisiere; unsigned int FisierCurent = 0; unsigned int NumarFisiere; main{ int argc, char **argv ) { FILE *fiier; ListaFisiere = argv + 1; NumarFisiere = argc -1; if (argc > 1) { FisierCurent = 0; fiier = fopen(ListaFisiere[FisierCurent], " r " ) ; if (!fiier){ printf("!!!eroare!!!"); exit(l); } yyin = fiier; yylex () ;

84

84

85

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

/* Noua definiie yywrap */ yywrap(){ FILE *fisier; fiier = 0; fclose(yyin); printf("\nFisier %s", ListaFisiere[FisierCurent++]); printf("\nNumar caractere = %8d", NumarCaractere); printf("\nNumar cuvinte = %8d", NumarCuvinte); printf("\nNumar linii = %8d", NumarLinii); NumarCaractere = 0; NumarCuvinte = 0; NumarLinii = 0; if .(FisierCurent > NumrFiiere) return 1; fiier = fopen(ListaFisiere[FisierCurent], " r " ) ; if (!fiier){ printf("!!! eroare!!!"); exit(l); } yyin = fiier; return(fiier ? 0:1);

3 Teme pentru acas


tema 3-1 Sase scrie gramaticile ce genereaz limbajele: n j k L = { (ab) a'b c | n >= 0, i, j, k > 0} i n j k = L { a (ab) b c |i>=0,n,j,k>0} L = { aVcVb)" | j >= 0, n, i, k > 0} i i n k L = { a b (ab) c | k >= 0, n, j, i > 0} L = { w e {a, b} #a(w) par si #b(w) impar} L = { w e {a,b}* #a(w) par si #b(w) par} L = { w e {a,b}* #a(w) impar si #b(w) par} L-{ w G {a, b}* #a(w) impar si #b(w) impar} L={ w e {a,b} w nu conine irul baab } L = { w e {a, b} w nu conine irul abba} L={ w e {a,b} w nu conine irul bbaa } w nu conine irul abbb } w e {a, b}*

Descriere: Programul calculeaz numrul de caractere, cuvinte i linii coninute ntr-o list de fiiere transmise prin linia de comand prin care este apelat programul generat. n programul principal se face deschiderea primului fiier. La fiecare apel al funciei yywrap se va face nchiderea fiierului precedent, afiarea rezultatelor obinute pentru acesta i deschiderea fiierului urmtor. Dup fiecare deschidere de fiier variabila global yyin este poziionat pe indicatorul fiierului deschis. n momentul n care s-a ajuns la sfritul listei funcia yywrap va avea rezultatul 1 i execuia funciei yylex se termin. Comentarii: Se observ c a fost necesar utilizarea directivei: #undef yywrap pentru a se putea defmii o nou funcie yywrapO deoarece exist o macrodefinitie yywrap definit ca: #define yywrap () 1

\ S se demonstreze folosind lema de pompare c urmtorul limbaj nu este independent de context: |j} : L= {a i b i c k [i>j >k} iL={aib'ckj0<=i<=j<=k} ^L={aibjck|i,j,k>=O,i!=j,i!=k,j!=k}

Pentru urmtoarele gramatici s se elimine recursivitatea stng. n gramaticile rezultate s se elimine X produciile, dup care s se elimine simbolii nefinalizai i inaccesibili. G = ({S, A, B}, {a, b}, P, S) unde P este: S -> Ba | Ab A - Sa | Aab | a B -> Sb I Bba | b

86

86

87

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

G = ({S, A, B, C}, {a, b}, P, S) unde P este: S-A|B A -> Ba | Sb| b B - AB | Ba C -> AS | b G = ({S, A, B, C}, {a, b}, P, S) unde P este: S -^ AB | AC B -> Bb | b C -> Ac | BC A->a|C G = ({S, A, B, C}, {a, b}, P, S) unde P este: S - AB | AC A -> Sa | a B - BC | AB C->aB|b

G = ({S, A, B}, {a, b}, P, S) unde P este S->A A - bS | b C^AS b

temu 3-5 Pentru expresile regulate: (a|b)*ab(a|b)* (ajb)*ab*(a|b) (a|b)* a (a|b) b* (a|b)+ a b* S se construiasc automatele finit nedeterminist i determinist i s se minimizeze strile. S se fac i construcia direct pornind de la expresia regulat la automatul finit determinist.

t< m.i -4

Uina 3-6 S se construiasc automatele cu stiv care accept limbajele generate de gramaticile: G = ({S, A, B}, {a, b}, P, S) unde P este S -> aB | bA A -> a | aS | bAA B -> b | bS | aBB G = ({S, A}, {a, b}, P, S) unde P este S->aAA A -> aS | bS| a G = ({S, A, B, C}, {a, b}, P, S) unde P este S->ABC A - BB | X B -> CC | a C - AA I b

: Pentru urmtoarele gramatici, s se elimine simbolii nefinalizai i inaccesibili. I G = ({S, A, B}, {a, b}, P, S) unde P este S -* SS | Aaa A -> aAB | aS | b B->bB G = ({S, A, B, C}, {a, b}, P, S) unde P este S ^ AB|CA A-a B -> BC | AB C -> aB | b G = ({S, A, B}, {a, b}, P, S) unde P este S->a|A A->AB

89

limbaje formale si translatoare u-niii ' - "

Seminar LFA

limbaje formale si translatoare

Seminar LFA

S se construiasc mainile Turing compuse care decide limbajele: L = {w e {a, b}* | #a(w) par si #b(w) impar} L = { w e {a, b}* | #a(w) par si #b(w) par} L = { w {a, b} * | #a(w) impar si #b(w) par} L = {w e {a, b}* j #a(w) impar si #b(w) impar}

4 Bibliografie
1. Irina Athanasiu, Limbaje Formale si Compilatoare, Centrul de multiplicare, IPB, 1992 2. Alfred Aho, Jeffrey Ullman, The Theory of Parsing, Translation and Compiling,'voi. 1 Parsing 3. Harry R. Lewis, Christos H. Papadimitriou, Elements of the theory of computation

90 90 91