Documente Academic
Documente Profesional
Documente Cultură
DIANA RAICIU
RADU SION
IRINA MOCANII
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.
IV.
004.43
Martie 2002
Irina Athanasiu
2
2
3
4
16
17
18
18
18
19
20
20
1 2
23
24
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
65
2.1
28
44
45
52
54
66
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
87
Bibliografie
91
Seminar LFA
Seminar LFA
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).
Seminar LFA
Probleme
S se construiasc gramaticile care genereaz urmtoarele limbaje:
proHeiTu 1.1-1
:
L={anbnjn>0}
Soluie:
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
. . .
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:
.. . .
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
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.
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 _ !
..
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 }.
Seminar LFA
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 |
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}
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
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 }.
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
; " -
"--
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
12*
13
Seminar LFA
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
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 .
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
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
Seminar LFA
Seminar LFA
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
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:
CI
1.1.3.3
Un simbol neterminal este nefinalizat dac din el nu se poate deriva un ir format numai din
simboli terminali.
Algoritmul de transformare este:
Intrare: o gramatic G = (N, T, P, S)
^
Ieire: o gramatic G' = (N', T, P', S) care satisface condiiile L(G) = L(G') i
+
VA 6N, A => w, w 6T*.
i = 0;
o = {A-> a , aeT'}
repet
i++
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
1.1.3.4
Seminar LFA
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
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
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
20
Seminar LFA
20
21
Seminar LFA
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.
problema 1.1-33
S se elimine simbolii nefinalizai, iar apoi cei inaccesibili pentru gramatica G = ({S, A, B, C, D}, {
a, b, d}, P, S) unde P = { S - b A | a B , A - a | a C | a D | a S | bAA, B -> b | Cb | Db | bS | aBB, C -
Cb | Db, D -> Cb | Db, D - Cd | dAC}
Soluie:
Eliminare simboli nefinalizati:
N 0 ={A,B},N, = {S,A,B},Nf=Ni
Rezult c C, D Nf, adic sunt simboli nefinalizati, se vor elimina produciile corespunztoare lor
i gramatica va deveni: G = ({S, A, B }, {a, b, d}, P, S) unde P = {S -> bA | aB, A -* a | aS | bAA,
B->b|bS|aBB}
Eliminare simboi inaccesibili:
No={S},N,= {S,A,B},Nf=N,
Nu exist simboli inaccesibili.
n final gramatica este: G = ({ S, A, B }, {a, b, d}, P, S) unde P = {S -> bA | aB, A - a | aS | bAA,
B-b|bS|aBB}
problema 1.1-34
S se elimine recursivitatea stng, X produciile, simbolii neutilizai i inaccesibili pentru gramatica
G = ({S, B, C, D, E}, {a, b}, P, S) unde P = {S-> aBa, B -> Sb | bCC |DaB, C -> abb | DD, E ->
aC, D -> aDB}
22
22
23
Seminar LFA
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)*.
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.
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
25
Seminar LFA
!)*'
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
26
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
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
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
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).
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:
Seminar LFA
Seminar LFA
Comentarii:
Se poate construi automatul finit determinist care accept limbajul de mai sus pornind direct
de la.expresiaregulat.
proMwii i I ' - "
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>#
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 } .
32
321
33
Seminar LFA
, 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
#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)
34
35
Seminar LFA
Am subliniat n fiecare mulime nodurile i pentru care este ndeplinit condiia i = cod (a).
Comentarii:
Se observ c n starea { 1,2,3,4,5,6 } se accept sufixul aa, iar n starea {1,2,3,6} se accept!
sufixul ab. Ambele sunt stri terminale deoarece conin codul pentru # (terminatorul expresiei]
regulate).
S se construiasc AFN pentru urmtoarea expresie regulat i apoi s se construiasc AFDul corespunztor. S se fac i construcia direct: expresie regulat-AFD:
(a|b)*a(a|b)(a|b)
Soluie:
AFN corespunztor expresiei regulate de mai sus este:
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
Seminar LFA
Seminar LFA
{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
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
Seminar LFA
\
\
prolik'ma 1.3-11
{1,2}*{1,2}{3} # {3}
{1,2}|{1,2}
3
/\
/
\
/
\
{1} a {1} {2} b {2}
1
2
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
Seminar LFA
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 },
42
421
43
Seminar LFA
Dac se ajunge ntr-o configuraie pentru care stiva este goal nu se mai pot executa tranziii.
44
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
45
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.
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}
46
47
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:
(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
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)
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
Seminar LFA
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
N dac w 0 L
52
Seminar LFA
52
53
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
m(qO,a) = (ql,L)
m(qO, #) = (qO, #)
;m(ql,a) = (q2,#)
: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:
Considernd reprezentarea unar a numerelor naturale, care este funcia pe numere naturale
:
calculat de urmtoarea main Turing:
2k
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
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
Seminar LFA
proMt-niii 1.3-2^
pinlili-ni.i 1 -2"
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,#)
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
Seminar LFA
Soluie:
Considerm c pentru x, y i rezultat se utilizeaz reprezentarea unar utiliznd simbolul 1.
Iniial banda de intrare conine #x#y#, n final banda va conine #x+y#.
Maina Turing se va deplasa cu o poziie la stnga. Dac simbolul curent este # (y = 0) atunci
i ea se va opri (banda de intrare va conine rezultatul). Dac simbolul curent este I (y * 0),
; atunci fiecare I din y va fi deplasat cu o poziie la stnga.
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
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
Seminar LFA
Soluie:
Pentru a se verifica #a( w) = #t,( w) = #c( w) se caut de la stnga la dreapta primul a, dup care tot de
la stnga la dreapta primul b, respectiv primul c. La fiecare cutare (un simbol a, b, respectiv c) dac
simbolul respectiv este gsit, atunci acesta va fi ters. Pentru a terge fiecare simbol gsit a, b,
respectiv c se va folosi un simbol d g {a, b, c} (dac tergerea s-ar realiza cu # nu am mai ti care
este captul din dreapta al irului iniial).
Maina Turing se oprete dac irul de pe banda de intrare aparine limbajului L. Pentru aceasta
nainte de a cuta a, b, respectiv c trebuie s vedem dac primul simbol cutat la dreapta (diferit de d)
nu este #, caz n care irul aparine limbajului, deci maina Turing se oprete. Pentru iruri care nu
aparin limbajului maina va cicla cutnd la dreapta un simbol a sau b sau c.
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
Seminar LFA'
Seminar LFA
l=
dup copiere
bl: #abbabcb#
b2: #bcbabba#
I *<<> =
62
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
Seminar LFA
Seminar LFA
DR
NR
64
64
65
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().
{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
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:
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
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
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
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:
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
Seminar LFA
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 ();
} '
..
De data aceasta dac vom executa programul generat asupra fiierului de intrare:
. . . :
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();
blanc [ \t]+
%%
{blanc} { printf (" ");}.
{blanc}$ { printf("#");/* ignor blancurile de la sfrit */ }
terge
"alfa"
gama
itiain() {
a b c#
abd#
Seminar LFA
{ printf("beta"); }
{ printf ("delta"); }
74
75
Semmai LFA
Seminar LFA
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.
. { return - 1 ; }
\n { return -2; }
Comentarii:
%%
main () {
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:
real
lungime = 6
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.
#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
Seminar LFA
Descriere:
,
.
.
Dac se execut programul generat pentru programul asupra unui fiier de intrare care
conine textul:
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
78
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
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.
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
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]).
"/*" { 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.
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
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
#define
#define
OPREL
ATRIB
Seminar LFA
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"
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
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;
84
[ \t]
[ A \t\n]
84
85
Seminar LFA
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.
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
86
87
t< m.i -4
Seminar LFA
Seminar LFA
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
Seminar LFA
Seminar LFA
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