Sunteți pe pagina 1din 9

5 ANALISIS LEXICO. 5.1 FUNCIONES DEL ANALIZADOR LXICO El analizador lxico es la primera fase de un compilador.

Su principal funcin consiste en leer los caracteres de entrada y elaborar como salida una secuencia de componentes lxicos que utiliza el analizador sintctico para hacer el anlisis. Esta interaccin, suele aplicarse convirtiendo al analizador lxico en una subrutina o corrutina del analizador sintctico. Recibida la orden Dame el siguiente componente lxico del analizador sintctico, el analizador lxico lee los caracteres de entrada hasta que pueda identificar el siguiente componente lxico. Estos componentes lxicos representan: palabras reservadas: if, while, do, . . . identicadores: asociados a variables, nombres de funciones, tipos definidos por el usuario, etiquetas,... Por ejemplo: Forma: una letra seguida de letras o nmeros. Ej. a, b1, c3D Atributo nombre: string con la secuencia de caracteres que forma el identificador en maysculas. Ej. A, B1, C3D operadores: = * + - / == > < &! = . . . smbolos especiales: ; ( ) [ ] f g ... constantes numricas: literales que representan valores enteros, en coma flotante, etc, 982, 0xF678, -83.2E+2,... Forma: secuencia de dgitos que puede empezar con el signo menos y puede contener un punto. Ej. 10, -3, 15.4, -54.276, .10 Atributo valor: Double con el valor numrico. Precisin: entero o real. constantes de caracteres: literales que representan cadenas concretas de caracteres

Interaccion de un analizador lxico con le analizador sintatico. Otras funciones que realiza: Eliminar los comentarios del programa. Eliminar espacios en blanco, tabuladores, retorno de carro, etc, y en general, todo aquello que carezca de significado segn la sintaxis del lenguaje. Reconocer los identificadores de usuario, nmeros, palabras reservadas del lenguaje,..., y tratarlos correctamente con respecto a la tabla de smbolos (solo en los casos que debe de tratar con la tabla de smbolos).

Llevar la cuenta del nmero de lnea por la que va leyendo, por si se produce algn error, dar informacin sobre donde se ha producido. Avisar de errores lxicos. Por ejemplo, si @ no pertenece al lenguaje, avisar de un error. Puede hacer funciones de preprocesador.

5.2 .- COMPONENTES LXICOS, PATRONES, LEXEMAS COMPONENTE LXICO O TOKEN El valor asociado a una categora o unidad de lxico. Se representa como un nmero entero o una constante de un byte. Ejemplo: el token de un identificador puede ser 1 id (si id fue definida como 1). Los tokens son las unidades lxicas bsicas de igual forma que las palabras y signos de puntuacin son las unidades bsicas de un enunciado. Los tokens varan del lenguaje al lenguaje e incluso de compilador a compilador para el mismo lenguaje, la eleccin de los tokens es tarea del diseador del compilador. En la mayora de lenguajes tendremos tokens para : palabras clave: IF THEN THEN THEN = ELSE; ELSE ELSE = THEN; operadores Identificadores constantes (reales, enteras y de tipo carcter), strings de caracteres y signos de puntuacin

1. Tipos de tokens: Tiras especficas, tales como palabras reservadas (if, while, begin, etc.), el punto y coma, la asignacin, los operadores aritmticos o lgicos, etc. tiras no especficas, como identificadores, constantes o etiquetas. 2. Prioridad de los tokens Se da prioridad al token con el lexema ms largo: Si se lee >= y > se reconoce el primero. Si el mismo lexema se puede asociar a dos tokens, estos patrones estarn definidos en un orden determinado. Ejemplo: While palabra reservada while letra (letra | digito)* identificador Si en la entrada aparece while, se elegir la palabra reservada por estar primero. Si estas especificaciones iniciales aparecieran en orden inverso, se reconocera un token identificador.

