generación de analizador léxico -...

32
Generación de analizador léxico Lex (flex, . . . ) Generaci´ on de analizador l´ exico – p.1

Upload: leanh

Post on 15-May-2018

224 views

Category:

Documents


2 download

TRANSCRIPT

Generacióndeanalizador léxicoLex (flex, . . . )

Generacion deanalizadorlexico– p.1

Expresionesregulares“tipo grep”

Expresionessimples(un sólocarácter):

� carácter �

“ �” carácter �

. cualquiercarácter(exceptoseparadordelínea)[ � ��� - �] cualquiercarácterdel conjunto[ˆ � �� - �] cualquiercarácterfueradel conjunto

Generacion deanalizadorlexico– p.2

Expresionesregulares“tipo grep”

Operadoresparaexpresionescompuestas:? ó �

* ceroo másocurrenciasde+ unao másocurrenciasde

� � � concatenadacon �

� | � � ó �

( ) (necesarioparaagrupar)Nota: ?*+ tienenprecedenciasobrela concatenación,y éstasobre|

Generacion deanalizadorlexico– p.3

GramáticasEBNF “tipo lex”

Partesderechassonexpresionesregulares“tipogrep ”

Sin recursividad(ni indirectani directa)

Portanto,generasólolenguajesregulares

Podemosdesarrollarlaspartesderechas(detokens):Sustituimosno-terminalespor suspartesderechasSi esnecesario,insertamosparéntesisparalosoperadores*+?

Generacion deanalizadorlexico– p.4

Ejemplo

letra � [a-zA-Z]

digito � [0-9]

subr � _

letdig � letra | digito

TOKEN_IDENT � letra letdig* (subr letdig+)*

Desarrollamosla partederecha:

TOKEN_IDENT � [a-zA-Z] ([a-zA-Z] | [0-9])*

(_ ([a-zA-Z] | [0-9])+)*

Generacion deanalizadorlexico– p.5

Items

Unavezdesarrolladaspartesderechasdelos tokens:

Usaremositemsconla forma �El puntoindicahastadóndesehaleído(delaentrada)

Al leer � (ó “ �” ó

�� �

) pasamosde � � a

Podemosver los itemscomoestadosdeunautómatafinito no-deterministacontransiciones � (AFN �)

Generacion deanalizadorlexico– p.6

Transiciones � (“cierr e”)

(

) � ( �

)

? � �

?

* � �

*

��� | � � � | ��� � � � � | ��� | � � � ��� ���� � � �

(

� ) � (

)

� ? � �

?

� * � �* , �

*

� + � �+ , �

+

� � � | ��� | � � � � ��� | � � � | ���

Al final, los itemscon delantede ()?*+| puedeneli-

minarseGeneracion deanalizadorlexico– p.7

Ejemplo de transiciones �

Partimosde:

T �a (a|0)*( (a|0)+)*

Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*

Tras cierrey eliminación, se obtieneel mismo conjunto

Generacion deanalizadorlexico– p.8

Ejemplo de transiciones �

Obtenemos:

T �a (a|0)*( (a|0)+)*T �a( a|0)*( (a|0)+)*

T �a(a|0)* ( (a|0)+)*

Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*

Tras cierrey eliminación, se obtieneel mismo conjunto

Generacion deanalizadorlexico– p.8

Ejemplo de transiciones �

Obtenemos:

T �a (a|0)*( (a|0)+)*T �a( a|0)*( (a|0)+)*T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*

Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*

Tras cierrey eliminación, se obtieneel mismo conjunto

Generacion deanalizadorlexico– p.8

Ejemplo de transiciones �

Cierrecompletado:

T �a (a|0)*( (a|0)+)*T �a( a|0)*( (a|0)+)*

T �a(a|0)*( (a|0)+)*T �a(a|0)*( (a|0)+)* T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*

Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*

Tras cierrey eliminación, se obtieneel mismo conjunto

Generacion deanalizadorlexico– p.8

Ejemplo de transiciones �

Eliminamositemsinútiles:

T �a( a|0)*( (a|0)+)*

T �a(a|0)*( (a|0)+)*T �a(a|0)*( (a|0)+)* T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*

T �a (a|0)*( (a|0)+)*

Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*

Tras cierrey eliminación, se obtieneel mismo conjunto

Generacion deanalizadorlexico– p.8

Ejemplo de transiciones �

Eliminamositemsinútiles:

T �a( a|0)*( (a|0)+)*

T �a(a|0)*( (a|0)+)*T �a(a|0)*( (a|0)+)* T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*

