CAPITOLUL I

Documente similare
1

Limbaje Formale, Automate si Compilatoare

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Curs7

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Cursul 12 (plan de curs) Integrale prime 1 Sisteme diferenţiale autonome. Spaţiul fazelor. Fie Ω R n o mulţime deschisă şi f : Ω R n R n o funcţie de

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Şiruri de numere reale Facultatea de Hidrotehnică Universitatea Tehnică Gheorghe Asachi Iaşi, 2015 Analiză Matematică Lucian Maticiuc 1 / 29

E_d_Informatica_sp_SN_2014_bar_10_LRO

Microsoft Word - Curs_09.doc

Microsoft Word - D_ MT1_II_001.doc

Microsoft Word - TIC5

Limbaje de ordinul I LOGICA DE ORDINUL I Un limbaj L de ordinul I este format din: o mulţime numărabilă V = {v n n N} de variabile; conectorii şi ; pa

Analiză de flux de date 29 octombrie 2012

Grafuri neorinetate Aplicatii 1 Care este numărul maxim de componente conexe pe care le poate avea un graf neorientat cu 20 noduri şi 12 muchii? a. 6

Microsoft Word - cap1p4.doc

E_d_Informatica_sp_MI_2015_bar_02_LRO

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

1. Găsiți k numerele cele mai apropiate într-un şir nesortat Dându-se un şir nesortat și două numere x și k, găsiți k cele mai apropiate valori de x.

Gheorghe IUREA Adrian ZANOSCHI algebră geometrie clasa a VII-a ediţia a V-a, revizuită mate 2000 standard EDITURA PARALELA 45 Matematică. Clasa a VII-

Slide 1

Subiectul 1

DAN LASCU ADRIANA-LIGIA SPORIŞ ANDA OLTEANU PAUL VASILIU MATEMATICĂ. CULEGERE DE PROBLEME TIP GRILĂ PENTRU ADMITEREA ÎN ACADEMIA NAVALĂ MIRCEA CEL BĂT

Analiză statică Analiza fluxului de date 23 octombrie 2014

ExamView Pro - Untitled.tst

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

I. INTRODUCERE 1. Necesitatea studiului logicii Teodor DIMA În activitatea noastră zilnică, atunci când învăţăm, când încercăm să fundamentăm o părere

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

I

Programarea şi utilizarea calculatoarelor

COMENTARII FAZA JUDEŢEANĂ, 9 MARTIE 2013 Abstract. Personal comments on some of the problems presented at the District Round of the National Mathemati

Elemente de aritmetica

gaussx.dvi

LOGICA MATEMATICA SI COMPUTATIONALA Sem. I,

Clasa IX 1. O lăcustă face salturi, fiecare salt în linie dreaptă şi de două ori mai lung ca precedentul. Poate vreodată lăcusta să revină în punctul

Microsoft Word - Curs1.docx

Curs8

Facultatea de Matematică Anul II Master, Geometrie Algebrică Mulţimi algebrice ireductibile. Dimensiune 1 Mulţimi ireductibile Propoziţia 1.1. Fie X u

Dorel LUCHIAN Gabriel POPA Adrian ZANOSCHI Gheorghe IUREA algebră geometrie clasa a VIII-a ediţia a V-a, revizuită mate 2000 standard EDITURA PARALELA

Spatii vectoriale

Microsoft Word - Lab1a.doc

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

PROGRAMA CONCURSULUI NAŢIONAL

Electricitate II

Prelegerea 3 În această prelegere vom învăţa despre: Clase speciale de latici: complementate. modulare, metrice, distributive şi 3.1 Semi-distributivi

Notiuni de algebra booleana

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Cursul 8 Funcţii analitice Vom studia acum comportarea şirurilor şi seriilor de funcţii olomorfe, cu scopul de a dezvălui o proprietate esenţială a ac

Microsoft Word - _arbori.docx

Microsoft Word - Curs_08.doc

Microsoft Word - Matematika_kozep_irasbeli_javitasi_0911_roman.doc

2.1.Tipul tablou unidimensional

Concurs online de informatică Categoria PROGRAMARE Secţiunea 5-6 avansaţi PROBLEMA puncte DANS De 1 Iunie - Ziua Copilului se organizează un spe

D.Rusu, Teoria măsurii şi integrala Lebesgue 6 MĂSURA LEBESGUE Cursul 5 Teorema 6.26 Există submulţimi ale lui R care nu sunt măsurabile Lebesgue. Dem

Retele Petri si Aplicatii

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Microsoft Word - CarteC.doc

Probleme rezolvate informatica: Probleme rezolvate grafuri si a

Probleme date la examenul de logică matematică şi computaţională. Partea a II-a Claudia MUREŞAN Universitatea din Bucureşti Facultatea de Matematică ş

1. a. Să se scrie un algoritm care să afişeze toate numerele de patru cifre care au cifra sutelor egală cu o valoare dată k, şi cifra zecilor cu 2 mai

CONCURSUL NAŢIONAL DE MATEMATICA PANAITOPOL EDIŢIA a X-a, TULCEA, 21 aprilie 2018 Clasa a VII - a 1. Se consideră numerele reale x, y şi z, cel puţin

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

BAC 2007 Pro Didactica Programa M1 2 Rezolvarea variantei 36 versiune finală Redactia Pro Didactica Suportul pe net:

Subiecte_funar_2006.doc

Microsoft Word - 2 ES RO.doc

RecMat dvi

C:/Users/Lenovo/Dropbox/activitate matematica/cursuri/MS ETTI /msetti.dvi

TEORIA MĂSURII Liviu C. Florescu Universitatea Al.I.Cuza, Facultatea de Matematică, Bd. Carol I, 11, R Iaşi, ROMANIA, e mail:

Microsoft Word - Algoritmi genetici.docx

Microsoft Word - Mihailesc Dan_Test logica (1).doc