LEXEMA Es cada secuencia de caracteres concreta que encaja con un patrn, es decir, es como una instancia de un patrn. Ejm: 8, 23, 50 (son lexemas que encajan con el patrn ( 0 | 1 | 2 | ... | 9) + ) Una vez detectado que un grupo de caracteres coincide con un patrn, se ha detectado un lexema. A continuacin se le asocia un nmero, que se le pasar al sintctico, y, si es necesario, informacin adicional, como puede ser una entrada en la tabla de smbolos. La tabla de smbolos suelen ser listas encadenadas de registros con parte variable: listas ordenadas, rboles binarios de bsqueda, tablas hash, etc. Ejm: Hacer un analizador lxico que nos reconozca los nmeros enteros, los nmeros reales y los identificadores de usuario. Vamos a hacer este ejemplo en C. Terminales Expresin Regular ( 0 ... 9) + NUM_ENT (0 ... 9)*. (0 ... 9) + NUM_REAL (a ... z) (a ... z 0 ... 9) * ID Asociado a la categora gramatical de nmero entero tendremos el token NUM_ENT que puede equivaler por ejemplo al nmero 280; asociado a la categora gramatical nmero real tendremos el token NUM_REAL que equivale al nmero 281; asociado a la categora gramatical identificador de usuario tendremos el token ID que equivale al nmero 282. ( 0 ... 9) + { return 280;} (0 ... 9)*. (0 ... 9) + { return 281;} (a ...z) (a ...z 0...9) * { return 282;} Si tuviramos como texto de entrada el siguiente: 95.7 99 hola El analizador lxico intenta leer el lexema ms grande; el 95 encaja con el primer patrn, pero sigue, al encontrarse el punto, se da cuenta de que tambin encaja con el segundo patrn, entonces como este es ms grande, toma la accin del segundo patrn, return NUM_REAL. El 99 coincide con el patrn NUM_ENT, y la palabra con ID. Los espacios en blanco no coinciden con ningn patrn. En vez de trabajar con los nmeros 280, 281, 282, se definen mnemotcnicos. # define NUM_ENT 280 # define NUM_REAL 281 # define NUM_ID 282 ( \t \n) (0 ... 9) + {return NUM_ENT;} (0 ... 9) *. (0 ... 9) + {return NUM_REAL;} (a ... z) (a ... z 0 ... 9)* {return ID;}

Las palabras que entran por el patrn ( \t \n) no tienen accin asociada, por lo que , por defecto, se consideran solo espaciadores. Ejemplo: Programa UNO; Inicio Escribe (Hola); Fin.

Cuya tabla de tokens es la siguiente:

5.3 CREACION DE TABLA DE TOKENS.

Las tablas de smbolos (tambin llamadas tablas de identificadores y tablas de nombres), realizan dos importantes funciones en el proceso de traduccin: verificar que la semntica sea correcta y ayudar en la generacin apropiada de cdigo. Ambas funciones se realizan insertando o recuperando desde la tabla de smbolos los atributos de las variables usadas en el programa fuente. Estos atributos, tales como: el nombre, tipo, direccin de almacenamiento y dimensin de una variable, usualmente se encuentran explcitamente en las declaraciones o ms implcitamente a travs del contexto en que aparecen los nombres de variables en el programa. Una de las estructuras de datos que se encuentran relacionadas con las fases del proceso de compilacin es la tabla de smbolos, la cual tiene como propsito registrar informacin que se comparte entre varias etapas y que permite administrar los recursos asociados a las entidades que manipular el programa. La tabla de smbolos tiene tpicamente la siguiente estructura:

en donde podemos apreciar la designacin de la entidad y su token -derivados del anlisis de lxico- asi como una serie de atributos (tipo de dato, direccin en memoria) que emanan de otras fases (anlisis gramatical y semntico). Las consultas a la tabla de smbolos se realizan por medio del lexema con que se designa a la entidad. Esta concepcin de la tabla de smbolos es demasiado simple para fines prcticos si consideramos que el lexema de la entidad es de longitud variable y se desea que la estructura sea homogenea. Una solucin es considerar que en el campo lexema se tiene un apuntador (que siempre ocupa el mismo espacio) hacia donde se registrarn propiamente los lexemas. Eso evitar el desperdicio de memoria al tener el espacio justo para representar a cada lexema.

