Documente Academic
Documente Profesional
Documente Cultură
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
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ă
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
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
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
• 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, 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.”
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:
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
Î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-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)*
Î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-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.
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.