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)

MATRIX ROM

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

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

IV.
004.43

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

ISBN 973 - 685 - 407 - 8

Martie 2002

Irina Athanasiu

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

2
2
3
4
16
17
18
18
18
19
20
20

1 2

23
24

Mulimi regulate. Expresii regulate


Probleme

1.3
Acceptoare
1.3.1
Automate finite
Probleme
1.3.2
Automate cu stiv (push-down)
Probleme
1.3.3
Maina Turing
Probleme

27

Lex - generator de analizoare lexicale

65

2.1

28
44
45
52
54
66

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

27

Exemple comentate

70
71
72
.

73

.73
74

Teme pentru acas

87

Bibliografie

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*.

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).

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

Seminar LFA

limbaje formale si translatoare

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 }.

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.

limbaje formale si translatoare

Seminar LFA

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

* 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 }.
Verificatei

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

. . .

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

Verificare:

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.

limbaje formale si translatoare

.. . .

Seminar LFA

problema 1.1-5
n

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.

aS

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

limbaje formale si translatoare

Seminar LFA

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.

L = {w e { 0,1 }* | w conine un numr egal de 0 i 1 }

pichk-iis.i I.l-K

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 e { 0,1 }* | w nu conine subirul 011 }

0 1 SOS

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 }.

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

l'rnliluii.i I l-'>

Seminar LFA

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

limbaje formale si translatoare

Seminar LFA

Verificare:

IMLIII.I I.! 15

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.

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}.

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).

] 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
:

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-16
L= {aVck\ i#j s a u j # c , i , j , k > 0 }

abSba

Comentarii:
G este o gramatic independent de context

',
:
I

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}.

10

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

: 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 .

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

10

Seminar LFA

:
j
;
j
j

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

limbaje formale si translatoare

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.
:

Seminar LFA

1.1-1")
I \\ I MI

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}.

: 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

Comentarii:
G este o gramatic regulat

L={a i b j c k |i<j,i,j,k>0}

j i i u i i l i i n . i 1.1 IU

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

; " -

"--

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

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}.

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.

Comentarii:
G este o gramatic independent de context

; G este o gramatic independent de context


12

12*

13

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

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.

problema 1.1-22
L= { wwjwe {0, 1 }* }

1.1-23

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

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 }.

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.

14

Seminar LFA

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 .

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}

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.

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.

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}.

pi'ob'eiitu 1.1-27
L={ai|i = 2jJ>0}

('oinenlarii:
G este o gramatic fr restricii

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.

1.1.2 Lema de pompare

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:

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

2. |vwx|<k
3. uv'wx'y e L pentru orice i

16

16

17

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

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

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).

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

1.1.3.1

Eliminare recursivitate stnga

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:

se spune c avem recursivitate stnga imediat i]

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

CI

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;

elimin recursivitatea stng imediat ntre produciile Ai.

o = {A-> a , aeT'}
repet
i++

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

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

18

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'

19

limbaje formale si translatoare

1.1.3.4

limbaje formale si translatoare

Seminar LFA

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'

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

probli-Pia 1.1-30

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'

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}

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:

1.1-31

L - aL'
L'-> ,SL' | X

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}

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}

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

pro bit mu 1.1-29

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

20

Seminar LFA

; 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}
.

20

21

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Seminar LFA

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

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}

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

Coaientati:
Ordinea corect de aplicare a celor doi algoritmi este eliminare simboli nefinalizai i apoi eliminare
simboli inaccesibili.

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}.

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}

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 .

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}

22
22

23

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

(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.

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)*.

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

Seminar LFA

(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)

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

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

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.

Probleme

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:

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.

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.

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:

problema 1.12-2
Corespunztor setului de producii de mai sus, se obine urmtorul sistem de ecuaii:
S=0A+lS+X
A=0B+lA
B=0S+lB

S se rezolve sistemul de ecuaii:


X1=OX2+1X1+,
X2 = OX3 + 1X2
X3 = OX1 + 1X3
24
24

25

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
+

!)*'

Seminar LFA

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 :

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 = a C + A,
i respectiv urmtorul set de producii:
S->aS bSjA
A->aA|bB
B->bB

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}

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

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 }.

26

limbaje formale si translatoare

26

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

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.

Probleme

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:

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

limbaje formale si translatoare

Seminar LFA

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 '

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

