You are on page 1of 11

2 Anlisis lxico (Scanner) La fase de rastreo (scanner), tiene las funciones de leer el programa fuente como un archivo de caracteres

y dividirlo en tokens. Los tokens son las palabras reservadas de un lenguaje, secuencia de caracteres que representa una unidad de informacin en el programa fuente. En cada caso un token representa un cierto patrn de caracteres que el analizador lxico reconoce, o ajusta desde el inicio de los caracteres de entrada. De tal manera es necesario generar un mecanismo computacional que nos permita identificar el patrn de transicin entre los caracteres de entrada, generando tokens, que posteriormente sern clasificados. Este mecanismo es posible crearlo a partir de un tipo especifico de maquina de estados llamado autmata finito. 2.1 Funcin del analizador lxico Es la primera fase de un compilador. Su principal funcin consiste en leer la secuencia de caracteres del programa fuente, carcter a carcter, y elaborar como salida la secuencia de componentes lxicos que utiliza el analizador sintctico. El analizador sintctico emite la orden al analizador lxico para que agrupe los caracteres y forme unidades con significado propio llamados componentes lxicos (tokens). Los componentes lxicos representan: o Palabras reservadas: if, while, do, o Identificadores: variables, funciones, tipos definidos por el usuario, etiquetas, o Operadores: =, >, <, >=, <=, +, *, o Smbolos especiales: ;, ( ), { }, o Constantes numricas. literales que representan valores enteros y flotantes. o Constantes de carcter: literales que representan cadenas de caracteres. 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. rbol de anlisis sintctico componente lxico programa fuente obtn siguiente componente lxico analizador lxico analizador sintctico tabla de smbolos Adems el analizador lxico es responsable de: o Manejo de apertura y cierre de archivo, lectura de caracteres y gestin de posibles errores de apertura. o Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea. o Inclusin de archivos y macros. o Contabilizar nmero de lneas y columnas para emitir mensajes de error. Una de las ventajas de separar el anlisis lxico y anlisis sintctico es que facilita la

transportabilidad del traductor si se decide realizar cambios posteriores, por ejemplo cambiar las etiquetas begin-end por llaves de apertura y cierre { }. UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez 2 2.2 Componentes lxicos, patrones y lexemas En la fase de anlisis, los trminos componentes lxicos (token), patrn y lexema se emplean con significados especficos. Un analizador lxico, inicialmente lee los

Proceso de anlisis lxico. El trabajo del analizador lxico es leer los caracteres del cdigo fuente y formarlos en unidades lgicas para que lo aborden las partes siguientes del compilador . Las unidades lgicas que genera el analizador lxico se denominan tokens . Los tokens son entidades lgicas que por lo regular se definen como un tipo enumerado, esto es, el analizador lxico lee los caracteres de entrada y los agrupa en objetos token; un token lleva informacin adicional en forma de valores de atributos, entonces un nombre token es un smbolo abstracto que representa u tipo de unidad lxica, por lo que con frecuencia nos referiremos a un token por su nombre. A una secuencia de caracteres de entrada que conforman un solo token se le conoce como lexema , entonces se puede decir que el analizador lxico separa a un analizador sintctico de la representacin tipo lexema de los tokens. Un patrn es una descripcin de la forma que pueden tomar los lexemas de un token;p.e. en el caso de una palabra clave el patrn es la secuencia de caracteres que forman la palabra clave. Ejemplo: Se tiene la siguiente instruccin: printf ( Total = %d\n , puntuacin); tanto printf como puntuacin son lexemas que coinciden con el patrn para el token id y Total = %d\n es un lexema que coincide con literal. En un lenguaje de programacin los siguientes tokens cubrenla mayora de definiciones: INFORMAL | LEXEMA DE EJEMPLO | if | Caracteres i , f | if | else | Caracteres e,l,s,e | else | comparacin | < o > o <= o >= o == o != | <= , != | id | Letra seguida por letras y dgitos | pi, puntuacin, D2 | nmero | Cualquier constante numrica | 3.14159, 0 , 6.02E23 | literal | Cualquier cosa excepto ,rodeada por s | core dumped | Atributos para los tokens. Cuando ms de un lexema coincide con un patrn, el analizador lxico debe proporcionar a las siguientes fases del compilador informacin adicional sobre el

