Sunteți pe pagina 1din 20

Simplificarea gramaticilor independente de context

1. Eliminarea λ-producțiilor
2. Eliminarea producțiilor ciclice
3. Eliminarea recursivității stânga
4. Factorizarea stânga
1.Eliminarea λ-producțiilor
O gramatică λ-free(lambda-free) este o gramatică independent de context cu următoarele proprietăți:
1. În nicio producție a gramaticii, șirul vid nu apare în partea dreaptă a acestuial
2. Dacă există o astfel de producție, atunci ea este S → λ, unde S este simbolul de start, iar S nu apare în partea
dreaptă a niciunei altei producții
Teoremă
• Pentru orice gramatică independentă de context G, cu λ neaparținând lui L(G), există o gramatică echivalentă
λ-free G’
Exemplu:
Se dă gramatica G definită de producțiile:
S →ABC
A → BB| λ
B →CC|a
C → AA|b
Se cere să se găsească gramatica λ-free G’ echivalentă
Rezolvare:
Primul pas constă din formarea mulțimiiVN.
1. Se adaugă inițial simbolurile neterminale care pot fi transfomate direct în λ. VN = {A}
2. Pentru producțiile care au în partea dreaptă doar simboluri neterminale deja aflate în VN, se adaugă la VN
simbolurile neterminale din partea stângă. Se repetă acest pas până când nu se mai adaugă noi simboluri la
mulțimea VN.
(a) VN = {A, C} (pentru producția C → AA)
(b) VN = {A, C, B} (pentru producția B → CC)
(c) VN = {A, C, B, S} (pentru producția S → ABC)
(d) S-a obținut deci mulțimea VN = {S, A, B, C}. Pe baza acestei mulțimi, al doilea pas constă din generarea de noi
producții după regula expusă anterior. De exemplu, din prima producție a lui P:
S → ABC
Se obțin noile producții:
S→ ABC, S→Ab, S→AC, S→BC, S→A, S→B, S→C
În final, gramatica G’ echivalentă obținută:
S → ABC|AB|AC|BC|A|B|C
A → BB|B
B → CC|C|a
C → AA|A|b

2.Eliminarea producțiilor ciclice


O gramatică are un ciclu dacă există un simbol neterminal A astfel încât A→+A (A să fie derivabil din el însuşi printr-o
succesiune de producţii). Un astfel de simbol se numeşte simbol ciclic. Dacă o gramatică G este o gramatică λ -free,
atunci toate ciclurile (dacă există) din G pot fi eliminate fără a afecta limbajul generat L(G) folosind unalgoritm specific.
Fie o gramatică independentă de context G = (N, T, S, P). Pentru eliminarea ciclurilor din această gramatică, mulţimea
producţiilor P va fi înlocuită cu o nouă mulţime Pc obţinută din P prin înlocuirea fiecărei producţii A → B, unde B e un
simbol ciclic, cu noi producţii de tipul A→α, astfel încât α nu este o variabilă ciclică şi există o producţie C→ α astfel
încât B⇒* C.
Gramatica echivalentă rezultată este Gc = (N,T,S,Pc).
Exemplu:
Fie gramatica definită prin producţiile:
S→ X|Xb|SS

X → S❘a

