Indrumator de laborator - LUCRAREA NR. 2

Σχετικά έγγραφα
Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

Metode iterative pentru probleme neliniare - contractii

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

Curs 4 Serii de numere reale

Curs 1 Şiruri de numere reale

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

MARCAREA REZISTOARELOR

Criptosisteme cu cheie publică III

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

5.4. MULTIPLEXOARE A 0 A 1 A 2

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

riptografie şi Securitate

Esalonul Redus pe Linii (ERL). Subspatii.

Laborator 11. Mulţimi Julia. Temă

2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER

Integrala nedefinită (primitive)

III. Reprezentarea informaţiei în sistemele de calcul

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Seminar 5 Analiza stabilității sistemelor liniare

Subiecte Clasa a VIII-a

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.


RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

Curs 2 Şiruri de numere reale

a. 11 % b. 12 % c. 13 % d. 14 %

Asupra unei inegalităţi date la barajul OBMJ 2006

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

Παρουσίαση του εργαλείου. flex. γεννήτρια λεκτικών αναλυτών. για το µάθηµα: Μεταγλωττιστές. Χανιά, flex 1

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

Capitolul 4. Integrale improprii Integrale cu limite de integrare infinite

Metode de interpolare bazate pe diferenţe divizate

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0

Sisteme diferenţiale liniare de ordinul 1

Subiecte Clasa a V-a

Capitolul 2 - HIDROCARBURI 2.5.ARENE

Subiecte Clasa a VII-a

Spatii liniare. Exemple Subspaţiu liniar Acoperire (înfăşurătoare) liniară. Mulţime infinită liniar independentă


2. Circuite logice 2.2. Diagrame Karnaugh. Copyright Paul GASNER 1

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

Capitolul 2 - HIDROCARBURI 2.3.ALCHINE

Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent

Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane

CAPITOLUL II. MAŞINI CU STĂRI FINITE

SEMINARUL 3. Cap. II Serii de numere reale. asociat seriei. (3n 5)(3n 2) + 1. (3n 2)(3n+1) (3n 2) (3n + 1) = a

Παρουσίαση του εργαλείου FLEX

Problema a II - a (10 puncte) Diferite circuite electrice

Profesor Blaga Mirela-Gabriela DREAPTA

BARAJ DE JUNIORI,,Euclid Cipru, 28 mai 2012 (barajul 3)

Capitolul 2 - HIDROCARBURI 2.4.ALCADIENE

Examen AG. Student:... Grupa:... ianuarie 2011

CURS 11: ALGEBRĂ Spaţii liniare euclidiene. Produs scalar real. Spaţiu euclidian. Produs scalar complex. Spaţiu unitar. Noţiunea de normă.

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice

Subiecte Clasa a VIII-a

Lucrare. Varianta aprilie I 1 Definiţi noţiunile de număr prim şi număr ireductibil. Soluţie. Vezi Curs 6 Definiţiile 1 şi 2. sau p b.

Geometrie computationala 2. Preliminarii geometrice

Capitolul 2 - HIDROCARBURI 2.5.ARENE

CAPITOLUL 4 AUTOMATE PUSH-DOWN 4.1. DEFINIREA UNUI AUTOMAT PUSH-DOWN

V O. = v I v stabilizator

1.3 Baza a unui spaţiu vectorial. Dimensiune

prin egalizarea histogramei

I. Scrie cuvântul / cuvintele dintre paranteze care completează corect fiecare dintre afirmaţiile următoare.

5.1. Noţiuni introductive

riptografie şi Securitate

2.1 Sfera. (EGS) ecuaţie care poartă denumirea de ecuaţia generală asferei. (EGS) reprezintă osferă cu centrul în punctul. 2 + p 2

Ecuatii exponentiale. Ecuatia ce contine variabila necunoscuta la exponentul puterii se numeste ecuatie exponentiala. a x = b, (1)

TEMA 9: FUNCȚII DE MAI MULTE VARIABILE. Obiective:

Codificatorul SN74148 este un codificator zecimal-bcd de trei biţi (fig ). Figura Codificatorul integrat SN74148

Subiectul III (30 de puncte) - Varianta 001

Definiţia 1.1 Fiind date mulţimile A (alfabetul sursă) şi B (alfabetul cod), o codificare

Capitolul 14. Asamblari prin pene

4. Măsurarea tensiunilor şi a curenţilor electrici. Voltmetre electronice analogice

Functii Breviar teoretic 8 ianuarie ianuarie 2011