T �a (a|0)*( (a|0)+)*

Una transicióncon a nos daría T �a(a |0)*(_(a|0)+)*

Tras cierrey eliminación, se obtieneel mismo conjunto

Generacion deanalizadorlexico– p.8

Ejemplo de transiciones �

Eliminamositemsinútiles:

T �a( a|0)*( (a|0)+)*

T �a(a|0)*( (a|0)+)*T �a(a|0)*( (a|0)+)* T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*

T �a (a|0)*( (a|0)+)*

Una transicióncon a nos daría T �a(a |0)*(_(a|0)+)*

Tras cierrey eliminación, se obtieneel mismo conjunto

Generacion deanalizadorlexico– p.8

ConstruccióndeAFD

Estadoinicial = cierredeitemsconel puntoalprincipio

Conjuntosdeitemssimultáneamenteválidosparalosdistintostokens

Asociamosacadaconjuntounestadodelautómatafinito determinista(AFD)

Lastransicionesdelautómatacorrespondena lasdelos items

Losestadosfinalesvienenindicadosporel puntoalfinal del ítem

Sereconoceel tokencorrespondienteadichoítem

Generacion deanalizadorlexico– p.9

Ejemplo deAFD

otroF

otroI

F �(D)* "."(D)+F �( D)*"."(D)+I �(D)+

F �(D)*"."( D)+ F �(D)*"."( D)+F �(D)*"."(D)+

D

"." "."

D

D

D

!#"!�!%$

!%&

F �( D)*"."(D)+I �( D)+

F �(D)* "."(D)+

I �( D)+

Generacion deanalizadorlexico– p.10

Tabla del AFD

0 1 2

' $ '� ' &

'� '� I

' &

' & ' "' " ' " F F

Códigosímbolo:

0=D

1=otro

2=“.”

Linearizaciónpordesplazamientodefilas, p.e.:

Correspondenciaestado-índice:

Generacion deanalizadorlexico– p.11

Tabla del AFD

0 1 2

' $ '� ' &

'� '� I

' &

' & ' "' " ' " F F

Códigosímbolo:

0=D

1=otro

2=“.”

Linearizaciónpordesplazamientodefilas, p.e.:

estado+símbolo 0 1 2 3 4 5 6 7 8

verificación

transic/decisión

Correspondenciaestado-índice:

' $ '� ' & ' "

Generacion deanalizadorlexico– p.11

Tabla del AFD

0 1 2

' $ '� ' &

'� '� I

' &

' & ' "' " ' " F F

Códigosímbolo:

0=D

1=otro

2=“.”

Linearizaciónpordesplazamientodefilas, p.e.:

estado+símbolo 0 1 2 3 4 5 6 7 8

verificación

' $ ' $

transic/decisión

'� ' &

Correspondenciaestado-índice:

' $ '� ' & ' "

0Generacion deanalizadorlexico– p.11

Tabla del AFD

0 1 2

' $ '� ' &

'� '� I

' &

' & ' "' " ' " F F

Códigosímbolo:

0=D

1=otro

2=“.”

Linearizaciónpordesplazamientodefilas, p.e.:

estado+símbolo 0 1 2 3 4 5 6 7 8

verificación

' $ ' $ '� '� '�

transic/decisión

'� ' & '� I

' &

Correspondenciaestado-índice:

' $ '� ' & ' "

0 3Generacion deanalizadorlexico– p.11

Tabla del AFD

0 1 2

' $ '� ' &

'� '� I

' &

' & ' "' " ' " F F

Códigosímbolo:

0=D

1=otro

2=“.”

Linearizaciónpordesplazamientodefilas, p.e.:

estado+símbolo 0 1 2 3 4 5 6 7 8

verificación

' $ ' & ' $ '� '� '�

transic/decisión

'� ' " ' & '� I

' &

Correspondenciaestado-índice:

' $ '� ' & ' "

0 3 1Generacion deanalizadorlexico– p.11

Tabla del AFD

0 1 2

' $ '� ' &

'� '� I

' &

' & ' "' " ' " F F

Códigosímbolo:

0=D

1=otro

2=“.”

Linearizaciónpordesplazamientodefilas, p.e.:

estado+símbolo 0 1 2 3 4 5 6 7 8

verificación

' $ ' & ' $ '� '� '� ' " ' " ' "

transic/decisión

'� ' " ' & '� I

' & ' " F F

Correspondenciaestado-índice:

' $ '� ' & ' "

0 3 1 6Generacion deanalizadorlexico– p.11

Tabla del AFD

