Está en la página 1de 26

UNIDAD 5

ANALISIS LEXICO

MATERIA: LENGUAJES Y AUTOMATAS 1


ATEDRATICO: *******************************
ALUMNOS:

*DOMINGUEZ VILLANUEVA CESAR SAUL


*HERNANDEZ DE LA ROSA DANIELA E.
*RAMIREZ AVELINO DULCE ANGELICA
*RODRIGUEZ ACOSTA KAREN DEL ROCIO

CICLO ESCOLAR: AGOSTO DICIEMBRE 2014

CD. VICTORIA, TAMAULIPAS

5.1 FUNCIONES DE UN ANALIZADOR


LEXICO
Un analizador lxico asla el analizador sintctico de la representacin de
lexemas de los componentes lxicos.

El analizador lxico opera bajo peticin del analizador sintctico


devolviendo un componente lxico conforme el analizador sintctico lo va
necesitando para avanzar en la gramtica. Los componentes lxicos son
los smbolos terminales de la gramtica.
Suele implementarse como una subrutina del analizador sintctico.
Cuando recibe la orden obtn el siguiente componente lxico, el
analizador lxico lee los caracteres de entrada hasta identificar el
siguiente componente lxico.

DEFINICIONES:

Tokens:

Smbolos terminales de una gramtica


oIdentificadores, palabras reservadas, operadores,...
oVarios signos pueden forman el mismo token

Atributos:
Informacin adicional que tiene el token, de utilidad para el anlisis sintctico y semntico.

Componentes lxicos (tokens):


unidad mnima de informacin que significa algo a la hora de compilar; concepto de palabra; las fases de un
lenguaje constan de cadenas de componentes lxicos.

Lexema:
Una secuencia de caracteres de entrada que comprenden un solo componente lxico se llama lexema; cadena de
caracteres que extrae el componente abstracto del componente lxico.

Patrn:
Descripcin de la forma que han de tomarlos lexemas para ajustarse a un componente lxico.

EJEMPLO:

OTRAS FUNCIONES:

Manejo del fichero de entrada del programa fuente: abrirlo, leer sus
caracteres, cerrarlo y gestionar posibles errores de lectura.

Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea


(caracteres no validos para formar un token).

Inclusin de ficheros: # include...

La expansin de macros y funciones in line: # define...

Contabilizar el nmero de lneas y columnas para emitir mensajes de


error.

Reconocimiento y ejecucin de las directivas de compilacin (por


ejemplo, para depurar u optimizar el cdigo fuente).

ASPECTOS DEL ANALISIS LEXICO

Diseo ms sencillo:

Los smbolos que trata el scanner se describe con una gramtica ms simple
que la del parser, gramtica regular

Mejora la eficiencia:

Gran parte del tiempo de compilacin se consume en la lectura y exploracin de


caracteres

Mejora la portabilidad:

Se pueden tener varias versiones del scanner una para distintos cdigos
(EBCDID, ASCII, ...), con el mismo parser

Descarga el anlisis sintctico:

Ejemplo; no puedo distinguir en FORTRAN hasta despus del 1

oDO 5 I=1.25

oDO 5 I=1,25

5.2 COMPONENTES LXICOS, PATRONES Y


LEXEMAS

COMPONENTE LEXICO: Son las unidades lgicas que genera el analizador lxico. Formar
caracteres en tokenses muy parecido a formar palabras en un lenguaje natural
Es el conjunto de cadenas de entrada que produce como salida el mismo componente lxico.
Cadatokenes una secuencia de caracteres que representa una unidad de informacin en el
programa fuente. Los componentes lxicos ms comunes son los siguientes: palabras clave o
reservadas:

operadores aritmticos

operadores

relacionales

operadores lgicos

operador de asignacin

identificadores

constantes

cadenas

literales

signos de puntuacin

libreras

Lexema:
Representan cadenas de caracteres en el programa fuente que se pueden tratar juntos como una unidad
lxica. Un lexema es una secuencia de caracteres en el programa fuente con la que concuerda el patrn para
un componente lxico.
Patrn:
Regla que describe el conjunto de lexemas que pueden representar a un determinado componente lxico en
los programas fuente. En otras palabras, es la descripcin del componente lxico mediante una regla.

Atributos de los componentes lxicos:


El analizador lxico recoge informacin sobre los componentes lxicos en sus atributos asociados. Los
componentes lxicos influyen en las decisiones del anlisis sintctico y los atributos en la traduccin de los
componentes lxicos:

Apuntador a la entrada de la Tabla de smbolos donde se guarda la informacin sobre el componente lxico.

El lexema para un identificador

El nmero de lnea en que se encontr por primera vez.

5.3 CREACIN DE TABLA DE


