You are on page 1of 28

Sintaxis y Semntica de los Lenguajes de Programacin

Aplicaciones de las Expresiones Regulares

Sintaxis y Semntica del Lenguaje - 2010

Sintaxis y Semntica del Lenguaje


Bibliografa
John Hopcroft, Rajeev Motwani, Jeffrey Ullman. Introduccin a la teora de autmatas, lenguajes y computacin, 3 ed., Pearson, ISBN 9788478290888, 2007

Lex A Lexical Analyzer Generator, M. Lesk & E. Schmidt http://dinosaur.compilertools.net/

Flex The Fast Lexical Analizer http://flex.sourceforge.net/


Sintaxis y Semntica del Lenguaje - 2010

Expresiones Regulares en UNIX


Clases de caracteres
. [a1a2ak] [ai-aj] Cualquier carcter del alfabeto (ASCII) a1 + a2 + + ak con i < j, (segn la secuencia ASCII) ai + ai+1 + + aj-1 + aj [a-z] [0-9] [A-Za-z] [A-Za-z0-9] [-+.0-9] [0-9] [A-Za-z] [A-Za-z0-9]

[:digit:] [:alpha:] [:alphanum:]

los caracteres que tengan significados especiales en las expresiones regulares en UNIX se representan como caracteres precedidos por una barra (\)

Sintaxis y Semntica del Lenguaje - 2010

Expresiones Regulares en UNIX


Operadores
R|E R? R+ R{n} R+E ( + R) RR* RR...R (unin) cero o uno de uno o ms de n copias de

Regla de precedencia: ?, + y {n} se tratan como *


Sintaxis y Semntica del Lenguaje - 2010

Introduccin: Lex & Yacc


Un compilador o intrprete para un lenguaje de programacin suele descomponerse en dos partes:
Lectura del cdigo fuente y descubrimiento de su estructura. Procesamiento de tal estructura (generacin del cdigo objeto).

Lex & Yacc asisten en la generacin de fragmentos de programas para resolver la primer tarea.

Sintaxis y Semntica del Lenguaje - 2010

Introduccin: Lex & Yacc


Un compilador o intrprete para un lenguaje de programacin suele descomponerse en dos partes:
Lectura del cdigo fuente y descubrimiento de su estructura.
Separar el cdigo fuente en tokens (Lex) Buscar la estructura jerrquica del programa (Yacc)

Procesamiento de tal estructura (generacin del cdigo objeto).

Sintaxis y Semntica del Lenguaje - 2010

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

Sintaxis y Semntica del Lenguaje - 2010

Lex: A Lexical Analyzer Generator


Lex es un programa que genera analizadores lxicos ("scanners" o "lexers").
Escrito originalmente por Eric Schmidt y Mike Lesk, es el analizador lxico estndar en los sistemas Unix, y se incluye en el estndar de POSIX. Toma como entrada una especificacin de analizador lxico y devuelve como salida el cdigo fuente implementando el analizador lxico en C (yylex).

Sintaxis y Semntica del Lenguaje - 2010

Lex: A Lexical Analyzer Generator


Aunque tradicionalmente se trata de software propietario, existen versiones libres de lex basadas en el cdigo original de AT&T en sistemas como OpenSolaris y Plan 9 de los laboratorios Bell. Otra versin popular de software libre de lex es Flex.

Sintaxis y Semntica del Lenguaje - 2010

[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.

Entrada Conjunto de expresiones regulares + acciones

[f]lex

Salida Cdigo C implementando un analizador lxico (scanner) Funcin: yylex() Archivo: lex.yy.c

Sintaxis y Semntica del Lenguaje - 2010

Empleando [f]lex
file: lex.yy.c

Especificacin de analizador lxico (expresiones regulares + acciones)


especifica

[f]lex

yylex() { } compilador

especifica

driver code

main() {}
or

parser() {}

Sintaxis y Semntica del Lenguaje - 2010

Empleando [f]lex
Un archivo de entrada posee la siguiente estructura: requerido Especificacin de analizador lxico (expresiones regulares + acciones)
especifica

[f]lex

definiciones %% reglas %% cdigo del usuario

opcional

%%

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

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]*

Definiciones, serie de: definicin de nombre nombre definicin condiciones de inicio

%{ %{ #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

definiciones %% reglas %% cdigo del usuario

Reglas, contiene una serie de reglas: patrn accin

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

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: mingw

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: mingw

MinGW-5.1.6.exe

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: mingw

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: mingw

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: mingw

Sintaxis y Semntica del Lenguaje - 2010

10

Software Instalado: mingw

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: flex

Sintaxis y Semntica del Lenguaje - 2010

11

Software Instalado: flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

12

Software Instalado: flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

13

Software Instalado: flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: mingw + flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

14

Software Instalado: mingw + flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

Software Instalado: mingw + flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

15

Software Instalado: mingw + flex (windows)

Sintaxis y Semntica del Lenguaje - 2010

Compilando y Ejecutando archivos .l

Sintaxis y Semntica del Lenguaje - 2010

16

Compilando y Ejecutando archivos .l

Sintaxis y Semntica del Lenguaje - 2010

Ejemplo

Sintaxis y Semntica del Lenguaje - 2010

17

Ejemplo

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

Sintaxis y Semntica del Lenguaje - 2010

Ejemplo

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

Sintaxis y Semntica del Lenguaje - 2010

18

Ejemplo

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

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

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

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

Regla que define como patrn un nmero ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)+

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

Sintaxis y Semntica del Lenguaje - 2010

Ejemplo

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

Accin: incrementa la cantidad de lneas

Regla que define como patrn un salto de lnea


Sintaxis y Semntica del Lenguaje - 2010

20

Ejemplo

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

Accin nula

Regla que define como patrn cualquier carcter, excepto el salto de lnea
Sintaxis y Semntica del Lenguaje - 2010

Ejemplo

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

Sintaxis y Semntica del Lenguaje - 2010

21

Ejemplo

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

Invoca al scanner (retorna cero cuando es fin de archivo)


Sintaxis y Semntica del Lenguaje - 2010

Ejemplo

definiciones definiciones %% %% reglas reglas %% %% cdigo cdigodel delusuario usuario

Cada vez que yylex() es invocado, el scanner contina con el procesamiento del buffer de entrada. Retorna cero cuando alcanza el fin de archivo.

Sintaxis y Semntica del Lenguaje - 2010

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

Sintaxis y Semntica del Lenguaje - 2010

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

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)*. 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

Sintaxis y Semntica del Lenguaje - 2010

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

Sintaxis y Semntica del Lenguaje - 2010

Ejercicio
Escribir un programa con Flex que elimine los comentarios en un archivo con cdigo fuente en C

Sintaxis y Semntica del Lenguaje - 2010

25

Ejercicio
Escribir un programa con Flex que elimine los comentarios en un archivo con cdigo fuente en C

Sintaxis y Semntica del Lenguaje - 2010

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_

Sintaxis y Semntica del Lenguaje - 2010

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_

Sintaxis y Semntica del Lenguaje - 2010

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_

Sintaxis y Semntica del Lenguaje - 2010

27

Ejercicio

Sintaxis y Semntica del Lenguaje - 2010

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)))))

Sintaxis y Semntica del Lenguaje - 2010

28

You might also like