2. Sisteme de forţe concurente...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3

Universitatea din Bucureşti Facultatea de Matematică şi Informatică. Algebră (1)

EDITURA PARALELA 45 MATEMATICĂ DE EXCELENŢĂ. Clasa a X-a Ediţia a II-a, revizuită. pentru concursuri, olimpiade şi centre de excelenţă

Examen AG. Student:... Grupa: ianuarie 2016

3.4. Minimizarea funcţiilor booleene

Cursul Măsuri reale. D.Rusu, Teoria măsurii şi integrala Lebesgue 15

* K. toate K. circuitului. portile. Considerând această sumă pentru toate rezistoarele 2. = sl I K I K. toate rez. Pentru o bobină: U * toate I K K 1

Metode Runge-Kutta. 18 ianuarie Probleme scalare, pas constant. Dorim să aproximăm soluţia problemei Cauchy

Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism. (Y = f(x)).

Εμπορική αλληλογραφία Ηλεκτρονική Αλληλογραφία

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36].

Ecuaţia generală Probleme de tangenţă Sfera prin 4 puncte necoplanare. Elipsoidul Hiperboloizi Paraboloizi Conul Cilindrul. 1 Sfera.

Matrice. Determinanti. Sisteme liniare

Corectură. Motoare cu curent alternativ cu protecție contra exploziei EDR * _0616*

MULTIMEA NUMERELOR REALE

Transcript:

Indrumator de laborator - LUCRAREA NR. 2 Expresii regulate Prima etapă în înţelegerea unui program este descompunerea lui în lexeme. Se numeşte lexemă, un şir de caractere de la intrare care este în curs de analizare. De exemplu, în C avem lexeme de forma for, while, etc., dar nu lexeme de forma %$#@. In plus, într-un program C putem întâlni lexeme de genul variabila_cea_mare. Există deci un număr potenţial infinit de lexeme (dacă presupunem că numele de variabile nu au nici o limită pentru lungime). Totalitatea tuturor lexemelor legale este la rândul ei un limbaj; acesta nu trebuie confundat cu limbajul C: în limbajul C ''cuvintele'' sunt programele corecte, în limbajul lexemelor C, cuvintele legale sunt toate lexemele care pot apărea în vreun program C. Teoreticienii au propus cu mult timp în urmă (în anii '60) un meta-limbaj extrem de concis pentru a descrie lexeme. Limbajul acesta este limbajul expresiilor regulate. O expresie regulată este un şir de caractere care descrie o mulţime de cuvinte posibile (poate chiar o mulţime infinită). Lexemele tuturor limbajele de programare moderne pot fi descrise prin expresii regulate. Pe baza expresiilor regulate se poate construi un automat cu stări finite, care stă la baza funcţionării unui analizor lexical. Un automat cu stări finite este o maşină abstractă care poate analiza şi recunoaşte expresiile regulate, iar implementarea software a unui astfel a automat nu este dificilă. Expresii regulate pentru limbaje de programare Folosind expresiile regulate, se poate defini o gramatică de expresii pentru un limbaj sursă. Semnificaţia expresiilor regulate:. Semnifică orice caracter cu excepţia lui newline, `\n'. * Semnifică zero sau mai multe apariţii ale expresiei regulate precedente. [] Semnifică o clasă de caractere ^ Un circumflex la începutul unei expresii regulate semnifică faptul că expresia respectivă trebuie să apară chiar la începutul unei linii în limbajul sursă. $ Un dolar la începutul unei expresii regulate semnifică faptul că expresia respectivă trebuie să apară chiar la sfârşitul unei linii în limbajul sursă. { Indică un domeniu restrâns de copii ale expresiei regulate precedente. De exemplu, (abc){3,8 semnifică între 3 şi 8 apariţii a cuvântului 'abc'. + Semnifică una sau mai multe apariţii ale expresiei regulate precedente.? Semnifică zero sau o singură apariţie a expresiei regulate precedente. Expresia regulată precedentă, sau expresia regulată următoare " " Tot ce este cuprins între ghilimele se interpretează literal () Grupează o serie de expresii regulate într-o expresie nouă. Precedenţa operatorilor expresiilor regulate Următorul tabel specifică precedenţa operatorilor expresiilor regulate: () Precedenţa 1 (cea mai mare) 1/10

