You are on page 1of 38

Unidad III Anlisis Lxico

M.C. Juan Carlos Olivares Rojas

Agenda
3.1 Introduccin a los Autmatas finitos y expresiones regulares. 3.2 Analizador de lxico. 3.3 Manejo de localidades temporales de memoria (buffers). 3.4 Creacin de tablas de smbolos. 3.5 Manejo de errores lxicos. 3.6 Generadores de cdigo lxico: Lex y Flex.

3.1 Introduccin a los Autmatas finitos y expresiones regulares


Qu es un autmata? Es un modelo matemtico que sirve para determinar si una cadena pertenece a un lenguaje no. M = (Q, , &, F)
Q = conjunto de estados = alfabeto de entrada & = funciones de transicin F = conjunto de estados de aceptacin

Autmatas finitos
La caracterstica que tienen los autmatas finitos es que solo existe una funcin de transicin definida para un smbolo de entrada. Esto elimina ambigedades Una expresin regular es una forma abreviada de representar lenguajes: a Representa el lenguaje de las letras a a* Representa el lenguaje que tiene 0 hasta n as

Autmatas
Oprel <|>|<=|>=|=|<>

Un solo autmata varios sub_autmatas Programar un autmata: Identificador letra (letra|digito|gb)*

Expresin Regular
Generar la expresin regular para identificar correos electrnicos vlidos. Formato: jcolivar@itmorelia.edu.mx id@dominio

Expresiones Regulares y una gramatica


Una gramtica sirve para generar cadenas de un determinado lenguaje pero tambin sirve para generarla. Existente una relacin uno a uno entre Lenguajes, Autmatas, Expresiones regulares y gramticas.

Gramtica de un if
prop if expr then prop | if expr then prop else prop | termino oprel termino | termino id | num

expr

termino

Gramtica de un if
oprel id num < |>|=|<=|<>|>=| letra (letra | digito)* digito+ (.digito+)?(E(+|-)?digito+)?

eb delim+ delim blanco | tab | linenueva

3.2 Anlizador Lxico


Primera fase de la compilacin Leer caracteres de entrada y generar como salida una secuencia de componentes lxicos Eliminar espacios en blanco Eliminar comentarios Proporcionar informacin acerca de errores lxicos

Componentes lxicos, lexema y patrones


ID 201 202 203 204 Componente lxico Lexema IF OP_RELACIONAL IDENTIFICADOR ENTERO if <, >, !=, == Patrn if <, >, !=, ==

var, s1, letra (letra | suma, prom dgito | gb)* 2, 23, 5124 (dgito)+

Anlisis Lxico
El anlisis exploracin. lineal, se llama lxico o

Posicion := inicial + velocidad * 60 Posicion: identificador := smbolo de asignacin Inicial: identificador

Anlisis Lxico
+: signo de suma Velocidad: identificador *: signo de multiplicacin 60: numero

Se elimina todos los espacios en blancos (espacios, tabuladores, salto de lnea, etc.)

Anlisis Lxico
Reconocedores de identificadores y palabras clave La tabla de smbolo debe insertar y buscar componentes lxicos La tabla de smbolos es utilizada por el analizador sintctico y por otras fases del proceso de traduccin

Funcin del analizador lxico

Componente lxico Cdigo fuente Analizador Lxico Obtener siguiente componente lxico Analizador Sintctico

Tabla de smbolos

Anlisis lxico
Un patrn es una regla que describe el conjunto de lexemas que puede representar a un conjunto lxico Los componentes lxicos se tratan como terminales de la gramtica del lenguaje fuente La devolucin de un componente lxico se hace a travs de un nmero entero

Especificacin de componentes lxicos


Expresiones regulares (patrn) Cada patrn concuerda con una serie de cadenas Las expresiones regulares dan el nombre al conjunto de cadenas con que concuerdan

Expresiones regulares
Se construyen a partir de otras expresiones regulares ms simples Cada expresin regular r, representa un lenguaje L(r) Letra a u b u c u u z Dgito 1 u 2 u 3 u u 0 Identificador letra(letra u dgito)*

Definiciones regulares
Dan nombres a las expresiones regulares Nos permiten referenciarlas recursivamente Digito 1|2|3|4|5|6|7|8|9|0 Entero dgito+ Decimal .dgito+ | .dgito+E(+|-| )dgito+ Real entero (decimal | )

