Sunteți pe pagina 1din 3

Expresii regulate i generatoarele de analizoare lexicale

LFAC (Limbaje formale, automate i compilatoare An2Sem1)

Prima etap n nelegerea unui program este descompunerea lui n lexeme. Se numete 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 ntlni lexeme de genul variabila_cea_mare. Exist deci un numr potenial infinit de lexeme (dac presupunem c numele de variabile nu au nicio limit pentru lungime). Totalitatea tuturor lexemelor legale este la rndul 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 aprea 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 mulime de cuvinte posibile (poate chiar o mulime infinit). Lexemele tuturor limbajele de programare moderne pot fi descrise prin expresii regulate. Pe baza expresiilor regulate se poate construi un automat cu stri finite, care st la baza funcionrii unui analizor lexical. Un automat cu stri finite este o main abstract care poate analiza i recunoate 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. Semnificaia expresiilor regulate:
. Semnific orice caracter cu excepia lui newline: \n. * Semnific zero sau mai multe apariii 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 sfritul unei linii n limbajul surs. {} Indic un domeniu restrns de copii ale expresiei regulate precedente. De exemplu, (abc){3,8} semnific ntre 3 i 8 apariii ale cuvntului 'abc'. + Semnific una sau mai multe apariii ale expresiei regulate precedente. ? Semnific zero sau o singur apariie a expresiei regulate precedente. | Expresia regulat precedent, sau expresia regulat urmtoare. "" Tot ce este cuprins ntre ghilimele se interpreteaz literal. () Grupeaz o serie de expresii regulate ntr-o expresie nou.

Exemple de expresii regulate


a* este o expresie regulat care reprezint irurile | a | aa | aaa | , adic un limbaj ai

crui atomi conin 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

crui atomi conin unul sau mai muli '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 numete clas de caractere. abcd+ semnific 'a' urmat de 'b' urmat de 'c' urmat de unul sau mai muli 'd'. Deci elementele limbajului constau din iruri de forma: abcd, abcdd, abcddd, abcdddd, i aa mai departe. (abcd)+ Parantezele rotunde grupeaz expresiile regulate. Aceast expresie semnific abcd repetat o dat sau de mai multe ori, adic: abcd, abcdabcd, abcdabcdabcdabcd, i aa mai departe.

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 adugat doar pentru claritate. ntreaga expresie semnific zero sau mai multe caractere din domeniul 'a-l' : able, babble, abcabcllljk, gif i aa mai departe. [a-z][0-9]* Un singur element din prima clas urmat de zero sau mai multe elemente din a

[pq][0123] Expresiile regulate se pot concatena pentru a forma expresii mai complexe.

doua clas: x, m31, k9, b00000882 i aa 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 aa mai departe. Se specific faptul c '-' ntr-o clas de caractere semnific un domeniu de caractere, cu excepia cazului n care el urmeaz imediat dup paranteza dreapt, cnd semnific chiar caracterul '-'. Totodat, ntr-o clas de caractere, toate celelalte caractere speciale i pierd semnificaia 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 apariie a cuvntului 'alfa'. rara? cuvntul rar urmat de zero sau o singur apariie a lui 'a'. Se noteaz c '?', cu semnificaia zero sau o singur apariie a expresiei regulate anterioare are preceden fa de concatenare.

n cele ce urmeaz, se vor lua n considerare trei tipuri de exresii regulate de baz. n ordinea cresctoare a precedenei, ele sunt: 1. Reuniune sau alternaie, 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. Concatenaie, indicat prin juxtapunere: rs corespunde cu orice ir care este o concatenaie 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. Repetiie sau nchidere, indicat de * . Pentru orice expresie regulat r, r corespunde cu orice conatenaie finit de iruri, care corespund fiecare cu r. De exemplu: a* = {, a, aa, aaa, aaaa, } ab* = {a, ab, abb, abbb, abbbb, }

Observaii:

Parantezele se pot folosi pentru a modifica precedena. 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 urmtoarele 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 corespunztoare 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)* 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 separai de spaii, paranteze sau operatori.

Expresii regulate pentru spaii: sp = (newline|blank|tab|comentariu)+

Exist i cazuri n care atomii nu sunt separai de spaii. De exemplu, x=y. n acest caz, semnul egal este cel care servete ca delimitator. Dup ce se definete 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.
Nota: Materialul de mai sus este gsit i editat de mine (surs mi-e necunoscut); el nu aparine Facultii de Informatic din Iai.

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