Atât S cât şi X sunt simboluri ciclice pentru că: S→+S şi X ⇒ +X. Aplicând algoritmul de mai sus, se elimină apariţiile
simbolurilor ciclice în partea dreaptă a respectivelor producţii, obţinându-se gramatica echivalentă definită de noile
producţii:
Sa|xb|SS
X→ Xb|SS|a
3.Eliminarea recursivității stânga
O gramatică recursivă stânga este o gramatică în care se regăseşte cel puţin un simbol neterminal A şi producţii specifice
prin care să se ajungă la relaţia:
A→+Aα unde α € (N ∪ T)*
Cu alte cuvinte, printr-o succesiune de producţii, simbolul neterminal A este derivat într-o formă în care acelaşi simbol
apare primul în partea stângă a şirului rezultat.
Recursivitatea stânga este de două feluri:
1. Directă (imediată sau evidentă), în cazul în care există o producţie a
gramaticii de forma A → Aα,
2. Indirectă (sau,,recursivitate în k paşi") atunci când printr-un şir de producţii succesive se poate ajunge pornind de la
simbolul neterminal A la forma propoziţională Aα.
În general, recursivitatea stânga directă poate fi îndepărtată relativ simplu, prin introducerea unui nou simbol neterminal şi
a unor noi producţii în gramatica iniţială.
Presupunând că avem următoarele producţii ale neterminalului A care manifestă recursivitate stângă:
A→ Aα1 Aα2...|Aαn|ß₁ |ẞ2|... |ẞm cu proprietatea că niciun simbol ẞi nu începe cu A.
Atunci putem înlocui producţiile lui A cu următoarele producţii în care introducem noul simbol neterminal A':
A → ß₁A′|ß2A′|…..|ßmA'
A'→ α₁A'|α₂A'|... αnA'| λ
Sintetizând, putem afirma că recursivitatea imediată se elimină prin înlocuirea unei producţii de forma:
A→Aα|ẞ
Cu două producţii de forma:
A→βA'
A'→αA'| λ
Exemplu:
Eliminaţi recursivitatea stângă din gramatica definită prin producţiile:
E → E + T|T
T→T*F|F
F→ (E)|a
Unde {E, T, F} sunt simboluri neterminale iar {a, +,*, (, )} sunt simboluri terminale.
Rezolvare:
Parcurgem neterminalii pentru a identifica unde ne confruntăm cu recursivitate stângă. Pentru gramatica dată, neterminalii
E şi T au producţii care prezintă recursivitate stângă imediată. în acest caz, rescriem producţiile neterminalilor respectivi
conform raţionamentului descris mai sus, introducând două noi simboluri neterminale, E' şi, respectiv T'. Astfel, noile
producţii sunt următoarele:
E→TE’
E'→ +TE'| λ
T→FT'
T'→ *FT'| λ
F→ (E)|a
Algoritmul lui Paull
• Folosit pentru eliminarea recursivității stânga atât directă cât și indirectă

Se aranjează neterminalii gramaticii într-o ordine oarecare A1, A2,…An.


for i := 1 to n do begin
for j := 1 to i -1 do begin
Se înlocuieşte fiecare producţie de forma Ai → A¡ß cu producţiile:
Ai → α1ẞ|α2ẞ...|αkß unde
Aj→ α1|α2|.....|αk
reprezintă toate producţiile actuale ale lui Aj
end {for j}
Se elimină recursivitatea stângă imediată din producţiile lui Ai dacă este cazul
end {for i}
Exemplu:
Eliminaţi recursivitatea stângă din gramatica definită prin producţiile:
S→ Aa|b
A→ Ac|Sd|∈
Rezolvare:
Vom ordona simbolurile neterminale astfel: S, A (S = A1, A = A2).
• Când i = 1, nu se execută bucla după j şi se trece direct la eliminarea recursivităţii imediate pentru producţiile lui S (nu e
cazul),
• Când i = 2 şi j = 1, se înlocuieşte producţia A→ Sd cu producţiile A→ Ac|Aad|bd|∈,
• În final, se elimină recursivitatea stângă imediată din producţiile lui A.
Se obţine astfel noua gramatică având producţiile:
S→ Aa|b
A→ bd A'| A'
A'→ cA'|adA'|∈
4.Factorizare stânga
• Factorizarea stânga este o tehnică de transfomare a unei gramatici independente de context utilă pentru a
obține o gramatică echivalentă ce poate fi utilizată în parsarea de tip top-down (analiza sintactică)
• Ideea de bază în spatele factorizării stânga este că atunci când nu e evidet care două producții alternative
ale aceluiași neterminal A este mai potrivită pentru a continua derivarea, aceste producții pot fi rescrise
astfel încât decizia se amână până când se cunosc suficiente caractere de intrare pentru a face alegerea
corectă
Exemplul 1
Fie gramatica:
S→if E then S
| if E then S else S
La întâlnirea unui atom de intrare,,if“, nu se poate lua o decizie imediată cu privire la derivarea următoare a lui S.
În general, dacă A→ αß1|αß2 sunt două producţii ale lui A iar şirul de intrare începe cu un şir de caractere nevid derivate
din α, nu putem şti dacă să derivăm în continuare în αẞ1 sau αẞ2.
Cu toate acestea, se poate modifica gramatica pentru a îndepărta acestă problemă. Regula este să se modifice producţiile
de forma
Α→ αβ1|αβ2
în următoarele producţii noi, prin introducerea unui nou simbol neterminal A':
A→ α A'
A' → β1| β2
Aplicând acest raționament, putem rescrie gramatica pentru instrucţiunea if enunţată mai sus astfel:
S→if E then S ElsePart
ElsePart→ else S|∈
Exemplul 2
Fie gramatica definită de producţiile:
S→ Aa|Ab
A→aabA|aabaA|aa
Se cere să se obţină gramatica echivalentă cu aceasta, factorizată stânga.
Rezolvare:
Din analiza gramaticii se observă faptul că trebuie factorizate stânga atât producţiile simbolului neterminal S cât şi A.
Primul pas îl reprezintă factorizarea producţiilor lui S, pentru care introducem un nou simbol neterminal S'. Astfel,
primele două producţii devin:
S→ AS'
S' → a|b
În cazul producțiilor lui A observăm prefixul aa comun și aplicând raționamentul prin introducerea unui nou simbol
neterminal B, acestea devin:
A→aaB
B→ bA|ba A|λ
Se observă însă faptul că primele două producţii ale lui B prezintă şi ele un prefix comun, şi anume b. După factorizarea
acestora prin introducerea neterminalului C, obţinem:
B→ bC |λ
C→ A|aA
Concluzionând, gramatica echivalentă factorizată stânga este:
S→AS'
S'→a|b
A→ aa B
B→ bC|λ
C→ A|aA
Automate finite

•Informal,un automat finit constă din:


o •O mulțime finită de stări
o •Tranzițiile între stări
o •O stare inițială
o •O mulțime de stări finale
•Există două tipuri de automate finite:
o •Automate finite deterministe (AFD): tranziția de la fiecare stare este determinată în mod unic de caracterul de
intrare curent
o •Automate finite nedeterministe (AFN): pot fi mai multe posibile variante de tranziții, precum și tranziții
„spontante” fără vreun caracter de intrare curent
Automate finite deterministe

•Un automat finit determinist e un tuplucu 5 elemente(cvintuplu) (Σ, S,s0, δ, F)


o •Σe un alfabetfinitnevidde simboluride intrare{a, 0, 1, ...}
o •S e o mulțimefinitănevidăde stări

o •s0∈S e stareainițială
o •δ: S ×Σ→S e funcțiade tranziție(pentrufiecarestare șiintrare, dăstareaurmătoare)
o •F ⊆S e mulțimeastăriloracceptoare(undedorimsăajungem)
•Automat finitdeterminist: o mulțimede stări(uneleacceptoare),o stare inițială,și tranziții în funcție de simbolurile de
intrare.
Exemplu de AFD
• Automat finit care acceptă cuvintele limbajului de forma abna, n>=0
• Descris de:

o Graf

o Tabel de tranziții

Alte exemple de AFD


• Automat de paritate: acceptă șiruri de 0 și 1 cu număr par de 1

o s0 e stare inițială și acceptoare în același timp


• automat care acceptă cuvinte cu oricât de b (incl. 0) între doi a
“Simularea” unui AFD
• Algoritm care determină dacă un AFD acceptă un cuvânt de intrare
trans_table[NSTATES][NCHARS]
accept_states[NSTATES]
state – INITIAL
while (stare != Error) {
c = input.read();
if (c == EOF) break;
state = trans_table[state][c];
}
return (state !=Error) && accept_states[state];
“Simularea” unui AFN
• Problema: cum se execută un AFN?
• “cuvintele acceptate sunt acelea pentru care există o cale corespunzător de la starea de start la o stare acceptată”
• Soluție: se caută în paralel toate căile posibile în graf care corespund cuvântului
o Se ține evidența sub-mulțimii de stări ale AFN-ul în care ar duce căutare după parcurgerea prefixului
cuvântului
Exemplu
• Șir de caractere de intrare: - 23
• Posibile “parcurgeri” ale AFN-ului:
o {0, 1}
o {1}
o {0, 1, 2}
o {0, 1, 2, 3}
Limbajul acceptat de un automat
•Notăm ε∈Σ*cuvântul vid (fără niciun simbol).
•Definim inductiv o funcție de tranziție δ*cu intrări cuvinte:
o în ce stare ajunge automatul pentru un cuvânt dat la intrare?
•Pentru orice stare s ∈S:
o δ*(s, ε) = s; cuvânt vid: nu face nimic
o δ*(s, a1a2. . . an) = δ*(δ(s, a1), a2. . . an) pentru n > 0
•Altfel spus, δ*(s0, a1a2. . . an) = (s1, a2. . . an) cu s1= δ(s0, a1)
o obținem starea s1 după intrarea a1,și aplicăm δ* pe șirul rămas
•Automatul acceptă cuvântul w∈Σ* dacă și numai dacă δ*(s0 ,w) ∈F
o (cuvântul duce automatul într-o stare acceptoare)
Automat finit nedeterminist

•Exemplu: toate șirurile de a, b, c care se termină în abc


•Din s0 , primind a, automatul poate
o Încerca să vadă dacă vor mai fi exact 3 simboluri (trece în s1)
o rămâne în s0(prespunând că urmează mai mult de 3)
•Automatul poate urma una din mai multe căi
•Un AFN acceptă un cuvânt dacă există o alegere de stări successive ducând într-o stare acceptoare.
•Funcția de tranziție e acum: δ:S ×Σ→P(S)
o dă o mulțime de stări în care poate trece automatul
•Avantaje:
o uneori se scrie mai ușor (permite să„ghicim” tranziția bună)
o cândspecificăm un sistem, permiteo alegerela implementare
• Un AFN este deci un automat unde:
o Putem avea mai multe ε-tranziții care nu presupun caractere de intrare)
• Pot fi mai multe tranziții multiple de la aceeași stare cu același caracter