0 1 2

' $ '� ' &

'� '� I

' &

' & ' "' " ' " F F

Códigosímbolo:

0=D

1=otro

2=“.”

Linearizaciónpordesplazamientodefilas, p.e.:

estado+símbolo 0 1 2 3 4 5 6 7 8

verificación 0 1 0 3 3 3 6 6 6

transic/decisión 3 6 1 3 I 1 6 F F

Correspondenciaestado-índice:

' $ '� ' & ' "

0 3 1 6Generacion deanalizadorlexico– p.11

Formato deun fichero flex

DeclaracionesenC entre%{ y %}

Declaracionesespecialescomenzadaspor %

Reglasde“no-terminales”auxiliares%%

Secuenciade

Expresionesregulares(patrones) desímbolosareconocer

Entrellaves,accionesenC asociadas,normalmenteterminadasen return código-del-símbolo

%%

Rutinasauxiliaresy/o main si programaindependiente

Generacion deanalizadorlexico– p.12

Generación

lex.yy.cmilex.l milexflex gcc

1. Editamosunficherodeespecificaciónmilex.l

2. Procesamoscon flex milex.l

3. Normalmentelo compilaremosjuntoconunanalizadorsintácticoproducidopor bison

4. Si introducimosmain() quellamea yylex() ,podremostenerunanalizadorléxico independiente:gcc -o milex lex.yy.c -lfl

(usaráficherose/sestándar)

Generacion deanalizadorlexico– p.13

Contenidodelex.yy.c

1. Declaracionesinicialescopiadas

2. Funciónyylex() conbucledereconocimientodepatrones:

Cadavezquereconoceuno,almacenael texto enyytext y ejecutael códigoasociadoSi másdeuno,dapreferenciaal texto demayorlongitudSi igual longitud,dapreferenciaal patrónindicadoenprimerlugar

3. Rutinasauxiliarescopiadas

El patrónespecial �(� ) � & reconoce �(� sólosi vaseguidode

� & (el texto de � & sevolveráa leer) Generacion deanalizadorlexico– p.14

Algunasaccionesespeciales

BEGIN estado: pasanaconsiderarselasexpresionesregularescomenzadaspor <estado>

ECHO: visualizayytext

yymore() : el texto actualseañadiráal delpróximotoken

yyless(n) : seconservanlosprimerosn caracteresenyytext y el restosevolveránaprocesar

Si nohayacción,ignorael texto y reanudala lecturaparaunnuevo patrón

Si noseencuentrapatrónalguno(error),sedejaatrás(y visualiza)el primercaráctery vuelve aintentarlo

Generacion deanalizadorlexico– p.15

Tratamiento deerroresenflex

Nadaespecialmenteprevisto,peropodemos(ydebemos):

Detectarcaracteresnopermitidosusando“ . ”

Detectarpatronesnopermitidos,ensucaso

Parapatroneserróneosfrecuentes,reparareltexto/símbolo,p.e.:comillaso comentariosincerrar

Visualizarlos correspondientesmensajesexplicativos

Generacion deanalizadorlexico– p.16

Ejemplo flex (1/3)

%{

#define ENTERO257

#define IDENTIF 258

int numlin = 1;

void error(char*);

%}

letra [a-zA-Z]

digito [0-9]

letdig {letra}|{digito}

Generacion deanalizadorlexico– p.17

Ejemplo flex (2/3)

%%

("+"|-)?{digito}+ {return ENTERO;}

{letra}{letdig}* {return IDENTIF;}

[-+*/] {return yytext[0];}

\n {numlin++; /* contin ua leyendo */}

[ \t] |

ˆ#.* {/* ignora */}

. {error("caracter raro");}

<<EOF>> {return 0; /* por defecto */}

Generacion deanalizadorlexico– p.18

Ejemplo flex (3/3)

%%

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

int s;

if(argc>1) yyin=fopen(argv[1],"r" ); /* else yyin=stdin */

do printf("%i ",s=yylex()); while(s != 0);

return 0;

}

void error(char* mens) {

printf("Error lexico en linea %i: %s\n",numlin,mens);

}

Generacion deanalizadorlexico– p.19

Conclusión

Un generadorautomáticonospermiteconcentrarnosenel diseñoléxicoy accionesasociadas

Desventajas:dependenciadela herramienta,costedeaprendizaje

flex puedeusarsecomofiltro potentedetexto

Másinformaciónenpáginaman flex y enlibro “le x& yacc”, deLevine etal. (681.3.06)

Generacion deanalizadorlexico– p.20