exposicion analizador lexico

Upload: mariel-gallardo-lambaren

Post on 30-Oct-2015

283 views

Category:

Documents


1 download

TRANSCRIPT

  • Analizadores LexicosINTEGRANTES DEL EQUIPO:

    Martha Alejandra Tapia FernandezJuan Carlos Salazar CastaedaMariel Gallardo Lambaren

  • Temas realizados por cada uno de los Integrantes.Funciones del Analizador Lexico Juan Carlos Salazar Castaeda

    Creacion de tabla de TokensMariel Gallardo Lambaren

    Componentes Lexicos, Patrones y LexemasMartha Alejandra Tapia Fernandez

  • Funcin de un analizador lxico

    Leer los caracteres de cdigo fuente y formarlos en unidades lgicas para que lo aborden las partes siguientes de compilador (generalmente el analizador Sintctico).las unidades lgicas que genera el analizador lxico se denominan Tokens . Un token o tambin llamado 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, else, while, int, ...).Son los elementos ms bsicos sobre los cuales se desarrolla toda traduccin de un programa, surgen en la primera fase, llamada anlisis lxico, sin embargo se siguen utilizando en las siguientes fases (anlisis sintctico y anlisis semntico) antes de perderse en la fase de sntesis.

  • Generadores De Analizadores Lxicos (Scanner Generators)

    LexCdigo generado: C.

    FlexCdigo generado: C++.

    ZlexCdigo generado: C.Soporta cdigos de carateres de 16 bits..

  • Jax Cdigo generado: Java. No soporta entornos, est basado en expresiones regulares. No soporta Unicode. Jlex Cdigo generado: Java. Similar a lex. Diseado para ser usado junto con CUP. Jflex Cdigo generado: Java. Diseado para ser usado junto con CUP. Otros: Ragel, ScanGen, RE2C, Gobo, YooLex

  • Funciones de Analizador Lexico*EL GENERADOR DE ANALIZADORES LXICOS LEXEs una herramienta conocida como Lex o Flex, la cual nos permite especificar un analizador lxico mediante la especificacin de expresiones regulares para describir patrones de los tokens. La notacin de entrada para esta herramienta es el lenguaje Lex, la cual es en s, el compilador Lex.Este transforma los patrones de entrada en un diagrama de transicin y genera cdigo en un archivo llamado lex.yy.c que simula el diagrama de transicin.

  • *CREACIN DE UN ANALIZADOR LXICO CON LEX

    Uso de Lex:Se crea un archivo de entrada con extensin .l, que describe el analizador lxico que se va a generar.El programa de salida en un analizador lxico funcional que puede recibir un flujo de caracteres de entrada y producir una cadena de tokens.

    Estructura de los programas en LEX:Un programa en Lex tiene tres partes distintas:

    *DECLARACIONES: incluye variables, constantes de manifiesto, definiciones regulares, como por ejemplo el nombre de un token. Tambin podemos agregar definiciones de manera explcita en el cdigo generado escribiendo lo que deseamos agregar en medio de %{ %}, como por ejemplo %{ #define DIGITO 265 %}.REGLAS DE TRADUCCIN: Estn dadas de la forma Patrn {Accin}, cada patrn es una expresin regular, la cual puede usar declaraciones regulares de la seccin de declaraciones. las acciones son fragmentos de cdigo, escritos en C. FUNCIONES AUXILIARES: contiene las funciones adicionales que se utilizan en las acciones.Para separar cada parte se utiliza %%.

  • seccin de definiciones>%%

    %%

    De estas tres secciones, slo la segunda es obligatoria, y cualquiera de ellas puede estar vaca. Esto quiere decir que el mnimo programa en lex es: %%La seccin de declaraciones incluye declaraciones de variables, constantes y definiciones regulares, que constituyen una manera cmoda de utilizar expresiones regulares largas en la seccin de reglas; por ejemplo: letra[A-Za-z]La seccin de reglas especifica los patrones a reconocer y las acciones asociadas a stos, de forma similar a la que utiliza awk:patrn{ acciones en C}

    *ESQUEMA GENERALUn programa fuente de Lex tiene el siguiente aspecto:

  • La seccin de rutinas permite definir funciones auxiliares en C, incluida la funcin main (). Por defecto, lex proporciona un main () que simplemente llama a la funcin yylex ().

    El comportamiento del programa generado (por defecto a.out, si no se le indica otra cosa al compilador de C) es el siguiente:

    Imprimir en la salida estndar los lexemas que no se adapten a ningn patrn.Realizar la accin indicada para los lexemas que se ajustan a un patrn.Por lo tanto, si compilamos y ejecutamos el programa mnimo en lex, que consta nicamente de una seccin de reglas vaca (%%), veremos que se limita a copiar literalmente la entrada estndar en la salida estndar.

  • *SECCIN DE REGLAS

    A primera vista, una regla de lex tiene el mismo aspecto que una sentencia patrn-accin de awk. Su estructura es:patrn regular accin_en_CEl patrn regular debe estar situado en la primera posicin de la lnea; es decir, que no puede haber espacios antes del patrn regular. Lex admite todas las expresiones regulares de egrep, con alguna extensin ms .El patrn y la accin se separan por un blanco o un tabulador (o ms).La accin puede ser una sola sentencia de C, o una sentencia compuesta, encerrada entre llaves { }.Cuando hay ms de un patrn regular que puede adaptarse a la entrada, lex tomar la cadena ms larga posible que pueda adaptarse a un patrn. Si an as hay ms de un patrn que se adapta a la entrada, lex ejecutar la accin de la regla que antes aparezca en el fuente lex.

  • Lex almacena el lexema encontrado en un array de tipo char llamado yytext, y su longitud en la variable yyleng.La accin especial ECHO copia el lexema reconocido en la salida estndar. Es un sinnimo de printf("%s", yytext);La accin especial | (barra vertical) indica que para este patrn debe ejecutarse la accin correspondiente al patrn inmediatamente inferior.Todo programa lex incorpora automticamente la siguiente lnea como ltima regla:.|\n ECHO;EQUIVALENTE A ESTAS DOS REGLAS SEPARADAS:\nECHO;De manera que todos los lexemas que no encajan con ningn otro patrn, se copian en la salida estndar. Se puede evitar este comportamiento especificando reglas para . y para \ n.

  • *CDIGO C EN UN PROGRAMA LEX

    Muchas veces es til poder incluir cdigo en C dentro de un programa en lex, para apoyar el trabajo del analizador. Suele ser normal, por ejemplo, declarar una estructura de datos que contenga detalles sobre cada lexema encontrado o incluir nuestra propia funcin main ().Puede insertarse cdigo C en un fuente Lex en varias partes: En la seccin de declaraciones, entre una lnea %{ y una lnea %} (ntese que no es } %). Este cdigo ser externo y se situar antes de la funcin yylex() en el programa lex. yy. c.En la seccin de declaraciones, cualquier lnea que comience por un espacio en blanco se considerar cdigo C y ser tambin externo y anterior ayylex().

  • *CREACION DE TABLA DE TOKENS

  • Tambin se la llama tabla de nombres o tabla de identificadores y tiene dos funciones principales;

    - Efectuar chequeos semnticos.- Generacin de cdigo.

    Permanece slo en tiempo de compilacin, no de ejecucin, excepto en aquellos casos en que se compila con opciones de depuracin.La tabla almacena la informacin que en cada momento se necesita sobre las variables del programa, informacin tal como: nombre, tipo, direccin de localizacin, tamao, etc. La gestin de la tabla de smbolos es muy importante, ya que consume gran parte del tiempo de compilacin. De ah que su eficiencia sea crtica. Aunque tambin sirve para guardar informacin referente a los tipos creados por el usuario, tipos enumerados y, en general, a cualquier identificador creado por el usuario, nos vamos a centrar principalmente en las variables de usuario. Respecto a cada una de ellas podemos guardar:

  • *Ejemplos de Identificadores*Variable : Lexema y Tipo

    *Matriz: Lexema, dimensiones de la matriz y tipo de elementos.

    *Procedimiento: Lexema, Parmetros Normales.

    *Funcion:Lo mismo que con el procedimiento junto con el valor devuelto.

    *Tipo definido por el usuario: Lexema y definicin del tipo.

  • *Almacenamiento del nombre.

    Se puede hacer con o sin lmite. Si lo hacemos con lmite, emplearemos una longitud fija para cada variable, lo cual aumenta la velocidad de creacin, pero limita la longitud en unos casos, y desperdicia espacio en la mayora. Otro mtodo es habilitar la memoria que necesitemos en cada caso para guardar el nombre. En C esto es fcil con los char *. Si hacemos el compilador en MODULA-2, por ejemplo, habra que usar el tipo ADDRESS.

  • *Direccin de memoria en que se guardar.

    Esta direccin es necesaria, porque las instrucciones que referencian a una variable deben saber donde encontrar el valor de esa variable en tiempo de ejecucin, tambin cuando se trata de variables globales. En lenguajes que no permiten recursividad, las direcciones se van asignando secuencialmente a medida que se hacen las declaraciones. En lenguajes con estructuras de bloques, la direccin se da con respecto al comienzo del bloque de datos de ese bloque, (funcin o procedimiento) en concreto.

  • El nmero de dimensiones de una variable array, o el de parmetros de una funcin o procedimiento junto con el tipo de cada uno de ellos es til para el chequeo semntico.Aunque esta informacin puede extraerse de la estructura de tipos, para un control ms eficiente, se puede indicar explcitamente. Tambin podemos guardar informacin de los nmeros de lnea en los que se ha usado un identificador, y de la lnea en que se declar.

  • *Consideraciones sobre la Tabla de Tokens.

    La tabla de smbolos puede iniciarse con cierta informacin til, tal como:- Constantes: PI, E, etc.- Funciones de librera: EXP, LOG, etc.Palabras reservadas.

    Esto facilita el trabajo al lexicogrfico, que tras reconocer un identificador lo busca en la tabla de smbolos, y si es palabra reservada devuelve un token asociado. Bien estructurado puede ser una alternativa ms eficiente al lex tal y como lo hemos visto (hash perfecto).

  • Conforme van apareciendo nuevas declaraciones de identificadores, el analizador lxico,o el analizador sintctico segn la estrategia que sigamos, insertar nuevas entradas en la tabla de smbolos, evitando siempre la existencia de entradas repetidas.El analizador semntico efecta las comprobaciones sensibles al contexto gracias a la tabla de smbolos, y el generador de cdigo intermedio usa las direcciones de memoria asociadas a cada identificador en la tabla de smbolos, al igual que el generador de cdigo,el optimizador de cdigo no necesita hacer uso de ella.

  • La tabla de tokens contiene informacin til para poder compilar, por tanto existe en tiempo de compilacin, y no de ejecucin.Sin embargo, en un intrprete, dado que la compilacin y ejecucin se producen a la vez, la tabla de smbolos permanece todo el tiempo.

  • *Ejemplo:Suponemos que queremos hacer las siguientes operaciones:a = 7 * 3b = 3 * a En la segunda instruccin necesitamos saber cuanto vale a; es decir el valor de a debe estar guardado en algn sitio. Para ello utilizaremos una lista de pares:

  • De forma que cuando nos encontremos con la instruccin a = 7 * 3, miremos en la tabla, si no est a en la tabla, creamos un nodo para introducirla.

  • A continuacin nos encontramos con b = 3 * a. Qu es a? Busco en la tabla de smbolos y vemos que el valor de a es 21. b = 3 * a Ahora buscamos b en la tabla de smbolos y como no est lo creamos.

  • Si ejecutramos ahora la instruccin: a = a + bTendramos a a y b en la tabla de smbolos con lo cual solo tendramos que modificar el valor de a.

  • COMPONENTES LEXICOS, PATRONES Y LEXEMAS.

  • 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.PatrnRegla 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. Los componentes lxicos son las unidades sintcticas o terminales para la gramtica que define la estructura sintctica del lenguaje.

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

    Los lexemas son caracteres o conjuntos de caracteres (palabras) que pertenecen al lxico del lenguaje.Los atributos son las informaciones adicionales para cada componente lxico que sern utilizadas en el anlisis semntico o en la traduccin. Habitualmente los atributos que se guardan en la tabla de smbolos son relativos a los identificadores.

    *Atributos de los componentes lxicos

  • En la mayora de los lenguajes de programacin, se consideran componentes lxicos las siguientes construcciones:

    Las palabras reservadasLos operadores (de comparacin, asignacin, booleanos, binarios, aritmticos, etc.).Los identificadores (de variables, funciones, constantes, etc.)Las constantes o literales (enteros, reales, cadenas de caracteres, caracteres ,etc.)Signos de puntuacin ( parntesis, coma, punto y coma, etc.)

  • Como se ha visto anteriormente la funcin ms importante del analizador lxico es la entrega de los componentes lxicos y sus atributos al analizador lxico. El resto de las funciones dependen del compilador y del propio lenguaje a procesar, pero pueden ser clasificadas segn el interfaz con el que entra el contacto el analizador lxico:

    Interfaz con el fichero que contiene el programa fuente.Interfaz con el analizador sintcticoInterfaz con la tabla de smbolosInterfaz con el tratamiento de errores

    *Estructura Funcional Del Analizador Lxico.

  • *Ejemplo:

  • Leer el siguiente carcter (sigtecar())AnalizarloAcumular el carcter si no se ha determinado an un token (guadacar())Emitir un mensaje de error si se ha encontrado un error lxico (mensaje error())Instalar en la tabla de smbolos si se ha determinado un identificador (instalaTDS())Entregar el componente lxico que se haya determinado y el atributo correspondiente si hay lugar. (return )En ocasiones slo se puede determinar un token cuando se ha recibido un carcter que pertenece al siguiente token. En este caso se debe reinsertar dicho carcter a la entrada para realizar el anlisis lxico de la siguiente peticin del analizador lxico( reinsertar()).

    Las funciones detalladas que ha de realizar el analizador lxico son:

  • *Especificaciones De Los Componentes Lexicos En Expresiones Regulares

  • ConclusinNuestra conclusin es que el analizador lxico tiene que dividir la secuencia de caracteres en palabras con significado propio y despus convertirlo a una secuencia de terminales desde el punto de vista y que reconoce las palabras en funcin de una gramtica regular de manera que sus no terminales se convierten en los elementos de entrada y un tokens es una secuencia de caracteres que representa una unidad de informacin en el programa,La entrada del analizador lxico podemos definirla como una secuencia de caracteres.

  • BibliografaTeora de Autmatas y lenguajes formalesFederico Simmross Wattenberg ([email protected])Universidad de Valladolid[Agu98] J. Aguirre, V. Grinspan, M.. Arroyo, Diseo e Implementacin de un Entorno de Ejecucin,Concurrente y Orientado a Objetos, generado por un Compilador de Compiladores, Anales ASOO 98JAIIO, pp. 187-195, Buenos Aires 1998.[Agu99] J. Aguirre, G. Maidana, M. Arroyo, Incorcorando Traduccin a las Expresiones Regulares,Anales del WAIT 99 JAIIO, pp 139-154, 1999.

    ****