Automate finite
• AF:
o Stări și tranzițiile între stări
o Stare inițială și mulțime de stări finale
• AFD: Automat Finit Determinist
o Fiecare tranziție consumă un caracter de intrare
o Fiecare tranziție este determinată în mod unic de caracterul de intrare
• AFN: Automat finit nedeterminist
o Permite ε-tranziții, care nu consumă caractere de intrare
o Pot exista mai multe tranziții din aceeași stare prin același caracter de intrare
• Problemă de implementare:
o AFN este “ambiguu”, deci Compilatoarele folosesc AFD-uri
o AFN-urile sunt mai simplu de specificat/proiectat
o Este nevoie de conversia de la AFN la AFD
Conversie AFN → AFD
Orice AFN poate fi transformat, prin aplicarea unui algoritm simplu, într-un AFD echivalent, adică un AFD care
recunoaște același limbaj ca AFN-ul initial
Exemplul 1
Figura3-6:Un AFN care acceptă limbajul șirurilor ce se termină cu
simbolul 1
În Figura 3-6 de mai sus este prezentat un AFN care acceptă limbajul
șirurilor de 0 și 1 care se termină cu 1. Obiectivul este să se obțină AFD-ul
echivalent. Pentru acest lucru, primul pas îl reprezintă reprezentarea AFN-ului
sub forma tabelului de tranziții.
Tabelul 3-2: Funcția de tranziție al AFN-ului din Figura 3-6