S se construiasc automatul finit care accept limbajul descris de expresia regulat:


(a i b)* a (a I b)

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.

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)

Se observ c automatul finit obinut: AF = ({ S, A, B, C }, { a, b }, m, S, { C }) este


nedeterminist. Graful, corespunztor este:

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..

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 }) =

da

i 0 1 , 2 , 3 , 7 } .

n continuare, celelalte stri precum i tranziiile corespunztoare se vor determina astfel:


( x) = qj unde qj = _inchidere(move(qi, x)), obinem:

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:

32

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 }

321

33

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

Se obine urmtoarea tabel de tranziii:

, 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:

stare urmtoare

stare
a
qO
ql
q2
q3
q4

Seminar LFA

qi
q3

b
q2
q4

ql
q3

q2
q4

a 1

ql

q2

a3
a4
b5

nod

b2

i corespunztor, graful de tranziie:

#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 #:

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

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:
%
'

(a | b)* a (a | b) #
1 23456
Arborele este:
{1,2,3} . {6}
/ \
/
\
{1,2,3} . {4,5} \

/ \ {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}

34

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:

34

35

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

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)

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

Soluie:
AFN corespunztor expresiei regulate de mai sus este:

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

Seminar LFA

36

limbaje formale si translatoare

Seminar LFA

Arborele corespunztor expresiei regulate este:

limbaje formale si translatoare

Seminar LFA

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,7} | {6,7}

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

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

{1,2}

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

Dac dorim s obinem AFD corespunztor automatului de mai sus, considerm ca stare
iniial firstpos(rad) = { 1, 2, 3 }. Tranziiile se obin astfel:

{5} b {5}
5

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

38

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

38

39

limbaje formale si translatoare

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:

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:

1,2,3

(a | b)* #
12 3
Pentru expresia regulat de mai sus, arborele corespunztor este:
{1,2,3} . {3}
/
/

Seminar LFA

limbaje formale si translatoare

Seminar LFA

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

{ 1, 2, 3 }
{ 1, 2, 3 }

b2
#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

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:

Seminar LFA

|.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

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

limbaje formale si translaitoare

Seminar LFA

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

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.

limbaje formale si translatoare

Seminar LFA

Seminar LFA

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
(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}

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

limbaje formale si translatoare

Seminar LFA

Seminar LFA

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)
|

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)}

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)

Verificare;
Pentru irul de intrare aacbb, se obin evoluiile celor dou automate:

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)

(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)

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.

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}

S => aSbS => abS => abbSaS => abbbSaSaS => abbbaSaS => abbbaaS = abbbaa
Respectiv:

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)}

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:

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)}

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

limbaje formale si translatoare

Seminar LFA

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)

(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).

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) }

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.

50

Seminar LFA

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

51

limbaje formale si translatoare

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) =
\

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.

N dac w 0 L
52

Seminar LFA

52

53

limbaje formale si translatoare

limbaje formale si translatoare

Seminar LFA

Seminar LFA

Probleme
Descriei n cuvinte transformarea efectuat de urmtoarea maina Turing.

problema 1.3-21
', Fie maina Turing MT = ( {qO, ql, q2}, {a, #}, m, qO) cu

