Sunteți pe pagina 1din 38

Compilatoare

n 1954 IBM dezvolt 704, primul calculator cu producie de serie Dezvoltarea software-ului pentru acest calculator (i n general la acea dat) se fcea numai n limbaj de asamblare Costurile software-ului erau cu mult mai mari dect cele ale hardware-ului Soluia 1: Speedcoding un interpretor; rezultat: rularea era mai nceat de 10-20 de ori dect a codului (scris de mn) n limbaj de asamblare Soluia 2: John Backus are ideea de a translata codul de nivel nalt n limbaj de asamblare, lucru pe care muli l considerau imposibil deoarece euase n alte proiecte; rezultat: proiectul FORTRAN I a fost un succes cu un impact enorm n tiina calculatoarelor Compilatoarele moderne pstreaz nc structura general a lui FORTRAN I

Iniial compilatoarele erau scrise n limbaj de asamblare Primul compilator capabil s i compileze propriul cod surs scris ntr-un limbaj de nivel nalt a fost creat pentru Lisp de ctre Hart i Levin de la MIT n 1962 ncepnd cu anii 1970 practica obinuit este de a scrie compilatorul chiar n limbajul pe care l compileaz Limbajele C i Pascal au fost i ele des folosite n acest scop Construirea unui auto-compilator este o problem de tip bootstrapping (problem de tip Cine a fost primul: oul sau gina?):

Primul compilator pentru un limbaj trebuie compilat fie de ctre un compilator scris ntr-un alt limbaj de programare Fie compilat prin rularea compilatorului ntr-un interpretor

Limbajul este o modalitate sistematic de comunicare care utilizeaz sunete sau simboluri convenionale. Referindu-ne la limbajele de programare, simbolurile convenionale sunt iruri de caractere. Pentru a defini un ir de caractere trebuie s pornim de la un alfabet. Un alfabet este o mulime finit de simboli.

