Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Plantilla plan.l
lex.yy.c
LeX
Otros mdulos
Compilador + Enlazador
Ejecutable
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
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
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
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
Seccin de Declaraciones
%{ Cdigo de usuario #include <.. %} Definiciones DIGITO [0-9] Condiciones de arranque %s NOMBRE Directivas %option ... %% Reglas %% Cdigo de usuario
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}
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
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
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
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);}
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
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
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.
BEGIN END
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++; } %%
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; }
F
dgito
1
dgito
dgito
F
dgito
LE
NE
EQ
otro (*)
ASIG
LT
= >
LE
NE
ASIG
EQ
Pueden definirse varios patrones solapados. Prioridad el del lexema reconocido ms largo
%%
t w
h h letra
e i
n l e
letra dgito
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]*
no *
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;}
%% 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");}