La creacin de la tabla de smbolos compete inicialmente al analizador de lxico, quien registrar a las entidades (reconocidas bajo el patrn de Identificador) de manera nica, por medio del binomio de operaciones Bsqueda-Insercin. En el contexto de un programa las entidades pueden describir propiamente objetos manipulables por el lenguaje (por ejemplo variables, constantes o funciones) o descriptores de acciones (las palabras reservadas); ambas situaciones son reconocidas bajo el mismo patrn de identificador y la tabla de smbolos se emplea para hacer su discriminacin. El analizador de lxico funciona bajo el

siguiente

mecanismo:

REPITE Token = AnaLex(); SI Token == Identificador ENTONCES Token= REVISA_RESERVADAS(lexema) FSI HASTA QUE Token == EOF FREPITE Como las palabras reservadas es un conjunto de entidades conocido y finito, la tabla de smbolos se inicializa con ellas y cuando se reconoce un identificador, su lexema se busca en la tabla y si se encuentra en ella, se regresa el token correspondiente a travs de invocar a la funcin REVISA_RESERVADAS. El algoritmo de la funcion REVISA_RESERVADAS es el siguiente: REVISA_RESERVADAS(lexema) INICIO p=BUSQUEDA(lexema) SI p == 0 ENTONCES p=INSERTAR(lexema) FSI Regresa TABLA[p].Token FIN Este algoritmo supone al existencia de dos funciones que realizan la bsqueda y la insercin de un lexema en la tabla de smbolos. La ltima_entrada direcciona la ltima entidad registrada y ltimo_lexema la primera localidad disponible donde se registran los lexemas. La funcin BUSQUEDA se guia bajo el siguiente algoritmo: BUSQUEDA (lexema) INICIO Indice=ltima_entrada MIENTRAS ndice>0 REPITE Si contenido(TABLA[Indice].Ap_lexema)==lexema ENTONCES regresa Indice SINO Indice:=Indice-1 FSI FREPITE Regresa Indice FIN donde es de notar que la bsqueda se inicia de la ltima entidad registrada hacia la primera bajo el supuesto que en un programa se encuentran con mayor frecuencia referencias a variables (que se registran al final) que a palabras reservadas (que estan registradas al inicio de la tabla). Si la bsqueda fracasa, la entidad tiene que darse de alta por la funcin INSERTAR, cuyo algoritmo es: INSERTAR (lexema) INICIO LEXEMAS[ltimo_lexema] = lexema ltima_entrada = ltima_entrada + 1 TABLA[ltima_entrada].Ap_lexema = ltimo_lexema. TABLA[ltima_entrada].Token = ltima entrada. ltimo_lexema = ltimo_lexema + LONGITUD(lexema). Regresa ltima_entrada FIN Donde LONGITUD es una funcin que determina el nmero de caracteres que conforman al lexema insertado.

Cuando construir la tabla de smbolos y cuando interactuar con ella. El punto del procesador de traduccin en el cual son invocadas las rutinas de manejo de la tabla de smbolos dependen primeramente del nmero y la naturaleza de los pasos del compilador.

En un compilador multipasos, la tabla de smbolos es creada durante el paso de anlisis lxico. Por medio de un ndice se entra a la tabla de smbolos para ubicar la variable, a partir del token generado por el scanner.

Contenido de la tabla de smbolos. Una tabla de smbolos puede conceptualizarse como una serie de renglones, cada uno de los cuales contiene una lista de valores de atributos que son asociados con una variable en particular. Las clases de los atributos que aparecen en una tabla de smbolos dependen en algn grado de la naturaleza del lenguaje de programacin para el cual se escribe el compilador. Por ejemplo, un lenguaje puede ser sin tipos, y por lo tanto el atributo tipo no necesita aparecer en la tabla. Similarmente, la organizacin de la tabla de smbolos variar dependiendo de las limitaciones de memoria y tiempo de acceso. A continuacin se presenta un ejemplo de una tabla de smbolos tpica.

