Limbaje Formale Si Automate

144
Irina Athanasiu 3/1/2002 Limbaje formale şi automate 1 1 INTRODUCERE - ORGANIZAREA UNUI COMPILATOR................................ 2 1.1 Analiza lexicala ......................................................................................................................................... 4 1.2 Analiza sintactică ...................................................................................................................................... 4 1.3 Analiza semantică ..................................................................................................................................... 5 1.4 Generarea de cod intermediar................................................................................................................. 5 1.5 Optimizarea codului intermediar............................................................................................................ 5 1.6 Generarea codului obiect ......................................................................................................................... 6 1.7 Optimizarea codului obiect ...................................................................................................................... 6 1.8 Gestiunea tabelei de simboluri ................................................................................................................ 6 1.9 Detectarea erorilor ................................................................................................................................... 6 2 ELEMENTE DE TEORIA LIMBAJELOR FORMALE........................................ 7 2.1 Gramatici .................................................................................................................................................. 7 2.1.1 Ierarhia Chomsky............................................................................................................................... 8 2.1.1.1 Exerciţii ........................................................................................................................................ 9 2.1.2 Verificarea limbajului generat de către o gramatică ........................................................................ 10 2.1.2.1 Exerciţii ...................................................................................................................................... 11 2.1.3 Transformări asupra gramaticilor independente de context ............................................................. 11 2.1.3.1 Eliminarea ambiguităţii............................................................................................................... 12 2.1.3.2 Eliminarea λ- producţiilor .......................................................................................................... 16 2.1.3.3 Eliminarea recursivităţii stânga................................................................................................... 16 2.1.3.4 Factorizare stânga ....................................................................................................................... 18 2.1.3.5 Eliminarea simbolilor neterminali neutilizaţi.............................................................................. 19 2.1.3.6 Substituţia de începuturi(corner substitution) ............................................................................. 20 2.1.4 Construcţii dependente de context ................................................................................................... 22 2.1.4.1 Exerciţii ...................................................................................................................................... 23 2.1.5 Proprietăţi ale limbajelor independente de context .......................................................................... 24 2.1.5.1 Exerciţii ...................................................................................................................................... 25 2.2 Mulţimi regulate, expresii regulate. ...................................................................................................... 25 2.3 Acceptoare............................................................................................................................................... 28 2.3.1 Automate finite ................................................................................................................................ 29 2.3.1.1 Construcţia unui automat finit nedeterminist care acceptă limbajul descris de o expresie regulată dată 30 2.3.1.2 Conversia unui automat finit nedeterminist (AFN) într-un automat finit determinist(AFD)...... 34 2.3.1.3 Construcţia unui automat finit determinist care acceptă limbajul descris de o expresie regulată dată 37 2.3.1.4 Simularea unui automat finit determinist .................................................................................... 43 2.3.1.5 Simularea unui automat finit nedeterminist ................................................................................ 44 2.3.1.6 Probleme de implementare pentru automatele finite deterministe şi nedeterministe .................. 45 2.3.1.7 Minimizarea numărului de stări pentru AFD .............................................................................. 46

description

curs

