Documente Academic
Documente Profesional
Documente Cultură
Compilatoare
G. Grigoras, LFAC 2
Tematica seminar
• Exemple de limbaje şi gramatici
• Automate finite deterministe, nedeterministe, cu
epsilon-tranziții - Exemple
• Expresii regulate – Exemple cu referire la unitățile
lexicale din limbajele de programare
• Gramatici independente de context, arbori de
derivare, eliminarea simbolurilor inutile,
eliminarea regulilor de ştergere, a redenumirilor
• Forma normală Chomsky, recunoaşterea -
algoritmul CYK
• Automate pushdown - exemple
G. Grigoras, LFAC 3
Tematica laborator
• Analiza lexicală
– Analizor lexical „manual”
– Analizor obținut cu un instrument de tip LEX
G. Grigoras, LFAC 4
Bibliografie
• Grigoras, Gh. Constructia compilatoarelor - Algoritmi
fundamentali, Ed. Universitatii Al. I. "Cuza Iasi", ISBN 973-703-
084-2, 274 pg., 2005
• Jucan Toader - Limbaje formale şi automate, Editura Matrix
Rom, Bucureşti, 1999, 162 p.
• Jucan Toader, Ştefan Andrei – Limbaje formale şi teoria
automatelor. Teorie şi practică, Editura Universității “Al. I.
Cuza”, Iaşi, 2002, 327p.
G. Grigoras, LFAC 6
Alfabet, cuvânt, mulțime de cuvinte
• Alfabet: V – o mulțime finită, elementele – simboluri
– Simbolurile le vom nota a, b, etc.
• Cuvânt: șir finit de simboluri
– Cuvintele le vom nota u, v, w, x, z, y
• V* - mulțimea tuturor cuvintelor, inclusiv cuvântul
nul notat ε (epsilon) sau λ (lambda)
– {0,1}* = {ε, 0, 1, 00, 01, 10, 11, 000, 001,... }
• V+ - mulțimea tuturor cuvintelor nenule
– {0,1}+ = {0, 1, 00, 01, 10, 11, 000, 001,... }
• Lungimea unui cuvânt u: numărul simbolurilor sale.
Notație: | u |
– | 0 | = 1, | 010 | = 3, | ε | = 0
G. Grigoras, LFAC 7
Alfabet, cuvânt, mulțime de cuvinte
• Concatenarea a două cuvinte x, y: cuvântul x·y obținut din
simbolurile lui x, în ordinea în care apar, urmate de cele ale lui
y de asemenea în ordinea în care apar:
– x = 0100, y = 100, x·y = 0100100
– x = 000, y = ε, x·y = 000
• Concatenarea este asociativă
• ε este element neutru
• (V*, ·) este monoid, se numeşte monoidul liber generat de V
• În continuare x·y se va nota xy
• Cuvântul v este un prefix al cuvântului u dacă w V*, u =
vw; dacă w V+ atunci v este un prefix propriu
• Cuvântul v este un sufix al cuvântului u dacă w V*, u = wv;
dacă w V+ atunci v este un sufix propriu
G. Grigoras, LFAC 8
Limbaj (formal)
• Fie V un alfabet. O submulțime L V* este un limbaj
(formal) peste alfabetul V (sau V-limbaj) dacă L are o
descriere finită.
• O descriere poate fi:
– neformală (în limbaj natural):
• mulțimea cuvintelor peste alfabetul {0,1} care conțin un număr par
de 0 şi un număr par de 1.
• L = {x V* : |x| este par}.
• { 0n1n | n N}.
• {w {0, 1}* | w este palindrom }.
– formală (descriere matematică):
• o descriere inductivă a cuvintelor
• o descriere generativă a cuvintelor (gramatică generativă)
• o descriere a unei metode de recunoaştere a cuvintelor din limbaj
(automat finit, automat pushdown, etc.)
G. Grigoras, LFAC 9
Non - limbaj
• Există submulțimi de cuvinte din V* care nu
sunt limbaje? Răspunsul este DA!
• Fie V = {a} și presupunem că fiecare
submulțime din V* este limbaj. Să enumerăm
aceste limbaje (se poate ): L0, L1, …, Ln, …
• Considerăm mulțimea S = {an| anLn, n>=0}.
Descrierea lui S este finită încât S este limbaj,
adică există k astfel încât S = Lk. Atunci:
– ak S ddacă ak Lk ddacă ak S - absurd!
– Așadar, există submulțimi din V* care nu sunt
limbaje
G. Grigoras, LFAC 10
Gramatici
• Sistemul G = (N, T, S, P) este o gramatică dacă:
– N și T sunt vocabulare disjuncte
• N este mulțimea neterminalilor utilizați pentru a
descrie structura limbajului
• T este mulțimea simbolurilor terminale – caracterele
care formează cuvintele limbajului
G. Grigoras, LFAC 11
Derivare, limbaj generat
• Fie G = (N, T, S, P) o gramatică, u, v (N T)*
Spunem că v este derivat într-un pas de la u prin
aplicarea regulii x y , și scriem u v, dacă u = pxq
iar v = pyq.
• Dacă u1 u2 … un, n > 1, spunem că un este
derivat din u1 în G și scriem u1 + un
• Scriem u * v dacă u = v sau u + v
• Limbajul generat de G este definit prin:
L(G) = {w T*| S + w}
• Două gramatici G1 și G2 sunt echivalente dacă
generează același limbaj: L(G1) = L(G2)
G. Grigoras, LFAC 12
Clasificarea gramaticilor(Chomsky)
Tipul gramaticii Restricții asupra Avantaje/Dezavantaje
regulilor
Gramatici generale Nu sunt Poate fi descrise orice limbaj / Nu există un
(Tip 0) algoritm general de recunoaştere
G. Grigoras, LFAC 13
Exemple
• L = {anbncn| n≥1}
• Definiția inductivă:
– a1b1c1 = abc L
– Dacă anbncn L atunci şi an+1bn+1cn+1 L
– Nici un alt cuvânt nu face parte din L
• Definiția generativă (o gramatică):
– G = (N, T, S, P), N = {S, X}, T = {a, b, c}, P constă din: S →
abc, S→aSXc, cX→Xc, bX →bb
• Derivarea cuvântului a3b3c3:
S aSXc aaSXcXc aaabcXcXc aaabXccXc
aaabbccXc aaabbcXcc
aaabbXccc aaabbbccc = a3b3c3
• Obs. G este gramatică G.de tip 1
Grigoras, LFAC 14
Exemple
G. Grigoras, LFAC 15
Ierarhia lui Chomsky
• Un limbaj L este de tipul j dacă există o gramatică G
de tipul j astfel încât L(G) = L, unde j {0, 1, 2, 3}.
G. Grigoras, LFAC 16
Operații cu limbaje
• Limbajele fiind mulțimi, suntem îndreptățiți să
vorbim despre reuniune, intersecție, etc. de limbaje
• Există şi operații specifice :
– Produsul de limbaje: L1L2 = { uv | u L1, v L2 }
– Iterația (produs Kleene): L* = n0 Ln , unde L0 = {} iar
Ln+1 = Ln L
– Pref(L) = { u | uv L}
– LR = { wR| w L}; dacă w = a1…an atunci wR = an…a1
• Proprietăți
– Fiecare din familiile Lj cu 0 ≤ j ≤ 3 conține toate limbajele
finite.
– Fiecare din familiile Lj cu 0 ≤ j ≤ 3 este închisă la operația
de reuniune
G. Grigoras, LFAC 17
Gramatici și limbaje regulate
• O gramatică G = (N, T, S, P) este de tip 3 (regulată) dacă regulile
sale sunt de forma A → u sau A → uB unde A, B N iar u T*.
G. Grigoras, LFAC 18
Exemple
• Considerăm gramatica G1 = ( {A, B} , {l,d} , A, P1)
unde P1 constă din regulile:
A → lB B → lB|dB|l|d l = literă, d = cifră
– L(G1) este mulțimea identificatorilor
G. Grigoras, LFAC 19
Proprietăți de închidere
G. Grigoras, LFAC 20
Proprietăți de închidere
Demonstrații
Fie G1 = (N1, T1, S1, P1) si G2 = (N2, T2, S2,P2) cu L1 = L(G1),
L2 = L(G2)
Presupunem N1 ∩ N2 = ∅ (eventual prin redenumirea
simbolurilor se obține acest lucru).
(a)Gramatica G = (N1 N2 {S}, T1 T2, S, P1 P2 {S →
S1, S → S2}) generează limbajul L1 L2
(b)Gramatica G = (N1 × N2, T1 ∩ T2, (S1, S2), P), unde P constă
din:
– (S1, S2) → ε dacă S1→ ε și S2 → ε
– (A1, B1) → a(A2, B2) dacă A1 → aA2 și B1 → aB2
– (A1, A2) → a dacă A1 → a și A2 → a
generează limbajul L1 ∩ L2 (s-au considerat G1, G2 în formă
normală)
G. Grigoras, LFAC 21
Proprietăți de închidere
(c) Gramatica G = (N1 N2, T1 T2, S1, P) unde P constă din:
- regulile de forma A → uB din P1
- reguli A → uS2 pentru orice regulă A → u din P1
- toate regulile din P2
generează limbajul L1L2
G. Grigoras, LFAC 22
Lema de pompare (Bar – Hillel)
Fie L un limbaj de tip 3. Există un număr m astfel încât
oricare ar fi cuvântul w L cu |w| ≥ m, acesta are o
descompunere de forma w = xyz, unde 0 < |y| ≤ m, şi
xyiz L oricare ar fi i ≥ 0.
Demonstrație
Fie G=(N, T, S, P) astfel ca L(G)=L. Dacă |N| este numărul
simbolurilor din N , m=|N|+1, se arată că are loc proprietatea
enunțată:
Fie w=a1a2….an, n ≥ m n ≥|N|+1
S a1A1 a1a2A2 …. a1a2…akAk ….. a1a2…ak
ak+1..asAs ….a1a2…ak ak+1..asas+1….an-1An-1 a1a2…ak
ak+1..asas+1….an-1an
Ak =As
G. Grigoras, LFAC 23
Lema de pompare (Bar – Hillel)
w=a1a2….an, n ≥ m
S a1A1 a1a2A2 …. a1a2…akAk ….. a1a2…ak
ak+1..asAk ……a1a2…ak ak+1..asas+1….an-1An-1 a1a2…ak
ak+1..asas+1….an-1an
Atunci: Ak * ak+1..asAk si
Ak *as+1….an-1an
Fie x= a1a2…ak, y=ak+1..as si z= as+1….an-1an
- Pentru i=0, xz L(G):
S a1a2…akAk * a1a2…ak as+1….an-1an = xz
G. Grigoras, LFAC 24
Lema de pompare (Bar – Hillel)
w=a1a2….an, n ≥ m
S a1A1 a1a2A2 …. a1a2…akAk ….. a1a2…ak ak+1..asAk ……a1a2…ak
ak+1..asas+1….an-1An-1 a1a2…ak ak+1..asas+1….an-1an
Ak * ak+1..asAk si
Ak *as+1….an-1an
x= a1a2…ak, y=ak+1..as z= as+1….an-1an
- Pentru i > 0, xyiz L(G):
S a1a2…akAk *a1a2…ak (ak+1..as )Ak *
*a1a2…ak (ak+1..as ) (ak+1..as )Ak *… *
* a1a2…ak (ak+1..as ) ….(ak+1..as )Ak *
*a1a2…ak (ak+1..as ) ….(ak+1..as ) as+1….an-1an= xyiz
G. Grigoras, LFAC 25