TOKENS
Tabla:conjunto de pares clave-valor, llamados elementos de la tabla. La
tabla de smbolos es una componente necesaria de un compilador. Al
declarar un identificador (normalmente una sola vez), ste es insertado en
la tabla. Cada vez que se utilice el identificador se realizar una bsqueda
en la tabla para obtener la informacin asociada (el valor).

Bsqueda: dada la clave de un elemento, encontrar su valor.

Insercin: Dado un par clave-valor, aadir un elemento nuevo a la tabla.

Cambio de valor: Buscar el elemento y cambiar su valor.

Borrado: Eliminar un elemento de la tabla.

Longitud de bsqueda (o tiempo de acceso)

De una clave: Li = nmero de comparaciones con elementos de la


tabla para encontrar esa clave. Mxima: LM = nmero mximo de
comparaciones para encontrar cualquier clave. Media (esperada): Lm
= nmero medio de comparaciones para encontrar un valor. Si la
frecuencia de todas las claves es la misma:

Lm = (S Li)/N

Si la frecuencia de todas las claves no es la misma:

Lm = S pi.Li

Grado de ocupacin:

s = n/N donde n=nmero de elementos en la tabla y N=capacidad


mxima de la tabla.
Funcin de bsqueda: B : KE asocia a cada clave k un elemento B(k).

Valor asociado a una clave k: v(B(k)). Puede ser mltiple, en cuyo caso normalmente se
convierte en un puntero. Si est en la tabla puede almacenarse consecutivamente o en
subtablas paralelas. Tablas de smbolos (identificadores) La clave es el identificador. El valor
est formado por:
Atributos del identificador. Puntero a la posicin de memoria asignada. La clave puede
sustituirse por un puntero. Los identificadores pueden estar empaquetados. La longitud del
identificador puede especificarse en la tabla o delante del nombre, o ser implcita.
Tablas consecutivas: Todos los elementos ocupan posiciones de memoria adyacentes. Tablas
ligadas: cada elemento apunta al siguiente. Tablas doblemente ligadas: cada elemento apunta
al siguiente y al anterior. Tablas no ordenadas Insercin: en el primer lugar vaco.

5.4 ERRORES LXICOS

El anlisis lxico constituye la primera fase, aqu se lee el programa


fuente de izquierda a derecha y se agrupa en componentes lxicos
(tokens), que son secuencias de caracteres que tienen un significado.
Adems, todos los espacios en blanco, lneas en blanco, comentarios y
dems informacin innecesaria se elimina del programa fuente. Tambin
se comprueba que los smbolos del lenguaje (palabras clave,
operadores,...) se han escrito correctamente.

Como la tarea que realiza el analizador lxico es un caso especial de coincidencia


de patrones, se necesitan los mtodos de especificacin y reconocimiento de
patrones, y estos mtodos son principalmente las expresiones regulares y los
autmatas finitos. Sin embargo, un analizador lxico tambin es la parte del
traductor que maneja la entrada del cdigo fuente, y puesto que esta entrada a
menudo involucra un importante gasto de tiempo, el analizador lxico debe
funcionar de manera tan eficiente como sea posible.
Son pocos los errores simplemente en el nivel lxico ya que tiene una visin muy
restringida de un programa fuente. El analizador lxico debe devolver el
componente lxico de un identificador y dejar a otra fase se ocupe de los errores.

Suponga que.
una situacin en la cual el analizador lxico no puede continuar porque ninguno
de los patrones concuerda con un prefijo de la entrada. Tal vez la estrategia de
recuperacin ms sencilla sea recuperacin EN MODO PANICO (este mtodo
de recuperacin es donde se borra caracteres sucesivos de la entrada hasta
que el analizador lxico pueda encontrar un componente lxico bien formado).
Los programas no siempre son correctos!!

EL COMPILADOR TIENE QUE:

Reportar clara y exactamente la presencia de errores

Recuperarse de cada error lo suficientemente rpido para poder detectar errores


subsiguientes:

Tratar de evitar mensajes falsos de error


Un error que produce un token errneo
Errores lxicos posibles
Un token o componente lxico es una cadena de caracteres que tiene un significado
coherente en cierto lenguaje de programacin. Ejemplos de tokens, podran ser palabras
clave (if, while, int), identificadores, nmeros, signos, o un operador de varios caracteres.
Son los elementos ms bsicos sobre los cuales se desarrolla toda traduccin de un
programa, surgen en la primera fase, llamada anlisis lxico.

5.5 GENERADORES DE ANALIZADORES


LXICOS
Entre los generadores de analizadores Lxicos
se encuentran los siguientes:
FLEX
LEX
JTLex

FLEX

Es una herramienta para generar escneres. Un escner, a veces


llamado un tokenizer, es un programa que reconoce patrones lxicos
en el texto. El programa flex lee los archivos de entrada especificados
por el usuario, o la entrada estndar si no se dan los nombres de
archivo, para una descripcin de un escner a generar.

La descripcin es en forma de pares de expresiones regulares y


