Professional Documents
Culture Documents
los caracteres que tengan significados especiales en las expresiones regulares en UNIX se representan como caracteres precedidos por una barra (\)
Lex & Yacc asisten en la generacin de fragmentos de programas para resolver la primer tarea.
Anlisis Lxico
Explora el programa fuente y reconoce todas las unidades sintcticas (tokens)
subcadenas de caracteres consecutivos que forman agrupaciones lgicas
palabras claves identificadores
[F]Lex acepta como entrada una lista de expresiones regulares, escritas en el estilo UNIX, seguidas cada una de ellas por una seccin de cdigo entre corchetes que indica lo que el analizador lxico har cuando encuentre una instancia de una unidad sintctica
Generador de analizadores lxicos
Toma como entrada una descripcin de alto nivel de un analizador lxico y genera a partir de ella una funcin que es un analizador lxico que funciona
[F]lex
Toma como entrada una especificacin de analizador lxico (Conjunto de expresiones regulares + acciones) y devuelve como salida el cdigo fuente implementando el analizador lxico en C (yylex). Ayuda en la escritura de programas cuyo flujo de control es dirigido por instancias de expresiones regulares en el flujo de entrada.
[f]lex
Salida Cdigo C implementando un analizador lxico (scanner) Funcin: yylex() Archivo: lex.yy.c
Empleando [f]lex
file: lex.yy.c
[f]lex
yylex() { } compilador
especifica
driver code
main() {}
or
parser() {}
Empleando [f]lex
Un archivo de entrada posee la siguiente estructura: requerido Especificacin de analizador lxico (expresiones regulares + acciones)
especifica
[f]lex
opcional
%%
Empleando [f]lex
Un archivo de entrada posee la siguiente estructura: Especificacin de analizador lxico (expresiones regulares + acciones)
especifica
[f]lex
definiciones %% reglas %% cdigo del usuario digito digito ID ID [0-9] [0-9] [a-zA-Z][a-zA-Z0-9]* [a-zA-Z][a-zA-Z0-9]*
%{ %{ #include <stdio.h> texto a copiarse en el archivo de salida #include <stdio.h> #include #include<stdlib.h> <stdlib.h> entre %{ }% %} %} precedido por un tabulador
Sintaxis y Semntica del Lenguaje - 2010
Empleando [f]lex
Un archivo de entrada posee la siguiente estructura: Especificacin de analizador lxico (expresiones regulares + acciones)
especifica
[f]lex
Clases Clasesde decaracteres caracteres [:alpha:], [:alpha:],[:digit:], [:digit:],[:alnum:], [:alnum:],[:space:] [:space:] Definiciones Definiciones patrn, describe el patrn que {nombre-definido-en-definiciones} {nombre-definido-en-definiciones} debe coincidir con la entrada expresiones regulares (Extendidas)
Sintaxis y Semntica del Lenguaje - 2010
Ejemplo
Software instalado Gcc version 3.4.5 (mingw 5.1.6, Minimalist GNU for Windows, http://www.mingw.org/) Flex version 2.5.4a-1 (http://flex.sourceforge.net/) http://gnuwin32.sourceforge.net/packages/flex.htm
MinGW-5.1.6.exe
10
11
12
13
14
15
16
Ejemplo
17
Ejemplo
Ejemplo
18
Ejemplo
Accin: imprime un mensaje e incrementa la cantidad de nmeros identificados Regla que define como patrn un nmero ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)+
Sintaxis y Semntica del Lenguaje - 2010
Ejemplo
char *yytex, un buffer que mantiene los caracteres de entrada que coinciden con el patrn int yyleng, nmero de caracteres que coinciden con el patrn
Sintaxis y Semntica del Lenguaje - 2010
19
Ejemplo
Ejemplo
20
Ejemplo
Accin nula
Regla que define como patrn cualquier carcter, excepto el salto de lnea
Sintaxis y Semntica del Lenguaje - 2010
Ejemplo
21
Ejemplo
Ejemplo
Cada vez que yylex() es invocado, el scanner contina con el procesamiento del buffer de entrada. Retorna cero cuando alcanza el fin de archivo.
22
Ejemplo
Si en el buffer de entrada tengo la palabra 1? Cuando Cuando ms ms de de un un patrn patrn coincide coincide con con la la entrada, entrada, el el scanner scanner se se comporta comporta de de la la siguiente siguiente manera: manera: Se Se elige elige la la palabra palabra mas mas larga larga (por (por ej., ej., 12) 12) Si Si mltiples mltiples reglas reglas son son candidatas, candidatas, se se selecciona selecciona la la primer primer regla regla (por (por ej. ej. 1) 1) Si Si ninguna ninguna regla regla coincide, coincide, por por defecto defecto se se copia copia el el caracter caracter en en stdout stdout..
Regla que define como patrn un nmero ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)+ Regla que define como patrn cualquier carcter, excepto el salto de lnea
Sintaxis y Semntica del Lenguaje - 2010
Ejemplo
Patrn para identificar texto entre comillas?
\(.|\n)*\
Esto es un ejemplo de texto entre comillas. Ilustra el problema cuando se emplea (.|\n)*.
Cuando Cuando ms ms de de un un patrn patrn coincide coincide con con la la entrada, entrada, el el scanner scanner se se comporta comporta de de la la siguiente siguiente manera: manera: Se Se elige elige la la palabra palabra mas mas larga larga Si Si mltiples mltiples reglas reglas son son candidatas, candidatas, se se selecciona selecciona la la primer primer regla regla
23
Ejemplo
Patrn para identificar texto entre comillas?
\(.|\n)*\
Esto es un ejemplo de texto entre comillas. Ilustra el problema cuando se emplea (.|\n)*.
Cuando Cuando ms ms de de un un patrn patrn coincide coincide con con la la entrada, entrada, el el scanner scanner se se comporta comporta de de la la siguiente siguiente manera: manera: Se Se elige elige la la palabra palabra mas mas larga larga Si Si mltiples mltiples reglas reglas son son candidatas, candidatas, se se selecciona selecciona la la primer primer regla regla
Ejemplo
Patrn para identificar texto entre comillas?
\(.|\n)*\
Esto es un ejemplo de texto entre comillas. Ilustra el problema cuando se emplea (.|\n)*. Esto es un ejemplo de texto entre comillas. Ilustra el problema cuando se emplea (.|\n)*.
\[^\]*\
Cuando Cuando ms ms de de un un patrn patrn coincide coincide con con la la entrada, entrada, el el scanner scanner se se comporta comporta de de la la siguiente siguiente manera: manera: Se Se elige elige la la palabra palabra mas mas larga larga Si Si mltiples mltiples reglas reglas son son candidatas, candidatas, se se selecciona selecciona la la primer primer regla regla
24
Ejemplo
Patrn para identificar texto entre comillas?
\(.|\n)*\
Esto es un ejemplo de texto entre comillas. Ilustra el problema cuando se emplea (.|\n)*. Esto es un ejemplo de texto entre comillas. Ilustra el problema cuando se emplea (.|\n)*.
\[^\]*\
Cuando Cuando ms ms de de un un patrn patrn coincide coincide con con la la entrada, entrada, el el scanner scanner se se comporta comporta de de la la siguiente siguiente manera: manera: Se Se elige elige la la palabra palabra mas mas larga larga Si Si mltiples mltiples reglas reglas son son candidatas, candidatas, se se selecciona selecciona la la primer primer regla regla
Ejercicio
Escribir un programa con Flex que elimine los comentarios en un archivo con cdigo fuente en C
25
Ejercicio
Escribir un programa con Flex que elimine los comentarios en un archivo con cdigo fuente en C
Ejercicio
El conjunto de identificadores de un lenguaje fue especificado por la siguiente expresin regular Letra ((_ + ) Letra)* Determinar si son identificadores bien formados
setup set_up set__up
_setup
setup_
26
Ejercicio
El conjunto de identificadores de un lenguaje fue especificado por la siguiente expresin regular Letra ((_ + ) Letra)* Determinar si son identificadores bien formados
setup
set_up
set__up
_setup
setup_
Ejercicio
El conjunto de identificadores de un lenguaje fue especificado por la siguiente expresin regular Letra ((_ + ) Letra)* Determinar si son identificadores bien formados
setup
set_up
set__up
_setup
setup_
27
Ejercicio
Ejercicio
Escribir una expresin regular para el lenguaje de los nmeros Romanos (hasta el 100) I, II, III, IV, V, VI, VII, VIII, IX, X, XI, , L, , XC, , C (C + ( XC + XL + (L + ) ( + X ( + X ( + X)))) ( IX + IV + (V + ) ( + I ( + I ( + I)))))
28