Fiind vorba despre un AFN, se observă


faptul că există în tabel mulțimi de stări în care se ajunge cu același simbol de intrare din aceeași stare. Pasul următor al
algoritmului implică adăugarea la acest tabel de noi linii care reprezintă tranzițiile pentru aceste mulțimii de stări.
În acest exemplu, se va adăuga o nouă stare la tabel, {q0, q1}, din care se ajunge cu 0 în q0 iar cu 1 în aceeași stare {q0,
q1}. Algoritmul continua până când au fost adăugate toate mulțimile de stări apărute pe parcurs.
Noul tabel astfel obținut este tabelul de tranziții al AFD-ului rezultat.
Tabelul de tranziție al AFD-ului echivalent AFN-ului din Figura 3-6
Pe baza noului tabel de tranziții poate fi reprezentat AFD-ul sub formă de graf, cum este afișat în
Figura 3-7, în noul AFD echivașent, stare inițială rămâne cea din AFN, iar stările fiinale sunt atât
cele din AFN, cât și orice stare nou apărută (o mulțime de stări din AFN) care are în componență
măcar o stare finală din AFN.
Figura 3-7: AFD-ul echivalent AFN-ului din Figura 3-6

La o analiză a grafului AFD-ului echivalent rezultat, se observă faptul că starea q1, deși stare finală, este inaccesibilă din
moment ce nu există nicio tranziție dintr-o altă stare către q1. Astfel, AFD-ul poate fi minimizat prin reducerea stărilor
inaccesibile. În acest caz se obține automatul din Figura 3-8.
Acesta a fost un exemplu minimalist. În practică pot exista și situații în care un AFN ce se
dorește convertit în AFD prezintă și ℰ tranziții. În acel caz, pentru stabilirea tabelului de
tranziție trebuie ținut cont și de acest fapt, întrucât atuomatul poate ajunge într-o stare și
fără a consuma un caracter de intrare. Astfel, se introduce mulțimea de stări E(R), care se
numește extensia mulțimiii de stări R și conține toate stările în care se poate ajunge din
stările lui R prin oricare ℰ-tranziții (inclusive prin niciuna)
Fie AFN-ul din Figura 3-9. Pentru acest automat, extensiile stărilor sunt prezentate mai
jos:
E({q0}) = {q0}
E({q1}) = {q0, q1}
E({q2}) = {q0, q1, q2}
E({q2, q3}) = {q0, q1, q2, q3}
Minimizarea stărilor AFD-ului
Exemplu:

-AFD1

-AFD2

Ambele acceptă bnabna, n>=0


Minimizarea AFD – echivalența

• Toate stările din mulțimea Gi sunt echivalente dacă pentru oricare două
stări p și q din Gi, și pentru orice simbol σ, tranziția (p, σ) și tranziția (q,
σ) sunt ambele fie eronate, fie conduc la stări din aceași mulțime Gj (sau
chiar Gj)
Automat finit

• Informal, aun automat finit sau o “mașină cu un număr finit de stări”


este un model de comportament compus din:
▪ mulțime finită de stări, tranziție între stări, stare inițială
▪ mulțime de stări finale
• O stare stochează informații despre trecut, reflectă schimbările intrării de la inițierea sistemului până în momentul de
față
• O tranziție indică o schimbare de stare și este descrisă de o condiție care este nevoie să fie îndeplinită pentru a
declanșa tranziția
• O acțiune este o descriere a unei activități ce urmează a fi executată la un anumit moment

Definitie Automat Finit

Informal, un automat finit sau o "mașină cu un număr finit de stări" este un model de comportament compus din:
mulțime finită de stări, tranzițiile între stări, stare inițială, mulțime de stări finale

❖ “O stare stochează informații despre trecut, reflectă schimbările intrării de la inițializarea sistemului până în momentul
de față.”

❖ “O tranziție indică o schimbare de stare și este descrisă de o condiție care este nevoie să fie îndeplinită pentru a
declanșa tranziția.”

❖ “O acțiune este o descriere a unei activități ce urmează a fi executată la un anumit moment.”


Clasificare Automat Finit
➢ Acceptoare
ieșire binară, (da/ nu), răspunsul la
întrebarea “intrarea este acceptată sau
nu de mașină”
➢ Transductoare

Transductoarele generează ieșire pe baza unei intrări date și/sau a unei stări, folosind
acțiuni. Ele sunt folosite în controlul aplicațiilor.

Acceptoare
În funcție de tip, există mai multe definiții. Un automat finit acceptor este un cvintuplu
< Σ, S, s0, δ, F >, unde:
•Σ este alfabetul de intrare (o mulțime finită și nevidă de simboluri).
• S este o mulțime finită şi nevidǎ de stări.
• s0 este starea inițială, element al lui S. Într-un automat finit nedeterminist, s0 este o mulțime de
stări iniţiale.
• δ este funcția de tranziție: δ: S x Σ → S. Într-un automat finit nedeterminist,
δ: Sx Σ → P(S).
•F este mulțimea stărilor finale, o submulțime a lui S.
Transductoare
Un automat finit transductor (sau translator) este un sextuplu < Σ, Γ, S, s0, δ, w >, unde:

• Σ este alfabetul de intrare (o mulțime finită și nevidă de simboluri).