[] 2 *, +,? 3 ab 4 5 ^, $ 6 (cea mai mică) Exemple de expresii regulate: a* este o expresie regulată care reprezintă şirurile ε a aa aaa., adică un limbaj ai cărui atomi conţin zero sau mai multe simboluri 'a', unde 'ε' reprezintă şirul vid. a+ este o expresie regulată care reprezintă şirurile a aa aaa., adică un limbaj ai cărui atomi conţin unul sau mai mulţi 'a'. [abcd] este o expresie regulată care descrie un limbaj ce are numai 4 tipuri de atomi posibili: a, b, c, d. În general, parantezele drepte semnifică "oricare din caracterele dintre paranteze". O expresie regulată între paranteze drepte se numeşte clasă de caractere. abcd+ semnifică 'a' urmat de 'b' urmat de 'c' urmat de unul sau mai mulţi 'd'. Deci elementele limbajului constau din şiruri de forma: abcd, abcdd, abcddd, abcdddd, şi aşa mai departe. (abcd)+. Parantezele rotunde grupează expresiile regulate. Această expresie semnifică abcd repetat odată sau de mai multe ori, adică: abcd, abcdabcd, abcdabcdabcdabcd, şi aşa mai departe. [pq][0123] Expresiile regulate se pot concatena pentru a forma expresii mai complexe. Această expresie semnifică oricare expresie descrisă de prima pereche de paranteze drepte urmată de oricare expresie din a doua pereche de paranteze drepte: p0, p1, p2, p3, q0, q1, q2, q3. ([a-l]*) O liniuţă de unire într-o clasă de caractere semnifică un domeniu de caractere. Astfel, '[a-l]' este o prescurtare pentru '[abcdefghijkl]'. Parantezele rotunde s-au adăugat doar pentru claritate. Întreaga expresie semnifică zero sau mai multe caractere din domeniul 'a-l' : able, babble, abcabcllljk, gif şi aşa mai departe. [a-z][0-9]* Un singur element din prima clasă urmat de zero au mai multe elemente din a doua clasă: x, m31, k9, b00000882 şi aşa mai departe. ([a-z]*)[-+*] Unul sau mai multe elemente din domeniul de la a la z, urmate de un '-', un '+', sau un '*': abcabcd+, z- şi aşa mai departe. Se specifică faptul că '-' într-o clasă de caractere semnifică un domeniu de caractere, cu excepţia cazului în care el urmează imediat după paranteza dreaptă, când semnifică chiar caracterul '-'. Totodată, într-o clasă de caractere, toate celelalte caractere speciale îşi pierd semnificaţia şi se reprezintă pe ele însele. Astfel, '+' şi '*' reprezintă caracterele '+' şi '*'. ([a-z]*) [-+*] Semnifică fie zero sau mai multe elemente din domeniul de la a la z, fie un singur '-', un '+', sau un '*': aa, acd, compilator, +. (alfa)? semnifică zero sau o singură apariţie a cuvântului 'alfa'. rara? cuvântul rar urmat de zero sau o singură apariţie a lui 'a'. Se notează că '?', cu semnificaţia zero sau o singură apariţie a expresiei regulate anterioare are precedenţă faţă de concatenare. 2/10

