Sei sulla pagina 1di 32

LeX

Plantilla plan.l
lex.yy.c

LeX
Otros mdulos

Compilador + Enlazador

Ejecutable

LeX. Procesadores de Lenguaje I

Plantilla de LeX
LeX evala un fichero de entrada para implementar un analizador lxico especificado Las reglas de reconocimiento tienen la estructura patrn-accin, mediante expresiones regulares El reconocimiento puede ser contextualizado mediante condiciones de arranque El analizador est contenido en la funcin yylex(): cdigo C Proceso de Compilacin
home\> home\> home\> home\> flex fichero.lex ls *.c lex.yy.c gcc -o plantilla lex.yy.c lfl

LeX. Procesadores de Lenguaje I

Formato de LeX
Tres partes separadas por una lnea con %%
Declaraciones %% Reglas

Previas al uso del scanner Patrones de entrada y acciones a realizar cuando concuerda la entrada, es obligatoria Funciones C que se copian al fichero de salida

%% Cdigo de usuario

LeX. Procesadores de Lenguaje I

Formato de LeX
Funcionamiento general: el analizador creado busca en la entrada ocurrencia de los patrones
Cuando encuentra un patrn, ejecuta sus acciones Si no devuelven el control (return), contina la bsqueda de nuevos patrones Si varios patrones encajan, selecciona el ms largo y el primero declarado

Por defecto, el texto que no encaja con ningn patrn lo enva a la salida

LeX. Procesadores de Lenguaje I

Seccin de Declaraciones
Contiene cuatro tipos de declaraciones
Cdigo C del usuario que aparecer copiado en el fichero de salida, delimitado por %{ y %}
Incluir fichero de cabecera Declarar variables globales Declarar procedimientos que se describirn en la parte de seccin Cdigo de usuario

Definicin de alias, poner nombre a expresiones regulares


Aparece al principio de la lnea Se separa la expresin regular por un espacio o tabulador

Definicin de las condiciones de arranque Directivas que controlan el comportamiento de LeX

Pueden aparecer en cualquier orden

LeX. Procesadores de Lenguaje I

