Trabajo

March 28, 2018 | Author: Mario Adrian Nilo Olmos | Category: Compiler, Theoretical Computer Science, Formalism (Deductive), Computer Programming, Physics & Mathematics


Comments



Description

INSTITUTO TECNOLÓGICO DE LEONNOMBRE: MARIO ADRIÁN NILO OLMOS MATERIA: LENGUAJES Y AUTOMATAS 1 PROFESOR: JOSÉ ARTURO AZCORRA VILLALOBOS MAQUINA DE TURING Una máquina de Turing es un dispositivo que manipula símbolos sobre una tira de cinta de acuerdo a una tabla de reglas. A pesar de su simplicidad, una máquina de Turing puede ser adaptada para simular la lógica de cualquier algoritmo de computador y es particularmente útil en la explicación de las funciones de un CPU dentro de un computador. La máquina de Turing fue descrita por Alan Turing como una «máquina automática» en 1936 en la revista Proceedings of the London Mathematical Society, La máquina de Turing no está diseñada como una tecnología de computación práctica, sino como un dispositivo hipotético que representa una máquina de computación. Las máquinas de Turing ayudan a los científicos a entender los límites del cálculo mecánico. Turing dio una definición sucinta del experimento en su ensayo de 1948, «Máquinas inteligentes». Refiriéndose a su publicación de 1936, Turing escribió que la máquina de Turing, aquí llamada una máquina de computación lógica, consistía en: ...una ilimitada capacidad de memoria obtenida en la forma de una cinta infinita marcada con cuadrados, en cada uno de los cuales podría imprimirse un símbolo. En cualquier momento hay un símbolo en la máquina; llamado el símbolo leído. La máquina puede alterar el símbolo leído y su comportamiento está en parte determinado por ese símbolo, pero los símbolos en otros lugares de la cinta no afectan el comportamiento de la máquina. Sin embargo, la cinta se puede mover hacia adelante y hacia atrás a través de la máquina, siendo esto una de las operaciones elementales de la máquina. Por lo tanto cualquier símbolo en la cinta puede tener finalmente una oportunidad. (Turing 1948, p. 61) Una máquina de Turing que es capaz de simular cualquier otra máquina de Turing es llamada una máquina universal de Turing (UTM, o simplemente una máquina universal). Una definición más matemáticamente orientada, con una similar naturaleza "universal", fue presentada por Alonzo Church, cuyo trabajo sobre el cálculo lambda se entrelaza con el de Turing en una formal teoría de la computación conocida como la tesis de Church-Turing. La tesis señala que las máquinas de Turing de hecho capturan la noción informal de un método eficaz en la lógica y las matemáticas y proporcionan una precisa definición de un algoritmo o 'procedimiento mecánico'. DEFINICIÓN FORMAL Una máquina de Turing es un modelo computacional que realiza una lectura/escritura de manera automática sobre una entrada llamada cinta, generando una salida en esta misma. Este modelo está formado por un alfabeto de entrada y uno de salida, un símbolo especial llamado blanco (normalmente b, o 0), un conjunto de estados finitos y un conjunto de transiciones entre dichos estados. Su funcionamiento se basa en una función de transición, que recibe un estado inicial y una cadena de caracteres (la cinta, la cual puede ser infinita) pertenecientes al alfabeto de entrada. La máquina va leyendo una celda de la cinta en cada paso, borrando el símbolo en el que se encuentra posicionado su cabezal y escribiendo un nuevo símbolo perteneciente al alfabeto de salida, para luego desplazar el cabezal a la izquierda o a la derecha (solo una celda a la vez). Esto se repite según se indique en la función de transición, para finalmente detenerse en un estado final o de aceptación, representando así la salida. Una máquina de Turing con una sola cinta puede definirse como una 7-tupla donde:  es un conjunto finito de estados.  es un conjunto finito de símbolos distinto del espacio en blanco, denominado alfabeto de máquina o de entrada.  es un conjunto finito de símbolos de cinta, denominado alfabeto de cinta ( ).  es el estado inicial.  es un símbolo denominado blanco, y es el único símbolo que se puede repetir un número infinito de veces.  es el conjunto de estados finales de aceptación.  es una función parcial denominada función de transición, donde es un movimiento a la izquierda y es el movimiento a la derecha. Existen en la literatura un abundante número de definiciones alternativas, pero todas ellas tienen el mismo poder computacional, por ejemplo se puede añadir el símbolo como símbolo de "no movimiento" en un paso de cómputo. ¿CÓMO FUNCIONA? La máquina de Turing consta de un cabezal lector/escritor y una cinta infinita en la que el cabezal lee el contenido, borra el contenido anterior y escribe un nuevo valor. Las operaciones que se pueden realizar en esta máquina se limitan a:  Mover el cabezal lector/escritor hacia la derecha. Visualización de una máquina de Turing, en la que se ve el cabezal y la cinta que se lee.  Mover el cabezal lector/escritor hacia la izquierda. El cómputo se determina a partir de una tabla de estados de la forma: (estado, valor) (nuevo estado, nuevo valor, dirección) Esta tabla toma como parámetros el estado actual de la máquina y el carácter leído de la cinta, dando la dirección para mover el cabezal, el nuevo estado de la máquina y el valor a escribir en la cinta. La memoria es la cinta de la máquina que se divide en espacios de trabajo denominados celdas, donde se pueden escribir y leer símbolos. Inicialmente todas las celdas contienen un símbolo especial denominado "blanco". Las instrucciones que determinan el funcionamiento de la máquina tienen la forma, "si estamos en el estado x leyendo la posición y, donde hay escrito el símbolo z, entonces este símbolo debe ser reemplazado por este otro símbolo, y pasar a leer la celda siguiente, bien a la izquierda o bien a la derecha". La máquina de Turing puede considerarse como un autómata capaz de reconocer lenguajes formales. En ese sentido, es capaz de reconocer los lenguajes recursivamente enumerables, de acuerdo a la jerarquía de Chomsky. Su potencia es, por tanto, superior a otros tipos de autómatas, como el autómata finito, o elautómata con pila, o igual a otros modelos con la misma potencia computacional. DIAGRAMA DE ESTADOS Las máquinas de Turing pueden representarse mediante grafos particulares, también llamados diagramas de estados finitos, de la siguiente manera: Esta máquina de Turing está definida sobre el alfabeto , posee el conjunto de estados , con las transiciones que se pueden ver. Su estado inicial es y el estado final es , el lenguaje de salida siendo el símbolo denominado "blanco". Esta máquina reconoce la expresión regular de la forma con .  Los estados se representan como vértices, etiquetados con su nombre en el interior.  Una transición desde un estado a otro, se representa mediante una arista dirigida que une a estos vértices, y está rotulada por símbolo que lee el cabezal/símbolo que escribirá el cabezal, movimiento del cabezal.  El estado inicial se caracteriza por tener una arista que llega a él y que no proviene de ningún otro vértice.  El o los estados finales se representan mediante vértices que están encerrados a su vez por otra circunferencia. LENGUAJES ACEPTADOS POR LA MÁQUINA DE TURING De acuerdo a la clasificación de los lenguajes formales realizada por el norteamericano Avram Chomsky, la Máquina de Turing acepta los lenguajes más generales, o tipo cero (0), también llamados lenguajes recursivamente enumerables. Un lenguaje recursivamente enumerable es un lenguaje formal para el cual existe una máquina de Turing que acepta y se detiene con cualquier cadena del lenguaje, pero que puede parar y rechazar, o bien iterar indefinidamente, con una cadena que no pertenece al lenguaje. Todos los lenguajes, regulares, independientes de contexto, dependientes de contexto y recursivos son recursivamente enumerables. Una cadena ω∈A^*, es aceptada por una MT, si comienza en el estado e0, con la cabeza de lectura/escritura en el símbolo más a la izquierda, luego de leer toda la cadena ω, llega a un estado e_f∈F. El lenguaje aceptado por MT, es el conjunto de todas las cadenas que son aceptadas por MT: L(MT)={ω / e_0 ω ⊢*α_1 e_f α_2 y e_f∈F y α_1,α_1 ∈C^* y ω∈A^* } UNIDAD 5 ANÁLISIS LÉXICO El analizador léxico es la primera fase de un compilador. Su principal función consiste en leer los caracteres de entrada y elaborar como salida una secuencia de componentes léxicos que utiliza el analizador sintáctico para hacer el análisis. Como el analizador léxico es la parte del compilador que lee el texto fuente, también puede realizar ciertas funciones secundarias en la interfaz del usuario, como eliminar del programa fuente comentarios y espacios en blanco en forma de caracteres de espacio en blanco, caracteres TAB y de línea nueva. Otra función es relacionar los mensajes de error del compilador con el programa fuente. En algunas ocasiones, los analizadores léxicos se dividen en una cascada de dos fases; la primera, llamada "examen", y la segunda, "análisis léxico". El examinador se encarga de realizar tares sencillas, mientras que el analizador léxico es el que realiza las operaciones complejas. COMPONENTE LÉXICO (TOKEN) Son las unidades lógicas que genera el analizador léxico. Formar caracteres entokens es muy parecido a formar palabras en un lenguaje natural. Es el conjunto de cadenas de entrada que produce como salida el mismo componente léxico. Cada token es una secuencia de caracteres que representa una unidad de información en el programa fuente. Los componentes léxicos más comunes son los siguientes: palabras clave o reservadas - operadores aritméticos - operadores relacionales -operadores lógicos -operador de asignación -identificadores -constantes -cadenas -literales -signos de puntuación -librerías LEXEMA Representan cadenas de caracteres en el programa fuente que se pueden tratar juntos como una unidad léxica. Un lexema es una secuencia de caracteres en el programa fuente con la que concuerda el patrón para un componente léxico. PATRÓN Regla que describe el conjunto de lexemas que pueden representar a un determinado componente léxico en los programas fuente. En otras palabras, es la descripción del componente léxico mediante una regla. ATRIBUTOS DE LOS COMPONENTES LÉXICOS El analizador léxico recoge información sobre los componentes léxicos en sus atributos asociados. Los componentes léxicos influyen en las decisiones del análisis sintáctico y los atributos en la traducción de los componentes léxicos: - Apuntador a la entrada de la Tabla de símbolos donde se guarda la información sobre el componente léxico. - El lexema para un identificador - El número de línea en que se encontró por primera vez. CREACIÓN DE TABLA DE TOKENS. Tabla: conjunto de pares clave-valor, llamados elementos de la tabla. La tabla de símbolos 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 búsqueda en la tabla para obtener la información asociada (el valor).  Búsqueda: dada la clave de un elemento, encontrar su valor.  Inserción: Dado un par clave-valor, añadir 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 búsqueda (o tiempo de acceso) De una clave: Li = número de comparaciones con elementos de la tabla para encontrar esa clave. Máxima: LM = número máximo de comparaciones para encontrar cualquier clave. Media (esperada): Lm = número 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 ocupación: s = n/N donde n=número de elementos en la tabla y N=capacidad máxima de la tabla. Función de búsqueda: B : K→E asocia a cada clave k un elemento B(k). Valor asociado a una clave k: v(B(k)). Puede ser múltiple, en cuyo caso normalmente se convierte en un puntero. Si está en la tabla puede almacenarse consecutivamente o en subtablas paralelas. Tablas de símbolos (identificadores) La clave es el identificador. El valor está formado por: Atributos del identificador. Puntero a la posición 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 implícita. 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 Inserción: en el primer lugar vacío. Erroresléxicos El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores,...) se han escrito correctamente. Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, y estos métodos son principalmente las expresiones regulares y los autómatas finitos. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible. Son pocos los errores simplemente en el nivel léxico ya que tiene una visión muy restringida de un programa fuente. El analizador léxico debe devolver el componente léxico de un identificador y dejar a otra fase se ocupe de los errores. Suponga que una situación en la cual el analizador léxico no puede continuar porque ninguno de los patrones concuerda con un prefijo de la entrada. Tal vez la estrategia de recuperación más sencilla sea recuperación “EN MODO PANICO” (este método de recuperación es donde se borra caracteres sucesivos de la entrada hasta que el analizador léxico pueda encontrar un componente léxico bien formado). ¡¡Los programas no siempre son correctos!! El compilador tiene que: 1. Reportar clara y exactamente la presencia de errores 2. Recuperarse de cada error lo suficientemente rápido para poder detectar errores subsiguientes: ERRORES LÉXICOS El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores,...) se han escrito correctamente. Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, y estos métodos son principalmente las expresiones regulares y los autómatas finitos. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible. Son pocos los errores simplemente en el nivel léxico ya que tiene una visión muy restringida de un programa fuente. El analizador léxico debe devolver el componente léxico de un identificador y dejar a otra fase se ocupe de los errores. Suponga que una situación en la cual el analizador léxico no puede continuar porque ninguno de los patrones concuerda con un prefijo de la entrada. Tal vez la estrategia de recuperación más sencilla sea recuperación “EN MODO PANICO” (este método de recuperación es donde se borra caracteres sucesivos de la entrada hasta que el analizador léxico pueda encontrar un componente léxico 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 rápido para poder detectar errores subsiguientes: Tratar de evitar mensajes falsos de error Un error que produce un token erróneo Errores léxicos posibles Un token o componente léxico es una cadena de caracteres que tiene un significado coherente en cierto lenguaje de programación. Ejemplos de tokens, podrían ser palabras clave (if, while, int), identificadores, números, signos, o un operador de varios caracteres. Son los elementos más básicos sobre los cuales se desarrolla toda traducción de un programa, surgen en la primera fase, llamada análisisléxico. Un token o componente léxico es una cadena de caracteres que tiene un significado coherente en cierto lenguaje de programación. Ejemplos de tokens, podrían ser palabras clave (if, while, int), identificadores, números, signos, o un operador de varios caracteres. Son los elementos más básicos sobre los cuales se desarrolla toda traducción de un programa, surgen en la primera fase, llamada análisis léxico. EL GENERADOR DE ANALIZADORES LÉXICOS LEX Es una herramienta conocida como Lex o Flex, la cual nos permite especificar un analizador léxico mediante la especificación de expresiones regulares para describir patrones de los tokens. La notación 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 transición y genera código en un archivo llamado lex.yy.c que simula el diagrama de transición. USO DE LEX Se crea un archivo de entrada con extensión “.l”, que describe el analizador léxico que se va a generar. El programa de salida en un analizador léxico 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. También podemos agregar definiciones de manera explícita en el código generado escribiendo lo que deseamos agregar en medio de “%{ %}”, como por ejemplo %{ #define DIGITO 265 %}. * Reglas de traducción: Están dadas de la forma “Patrón {Acción}”, cada patrón es una expresión regular, la cual puede usar declaraciones regulares de la sección de declaraciones. las acciones son fragmentos de código, escritos en C. * Funciones auxiliares: contiene las funciones adicionales que se utilizan en las acciones.
Copyright © 2024 DOKUMEN.SITE Inc.