analiza lexicala - andrei.clubcisco.roandrei.clubcisco.ro/cursuri/f/f-sym/3lfa/lex.pdf · o cifra...

29
Analiza Lexicala Analiza Lexicala

Upload: phungtu

Post on 11-Nov-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Analiza LexicalaAnaliza Lexicala

IntroducereIntroducere

LEX – program pentru constructia LEX – program pentru constructia automata a analizoarelor lexicaleautomata a analizoarelor lexicale

Analiza Lexicala = detectarea de atomi Analiza Lexicala = detectarea de atomi lexicali (tokeni) lexicali (tokeni)

Analizor LexicalAnalizor Lexical folosit ca atare (pentru dezvoltarea de aplicatii folosit ca atare (pentru dezvoltarea de aplicatii

care necesita doar detectare de atomi lexicali)care necesita doar detectare de atomi lexicali) folosit pentru detectarea atomilor lexicali ce folosit pentru detectarea atomilor lexicali ce

vor reprezenta intrarea unui Analizor Sintacticvor reprezenta intrarea unui Analizor Sintactic

Introducere (2)Introducere (2)

Analizorlexical Parser

tabelaDe

simboli

getToken()

TOKEN(name,val)

Introducere (3)Introducere (3)

scrierea unei specificatii LEX este scrierea unei specificatii LEX este echivalenta cu scrierea unui set de echivalenta cu scrierea unui set de modele pe care analizorul generat va modele pe care analizorul generat va incerca sa le gaseasca pe sirul de incerca sa le gaseasca pe sirul de intrareintrare

OBSERVATIE: un analizor lexical OBSERVATIE: un analizor lexical scris cu ajutorul LEX este aproape scris cu ajutorul LEX este aproape sigur mai rapid decat un analizor sigur mai rapid decat un analizor lexical scris “de mana”lexical scris “de mana”

scanner.l

lex.yy.c

lex.yy.o

scanner

libfl.a

flex

CC

LD

Specificatie LEX

Cod C generat

BinarOptimizat

CodExecutabil

Expresii RegulateExpresii Regulate

Expresie Regulata – descriere de Expresie Regulata – descriere de model folosind un metalimbajmodel folosind un metalimbaj

.. orice caracter in afara de \norice caracter in afara de \n

** zero sau mai multe copii ale expresiei precedentezero sau mai multe copii ale expresiei precedente

++ una sau mai multe copii ale expresiei precedenteuna sau mai multe copii ale expresiei precedente

[][] un caracter din multimea de caractere definita intre []un caracter din multimea de caractere definita intre []

[0-9][0-9] un caracter din multimea de toate caracterele dintre limiteun caracter din multimea de toate caracterele dintre limite

[^…] un caracter care nu este in multimea de caractere definita [^…] un caracter care nu este in multimea de caractere definita intre []intre []

Expresii Regulate (2)Expresii Regulate (2)

?? zero sau mai multe aparitii ale expresiei precedentezero sau mai multe aparitii ale expresiei precedente

|| specificarea unei alternativespecificarea unei alternative

^̂ inceput de linie (ca prim caracter intr-o ER)inceput de linie (ca prim caracter intr-o ER)

$$ sfarsit de linie (ca ultim caracter intr-o ER)sfarsit de linie (ca ultim caracter intr-o ER)

{N}{N} indica de cate ori poate sa apara expresia precedenta (numar fix)indica de cate ori poate sa apara expresia precedenta (numar fix)

{N, M}{N, M} indica de cate ori poate sa apara expresia precedenta (intre N indica de cate ori poate sa apara expresia precedenta (intre N si M ori)si M ori)

// detecteaza un sir care se detecteaza un sir care se potrivestepotriveste cu expresia care precede /, dar cu expresia care precede /, dar numai cand este succedata de expresia care urmeaza dupa / (fara a numai cand este succedata de expresia care urmeaza dupa / (fara a avansa consumarea intrarii)avansa consumarea intrarii)

() () grupeaza o serie de expresii intr-o noua expresiegrupeaza o serie de expresii intr-o noua expresie

Exemple Expresii RegulateExemple Expresii Regulate

[0-9][0-9] [0-9]+[0-9]+ [0-9]*[0-9]* -?[0-9]+-?[0-9]+ -?(([0-9]+)|([0-9]*\.[0-9]+)) -?(([0-9]+)|([0-9]*\.[0-9]+)) ^[ \t]*\n^[ \t]*\n ^[ \t]*”/*”.*”*/”[ \t]*\n^[ \t]*”/*”.*”*/”[ \t]*\n

o cifra un numar natural cu cel putin o

cifra un numar sau sirul vid un numar intreg (poatea avea

semn) un numar zecimal cu semn descrierea unei linii goale (doar

spatii si taburi) descrierea unei linii care incepe

si se termina cu un comentariu

