Generador de analizadores léxicos FLEX Procesadores de Lenguajes 4o Informática PL curso 2008-2009 (CCIA) CCIA Octubre 2008 PL–0809 (CCIA) Introducción a FLEX Octubre-2008 1 / 12 Uso de FLEX FLEX: traduce la especificación de un analizador léxico a un programa C que lo implementa I I I Analizador léxico descrito/especificado mediante expresiones regulares (E.R.) A las E.R. se les pueden asociar acciones (código C) Cada vez que el analizador encuentra una secuencia que encaja con una de las E.R., ejecutará la acción asociada fichero.l lex.yy.c + (ficheros .c) PL–0809 (CCIA) → FLEX → lex.yy.c → GCC → ejecutable Introducción a FLEX Octubre-2008 2 / 12 Pasos de compilación 1 2 Compilar la especificación del analizador y crear el fichero yy.lex.c con el código del autómata $ flex fichero.l Compilar el analizador C y generar el programa ejecutable 1 2 Enlazar con librería de FLEX (proporciona implemenatciones por defecto para yywrap() y main()) $ gcc lex.yy.c -lfl Compilar y enlazar con ficheros .c del usuario $ gcc lex.yy.c (ficheros .c) F F Usuario proporciona implementaciones para main() e yywrap() Deberá llamar a la función yylex() que reconocerá un TOKEN por cada llamada. PL–0809 (CCIA) Introducción a FLEX Octubre-2008 3 / 12 Funcionamiento de FLEX tablas del autómata generado función int yylex(void) yylex() simula el analizador especificado y sirve de interfaz con el código de usuario lex.yy.c contiene I yylex() debe de ser llamada desde el código de usuario Funcionamiento: En cada llamada, yylex(): 1 2 3 toma caracteres de la entrada hasta que machea una E.R. el texto que macheado se almacena en la variable yytext se ejecutan las acciones asociadas al patrón de esa E.R. Acciones: I I Puede ser simplemente el procesamiento del texto macheado para enviarlo de nuevo a la salida. En otras ocasiones podrán suponer la alteración de variables del código de ususario y la devolución a la rutina que llama a yylex() (mediante return) de un valor numérico que identifique al TOKEN reconocido PL–0809 (CCIA) Introducción a FLEX Octubre-2008 4 / 12 Partes de una especificación FLEX Tres partes separadas por el símbolo % % Las dos primeras son obligatorias, aunque pueden estar vacías < sección de declaraciones > %% < sección de reglas y acciones > %% < sección de rutinas de usuario > PL–0809 (CCIA) Introducción a FLEX Octubre-2008 5 / 12 Sección de declaraciones Código C necesario para las acciones asociadas a los patrones I I El código C irá entre % y %, será copiado tal cual a lex.yy.c Generalmente serán #include, #define y estructuras o variables del código de usuario afectadas por las acciones Definición de macros I I Asocia un ”alias” a expr. regulares usadas en la sección de reglas (mejoran la legibilidad) En las reglas se referencia ese ”alias” poniéndolo entre llaves definición: uso (en reglas ): LETRA_MAYUSCULA [A-Z] DIGITO [0-9] {LETRA_MAYUSCULA} {DIGITO} Definición de entornos de reconocimiento (start conditions) I I Entornos dentro de los cuales se podrán reconocer sub-expresiones dependiendo del contexto Permite generar ”mini-analizadores” dentro del analizador definición: uso: (en reglas) PL–0809 (CCIA) %start NOMBRE [patron] {BEGIN(NOMBRE)} /*inicio entorno*/ <NOMBRE>[sub-patron] {[accion]} <NOMBRE>[sub-patron] {BEGIN(INITIAL)} /*fin entorno* Introducción a FLEX Octubre-2008 6 / 12 Sección de reglas [exp. reg. 1] [acción 1] Formato: .... [exp. reg. n] [acción n] Cada par ([exp. reg.], [acción]) recibe el nombre de regla I I Si la acción involucra varias sentencias C, irán entre llaves ({...}) Si varias expr. reg. comparten la misma acción se indica con | exp_reg1 | exp_reg2 | . . . exp_regN acción_común Notas: I I El primer carácter de la expr. reg. debe de comenzar en la primera columna de texto Si no se especifica ninguna acción, se aplica la acción por defecto (se copia el string macheado en la salida) Manejo de ambigüedades I I Si la entrada machea más de 1 expr. reg. se elegirá la expresión que machee mayor núm. caracteres Si núm. caracteres macheados es el mismo, se elige a la que aparezca primero en el fichero FLEX PL–0809 (CCIA) Introducción a FLEX Octubre-2008 7 / 12 Sección de rutinas de usuario En esta sección se puede escribir código C adicional Funciones llamadas desde las acciones de las reglas En programas sencillo se suele incluir en esta sección las funciones main() y yywrap() definidas por el usuario Nota: La función int yywrap() se ejecuta cada vez que se alcanza el final del fichero de entrada Permite manejar múltiples ficheros de entrada Devuelve 1 para indicar que no quedan ficheros de entrada por procesar y que el procesamiento ha terminado Implementación por defecto int yywrap() { return(1); } PL–0809 (CCIA) Introducción a FLEX Octubre-2008 8 / 12 Expresiones regulares en FLEX (I) Expresiones simples c reconoce el carácter ’c’ . cualquier carácter excepto salto de linea (’\n’) [abc] cualquier carácter del conjunto (’a’, ’b’ ó ’c’) [ˆabc] cualquier carácter excepto los del conjunto [a-z] cualquier carácter del rango indicado [ˆa-z] cualquier carácter excepto los del rango "xxxx" reconoce la cadena indicada de forma literal {ALIAS} expande la expr. reg. asociada al alias indicado (definido en sec. declaraciones) PL–0809 (CCIA) Introducción a FLEX Octubre-2008 9 / 12 Expresiones regulares en FLEX (II) Operadores (de mayor a menor precedencia) R* R+ R? R{n} R{n,m} (R) RS R|S ˆR R$ reconoce 0 ó más repeticiones de R reconoce 1 ó más repeticiones de R reconoce 0 ó 1 ocurrencia de R (opcional) reconoce n repeticiones exactas de R reconoce de n a m repeticiones de R agrupa expresiones regulares reconoce la concatenación de R y S reconoce o R o S reconoce la expr. R si está al inicio de linea reconoce la expr. R si está al final de linea Siendo R y S expr. regulares PL–0809 (CCIA) Introducción a FLEX Octubre-2008 10 / 12 Expresiones regulares en FLEX (III) R/S <AAA> reconoce R sólo si lo que sigue a continuación encaja con S (S define el contexto donde reconocer R) reconoce la condición de arranque AAA (normalmente la acción asociada será { BEGIN(AAA) } para indicar a FLEX que entre en el contexto de esa cond. de arranque) <AAA>R reconoce R si se está dentro del contexto de la condición de arranque AAA Algunos símbolos de escape: \n salto de línea \t tabulador \\ barra invertida \+, \∗, \∧ , \$ \[, \], \(, \), \{, \} PL–0809 (CCIA) Introducción a FLEX Octubre-2008 11 / 12 Variables y funciones predefinidas Variables FLEX accesibles desde el código de usuario yytext: Puntero a una cadena de caracteres que contiene la última cadena de texto que encajó con una expr. reg. I I I Está declarada como char *yytext Permite acceder a la cadena reconocida Su contenido sólo es estable dentro de las reglas y entre llamadas consecutivas a la función yylex() yyleng: Entero con la longitud de la cadena yytext yyin: Variable de tipo FILE * con un puntero al descritor del fichero de donde se leen los caracteres I I Por defecto se corresponde con la entrada estándar Para que el analizador FLEX lea de un fichero distinto es necesario modificarla haciendo una llamada a fopen(...) yyout: Variable de tipo FILE * con un puntero al fichero en el que escribe el analizador léxico al utilizar la acción ECHO I Por defecto se corresponde con la salida estándar PL–0809 (CCIA) Introducción a FLEX Octubre-2008 12 / 12 Acciones predefinidas ECHO: Escribe en yyout el contenido de yytext BEGIN(...): Indica la entrada en una condición de arranque (≈ mini-analizador) I BEGIN(INITIAL) retorna al amanizador principal REJECT: Rechaza el macheo actual asignado a yytext y pasa a la siguiente regla que encaje (si la hay) unput(), input(): Modifican los caracteres de entrada fuera del control del analizador FLEX PL–0809 (CCIA) Introducción a FLEX Octubre-2008 12 / 12