Generador de analizadores léxicos FLEX Procesadores de Lenguajes 4 Informática

Anuncio
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
Descargar