Seccin de Declaraciones
%{ Cdigo de usuario #include <.. %} Definiciones DIGITO [0-9] Condiciones de arranque %s NOMBRE Directivas %option ... %% Reglas %% Cdigo de usuario

LeX. Procesadores de Lenguaje I

Seccin de Declaraciones
Definiciones
Dar nombre a patrones complejos facilitando la legibilidad Se pueden anidar, otras definiciones se pueden utilizar entre llaves
entero real real2 numero [0-9]+ {entero}.{entero} {real}[eE][\+\-]?{entero} {entero}|{real}|{real2}

LeX. Procesadores de Lenguaje I

Representacin de patrones
Literal Literal Definicin Seleccin Rango Negacin del Rango Agrupar Numeracin x \* {nombre} a|ab [ad-gB-EG2-4] [^a-z] (a-z)|(0-9) r* r+ r? r{2,4} . ^r r$ La cadena x El carcter literal: * La expresin regular nombre (uso) Seleccin de una alternativa: {a, ab} {a,d,e,f,g,B,C,D,E,G,2,3,4} Cualquiera excepto minsculas Para agrupar patrones [a-z0-9] Ocurrencia de r >=0 Ocurrencia de r >0 Cero o una ocurrencia de r De 2 a 4 ocurrencias de r (.|\n)* representa cualquier fichero r al principio de la lnea r al final de la lnea

Cualquier carcter (no \n) Localizacin

LeX. Procesadores de Lenguaje I

Seccin de Declaraciones
Condiciones de arranque
Permiten modificar el flujo de anlisis: reconocedores ms potentes Hay dos tipos de condiciones de arranque
Inclusivas (%s)
Son evaluados los patrones con la condicin de arranque y los que no utilizan ninguna %s variable

Exclusivas (%x)
Solo se evalan los de la condicin de arranque %x comentario

LeX. Procesadores de Lenguaje I

Seccin de Declaraciones
Cdigo de usuario
%{ /* Este bloque aparecer tal cual en el fichero yy.lex.c */ #include <stdio.h> #include <stdlib.h> #define VALUE 33 int nl, np, nw; %}

Se copia tal cual en la cabecera del fichero lex.yy.c La variables sern globales a todas las funciones del fichero

LeX. Procesadores de Lenguaje I

Seccin de Reglas
Utilizan el formato PATRN ACCIN Los patrones pueden utilizar definiciones, expresiones regulares y condiciones de arranque Las acciones son cdigo C, excepto la activacin y desactivacin de las condiciones de arranque, y otras (ECHO) El lexema que concuerda con el patrn est en la variable yytex, su longitud es yyleng
Ej.:[a-z] {printf(%s,yytex); return(1);}

LeX. Procesadores de Lenguaje I

Seccin de reglas
Acciones
Cdigo C entre llaves Si la accin es | entonces significa que se ejecuta la misma accin que para el siguiente patrn La instruccin BEGIN<condicin_de_arranque> activa la condicin de arranque especificada La instruccin END<condicin_de_arranque> finaliza la activacin de la condicin de arranque

LeX. Procesadores de Lenguaje I

Seccin de reglas
Reglas para la identificacin de patrones
Siempre que para la entrada puedan aplicarse varias reglas: 1. Se aplica el patrn que concuerda con el mayor nmero de caracteres en la entrada
Con la entrada abc:
a {return ab {return c {return abc {return (1);} (2);} (3);} (4);}

2. Si hay dos patrones que concuerdan con el mismo nmero de caracteres en la entrada, entonces se aplica el que est definido primero

LeX. Procesadores de Lenguaje I

Seccin de Cdigo de Usuario


Cdigo C que es copiado al fichero lex.yy.c Si no escribimos esta seccin es equivalente a escribir:
int main () { yyin = stdin; yylex (); }

Ejemplo de main que acepta un fichero como entrada

LeX. Procesadores de Lenguaje I

Variables, Funciones, Procedimientos, Macros LeX incorpora facilidades, las ms comunes son:
Variable yytext Tipo char * o char [] Descripcin Contiene la cadena de texto del fichero de entrada que ha encajado con la expresin regular descrita en la regla. Longitud de yytext yylength = strlen (yytext) Referencia al fichero de entrada. Contienen la estructura de datos de la pila con la que trabaja YACC. Sirve para el intercambio de informacin entre ambas herramientas.

yyleng yyin yyval yylval

int FILE* struct

LeX. Procesadores de Lenguaje I

Variables, Funciones, Procedimientos, Macros


Mtodo yylex() yymore() yyless(n) yyerror() yywrap() Descripcin Invoca al Analizador Lxico, el comienzo del procesamiento. Aade el yytext actual al siguiente reconocido. Devuelve los n ltimos caracteres de la cadena yytext a la entrada. Se invoca automticamente cuando no se puede aplicar ninguna regla. Se invoca automticamente al encontrar el final del fichero de entrada.

yyerror e yywrap pueden ser reescritos


Nombre ECHO REJECT Descripcin Escribe yytext en la salida estandar. ECHO = printf (%s, yytext) Rechaza la aplicacin de la regla. Pone yytext de nuevo en la entrada y busca otra regla donde encajar la entrada. REJECT = yyless (yylength) + Otra regla Fija nuevas condiciones para las reglas. (Ver Condiciones sobre Reglas). Elimina condiciones para las reglas. (Ver Condiciones sobre Reglas).

BEGIN END

LeX. Procesadores de Lenguaje I

Ejemplo de uso
Ejemplo 1: comando wc de Linux
%{ #include <stdio.h> int nc, np, nl; %} %% /*----- Seccin de Reglas ---------------*/ [^ \t\n]+ { np++; nc += yylength; } [ \t]+ { nc += yylength; } \n { nl++; nc++; } %%

LeX. Procesadores de Lenguaje I

Proceso de Compilacin
/*----- Seccin de Procedimientos --------*/ int main (int argc, char *argv[]) { if (argc == 2) { yyin = fopen (argv[1], rt); if (yyin == NULL) { printf (El fichero %s no se puede abrir\n, argv[1]); exit (-1); } } else yyin = stdin; nc = np = nl = 0; yylex (); printf (%d\t%d\t%d\n, nc, np, nl); return 0; }

LeX. Procesadores de Lenguaje I

Ejemplos de patrones lxicos


ER identificador: letra (letra|dgito)*
letra letra

F
dgito

ER nmero entero: (+|-)? digito+


+,-

1
dgito

dgito

F
dgito

ER nmero real: (+|-)? digito+ (.digito*)?((e|E)(+|-)digito+)?

LeX. Procesadores de Lenguaje I

Ejemplos patrones lxicos


%{ #include <stdio.h> int nc, np, nl; //comentario de una linea %} %option noyywrap digito [0-9] letra [a-zA-Z] %% {letra}({letra}|{digito})* {printf("token IDENTIFICADOR: %s\n",yytext);} [-+]?{digito}+ {printf("token ENTERO: %s\n",yytext);} [-+]?{digito}+(.{digito}+)?((E|e)[-+]?{digito}+)? {printf("token REAL: %s\n",yytext);} .|\n {/*no hace nada con resto*/} %%

LeX. Procesadores de Lenguaje I

Patrones con prioridades


Tokens cuyos patrones comienzan igual
EQ: == ASIG: = LT: < LE: <= NE: <>
otro (*) = < = > =
LT

*: devolver carcter entrada

LE

NE

EQ

otro (*)

ASIG

LeX. Procesadores de Lenguaje I

Patrones con prioridades


Ambigedad: tokens cuyos patrones comienzan igual
EQ: == ASIG: = LT: < LE: <= NE: <>
I

< < < = =

LT

= >

LE

NE

ASIG

EQ

Pueden definirse varios patrones solapados. Prioridad el del lexema reconocido ms largo

LeX. Procesadores de Lenguaje I

Patrones con prioridades


%{ #include <stdio.h> int nc, np, nl; %} %option noyywrap %% %% "<" {printf("token LT\n");} "<=" {printf("token LE\n");} "<>" {printf("token NE\n");} "=" {printf("token ASIG\n");} "==" {printf("token EQ\n");} .|\n {/*no hace nada con resto*/}

%%

LeX. Procesadores de Lenguaje I

Distinguir palabras reservadas


Ambigedad: algunos patrones pueden coincidir (palabras reservadas explcitas):
IDENTIFICADOR: letra (letra|dgito)* IF: if THEN: then WHILE: while
letra letra-i I 1 dgito i 2 letra-f 1 1 f 3 separador (*) 1

LeX. Procesadores de Lenguaje I

Distinguir palabras reservadas


Ante coincidencia en longitud, se toma el definido primero
IDENTIFICADOR: letra (letra|dgito)* IF: if THEN: then WHILE: while
i f

t w

h h letra

e i

n l e

letra dgito

LeX. Procesadores de Lenguaje I

Patrones palabras reservadas


%{ #include <stdio.h> int nc, np, nl; //comentario de una linea %} %option noyywrap digito [0-9] letra [a-zA-Z] %% "if" {printf("token IF\n");} "else" {printf("token ELSE\n");} "while" {printf("token WHILE\n");} {letra}({letra}|{digito})* { printf("token IDENTIFICADOR: %s\n",yytext);} .|\n {/*no hace nada con resto*/} %%

LeX. Procesadores de Lenguaje I

Utilizando las condiciones de arranque


<cond1 [, cond2]*>patrn {acciones}
{id} { ECHO; } /* { BEGIN comentario; } <comentario>*/ { END comentario; /* = BEGIN 0; */ } <comentario>. { }

Con BEGIN 0 se vuelve al estado en el cual los patrones no necesitan condiciones de arranque para ser evaluados Para indicar la condiciones iniciales de procesamiento
%start cond1 [, cond2]*

LeX. Procesadores de Lenguaje I

Utilizando las condiciones de arranque


Ejemplo prctico: comentarios en C
/*comentario en C ***/
no * 1 / 2 * 3 * 4 * / 5

no *

Expresin Regular para el AFD muy complicada


Los estados lxicos permiten con Lex representar no slo expresiones regulares

LeX. Procesadores de Lenguaje I

Patrones comentarios C
%% %{ #include <stdio.h> int nc, np, nl; //comentario de una linea %} %option noyywrap %x comentario %% ^"//".*\n {ECHO;} "/*" { BEGIN comentario; } <comentario>"*/" {BEGIN INITIAL;} <comentario>.|\n {} .|\n {ECHO;}

LeX. Procesadores de Lenguaje I

Utilizando las condiciones de arranque


Ejemplo bsqueda patrones complejos
Analizador Red Identificar paquetes con a y b, donde nunca se repiten ms de dos veces una letra: abbbaababbaabbba abb baababbaabb ba
a b s1b s1a a b a b s2b s2a

Expresin Regular para el AFD muy compleja:

(a|ba|bba)(aba|abba|ba|bba)* | (b|ab|aab)(bab|baab|ab|aab)* | (a|ba|bba)((bba)*|(ba)*)a((ba|bba)((bba)*|(ba)*)a)*| (b|ab|aab)((aab)*|(ab)*)b((ab|aab)((aab)*|(ab)*)b)*

LeX. Procesadores de Lenguaje I

Ejemplo Analizador. Con Expresin Regular


%{ #include <stdio.h> int nc, np, nl; //comentario de una linea %} %option noyywrap term1a term1b term2a term2b (a|ba|bba)(aba|abba|ba|bba)* (b|ab|aab)(bab|baab|ab|aab)* (a|ba|bba)((bba)*|(ba)*)a((ba|bba)((bba)*|(ba)*)a)* (b|ab|aab)((aab)*|(ab)*)b((ab|aab)((aab)*|(ab)*)b)*

%% {term1a}|{term1b}|{term2a}|{term2b} {printf("%s\n",yytext);} .|\n %%

LeX. Procesadores de Lenguaje I

Ejemplo Analizador. Con Estados


%option noyywrap %x %x %x %x s1a s2a s1b s2b

%% a {BEGIN s1a; b {BEGIN s1b; <s1a>a {BEGIN <s1a>b {BEGIN <s1a>. {BEGIN <s1b>a {BEGIN <s1b>b {BEGIN <s1b>. {BEGIN <s2a>b {BEGIN <s2a>. {BEGIN <s2b>a {BEGIN <s2b>. {BEGIN .|\n

printf("a");} printf("b");} s2a; printf("a");} s1b; printf("b");} 0; printf("\n");} s1a; printf("a");} s2b; printf("b");} 0; printf("\n");} s1b; printf("b");} 0; yyless(0); printf("\n");} s1a; printf("a");} 0; yyless(0); printf("\n");}

Potrebbero piacerti anche