Cursul 6 Cadru topologic pentru R n În continuarea precedentei părţi, din cursul 5, dedicată, în întregime, unor aspecte de ordin algebric (relative l

Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare

B

Microsoft Word - CarteC.doc

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

Modelarea si Simularea Sistemelor de Calcul

2

Cursul 7 Formula integrală a lui Cauchy Am demonstrat în cursul precedent că, dacă D C un domeniu simplu conex şi f : D C o funcţie olomorfă cu f cont

Prelegerea 4 În această prelegere vom învăţa despre: Algebre booleene; Funcţii booleene; Mintermi şi cuburi n - dimensionale. 4.1 Definirea algebrelor

Capitole Speciale de Informatică Curs 4: Calculul scorurilor în un sistem complet de extragere a informaţiilor 18 octombrie 2018 Reamintim că în cursu

Communicate at your best - Manual - Cap 3 - RO

ETTI-AM2, , M. Joița & A. Niță Notițe de Adrian Manea Seminar 11 Transformarea Laplace Aplicații Transformarea Z Ecuații și sisteme diferenți

Probleme proiect TP BITPERM Implementați un algoritm care citește de la intrarea standard două numere naturale și scrie la ieșirea standard da

Microsoft Word - Programa finala olimpiadei matematica 2007 gimnaziu.doc

Slide 1

Microsoft Word - Curs_10.doc

Ministerul Educatiei, Cercetarii si Tineretului Grup Scolar Gh. Asachi Galati Proiect pentru obtinerea certificatului de competente profesionale Speci

Coordonate baricentrice Considerăm în plan un triunghi ABC şi un punct Q în interiorul său, fixat arbitrar. Notăm σ c = aria ( QAB) σ a = aria ( QBC),

CONCURSUL DE MATEMATICĂ APLICATĂ "ADOLF HAIMOVICI" ETAPA JUDEȚEANĂ 18 martie 2017 Filiera Tehnologică : profilul Tehnic Clasa a IX -a Problema 1. 2 Se

Noțiuni matematice de bază

METODE NUMERICE ÎN INGINERIE

Calcul Numeric

Managementul Resurselor Umane

CURBE BÉZIER În CAGD se utilizează adesea curbele polinomiale, adică acele curbe definite de o parametrizare polinomială: C : [a, b] R 3 C(t) = (x(t),

O teoremă de reprezentare (II) Marian TETIVA 1 Abstract. In this paper some (in general well-known) results on complete sequences are exposed, with ap

MergedFile

Microsoft Word - a5+s1-5.doc

Cuantizare Vectoriala.doc

Transcriere:

CAPITOLUL I. LIMBAJE FORMALE 1.1. CONCEPTE DE BAZĂ Cunoaştem unele limbaje de nivel înalt, cum sunt Pascal, Fortran, Basic, C şi altele. Ne scriem programele în aceste limbaje iar când citim un program sau o descriere a unui algoritm scris într-unul din ele, de obicei, putem spune ce face programul sau algoritmul respectiv (cel puţin atunci când programul este bine scris şi are o lungime rezonabilă). Totodată ne dăm seama de erorile din programe sau dintr-o secvenţă de cod scrisă într-unul din aceste limbaje create de om. Următorul exemplu de linie de cod din Fortran, IF (IND.EQ.1) N = N + 1 (1.1) este corect, în timp ce IF (IND.EQ.1) N = (1.2) nu este corect. Surprinzător, nu doar noi, presupuse fiinţe inteligente, descoperim astfel de greşeli, da chiar şi maşinile (care în esenţă sunt formate dintr-o colecţie de elemente hardware). Cum se realizează acest lucru? De fapt, noi introducem programul într-o maşină simbol cu simbol. Când o expresia de forma (1.1) este prezentată calculatorului se transmite mai întâi litera I urmată de litera F, simbolul (, şi aşa mai departe. Maşina acceptă aceste simboluri unul câte unul şi după ce s-au introdus toate, ştie cum să procedeze în continuare. Ea poate determina de asemenea dacă şirul de simboluri primit este corect sau nu. Pentru aceasta,

maşina trebuie să cunoască ce înseamnă corect şi să fie în stare să determine dacă şirul (1.1) este scris corect, în timp ce (1.2) nu. În acest capitol vom discuta mai întâi cum se defineşte un limbaj. Această definiţie ne va permite să determinăm, în mod automat, dacă un şir de simboluri aparţine sau nu unui limbaj. O astfel de definire complet formală şi deterministă nu este posibilă pentru toate limbajele în particular, pentru limbaje naturale, cum sunt engleza, franceza şi rusa, este probabil imposibil. Dar ea pare adecvată pentru limbajele de calculator până la urmă calculatoarele funcţionează. Vom începe cu un alfabet fiecare limbaj presupune un alfabet. Alfabetul pentru Fortran se compune din 26 de litere: A, B,..., X, Y, Z; 1 numere:, 1, 2,..., 9, şi alte simboluri cum ar fi: =, +, /, *, (, (spaţiu). Alfabetul complet, numit şi mulţime de caractere, poate fi regăsit pe primele pagini ale oricărui manual dedicat limbajului respectiv. simboluri. Definiţia 1.1. Un alfabet este o mulţime nevidă şi finită de De obicei vom nota alfabetul cu simbolul Σ. Definirea unui limbaj peste un alfabet dat devine acum simplă. Definiţia 1.2. Un limbaj L peste un alfabet Σ este o mulţime de şiruri finite de elemente din Σ. Elementele uni alfabet Σ se mai numesc şi caractere. Şirurile dintr-un limbaj L se numesc şi propoziţii din L.

Exemplu 1.1. Fie alfabetul Σ, compus doar din două simboluri: şi 1, Σ= {,1}. Două exemple de limbaj peste Σ sunt: a) L 1 = {, 1,11}. Acest limbaj conţine doar trei propoziţii:, 1 şi 11. b) L 2 = Toate şirurile de şi 1 cu un număr egal de -uri şi 1-uri. Aşadar, 111 şi 11 sunt în limbajul L 2, în timp ce 11 şi 1 nu. Evident că limbajul L 2 (spre deosebire de L 1 ) conţine un număr infinit de propoziţii. Pe parcursul acestei lucrări vom folosi deseori şiruri de simboluri. Fapt pentru care folosim următoarele convenţii de notaţie. Dacă σ= xx... 1 2 xn şi yy... 1 2 ym τ= sunt două şiruri, atunci concatenarea lor, notată στ, este definită prin στ = xx 1 2... xnyy 1 2... y m. Aşadar, στ se obţine din σ şi τ prin alipirea şirurilor σ şi τ (în această ordine). De exemplu, dacă σ= 111 şi τ= 1, atunci στ = 1111. Se observă că τσ = 1111, deci, în general στ τσ 2 prin ca xx... x (de n ori). Observăm că x. Dacă x este un caracter, atunci x n este definit 3 = xx, y = yyy, etc. Lungimea unui şir σ= xx... 1 2 xm corespunde numărului de caractere din σ. Astfel, lungimea lui σ= abaa este 4. Convenabilă este introducerea conceptului de şir vid. Un astfel de şir nu are nici un caracter; lungimea lui este. El va fi notat întotdeauna cu λ şi reciproc, simbolul λ va fi rezervat pentru un astfel de şir. Dacă σ este un şir oarecare şi λ este şirul vid, atunci concatenarea lui σ cu λ va fi întotdeauna σ, σλ = λσ = σ. Din acest motiv, dacă x este un simbol oarecare, definim x ca fiind şirul vid λ, x = λ. Lungimea şirului vid λ este, el fiind singurul şir cu această lungime.

Definiţia 1.3. Fie Σ o mulţime nevidă. Limbajul tuturor şirurilor finite de elemente din Σ (inclusiv şirul vid) se notează cu Σ *. Limbajul + tuturor şirurilor nevide de elemente din Σ se notează Σ. În general, un limbaj L peste un alfabet Σ nu conţine toate şirurile posibile de elemente din Σ. Aceasta corespunde faptului că nu orice secvenţă de simboluri formează un program valid. Ceea ce dorim să facem în continuare este să descriem o regulă pentru a decide dacă un şir aparţine unui limbaj sau nu. Un astfel de exemplu putea fi considerat descrierea limbajului L 2 din exemplul 1.1. Aici regula este foarte simplă; mai mult, dat fiind un şir σ de simboluri de şi 1, este uşor de verificat dacă propoziţia face parte din limbaj sau nu. Pe de altă parte este greu de imaginat o regulă atât de simplă pentru un limbaj ceva mai real, cum e Pascal. Ca urmare, regula trebuie să fie sofisticată şi precisă astfel încât, dat fiind un program în Pascal (văzut ca un şir lung), ea să determine dacă este sau nu un program valid: Sunt toate BEGIN-uri închise cu END-uri? Sunt toate expresiile algebrice bine formate? etc. O metodă utilă şi generală pentru descrierea de limbaje se bazează pe gramatici. În general, o gramatică este o mulţime de reguli care, dacă sunt urmate, vor produce o propoziţie corectă într-un limbaj. O descrierea detaliată şi exactă a conceptului de gramatică este următoarea: Definiţia 1.4. O gramatică G se compune din patru obiecte: 1. O mulţime Σ nevidă şi finită numită alfabet. Limbajul generat de gramatica G se va compune din şiruri de simbolurile din Σ. Elementele din Σ se numesc terminale şi vor fi notate, în general, cu litere mici a, b, c, etc.

2. O mulţime nevidă şi finită de simboluri N, fiecare dintre ele diferit de terminalele din Σ (N Σ= ). Elementele din N se numesc neterminale sau variabile; în general se notează cu litere mari A, B, C, etc. 3. Un element dedicat S din N. Acest neterminal S se numeşte simbolul de start. 4. O mulţime P de producţii (numite şi reguli de producţie, reguli de substituire). Ea este formată din reguli de forma A X... 1X2 Xn, unde A este un neterminal şi XX... 1 2 X n este un şir finit de terminale sau neterminale ( Xi Σ N). Gramaticile astfel definite poartă denumirea de gramatici independente de context; le vom discuta amănunţit mai târziu. Şirul XX... 1 2 X n, din partea a 4-a a definiţie de mai sus, nu trebuie să conţină nici un simbol, el poate fi un şir vid λ. Producţia corespunzătoare ar fi atunci de forma A λ, şi se numeşte producţie vidă. O gramatică G cu Σ, N, S şi P, ca în definiţia 1.4., se va nota G = { Σ, N, S, P}. Exemplu 1.2. Fie următoarea descriere a unui gramatici {, N, S, P} G = Σ : 1. Mulţimea de terminale Σ (alfabetul) este { abc,, }. 2. Mulţimea de neterminale N este { S, A, B, C. } 3. Simbolul de start este S. 4. Mulţimea P este formată din următoarele producţii:

S AaB S B A ab A a B bc C ac C λ În ultima producţie λ este şirul vid şi C λ este o producţie vidă. Gramatica are trei terminale (a, b, c), patru neterminale (S, A, B, C) şi şapte producţii. În continuare vom descrie cum generează o gramatică un limbaj. Avem nevoie de următoarea terminologie: Definiţia 1.5. Fie G = { Σ, N, S, P} o gramatică. O formă propoziţională a lui G este orice şir XX... 1 2 X n de simboluri, fiecare X i fiind un terminal sau neterminal ( Xi Σ N). O formă propoziţională nu trebuie să conţină nici un simbol, ea poate fi chiar şirul vid λ. În exemplul 1.2. şirurile AaB, AAaCB, aba şi λ sunt exemple de forme propoziţionale. Definiţia 1.6. Fie G = { Σ, N, S, P} o gramatică. Presupunem că σ este o formă propoziţională exprimata astfel: σ = γ1aγ 2 unde γ 1 şi γ 2 sunt şiruri de terminale sau neterminale (forme propoziţionale) şi A este un neterminal. Mai presupunem că A X... 1X2 Xn este o producţie din P. Fie τ forma propoziţională obţinută din σ prin înlocuirea lui A cu XX... 1 2 X n, τ = γ1xx 1 2... Xnγ 2. Vom spunem că forma propoziţională τ este imediat derivabilă din σ folosind producţia A X... 1X2 Xn. Folosim următoarea notaţie: σ τ

Fie gramatica G = { Σ, N, S, P} din exemplul 1.2. Forma propoziţională folosind producţia B σ= ababc derivă imediat forma propoziţională τ= abcabc bc: σ= ababc abcabc Cu alte cuvinte, a spune că σ τ înseamnă că unul dintre neterminalele din σ poate fi înlocuit cu partea dreaptă a producţie şi devine şirul τ. În forma propoziţională producţie) şi am obţinut Aplicând la σ producţia C σ= ababc am înlocuit B cu bc (B bc fiind o τ= abcabc. Ca alt exemplu, fie σ= aacba. λ obţinem σ= aacba aaba Aici am substituit C cu partea dreaptă a producţiei C λ (şirul vid). Şirul λ, fiind şirul vid, nu are simboluri, deci aaλ ba = aaba, astfel simbolul C dispare. Definiţia 1.7. Fie σ 1 şi σ 2 două forme propoziţionale ale unei gramatici G. Presupunem că există o secvenţă de forme propoziţionale τ1, τ2,..., τ n astfel încât σ1 τ1 τ2... τn σ2. Vom spunem atunci că σ 1 derivă σ 2, sau σ 2 este derivabilă din σ 1 şi notăm σ * σ 1 2

În exemplul 1.2. avem S * aabc deoarece S AaB aab aabc S AaB A a B bc Sub fiecare simbol am indicat producţia corespunzătoare folosită din G la derivare. Fiind dată gramatica G = { Σ, N, S, P}, limbajul L(G) generat de G este mulţimea tuturor şirurilor de terminale derivabile din simbolul de start. Formal avem: Definiţia 1.8. Fie G = { Σ, N, S, P} o gramatică. Limbajul L(G) generat de G este definit a fi mulţimea de şiruri * { σ σ S σ} LG ( ) = Σ, *. Elementele (şirurile) din L(G) se numesc propoziţii din L(G). În exemplul 1.2. şirurile b, aabac şi bac aparţin toate lui L(G): S B bc b S AaB aab aabc aabac S B bc bac Observăm că şirul cb nu este în limbajul L(G). Într-adevăr, începând cu simbolul de start S, prima formă propoziţională derivată din

S va fi AaB sau B. Nici una dintre aceste două propoziţii va deriva într-o propoziţie care începe cu c. Exemplu 1.3. Gramatica din acest exemplu va da limbajul tuturor expresiilor algebrice corect formate care pot fi obţinute folosind simbolurile a, +, *, (, şi ). Astfel, expresia ( a+ a)* a va fi în limbaj, în timp ce ( a+ a)*( a+ nu. Această gramatică o notatăm G şi o vom întâlni des pe parcursul acestei lucrări. Alfabetul din G este Σ= { a, +,*,(,)}, mulţimea de neterminale N = { E, T, F} şi simbolul de start este E. Producţiile din G sunt: 1. E E+ T 2. E T 3. T T* F 4. T F 5. F ( E) 6. F a Expresia ( a+ a)* a face parte din limbajul LG ( ), derivarea sa fiind 2 3 4 5 1 E T T* F F* F ( E)* F ( E+ T)* F 2 4 6 ( T + T)* F ( F + T)* F ( a+ T)* F 4 6 6 ( a+ F)* F ( a+ a)* F ( a+ a)* a Numărul deasupra simbolului indică producţia folosită la fiecare derivare. Pentru a vedea că şirul ( a+ a)*( a+ nu este în LG ( ), observăm că singura posibilitate de apariţie a simbolurilor ) şi ( într-o formă propoziţională este prin aplicarea producţiei F ( E). De aici, orice şir derivat din E va avea acelaşi număr de ) ca şi (, iar şirul cu pricina nu are

această proprietate. Literele E, T şi F, care formează mulţimea neterminalelor, sunt mnemonice pentru expresie, termen şi factor. Există o serie de convenţii folosite la descrierea de gramatici. În lipsa unei alte specificaţii, terminalele alfabetului Σ vor fi notate cu litere mici a, b, c, etc., cu numere, 1, 2,..., 9 sau cu simboluri specifice ca +, *, (, ). Neterminalele sunt notate cu litere mari A, B, C,..., şi simbolul de start cu S. Şirul vid se notează întotdeauna cu λ. Prima producţie va avea simbolul de start pe partea stângă. Elementele mulţimii Σ N se vor numi simboluri gramatice; deci un simbol gramatic este sau terminal sau neterminal. Dacă A α 1 A α M A α 2 k sunt toate producţiile cu aceeaşi parte stângă A, atunci, pentru a se salva spaţiu, ele vor fi scrise sub următoare formă A α α L α α. 1 2 k 1 k Ca urmare, gramatica din exemplul 1.2. se va scrie S AaB B A a ab B bc C ac λ iar gramatica G din exemplul 1.3.

E E+ T T T T* F F F ( E) a Înţelesul simbolurilor reiasă din context. Dacă nu se specifică în mod explicit, fiind dată descrierea unei gramatici prin S AB A BSB BB 1 B A1 λ tragem concluzia că mulţimea de terminale Σ este {,1 }, mulţimea de neterminale N = { S, A, B} şi producţiile sunt S AB A BSB A BB A 1 B A1 B B λ Forma această o vom folosi des pentru descrierea gramaticilor. Derivarea unei propoziţii într-un limbaj generat de o gramatică se poate reprezentat grafic printr-un arbore de derivare. Ca exemplu considerăm gramatica G: S aba B Sb bcc C abb şi o derivare a propoziţiei aababbabbaba:

S aba asba aababa aabccaba aababbcaba aababbabbaba O derivarea reprezentată schematic printr-un graf, se numeşte arbore de derivare, figura 1.1. Figura 1.1. Un arbore de derivare a unui şir. Obiectele rotunde din graf se numesc noduri. Nodul din vârf, S, se numeşte rădăcina arborelui. Dacă un nod X este legat de un nod de pe un nivel mai jos, atunci X se numeşte părintele lui Y şi Y se numeşte fiul lui X. Nodurile care nu au fii se numesc frunze, nodurile cu fiu/fii şi părinte se numesc noduri interne. Formarea grafului, numit arbore de derivare, este evidentă. Dacă A este un neterminal, care se înlocuieşte cu partea dreaptă a producţiei A X1X2L Xn, atunci nodul A are ca fii X1, X2,..., Xn (de la stânga la dreapta). Rădăcina arborelui este nodul S, unde S este simbolul de start a gramatici iar frunzele sunt noduri de forma x, unde x Σ sunt terminale. Dat fiind un arbore de derivare a unui şir, vom obţine acest şir prin concatenarea frunzelor arborelui de la stânga la dreapta.

Figura 1.2. Formarea unui arbore de derivarea Propoziţia ( a+ a)* a în limbajul LG ( 2) din exemplul 1.3., are arborele de derivare din figura 1.3. Figura 1.3. Arborele de derivare pentru ( a+ a)* a Exemplu 1.4. Ca un alt exemplu, prezentăm o gramatică pentru limbajul tuturor constante reale valide din Fortran. În manualul de Fortran, aceste constante sunt descrise în diferite moduri. Printre care o constantă reală este reprezentată printr-un şir de numere; conţine un punct zecimal şi un exponent reprezentând o putere a lui 1 sau amândouă. Constante reale pot fi în următoarele formate: n. n n.,. n, n. ne ± s, n. E ± s,. ne ± s, ne ± s.

Exemple sunt: 3.E1, 3.1415768, 31.41592E-1, 314.749162,.31415E1, -3.141592E+279,.31415E+1. Un exemplu de gramatică care generează un astfel de limbaj este: S AB A XD B EXI λ D. I I. I. I I X + λ I M MI M 1 2 3 4 5 6 7 8 9 Terminalele formează mulţimea {,1, 2, 3, 4, 5, 6, 7, 8, 9, E,,,.} Σ= +, mulţimea de neterminale este N = { S, A, B, D, I, M, X} şi simbolul de start este S. Arborele de derivare pentru -3.14E1 este dat în figura 1.4. Evident, că toate constantele Fortran (şi numai acestea) pot fi derivate folosind această gramatică. Bineînţeles că aceasta nu este unica gramatică care poate fi folosită pentru descrierea acestui limbaj; este posibil să avem două gramatici distincte G 1 şi G 2 astfel încât LG ( 1) = LG ( 2). Vom discuta acest concept mai târziu. De fapt, întregul limbaj Pascal, ca şi oricare alt limbaj de calculator, poate fi descris prin gramatica lui. Aceste gramatici sunt lungi şi includ mai multe sute de producţii. Metodă aceasta de descriere a limbajului de calculator este numită Backus Normal Form sau BNF. Notaţia folosită aici diferă puţin de notaţia introdusă mai sus. Săgeata este reprezentată prin simbolul ::= şi neterminalele sunt scrise ca fraze auto explicative închise între < L >. De pildă, o descriere BNF a constantelor întregi din Fortran (sau oricare alt limbaj) poate fi:

< IntegerConstant > :: =< Sign >< Number > < Sign > :: =+ λ < Number > :: =< Digit > < Digit >< Number > < Digit > :: = 1 2 3 4 5 6 7 8 9 Evident, că această formă de descriere a gramaticilor (şi a limbajelor), în afara convenţiilor de notaţie, este identică cu aceea prezentată anterior. Figura 1.4. Arbore de derivare pentru -3.14E1 1.2. TIPURI DE GRAMATICI ŞI CLASIFICAREA LOR Ideea descrierii unui limbaj printr-o gramatică aparţine lui N. Chomsky. În prima parte a activităţii sale interesul lui s-a îndreptat spre limbaje naturale, ca engleza şi germana. Vom prezenta în continuare unele definiţii generale de gramatici. I. Gramatici de tip sau gramatici fără restricţii. O gramatică fără restricţii G se compune din patru obiecte: o mulţime nevidă de terminale Σ, o mulţime nevidă, N, de neterminale, cu N Σ=, un simbol de start

S N şi un ansamblu finit de producţii P. Într-o gramatică fără restricţii producţiile sunt de forma u v unde u şi v sunt şiruri oarecare de terminale sau neterminale; u λ. Această producţie permite înlocuirea arbitrară a unui şir (u) cu un şir (v). Se spune, că o forma propoziţională σ derivă imediat o formă propoziţională τ dacă σ = αuβ, τ = αvβ şi u v este o producţie a gramaticii. Vom nota aceasta prin σ τ. Limbajul LG ( ) este definit a fi mulţimea şirurilor de terminale derivabil din simbolul de start S. N Exemplu 1.5. Fie Σ= { abc,, } alfabetul unei gramatici G, = { S, X, Y} mulţimea neterminalelor, S simbolul de start şi mulţimea producţiilor dată de 1. S axyc 2. ax cad 3. Xc axa 4. XYc Xcc 5. Yc λ Un exemplu de derivare în această gramatică ar fi S axyc cadyc cad sau S a XYc a Xcc aax ac acadac.

În formele propoziţionale de mai sus am subliniat partea stângă a producţiilor folosite. Gramaticile de acest tip sunt foarte generale; orice limbaj (mulţime de şiruri) poate fi descris de o gramatică de tip. Un limbaj generat de o gramatică de tip se numeşte limbaj de tip. II. Gramatici de tip 1, sau gramatici dependente de context. Terminalele, neterminalele şi simbolul de start sunt aceleaşi. Fiecare producţie va avea acum forma αaβ ασβ unde A este un neterminal şi σ λ este un şir oarecare de terminale sau neterminale. Neterminalul A se înlocuieşte cu σ doar dacă A este înconjurat, sau în context, de α şi β. Evident că gramaticile dependente de context sunt şi de tip, dar reciproc nu. III. Gramatici de tip 2 sau gramatici independente de context. Dacă toate producţiile unei gramatici sunt de forma A σ, unde A este un singur neterminal şi σ un şir oarecare de terminale sau neterminale, atunci gramatica se numeşte gramatică independentă de context, notată GIC. Gramatici de tip 2 sunt o restricţie a gramaticilor de tip 1: este necesar ca α = β = λ. Astfel, dată fiind forma propoziţională γ1aγ 2 şi o producţie A σ, înlocuim A cu σ pentru a deriva o formă γσγ 1 2 indiferent de contextul γ 1 şi γ 2. Acest fapt explică denumirea de independent de context. Obţinem exact definiţia unei gramatici dată de definiţia 1.4. Strict văzut, gramatici de tip 2 nu sunt chiar restricţii ale gramaticilor de tip1, deoarece sunt permise producţii de forma A λ în

una dar nu şi în cealaltă. Acesta ne conduce la un caz special. Vom arăta într-un capitolul 7, că dată fiind o gramatică independentă de context cu producţii vide, există o gramatică independentă de context echivalentă (generând acelaşi limbaj) fără producţii vide, exceptând S λ (unde S este simbolul de strat). În particular, dacă G este o gramatică independentă de context astfel încât λ LG ( ) limbajul generat de G atunci LG ( ) = LG ( '), unde G ' este o gramatică independentă de context fără producţii vide. Astfel, dacă L este un limbaj de tip2 care nu-l conţine pe λ, atunci este şi de tip 1. Reciproca nu este adevărată: există limbaje de tip1 care n-au gramatici independente de context. Majoritatea gramaticilor discutate în această lucrare vor fi independente de context ele sunt mult mai uşor de analizat. Toate limbajele actuale de programare, Pascal, C, etc., sunt independente de context. IV. Gramatici de tip 3 sau gramatici regulare. Există o subclasă interesantă de gramatici independente de context, numite gramatici regulare sau liniare. Definiţia 1.9. Spunem că o gramatică G este liniară la dreapta sau regulară la dreapta, dacă fiecare din producţiile sale are una din formele următoare: S λ A ab A a. Unde, S este simbolul de start, λ şirul vid, A, B neterminale arbitrare şi a un terminal oarecare. O gramatică se numeşte liniară la stânga sau regulară la stânga dacă toate producţiile sale au una din formele următoare:

S λ A Ba A a O gramatică se numeşte regulară (liniară) dacă este regulă (liniară) la dreaptă sau la stânga. Evident, gramaticile regulare sunt independente de context. Le vom studia detaliat în capitolul 2. Această clasificarea a gramaticilor (tip j, j=, 1, 2, 3) este cunoscută sub denumirea de ierarhie Chomsky. 1.3. REPREZENTAREA LIMBAJELOR PRIN GRAMATICI Am văzut în paragrafele 1.2. şi 1.3. cum se descrie un limbaj în termeni de gramatici. Din punct de vedere a ştiinţei calculatoarelor următoarele două probleme inverse sunt mai importante (şi dificile). I. Fiind dat un şir σ de terminale, aparţine el limbajului? II. Fiind dat un şir σ dintr-un limbaj, cum a fost derivat? Importanţa problemei I este evidentă fiind dat un program scris într-un limbaj oarecare dorim să determinăm dacă este scris corect. Nu punem întrebarea dacă programul face ceea ce ar trebui să facă, ci doar dacă este valid sau nu. Ceea ce dorim să aflăm la acest punct este dacă programul este gramatical corect. Sunt toate instrucţiunile în forma potrivită? Sunt toate ciclurile DO închise? Se termină toate BEGIN-urle cu END-ul corespunzător? ş.a.m.d. Examinarea acestui tip de întrebare este cunoscută sub denumirea de analiză lexicală. Problema II este chiar mai importantă, ea permiţându-ne să interpretăm înţelesul programului şi să decidem cum va fi executat. Studierea acestei a doua probleme se numeşte analiză sintactică (eng. parsing). Vom ilustra aceste două puncte de vedere în următorul exemplu.

Exemplu 1.6. Fie G gramatica tuturor expresiilor aritmetice corecte scrise formate din întregi pozitivi şi simbolurile +, *, (, şi ). Această gramatică are producţiile 1. E E+ T 3. T T* F 5. F ( E) 2. E T 4. T F 6. F a Simbolul a reprezintă un şir oarecare de întregi pozitivi. Fiind dat o propoziţie în limbajul LG ( ), (5 + 3)*4, avem să decidem: I. Este o propoziţie validă? II. Ce înseamnă propoziţia? În II este implicată interpretarea sau evaluarea şirului (5 + 3)*4. Când acest şir va fi introdus, maşina ar trebui să ştie să ia numerele 5 şi 3, să le încarce în memorie sau în registre, să execute adunarea, să ia rezultatul adunării şi să-l încarce în locaţia potrivită, iar apoi să încarce numărul 4 şi să execute înmulţirea finală. Toate acestea se producă complet automat; maşina fiind programată astfel încât, când primeşte şirul (5 + 3)*4, toate operaţiile anterioare să se realizează în ordinea corectă. Vom arăta în continuare că dacă maşina este capabilă să reproducă arborele de derivare a propoziţiei, ea poate intui cum să realizeze cele de mai sus, de exemplu, poate descifra înţelesul sau valoare expresiei.

Figura 1.5. Arbore de derivare pentru (5 + 3)*4. Într-adevăr, presupunând că avem arborele de derivare pentru (5 + 3)*4, ca în figura 1.5., a verifica dacă şirul aparţine limbajului este simplu: concatenăm frunzele arborelui de la stânga la dreapta şi verificăm dacă şirul obţinut se potriveşte, simbol cu simbol, celui iniţial. Nu vom discuta cum se memorează un astfel de arbore, cum se accesează nodurile, etc. Acestea ţin de implementare şi, în particular, pot depinde de aspecte hardware ale maşinii. Pretindem că, dat fiind acest arbore de derivare putem determina înţelesul şirului. Vom rescrie arborele într-un mod diferit. Fiecare nod va fi reprezentat printr-o celulă X n : Simbolul X va fi simbolul gramatic al nodului, (terminal, neterminal) iar n specifică numărul producţiei folosite în obţinerea fiilor nodului.

E 2 T 3 T 4 * F 6 F 5 4 ( E 1 ) E 2 + T 4 T 4 F 6 F 6 3 5 Figura 1.6. Derivarea lui (5 + 3)*4. Dacă X este un terminal, de exemplu când nodul este frunză, punem n =. Arborele de derivare pentru (5 + 3)*4 va arăta atunci ca în figura 1.6. Se defineşte o funcţie V ( X n ) V ( X, n) = pe noduri în felul următor: Xifn= V ( LeftChild( X, n)) + V ( RightChild( X, n)) if n = 1 V( X, n) = V( Child( X, n) if n= 2,4, sau 6 V ( LeftChild( X, n))* V ( RightChild( X, n)) if n = 3 V ( MiddleChild( X, n) if n = 5

Funcţia V( X, n ) este deci definită pentru acei X şi n pentru care X n poate fi nod într-un arbore de derivare a unei expresii aritmetice. Definiţiile funcţiilor LeftChild, RightChild, MiddleChild şi Child se subînţeleg. Dat fiind arborele de derivare a unei expresii, pentru aflarea înţelesului sau valorii acesteia, se evaluează V(Root). În exemplul discutat, vom avea: V( Root) = V( E,2) = VT (,3) = VT (,4)* VF (,6) = V( F,5)* V(4,) = V( E,1)*4 = ( V( E,2) + V( T,4))*4 = ( VT (,4) + VF (,6))*4 = ( V( F,6) + V(3,))*4 = ( V (5,) + 3)*4 = ( V (5,) + 3)*4 = (5 + 3)*4 = 32 Evident, funcţia V va calcula corect valoarea oricărei expresii aritmetice valide, dacă cunoaşte arborele de derivare a expresiei. Funcţia V este recursivă, ea se va autoapela la evaluarea unor argumente. S-ar putea ca să nu fie clar cititorului cum se implementează, în mod complet automat, pe calculator evaluarea unei astfel de funcţii. Acest lucru, însă, poate fi realizat, iar implementarea specifică va depinde, la rândul ei, de limbajul şi de hardware-ul folosi. Nu intrăm în amănuntele acestui subiect. Mai degrabă vom studia procesului de reconstruire a arborelui de derivare pentru un şir dat. Motivul introducerii funcţiei V a fost, de a convinge cititorul că procesul de reconstruire a arborelui de derivare este întradevăr folositor şi chiar necesar.

Următoarea problemă se ridică imediat ce discutăm de parsing (de exemplu despre reconstruirea arborelui de derivare): Fiind dată o gramatică G şi un şir σ din limbajul LG ( ), atunci poate avea σ doi arbori distincţi de derivare? Se constată, desigur, că astfel de fenomene exista. Exemplu 1.7. Fie G gramatica S A A A A 1 Figura 1.7. arată doi arbori de derivare distincţi pentru şirul σ= 111. Figura 1.7. Arbori de derivare distincţi pentru şirul σ= 111. Aceasta ne conduce la următorul concept: Definiţia 1.1. O gramatică G se numeşte ambiguă dacă există o propoziţie σ în LG ( ) cu doi arbori de derivare distincţi. Dacă o gramatică nu este ambiguă, ea se numeşte neambiguă. Exemplu 1.8. Următorul este un exemplu concret relativ la construcţia if C1 then C2 else C 3 din Pascal sau din alt limbaj de

programare. Un fragment a unei gramatici pentru Pascal care foloseşte această construcţie poate fi dat în felul următor: < statement > if < condition > then < statement > if < condition > then < statement > else < statement > < other kind of statement > (1.3) Dacă aceste construcţii sunt descrise de gramatica de mai sus, atunci arborele de derivare a unor propoziţii nu va fi unic. Considerăm următoarea propoziţie: if C = then if D = 1 then A: = 3 else A: = 4 (1.4) Ea are doi arbori de derivare distincţi, ca în figura 1.8. Înţelesul sau valoarea lui σ, diferă pentru fiecare dintre cei doi arbori. Presupunând că în timpul execuţiei, variabila C are valoarea 1, D=1, A=5 şi se întâlneşte propoziţia σ. Dacă se admite ca arborele de derivare să fie dat de figura 1.8.(a), valoarea A = 5 rămâne. Dacă, pe de altă parte, se consideră arborele din figura 1.8.(b) ca fiind cel corect, valoarea lui A devine 4. Astfel, la compilarea programelor derivate de la o gramatică ambiguă, trebuie luată o decizie arbitrară şi anume, care dintre arborii de derivare se va folosi, adică, ce înţeles se atribuie propoziţiei. În acest exemplu, este preluat înţelesul dat de arborele din figura 1.8.(a). Regula arbitrar aleasă, însă fixată, este: Fiecare else se asociază cu cel mai apropiat then precedent.

(a) <statement> if C = then <statement> if D = 1 then A := 3 else A := 4 (b) <statement> if C = then <statement> else A := 4 if D = 1 then A := 3 Figura 1.8. Ambiguitate pentru if...then...else. Observăm că, gramaticile neambigue sunt preferabile celor ambigue. În general, fiind dată o gramatică G, nu există un algoritm pentru a determina dacă ea este ambigua sau nu. Unele gramatici speciale permit însă acest lucru în capitolul 8 vom arăta că gramatica expresiilor aritmetice, G, este neambiguă. Se poate întâmpla, ca pentru o gramatică dată G, care generează un limbaj LG ( ), să existe o altă gramatică diferită care generează acelaşi limbaj, adică, LG ( ') = LG ( ). Următorul exemplu arată acest fenomen. Exemplu 1.9. Fie gramatica G S A A S λ

şi gramatica G ' S B B S Este evident că ambele gramatici generează acelaşi limbaj L mulţimea tuturor şirurilor având un număr par de zerouri. Gramaticile la rândul lor, sunt total diferite: nu are nici una din aceste proprietăţi. G ' este o gramatică regulară fără producţii vide, iar G Se poate da o gramatică ambiguă G şi să existe o altă gramatică astfel încât LG ( ) = LG ( '). Rescriem gramatica pentru if...then...else din exemplul 1.8. în felul următor: G ' < statement > S S < other kind of sentence > 1 2 S if < condition > then S 1 1 if < condition > then S else S 2 1 < other kind of sentence > S if < condition > then S else S 2 2 2 < other kind of sentence > (1.5) Această gramatică generează aceeaşi propoziţie ca gramatica din exemplul 1.8., dar ambiguitatea a fost înlăturată. Aşadar, dacă propoziţia if C = then if D = 1 then A: = 3 else A: = 4 este analizată sintactic, înţelesul ei se interpretează ca if C = then ( if D = 1 then A: = 3 else A: = 4) opus lui

if C = then ( if D = 1 then A: = 3) else A: = 4 Definiţia 1.11. Un limbaj se numeşte ambiguu în mod inerent dacă orice gramatică care generează L este ambiguă. Un exemplu de astfel de limbaj este k k m n {,, şi 1,cu ( 1şi )sau ( şi )} L= abc d k l m n k= m= n k= n l= m. Şiruri din L sunt aabbcccddd ( k = l = 2, m= n= 3) şi aabbbcccdd ( k = n= 2, l = m= 3). A demonstra că acesta este un limbaj ambiguu în mod inerent, nu face parte din scopul acestei lucrări. 1.4. O INTRODUCERE ÎN PARSING (ANALIZA SINTACTICĂ) Considerăm problema reconstruirii arborelui de derivare pentru o propoziţie dată, adică, problema analizei sintactice. Întreaga lucrare se va concentra asupra acestei probleme, actualul paragraf fiind doar partea de introducere. Am putea crede că pentru specificarea arborelui de derivare este de ajuns folosirea secvenţei de producţii de la derivare. Urmând această idee, în lipsa unor restricţii, vor apărea dificultăţi. În primul rând, două secvenţe diferite de producţii pot conduce la acelaşi arbore. De exemplu, fie gramatica expresiilor aritmetice G 1. E E+ T 3. T T* F 5. F ( E) 2. E T 4. T F 6. F a

şi şirul a+ a din acest limbaj. Secvenţele 1, 2, 4, 6, 4, 6 şi 1, 4, 6, 2, 4, 6 sunt diferite şi corespund la două derivări pentru a+ a. 1 2 4 6 4 6 E E+ T T + T T + F T + a F + a a+ a şi 1 4 6 2 4 6 E E+ T E+ F E+ a T + a F + a a+ a Ambele derivări generează acelaşi arbore din figura 1.9. Figura 1.9. Arbor de derivare pentru a+ a. Poate avea loc şi situaţia inversă: dacă nu specificăm la fiecare pas care neterminal este înlocuit, aceeaşi secvenţă de producţii poate conduce la arbori de derivare distincţi. Pentru a vedea asta considerăm gramatica 1. S A 2. A AA 3. A 1 Secvenţa de producţii 1, 2, 2, 3, 3, 3 conduce la două derivări distincte:

1 2 2 3 3 3 S A AA AA A 1AA 11A 111 şi 1 2 2 3 3 3 S A AA AA A AA1 A11 111 (În fiecare formă propoziţională este subliniat neterminalul care va fi înlocuit.) Arborii de derivare a acelor două derivări, apar în figura 1.1., ei sunt diferiţi. Figura 1.1. Gramatici ambigue. Aşadar, pentru a specifica arborele de derivare prin secvenţele de producţii folosite, este totodată necesară şi specificarea, la fiecare pas, a neterminalului înlocuit. Aceasta este greu de realizat şi se observă că nu este necesar deoarece putem specifica dinainte care neterminal va fi ales pentru înlocuire.

Definiţia 1.12. Fie G o gramatică, σ o propoziţie în limbajul LG ( ) şi S σ1 σ2... σn = σ (1.6) derivarea lui σ. Spunem că (1.6) este derivarea la stânga a lui σ, dacă la fiecare pas σi σ i + 1, neterminalul înlocuit din σ i, este cel mai din stânga. Spunem că (1.6) este derivarea la dreapta dacă la fiecare pas înlocuim neterminalul cel mai din dreapta. De exemplu, derivarea la stânga a lui ( a+ a)* a în G (gramatica expresiilor aritmetice din exemplul 1.3.) este 1 3 4 5 1 2 E T T* F F* F ( E)* F ( E+ T)* F 6 4 6 4 6 ( T + T) + F ( F + T)* F ( a+ T)* F ( a+ F)* F ( a+ a)* F ( a+ a)* a Derivarea la dreapta a aceleiaşi propoziţii este atunci 2 3 6 4 5 1 E T T* F T* a F* a ( E)* a 4 4 6 4 ( E+ T)* a ( E+ F)* a ( E+ a)* a ( T + a)* a ( F + a)* a ( a+ a)* a 1 Astfel, dacă ştim de dinainte ce fel de derivare se foloseşte (la stânga sau la dreapta), secvenţa de producţii din derivarea unei propoziţii va descrie complet arborul de derivare.

Definiţia 1.13. O analiză la stânga a unui şirσ este secvenţa de producţii folosită în derivare la stânga a lui σ. O analiză la dreapta a lui σ este inversa secvenţei de producţii folosite în derivarea la stânga a lui σ. Motivul folosirii inversei din definiţia analizei la dreapta va fi, pe scurt, discutată în această parte şi detaliat în capitolul 8. Astfel, analiza la stânga pentru ( a+ a)* a este: 2, 3, 4, 5, 1, 2, 4, 6, 4, 6, 6. Analiza la dreapta a aceluiaşi şir va fi: 6, 4, 2, 6, 4, 1, 5, 4, 6, 3, 2. Putem vorbi de o analiză la stânga şi la dreapta a oricărei forme propoziţionale derivate din simbolul de start S. De exemplu, analiza la stânga pentru a*( E ) în gramatica G este 2, 3, 4, 6, 5, deoarece 2 3 4 6 5 E T T* F F* F a* F a*( E) Toate acestea nu ne dau o metode de determinare a analizei (la stânga sau la dreapta) a unui şir. Fiind dat un şir de terminale σ= aa... 1 2 an, singurul lucru pe care-l ştim despre arborele lui de derivare este, că are simbolul S în vârf iar frunzele din partea de jos formează şirul aa... 1 2 a n : Figura 1.11. Arborul de derivare pentru aa... 1 2 a n.

Există două posibilităţi de a popula interiorul arborelui: una este de a-l reconstrui de sus în jos (eng. top-down) iar cealaltă de jos în sus (eng. bottom-up). În schema de analiză top-down, pornim cu neterminalul S şi încercăm să descoperim prima producţie S σ1 care garantează o derivarea a lui aa... 1 2 a n de forma S σ L aa a. 1 1 2... n Odată ce a fost determinată, avem de examinat şirul σ 1 şi de descoperit care din neterminalele sale, fie acesta A, trebuie înlocuit cu partea dreaptă a producţiei A α, producând astfel forma propoziţională σ 2 în derivarea S σ σ L aa a. 1 2 1 2... n Procedura se repetă până când întreaga derivare este reconstruită. Dacă ne limităm la derivarea la stânga, de exemplu, la fiecare pas vrem să aflăm neterminalul cel mai din stânga care va fi înlocuit, dintr-o formă propoziţională σ, există o modalitate foarte bună pentru efectuarea acestei alegeri avansate. Ea va fi prezentată în capitolul 6. În schema de analiză bottom-up, procesul este invers: Începând cu şirul aa... 1 2 a n, încercăm să găsim o formă propoziţională σ k astfel încât derivarea lui aa... 1 2 a n să aibă forma S L σ... k aa 1 2 an.

Pentru aceasta, trebuie să localizăm un subşir α din aa 1 2... a n care corespunde părţii drepte a unei producţii A α şi să înlocuim acest α cu A. (Un astfel de subşir α se numeşte referinţă (eng. handle)). În continuare repetăm procedura cu şirul σ k în loc de 1 aa 2... a n. Continuăm până când ajungem la S. Nu reiese limpede cum se obţine aceasta, dar este posibil, dacă ne limităm la construirea derivării la stânga. Vom explica acest proces în capitolul 8. Aşa se explica de ce analiza la dreapta a fost definit ca fiind inversul secvenţei de producţii folosite în derivarea la stânga a şirului: În analiza bottom-up determinăm mai întâi ultima producţie folosită în derivare, iar apoi penultima ş.a.m.d. PROBLEME 1. Fie G limbajul expresiilor algebrice din exemplul 1.3. Daţi arborele de derivare, analiza la stânga şi la dreapta a următoarelor şiruri: a) a+ a+ a b) ( a+ a)* a+ a*( a+ a) c) a* a* a+ a* a Daţi în problemele 2 12 o gramatică independentă de context care descrie limbajul dat şi un arbore de derivare pentru şirul σ indicat. * 2. Toate şirurile σ {,1} având un subşir 1; σ = 1111. * 3. Toate şirurile σ {,1} de lungime impară; σ = 1111. m+ n m n 4. L= { a b d m, n } σ = aaaabccc. 5. { m n L= a b 1 n m 2 n} ; σ = aaabb. 6. { m n L= a b 2 2n m 3 n} ; σ = aaaabb.

7. Mulţimea tuturor şirurilor peste Σ= {, 1} de lungime impară; σ = 1111. 8. Mulţimea tuturor şirurilor peste Σ= {, ab} în care numărul de a-uri este egal cu numărul de b-uri; σ = abbaaabb. 9. Mulţimea tuturor şirurilor peste Σ= {, ab} în care este un a mai mult decât b-uri; σ = aabbbaa. 1. Mulţimea şirurilor peste Σ= {, 1} în care 1 apare cep puţin de 3 ori; σ = 111. 11. Mulţimea şirurilor peste Σ= {, ab} în care primul simbol este diferit de ultimul simbol; σ = aababab. 12. Mulţimea tuturor datelor valide pentru anul 19 până 1999 dat sub forma NOIEMBRIE 3, 1941. Observăm că anul 19 nu a fost un an bisect deci nu a existat un FEBRUARIE 29 în 19; σ = OCTOMBRIE 3, 1941. În problemele 13 15, descrieţi limbajul generat de gramatica dată. 13. S aasb A, A cadd cd 14. S ASBB AB, A aa b, B Bc d 15. S asb asbb asbbb ab Fiecare gramatică din problemele 16 21 este ambiguă. Găsiţi pentru aceste gramatici o propoziţie cu doi arbori distincţi de derivare. 16. S SaSa b 17. S asb Sb Sa a 18. S aas aaas a

19. S as asb A, A Aa a 2. S AA, A AAA a ba Ab 21. S AaA, A aa ba λ 22. Arătaţi că fiecare gramatică stâng liniară are şi o gramatică drept liniară, şi reciproc. 23. Un fragment al gramatici corespunzătoare construcţiilor if...then...else, dat în (1.3), a fost ambiguu, propoziţia (1.4) având, ca în figura 1.8., doi arbori distincţi de derivare. Acest fragment a fost rescris în (1.5) astfel încât propoziţia (1.4) să aibă arborele de derivare dat de figura 1.8.(a). Rescrieţi gramatica din (1.3) astfel încât propoziţia (1.4) să aibă un unic arbore de derivare dat de figura 1.8.(b).