Exemple:
1 = {a, , , b, c, d, , z}: mulimea literelor din limba romn 2 = {0, 1, , 9}: mulimea cifrelor (baza 10) 3 = {a, b, , z, #}: mulimea literelor din alfabetul latin, plus simbolul special #

Un ir de simboli peste alfabetul este o succesiune finit de simboluri din acest alfabet.
abfbz este ir de caractere peste 1 = {a, b, c, d, , z} 9021 este ir de caractere peste 2 = {0, 1, , 9} ab#bc este ir de caractere peste 3 = {a, b, , z, #}

Vom nota cu * mulimea tuturor irurilor de caractere peste , iar + cu mulimea tuturor irurilor de caractere peste cu excepia irului vid. Un limbaj este un set de iruri de simboli peste acelai alfabet. Daca limbajul este finit atunci el poate sa fie definit prin enumerare. Cum poate fi definit un limbaj infinit? Doua mecanisme distincte de definire finita a limbajelor: prin generare sau prin recunoastere. In primul caz este vorba de un "dispozitiv" care stie sa genereze toate propozitiile din limbaj (si numai pe acestea) astfel incit alegind o propozitie din limbaj intr-un interval finit de timp dispozitivul va ajunge sa genereze propozitia respectiva. In al doilea caz este vorba de un "dispozitiv" care stie sa recunoasca (sa accepte ca fiind corecte) propozitiile limbajului dat.

Gramatica : Unde: VN S P

G = (VN, , S, P )

- multimea de neterminale - multimea de terminale, - simbolul initial (de start), S VN - reguli de productie

Regula de productie : este un element de forma -> , V +, V *, si siruri de terminale si neterminale de lungime finita ( trebuie sa contina cel putin un neterminal) V = VN U se numete alfabetul gramaticii

Exemplu:
VN = {subiect, predicat}, = {Ana, Ion, nva, doarme, ., }, S = propoziie P : propoziie -> subiect predicat. subiect -> Ana | Ion predicat -> nva | doarme

Convenie de notaie: literele mici de la inceputul alfabetului latin (a,b,c,...) reprezinta elemente din (simboli terminali); literele mici de la sfirsitul alfabetului latin (u, v, x,...) reprezinta elemente din * (siruri de simboli terminali); literele mari de la inceputul alfabetului latin (A, B, C,...) reprezinta elemente din VN (simboli neterminali); literele mari de la sfirsitul alfabetului latin (U, V, X,...) reprezinta elemente din VN U (simboli terminali sau neterminali); literele alfabetului grecesc reprezinta siruri din (VN U )* (siruri de simboli terminali si neterminali).

O forma propozitionala pentru o gramatica G se defineste recursiv astfel: (1) S este o forma propozitionala (2) daca aBt este o forma propozitionala si exista o productie B -> r atunci art este o forma propozitionala. Exemplu: propoziie, subiect predicat., Ana predicat., subiect nva., Ana nva.

O forma propozitionala care contine numai simboli terminali se numeste propozitie generata de G. Exemplu: Ana nva., Ion doarme. Notam cu L(G) multimea tuturor propozitiilor generate de G. L(G) este limbajul generat de gramatica G. L(G) = { x* S =*> x } L(G) = {Ana nva., Ion nva., Ana doarme., Ion doame.} O gramatica este o reprezentare finita (toate elementele sale sint finite) a unui limbaj care poate sa fie infinit. Nu orice limbaj are o reprezentare finita, cu alte cuvinte nu pentru orice limbaj exista o gramatica care sa il reprezinte.

Gramatica independenta de context (GIC) : G = (VN, , S, P ) unde fiecare regula de productie -> verifica VN, V* adica este de forma A -> u, AVN

Exemplu: Propoziie S Atr P C verb Atr Verb C Subst Adject Adverb

-> S [Atr] P [C]. -> subst | verb -> adject -> verb -> adverb -> a merge Atr | a cnta Atr -> este C | face C -> copilul | cinele -> frumos | ru -> bine | mult

Gramatica liniara dreapta : este o gramatica independenta de context unde fiecare productie este de forma A -> u sau A -> uB, unde u*, A, B VN Gramatica liniara stanga : este o gramatica independenta de context unde fiecare productie este de forma A -> u sau A -> Bu , unde u*, A, B VN Daca u = a atunci gramatica se numeste regulata.

Derivare directa : => Fie x,y,z si , (VN U ) si -> o regula de productie din P xy => xy <=> -> P Derivare in k pasi : =k> =k> <=> () 1, ,k+1 cu proprietatile Inchiderea tranzitiva a relatiei de derivare : =+> =+> <=> () k>=1 a.i. = k> Inchiderea tranzitiva si reflexiva : =*> =*> <=> ( =) V ( =+>) 1 = ; k+1= ; i -> i+1 , i[1, k]

Forma propozitionala : orice sir V * cu proprietatea S =*> Propozitie : orice sir x * cu proprietatea S =*> x Tipuri de derivare : * derivare stanga - in fiecare forma propozitionala se inlocuieste neterminalul cel mai din stanga * derivare dreapta- in fiecare forma propozitionala se inlocuieste neterminalul cel mai din dreapta

Tipuri de recursivitate : * recursivitate stanga A =+> A * recursivitate dreapta A =+> A

gramatica de tip 0: nu are nici un fel de restrictie asupra regulilor decat cele din definitie (gramatici generale) gramatica de tip 1: regulile sale sunt de tipul uxv -> urv, unde u, v V*; x VN; r V+ sau de forma x -> , caz in care x nu mai apare in partea dreapta a vreunei reguli din gramatica (gramatici sensibile la (dependente de) context) gramatica de tip 2: regulile sale sunt de tipul x -> r, unde x VN; r V* (gramatici libere (independente) de context) gramatica de tip 3: regulile sale sunt de tipul x -> px sau x -> p; unde x; x VN; p * (gramatici liniare la dreapta); analog se pot de fini gramaticile liniare la stanga

Clasificare : Limbaje * naturale L1 L2 * formale (artificiale) Limbaje * independente de context * liniare L3 * regulate L0 - clasa limbajelor generate din gramatica Chomsky, L1 - clasa limbajelor dependente de context, L2 - clasa limbajelor independente de context, L3 - clasa limbajelor regulate, L4 - clasa limbajelor liniare

L0

L4

Fie M - multime de noduri, R - relatie binara peste M, un arc (a,b) R. Atunci (M, R) este un graf orientat. Fie: Input(a) = { b / (b,a)R } si Output(a) = { b / (a,b) R } Un arbore este un graf orientat cu urmatoarele restrictii: 1. r unic a.i. Input ( r ) = 2. a M , a r, card(Input( a )) = 1 3. a M , (r, a) R* Un arbore de derivare sau S-arbore pentru o gramatica G independenta de context, G = (VN, , S, P ) este arborele etichetat ordonat de la stnga la dreapta A = (M, R) cu proprietatile: 1. radacina arborelui este etichetata cu S 2. pt. orice a M cu descendenti, A eticheta nodului a , X1,,Xi etichetele descendentilor, () in P productia A->X1Xi

Analiza sintactic se face pe baza arborelui de derivare. Un arbore de derivare este o reprezentare grafica pentru o secventa de derivari. Intr-un arbore de derivare nu se mai poate identifica ordinea in care s-a facut substitutia simbolilor neterminali. Fiecare nod interior arborelui, reprezinta un neterminal. Descendentii unui nod etichetat cu un neterminal A sint etichetati de la stinga la dreapta prin simbolii care formeaza partea dreapta a unei productii care are in partea stinga neterminalul A. Parcurgind de la stinga la dreapta frunzele unui arbore se obtine o forma propozitionala.

Construcia arborelui de derivare se poate face n dou moduri: Pornind de la radacina i aplicind succesiv productii (corespunde analizei sintactice descendente - top-down) Pornind de la sirul de atomi lexicali (frunze) i identificndu-se simbolii neterminali din care se poate obine un ir de atomi lexicali (corespunde analizei sintactice ascendente bottom-up)

Teoria automatelor studiaz legile computaiei. Se utilizeaz pentru a modela sisteme reale. Pentru teoria limbajelor formale: sunt dispozitive de calcul care accept/recunosc limbaje regulate. Exemplu: ntreruptorul unui aparat electric: apsarea utilizatorului poate s porneasc sau s opreasc aparatul respectiv. Proiectai un automat care s spun starea n care se afl aparatul la un moment dat.

Aciune utilizator

oprit
Aciune utilizator

pornit

Despre dispozitive de acest fel este dificil de discutat, deoarece pot fi proiectate ntr-o infinitate de moduri. Reprezentarea (modelarea) lor sub form de automate ofer o baz matematic comun pentru studiu.

Automatul finit determinist este un obiect matematic unde - alfabetul limbajului de intrare al automatului, Q - multimea finita de stari a automatului, F - multimea strilor finale ale automatului (FQ), q0 -stare initiala, q0Q, f - functia de tranzitie f: Q -> Q. Configuratie: este numit un dublet (x, q ) , unde x este sirul de la intrare neanalizat inca; x * ,iar q Q. M = (, Q, F, q0, f)

Un automat finit poate fi reprezentat n dou moduri: Cu ajutorul grafului de tranziie


Convenii de reprezentare:
Strile se reprezint prin cercuri. Tranziiile se reprezint prin sgei ntre stri. Cercul care reprezint starea iniial trebuie s aib o sgeat care atinge acest cerc Cercurile care reprezint strile finale se dubleaz.

Prin tabela de tranziie

0 q0 1 q1

1 0 q2

0,1

Alfabet = {0, 1} Stri Q = {q0, q1, q2} Starea iniial q0 Stri finale F = {q0, q1}

Tabela de tranziie:
intrri

q0 q1 q2

0 q0 q2 q2

1 q1 q1 q2

stri

Relatia de miscare: |--- este definita astfel (ax, q) |--- (x, q1) <=> f(q, a) = q1

Relatia de miscare in k pasi : configuratii astfel nct (a1a2 akx, q ) |---k (x, q ) , daca () k+1 (a1a2 akx, q0 ) |---k (x, qk ) , q0 = q , qk = q si () (aiai+1 akx, qi-1 ) |--- (ai+1, akx, qi ) Relatia generala de miscare : (x1 , q1) |---* (x2 , q2) <=> (x1 =x2 si q1 =q2 ) sau ((x1 , q1) |---+ (x2 , q2))

Sir x acceptat de automatul M: Limbajul acceptat de M: unde f se extinde la f* astfel f* (q, ) = q f* (q, ax) = f* (f (q, a ), x) Cu alte cuvinte: Limbajul acceptat de M este mulimea irurilor din care, pentru care, pornind de la q0 i urmnd tranziiile pe msur ce irul este citit de la stnga la dreapta, se ajunge la o stare final. Automatul M este determinist daca pentru fiecare stare si comanda de intrare exista o singura stare in care poate trece. L(M) = {x * | f *(q0 , x) F } (x , q0) |--* (, q ) , qF

M = (, Q, F, q0, f) , Q = {q0, q1, q2, q3} F= {q3} , = {a, b} , f definita astfel f (q0, a) = q2 f (q0, b) = q1 f (q1, a) = q3 f (q1, b) = q0 f (q2, a) = q0 f (q2, b) = q3 f (q3, a) = q1 f (q3, b) = q2
q1 b b Stare initiala q0

a a
q2

a a

q3 q

Diagrama de stari a automatului determinist. Propozitiile ab, ba, aaba, ... sunt acceptate de automatul M.

Automate finite nedeterministe : M(, Q, F, q0, f) unde f: Q -> 2Q - Exemplu : Q = {q1, q2, q3, q4}, F= {q4}, = {0,1}, f definita astfel: f (q1, 0) = {q1 , q2 } f (q1, 1) = {q1, q3 } f (q2, 0) = {q2 , q4 } f (q2, 1) = q2 f (q3, 0) = f (q3, 1) = q3 f (q4, 0) = f (q4, 1) = 0,1
q2

0,1
q1

1
q3

q4

Graful de stari

Teorema: Pentru fiecare automat finit nedeterminist M, exista un automat finit determinist M echivalent, adica L(M) = L(M). M(, Q, F, q0, f) M(, Q, F, q0, f )

Q - starile formate din combinatiile starilor A.F.N. inclusiv q0 - starea initiala a A.F.D. F - combinatiile de stari care contin cel putin o stare finala din A.F.N.

AFN
Stri q0, q1, , qn

AFD
, {q0}, {q1}, {q0,q1}, , {q0,,qn}
Cte una pt. fiecare submulime de stri din AFN.

Starea iniial q0 f Tranziii Stri finale FQ

{q0} f({qi1,,qik}, a) = f(qi1, a) f(qik, a)

F = {S: S conine cel puin o stare final AFN} Dup aplicarea transformrilor se elimina strile i tranziiile moarte.

0, 1 AFN: q0 1 q1 0 q2

AFD: {q0} 0, 1
0, 1

0 1 0 1 {q1} 0 {q2} 0 {q1, q2} {q0, q1} 1 0

1 0 {q0, q1, q2}

{q0, q2}

http://www.scribd.com/doc/22056333/Limb aje-formale-%C5%9Fi-automate

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