Sunteți pe pagina 1din 25

Limbaje Formale, Automate şi

Compilatoare

Curs: G. Grigoraș, grigoras@info.uaic.ro


Seminar, Laborator:
Oana Prisecaru, otto@info.uaic.ro
Ionel Ancuța, ancuta.ionel@info.uaic.ro
Tematica cursului
• Limbaje şi gramatici
• Gramatici şi limbaje regulate
• Gramatici şi limbaje independente de context
• Limbaje de programare: proiectare şi
implementare
• Analiza lexicală
• Analiza sintactică
• Traducere în cod intermediar

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

• Analiza sintactică folosind instrumente de tip


YACC
• Interpreter construit cu LEX şi YACC

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.

• Stoughton Alley, Formal Language Theory, Kansas State


University, Draft of Fall 2007.
• Yehezkael R.B., Course notes on Formal Languages and
Compilers, Jerusalem College of Technology, December 2004.
• Manual LEX, Manual FLEX, Manual YACC, Manual Bison,
Compiler Construction using Flex and Bison
G. Grigoras, LFAC 5
Curs 1 - plan
• Alfabet, cuvânt, mulțime de cuvinte
• Limbaj (formal)
• Non – limbaj
• Gramatici
– Definiție
– Derivare, limbaj generat
– Exemple
• Tipurile de gramatici, ierarhia lui Chomsky
• Gramatici și limbaje de tip 3
– Definiție, exemple, proprietăți

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| anLn, 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

– S este neterminalul inițial (simbol de start), S  N


– P este o mulțime finită de reguli (producții, reguli
de înlocuire, reguli de rescriere) de forma x  y
unde x, y (N  T)* şi x conține cel puțin un
neterminal

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

Gramatici pxq → pyq unde Pot fi descrise toate trăsăturile limbajelor de


dependente de y ≠, p,q  (N  T)* programare, există algoritmi generali de
context S → ε, caz în care S nu recunoaștere dar sunt ineficienți
(Tip 1) apare în dreapta
producțiilor
Gramatici A → y unde Algoritmi generali de recunoaștere eficienți,
independente de A  N și y  (N  T)* utilizați în practică (compilare). Nu pot fi
context exprimate trăsături semantice (ex. legătura
(Tip 2) între utilizarea variabilelor și declararea
acestora)
Gramatici regulate A → u sau A → uB Există metode secvențiale de recunoaştere, Pot
(Tip 3) unde A, B  N și fi descrise doar trăsături secvențiale ale
u  T*. limbajelor de programare (identificatori,
constante etc.) dar nu expresii, instrucțiuni

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

• Construiți o gramatică de tip 1 pentru limbajul {anbncndn | n ≥ 1}


• Construiți o gramatică de tip 2 pentru limbajul {anbn | n ≥ 1}
• Construiți o gramatică de tip 3 pentru limbajul {anbm | n, m ≥ 1}
• Fie G = ({E}, {a, +, -, (, )}, E, {E→a, E→(E+E), E→(E-E)}).
– Ce tip are gramatica G ?
– Construiți derivări din E pentru cuvintele (a+a) şi ((a+a)-a)
– Cuvântul (a+a-a) poate fi derivat din E?
– Descrieți limbajul L(G)

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

• Vom nota cu Lj clasa limbajelor de tipul j, unde j 


{0, 1, 2, 3}.

• Ierarhia lui Chomsky: L3  L2  L1  L0

• Incluziunile sunt stricte:


– orice limbaj de tip j+1 este și de tip j  {0, 1, 2}.
– există limbaje de tip j care nu sunt de tip j+1, j  {0, 1, 2}.

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* =  n0 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*.

• O gramatică de tip 3 este în formă normală dacă regulile sale


sunt de forma A → a sau A → aB, unde a  T, și eventual S → 
(în care caz S nu apare în dreapta regulilor).

• Orice gramatică de tip 3 admite o formă normală echivalentă:


– Orice regulă de forma A → a1a2…an se înlocuiește cu A → a1B1, B1 → a2B2, …, Bn-2
→ an-1Bn-1, Bn-1 →an n > 1, B1,…, Bn-1 fiind neterminali noi
– Orice regulă de forma A → a1a2…anB se înlocuiește cu A → a1B1, B1 → a2B2, …,
Bn-2 → an-1Bn-1, Bn-1 →anB n > 1, B1,…, Bn-1 fiind neterminali noi
– Se poate arăta că pot fi eliminate regulile de forma A → B (redenumiri) și cele de
forma A →  (reguli de ștergere), cu excepția, eventual a regulii S → 
– Transformările care se fac nu modifică limbajul generat de gramatică

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

• Considerăm gramatica G2 = ( {A, B} , {+,-,d} , A, P2)


unde P2 constă din regulile:
A → +B|-B|dB|d B→ dB|d d = cifră
– L(G2) este mulțimea constantelor întregi

G. Grigoras, LFAC 19
Proprietăți de închidere

• Fie L, L1, L2 limbaje regulate, ceea ce înseamnă că


există gramaticile G, G1, G2 astfel ca
L = L(G), L1 = L(G1) și L2 = L(G2).
Atunci, următoarele limbaje sunt de asemenea
regulate:
(a) L1  L2 (b) L1 ∩ L2 (c) L1 L2
(d) L1\L2 (e) L* (e) LR

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

(e) G=(N ,T,S,P’)


P’: -reguli A →uB din P
-reguli A → uS, pentru orice regula A → u din P
- regula S → 
generează L*
etc. (exercițiu)

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

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