Abreviaturas
* cero o ms casos + uno o ms casos [a-zA-Z] maysculas y minsculas [0-9] dgitos ? Cero o un caso

Abreviaturas
Digito [0-9] Entero digito+ Decimal .digito+exponente? Exponente (E|e) (+|-)?digito+ Real entero decimal?

3.3 Manejo de localidades temporales de memoria (buffers)


La forma ms fcil de leer un programa es carcter por carcter pero es ineficiente. La forma ms eficiente es realizar una copia a la memoria de todo el cdigo fuente. Pero esto en la gran mayora de las ocasiones es imprctico por las dimensiones de los programas. Para solucionar este problema se sugiere utilizar buffers

Manejo de buffers
Existen muchas formas de dividir el trabajo, pero siempre se deber llevar dos punteros, uno al carcter actual y otro al inicial del lexema. El manejo de buffers es esencial para realizar el anlisis de grandes programas de mejor manera

3.4 Creacin de tablas de smbolos


En general el proceso de anlisis lxico puede describirse simplemente como el reconocimiento de caracteres de un lenguaje para generar una tabla de smbolos. El primer paso consiste en crear un escner, el cual se encarga de verificar que no existan caracteres no presentes en el lenguaje.

Tabla de smbolos
La tabla de smbolos va a guardar cada palabra analizada, la va identificar como un lexema y le va asociar un identificador numrico para posteriormente utilizarlo. La tabla de smbolos debe estar en memoria para realizar un anlisis rpido.

3.5 Manejo de errores lxicos


Son pocos los errores que se pueden detectar al hacer anlisis lxico fi (a == f(x)) //Error de sintaxis Pero puede existir algn error si ninguno de los patrones con cuerda con el prefijo de entrada

Tcnicas de recuperacin de errores


Borrar un carcter extrao Insertar un carcter que falta Reemplazar un carcter incorrecto por otro correcto Intercambiar dos caracteres adyacentes

Tcnicas para realizar analizadores lxicos


Utilizar un analizador lxico como FLEX. El generador se encarga de manejar buffers Escribir el analizador en un lenguaje de alto nivel haciendo uso de la E/S del lenguaje Escribir el lenguaje ensamblador y manejar explcitamente la E/S

Anlisis Lxico en XML


El anlisis lxico en documentos XML lo realiza cualquier herramienta o API que utilice XML, ya que debemos cerciorarnos que el lenguaje est bien formado. Si el lenguaje no cumple con las reglas de construccin de documentos XML, falla el proceso. Realizar anlisis lxico de XML en Java o C#

3.6 Generadores de cdigo lxico: Lex y Flex


FLEX es la versin de software libre del popular generador de analizadores lxicos LEX para sistemas *NIX, genera cdigo C aunque existen otras herramientas que generan cdigo en otros lenguajes Analizador.lex flex lex.yy.c Programa ejecutable analizador $gcc lex.yy.c o analizador lfl gcc

Programa Lex
%{
Definiciones globales C

}%
Definiciones flex

%%
Acciones

%%
Cdigo C auxiliar

Definiciones regulares en flex


%% Separadores de secciones Def expresin

Acciones {def} {cdigo C asociado} @ {cdigo C asociado}

Programa que reconoce flotantes


%{
#include <stdio.h> Int ocurrencias;

}% Digito[0-9] Punto Exp [eE] Signo[\+\-] Digitos Decimal Flotante

[\.]

{digito}+ {punto} {digitos}({exp}{signo}{digitos})? {digitos}{decimal}?

Programa que reconoce flotantes


%% {flotante} { printf(flotante encontrado\n); ocurrenicas++; } @ { printf(Arroba\n); } . { printf(Invlido: %s\n, yytext); } %%

Programa que reconoce flotantes


main(int argc, char *argv[]) {
FILE *f; F = fopen(argv[1], r); yyin = f; while(yylex()); printf(%d flotantes encontrados\n, ocurrencias); fclose(f);

Programa para reconocer direcciones IP


Digito [0-9] Punto [\.] IP {digito}+{punto}{digito}+{punto}+{digito}+ {punto}{digito}+ %% {IP} { strcpy(aux, yytext); strcat(aux, .); for(i =0 ; i<4; i++) {

Programa para reconocer direcciones IP


cadnum = strtok(aux, .); if(atoi (cadnum)>255) { printf(Error\n); break; } if(i==4) printf(Direccin IP: %s\n, yytext); }

Preguntas?

You might also like