În cele ce urmează, se vor lua în considerare trei tipuri de exresii regulate de bază. În ordinea crescătoare a precedenţei ele sunt: 1. Reuniune sau alternaţie, cu sensul de SAU, indicat de simbolul (r s corespunde cu orice şir care corespunde cu r sau cu s). De exemplu: a b = {a, b a e = {a, e 2. Concatenaţie, indicat prin juxtapunere: rs corespunde cu orice şir care este o concatenaţie a două şiruri, din care primul corespunde cu r şi al doilea cu s. De exemplu: ab = {ab (a b)c = {ac, bc (a b)(c d) = {ac, ad, bc, bd 3. Repetiţie sau închidere, indicat de *. Pentru orice expresie regulată r, r corespunde cu orice conatenaţie finită de şiruri, care corespund fiecare cu r. De exemplu: a* = {ε, a, aa, aaa, aaaa, ab* = {a, ab, abb, abbb, abbbb, Observaţii: Parantezele se pot folosi pentru a modifica precedenţa. De exemplu: ab* = {a, ab, abb, abbb, abbbb, (ab)* = (ε, ab, abab, ababab, abababab, a b* = {ε, a, b, bb, bb, bbb, bbbb, Expresiile regulate se pot asocia cu nume: De exemplu: cifra = 0 1 2 3 4 5 6 7 8 9 Atomii unui limbaj de programare se pot clasifica în următoarele categorii: cuvinte rezervate sau cuvinte cheie, de exemplu if, while, do simboluri speciale, de exemplu := = < ++ identificatori literali şi constante, de exemplu "Meniu",'a', 67 Expresiile regulate corespunzătoare sunt: Expresii regulate pentru cuvinte cheie: cheie = if while do else Expresii regulate pentru simboluri speciale: simb = := = < ++ Expresii regulate pentru identificatori: litera = [a-za-z], cifra = [0-9], identificator = litera (litera cifra)* 3/10

Expresii regulate pentru numere: nat = [0-9]+, intreg = (+ -)? nat, numar = intreg ("." nat)? (E intreg)? Este cunoscut faptul că analizorul lexical ignoră comentariile. Acesta este motivul pentru care nu se definesc atomi de comentarii. Atomii sunt separaţi de spaţii, paranteze sau operatori. Expresii regulate pentru spaţii: sp = (newline blank tab comentariu)+ Există şi cazuri în care atomii nu sunt separaţi de spaţii. De exemplu, x=y. În acest caz, semnul egal este cel care serveşte ca delimitator. După ce se defineşte gramatica de expresii regulate, este necesar un program care să decidă dacă o secvenţă de expresii corespunde cu o expresie regulată particulară. Pe baza expresiilor regulate se pot construi instrumente software care generează automat programe de analiză lexicală. Aceste se numesc generatoare de analizoare lexicale. Un astfel de exemplu este programul FLEX. 4/10

Generatoare de analizoare lexicale (FLEX - Fast Lexical Analyzer Generator) Un generator de analizoare lexicale primeşte la intrare un fişier care conţine specificarea atomilor pe care trebuie să-i recunoască analizorul generat, sub forma unor expresii regulate. În plus, fişierul specifică şi acţiunile semantice pe care trebuie să le execute analizorul lexical Pe baza acestor specificaţii, generatorul de analizoare lexicale implementează algoritmi de felul celor care au fost descrişi în paragrafele precedente şi produce la ieşire un program într-un limbaj de nivel înalt (de exemplu C), care conţine tabelele şi procedura de analiză lexicală. Prin compilarea link-editarea acestui program, se obţine analizorul lexical executabil generat automat. În etapa de link-editare se pot folosi funcţii din biblioteci de programe. Figura prezintă schematic felul în care se generează automat un analizor lexical. Fişier de specificaţii (lex.l) Generator de analizoare lexicale (FLEX) Program sursă Analizor lexical în limbaj de nivel înalt (lex.yy.c) Compilator limbaj de nivel înalt (compilator C) Analizor lexical executabil (lex.yy.exe) Şir de coduri lexicale Exemple de generatoare de analizoare lexicale: - LEX(lexical analyzer generator) dezvoltat de M. E. Lesk şi E. Schmidt la Laboratoarele AT&T Bell - FLEX(fast lexical analyzer generator) dezvoltat de Vern Parxon la University of California FLEX primeşte la intrare un fişier de specificaţii (descriere) a atomilor pe care îi va recunoaşte analizorul generat, precum şi a acţiunilor semantice care se vor executa. Pe baza acestor specificaţii se generează un program C ce conţine tabelele de analiză şi funcţia de analiză lexicală numită yylex(). Fişierul de specificaţii conţine o suită de perechi de forma: expresie regulată cod c, numite reguli. Pe baza acestor reguli se generează un fişier sursă în limbajul C (lex.yy.c) care defineşte funcţia yylex(). Fişierul sursă astfel obţinut este în continuare compilat şi link-editat pentru a produce un executabil. 5/10

La rularea executabilului (analizorului) rezultat, se analizează fişierul sursă în scopul identificării expresiilor regulate. Pentru fiecare expresie regulată identificată se execută codul C asociat acestei expresii regulate (corespunzător cu regula care a fost definită). Pentru a lansa în execuţie programul FLEX se foloseşte comanda: flex [optiuni] [nume_fisier_specificatii] Fişierul de specificaţii este un fişier text cu orice nume acceptat de sistemul de operare, de obicei cu extensia.l sau.lxi. Opţiunile liniei de comandă se pot exprima şi în fişierul de specificaţii folosind directiva %option. Exemple de opţiuni în linia de comandă: - h: afişare pe scurt opţiuni din linia de comandă - d: funcţionare în regim debug - -i: se generează un analizor care nu face distinţie între majuscule şi minuscule - -t: nu produce lex.yy.c dar generează analizorul lexical la stdout FLEX poate fi folosit şi împreună cu generatorul de analizoare sintactice YACC, aceasta fiind şi una dintre principalele sale calităţi. Astfel generatorul de analizoare sintactice YACC, poate apela rutina yylex() care îi transmite următorul atom de la intrare. Mai multe detalii vor fi întâlnite în lucrarea care tratează generatoarele de analizoare sintactice. Structura fişierului de specificaţii Fişierul de specificaţii FLEX este format din trei secţiuni separate printr-o linie ce conţine doar %% : Secţiunea de definiţii %% Secţiunea de reguli %% Cod utilizator Prima şi ultima secţiune sunt opţionale, în timp ce secţiunea de reguli este obligatorie. Secţiunea de definiţii Conţine declaraţii de nume definiţie simple, utilizate pentru a simplifica scrierea specificaţiilor scanerului, declaraţii de stări de start, directive %option care permit utilizatorului sa precizeze unele opţiuni legate de analizorului generat (alternativă la cele din linia de comandă) şi secvenţe C definite de utilizator. Secţiunea de reguli Conţine reguli adică perechi expresie regulată cod c (acţiuni), pe câte o linie neindentată. Secţiunea de cod Utilizator Conţine codul utilizator care este pur şi simplu copiat în fişierul generat Observaţie. Orice text (cod) indentat sau text (cod) care este inclus între %{ şi % care se află în secţiunile de definiţii şi de reguli este copiat în fişierul generat (după ce în prealabil sunt eliminate caracterele %{ şi % ). 6/10

Modul de funcţionare al analizorului generat Analizorul lexical generat caută corespondenţe între textul de intrare şi reguli. În cazul în care găseşte mai mult decât o corespondenţă, va lua în considerare corespondenţa care conţine cel mai mult text, iar dacă două corespondenţe conţin text de aceeaşi lungime, va lua în considerare pe aceea a cărei regulă este declarată mai devreme în secţiunea de declaraţii. Deoarece definiţia unui identificator ID este acoperitoare definiţiilor pentru cuvintele cheie, regulile pentru cuvintele cheie trebuiesc plasate înaintea regulii pentru ID. În caz contrar, cuvintele cheie vor fi interpretate ca fiind identificatori. Odata găsită o corespondenţă, textul acesteia (atomul) se copiază în pointerul de caractere global yytext, iar lungimea lui în yyleng. Apoi se execută acţiunea corespunzătoare regulii şi procesul se repetă până la epuizarea textului sursă. În cazul în care nu este găsită nici o corespondenţă se execută o regulă implicită. Exemple de variabilele utile: char *yytext - reprezintă adresa zonei de memorie în care se depun caracterele ce compun atomul curent; int yyleng - reprezintă lungimea atomului curent; FILE *yyin - desemnează fişierul care conţine textul sursă de analizat; FILE *yyout - desemnează fişierul în care se poate scrie cu ajutorul macro-ului ECHO; Exemple de macrouri şi funcţii utile: ECHO - realizează scrierea conţinutului zonei yytext în fişierul desemnat prin yyout; BEGIN nume_stare_start - realizează comutarea analizorului în starea de start specificată; REJECT - caută următoarea regulă a cărei şablon se potriveşte cu atomul în curs de prelucrare, sau cu un prefix al acestuia, şi execută acţiunea asociată regulii găsite; YY_START furnizează starea de start curentă (o valoarea întreagă); yyterminate() - are ca efect terminarea procesului de analiză şi returnarea valorii 0 câtre apelantul funcţiei yylex(); yyterminate este un macro şi poate fi redefinită de utilizator; void yymore() - determină concatenarea următorului atom din textul sursă, la atomul existent în yytext (în mod normal următorul atom îl înlocuieşte pe cel precedent); void yyless(int n) - lasă în yytext primele n caractere ale atomului curent, restituind în şirul de intrare caracterele de pe poziţiile n+1 până la sfârşit; actualizează apoi valoarea lui yyleng la n (caracterele restituite vor fi analizate ulterior). void unput(char c) - forţează plasarea în şirul de intrare a caracterului c, acesta devenind următorul caracter analizat. int input() - citeşte şi returnează următorul caracter din şirul de intrare; Stări de start Flex pune la dispoziţie un mecanism de activare condiţionată a unor reguli. Orice regulă a cărei expresie regulată este prefixata prin <ss> (stare de start) va fi activă numai atunci când scanerul se află în acea stare definită prin ss. 7/10

Stările de start pot fi de 2 feluri: - inclusive - când regulile acceptate sunt cele etichetate cu numele condiţiei, precum şi regulile neetichetate; ea fiind declarată prin %s - exclusive - când regulile acceptate sunt doar cele etichetate cu numele condiţiei, sau <*> Observaţii: - Starea iniţială este identificată prin INITIAL - O regulă poate răspunde la mai multe stări de start prin:<ss1,ss2> - O stare de start poate fi aplicată la mai multe reguli prin încapsulare <ss> { R1 R2 4. Informaţii suplimentare privind FLEX se găsesc la adresa: http://www.gnu.org/software/flex/. La aceeaşi adresă se poate descărca de pe Internet programul FLEX, care este free sub licenţa GNU. Exemple de utilizare simple: Exemplul. 1: Se implementează un analizor lexical care numără liniile şi caracterele de la intrare. %{ /* necesar pentru getch() */ #include <conio.h> % %option noyywrap /* necesar pentru a preciza ca se foloseste un singur fisier sursa */ int num_lines = 0, num_chars = 0; %% (delimiteaza fisierul)(sectiunea descriere de reguli) \n { ++num_lines; ++num_chars;. ++num_chars; %% (se incheie regulili) main() { yylex(); printf( "Numar linii = %d, Numar caractere = %d\n", num_lines, num_chars ); getch(); Acest analizor (scaner) numără liniile şi caracterele dintr-un fişier sursă. - Se include conio.h pentru getch() - Opţiunea noyywrap precizează că se foloseşte un singur fişier sursă. - Se declară variabilele globale num_lines şi num_chars, care vor fi accesibile atât în rutina yylex() cât şi în funcţia main(). Sunt definite două reguli: - Prima regulă corespunde liniilor noi (\n) şi incrementează contorul de linii şi contorul de caractere 8/10

- A doua regulă corespunde oricărui caracter diferit de linie noua (.) şi incrementează contorul de caractere. Etapele necesare pentru analiză sunt: 1. Exemplul de mai sus se scrie într-un fişer, de exemplu cu numele numar.l 2. Se apelează programul FLEX din linia de comandă astfel: flex numar.l Prin acest apel, programul FLEX generează în directorul curent fişierul lexyy.c 3. Se compilează programul lexyy.c şi se obţine lexyy.exe 4. Se execută programul lexyy.exe Dacă în fereastra utilizator se tastează de exemplu: O linie Alta linie ^Z Programul va afişa: Numar linii = 2, Numar caractere = 19 Exemplul. 2: Analizor lexical pentru un limbaj pascal simplificat: /* analizor lexical pentru un limbaj Pascal simplificat */ %{ /* necesar pentru apelul atof() */ #include <math.h> % %option noyywrap DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT+ { printf( "Un numar intreg: %s (%d)\n", yytext, atoi( yytext ) ); {DIGIT+"."{DIGIT* { printf( "Un numar real: %s (%g)\n", yytext, atof( yytext ) ); if then begin end procedure function { printf( "Un cuvant cheie: %s\n", yytext ); {ID printf( "Un identificator: %s\n", yytext ); "+" "-" "*" "/" printf( "Un operator: %s\n", yytext ); "{"[^\n]*"" /* elimina comentariile */ 9/10

[ \t\n]+ /* elimina spatiile */. printf( "Caracter necunoscut: %s\n", yytext ); %% main( argc, argv ) int argc; char **argv; { ++argv, --argc; /* ignora numele programului */ if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex(); Etapele necesare pentru analiză sunt: 1. Exemplul de mai sus se scrie într-un fişer, de exemplu cu numele analiz.l 2. Se apelează programul FLEX din linia de comandă astfel: flex analiz.l Prin acest apel, programul FLEX generează în directorul curent fişierul lexyy.c 3. Se compilează programul lexyy.c şi se obţine lexyy.exe 4. Se execută programul lexyy.exe Pasul 4 se poate executa în două variante: - Fără argumente în linia de comandă. În acest caz, atomii se tastează în fereastra utilizator. - Folosind ca argument de exemplu fişierul ex1.txt. Tema de laborator: 1. Scrieţi un program FLEX care să recunoască următoarele şiruri de caractere peste alfabetul V = {0, 1: - Toate cuvintele care se termină în 01 - Toate cuvintele care conţin exact un 1 - Toate cuvintele care conţin un număr par de 0 şi nici un 1 - Toate cuvintele care conţin un număr par de 0 - Toate cuvintele care conţin subşirul 10 - Toate cuvintele care nu conţin subşirul 01 2. Generaţi folosind programul FLEX un analizor lexical care să recunoască toţi atomii din tema precedentă. 10/10