Los atributos que se manejan en la tabla anterior y que se describen enseguida, no son estrictamente necesarios para todos los compiladores; sin embargo, cada uno de tales atributos deber ser considerado para la implementacin de un compilador de un compilador en particular. Nombre de la variable. Direccin del cdigo objeto. Tipo. Valor (o nmero de parmetros para uno procedimiento). Nmero de lnea fuente donde fue declarada la variable. Nmeros de lnea fuente donde se hace referencia a la variable. Liga. Campo cuyos valores sirven para listar las variables en orden alfabtico.

El nombre de la variable debe estar, en cualquier caso, formando parte de la tabla de smbolos, ya que es el medio por el cual una variable en particular es

identificada en las etapas de anlisis semntico y generacin de cdigo. Para proveer un acceso rpido, es conveniente manejar un tamao predefinido pero lo suficientemente grande para los nombres de las variables. Una longitud igual o mayor que 16 caracteres es bastante adecuado. El identificador completo puede almacenarse, justificado a la izquierda, en un campo de longitud fija en la tabla de smbolos. Este criterio posibilita un acceso ms rpido a la tabla de smbolos, a costa de no aprovechar eficientemente el espacio de almacenamiento en el caso de las variables con identificadores cortos. Otro criterio para manejar los identificadores en la tabla de smbolos consiste en colocar una cadena descriptora en el campo Nombre_Variable de la tabla. El descriptor contiene los subcampos posicin y longitud. El subcampo posicin es un apuntador que indica la posicin del primer carcter del nombre de la variable en un rea general de cadenas, y el subcampo describe el nmero de caracteres del nombre de la variable. Este enfoque produce un acceso ms lento a la tabla de smbolos, pero ofrece un ahorro considerable de espacio de almacenamiento. En el proceso de compilacin, una direccin de cdigo objeto debe asociarse con todo variable en un programa. Esta direccin establece la ubicacin relativa para los valores de la variable en tiempo de ejecucin. La direccin del cdigo objeto se coloca en la tabla de smbolos cuando la variable es declarada (o encontrada por primera vez). Esta direccin es reinvocada desde la tabla cuando la variable es referenciada en el programa fuente. La direccin es luego utilizada en una instruccin objeto que accesa (carga o almacena) el valor de esa variable. El atributo tipo se almacena en la tabla de smbolos cuando los lenguajes compilados tienen tipos de datos explcitos o implcitos. Tradicionalmente, el tipo de dato de una variable es almacenado codificada en la tabla de smbolos; por ejemplo 1 puede representar el tipo real , 2 el tipo integer , etc. Los atributos nmero_de_dimensiones y nmero_de_parametros son importantes en la fase de anlisis semntico. En las referencias a los arreglos, el nmero de dimensiones debe coincidir con el especificado en la declaracin del arreglo, y esto debe ser verificado en la fase de anlisis semntico. El nmero de dimensiones se utiliza tambin como parmetro en el clculo de la direccin de un elemento particular del arreglo. El nmero de parmetros de la invocacin a un procedimiento tambin debe coincidir con el nmero usado en la declaracin. En la construccin de la tabla de smbolos, es conveniente considerar el nmero de parmetros de un procedimiento como su nmero de dimensiones y as combinar estos dos atributos en uno. Adems de conveniente, este enfoque tambin es consistente, ya que el tipo de verificacin semntica para ambos atributos es similar. El atributo liga se ha incluido en la tabla de ejemplo simplemente para facilitar la produccin de un listado de referencias cruzadas ordenado alfabticamente por nombre de variable.

BIBLIOGRAFA. 1.- http://www.angelfire.com/planet/ispr/Unidad3/3.4.htm


2.- http://www.giaa.inf.uc3m.es/docencia/ITIG/lexico.pdf 3.- http://es.scribd.com/doc/50154561/analisis-lexico 4.- http://www.sgoliver.net/blog/?page_id=113 5.- http://www.rastersoft.com/articulo/turing.html

S-ar putea să vă placă și