• Γ este alfabetul de ieşire (o mulțime finită și nevidă de simboluri).
• S este o mulțime finită și nevidă de stări.
• s0 este starea inițială, element al lui S.
• δ funcția de tranziție: δ: S× Σ→ S × Γ .
• w este funcţia de ieşire. Dacă funcția de ieșire este o funcție de stare și de alfabetul de intrare (w: S× Σ → Γ),
atunci această definiţie corespunde modelului Mealy. Dacă funcția de ieşire depinde doar de stare (w: S → Γ),
atunci această definiție corespunde modelului Moore.
Optimizare
Optimizarea unui automat finit înseamnă găsirea automatului finit cu numărul minim de stări care operează cu aceeași
funcționalitate.Această problemă se poate rezolva folosind un algoritm de colorare.
Implementare
Aplicații hardware
Într-un circuit digital, un AF poate fi construit folosind un dispozitiv logic programabil, un controller logic programabil,
porți logice cu bistabili sau relee. Mai exact, o implementare hardware necesită un registru pentru a stoca variabilele de
stare, un bloc de logică combinaţională care determină tranziția de stare, și un alt bloc de logică combinaţională care
determină ieşirea automatului finit.
Aplicaţii software
În general, pentru a construi aplicații software cu automate finite, se folosesc următoarele concepte:
• automat finit condus de evenimente
• automat finit virtual
Tipuri de Automate Finite
Există două tipuri de automate finite:
➢ Automate finite deterministe (AFD):
tranziția de la fiecare stare este determinate în mod unic de caracterul de intrare current
➢ Automate finite nedeterministe (AFN):
pot fi mai multe variante de tranziții, precum și tranziții “spontane” fără vreun caracter de intrare curent
Limbaj Regulat
Gramatici de tip 3 (Regulate)
O gramatică G= (N, T, S, P) este tip 3 dacă regulile sale au forma:
A→ u sau A → uB, unde A, B ∈ N și u ∈ T
Automat Finit Determinist