Structura unei Structura unei Specificatii Specificatii LEXLEX

3 sectiuni3 sectiuni1.1. sectiune de definitiisectiune de definitii

2.2. sectiune de regulisectiune de reguli

3.3. sectiune de rutinesectiune de rutine

%{#include <math.h>%}DIGIT [0-9]ID [a-z][a-z0-9]*%%{DIGIT}+ printf( "An integer”);%%int main(void){ yyin = fopen( "f.in", "r"); yylex();}

1

2

3

Sectiunea de DefinitiiSectiunea de Definitii

poate contine orice secventa de cod C poate contine orice secventa de cod C ce se doreste copiata ca atare in ce se doreste copiata ca atare in programul final (aceaste secvente sunt programul final (aceaste secvente sunt delimitate de “%{“ si “%}”)delimitate de “%{“ si “%}”)

aceasa sectiune mai poate contine de aceasa sectiune mai poate contine de asemenea definitii (ce vor fi folosite asemenea definitii (ce vor fi folosite apoi in sectiunea de reguli) sau apoi in sectiunea de reguli) sau declaratii de starideclaratii de stari

Exemplu sectiune de Exemplu sectiune de definitiidefinitii

%{%{unsigned charCount = 0;unsigned charCount = 0;unsigned wordCount = 0;unsigned wordCount = 0;unsigned lineCount = 0;unsigned lineCount = 0;

%}%}

word [^ \t\n]+word [^ \t\n]+eol \neol \n

%x COMMENT%x COMMENT

Sectiune de ReguliSectiune de Reguli

fiecare regula formata din MODEL si fiecare regula formata din MODEL si ACTIUNE (separate prin spatii)ACTIUNE (separate prin spatii)

Programul generat de LEX va executa Programul generat de LEX va executa ACTIUNEA de fiecare data cand va detecta ACTIUNEA de fiecare data cand va detecta MODELUL asociatMODELUL asociat

MODELELE sunt specificate prin expresii MODELELE sunt specificate prin expresii regulateregulate

sectiunea de reguli este delimitata de sectiunea de reguli este delimitata de caracterele “%%” caracterele “%%”

Exemplu sectiunea de Exemplu sectiunea de regulireguli

%%%%[ \t]+ ; /* se ignora spatiile goale */[ \t]+ ; /* se ignora spatiile goale */

[a-zA-Z]+ {printf(“Acesta este un cuvant %s\n”, yytext);}[a-zA-Z]+ {printf(“Acesta este un cuvant %s\n”, yytext);}

-?(([0-9]+)|([0-9]*\.[0-9]+)) {printf(“Acesta este un numar %s\n”, -?(([0-9]+)|([0-9]*\.[0-9]+)) {printf(“Acesta este un numar %s\n”, yytext);}yytext);}

.|\n ECHO; /* este oricum actiunea implicita */.|\n ECHO; /* este oricum actiunea implicita */

%%%%

Sectiunea de RutineSectiunea de Rutine

contine orice secventa de cod Ccontine orice secventa de cod C trebuie sa contina apelul catre trebuie sa contina apelul catre

analizorul lexical analizorul lexical yylex()yylex() poate folosi sau redefini poate folosi sau redefini

variabile/functii/macrouri ce sunt variabile/functii/macrouri ce sunt generate de LEX in fisierul finalgenerate de LEX in fisierul final

Exemplu sectiune de rutineExemplu sectiune de rutine

int main( int argc, char * argv[] ) int main( int argc, char * argv[] ) { {

if( argc > 1 ) if( argc > 1 ) { {

FILE * file; FILE * file; file = fopen( argv[1], "r" ); file = fopen( argv[1], "r" ); if( !file ) if( !file ) { {

fprintf( stderr, "Could not open %s\n",argv[1]); fprintf( stderr, "Could not open %s\n",argv[1]); exit(1); exit(1);

} } yyin = file; yyin = file;

} } yylex(); yylex(); return 0; return 0;

}}

ReguliReguli

intr-un text ce contine o specificatie LEX intr-un text ce contine o specificatie LEX fiecare linie va trebui sa inceapa din coloana fiecare linie va trebui sa inceapa din coloana intiiintii

LEX executa actiunea asociata celui mai LEX executa actiunea asociata celui mai lung model posibil lung model posibil

Atunci cand se poate alege intre doua Atunci cand se poate alege intre doua modele la fel de lungi, se alege intotdeauna modele la fel de lungi, se alege intotdeauna cel care a fost specificat primul in sectiunea cel care a fost specificat primul in sectiunea de definitiide definitii

Stari LEXStari LEX

se pot crea stari (start conditions)se pot crea stari (start conditions) rolul lor este de a descrie informatiile rolul lor este de a descrie informatiile

dependente de context intr-o specificatie dependente de context intr-o specificatie LEXLEX

precedarea unei reguli de o stare anunta precedarea unei reguli de o stare anunta analizorul ca regula se aplica doar cand analizorul ca regula se aplica doar cand analizorul este in starea respectivaanalizorul este in starea respectiva

Pot fi inclusive sau exclusivePot fi inclusive sau exclusive restul regulilor sunt valabile in toate celelalte restul regulilor sunt valabile in toate celelalte

stari (mai putin in starile exclusive)stari (mai putin in starile exclusive)

Exemplu StariExemplu Stari

%s MAGIC %s MAGIC

%% %%

<MAGIC>.+ { BEGIN INITIAL; <MAGIC>.+ { BEGIN INITIAL; printf("Magic:");ECHO; } printf("Magic:");ECHO; }

magic BEGIN MAGIC; magic BEGIN MAGIC;

%%%% void main(){ yylex(); }void main(){ yylex(); }

Tot despre stariTot despre stari

<*> identifica orice stare<*> identifica orice stare YY_START : intoarce un intreg YY_START : intoarce un intreg

(valoarea interna a starii curente)(valoarea interna a starii curente) Sunt disponibile rutine pentru accesul Sunt disponibile rutine pentru accesul

la stiva de stari (yy_push_state, etc.)la stiva de stari (yy_push_state, etc.)

Variabile accesibile Variabile accesibile utilizatoruluiutilizatorului

char *yytext : textul pentru tokenul char *yytext : textul pentru tokenul curentcurent

int yyleng : lungimea tokenului curentint yyleng : lungimea tokenului curent FILE *yyin : fisierul de intrareFILE *yyin : fisierul de intrare FILE *yyout : fisierul in care scrie FILE *yyout : fisierul in care scrie

ECHOECHO

Alte macro-uri si rutine Alte macro-uri si rutine accesibile utilizatoruluiaccesibile utilizatorului

ECHOECHO REJECTREJECT yymore() yymore() yyless(n)yyless(n) yywrap() yywrap()

Lucrul cu mai multe buffere Lucrul cu mai multe buffere de intrarede intrare

yy_create_bufferyy_create_buffer yy_switch_to_bufferyy_switch_to_buffer yy_delete_buffer yy_delete_buffer yy_scan_stringyy_scan_string

Exemple Complete/Exemple Complete/Mai multe informatiiMai multe informatii

DocumentatiaDocumentatia online online http://cs.pub.ro/~pt/http://cs.pub.ro/~pt/ A. Aho, R. Sethi, J.D.Ullman – A. Aho, R. Sethi, J.D.Ullman –

Compilers, Techniques and Tools Compilers, Techniques and Tools (cartea cu dragon)(cartea cu dragon)

Expresii regulate in JavaExpresii regulate in Java

java.util.regexjava.util.regex

PatternPattern MatcherMatcher PatternSyntaxExceptionPatternSyntaxException

ExempluExemplu

import java.util.regex.*;import java.util.regex.*;

public class RegEx {public class RegEx { public static void main(String args[]) {public static void main(String args[]) { String myRegex = "abc*";String myRegex = "abc*"; Pattern pattern = Pattern.compile(myRegex);Pattern pattern = Pattern.compile(myRegex); Matcher matcher = pattern.matcher("abccabcabccc");Matcher matcher = pattern.matcher("abccabcabccc");

while (matcher.find()) {while (matcher.find()) { System.out.println("Found it : " + matcher.group());System.out.println("Found it : " + matcher.group()); }} }}}}

CuantificatoriCuantificatori

GreedyGreedy ReluctantReluctant PosessivePosessive

Cuantificatori (2)Cuantificatori (2)

xfooxxxxxxfooxfooxxxxxxfoo Greedy: *.foo => xfooxxxxxxfooGreedy: *.foo => xfooxxxxxxfoo Reluctant: *?.foo => xfooReluctant: *?.foo => xfoo Posessive: *+.foo => Posessive: *+.foo =>

DocumentatieDocumentatie

http://java.sun.com/docs/books/tutorial/essential/regex/intro.htmlhttp://java.sun.com/docs/books/tutorial/essential/regex/intro.html

ExercitiiExercitii

Pentru un fisier text, afisati toate liniile Pentru un fisier text, afisati toate liniile de text precedate de numarul linieide text precedate de numarul liniei

Scrieti un scurt program similar ca Scrieti un scurt program similar ca functionalitate cu utilitarul Linux ‘wc’functionalitate cu utilitarul Linux ‘wc’

Dezvoltati exemplul anterior: daca Dezvoltati exemplul anterior: daca fisierul-sursa contine comentarii (stil C fisierul-sursa contine comentarii (stil C sau C++ -- /* …*/ sau // …), continutul sau C++ -- /* …*/ sau // …), continutul comentariilor se va ignora in calculul comentariilor se va ignora in calculul statisticilor.statisticilor.