Transcript of Limbaje Formale Si Automate

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    1

    1 INTRODUCERE - ORGANIZAREA UNUI COMPILATOR................................ 2

    1.1 Analiza lexicala ......................................................................................................................................... 4

    1.2 Analiza sintactic...................................................................................................................................... 4

    1.3 Analiza semantic ..................................................................................................................................... 5

    1.4 Generarea de cod intermediar................................................................................................................. 5

    1.5 Optimizarea codului intermediar............................................................................................................ 5

    1.6 Generarea codului obiect ......................................................................................................................... 6

    1.7 Optimizarea codului obiect...................................................................................................................... 6

    1.8 Gestiunea tabelei de simboluri ................................................................................................................ 6

    1.9 Detectarea erorilor ................................................................................................................................... 6

    2 ELEMENTE DE TEORIA LIMBAJELOR FORMALE........................................ 7

    2.1 Gramatici .................................................................................................................................................. 7 2.1.1 Ierarhia Chomsky............................................................................................................................... 8

    2.1.1.1 Exerciii ........................................................................................................................................ 9 2.1.2 Verificarea limbajului generat de ctre o gramatic ........................................................................ 10

    2.1.2.1 Exerciii ...................................................................................................................................... 11 2.1.3 Transformri asupra gramaticilor independente de context............................................................. 11

    2.1.3.1 Eliminarea ambiguitii............................................................................................................... 12 2.1.3.2 Eliminarea - produciilor .......................................................................................................... 16 2.1.3.3 Eliminarea recursivitii stnga................................................................................................... 16 2.1.3.4 Factorizare stnga ....................................................................................................................... 18 2.1.3.5 Eliminarea simbolilor neterminali neutilizai.............................................................................. 19 2.1.3.6 Substituia de nceputuri(corner substitution)............................................................................. 20

    2.1.4 Construcii dependente de context ................................................................................................... 22 2.1.4.1 Exerciii ...................................................................................................................................... 23

    2.1.5 Proprieti ale limbajelor independente de context.......................................................................... 24 2.1.5.1 Exerciii ...................................................................................................................................... 25

    2.2 Mulimi regulate, expresii regulate. ...................................................................................................... 25

    2.3 Acceptoare............................................................................................................................................... 28 2.3.1 Automate finite ................................................................................................................................ 29

    2.3.1.1 Construcia unui automat finit nedeterminist care accept limbajul descris de o expresie regulat dat 30

    2.3.1.2 Conversia unui automat finit nedeterminist (AFN) ntr-un automat finit determinist(AFD)...... 34 2.3.1.3 Construcia unui automat finit determinist care accept limbajul descris de o expresie regulat

    dat 37 2.3.1.4 Simularea unui automat finit determinist.................................................................................... 43 2.3.1.5 Simularea unui automat finit nedeterminist ................................................................................ 44 2.3.1.6 Probleme de implementare pentru automatele finite deterministe i nedeterministe.................. 45 2.3.1.7 Minimizarea numrului de stri pentru AFD.............................................................................. 46

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    2

    2.3.2 Automate cu stiv (pushdown) ........................................................................................................ 49 2.3.2.1 Automate cu stiv cu acceptare prin stiv goal ......................................................................... 52 2.3.2.2 Relaia ntre automate cu stiv i limbajele independente de context......................................... 53

    2.3.3 Maina Turing.................................................................................................................................. 57 2.3.3.1 Calcule realizate de Maina Turing ............................................................................................ 60 2.3.3.2 Compunerea mainilor Turing .................................................................................................... 63 2.3.3.3 Extensii pentru maina Turing.................................................................................................... 67 2.3.3.4 Automate liniar mrginite ........................................................................................................... 73 2.3.3.5 Relaia ntre maina Turing i gramatici ..................................................................................... 74 2.3.3.6 Elemente de calculabilitate ......................................................................................................... 77

    2.3.3.6.1 Maina Turing Universal ................................................................................................... 77 2.3.3.7 . Maina Turing cu limit de timp............................................................................................... 81

    3 2. ANALIZA LEXICAL .................................................................................. 83

    3.1 Interfaa analizorului lexical ................................................................................................................. 87

    3.2 Un exemplu elementar de analizor lexical............................................................................................ 89

    4 ANALIZA SINTACTIC .................................................................................. 99

    4.1 Analiza sintactica top - down............................................................................................................... 103 4.1.1 Analiza sintactica predictiva (descendent recursiva) ..................................................................... 104

    4.1.1.1 Gramatici LL(1)........................................................................................................................ 109 4.1.1.2 Tratarea erorilor n analiza predictiv....................................................................................... 115

    4.1.2 Analiza sintactica bottom-up ......................................................................................................... 117 4.1.2.1 Analiza sintactica de tip deplaseaza i reduce .......................................................................... 117 4.1.2.2 Implementarea analizei sintactice bottom-up deplaseaz i reduce .......................................... 117 4.1.2.3 Analiza sintactica de tip LR(k) ................................................................................................. 121

    4.1.2.3.1 Analiza SLR ...................................................................................................................... 129 4.1.2.3.2 Analiza canonica LR ......................................................................................................... 136 4.1.2.3.3 Analiza sintactic LALR ................................................................................................... 142

    1 Introducere - organizarea unui compilator Un compilator este un program complex care realizeaz traducerea unui program surs ntr-un

    program obiect. De obicei programul surs este scris ntr-un limbaj de nivel superior celui n care este scris programul obiect.

    Structura general pentru un compilator este:

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    3

    program sursa | +-----------------+

    | preprocesor | pas 1 +-----------------+

    | pas 2 + - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - + | | | | | | | +------------------+ +--------------------+ | | | analiza lexicala |--------->| analiza sintactica | | | | |

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    4

    sunt realizate printr-un ansamblu de funcii care coopereaz. n cele ce urmeaz aceste componente vor fi descrise separat pentru simplificarea expunerii.

    1.1 Analiza lexicala Aceast faz a compilatorului realizeaz traducerea textului programului ntr-o forma mai uor de

    prelucrat de ctre celelalte componente. Analizorul lexical consider textul primit la intrare ca fiind format din uniti lexicale pe care le recunoate producnd atomi lexicali. Un atom lexical poate s fie de exemplu, un cuvnt cheie al limbajului (for, while, etc) dar i un numr sau un nume. Nu exist o coresponden biunivoc ntre irurile de intrare i atomii lexicali. Adic, dac pentru atomul lexical corespunztor cuvntului cheie while exist un singur ir de intrare, pentru atomul lexical corespunztor unui numr ntreg pot s existe foarte multe iruri de intrare. Una dintre deciziile ce trebuie luate la nceputul proiectrii unui compilator const din stabilirea atomilor lexicali. De exemplu, se pune problema dac s existe cte un atom lexical pentru fiecare operator de comparaie (=) sau s existe un unic atom lexical - corespunztor operaiei de comparaie. n primul caz generarea de cod poate s fie mai simpl. Pe de alt parte existena unui numr mare de atomi lexicali poate complica n mod exagerat analiza sintactic. n general, operatorii care au aceeai prioritate i asociativitate pot s fie grupai mpreun.

    Rolul unui analizor lexical este de a traduce irurile de intrare n atomi lexicali. Un atom lexical este reprezentat printr-un cod numeric care specifica clasa acestuia i o serie de atribute care sunt specifice fiecrei clase. Astfel, poate s existe clasa operatorilor relaionali pentru care un atribut trebuie s se specifice tipul concret al operatorului. Tipul atomului lexical este necesar pentru analiza sintactic n timp ce valoarea atributului este semnificativ pentru analiza semantic i generarea de cod. Pentru un atom lexical de tip numr atributele vor descrie tipul numrului i valoarea acestuia.

    Un analizor lexical apare n general ca o funcie care interacioneaz cu restul compilatorului printr-o interfa simpl : ori de cte ori analizorul sintactic are nevoie de un nou atom lexical va apela analizorul lexical care i va da atomul lexical urmtor.

    1.2 Analiza sintactic Analiza sintactic descompune textul programului sursa n componentele sale "gramaticale",

    construind un arbore care reflect aceast structur. S considerm de exemplu expresia : A * B + C * D Aceast expresie poate s fie descris de urmtorul tip de arbore numit arbore sintactic: +

    / \ / \ / \ * *

    / \ / \ / \ / \ A B C D n acest arbore au fost evideniate relaiile (din punctul de vedere al modului de evaluare) ntre

    componentele expresiei. Dac se dorete ns s se evidenieze structura expresiei din punctul de vedere al unitilor sintactice din care este format, atunci se va utiliza pentru reprezentarea expresiei un arbore de derivare (parse tree). Pentru exemplul considerat un arbore de derivare ar putea s fie de forma:

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    5

    expresie / | \ expresie + expresie / / / \ \ \ / / / \ \ \ / / / \ \ expresie * expresie expresie * expresie | | | | nume nume nume nume | | | | A B C D

    Orice analizor sintactic realizeaz traducerea unui ir de atomi lexicali ntr-un astfel de arbore de derivare care descrie relaia ierarhic ntre o descriere general a propoziiei analizate (rdcina arborelui) i irul de atomi lexicali din care este format (frunzele). Un analizor sintactic poate s construiasc efectiv o structur de date de tip arbore (cu pointeri i nregistrri) sau poate s sintetizeze informaiile din care se poate face construcia acestuia.

    1.3 Analiza semantic Aceast faz este de obicei incorporat n faza de analiz sintactic. Rolul acestei faze const din

    verificarea din punct de vedere semantic a structurilor recunoscute drept corecte din punct de vedere sintactic. Majoritatea verificrilor realizate de ctre aceast faz se refer la tipurile construciilor. De asemenea aceast faz completeaz arborele de derivare cu o serie de informaii necesare generrii de cod.

    1.4 Generarea de cod intermediar Nici aceasta faz nu este ntotdeauna separat de analiza sintactic, exist compilatoare care

    genereaz cod chiar n timpul analizei sintactice. Generarea de cod se face prin parcurgerea arborelui de derivare. Forma intermediar care se genereaz reprezint codul obiect pentru o main virtual. Utilizarea formelor intermediare se justifica prin cteva argumente. n primul rnd anumite optimizri nu se pot face n timpul analizei sintactice i sunt dificil de realizat pe un text de program ntr-un limbaj de programare de nivel foarte sczut. De exemplu scoaterea expresiilor constante n afara ciclurilor. Alt motiv este utilizarea aceleai faze de optimizare i generare de cod main pentru diferite limbaje de programare, respectiv utilizarea aceleai faze de analiza sintactic, semantic i generare de cod intermediar pentru a implementa acelai compilator (limbaj) pe maini diferite. Cu alte cuvinte pentru a realiza implementri portabile pentru compilatoare. De asemenea utilizarea unei maini virtuale permite realizarea mai simpl de compilatoare incrementale sau interpretoare performante. Acest tip de translatoare execut direct (interpreteaz) codul intermediar fr a mai trece prin fazele urmtoare - editare de legturi, ncrcare, etc., dar i fr a recunoate de fiecare dat o instruciune care a fost deja tratat, cum s-ar ntmpla dac interpretarea s-ar face la nivel de limbaj surs.

    Dezavantajul utilizrii unei forme intermediare const n mod evident din mrirea timpului necesar pentru execuia unei compilri.

    1.5 Optimizarea codului intermediar Aceast faz identific optimizrile posibile asupra codului n limbaj intermediar. De exemplu pentru

    o secven ca:

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    6

    for(....){ a[i * c] = b[i * d] + e + f; ...

    } Se observ c o parte din calcule se pot efectua o singur dat nainte de ciclul for, rezultatele

    respective se pot memora n variabile temporare, etc. Desigur astfel de optimizri pot s fie fcute i de ctre programator. Este de preferat ns s se pstreze claritatea programului, iar acest tip de transformri s fie realizate de ctre compilator.

    1.6 Generarea codului obiect Aceast faz depinde de maina pentru care compilatorul trebuie s genereze cod i care poate s fie

    diferit de maina pe care se execut compilatorul (cazul cross compilatoarelor). Aceast faz depinde de arhitectura mainii int. Ideea este c pentru fiecare instruciune n limbaj intermediar se va alege o secven echivalent de instruciuni obiect.

    1.7 Optimizarea codului obiect i aceast faz depinde de maina pentru care se genereaz cod. i anume se identific secvene de

    cod main care pot s fie nlocuite cu instruciuni mai rapide.

    1.8 Gestiunea tabelei de simboluri n tabela de simboluri se nregistreaz identificatorii utilizai n program i informaii asupra acestora.

    Aceste informaii pot s se refere la tip, domeniu de valabilitate; dac este vorba de identificatori de tip nume de funcie la aceste informaii se adaug i signatura funciei (numrul i tipul argumentelor, modul de transfer i eventual tipul rezultatului). n general o tabel de simboluri este o structur de date care conine cte o nregistrare pentru fiecare identificator avnd cmpuri pentru atributele posibile. Introducerea simbolurilor n tabela se face de ctre analizorul lexical. Atributele acestora sunt completate n tabela de ctre analizoarele sintactic i semantic.

    1.9 Detectarea erorilor Fiecare faz a unui compilator poate s identifice prezena unei erori specifice. De exemplu, n analiza

    lexical ntlnirea unui ir care nu corespunde unui atom lexical; n analiza sintactica se identific erori legate de structura instruciunilor. Ca de exemplu pentru irul:

    int real alfa; fiecare atom lexical n parte este corect dar nu formeaz mpreun o propoziie corect din punct de

    vedere sintactic. n faza de analiz semantic se verific dac construciile corecte din punct de vedere sintactic sunt corecte i din punct de vedere semantic. De exemplu dac la nivelul sintaxei poate s apar ca fiind corecta o expresie de forma: nume + nume, fr nici o restricie asupra tipului identificatorilor corespunztori, este rolul analizei semantice s identifice ca eronat o expresie n care primul nume este al unui vector iar al doilea nume este al unei proceduri.

    Problema cea mai dificil legat de tratarea erorilor const din modul n care se continu analiza dup identificarea unei erori, pentru c un compilator care se oprete la prima eroare ntlnit nu este prea comod de utilizat. Excepie face modul de abordare utilizat n primele versiuni ale compilatorului pentru TURBO Pascal pentru care la ntlnirea unei erori se revine n regim de editare pentru corectarea acesteia.

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    7

    2 Elemente de teoria limbajelor formale Fie T o mulime de simboluri denumita alfabet. Orice submulime a mulimii T* reprezint un limbaj

    asupra alfabetului T. Elementele limbajului se numesc propoziii. Dac limbajul este finit atunci el poate s fie definit prin enumerare. De exemplu considernd alfabetul B = {0, 1} atunci L = {01, 10, 101} este un limbaj. Mulimea cuvintelor din limbajul natural este i el un limbaj pentru care se poate pune problema enumerrii tuturor cuvintelor, chiar dac lista care ar rezulta este imens, deci este un limbaj reprezentabil prin enumerare. Dar cazul interesant este cel n care limbajul este infinit. S considerm de exemplu limbajul "irurilor formate din 0 i 1 a cror lungime este divizibila cu 3". Evident este vorba de un limbaj infinit. Textul prin care am specificat limbajul constituie o reprezentare finit a limbajului. Nu este singura soluie posibil de reprezentare finit. De exemplu dac notam cu L limbajul respectiv atunci:

    L = { w {0,1}* | |w| mod 3 = 0} este un alt mod de a specifica acelai limbaj. Se pune problema dac dndu-se un limbaj oarecare este posibil ntotdeauna construirea unei

    reprezentri finite. S considerm c o astfel de reprezentare finit se realizeaz utiliznd simboli dintr-un alfabet finit A. Se poate demonstra c mulimea A* este infinit numrabil (se poate construi o bijecie f : N A*). Deci exist o mulime infinit numrabil de reprezentri finite. Numrul de limbaje ce se pot construi utiliznd simboli dintr-un alfabet dat T, este 2|T*| deci mulimea limbajelor este infinit nenumrabila. Rezult deci c ar trebui s reprezentm un numr infinit nenumrabil de obiecte avnd la dispoziie numai un numr infinit numrabil de reprezentri. Din acest motiv nu orice limbaj va putea s fie reprezentabil ntr-un mod finit. Nu putem s oferim un exemplu de limbaj pentru care nu avem o reprezentare finit pentru c exemplul ar fi tocmai o reprezentare finit a limbajului respectiv. Spre norocul nostru, nu suntem interesai de toate limbajele ci numai de o clas mai mic a limbajelor infinite cu reprezentri finite.

    n general exist doua mecanisme distincte de definire finit a limbajelor: prin generare sau prin recunoatere. n primul caz este vorba de un "dispozitiv" care tie s genereze toate propoziiile din limbaj (i numai pe acestea) astfel nct alegnd orice propoziie din limbaj ntr-un interval finit de timp dispozitivul va ajunge s genereze propoziia respectiv. n al doilea caz este vorba de un "dispozitiv" care tie s recunoasc (s accepte ca fiind corecte) propoziiile limbajului dat.

    2.1 Gramatici O gramatic reprezint cel mai important exemplu de generator de limbaje. Prin definiie o gramatic

    este G = (N, T, P, S) unde :

    N este o mulime finit de simboli numit mulimea simbolilor neterminali; T este o mulime finit de simboli numit mulimea simbolilor terminali,

    (T N = ); P este o submulime finit din (N T)* N (N T)* x (N T)*; numit mulimea produciilor

    gramaticii. Un element (, ) P este notat cu i se numete producie. S N este un simbol special numit simbol de start al gramaticii G.

    n cele ce urmeaz vom utiliza o serie de notaii devenite "clasice". i anume :

    literele mici de la nceputul alfabetului latin (a,b,c,...) reprezint elemente din T (simboli terminali); literele mici de la sfritul alfabetului latin (u, v, x,...) reprezint elemente din T* (iruri de simboli

    terminali);

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    8

    literele mari de la nceputul alfabetului latin (A, B, C,...) reprezint elemente din N (simboli neterminali);

    literele mari de la sfritul alfabetului latin (U, V, X,...) reprezint elemente din N T (simboli terminali sau neterminali);

    literele alfabetului grecesc (, , ...) reprezint iruri din (N T)* (iruri de simboli terminali i neterminali). O form propoziional pentru o gramatic G se definete recursiv n modul urmtor: (1) S este o form propoziional; (2) dac este o forma propoziional i exist o producie atunci este o form propoziional. O form propoziional care conine numai simboli terminali se numete propoziie generat de G.

    Notm cu L(G) mulimea tuturor propoziiilor generate de G altfel spus L(G) este limbajul generat de gramatica G.

    Se observ c o gramatic este o reprezentare finit (toate elementele sale sunt finite) pentru un limbaj care poate s fie infinit. Conform observaiei fcute la nceputul acestui capitol nu orice limbaj are o reprezentare finit, cu alte cuvinte nu pentru orice limbaj exist o gramatic care s l reprezinte.

    Dou gramatici G i G' sunt echivalente dac i numai dac L(G) = L(G'). Asupra formelor propoziionale se definete o relaie numit relaie de derivare n modul urmtor.

    Fie i doua forme propoziionale, dac i numai dac exist w1, w2 i P astfel nct = w1 w2 i = w1 w2.

    Relaia poate s fie extins obinndu-se derivarea n k pai. i anume k dac exist 0, 1, ..., k forme propoziionale astfel nct = 0, i-1 i ,1 i k i k = .

    nchiderea tranzitiv a relaiei se noteaz cu + . nchiderea tranzitiv i reflexiv a relaiei se noteaz cu =*>.

    S considerm de exemplu gramatica G = ({A,S}, {0,1}, P, S) unde P = {S 1A1, S 0S0, 1A 11A1, A } (cu s-a notat irul vid de simboli). O derivare posibil este:

    S 0S0 00S00 001A100 0011A1100 00111100

    deci 00111100 este o propoziie n L(G). n general L(G) = { w | w T+, S + w}.

    2.1.1 Ierarhia Chomsky. Noam Chomski este lingvist i lucreaz n domeniul limbajelor naturale. Ierarhia care i poarta

    numele a rezultat dintr-o ncercare a acestuia de a formaliza limbajele naturale. Gramaticile sunt clasificate conform complexitii produciilor n urmtoarea ierarhie :

    gramatici de tip 0 (fr restricii) - au produciile de forma:

    cu (N T)* N (N T)* , (N T)*

    gramatici de tip 1 (dependente de context) - au produciile de forma : A , , (N T)*, A N, (N T)+

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    9

    sau de forma S n al doilea caz S nu apare n membrul drept al nici unei producii. Se utilizeaz termenul de

    dependen de context deoarece producia A poate s fie interpretat sub forma - dac simbolul neterminal A apare ntre i atunci poate s fie nlocuit cu .

    gramatici de tip 2 (independente de context) - au produciile de forma :

    A , A N, (N T)*.

    Denumirea de independent de context apare n contrast cu gramaticile de tipul 1 (dependente de context)

    gramatici de tip 3 (regulate la dreapta) au producii de forma:

    A aB cu A N , B (N {}) si a T+. Corespunztor gramaticilor, despre limbajele generate de acestea se poate spune respectiv c sunt

    regulate, independente de context, dependente de context sau de tipul zero. Se poate arata c un limbaj ce poate s fie generat de o gramatic regulat poate s fie generat i de ctre o gramatic independent de context. Un limbaj independent de context poate s fie generat i de o gramatic dependent de context iar un limbaj dependent de context poate s fie generat i de o gramatic de tipul zero. Deoarece cu ct o gramatic este mai restrictiv ea reprezint un mecanism mai simplu, suntem ntotdeauna interesai de cea mai restrictiv gramatic care reprezint un limbaj dat.

    S considerm cteva exemple: a) G1 = ({S},{0,1},{S 0S, S 1S, S }, S). Se observ c G1 este o gramatic regulat care

    genereaz limbajul {0,1}* b) G2 = ({S, A},{0,1},{S AS, S , A , A 0, A 1}, S). Se observ c G2 este o

    gramatic independent de context iar limbajul generat este tot {0,1}*. Rezult deci c un acelai limbaj poate s fie definit de mai multe gramatici diferite eventual chiar de tipuri diferite.

    c) G3 = ({, T, F},{a, +, *, (, )}, P, ) cu P = { + T, T, T T * F, T F, F (), F a}. S considerm un exemplu de derivare n aceast gramatic :

    + T T + T F + T a + T a + T * F a + F * F a + a * F a + a * a. Se observ c gramatica G3 este o gramatic independent de context i este o gramatica care descrie

    limbajul expresiilor aritmetice cu paranteze care se pot forma cu operandul a i cu operatorii + i *. n cele ce urmeaz pentru simplificarea notaiilor dac pentru un neterminal exist mai multe producii

    : A w1, A w2, ... A wk le vom reprezenta sub o form mai compact: A w1 | w2 | ... | wk. De asemenea pentru specificarea unei gramatici nu vom mai preciza n general dect mulimea

    produciilor sale, celelalte elemente rezultnd n mod banal din aceasta.

    2.1.1.1 Exerciii S se construiasc gramaticile care genereaz limbajul:

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    10

    1. irurilor formate din simboli a i b avnd un numr egal de a i b. 2. {anbn | n 1} 3. {anbmcmdn | n 1, m 1} 4. {anbncmdm | n 1, m 1} 5. irurilor formate cu simboli a i b care nu conin subirul abb 6. irurilor formate cu simboli a i b avnd lungimea divizibil cu 3 7. {aibj | i /= j, i, j > 0} 8. {ambn | n < m sau n > 2m, n, m 1} 9. irurilor formate dintr-un numr par de simboli a i un numr impar de simboli b 10.irurilor formate din simboli a, b i c, pentru care toi simboli a apar nainte de toi simboli b iar toi simboli b apar nainte de toi simboli c 11.{anbncn | n >_ 1} 12.{xcxR |x {a,b}*}, {xxR|x {a,b}*}, {x = xR|x {a,b}*} 13.{xx | x {a,b}*} 14.{anbncn | n 1 } 15.listelor de elemente care pot s nu conin nici un element, respectiv trebuie s conin cel puin un element, construirea listei este asociativ dreapta respectiv stnga (vor rezulta 4 variante)

    2.1.2 Verificarea limbajului generat de ctre o gramatic n toate exemplele considerate pn acum s-a fcut "ghicirea" gramaticii care genereaz un limbaj dat

    sau a limbajului generat de ctre o gramatic dat. Se pune ns problema cum se poate demonstra corectitudinea rezultatului unei astfel de ghiciri. S considerm de exemplu gramatica:

    G = ({S}, {(,)}, {S (S)S | }, S) Aceast gramatica genereaz toate irurile de paranteze bine nchise (echilibrate). Dorim ns s

    demonstrm aceast afirmaie. De fapt aici trebuie s demonstrm egalitatea a dou mulimi: mulimea reprezentat de limbajul generat de G i mulimea irurilor de paranteze bine formate. Deci demonstraia presupune demonstrarea dublei incluziuni. Adic trebuie s demonstrm c orice ir derivat din S satisface condiia enunat i apoi trebuie s demonstrm incluziunea n sens invers. Dndu-se un ir de paranteze bine nchise trebuie s artm c acest ir poate s fie derivat din S. Pentru prima parte a demonstraiei vom utiliza inducia asupra numrului de pai n derivare. Considerm c irul vid care se obine ntr-un pas din S este un ir de paranteze bine nchise. S presupunem c pentru toate derivrile realizate n mai puin de n pai se obin iruri de paranteze bine nchise i s considerm o derivare de exact n pai. O astfel de derivare poate s arate ca :

    S (S)S * (x)S * (x)y unde x i y sunt iruri de terminale derivate din S n mai puin de n pai, adic sunt iruri de paranteze

    bine nchise. Rezult c irul (x)y este un ir de paranteze bine nchise. Cu alte cuvinte orice ir derivat din S este "corect".

    S considerm acum i includerea n sens invers. De data asta demonstraia se face prin inducie asupra lungimii irului. Pentru primul pas observm c irul vid este un ir derivabil din S. S presupunem acum ca orice ir cu mai puin de 2n simboli este derivabil din S. S considerm un ir w de paranteze bine nchise avnd lungimea de 2n, cu n mai mare sau egal cu 1. Sigur irul ncepe cu o parantez deschis. Fie (x) cel mai scurt prefix format din paranteze bine nchise. Se observ c w = (x)y, unde x i y sunt iruri

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    11

    de paranteze bine nchise de lungime mai mic dect 2n. n acest caz x i y pot s fie derivate din S. Rezult c exist o derivare:

    S (S)S * (x)y n care pentru obinerea irurilor x i respectiv y s-au utilizat mai puin de 2n pai i deci w este un ir

    derivabil din S. Desigur o astfel de demonstraie este practic imposibil de realizat pentru un limbaj "adevrat". n general se pot face ns demonstraii "pe poriuni".

    2.1.2.1 Exerciii

    1. Fie gramatica G : S AA, A AAA, a, A bA, Ab, s se arate ca limbajul L(G) este limbajul tuturor irurilor formate din simboli a avnd un numr par de simboli.

    2. Fie gramatica G : S aB | bA, A a | aS | bAA, B b | bS | aBB s se arate ca L(G) este setul tuturor irurilor din {a,b}+ care au un numr egal de apariii pentru a i pentru b.

    2.1.3 Transformri asupra gramaticilor independente de context Din punctul de vedere al procesului de compilare, gramaticile sunt utilizate pentru faza de analiz

    sintactic, pentru care se utilizeaz gramatici independente de context. Exist o serie de metode de analiza sintactic, bine puse la punct att din punct de vedere teoretic ct i practic. Fiecare dintre aceste metode impune ns o serie de restricii asupra gramaticilor utilizate. n general atunci cnd se construiete o gramatic se pleac de la forma general a structurilor pe care aceasta trebuie s le descrie i nu de la metoda de analiza sintactica ce va fi utilizat. n acest mod se obine o gramatic ce poate s fie "citit" uor de ctre proiectant. Pentru a satisface ns condiiile impuse de ctre metodele de analiza sintactic sau de ctre generarea de cod, se realizeaz transformri asupra gramaticilor. Aceste transformri trebuie s pstreze neschimbat limbajul generat. n cele ce urmeaz vom prezenta cteva transformri tipice asupra gramaticilor independente de context. Pentru a explica semnificaia acestor transformri n contextul analizei sintactice vom prezenta nti noiunea de arbore de derivare.

    Un arbore de derivare este o reprezentare grafic pentru o secven de derivri (de aplicri ale relaiei ntre formele propoziionale). ntr-un arbore de derivare nu se mai poate identifica ordinea n care s-a fcut substituia simbolilor neterminali. Fiecare nod interior arborelui, reprezint un neterminal. Descendenii unui nod etichetat cu un neterminal A sunt etichetai de la stnga la dreapta prin simbolii care formeaz partea dreapt a unei producii care are n partea stnga neterminalul A. Parcurgnd de la stnga la dreapta frunzele unui astfel de arbore se obine o form propoziional. S considerm de exemplu din nou gramatica irurilor de paranteze bine formate:

    G = ({S}, {(,)}, {S (S)S | }, S) Fie urmtoarea secven de derivri: S ( S ) S ( ( S ) S ) S ( () S ) S ( () ( S ) S ) S ( () () S ) S ( () () ) S ( () () ) ( S ) S + ( ()() ) () Se obine arborele de derivare:

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    12

    S

    / / \ \ / / \ \ / / \ \ ( S ) S

    / / \ \ / / \ \ / / \ \ ( S ) S / / \ \ | | ( S ) S | / / \ \ / / \ \ ( S ) S | |

    Arborele de derivare este construit de ctre analizorul sintactic. Aceasta construcie se poate face pornind de la rdcin aplicnd succesiv producii - n acest caz se spune c analiza sintactic este top-down (descendent). Dar, se poate porni i invers de la irul de atomi lexicali (frunze) identificndu-se simbolii neterminali din care se poate obine un ir de atomi lexicali. n acest caz se spune c analiza sintactic este de tip bottom-up (ascendent).

    Deoarece arborele de derivare descrie relaia ierarhica ntre entitile sintactice (neterminale) i atomii lexicali (terminale) se poate asocia o interpretare n termeni de evaluare a entitilor sintactice. Astfel, considernd de exemplu gramatica expresiilor aritmetice pentru irul a + a * a se obine arborele derivare :

    / | \ / | \ + T | / | \ T / | \ | T * F F | | | F a a | a

    n care se poate observa c a fost evideniat faptul c operaia de nmulire este prioritar fa de operaia de adunare (aspect semantic).

    2.1.3.1 Eliminarea ambiguitii O gramatic care produce mai muli arbori de derivare pentru aceeai propoziie este o gramatic

    ambigu. Deoarece exist tehnici de analiz sintactic care lucreaz numai cu gramatici neambigue vom ncerca s construim gramatici care genereaz acelai limbaj i care sunt neambigue. S considerm de exemplu urmtoarea gramatic :

    instr if expresie then instr | if expresie then instr else instr | alte_instr S construim arborele de derivare pentru propoziia :

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    13

    if E1 then if E2 then S1 else S2

    instr / /\ \ / / \ \ / / \ \ / expr \ \ / / \ then \ if / E1 \ \ ------- instr / /\ \ \ \ / / \ \ \ \ / / \ \ \ \ / expr \ \ \ \ / / \ then \ \ \ if / E2 \ \ \ \ ------- instr \ \ / \ else \ / S1 \ instr ------ / \ / S2 \ ------

    Pentru aceast propoziie mai exist ns un arbore de derivare. instr / / \ \ \ \ / / \ \ \ \ / / \ \ \ \ / expr \ \ \ \ / / \ then \else \ if / E1 \ \ \ ------- instr instr / \ / \ / /\ \ / S2 \ / / \ \ ------ if / then\ expr instr / \ / \ / E2 \ / S1 \ ------ ------

    n toate limbajele de programare care accept construcii de tip if then else se consider cu sens prima

    derivare n care fiecare clauza else este atribuit instruciunii if cea mai interioar. Rezult deci condiia pe care trebuie s o satisfac o instruciune if. Instruciunea cuprins ntre then i else trebuie s nu fie o instruciune if sau s fie o instruciune if cu clauza else. Rezult urmtoarea gramatic obinut prin transformarea gramaticii anterioare:

    instr if_cu_else| if_fara_else if_cu_else if expresie then if_cu_else else if_cu_else | alte_instr if_fara_else if expresie then instr | if expresie then if_cu_else else if_fara_else Se observ c aceast gramatic genereaz acelai limbaj cu gramatica anterioar dar accept o

    derivare unic pentru propoziia :

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    14

    if E1 then if E2 then S1 else S2 instr | if_fara_else / /\ \ / / \ \ / / \ \ / expr \ \ / / \ then \ if / E1 \ \ ------- instr | if_cu_else / /\ \ \ \ / / \ \ \ \ / / \ \ \ \ / expr \ \ \ \ / / \ then \ \ \ if / E1 \ \ \ \ ------- instr \ \ / \ else \ / S1 \ instr ------ / \ / S2 \ ------

    Se numete producie ambigu o producie care are n partea dreapt mai multe apariii ale aceluiai

    simbol neterminal. Existena unei producii ambigue nu implic faptul c gramatica este ambigu. S considerm gramatica G = ({S, A}, {a, b, c }, {S aAbAc, A a | b}). Se observ c aceast gramatic nu este ambigu, gramatica genernd limbajul {aabac, aabbc, abac, abbc}

    S considerm de exemplu i gramatica pentru expresii aritmetice: G = ({}, {a, +, *}, { + | * | a}, ) Gramatica G este o gramatic ambigu (se poate verifica uor utiliznd de exemplu irul a + a * a). n

    gramatica G nu au fost evideniate relaiile de preceden dintre operatori. Aceasta gramatica poate s fie transformata ntr-o gramatica neambigu n care operaia de nmulire este mai prioritar dect cea de adunare n doua moduri:

    1. + T | T T T * F | F F a

    2. T + | T T F * T | F F a

    Fie irul a * a * a. Pentru cele doua gramatici se obin arborii de derivare respectivi:

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    15

    | | T T / | \ / | \ / | \ / | \ T * F F * T / | \ | | / | \ / | \ a a / | \ T * F F * T | | | | F a a F | | a a

    Se observ c primul arbore evideniaz asociativitatea stnga a operatorului * n timp ce al doilea arbore evideniaz asociativitatea dreapta. n funcie de definiia limbajului este de preferat prima variant sau a doua.

    n cazul general dac pentru un neterminal A exist produciile: A A B A | 1 | 2 | ... | n , BN, 1, ... n T* acestea pot s fie nlocuite cu: A A' B A | A' A' A | 1 | 2 | ... | n

    Producia A' A poate s fie eliminat (exist i A A') i se obine: A A' B A | A'

    A' 1 | 2 | ... | n Dac se construiete arborele de derivare se observ c n acest caz se utilizeaz asociativitatea

    dreapt. Pentru a se descrie asociativitatea stnga se utilizeaz transformarea: A A B A' | A' A' 1 | 2 | ... | n. Trebuie s remarcam ns faptul c exist limbaje pentru care nu se pot construi gramatici neambigue.

    Un astfel de limbaj se numete inerent ambiguu. De exemplu limbajul : L = { aibjckdl | i = k sau j = l, i, j, k, l 0} este inerent ambiguu. O gramatic care descrie acest limbaj va trebui probabil s considere c L este

    de fapt reuniunea a dou limbaje: L = { anbjcndl | n, j, l 0} i L = { aibnckdn | i, n, j, k 0} Un ir de forma apbpcpdp va face parte din ambele limbaje i deci probabil c va avea doi arbori de

    derivare. Exemplul anterior nu constituie ns o demonstraie, o demonstraie adevrat depete ca dificultate cadrul textului curent.

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    16

    2.1.3.2 Eliminarea - produciilor Se spune ca o gramatic este - free dac satisface una dintre urmtoarele condiii:

    a. Nu exist nici o producie care s aib n partea dreapta irul vid b. Exist o singura producie care are n partea dreapta irul vid i anume o producie de forma S

    . Simbolul S nu apare n acest caz n partea dreapt a nici unei producii. Algoritmul de transformare pleac de la gramatica G = (N, T, P, S) i construiete gramatica G' = (N',

    T, P', S') care satisface condiiile : (i) L(G) = L(G') (i) G' este - free. Descrierea algoritmului este : i = 0 Ni = {A | A P} repeta

    i = i + 1 Ni = { A | A P, a N*i-1} Ni-1

    pn Ni = Ni-1 Ne = Ni dac S Ne

    N' = N {S'} P' = {S' , S' S}

    altfel N' = N S' = S P' =

    pentru fiecare p P executa

    dac p este de forma : A a0 B1 a1 ... Bk ak, k 0, Bi Ne, 1 i k, aj ((N \ Ne) T)*, 0 j k

    P' = P' ({A a0 X1 a1 ... Xk ak | Xi {Bi, }} \{A })

    altfel P' = P' {p} Fie de exemplu gramatica S aSbS | bSaS | . Aplicnd algoritmul anterior se obine: S' S, S aSbS | aSb | abS | ab | bSaS | bSa | baS | ba

    2.1.3.3 Eliminarea recursivitii stnga O gramatic este recursiv stnga dac exist un neterminal A astfel nct exist o derivare A + A

    pentru (T N)*. O analiz sintactic descendent determinist nu poate s opereze cu o astfel de gramatic, deci este necesar o transformare. S considerm nti cazul cel mai simplu pentru care n gramatic exist producii de forma A A | . n acest caz limbajul generat este de forma n cu n 0. Acelai limbaj poate s fie generat de ctre gramatica: A A', A' A'| .

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    17

    S considerm de exemplu gramatica expresiilor aritmetice : + T | T, T T * F | F, F () | a Se observ c pentru un ir de forma a + a * a, examinnd numai primul simbol terminal(a) nu este

    clar cu care dintre produciile pentru trebuie s se nceap derivarea. Aplicnd ideea anterioar se obine :

    T ', ' +TE' | , T FT', T' *FT' | , F () | a n acest caz derivarea va ncepe sigur prin aplicarea produciei TE' i se obine derivarea TE'

    FT''. n acest moment se vede c pentru F trebuie s se aplice producia F a. Deci se obine + aT''. Urmeaz simbolul terminal + datorit cruia pentru T' se va aplica producia T' , etc.

    n general dac pentru un neterminal A exist produciile : A A1 |A2 | ... |Am | 1 | 2 | ... | n unde i nu ncepe cu A, 1 i n, se pot nlocui aceste producii cu : A 1A' | 2A' | ... | nA' A' 1A' | 2A' | ... | mA'| Aceast construcie elimin recursivitatea stng imediat. S considerm ns gramatica: A1 A2 a | b A2 A3 c | d A3 A1 e | f cu A1 simbolul de start al gramaticii. Se observ c este posibil urmtoarea derivare: A1 A2a => A3 ca => A1 eca deci gramatica este recursiv stnga. Se observ c dac am considerat o ordine a simbolilor, toate

    produciile mai puin ultima, respect regula "un simbol neterminal este nlocuit de un ir care ncepe cu alt simbol neterminal cu un numr de ordine mai mare". Existena unei producii care nu respect condiia conduce la apariia recursivitii stnga.

    Dac gramatica nu permite derivri de tipul A + A (fr cicluri) i nu conine - producii poate s fie transformat n vederea eliminrii recursivitii stnga utiliznd urmtorul algoritm, obinndu-se o gramatic echivalent fr recursivitate stnga.

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    18

    Se aranjeaz neterminalele n ordinea A1, ..., An pentru i = 1 pn la n executa pentru j = 1 pn la i - 1 executa

    nlocuiete fiecare producie de forma Ai Aj cu produciile Ai 1 | 2 | ... | k unde Aj 1|2| ... |k sunt toate produciile pentru Aj

    elimin recursivitatea stnga ntre produciile Ai S considerm pasul i. Produciile Ak Al care au mai rmas (pentru care k < i), au l > k. n aceasta

    iteraie prin variaia lui j se ajunge ca pentru orice producie de forma Ai Am , m i. Dac se elimin recursivitatea direct rmne m > i. S considerm de exemplu din nou gramatica :

    A1 A2a | b, A2 A2c | A1d | e Considerm pentru neterminale ordinea : A1, A2. Pentru A1 (i = 1) nu exist recursivitate stnga

    direct deci nu se face nici o modificare. Pentru i = 2, producia A2 A1d se inlocuiete cu A2 A2ad | bd. Rezult deci c A2 A2c | A2ad | bd | e.

    Eliminnd recursivitatea stnga se obine : A1 A2a | b, A2 bdA2' | eA2', A2' cA2' | adA2' |

    2.1.3.4 Factorizare stnga Acest tip de transformare este util pentru producerea unei gramatici potrivite pentru analiza sintactic

    descendent de tip determinist. Ideea este c dac nu este clar care dintre produciile alternative poate s fie aplicat pentru un neterminal se va amna luarea unei decizii pn cnd s-a parcurs suficient din irul de intrare pentru a se putea lua o decizie. S considerm de exemplu produciile :

    S A b S | A A B c A | B B a | dSd S presupunem c ncercm s construim irul derivrilor pentru a b a c a pornind de la simbolul de

    start al gramaticii. Din recunoaterea simbolului a la nceputul irului nu se poate nc trage concluzia care dintre cele doua producii corespunztoare neterminalului S trebuie s fie luata n considerare (abia la ntlnirea caracterului b pe irul de intrare se poate face o alegere corect). n general pentru producia A 1 | 2 dac se recunoate la intrare un ir nevid derivat din nu se poate tii dac trebuie aleas prima sau a doua producie. Corespunztor este util transformarea: A A', A' 1 | 2.

    Algoritmul de factorizare funcioneaz n modul urmtor. Pentru fiecare neterminal A se caut cel mai lung prefix comun pentru dou sau mai multe dintre produciile corespunztoare neterminalului A. Dac atunci se nlocuiesc produciile de forma A 1 | 2 | ... | n | (unde reprezint alternativele care nu ncep cu ) cu :

    A A' | A' 1 | 2 | ... | n

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    19

    A' este un nou neterminal. Se aplic n mod repetat aceast transformare pn cnd nu mai exist dou

    alternative producii cu un prefix comun pentru acelai simbol neterminal. Relund exemplul considerat se obine : S AX X bS | A BY Y cA | B a | dSd Deci n analiza irului a b a la ntlnirea simbolului b pentru neterminalul Y se va utiliza producia Y

    , n acest mod rezult irul de derivri : S AX BYX aYX ...

    2.1.3.5 Eliminarea simbolilor neterminali neutilizai Un simbol neterminal neutilizat este un simbol care: nu poate s apar ntr-o form propoziional, adic ntr-un ir derivat din simbolul de start al

    gramaticii (simbol inaccesibil) din care nu poate deriva un ir format numai din simboli terminali (simbol nefinalizabil) care apare n formele propoziionale numai datorit sau mpreun cu simboli neterminali ce

    satisfac una dintre condiiile anterioare. Pornind de la o gramatic G = (N, T, P, S) se poate obine o gramatic fr simboli nefinalizai i care

    satisface urmtoarele condiii: (i) L(G) = L(G') (i) A N, A + w, w T*. utiliznd urmtorul algoritm : N0 = i = 0 repeta

    i = i + 1 Ni = { A | A P si (Ni-1 T)* } Ni-1

    pn Ni = Ni-1 N' = Ni P' P conine numai produciile din P care au n partea stnga simboli din N' si n partea dreapta simboli din N' si T. Prin inducie asupra numrului de pai se poate demonstra corectitudinea algoritmului. S considerm

    ca exemplu o gramatic avnd produciile : P = {S A, A a, B b, B a}, se observ c B este un simbol neterminal inaccesibil. Aparent condiia de inaccesibilitate pentru un neterminal const din ne apariia n partea dreapt a unei producii. Dac ns considerm o gramatic avnd produciile: {S A, A a, B cC, C bB} se observ c este necesar o alt condiie.

    Pornind de la o gramatic G = (N, T, P, S) se poate construi o gramatic fr simboli inaccesibili G' = (N', T, P', S) care s satisfac condiiile:

    (i) L(G) = L(G')

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    20

    (i) A N', w (N T)*, S w i A apare n w

    utiliznd urmtorul algoritm. N0 = {S} i = 0 repeta

    i = i + 1; Ni = {A | A apare n partea dreapta a unei producii pentru un neterminal din Ni-1} Ni-1

    pn Ni = Ni-1 N' = Ni P' conine numai producii care corespund neterminalelor din N' si care conin n partea dreapta simboli neterminali numai din N' Prin inducie asupra numrului de pai se poate determina corectitudinea algoritmului. Utiliznd

    algoritmii pentru eliminarea simbolilor nefinalizai i cel pentru eliminarea simbolilor inaccesibili se obine o gramatic care nu conine simboli neutilizai. Ordinea n care se aplic aceti algoritmi nu este indiferent. S considerm de exemplu gramatica cu produciile:

    S a | A, A AB, B b. Dac se aplic nti algoritmul pentru eliminarea simbolilor nefinalizai, rmn produciile S

    a i B b. Prin eliminarea simbolilor inaccesibili rmne numai producia S a. Dac ns se aplic nti algoritmul pentru eliminarea simbolilor inaccesibili i apoi cel pentru eliminarea simbolilor nefinalizai vor rmne pn la sfrit produciile S a i B b, adic nu se obine o gramatic fr simboli neutilizai. Rezultatul obinut nu este ntmpltor n sensul c nu se poate gsii un exemplu pentru care ordinea corect de aplicare a celor doi algoritmi s fie invers. Ideea este c prin eliminarea unui simbol neterminal neaccesibil nu pot s apar simboli neterminali nefinalizai, n timp ce prin eliminarea unui simbol neterminal nefinalizat pot s apar simboli neterminali inaccesibili deoarece anumii simboli neterminali puteau s fie accesibili numai prin intermediul simbolului neterminal respectiv.

    2.1.3.6 Substituia de nceputuri(corner substitution) Anumite metode de analiz sintactic impun ca partea dreapt a fiecrei producii care nu este irul

    vid s nceap cu un terminal. S considerm de exemplu gramatica avnd produciile:

    lista a(numr) lista | *elem lista | a elem a(numr) | *elem n acest caz dac pe irul de intrare se gsete terminalul a nu este clar care dintre produciile pentru

    neterminalul lista trebuie s fie utilizat. Dac factorizm produciile neterminalului lista: lista aX | *elem lista X (numr) lista | elem a(numr) | *elem

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    21

    Se observ ca n acest caz n funcie de simbolul terminal curent se poate decide n mod determinist care este producia urmtoare ce trebuie s fie aplicat pentru derivare (construirea arborelui de derivare).

    O gramatic independent de context pentru care este ndeplinit condiia ca partea dreapt a oricrei producii ncepe cu un terminal sau este irul vid se numete gramatic de tip Q. O form particular de gramatica de tip Q este forma normal Greibach. n acest caz nu exist --producii cu excepia cel mult a unei --producii corespunztoare simbolului de start al gramaticii. n cazul n care aceasta producie exist simbolul de start al gramaticii nu apare n partea dreapt a nici unei producii. n forma normal Greibach produciile sunt de forma Aa cu a T i N*. S presupunem c o gramatic are produciile:

    P a1 1 | a2 2 | ... | an n | unde ai T, i j ai aj, 1 i, j n. O procedur care recunoate irurile derivate din P este de

    forma: p(){

    switch (caracter_urmtor){ case a1 : avans(); a1 /* tratare a1 */ case a2 : avans(); a2 ...

    case an : avans(); an default: /* ? - producie */

    } } Pe baza transformrilor anterioare se poate elabora un algoritm pentru construirea unei gramatici n

    forma normal Greibach pentru o gramatic independent de context care nu este recursiv stnga. Se definete nti o relaie de ordine asupra neterminalelor unei gramatici. i anume A < B dac exist

    o producie A B . Considernd aceast relaie se observ c se poate construi o relaie parial de ordine care poate s fie extinsa la o relaie liniar de ordine. Dac gramatica pentru care se construiete aceast relaie nu este recursiv dreapta atunci produciile celui "mai mare" neterminal ncep sigur cu simboli terminali. Rezult algoritmul:

    Se construiete relaia de ordine asupra N astfel nct N = {A1, A2, ..., An} si A1 < A2 < ... < An.

    pentru i = n - 1 pn la 1 pas = -1 executa fiecare producie de forma Ai Aj cu i < j se nlocuiete cu Ai 1 | ... | m unde Aj 1 | ...| m (se observa ca 1, ..., m ncep cu terminale)

    pentru fiecare producie de forma p = A a X1 ... Xk execut

    pentru i = 1 pn la k execut dac Xi T N = N {Xi'} P = P { Xi' Xi}

    P = P \ {p} {A aX1'X2' ... Xk'}

    Prin inducie asupra numrului de pai se poate demonstra c algoritmul realizeaz transformarea

    dorit. De exemplu pentru gramatica expresiilor aritmetice n forma fr --producii:

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    22

    T ' | T , ' +TE' | +T, T FT' | F, T' *FT' | *F F () | a Relaia de ordine liniar poate s fie ' < < T' < T < F. Se pornete de la F, pentru care toate

    produciile ncep cu un terminal. Rezult modificarea produciilor pentru T: T () T' | a T' | () | a. Urmeaz T' care nu necesit transformri. Pentru se obine: ()T'' | a T' ' | ()' | aE' | ()T' | aT' | () | a De asemenea ' nu se modific. Rezult urmtoarea gramatic n forma normal Greibach: (EAT'' | a T' ' | (EAE' | aE' | (EAT' | aT' | (EA | a ' +TE' | +T T (EA T' | a T' | (EA | a. T' *FT' | *F F (EA | a A )

    2.1.4 Construcii dependente de context Anumite construcii specifice limbajelor de programare nu pot s fie descrise prin limbaje

    independente de context. S considerm cteva exemple : 1. Fie limbajul L1 = {wcw| w {0,1}*}. Acest limbaj realizeaz abstractizarea condiiei ca un

    identificator s fie declarat nainte de a fi utilizat. L1 nu poate s fie generat de o gramatic independent de context. Din acest motiv condiia ca un identificator s fie definit nainte de a fi utilizat nu pot s fie verificat prin analiz sintactic, deci va fi verificat de ctre analiza semantic.

    2. Fie limbajul L2 = {anbmcndm | n > 1, m > 1}. Acest limbaj realizeaz abstractizarea corespondenei ca numr ntre numrul de parametrii cu care au fost declarate procedurile i numrul de parametrii cu care se utilizeaz acestea. Nici acest limbaj nu pot fi descris de o gramatic independent de context. Pe de alt parte limbajul L2' = {anbn | n > 1}, poate s fie descris de gramatica : S a S b | a b. Deci i aici dup o prim recunoatere fcut n analiza sintactic, partea de dependen de context va fi rezolvat de ctre faza de analiz semantic.

    Observaie n general interpretnd gramaticile ca algoritmi de generare de iruri crora le corespund ca

    echivaleni algoritmi de recunoatere de iruri, se constat c pentru cazul limbajelor regulate este necesar ca pentru recunoatere s se fac o numrare pn la o valoare finit (care poate ns s fie orict de mare). Astfel c limbajul LR = {anbn | 0 n 20000000000000} este un limbaj regulat. Numrul de a-uri ntlnite poate s fie memorat n neterminalele. De altfel, LR este un limbaj finit i deci automat este regulat (produciile gramatici pot s reprezinte de fapt lista irurilor care formeaz limbajul). Limbajul

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    23

    LR1 = {w {0,1}* | |w| mod 3 = 0} este infinit i regulat. Se observ c pentru recunoaterea irurilor este necesar s se numere cte dou elemente. n schimb limbajul LI = {anbn | 0 n} nu este regulat, algoritmul pe care s-ar baza recunoaterea irurilor nu are o limit. Tratarea unei astfel de situaii se face n mod natural utiliznd un contor infinit sau o stiv.

    2.1.4.1 Exerciii

    1. Fie gramatica: A BC | a. B CA | Ab, C AB | cC | b S se construiasc gramatica echivalenta nerecursiva stnga

    2. S se elimine simbolii neutilizai pentru gramatica: S A | B, A aB | bS | b, B AB | BA, C AS|b 3. S se construiasc gramatica echivalenta fr -producii pentru gramatica: S ABC, A BB | , B CC | , C AA | b 4. S se construiasc un algoritm care verific dac pentru o gramatic dat G, L(G) este mulimea

    vid. S se demonstreze c algoritmul este corect

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    24

    2.1.5 Proprieti ale limbajelor independente de context Limbajele formale sunt mulimi - putem s aplicm asupra lor operaii caracteristice mulimilor :

    reuniune, intersecie, diferen dar i operaii specifice cum este de exemplu concatenarea. Dac L1 i L2 sunt dou limbaje, concatenarea lor este un limbaj L = L1L2 astfel nct:

    L = { w | w = xy, x L1, y L2} O alt operaie specific ce se poate aplica asupra unui limbaj formal L este "Kleen star". Notaia

    utilizat pentru rezultat este L* i reprezint mulimea irurilor obinute prin concatenarea a zero sau mai multe iruri din L (concatenarea a zero iruri este irul vid, concatenarea unui singur ir este el nsui etc.). Se va utiliza i notaia L+ pentru LL*.

    Dac aplicnd o operaie asupra oricror doua limbaje independente de context obinem un limbaj independent de context vom spune c mulimea limbajelor independente de context este nchis sub operaia respectiv. Se poate demonstra c mulimea limbajelor independente de context este nchis sub operaiile: reuniune, concatenare i Kleen star.

    S demonstrm de exemplu nchiderea sub operaia de reuniune. Fie doua gramatici G1 = (N1, T1, P1, S1), G2 = (N2, T2, P2, S2). Putem ntotdeauna s presupunem c N1 N2 = eventual prin redenumirea simbolilor neterminali din una dintre gramatici). Gramatica corespunztoare limbajului reuniune a limbajelor generate de ctre cele doua gramatici se poate construi n modul urmtor:

    G = (N, T, P, S), N = N1 N2 {S}, T = T1 T2, P = P1 P2 {S S1 | S2} Pentru a demonstra c limbajul L(G) = L(G1) L(G2) trebuie s demonstrm includerea mulimilor

    n ambele sensuri. Dac w L(G) nseamn c a fost obinut printr-o derivare ca S S1 * w sau S S2 * w. Deci un ir derivat din S aparine limbajului L(G1) L(G2). Invers dac alegem un ir w L(G1) L(G2) el este obinut dintr-o derivare din S1 sau din S2, deci se poate construi o derivare pentru acest ir i n G. Construcii similare se pot face i pentru operaia de concatenare i pentru operaia Kleen star. De exemplu L(G1)* pentru o gramatica G1 = (N1, T1, P1, S1) poate s fie generat de ctre:

    G = (N1, T1, P1 {S1 | S1 S1}, S1) Clasa limbajelor independente de context nu este nchis la operaiile de intersecie i complementare.

    S considerm de exemplu limbajele L1 = {anbncm | n,m 0}, L2 = {ambncn | n,m 0}. Limbajul L = L1 L2 este "cunoscut" ca fiind un limbaj dependent de context. S presupunem acum

    c pentru un limbaj independent de context generat de ctre gramatica G = (N, T, P, S), limbajul complementar, adic T* - L(G) este ntotdeauna independent de context. n acest caz, fie L un limbaj obinut prin intersecia a dou limbaje independente de context: L1 i L2. Se poate scrie:

    L = L1 L2 = T* - ((T* - L1) (T* - L2)). Dac mulimea limbajelor independente de context este nchis la operaia de complementare atunci

    (T* - L1) i (T* - L2) sunt limbaje independente de context i la fel este i reuniunea lor i la fel va fi i complementarea limbajului obinut prin reuniune. Adic ar rezulta c L1 L2 este un limbaj independent de context ceea ce deja tim c nu este adevrat.

    Dup cum s-a constatat acelai limbaj poate s fie descris de mai multe gramatici, eventual de tipuri diferite. Este util gsirea unui criteriu prin care s se indice tipul restrictiv al gramaticilor care pot s descrie un limbaj dat, ntr-o manier mai precis dect observaia de la pagina 24. De exemplu s considerm limbajul:

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    25

    { an * n | n > 1 } Se pune problema dac exist o gramatica independent de context care s-l genereze. Urmtorul

    rezultat ne d un criteriu cu ajutorul cruia putem s demonstrm c o gramatic nu este independent de context.

    Lema de pompare Fie L un limbaj independent de context. Atunci, exist o constanta k care este

    caracteristic limbajului astfel nct dac z L i |z| k, atunci z poate s fie scris sub forma z = uvwxy cu vx , |vwx| k , |w| 1 i pentru orice i, uviwxiy L.

    S utilizm rezultatul anterior pentru a studia limbajul: L = { an * n | n > 1 } s presupunem c L este independent de context. nseamn c exist un numr k (asociat limbajului)

    astfel nct dac n * n k atunci an x n = uvwxy astfel nct v i x nu sunt amndou iruri vide i |vwx| k. S presupunem ca n este chiar k ( k * k > k). Rezult ca uv2wx2yL. Deoarece |vwx| k rezult 1 |vx| < k deci lungimea irului iniial k x k < |uv2wx2y| < k x k + k. Dup k x k urmtorul ptrat perfect este (k + 1) x (k + 1) care este mai mare deci k x k + k, adic |uv2wx2y| nu poate s fie un ptrat perfect, deci L nu poate s fie generat de o gramatic independent de context.

    2.1.5.1 Exerciii 1. S se arate c limbajul { anbncn | n > 1 } nu este independent de context 2. S se arate c limbajul { anbncj | n > 1, j < n } nu este independent de context

    2.2 Mulimi regulate, expresii regulate. Fie T un alfabet finit. Se numete mulime regulat asupra alfabetului T mulimea construit recursiv

    n modul urmtor:

    1. este o mulime regulat asupra alfabetului T; 2. Dac a T atunci {a} este o mulime regulat asupra alfabetului T; 3. Dac P i Q sunt mulimi regulate atunci PQ, PQ, P* sunt mulimi regulate asupra alfabetului T. 4. Nimic altceva nu este o mulime regulat.

    Se observ deci c o submulime a mulimii T* este o mulime regulat asupra alfabetului T dac i

    numai dac este mulimea vida, este o mulime care conine un singur simbol din T sau poate s fie obinut din aceste dou tipuri de mulimi utiliznd operaiile de reuniune (P Q), concatenare (PQ) sau nchidere P*.

    Descrierea mulimilor regulate se poate face cu ajutorul expresiilor regulate. O expresie regulat este la rndul ei definit recursiv n modul urmtor (prin analogie cu definiia mulimilor regulate) :

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    26

    1. este o expresie regulata care descrie mulimea ; 2. a T este o expresie regulat care descrie mulimea {a}; 3. dac p,q sunt expresii regulate care descriu mulimile P i Q atunci :

    a. (p + q) sau (p | q) este o expresie regulat care descrie mulimea P Q; b. (pq) este o expresie regulat care descrie mulimea PQ; c. (p)* este o expresie regulat care descrie mulimea P*.

    4. nimic altceva nu este o expresie regulat. De exemplu expresia (0 | 1)* reprezint mulimea {0,1}*, expresia regulat : (00 | 11)*((01 | 10)(00 |

    11)*(01 | 10)(00 | 11)*)* reprezint mulimea care conine toate irurile formate din 0 i 1 i care conin un numr par din fiecare simbol. n particular pp* este notat cu p+. ntre operatorii utilizai n descrierea mulimilor regulate exist o serie de relaii de preceden. Cea mai prioritar operaie este operaia de nchidere (notat cu *), urmeaz operaia de concatenare, cel mai puin prioritar este operaia + (|). De exemplu, expresia regulat (0 | (1(0)*)) poate s fie scrisa i sub forma 0 | 10*.

    Expresiile regulate au o serie de proprieti. Fie , , , expresii regulate. Spunem ca = dac i numai dac i descriu aceleai mulimi regulate. Sunt adevrate urmtoarele proprieti :

    1. | = | 2. | ( |) = ( | ) | 3. () = () 4. ( |) = | 5. ( | ) = | 6. ? = ? = 7. * = | * 8. (*)* = * 9. | = Utiliznd expresii regulate se pot construi i rezolva ecuaii avnd ca soluii expresii regulate. S

    considerm de exemplu ecuaia: X = aX + b unde a,b i X sunt expresii regulate. Se poate verifica uor c X = a * b este o soluie a acestei ecuaii.

    Dac a este o expresie regulat care poate s genereze irul vid atunci soluia prezentat anterior nu este unic. S nlocuim n ecuaie pe X cu expresia regulat:

    a*(b + ) Se obine: a*(b + ) = a[a*(b + )] + b = = a+ b + a+ + b = = (a+ + )b + a+ = a*b + a* = a*(b + ) Se numete punct fix al unei ecuaii cea mai mic soluie a ecuaiei respective. Propoziie Dac G este o gramatic regulat atunci L(G) este o mulime regulata. Demonstraia acestei teoreme se face prin construcie. Nu vom face demonstraia dar vom considera

    un exemplu de construcie. Fie gramatica G = ({A, B, C}, {0,1}, P,A) cu P = {A 1A | 0B, B 0B | 1C, C 0B| 1A| }. Se cere s se construiasc expresia regulat care genereaz acelai limbaj ca i G. Se pot scrie urmtoarele ecuaii:

    A = 1A + 0B B = 0B + 1C

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    27

    C = 0B + 1A + Din prima ecuaie se obine: A = 1*0B. Din a doua ecuaie se obine: B = 0*1C. nlocuind n A se

    obine: A = 1*00*1C = 1*0+1C. nlocuind n a treia ecuaie se obine: C = 0+1C + 1+0+1C + C = ( + 1+)0+1C + = 1*0+1C C = (1*0+1)* Rezult: A = 1*0+1 (1*0+1)* A = (1*0+1)+ Mulimea regulat descrie irurile de 0 i 1 care se termin cu sub irul 01. Evident o expresie mai

    simpl pentru descrierea aceluiai limbaj este: (0 | 1)*01 Se observ c se poate considera c limbajul se obine prin concatenarea a doua limbaje unul descris

    de expresia (0 | 1)* i cellalt descris de expresia 01. Rezult urmtoarea gramatic: S AB A 0A | 1A | B 01 Se observ c gramatica obinut nu este regulat. S transformm aceast gramatic prin substituie

    de nceputuri: S 0AB | 1AB | B A 0A | 1A | B 01 Se obine: S 0S | 1S |01 Utiliznd factorizarea: S 0X | 1S X S | 1 Din nou prin nlocuire de nceputuri se obine: X 0X | 1S |1 Aplicnd factorizarea: X 0X | 1Y Y S |

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    28

    Rezult gramatica descris de produciile: S 0X | 1S X 0X | 1Y Y 0X | 1S | . Se observ c s-a ajuns la aceeai gramatic cu cea iniial ( desigur dac redenumim neterminalele). Expresiile regulate reprezint o metod alternativ generativ pentru definirea limbajelor regulate.

    Limbajele definite de gramatici regulate sunt utilizate la nivelul analizei lexicale, n majoritatea limbajelor de programare modul de scriere al numelor i al identificatorilor pot s fie descrise de gramatici respectiv de expresii regulate. Construirea expresiilor regulate corespunztoare atomilor lexicali reprezint prima etapa n proiectarea unui analizor lexical.

    2.3 Acceptoare Un acceptor este un dispozitiv format dintr-o band de intrare, o unitate de control i o memorie

    auxiliar. +---------------

    |a0|a1|...|an| +---------------

    \ cap de citire \ +---------+

    | unitate | | de | | control | +---------+

    | +-----------+

    | memorie | | auxiliara | +-----------+

    Banda de intrare este formata din elemente n care se nscriu simbolii din irul de intrare. La un

    moment dat capul de citire este fixat pe un simbol. Funcionarea dispozitivului este dat de aciunile acestuia. ntr-o aciune capul de citire se poate deplasa la stnga sau la dreapta sau poate s rmn nemicat. n cadrul unei aciuni unitatea de control are acces la informaia din memoria auxiliar pe care o poate modifica. Se observ ca acest model este foarte general. Utiliznd diferite restricii asupra benzii de intrare, organizrii i accesului la memoria auxiliar se obin diferite cazuri particulare de acceptoare.

    O aciune a acceptorului este formata din : deplasarea capului de citire la stnga sau la dreapta sau meninerea capului de citire pe aceeai poziie

    i / sau; memorarea unei informaii n memoria auxiliar i / sau; modificarea strii unitii de control.

    Comportarea unui acceptor poate s fie descris n funcie de configuraiile acestuia. O configuraie

    este format din urmtoarele informaii :

    starea unitii de control; coninutul benzii de intrare i poziia capului de citire;

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    29

    coninutul memoriei. Rezult c o aciune a acceptorului poate s fie precizat prin configuraia iniial (nainte de aciune)

    i cea final (dup execuia aciunii). Dac pentru o configuraie dat sunt posibile mai multe aciuni atunci spunem c acceptorul este

    nedeterminist altfel este determinist. Un acceptor are o configuraie iniial n care unitatea de control este ntr-o stare iniial, capul de

    citire este fixat pe simbolul cel mai din stnga al irului de intrare iar memoria are un coninut iniial specific. Acceptorul are o configuraie final pentru care capul de citire este situat pe simbolul cel mai din dreapta de pe banda de intrare. Se spune c dispozitivul a acceptat un ir de intrare w dac pornind din configuraia iniial ajunge n configuraia finala. Eventual, noiunea de acceptare poate s fie condiionata i de ajungerea ntr-o anumit stare a unitii de control sau de un anumit coninut al memoriei auxiliare. Evident dac acceptorul este nedeterminist dintr-o configuraie iniial pot avea loc mai multe evoluii. Dac exist ntre acestea una pentru care se ajunge la o configuraie final atunci se spune c dispozitivul a acceptat irul de intrare.

    Limbajul acceptat de ctre un acceptor este format din mulimea irurilor acceptate de ctre acesta. Pentru fiecare tip de gramatica din ierarhia Chomsky exist o clasa de acceptoare care definesc

    aceeai clas de limbaje. Dintre acestea cele utilizate pentru implementarea compilatoarelor sunt automatele finite care sunt acceptoare pentru limbaje regulate i automatele cu stiv (push-down), care sunt acceptoare pentru limbajele independente de context. Automatele finite sunt acceptoare fr memorie auxiliar iar automatele cu stiv sunt acceptoare pentru care accesul la memoria auxiliar se face conform unui mecanism de tip stiv.

    2.3.1 Automate finite Un automat finit este un obiect matematic AF = (Q, T, m, s0, F) unde :

    Q este mulimea finit a strilor; T este o mulime finit numit alfabet de intrare; m : Q x (T {}) P(Q) este funcia parial a strii urmtoare; s0 Q este o stare numit stare de start; F Q este o mulime de stri numit mulimea strilor finale (de acceptare).

    Dac pentru q Q, a T m(q,a) este definit, atunci m(q,a) se numete tranziie, dac a = atunci

    m(q,a) se numete -tranziie. Se observ ca pentru o combinaie stare(q Q), intrare(a T) pot s corespund mai multe stri urmtoare, deci aa cum a fost definit, automatul este nedeterminist (AFN).

    Pentru reprezentarea unui automat finit se pot utiliza dou moduri de reprezentare, printr-o tabela de tranziie sau printr-un graf. S considerm de exemplu automatul care accepta limbajul definit de expresia (a | b)* abb. Poate s fie descris sub forma urmtoarei tabele :

    simbol de intrare

    stare a b 0 {0, 1} {0} 1 - {2} 2 - {3} 3 - +

    Se observ c n fiecare intrare este specificat mulimea strilor urmtoare n care se trece pentru

    starea i simbolul corespunztor intrrii respective. Acelai automat finit poate s fie descris de urmtorul graf de tranziie :

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    30

    a ---

    \ / +---+ +---+ +---+ +---+

    start | | a | | b | | b |+-+| -------->| 0 |-->| 1 |-->| 2 |-->||3|| | | | | | | |+-+| +---+ +---+ +---+ +---+

    / \ ---

    b Se observ c pentru fiecare stare exist cte un nod, ntre dou noduri exist un arc etichetat cu un

    simbol de intrare dac i numai dac se poate trece din starea reprezentat de primul nod n starea reprezentat de al doilea nod la aplicarea la intrare a simbolului cu care este etichetat arcul. De remarcat modul n care a fost specificat starea final.

    Se spune c un automat finit accept un ir de intrare dac exist o cale n graful de tranziie ntre nodul care reprezint starea de start i un nod care reprezint o stare final, astfel nct irul simbolilor care eticheteaz arcele care formeaz aceast cale este irul de intrare. De exemplu irul aabb este acceptat de automatul descris anterior, care va executa urmtoarele micri:

    a a b b 0 0 1 2 3 Se observa c pentru acelai ir de intrare exist i alte secvene de intrri care ns nu duc ntr-o stare

    de acceptare: a a b b 0 0 0 0 0 Un caz particular al automatelor finite este dat de automatele finite deterministe (AFD). n cazul

    automatelor finite deterministe definiia funciei strii urmtoare se modific:

    m : S x T S. Se observ c sunt satisfcute urmtoarele restricii: 1. nu exist -tranziii; 2. pentru (q, a) Q x T este definit cel mult o tranziie. Se observ ca n acest caz, pentru un ir de intrare dat, n graful de tranziie exist cel mult o cale care

    pornete din starea de start i duce ntr-o stare de acceptare.

    2.3.1.1 Construcia unui automat finit nedeterminist care accept limbajul descris de o expresie regulat dat Algoritmul pe care l vom prezenta utilizeaz direct structurile din definiia expresiilor regulate. Se

    pleac de la o expresie regulat r asupra unui alfabet T i se obine un automat finit nedeterminist (N) care accept limbajul L(r).

    Pentru construirea automatului se identific n structura expresiei r structurile care n mod recursiv compun expresia i se construiesc automatele finite nedeterministe (AFN) elementare corespunztoare.

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    31

    1. Pentru expresia , automatul care accept limbajul corespunztor este : +---+ +-----+

    start | | |+---+| ------->| i |------>|| f || | | |+---+| +---+ +-----+

    2. Pentru expresia a, automatul care accept limbajul corespunztor este :

    +---+ +-----+

    start | | a |+---+| -------->| i |------>|| f || | | |+---+| +---+ +-----+

    3. Fie dou expresii regulate r,t pentru care s-au construit automatele finite nedeterministe

    corespunztoare N(r) i N(t). a. pentru expresia regulat r|t limbajul corespunztor este acceptat de :

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    32

    -------------------------

    | +---+ +-----+ | | | | N(r) |+---+| | --------->| |-- >|| ||---- / | | | |+---+| | \ / | +---+ +-----+ | \ +---+ / | | \ +-----+ | |/ ------------------------- \|+---+| ->| i | || f || | |\ ------------------------- /|+---+| +---+ \ | | / +-----+ \ | +---+ +-----+ | / \ | | | N(t) |+---+| | / ---------->| |-- >|| ||---/ | | | |+---+| | | +---+ +-----+ | | | -------------------------

    b. pentru expresia regulat rt limbajul corespunztor este acceptat de : ----------------------------

    | | --------------+----------- | | +---+ | +---+ | +-----+ | | | | N(r) | | | | N(t)|+---+| | --------->| i |--- -+> | |---- >|| f ||---- | | | | | | | |+---+| | | +---+ | +---+ | +-----+ | | | | | --------------+----------- | | | ----------------------------

    Se observ ca n acest caz starea final a automatului corespunztor expresiei r coincide cu starea iniial a automatului corespunztor expresiei t.

    c. pentru expresia regulata r* limbajul corespunztor este acceptat de : +-| i |----------> | |--- ---> | |-------->|| f || | | | | | | | | |+---+| +---+ | +---+ +---+ | +-----+ | | | /\ | -------------------------- | | | +---------------------------------------------+

    d. pentru expresia (r) limbajul corespunztor este acceptat de automatul care accepta N(r).

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    33

    Se observ c pentru fiecare AFN - elementar se adaug cel mult o stare iniial i o stare final. Corespunztor pentru o expresie regulat dat automatul va avea un numr de stri egal cu maxim dublul numrului de simboli de intrare care apar n expresie. Compunerea acestor automate elementare va produce evident un automat care recunoate limbajul generat de expresie. De exemplu pentru expresia regulata : (a|b)*abb se obine :

    pentru fiecare a din expresie :

    +---+ +-----+

    | | a |+---+| -------->| i |------> || f || | | |+---+| +---+ +-----+

    pentru fiecare b din expresie : +---+ +-----+

    | | b |+---+| -------->| i |------> || f || | | |+---+| +---+ +-----+

    pentru a | b : +---+ +-----+

    | | a |+---+| ----------> | |------>|| ||---- / | | |+---+| \ / +---+ +-----+ \ +---+ / \ +-----+ | |/ \|+---+| ->| i | || f || | |\ /|+---+| +---+ \ / +-----+ \ +---+ +-----+ / \ | | b |+---+| / ---------->| |------>|| ||---/ | | |+---+| +---+ +-----+

    n final se obine :

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    34

    ---------------+

    / | / +-+ +-+ | / | |a | | | / / >|2|->|3|\ | / / | | | | \ | +-+ +-+ / +-+ +-+ +-+ +-+ +-+ +-+ +--+ | | | |/ | | | |a | |b | |b |--| > |0|->|1| |6|->|7|->|8|->|9|->|10| | | | |\ /| | | | | | | | |--| +-+ +-+ \ +-+ +-+ / +-+ +-+ +-+ +-+ +--+ \ \ | |b | | / /\ \ \ > |4|->|5|/ / \ | | | | / \ +-+ +-+ / \ / --------------------

    2.3.1.2 Conversia unui automat finit nedeterminist (AFN) ntr-un automat finit determinist(AFD) Din exemplele anterioare s-a observat c un acelai limbaj reprezentat de expresia regulat (a | b)*

    abb poate s fie recunoscut de dou automate diferite - unul nedeterminist i unul determinist. Propoziie Pentru orice automat finit nedeterminist exist un automat finit determinist care accept

    acelai limbaj. Avnd n vedere aceast echivalen ntre cele dou automate se pune problema, cum se poate

    construi un automat determinist echivalent unui automat nedeterminist dat. n cele ce urmeaz vom considera c automatul finit nedeterminist a fost construit pornind de la o expresie regulat pe baza construciei prezentate n capitolul anterior. Algoritmul care construiete automatul determinist utilizeaz o metod de construire a submulimilor unei mulimi date. Diferena ntre automatele deterministe i cele nedeterministe este dat de cardinalitatea funciei m. Automatul determinist se va construi calculnd n mod recursiv strile acestuia, simulnd n paralel toate evoluiile posibile pe care le poate parcurge automatul nedeterminist. Starea iniial a automatului finit determinist va corespunde mulimii strilor din automatul nedeterminist n care se poate ajunge pornind din starea iniiala s0 i utiliznd numai -tranziii. Orice stare s' a automatului determinist corespunde unei submulimi Q' Q a automatului nedeterminist. Pentru aceasta stare i un simbol de intrare a T,

    m(s',a) = {s Q | ( q Q')(s = m(q,a))}. Rezult deci c n funcionarea AFD care simuleaz de fapt funcionarea AFN se urmresc simultan

    toate "cile" pe care poate evolua automatul finit nedeterminist. Algoritmul care construiete automatul finit determinist echivalent cu un automat nedeterminist dat utilizeaz dou funcii : -nchidere i mutare. Funcia -nchidere : P(Q) P(Q) determin pentru fiecare mulime Q' Q setul strilor n care se poate ajunge datorit -tranziiilor. Considernd o stare q a automatului finit determinist (AFD), aceasta reprezint de fapt o submulime Q' Q a automatului nedeterminist. Notm cu

    -nchidere(Q) = -nchidere({s})

    sQ

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    35

    unde dac s S este o stare care nu are -tranziii atunci: -nchidere({s}) = {s} altfel -nchidere({s}) = -nchidere({s'}) {s} s' m(s,) Construcia funciei -nchidere pentru o mulime Q' se poate face utiliznd urmtorul algoritm : A = Q', B = ct timp A \ B execut fie t A \ B B = B {t} pentru fiecare u Q astfel nct m(t,) = u executa A = A {u} -nchidere(Q') = A Funcia mutare : P(Q) x T P(Q) este utilizat pentru construcia strii urmtoare a automatului

    determinist. Astfel pentru o stare q a automatului determinist, cruia i corespunde o mulime Q' Q, i o intrare a T,

    mutare(Q,a) = m(s,a) sQ' Construcia automatului determinist se face prin construcia unei tabele de tranziii tranz_AFD[] i a

    unei mulimi de stri stari_AFD. stari_AFD = {-inchidere({s0})} A = ct timp stari_AFD \ A execut

    fie t stari_AFD \ A A = A {t} pentru fiecare a T execut

    B = -inchidere(mutare(t,a)) stari_AFD = stari_AFD {B} tranz_AFD[t,a] = B

    Fie automatul nedeterminist :

  • Irina Athanasiu 3/1/2002 Limbaje formale i automate

    36

    ---------------+

    / | / +-+ +-+ | / | |a | | | / / >|2|->|3|\ | / / | | | | \ | +-+ +-+ / +-+ +-+ +-+ +-+ +-+ +-+ +--+ | | | |/ | | | |a | |b | |b |--| > |0|->|1| |6|->|7|->|8|->|9|->|10| | | | |\ /| | | | | | | | |--| +-+ +-+ \ +-+ +-+ / +-+ +-+ +-+ +-+ +--+ \ \ | |b | | / /\ \ > |4|->|5|/ / \ | | | |