Analisis lexico

March 29, 2018 | Author: Felix Osmar Rodriguez Martinez | Category: Compiler, Programming Language, Object (Computer Science), Computer Programming, Areas Of Computer Science


Comments



Description

Instituto Tecnológico SuperiorDe Coatzacoalcos 2016 M.A.S.C. Arturo Iván Grajales Vázquez. Competencia a desarrollar. Construir un analizador léxico a partir de un lenguaje de programación o un analizador léxico (p. e. Flex, Lex, JavaCC). Subtemas. 5.1 5.2 5.3 5.4 5.5 5.6 Funciones del analizador léxico Componentes léxicos, patrones y lexemas Creación de Tabla de tokens Errores léxicos Generadores de analizadores Léxicos Aplicaciones (Caso de estudio) Introducción al analizador Léxico . el valor es un apuntador a la tabla que contiene el valor.  El filtro descarta algunos de los tokens encontrados por el rastreador ( tal vez espacios y comentarios). El analizador lexicográfico pasa al analizador sintáctico el tipo de token. y clasificadas cada una de acuerdo con su tipo. En ocasiones. más el valor real de éste. . determina cuáles otros son símbolos reservados ( quizá palabras clave u operadores). constantes numéricas. y coloca el texto de los restantes en la tabla de nombre. o puede hacer una tabla que incluya todo lo anterior. La fase del análisis lexicográfico de un compilador agrupa secuencia de caracteres en categorías. Puede haber tablas separadas para nombres.Analizador léxico o Scanner. y operadores. realmente podemos distinguir dos tareas separadas:  Un rastreador mueve un apuntador a través de la entrada un carácter a la vez para hallar cadenas continuas de caracteres. las cuales constituyen elementos textuales individuales ( palabras). Aunque esto se conoce también como rastréo. cadenas de caracteres constantes. • Tabla de literales.Estructura que muestra el sitio que ocupa el analizador léxico dentro del compilador. Analizador lexicográfico Analizador Sintáctico Analizador semántico Optimización Preparación Para la Generación de código Tokens Manejo de tablas •Tabla de símbolo. • Tabla de ciclos iterativos • Tabla de representación intermedia Manejo de errores E/S Generación del código . e incluso de compilador en compilador para el mismo lenguaje.  Puntuación. Los tokens varían de lenguaje en lenguaje.  La constantes.  El operador. Algunos ejemplos de tokens son:  La palabra clave.  El identificador. .Tokens Los tokens ( componentes léxicas ) son las unidades léxicas básicas del mismo modo en que las palabras y los signos de puntuación son las unidades básicas de una oración en ingles. Los diagramas de transición describen los tokens como cadenas permitidas que toman el diagrama desde un estado inicial hasta un estado final.Las gramáticas lineales describen los tokens como las cadenas generadas por una gramática en una forma especial (Llamadas también gramáticas regulares ).La expresiones regulares describen los tokens como el conjunto de cadenas permitidas en un lenguaje. valor) Al tipo de un tokens a menudo se llama clase. los carácter reales se conocen como lexema.  Diagramas de transición :.Problema del análisis lexicográfico Podemos describir el problema del análisis lexicográfico como: Dada una cadena de caracteres. .  Gramáticas lineales:. Existen tres formalismo o modelos comunes para la descripción de los tipos de tokens:  Expresiones regulares:. divídase en una cadena de tokens: Tokens=( tipo. Funciones del Analizador Léxico .5.1. Tiene como finalidad verificar la membresía de un conjunto de caracteres. Las implementaciones de estas utilidades dependen del lenguaje en que se haya escrito al analizador lexicográfico. Prueba de predicado: . Por ejemplo: Esletra ( x ) : “A” <= x y x <= “Z” El predicado Esletra aquí prueba sólo letras mayúsculas ( y presume que todas las mayúsculas están codificadas en forma consecutivas ). También procesa directivas de control del compilador ( como la petición para crear un archivo del listado de un programa ). Para un predicado su objetivo es regresar un valor de verdadero siempre que se cumplan la condición establecida por el. Existen tres funciones principales para un analizador lexicográfico a medida que va hallando tokens: Utilidades de caracteres y manejo de línea:. introduce información preliminar ( como los nombres definidos por el usuario) en tablas y formatos y lista el programa.Se establece un programa mediante un formato uniforme y compacto. .Funciones principales de los analizadores lexicográfico. el analizador lexicográfico puede eliminar información innecesaria como los comentarios. podríamos tener que convertir la secuencia de caracteres a un número. podemos necesitar una acción para cada carácter rastreado.En general. hay una acción para cada tipo de token. Por ejemplo: Cuando se rastrean los dígitos en un número. . En algunos casos.Acciones : . patrones y lexemas .2.5. Componentes léxico. además de que un componente léxico puede tener uno o varios lexemas.  Patrón es una regla que genera la secuencia de caracteres que puede representar a un determinado componente léxico (expresión regular). los términos componentes léxicos (token).  Lexema es una cadena de caracteres que concuerda con un patrón que describe un componente léxico (valor de cadena). palabra reservada. Un analizador léxico.  Componente léxico es la secuencia lógica y coherente de caracteres relativo a una categoría: identificador. operador o carácter de puntuación. patrón y lexema se emplean con significados específicos. inicialmente lee los lexemas y le asigna un significado propio. .En la fase de análisis. literales (cadena/numérica). 1416. Lexemas Componentes léxico Patrón const const Const = Relacion <o<=o= o <> o > o >= pi Identificador Letra seguida de letras o números 3.Ejemplo de una cadena de código: const pi = 3.1416 numero Cualquier literal numerica “hola mundo” literal Caracteres entre comillas . En la practica los componentes léxicos suelen tener solo un atributo. puede considerarse tanto el lexema para un identificador como el numero de línea en el que se encontró por primera vez. apuntador al símbolo C> <op_exponente> <numero. y los atributos.El analizador léxico recoge información sobre los componentes léxicos en sus atributos asociados. atributo valor 2> . Esta información puede ser almacenada en la tabla de símbolos para el identificador (estructura de datos). Para la cadena E=M*C**2 de ejemplo. atributo para el símbolo M> <op_multiplica> <identificador. en la traducción de los tokens. los componentes léxicos y los valores de atributo asociado son: <identificador. Los tokens influyen en las decisiones del análisis sintáctico. Para efectos de diagnostico. atributo para el símbolo E> <op_asignacion> <identificador. Tome en cuenta que ciertas parejas no necesitan un valor de atributo. Los atributos relacionados con ese token deberán ser conservados y transferidos a alguna estructura de datos para que sean empleados en las siguientes etapas del análisis . Diagrama de transición. Los diagramas de transición describen las acciones necesarias para reconocer un token. . Y estos se construyen mediante los siguientes símbolos: Símbolo Descripción Un circulo simple representa a los nodos y estos a su vez se denominan “ estados “. un diagrama de transición es una gráfica dirigida con arcos etiquetados. Un flecha representa a los arcos que van etiquetados con caracteres de entrada que indican “ Caracteres entrada” que pueden presentarse antes y después de cada estado. Un circulo doble representa un estado final o de aceptación. Formalmente. Por ejemplo: Este diagrama de transición permite detectar un identificador ( nombre de las variables ) se describe con una letra seguida por un número arbitrario de letras o dígitos. Letra ó dígito Letra 1 No es letra 4 2 3 No es letra o dígito .Siguiendo un diagrama de transición desde un estado inicial hasta un estado final se confirma que los caracteres en el token corresponden exactamente para los que el diagrama de transición fue diseñado. $ 0 $ 1 $ 2 . Los diagramas de transición son una instrumentación de un modelo formal denominado autómatas finitos. Letra ó dígito.Autómatas finitos. Determinísticos (DFA. Ejemplo : Autómata finito no determinístico. Determinísticos mínimos. conocidos también como maquinas de estado finito o ( con menos frecuencia en la actualidad) máquinas secuenciales. Los autómatas finitos vienen diferentes tipos: No determinísticos (NFA. por su siglas en ingles). por la misma razón ). reales y científicos. Dígito q0 ε|+|- q1 Dígito q2 .Ejemplo : Automáta finito determinístico.( parte de un analizador léxico). Dígito Dígito q3 Dígito E|e q4 E|e q5 ε|+|- q6 Dígito q7 . Letra ó dígito 3 Letra ó dígito $ 0 1 Letra ó dígito $ 2 $ Ejemplo: Este automáta finito permite definir datos numéricos como son: enteros. -Creacion de Tablas de tokens .5.3. Tablas de Símbolos. . Es una estructura de datos que contiene un registro por cada identificador. cuando se conoce más información acerca del símbolo. se producen cambios en la tabla. Si se descubre un nombre nuevo o nueva información sobre un nombre ya existente. con los campos para los atributos del identificador. La estructura de datos permite encontrar rápidamente el registro de cada identificador y almacenar o consultar rápidamente datos de ese registro. Muchos compiladores establecen una tabla en el momento del análisis lexicográfico y la llena con la información del último símbolo durante el análisis semántico. Se examina la tabla de símbolos cada vez que se encuentra un nombre en el texto fuente. Operaciones de la tabla de símbolos. Las propiedades de estás operaciones son dictadas por las reglas del lenguaje de programación que se está traduciendo.Es necesaria para eliminar la información proporcionada por una declaración cuando está ya no se aplica. Operación Eliminación:. la información que se necesita almacenar en la tabla símbolo está función de la estructura y propósito de las declaraciones. Las principales operaciones de las tablas de símbolos son : Operación Inserción : . . En particular. Operación Búsqueda:Es necesaria para recuperar la información asociada con un nombre cuando éste se utiliza en el código asociado.Se utiliza para almacenar la información proporcionada por las declaraciones de nombre cuando se procesan estas declaraciones. Atributos de símbolos. Con frecuencia. Éstos son valores para un atributo llamado “clase” de símbolo. un registro. . un parámetro. como la mayoría los tiene. no todos los lenguajes tienen todas estas posibilidades o pueden describirse empleando otros términos. Los atributos son independientes del lenguaje. pero podría incluir los caracteres en el nombre. un tipo. por nombrar sólo unas cuantas posibilidades. un arreglo. La clase y los atributos relacionados. una etiqueta o un archivo. así como las líneas donde se hace referencia al símbolo. Si el lenguaje contiene ámbitos. Un nombre en un programa puede representar una variable. entonces el ámbito se introduce con frecuencia en la tabla de símbolos. un procedimiento o función. su tipo. el número de línea donde se declara el nombre que se registra. una constante. e inclusive información de asignación de almacenamiento tal como cuántos bytes ocupara el valor. un campo de registro. Por supuesto. representado quizás el número. Los lenguajes orientados a objetos. porque los nombre a menudo heredan operaciones desde la superclases que las contienen. . nombres de clase y objeto. Atributos especiales. El ámbito del nombre se limita al bloque o procedimiento en el que se defina. por ejemplo. El ámbito es de particular importancia en los lenguajes orientados a objetos.Atributo de ámbito. un nombre puede redefinirse para ser de una clase diferente. así como los tipos usuales. Un problema semejante ocurre cuando procedimientos o paquetes son anidados redefinen un nombre. Una técnica alternativa es tener una tabla de símbolos por separada para cada ámbito. es entonces un atributo para el nombre. Los lenguaje de propósito específicos a menudo tienen nombres especiales. El ámbito. pueden tener nombres de métodos. es decir. Los lenguajes estructurados en bloques permiten de declaraciones. .. 1 Ejemplo de un programa que será empleado para construir su tabla de símbolo.b 3 PROCEDIMIENTO P (PARAMETRO x ) 4 LOCAL a 5 COMIENZA { P } 6 …..b…… 8 …. PROGRAMA Principal 2 Global a. 9 TERMINA { P } 10 11 12 COMIENZA { PRINCIPAL } Llama P (a) TERMINA { PRINCIPAL } . el número de línea en el programa fuente donde este nombre se declara y los números de línea donde ocurren las referencias. Otros atributos para nombres incluyen los caracteres reales en el identificador del nombre.a…… 7 ….x…..Otros atributos. Otros atributos Caracteres Principal Clase Ámbito Declaración Referencia Programa 0 Línea 1 a Variable 0 Línea 2 Línea 11 b Variable 0 Línea 2 Línea 7 P Procedimiento 0 Línea 3 Línea 11 x Parámetro 1 Línea 3 Línea 8 a Variable 1 Línea 4 Línea 6 otros 1 parámetro.Tabla de símbolo obtenida del programa anterior. x . 5.4.-Errores léxico . Es más. y un buen compilador deberá ayudar al programador a identificar y localizar errores. Los programadores a menudo escriben programas incorrectos. La mitad del espacio ocupado por el código de muchos compiladores se dedica al manejo de errores. Existen realmente cuatro facetas del manejo de errores :     Creación de errores. Recuperación de errores. considerar desde el principio el manejo de errores puede simplificar la estructura de un compilador y mejorar su respuesta a los errores. informe y recuperación de errores son mucho más notorios para el usuario promedio que la rapidez de un compilador o la rapidez del código emitido. La detección.Manejo de errores. Detección de errores. . Informe de errores. // esta es una variable de tipo entero. Por ejemplo: int x=0 . EL diseño de un lenguaje afecta la clase de errores que pueden ocurrir. . entonces todo el resto del programa será parte de la cadena de caracteres. De nueva cuenta esto es un error muy fácil de cometer. println (“Escribe la cadena “+ cad ). out.  Estos probablemente fueron cometidos por un programador al agregar comentarios después de que el programa se había escrito. float y=0.Creación de errores. Por ejemplo: String cad= “ Si no cierra las comillas. y es la manera más fácil de cometer los errores. System.0F . esta es una variable de tipo flotante.  Cuando un programador no completó entre comillas la cadena definida y se dirigió a una nueva línea. qué error es. ¿ Debería emitirse un mensaje de error todo el tiempo que se utiliza una variable no declarada ? . Cuando se llama al manejador. la palabra reservada inicial está mal escrita. tanto como sea posible. Más formalmente los mensajes de error deberían informar la fuente del error y parametrizar el mensaje. un mensaje de error debería informar al usuario dónde se encuentra el error y. Tipo y Valor. . Por ejemplo: En línea 2. Fuente Parámetros Un manejador de errores se puede escribir en una forma modular cuando contiene una pequeño número de esquemas tal como En Fuente Tipo Valor está mal escrita. Con el fin de ser útil. los valores reales se sustituyen por las plantillas Fuente.Informe de errores. Otra cuestión del informe de errores es si se continúa informando apariciones repetidas del mismo error. . La recuperación es algo heurístico. a menudo. proporciona una firme pista acerca de cómo resolverlo. o ignore otros errores que se encontraban ahí.Detección y recuperación de errores. Una recuperación de error simple es saltarse al final de la construcción actual. o al principio de la siguiente. Por ejemplo:  Como palabras reservadas extraviadas. La detección y la recuperación de errores son temas combinados en el que la detección de un error.  Delimitadores olvidados como los signos de punto y coma.  Los nombres de variables no declaradas. en el sentido de que es muy difícil asegurar que la “corrección” no informe de errores espurios ( los que no estaban allí ). la recuperación de errores intenta reparar el error lo suficiente para continuar con el análisis ( y quizá hallar más errores). La detección de errores encuentra el error. Un buen compilador debe hacerse siempre teniendo también en mente los errores que se puede producir. como un operador aplicado a un operador  Lógicos. puede ser una llamada infinitamente recursiva. con ello se consigue:  Simplificar la estructura del compilador.Los errores en la programación pueden ser de los siguientes tipos:  Léxicos. producidos al escribir mal un identificador. incompatible. .  Semánticos. por una expresión aritméticas o paréntesis no equilibrados.  Sintáctico.  Mejorar la respuesta ante los errores. una palabra clave o un operador. 5.5.-Generadores de analizadores léxicos . 5.-Aplicaciones ( Casos de estudios) .6.
Copyright © 2024 DOKUMEN.SITE Inc.