MT = ({qO, ql, q2}, {a, b, #}, m, qO) cu

m(qO,a) = (ql,L)
m(qO, #) = (qO, #)
;m(ql,a) = (q2,#)

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,#)

:m(ql,#) = (h,#)

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:

Maina transform o band de intrare de forma #w# n bw#.

: 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)

Considernd reprezentarea unar a numerelor naturale, care este funcia pe numere naturale
:
calculat de urmtoarea main Turing:

2k

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.

MT = ( {qO, ql, q2, q3}, {I, #}, m, qO) cu

prohkma 1.3-22

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

S considerm de exemplu comportarea pentru configuraia iniial (qO, #ab#).


(qO, #ab#) |- (ql, #ab#) |-+ (ql, #ab#) |- (q2, bab#) |-+ (ql, bab#) |- (h, bab#)

(qO, #aa) |- (ql, #aa) j- (q2, ##a) |- (qO, ##a) se aga

Soluie:

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

limbaie formale si translatoare

Seminar LFA

proMt-niii 1.3-2^

pinlili-ni.i 1 -2"

S se construiasc maina Turing care decide limbajul:


L = {w e {a, b}* | w conine cel puin un simbol a}.

S se construiasc maina Turing care decide limbajul:


L = {w e {a, b} | ]w| este divizibil cu 2}.
Soluie;

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,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)

: 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

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).

problema 1.3-26
S se construiasc maina Turing care accept limbajul:
L = {w e {a, b} | w conine cel puin un simbol a}.

Soluii':
M1
i :q<!. qi. ql. u.\). !a. l\ "1. r.\. qiu cu

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#.

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,#)

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, #)

56

Semrnar LFA

problema 1.3-29
S se construiasc MT compus care calculeaz f(x, y) = x + y, unde x i y sunt numere
naturale

56

57

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

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.

Verificare:
(q, ###)

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

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

58

l - (q,

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

##II#)
##II#)
#|II#)
#IH#)
#III#)
#I#I#)
#I#I#)
#I#I#)

(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
q,
(q,
(q,
(h,

#II#II#)

x< y

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).

i - (h, ###;

(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(q,
(h,

Seminar LFA

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:

y= I

V=j
*

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

=a

x=a
x=l

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

- *

x=
R3#

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

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

#IIII##)
#IIII##)

58

59

limbaje formale si translatoare

Seminar LFA

limbaje formale si translatoare

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.

x!=#

Seminar LFA

=#
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:

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.

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

Astfel maina Turing testeaz mai nti dac x = 0 sau y = 0, caz n care rezultatul este 0.

60
60

limbaje formale si translatoare

limbaje formale si translatoare

Seminar LFA'

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#

62

R(1) NO) RtD

cmp

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

63

limbaje formale si translatoare

limbaje formale si translatoare

Seminar LFA

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

DR
NR

64

64

65

limbaje formale si translatoare

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

/* 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

Seminar LFA

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

limbaje formale si translatoare

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}

Seminar LFA

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.

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

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
a-asecvene 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

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

limbaje formale si translatoare

Seminar LFA

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

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:

2.2.3 Macrodefiniii, funcii i variabile predefinite

|\n /* se potrivete cu orice caracter */

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

numen

sau
%x

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

Seminar LFA

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

limbaje formale si translatoare

limbaje formale si translatoare

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.

11:111:1 2-2

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:

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:

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

%%
terge ;
"alfa"+
gama+

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

9-2

main(){
yylex ();
} '
..

se va obine un fiier de ieire de forma:

De data aceasta dac vom executa programul generat asupra fiierului de intrare:

. . . :

alfaalfa terge alfaaaaaaaaaaaaaaaa


gamagama terge gamaaaaaaaaaaaaaaaa

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).

74

yylex();

Se va obine un fiier de ieire de forma:

blanc [ \t]+
%%
{blanc} { printf (" ");}.
{blanc}$ { printf("#");/* ignor blancurile de la sfrit */ }

terge
"alfa"
gama

itiain() {

alfa terge alfa


alfa beta gama delta

2.3 Exemple comentate

a b c#
abd#

Seminar LFA

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.

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

74

75

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} {numr cifre++;}


main() {
yylex() ;
printf(primul cuvnt %s apare de %i ori\n au fost %i cifre",
a, numr apariii, numr cifre);
free(a);
}

cifra [0-9]
semn [+-]?
IntregFaraSemn {cifra}+
Exponent ([Ee]{semn}{IntregFaraSemn})
Real ({semn}{IntregFaraSemn}\.{IntregFaraSemn}?{Exponent}?)

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.

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


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

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

Comentarii:

%%
main () {

A fost declarat o stare numit URMTOR TIVIVIWI n jLvi


execuia macroinstruciunii:

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

si.iiv c^iv comandat prin

BEGIN (URMTOR) ;

apelat pentru aciunea corespunztoare gsirii primului cuvnt. Dac se execut analizorul
generat asupra fiierului de intrare:

Descriere:
Executnd programul generat asupra irului de intrare:
123.56
Se va obine fiierul de ieire:

123$ % &456 abbb bribnbnb abb nbnbnb abbb nbnbnbn abbbbbbbbbb


789 abbb hjhjhjhjh abb

se va obine fiierul de ieire:

real
lungime = 6

primul cuvnt abbb apare de 3 ori


au fost 9 cifre

Dac programul se schimb prin declararea strii URMTOR ca stare exclusiv execuia
programului generat pentru acelai fiier de intrare va produce:
789

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.

primul cuvnt abbb apare de 3 ori


au fost 6 cifre

#ina 2-5

Cifrele nu au fost luate n considerare dect atta timp ct starea curent a fost starea
INIIAL.

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

76

t i 111.1 2-(i
x COMENTARIU
{

int NumarLinieComentariu = 0;
int NumarLinieProgram = 0;

(URMTOR);

76

77

limbaje formale si translatoare

limbaje formale si translatoare

Seminar LFA

Descriere:
,
.
.
Dac se execut programul generat pentru programul asupra unui fiier de intrare care
conine textul:

/*" { 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 */ }

acesta este un test ciudat

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

<CCMENTARIU>\n ++NumarLinieComentariu;
<CCMENTARIU>" *"+"/" BEGIN (INIIAL) ;
\n ++NumarLinieProgram;

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).

Beseriere:
Programul generat numr liniile ce conin comentarii respectiv text obinuit" ntr-un
program. Comentariile ncep i se termin cu caracterele /*" respectiv */".

tenia 2-8

int NumarCuvinte = 0;

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.

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 */

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

%%
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 */

Descriere: .

- '

'

* -

Dac se execut programul generat pentru programul asupra unui fiier de intrare care
conine textul:
,
aaa
bun
Se va obine textul:

main () {
yylex 0 r
}

78

Seminar LFA

bun este adjectiv


au fost 2 cuvinte

78

limbaje formale si translatoare

limbaje formale si translatoare

Seminar T-FA

Seminar LFA

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.

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.

tema 2-10
%S DUP

Cuvnt [A-Za-z]*
CuvintSpecial {Cuvnt}"$"
CuvintObisnuit {Cuvnt}[\t \n]+

int NumarCuvinte = 0;

%%
< 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);

%}
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);

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:

f
r

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

(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.

bun este adjectiv


au fost 7 cuvinte
:

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:

80

Unu 2-11
%s DUP
Cuvnt [A-Za-z]*
CuvintSpecial {Cuvnt}"$"
CuvintObisnuit {Cuvnt}[\t \n]+

81

limbaje formale si translatoare

limbaje formale si translatoare

Seminar LFA

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]).

<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() ;

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

Descriere:
O soluie mai complicat cu efect similar cu 2.10.

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


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

Comentarii:
Se folosete n acest caz funcia yyless pentru a extrage caracterul "$

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

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

'

i;

Seminar LFA

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.

2-14

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

Descriere:
Dac se execut pentru irul de intrare

5J

abcde

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

%{
#define
#define
#define
#define
#define
#define
#define
#define
#define

LT
LE
EQ
NE
GT
GE
IF
THEN
ELSE

ttdefine

ID

#define

NUMR

0
1
2
3
4
5
10
11
12
13
14

(abcd)

82

82

83

limbaje formale si translatoare

#define
#define

OPREL
ATRIB

Seminar LFA

limbaje formale si translatoare

15
16

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.

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

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.

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

numr

Seminar LFA

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

linia 2-15
{BLANC}

if
then
else
{id}

{numr}

"o"

{ /* nici o aciune */}


{ printf (" I F " ) ; }
{ printf(" THEN"); }
{ printf(" ELSE"); }
{ yyval = TratareldO;
printf("%i, %i", yyval,ID);

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

BLANC
NOBLANC

{ 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,

{NOBLANC}+NumarCaractere += yyleng; ++NumarCuvinte;


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

yyval,OPREL);}
yyval,OPREL);}
yyval,OPREL);}
yyval,OPREL);}
yyval,OPREL);}
yyval,OPREL);}
", yyval, ATRIB),

char **ListaFisiere;
unsigned int FisierCurent = 0;
unsigned int NumarFisiere;

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

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 () ;

main( int argc, char **argv ){


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

84

[ \t]
[ A \t\n]

84

85

limbaje formale si translatoare

limbaje formale si translatoare

Seminar LFA

/* Noua definiie yywrap */

3 Teme pentru acas

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);

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.

\ 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}

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

86

Seminar LFA

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

87

limbaje formale si translatoare

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

t< m.i -4

: 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

Seminar LFA

limbaje formale si translatoare

Seminar LFA

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.

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

89

limbaje formale si translatoare

limbaje formale si translatoare

Seminar LFA

Seminar LFA

u-niii ' - "

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

S-ar putea să vă placă și