cdigo C, denominadas reglas.
Flex genera un archivo fuente en C llamado "lex.yy.c", que define
la funcin yylex ().
El "lex.yy.c" archivo puede ser compilado y vinculado a producir
un ejecutable. Cuando se ejecuta el archivo ejecutable, este
analiza su entrada para las apariciones de texto que coinciden
con las expresiones regulares para cada regla. Cada vez que
encuentra una coincidencia, se ejecuta el cdigo C
correspondiente.

LEX
Es un programa para generar analizadores lxicos (en ingls
scanners o lexers).
Lex se utiliza comnmente con el programa yacc que se utiliza
para generar anlisis sintctico. Lex, 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. Lex toma
como entrada una especificacin de analizador lxico y
devuelve como salida el cdigo fuente implementando el
analizador lxico en C.
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.

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.
La estructura de un archivo de lex es intencionadamente similar a
la de un archivo del yacc; los archivos se dividen en tres secciones,
separadas por lneas que contienen solamente dos smbolos "%",
como sigue:

Seccin de declaraciones
%%
Seccin de reglas
%%
Seccin de cdigo en C

La seccin de declaraciones es
el lugar para definir macros y para
importar los archivos de cabecera
escritos en C. Tambin es posible
escribir cualquier cdigo de C aqu,
que ser copiado en el archivo
fuente generado. Este cdigo en C
debe ir entre los smbolos%{%}.

Tambin se pueden incluir "atajos" para definir patrones de la Seccin de


Reglas, por ejemplo en vez del patrn [0-9]* (cero o ms dgitos que
reconoceran cualquier nmero natural), se puede definir en esta seccin
el "atajo": nmeros [0-9]*, as, en la seccin de cdigo pondramos el
patrn {nmeros} {accin_en_C;}. Con esto se clarifica la escritura del
cdigo en lex.

La seccin de reglas es la seccin ms importante; asocia patrones a


sentencias de C. Los patrones son simplemente expresiones regulares.
Cuando el lexer encuentra un texto en la entrada que es asociable a un
patrn dado, ejecuta el cdigo asociado de C. sta es la base de del
funcionamiento de lex.

La seccin de cdigo C contiene sentencias en C y funciones que


sern copiadas en el archivo fuente generado. Estas sentencias
contienen generalmente el cdigo llamado por las reglas en la seccin
de las reglas. En programas grandes es ms conveniente poner este
cdigo en un archivo separado y enlazarlo en tiempo de compilacin.

5.6 APLICACIONES (CASO DE


ESTUDIO)
Adems de para construir compiladores e intrpretes, los analizadores
lxicos se pueden emplear para muchos programas \convencionales". Los
ejemplos ms claros son aquellos programas que tienen algn tipo de
entrada de texto donde hay un formato razonablemente libre en cuantos
espacios y comentarios. En estos casos es bastante engorroso controlar
donde empieza y termina cada componente y es fcil liarse con los
punteros a char. Un analizador lxico simplifica notablemente la interfaz y
si se dispone de un generador automtico, el problema se resuelve en
pocas lneas de cdigo.

EJEMPLO:
Un ejemplo sencillo de uso de analizadores lxicos ser el trabajo con
ficheros organizados en forma de columnas separadas por tabuladores.
Supongamos que tenemos un fichero de texto en el que aparecen
secuencias de dgitos separadas por tabuladores que definen columnas.
Queremos sumar la columna n de la tabla.

Podemos emplear la siguiente especificacin lxica:

Pasar esto a flex es trivial:


%{
#include "columnas.h"
#include <stdio.h>
#include <string.h>
int nlinea;
int yyval;
%}
%%
" "+ ; /* Eliminamos los espacios. */
[0-9]+ { yyval= atoi(yytext); return NUMERO; }
\t { return SEPARACION; }
\n { nlinea++; return LINEA; }
. { fprintf(stderr, "Aviso: car_acter %c inesperado,
l__nea %d.\n", yytext[0], nlinea); }
Las definiciones auxiliares necesarias estaran en
el fichero columnas h:
#define NUMERO 256
#define SEPARACION 257
#define LINEA 258
extern int yyval;
extern int nlinea;

int yylex();
int suma (int ncol) /* Suma los datos de la
columna ncol. */
{
int token, col, res;
res= 0; /* resultado */
nlinea= 0;
while ( (token= yylex())!= 0)
{
col= 1; /* columna actual */
while (1)
{
if ( token!= NUMERO )
error("La l__nea debe comenzar por un
n_umero");
if ( col== ncol )
res+= yyval;
token= yylex();
if ( token!= SEPARACION && token!= LINEA )
error ("Detr_as de un n_umero debe haber un
tabulador o un fin de l__nea.");
if ( token== LINEA )
break;
token= yylex();
col++;
}
if ( col< ncol )
error ("No hay suficientes campos en la
l__nea.");
}return res;}

También podría gustarte