Exemple cu AFD
Exemplu:
G = ({D}, {0, 1, … , 9}, D, P) Unde P este:
D→0D|1D|2D|…|9D
D→0|1|...|9
Ce sunt expresiile regulate?
Reprezentare limbajelor de tip 3 prin expresii algebrice
Dacă R și S sunt expresii regulate atunci sunt expresii regulate și următoarele:
• a, unde a este orice caracter
• ℰ, cuvântul vid
• Φ, mulțimea vidă
• R|S, alternarea R sau S (notație echivalentă: R∪S)
• RS, concatenarea, R urmat de S (notație echivalentă R∘S)
• RS, concatenarea, R urmat de S (notație echivalentă R∘S)
• R*, închiderea/produsul Kleene, R de zero sau mai multe ori
• (R|S) este o expresie regulată ce descrie limbajul L(R)∪L(S)
• (RS) este o expresie regulate ce descrie limbajul L(R)·L(S)
• (R*) este expresie regulate ce descrie limbajul L(R)*
Ordinea de prioritate a operatorilor este *, ·, |
Extensii ale expresiilor regulate
Dacă R este expresie regulată, atunci la fel sunt și următoarele:
• R? = ℰ|R (zero or un singur R)
• R+ = RR* (unul sau mai mulţi R)
• (R) = R (parantezele au rol de grupare)
• [abc]=a|b|c (oricare caracter din paranteze)
•[a-e] = a|b...|e (interval de caractere)
• [^ab] = c|d|..... (orice mai puţin caracterele enumerate)
• abc=şirul de caractere abc
• \(= caracterul (
Proprietăți
•(p|q)|r=p|(q|r) Asociativitatea la reuniunie.
•(pq)r = p(qr) Asociativitatea la concatenare.
• p|q=q|p Comutativitatea la reuniune.
• p⋅ε = ε · p = p Simbolul vid este element neutru la concatenare.
• p|Φ= p|p = p Mulţimea vidă este element neutru la reuniune.
• Φ · p = p⋅ Φ = Φ Concatenarea cu mulţimea vidă.
•p(q|r) = pq|pr Distributivitatea operaţiilor de concatenare şi reuniune.
• (p|q)r = pr|qr Distributivitatea operaţiilor de concatenare şi reuniune.
•ε|pp*= p* Proprietăţi ale produsului Kleene.
•ε|p*p = p* Proprietăți ale produsului Kleene.
Exemple cu Expresii Regulate
Tabelul 4-1: Exemple de expresii regulate pentru identificarea elementelor de cod sursă C
Pentru alfabetul Σ = 0,1
1. Expresia regulată Σ* descrie limbajul tuturor şirurilor de caractere peste alfabetul Σ. Cu alte cuvinte, L(Σ*) = Σ*.
2. Limbajul tuturor şirurilor de caractere care încep cu 1 este descris de expresia regulată 1Σ*.
3. Limbajul tuturor şirurilor de caractere care se termină cu 1 este descris de expresia regulată Σ*1.
4. Limbajul tuturor şirurilor de caractere de lungime cel puţin 2 care încep şi se termină cu acelaşi simbol este descris de
expresia regulată 0Σ*0∪1Σ*1.
5. Limbajul şirurilor de caractere care conţin subşirul 001 este descris de expresia regulată Σ*001 Σ*.
6. Limbajul şirurilor de caractere care conţin un număr par de 1 este descris de expresia regulată (0*10*1)*0*.
7. Limbajul şirurilor de caractere care conţin un număr de 1 care este multiplu de k este descris de expresia regulată
(0*1)k)*0*.
Conversia unei expresii regulate într-un AFD
O expresie regulată:
➢ Poate fi privită ca o structură destinată validării unui șir de simboluri de intrare
➢ Poate fi convertită în primă fază într-un AFN, iar folosind algoritmul de transformare se poate obține AFD-ul
echivalent
➢ Pentru a simplifica procedura onversiei E.R. – AFN, o putem împărți în sub-probleme gestionabile individual
Vom începe cu primele două cazuri, cele elementare: expresiile regulate α și ℰ. Simbolul α va fi validat de un automat
care are o stare inițială, una acceptoare și o tranziție cu simbolul α de la starea inițială la cea acceptoare(Figura 4-1)
Aceeași structură este folosită pentru a valida simbolul nul ℰ, și anume o ℰ tranziție
către starea acceptoare în locul uneia cu un simbol al alfabetului. Cu alte cuvinte,
expresia regulate ℰ corespunde automatului din Figura 4-2

Figura 4-1: Automatul corespunzător expresiei regulate α

Figura 4-2: Automatul corespunzător expresiei regulate ℰ


În ce privește cazurile expresiilor regulate cmpuse din mai multe structri, procedura de conversie acționează recursive.
Astfel, rezultatul conversiei unei expresii regulate oarecare r într-un AFN este cel din Figura 4-3. Starea din partea stângă
reprezintă starea inițială a automatului corespunzător expresiei r, iar starea din partea dreaptă reprezintă sterile
acceptoareale aceluiași automat
Figura 4-3: Automatul corespunzător expresiei regulate r

În cazul unei structuri la alegere între două expresii regulate r1 și r2, scrisă sub forma r1|r2, automatul este compus dintr-o
stare inițială nouă cu ℰ tranziții de la stările acceptoare ale celor două automate, după cum este ilustrat în Figura 4-4

Figura 4-4: AFN-ul corespunzător expresiei r1|r2


O secvență de două expresii regulate concatenate r1 și r2, scrisă sub
forma r1|r2 se convertește într-un AFN prin simpla adăugare de tranziții
între stările acceptoare ale AFN-ului lui r1 și starea inițială a AFN-ului
lui r2, ca în Figura 4-5
Figura 4-5: AFN-ul corespunzător
expresiei r1r2
Conversia unui AFD într-o expresie regulată
În practică există cazuri de limbaje pentru care este mai uşor să se construiască AFD-ul direct decât să se scrie expresia
regulată corespunzătoare. Dacă este necesară şi expresia regulată pentru acel limbaj, atunci după construirea AFD-ului
acesta se poate converti la expresia regulată echivalentă. Pentru a elabora un algoritm generic de conversie a unui AFD
într-o expresie regulată, vom începe de la câteva cazuri particulare simple, crescând complexitatea pe parcurs.
Cele mai simple AFD-uri care se pot transforma în expresii regulate au o singură stare. Pentru alfabetul de intrare Σ = {0,
1} acestea sunt ilustrate în Figura 4-12.

Figura 4-12: Cele mai simple AFD-uri cu o singură stare pentru alfabetul de intrare Σ = {0,1}.
Aceste automate pot fi convertite direct în expresiile regulate Σ* şi Φ. Vom trece în continuare la un AFD cu două stări.
(Figura 4-13)

Figura 4-13: Un AFD cu două stări pentru alfabetul de intrare Σ = {a, b, c, d}.
Pentru a construi expresia regulată echivalentă acestui automat, considerăm că un şir de caractere de intrare poate tranzita
cele două stări, de la starea iniţială la cea acceptoare şi invers, de un număr de ori oarecare şi apoi poate trece în starea
acceptoare şi rămâne acolo. Aplicând acest raţionament, obţinem expresia regulată: (a∪bc*d)*bc*
Un alt exemplu de AFD cu două stări este cel din Figura 4-14, pentru care expresia regulate echivalentă este (a∪bc*d)*

Figura 4-14: Exemplu de AFD corespunzător expresiei regulate (a∪bc*d)*


Există AFD-uri în care tranzițiile sunt etichetate cu mai mult de un simbol, caz în care putem spune că fiecare astfel de
tranziţie constituie de fapt mai multe tranziţii de un simbol. Pentru a gestiona astfel de cazuri, se notează fiecare astfel de
tranziție cu o expresie regulată care reprezintă reuniunea acelor simboluri, ca în exemplul din Figura 4-15.
Figura 4-15: Exemplu de AFD cu notarea echivalentă a tranziţiilor.
Dacă o tranziţie este etichetată R=a1Ua2U... Uak, atunci acea tranziţie poate fi executată la citirea oricăruia din simbolurile
a1, a2, ak. Expresia regulată echivalentă unui astfel de automat poate fi obţinută aplicând acelaşi raţionament ca mai sus, de
exemplu pentru automatul din cazul nostru aceasta este: (R1 U (R2) (R3)* (R4))*(R2)(R3)*.

În cazul automatelor cu trei stări lucrurile se complică, dar în acest caz putem încerca să eliminăm starea din mijloc a
acestuia. Spre exemplu, in cazul automatului din Figura 4-16, pentru a elimina q1 trebuie luate în considerare toate
modalităţile prin care q1 este implicată în tranzitarea stărilor automatului.

Figura 4-16: Exemplu de AFD cu trei stări.


Starea q1 este tranzitată în drumul din q0 spre q2 folosind şirul de caractere w Є L((R2)(R3)*(R4)), deci pentru a elimina
starea q1 trebuie adăugată aceasta expresie regulată pe tranziţia care merge direct de la starea q0 la starea q2 (Figura 4-17).

Figura 4-17: Eliminărea stării din mijlocul AFD-ului din Figura 4-16.
Un alt caz care trebuie luat în calcul este utilizarea stării q1 pentru a tranzita din starea q0 în starea q0. AFD-ul realizează
acest lucru pentru un şir de caractere din L((R2) (R3)*(R7)), deci pentru a elimina starea qı trebuie adăugată această
expresie regulată la tranziţia din starea q0 în starea q0 (Figura 4-18).

Figura 4-18: Adăugarea expresiei regulate necesare tranzitării din starea q0 în starea q0 prin starea q1 în urma eliminării
celei din urmă.
Eliminarea corectă a stării q1 din AFD are loc după ce metoda de compensare de mai sus a fost aplicată pentru toate
perechile de stări din automat, altele decât q1. Automatul rezultat nu mai este un AFD propriu- zis deoarece conţine o
tranziţie etichetată cu o expresie regulată diferită de Φ sau de o reuniune de simboluri. Cu toate acestea, am obţinut un
automat cu două stări (Figura 4-19) care poate fi transformat în expresia regulată echivalentă folosind abordarea
prezentată mai sus.

Figura 4-19: AFD-ul cu două stări rezultat


Astfel, expresia regulată echivalentă este (R1U(R2)(R3)*(R4))*(R2) (R3)*.

Pentru a aplica această metodă de eliminare a stărilor pentru orice automat, trebuie rezolvat cazul particular în care starea
ce trebuie eliminată este una acceptoare. Pentru aceasta, AFD-ul se poate modifica astfel încât să conţină o singură stare
acceptoare. Acest lucru se realizează adăugând o nouă stare acceptoare, noi ɛ-tranziţii de la vechea stare acceptoare la cea
nouă, şi în final vechea stare acceptoare işi pierde acest statut în cadrul automatului.
Pentru automate mai mari de trei stări, metoda descrisă mai sus se aplică în acelaşi fel, procedându-se la eliminarea
stărilor una câte una până rămân doar două. Această metodă se poate formaliza ca un algoritm în 4 etape:
1. Dacă automatul nu are stări acceptoare, expresia regulată este Φ.
2. Se adaugă o nouă stare acceptoare împreună cu noi ɛ-tranziții de la vechea stare acceptoare la cea nouă. Vechea stare
acceptoare devine o stare obişnuită, ne-acceptoare.
3. Se elimină fiecare stare, una câte una, cu excepţia stării iniţiale şi a celei acceptoare. Se va obţine un automat de forma
celui din Figura 4-20.

Figura 4-20: AFD-ul obținut în urma etapei 3


4.Se scrie expresia regulată echivalentă (Ri*(R2))

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