lexema especfico que coincidi, as que independientemente del nmobre del token se requerir el valor del atributo o el atributo propio. Ejemplo: Nmero -> 0 Nmero-> 1 Ambos patrones tienen el mismo nombre de token, as que el analizador lxico devuelve entonces un valor de atributo que describe al lexema que representa ese token. Errores Lxicos. Por ejemplo en caso de haber confusin entre tokens el analizador lxico debe de ser capaz de proceder con una estrategia de recuperacin de errores y la ms comn es la llamada Modo Pnico, donde se eliminan caracteres sucesivos del resto de la entrada, hasta que el analizador lxico pueda encontrar un token bien formado al principio de lo que haya quedado de entrada. Tambin hay otras posibles acciones de recuperacin de errores que son: 1. Eliminar un carcter del resto de la entrada. 2. Insertar un carcter faltante en el resto de la entrada. 3. Sustituir un carcter por otro. 4. Transponer dos caracteres adyacentes. El analizador lxico puede resolver dos problemas, utilizando una tabla para guardar cadenas de caracteres por: * Representacin simple . Una tabla de cadenas puede aislar al resto del compilador de la representacin de las cadenas, ya que las fases del compilador pueden trabajar con referencias o apuntadores a la cadena en la tabla. * Palabras reservadas. Las palabras reservadas pueden implementarse mediante la inicializacin de la tabla de cadenas con las cadenas reservadas y sus tokens. Cuando el analizador lxico lee una cadena o lexema que podra formar un identificador, primero verifica si el lexema se encuentra en la tabla de cadenas. En Java una tabla de cadenas puede definirse como una Hash table utilizando una clase con este nombre Hashtable: Hashtable palabras= new Hashtable(); Esta declaracin establece a palabras como una tabla hash predeterminada, que asigna claves a valores, la cual puede ser empleada para asignar los lexemas a los tokens. Cuando el analizador lxico descubre un lexema que constituye a un identificador, entonces debe introducir ese lexema en la tabla de smbolos Tablas de Smbolos. Son estructuras de datos que utilizan los compiladores para guardar informacin acerca de las construcciones de un programa fuente.

La informacin se recolecta en forma incremental mediante las fases de anlisis de un compilador, y las fases de sntesis la utilizan para generar el cdigo destino. Las entradas en la tabla de smbolos contienen informacin acerca de un identificador, como su cadena de caracteres (o lexema) , su tipo, su posicin, el espacio de almacenamiento y cualquier otra informacin relevante; las tablas de smbolos necesitan soportar varias declaraciones del mismo identificador dentro de un programa. En su forma bsica una Tabla de Smbolos (o lista de nombres) puede verse como un array ampliable de registros que pueden ser indexados por una cadena en lugar de un entero. La cadena es el identificador y el registro asociado contiene la informacin recogida sobre el identificador. La funcin bsica de un mdulo de tabla de smbolos consta de una sla funcin: FUNCTION Identificar (Nombre identificador) RETURNING un puntero a Info identificador; Cuando se llama con una cadena Nombre identificador la funcin devuelve un puntero a un registro de tipo info identificador ; si posteriormente vuelve a ser llamada con la misma cadena, devuelve el mismo puntero, sin importar con qu frecuencia vuelve a hacerse o cuntas otras llamadas a identificar() se han realizado. El autor del compilador definir el tipo Info identificador para contener toda la informacin pertinente sobre el identificador que pueda ser necesario almacenar. Es importante mencionar que la funcin identificar () devuelve un puntero a un registro en lugar de una copia al registro ya que lo que se quiere es poder actualizar el registro con la informacin que se vaya recogiendo. Anexo Las expresiones regulares representan patrones de cadenas de caracteres. Una expresin regular r se encuentra completamente definida mediante el conjunto de cadenas con las que concuerda. Este conjunto se denomina L(r), en este caso lenguaje slo se usa para definir un conjunto de cadenas. En una expresin regular tambin se contendr caracteres del alfabeto, pero esos caracteres tendrn un significado diferente, en una expresin todos los smbolos indican patrones; sin embargo tambin puede contener caracteres con significado especial, estos se llaman metacaracteres o metasmbolos . Por otro lado los autmatas finitos o mquinas de estados finitos son una manera matemtica para describir clases particulares de algoritmos en particular, los autmatas finitos se pueden utilizar para describir el proceso de reconocimiento de patrones en cadenas de entrada , y de este modo se pueden construir analizadores lxicos. Por ejemplo el patrn para los identificadores est dado por la definicin regular: Identificador = letra (letra| dgito)* Ejercicios:

1.-Describa los lenguajes denotados por las siguientes expresiones regulares: 1. a(a+b)*a 2. ((+b)*)* 3. (a+b)*a(a+b)(a+

Codigo De Analizador Lexico

public class Lexer { private CharReader mLector = null; private int mNumeroDeLinea = 1; private int mNumeroDeCaracter = 1; private String mLexema = ""; //texto del token private boolean hayError = false; //para saber desde afuera, si hay algun error public public public public public public public public public static static static static static static static static static int int int int int int int int int TOKEN_PALABRA = 1001; TOKEN_COMA = 1002; TOKEN_ESPACIO = 1003; TOKEN_INT = 1004; TOKEN_SUMA = 1005; TOKEN_RESTA = 1006; TOKEN_MUL = 1007; TOKEN_DIV = 1008; TOKEN_FLOAT = 1009;

public String getUltimoLexema() { return mLexema; } public Lexer() { } public int getNextToken() { if (mLector == null) { return -1; } char caracterActual; int estadoActual = 0; hayError = false; mLexema = "";

while (mLector.listo()) { caracterActual = peekChar(); if (estadoActual == 0) { //transicion con S if (Character.isWhitespace(caracterActual)) { estadoActual = 1; readChar(); //consumir el caracter } else if (Character.isLetter(caracterActual)) { // estadoActual = 2; readChar(); //consumir el caracter } else if (Character.isDigit(caracterActual)) { // D estadoActual = 3; // este es el estado de numero, el 3 readChar(); //consumir el caracter } else if (caracterActual == '+') { estadoActual = 4; readChar(); //consumir el caracter } else if (caracterActual == '-') { estadoActual = 5; readChar(); //consumir el caracter } else if (caracterActual == '*') { estadoActual = 6; readChar(); //consumir el caracter } else if (caracterActual == '/') { estadoActual = 7; readChar(); //consumir el caracter } else { //llega un caracter que no es valido en este estado hayError = true; readChar(); //quitar el error ( un caracter ) return -1; } } //fin del estado 0 else if (estadoActual == 1) { if (Character.isWhitespace(caracterActual)) { estadoActual = 1; //inncesario pero mas claro si readChar(); //consumir el caracter } else { mLexema = ""; // estadoActual = 0; //return TOKEN_ESPACIO; }

} else if (estadoActual == 2) { if (Character.isLetter(caracterActual)) { estadoActual = 2; readChar(); //consumir el caracter } else { return TOKEN_PALABRA; } } else if (estadoActual == 3) { if (Character.isDigit(caracterActual)) { estadoActual = 3;// readChar(); //consumir el caracter } else if (caracterActual == '.') { estadoActual = 8; readChar(); //consumir el caracter } else { return TOKEN_INT; } } else if (estadoActual == return TOKEN_SUMA; } else if (estadoActual == return TOKEN_RESTA; } else if (estadoActual == return TOKEN_MUL; } else if (estadoActual == return TOKEN_DIV; } else if (estadoActual == 4) { 5) { 6) { 7) { 8) {

if (Character.isDigit(caracterActual)) { estadoActual = 9; readChar(); //consumir el caracter } else { //error lexico, este no es de aceptacion hayError = true; readChar(); //quitar el error ( un caracter ) return -1; } } else if (estadoActual == 9) { if( Character.isDigit( caracterActual ) ) { estadoActual = 9; // eso falto readChar(); }

return TOKEN_FLOAT; } } //caso que llegue hasta aqui , es que no encontro token return -1; } private char peekChar() { if (mLector == null) { //no hay archivo abierto return Character.MIN_VALUE; } if (!mLector.listo()) { //no esta listo return Character.MIN_VALUE; } return mLector.peekNextChar(); } private char readChar() { if (mLector == null) { //no hay archivo abierto return Character.MIN_VALUE; } if (!mLector.listo()) { //no esta listo return Character.MIN_VALUE; } char temp = mLector.ReadNextChar(); //si el caracter actual es ENTER "" == cadenas , '' == caracter if (temp == ' ') { mNumeroDeLinea++; // incrementar en 1 mNumeroDeCaracter = 1; //regresar a 1 } else {

mNumeroDeCaracter++; } //concatenar este caracter, a la cadena mLexema mLexema += temp; return temp; } public void inicializar(String pFilePath) { //solo preparar el charReader con el archivo que nos indican mLector = new CharReader(); mLector.inicializar(pFilePath); mNumeroDeLinea = 1; mNumeroDeCaracter = 1; } }

http://www.paginasprodigy.com/edserna/cursos/compilador/notas/Notas2.pdf http://www.angelfire.com/linux/eotto/comp_clase2.pdf http://www.buenastareas.com/ensayos/Analizador-Lexico/1427191.html http://books.google.com.mx/books? id=yG6qJBAnE9UC&pg=PA86&lpg=PA86&dq=compiladores+analizador+lexico&s ource=bl&ots=rr_KW_90lQ&sig=3FCdIi42kmSPW_Nq_MYR2FY7SQE&hl=es419&sa=X&ei=DbyzUNujBoPg8ATdnIHQDw&ved=0CEYQ6AEwBDgU#v=onepage &q=compiladores%20analizador%20lexico&f=false http://www.galeon.com/shock/tareas.html

http://www.openboxer.260mb.com/asignaturas/compiladores/ALEX/AnlexANSIC.pdf http://www.monografias.com/trabajos11/compil/compil2.shtmlpresentation#btnNexthttp://www.uv.

es/~diazj/practica2.pdf http://www.iqcelaya.itc.mx/~vicente/Programacion/TradComp.pdf http://megazar.tripod.com/compil.pdf http://cic.puj.edu.co/wiki/lib/exe/fetch.php? media=materias:comp:comp_sesion5_2008-1.pdf http://www.uv.es/~diazj/practica2.pdf http://www.monografias.com/trabajos11/compil/compil.shtml http://www.recercat.net/bitstream/handle/2072/43845/PFC_LaiaFelipMolina.pdf? sequence=1

You might also like