Lenguajes Y Automatas

43
UNIDAD 1 INTRODUCCIÓN A LA TEORÍA DE LENGUAJES FORMALES. 1.1 ALFABETO Un alfabeto es un conjunto finito y no vacío de elementos llamados símbolos o letras. Una palabra o cadena sobre un alfabeto V es una cadena finita de símbolos del alfabeto. Notaciones: - |ω| denota la longitud de la cadena ω. - λ denota a una cadena de longitud 0, también conocida como palabra vacía. - Vn denota al conjunto de todas las palabras de longitud n sobre V - V0 denota al conjunto cuyo único elemento es la palabra vacía, es decir, V0 = {λ}. - Vdenota al conjunto de todas las cadenas de cualquier longitud sobre V. - V+ denota al conjunto de todas las cadenas de cualquier longitud sobre V, excepto la vacía. - Un elemento de Vn es una cadena del tipo a1a2... an donde cada ai ∈ V. 1.2 CADENAS. Las principales ideas matemáticas necesarias para la compresión a la Teoría de Autómatas son conceptos que incluyen grafos, árboles, conjuntos, relaciones, cadenas, lenguajes abstractos e inducción matemática. Un "símbolo" es una entidad abstracta. Las letras y los dígitos son ejemplos de símbolos usados con frecuencia. Una cadena (o palabra) es una secuencia finita de símbolos Yuxtapuestos. Por ejemplo a, b y c son símbolos y casa es una cadena. La longitud de una cadena w que se denota como |w|, es el número de símbolos que componen la cadena. Por ejemplo casa tiene una longitud. Habitualmente, se emplean las letras minúsculas del principio del alfabeto (o dígitos) para designar a los símbolos y las letras minúsculas del final del alfabeto, normalmente w, x, y y z, para designar cadenas. La cadena vacía, denotada por E es aquella que presenta cero apariciones de símbolos, es una cadena que puede construirse en cualquier alfabeto. La concatenación de dos cadenas es la cadena que se forma al escribir la primera seguida de la segunda, sin que haya espacio entre ellas, Por ejemplo la concatenación de padre y madre es padremadre. La yuxtaposición se utiliza como el operador de concatenación. Esto es si w y x son cadenas, entonces wx es la concatenación de estas dos cadenas. La cadena vacía es la identidad para el operador de concatenación, es decir Ew=wE para cada cadena de w.

description

lenguajes y automatas

Transcript of Lenguajes Y Automatas

Page 1: Lenguajes Y Automatas

UNIDAD 1 INTRODUCCIÓN A LA TEORÍA DE LENGUAJES FORMALES.

1.1 ALFABETO

Un alfabeto es un conjunto finito y no vacío de elementos llamados símbolos o letras.

Una palabra o cadena sobre un alfabeto V es una cadena finita de símbolos del alfabeto.

Notaciones:- |ω| denota la longitud de la cadena ω.- λ denota a una cadena de longitud 0, también conocida como palabra vacía.- Vn denota al conjunto de todas las palabras de longitud n sobre V- V0 denota al conjunto cuyo único elemento es la palabra vacía, es decir, V0 = {λ}.- V∗ denota al conjunto de todas las cadenas de cualquier longitud sobre V.- V+ denota al conjunto de todas las cadenas de cualquier longitud sobre V, excepto la vacía.- Un elemento de Vn es una cadena del tipo a1a2... an donde cada ai ∈ V.

1.2 CADENAS.

Las principales ideas matemáticas necesarias para la compresión a la Teoría de Autómatas son conceptos que incluyen grafos, árboles, conjuntos, relaciones, cadenas, lenguajes abstractos e inducción matemática. Un "símbolo" es una entidad abstracta. Las letras y los dígitos son ejemplos de símbolos usados con frecuencia. Una cadena (o palabra) es una secuencia finita de símbolos Yuxtapuestos. Por ejemplo a, b y c son símbolos y casa es una cadena. La longitud de una cadena w que se denota como |w|, es el número de símbolos que componen la cadena.

Por ejemplo casa tiene una longitud.

Habitualmente, se emplean las letras minúsculas del principio del alfabeto (o dígitos) para designar a los símbolos y las letras minúsculas del final del alfabeto, normalmente w, x, y y z, para designar cadenas.

La cadena vacía, denotada por E es aquella que presenta cero apariciones de símbolos, es una cadena que puede construirse en cualquier alfabeto.

La concatenación de dos cadenas es la cadena que se forma al escribir la primera seguida de la segunda, sin que haya espacio entre ellas, Por ejemplo la concatenación de padre y madre es padremadre. La yuxtaposición se utiliza como el operador de concatenación. Esto es si w y x son cadenas, entonces wx es la concatenación de estas dos cadenas. La cadena vacía es la identidad para el operador de concatenación, es decir Ew=wE para cada cadena de w.

Un alfabeto es un conjunto de símbolos finito y no vacío. Convencionalmente se utiliza el símbolo S para designar un alfabeto.

Un lenguaje es un conjunto de cadenas, todas ellas seleccionadas de un S* donde S es un determinado alfabeto

El conjunto vacío Ø y el conjunto formado por la cadena vacía {E} son lenguajes.

El conjunto de palíndromos (cadenas que se leen igual de izquierda a derecha y viceversa) sobre el alfabeto {0,1} es un lenguaje infinito. Algunos elementos de este lenguaje son E 0,1,00,01,010, y 1101011.

Por consiguiente vemos que el conjunto de todos los palíndromos sobre una colección finita de símbolos no es, técnicamente hablando, un lenguaje, porque sus cadenas no se construyen colectivamente a partir de un alfabeto.

Otro lenguaje es el conjunto de cadenas sobre un alfabeto fijo S Denotamos a este lenguaje como S*

Page 2: Lenguajes Y Automatas

Por ejemplo:

SiS={a},entoncesS*={E,a,aa,aaa,...}.SiS={0,1},entoncesS*={E,0,1,00,01,10,11,000,...}SiS={a},entoncesS*={E,a,aa,aaa,...}.SiS={0,1},entoncesS*={E,0,1,00,01,10,11,000,...}

Como comentamos anteriormente el asterisco (*) representa cualquier número de apariciones de la expresión anterior.

En la teoría de autómatas, un problema es la cuestión de decidir si una determinada cadena es un elemento de un determinado lenguaje. Cualquier cosa que coloquialmente denominamos "problema" podemos expresarlo como lenguaje. De manera precisa, si S es un alfabeto y L es un lenguaje de S, entonces el problema de L es:

Data una cadena w de S*, decidir si w pertenece o no a L

1.3 LENGUAJES

En matemáticas, lógica, y las ciencias computacionales, un lenguaje formal es un conjunto de palabras (cadenas de caracteres) de longitud finita formadas a partir de un alfabeto (conjunto de caracteres) finito. Informalmente, el término lenguaje formal se utiliza en muchos contextos (en las ciencias, en derecho, etc.) para referirse a un modo de expresión más cuidadoso y preciso que el habla cotidiana. Hasta finales de la década de 1990, el consenso general era que un lenguaje formal, era en cierto modo la versión «límite» de este uso antes mencionado: un lenguaje tan formalizado que podía ser usado en forma escrita para describir métodos computacionales. Sin embargo, hoy en día, el punto de vista de que la naturaleza esencial de los lenguajes naturales (sin importar su grado de «formalidad» en el sentido informal antes descrito) difiere de manera importante de aquella de los verdaderos lenguajes formales, gana cada vez más adeptos.

1.4 TIPOS DE LENGUAJES

Llamamos lenguaje sobre el alfabeto V a cualquier subconjunto de V.

Especificación de lenguajes:

Extensión (lenguajes finitos)

L = fa; aa; aaages un lenguaje sobre el alfabeto V = fagL = faba; cab; aaabcges un lenguaje sobre el alfabeto V = fa; b; cg

Comprensión (lenguajes infinitos)

L = fa(bc)njn>= 1g

Chomsky clasificará los lenguajes formales de acuerdo a una jerarquía de cuatro niveles, conteniendo cada uno de todos los siguientes.

El lenguaje más general será, pues, de tipo 0,y no posee restricción alguna. Este conjunto engloba el conjunto de todos los lenguajes posibles.

En el segundo nivel aparecen los lenguajes de tipo1, también llamados lenguajes “sensibles al contexto”, al permitir que el “papel” de las palabras dependa de la posición en que aparezcan(es decir, del contexto).La mayor parte de los lenguajes de ordenador pertenecen a este tipo.

En tercer lugar aparecen los lenguajes de tipo 2, o lenguajes “independientes del contexto”. En ellas el significado de una palabra es independiente del lugar que ocupa en la frase.

Finalmente, los lenguajes de tipo 3, o lenguajes regulares, son los que presentan una estructura más sencilla.

Page 3: Lenguajes Y Automatas

Resulta curioso observar como paralelamente a la jerarquía de lenguajes aparece otra de máquinas abstractas equivalentes, como se observa en el esquema siguiente:

Cada uno de estos tipos de máquinas es capaz de resolver problemas cada vez más complicados, hasta llegar a las máquinas de Turing. Como descubrió Turing, existen una serie de problemas que no son computacionalmente abordables y que reciben el nombre de “problemas no e numerables”.

La relación estrecha entre la Teoría de Lenguajes Formales y la Teoría de Autómatas se pone de manifiesto en este tema. Se establece un isomorfismo entre ambas, estableciendo una conexión entre la clase de lenguajes generados por ciertos tipos de gramáticas y la clase de lenguajes reconocibles por ciertas máquinas.

- Los lenguajes del tipo 0 con los lenguajes reconocidos por una máquina de Turing,- Los lenguajes de tipo 1 con los Autómatas Linealmente Acotados,- Los lenguajes de tipo 2 con los Autómatas a Pila- Los lenguajes de tipo 3 con los Autómatas Finitos, los Autómatas Probabilísticos y los Autómatas de

Células de McCulloch-Pitts.

Cada uno de estos tipos/máquinas añade restricciones al tipo/máquina del nivel superior.

1.5 HERRAMIENTAS COMPUTACIONALES LIGADAS CON LENGUAJES.

Básicamente son las siguientes:

1-Diagramas Funcionales.2-Interpretación de Datos.3-Bases de Datos.4-Algoritmos.5-Seudo-códigos.

1.6 ESTRUCTURA DE UN TRADUCTOR.

¿Qué es un Traductor?

Un traductor es un mediador entre dos entidades: emisoras y receptoras, los mediadores en mascaran la complejidad y heterogeneidad de los lenguajes.

Un traductor convierte un lenguaje de entrada (código fuente) a una de salida (código objeto).

Page 4: Lenguajes Y Automatas

Ensambladores Ensamblador se refiere a un tipo de programa, informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto que contiene código máquina ejecutable directamente por la máquina para la que se ha generado.

- Ejemplos: MASM

Función De Un Ensamblador:

La tarea fundamental de un ensamblador es traducir un programa en lenguaje de ensamblador al código correspondiente en lenguaje de máquina..MOTIVOS PARA USAR ENSAMBLADOR

- Mayor control de la computadora.- Independencia de lenguaje.- La mayoría de las computadoras pueden ensamblar.- Losprogramashechosenlenguajeensambladorsongeneralmentemásrápidosyconsumenmenosrecursosde

lsistema.

MOTIVOS PARA NO UTILIZAR

- Demasiado complejo.- Comprensión más profunda de la computadora.- Errores más frecuentes en el programa.- Mayor tiempo de codificación.- Difícilmente portable, es decir, un código escrito para un microprocesador en particular necesita ser

modificado muchas veces en su totalidad para poder ser usado en otro microprocesador.

Tipos de Ensambladores

ENSAMBLADORESCRUZADOS: Se denominan así a los ensambladores que se utilizan en una computadora que posee el procesador diferente al que tendrán las computadoras donde se va a ejecutar el programa objeto producido.

ENSAMBLADORESRESIDENTES: Son aquellas que permanecen en la memoria principal de la computadora y cargar para su ejecución al programa objeto producido.

MICROENSAMBLADORES: Al programa que indica al intérprete de instrucciones de la CPU como debe actuar se le denomina microprograma. El programa que ayuda a realizar este microprograma se llama micro ensamblador.

MACROENSAMBLADORES: Son ensambladores que permiten el uso de macroinstrucciones.

ENSAMBLADORES DE UNA FASE: leen una línea y la traducen directamente para producir una instrucción de lenguaje maquina o la ejecuta si se trata de una pseudosinstrucción. Se construye la tabla de símbolos a medida que aparecen las definiciones de variables, etiquetas, etc.

ENSAMBLADORES DE DOS FASES: Realiza la traducción en dos etapas: 1°fase leen el programa fuente y construyen la tabla de símbolos, 2°fase vuelve a leer el programa fuente y pueden ir traduciendo totalmente pues reconocen la totalidad de los símbolos.

Compiladores

Un compilador es querer traducir un programa de un lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje máquina).

Page 5: Lenguajes Y Automatas

Los compiladores son programas o herramientas encargadas de compilar. Un compilador toma un texto (código fuente) escrito en un lenguaje de alto nivel y lo traduce a un lenguaje comprensible por las computadoras (código objeto).Interpretes

Un intérprete es un programa capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto nivel. Los intérpretes suelen contraponerse a los compiladores, ya que mientras que los segundos se encargan de traducir un programa desde su descripción en un lenguaje de programación al código máquina del sistema destino, los primeros sólo realizan la traducción a medida que sea necesario y normalmente, no guardan el resultado de dicha traducción.

JavaScript, BASIC, LISP, Smalltalk y Python son ejemplos de lenguajes que son normalmente interpretados en vez de compilados.

El intérprete tiene estas características- Traduce y ejecuta una línea del programa a la vez.- Si hay error, detiene ejecución del programa- Programas más lentos pero más portables y flexibles

1.7 FASES DE UN COMPILADOR.

CLASIFICACIÓN DE COMPILADORES

DEUNAPASADA: Examina el código fuente una vez, generando el código o programa objeto.

PASADASMÚLTIPLES: Requiere pasos intermedios para producir código en otro lenguaje y una pasada final para producir y optimizar el código producido durante pasos anteriores.

COMPILADORESINCREMENTALES: Generan un código objeto, instrucción por instrucción cuando el usuario teclea cada orden individual.

COMPILADORCRUZADO: Se genera código en lenguaje objeto para una maquina diferente a la que se esta utilizando para compilar.

COMPILADORCONMONTADOR: Compila distintos módulos de forma independiente y después es capaz de aplazarlos.

AUTOCOMPILADORES: Compilador que está escrito en el mismo lenguaje que va a compilar.

METACOMPILADOR: Es programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje.

Page 6: Lenguajes Y Automatas

DESCOMPILADOR: Es un programa que acepta como entrada código maquina y la traduce a un lenguaje de alto nivel realizando el proceso inverso a la compilación.

UNIDAD 2 EXPRESIÓNES REGULARES.

2.1 DEFINICIÓN FORMAL DE UNA ER

Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón "H (a|ä|ae) ndel". La mayoría de las formalizaciones proporcionan los siguientes constructores: una expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje.

En informática, las expresiones regulares proveen una manera muy flexible de buscar o reconocer cadenas

Una expresión regular (ER) sobre un alfabeto finito Σ se define recursivamente como sigue:

1. Para todo c ∈ Σ, c es una ER2. Φ es una ER3. Si E1 y E2 son ERs, E1 | E2 es una ER4. Si E1 y E2 son ERs, E1 · E2 es una ER5. Si E1 es una ER, E1 ⋆ es una ER6. Si E1 es una ER, (E1) es una ER

Cuando se lee una expresión regular, hay que saber qué operador debe leerse primero.

Esto se llama precedencia. Por ejemplo, la expresión a | b · c ⋆, ¿debe entenderse como (1) la “⋆” aplicada al resto? (2) ¿la “|” aplicada al resto? (3) ¿la “·” aplicada al resto? La respuesta es que, primero que nada se aplican los “⋆”, segundo los “·”, y finalmente los “|”.

Esto se expresa diciendo que el orden de precedencia es ⋆, ·, |. Los paréntesis sirven para alterar la precedencia. Por ejemplo, la expresión anterior, dado el orden de precedencia que establecimos, es equivalente a a | (b · (c ⋆)). Se puede forzar otro orden de lectura de la ER cambiando los paréntesis, por ejemplo (a | b) · c ⋆.

Asimismo, debe aclararse cómo se lee algo como a|b|c, es decir ¿cuál de los dos “|” se lee primero? Convengamos que en ambos operadores binarios se lee primero el de más a la izquierda (se dice que el operador “asocia a la izquierda”), pero realmente no es importante, por razones que veremos enseguida.

Observar que aún no hemos dicho qué significa una ER, sólo hemos dado su sintaxis pero no su semántica.

2.2 OPERACIONES

Unión o Alternativa: Consideremos dos lenguajes diferentes definidos sobre el mismo alfabeto L1 ⊂ W(∑) y L2 ⊂ W(∑). Se denomina unión de ambos lenguajes al lenguaje formado por las palabras de ambos lenguajes:

L1 U L2={ x | x ∈ L1 ó x ∈ L2}

Concatenación: Consideremos dos lenguajes definidos sobre el mismo alfabeto, L1 y L2. La concatenación o producto de estos lenguajes es el lenguaje L1 L2= { xy / x ∈ L1 y x ∈ L2} Las palabras de este lenguaje estarán formadas al concatenar cada una palabra del primero de los lenguajes con otra del segundo.

La concatenación de lenguajes con el lenguaje vació es ΦL = L Φ = Φ

Potencia de un lenguaje: Se define la potencia i-ésima de un lenguaje a la operación de concatenarlo consigo mismo i veces.

Page 7: Lenguajes Y Automatas

Li= LLL ....L |------------| i

Clausura positiva de un lenguaje: Se define la clausura positiva de un lenguaje L: ∞ L + = U L i i=1

Lenguaje obtenido uniendo el lenguaje con todas sus potencias posibles excepto Lº. Si L no contiene la palabra vacía, la clausura positiva tampoco

Cierre o Clausura de un lenguaje: Se define el cierre o clausura de un lenguaje L como: ∞ L* = U Li i=0

Lenguaje obtenido uniendo el lenguaje con todas sus potencias posibles, incluso Lº. Todas las clausuras contienen la palabra vacía.

Existen tres operaciones básicas que se pueden realizar sobre las ER:

Selección de alternativas: Se indica con el operador |(barra vertical). Si r y s son ER, entonces r | s es una ER que define a cualquier cadena que concuerde con una r o una s, también se dice que r | s , es la unión de los lenguajes de r y s y lo podemos definir: L( r | s ) = L( r ) U L( s ). Esta operación se puede extender a más de dos ER.

Concatenación: Se indica con la yuxtaposición de las ER. Si r y s son ER, entonces rs es una ER que define a cualquier cadena que concuerde con la concatenación de r y s , esta operación la podemos definir: L(rs) = L(r)L(s).Esta operación se puede extender a más de dos ER.

Repetición o Cerradura: También se conoce con el nombre de cerradura de Kleene. Se indica con el operador *. Si r es una ER, entonces r* es una ER que define a las cadenas de caracteres representadas por la concatenación repetida de r en n veces, o sea que lo podemos definir como: L(r*) = L(r)*o también lo podemos definir como la unión infinita de conjuntos r: r* n = r 0 r 1 r 2...r n.

2.3 APLICACIONES EN PROBLEMAS REALES.

Una de las principales aplicaciones de los hermanos Deitel, son las expresiones regulares que facilitan la construcción de un compilador. A menudo se utiliza una expresión regular larga y compleja para validar la sintaxis de un programa. Si el código del programa no concuerda con la expresión regular, el compilador sabe que hay un error de sintaxis dentro del código.

Generalmente convierten la expresión regular a un autómata finito no determinista y después construyen el autómata finito determinista.

Otra aplicación del mismo libro es en los editores de texto. También encontramos a las expresiones regulares en la biología molecular. También hay esfuerzos importantes para tratar de representar cadenas como generadas por expresiones regulares o por lenguajes regulares.

1.- Las expresiones regulares en programación

En el área de la programación las expresiones regulares son un método por medio del cual se pueden realizar búsquedas dentro de cadenas de caracteres. Sin importar si la búsqueda requerida es de dos caracteres en una cadena de 10 o si es necesario encontrar todas las apariciones de un patrón definido de caracteres en un archivo de millones de caracteres, las expresiones regulares proporcionan una solución para el problema. Adicionalmente, un uso derivado de la búsqueda de patrones es la validación de un formato específico en una cadena de caracteres dada, como por ejemplo fechas o identificadores.

Page 8: Lenguajes Y Automatas

Para poder utilizar las expresiones regulares al programar es necesario tener acceso a un motor de búsqueda con la capacidad de utilizarlas. Es posible clasificar los motores disponibles en dos tipos: Motores para el programador y Motores para el usuario final.

Motores para el usuario final

Son programas que permiten realizar búsquedas sobre el contenido de un archivo o sobre un texto extraído y colocado en el programa. Están diseñados para permitir al usuario realizar búsquedas avanzadas usando este mecanismo, sin embargo es necesario aprender a redactar expresiones regulares adecuadas para poder utilizarlos eficientemente. Estos son algunos de los programas disponibles:

Grep: programa de los sistemas operativos Unix/Linux.Sed: programa de los sistemas operativos Unix/Linux que permite la modificación de la salida.PowerGrep: versión de grep para los sistemas operativos Windows.RegexBuddy: ayuda a crear las expresiones regulares en forma interactiva y luego le permite al usuario usarlas y guardarlas.EditPad Pro: permite realizar búsquedas con expresiones regulares sobre archivos y las muestra por medio de código de colores para facilitar su lectura y comprensión.

Motores para el programador

Permiten automatizar el proceso de búsqueda de modo que sea posible utilizarlo muchas veces para un propósito específico. Estas son algunas de las herramientas de programación disponibles que ofrecen motores de búsqueda con soporte a expresiones regulares:

AWK: Forma una parte esencial del lenguaje y por extensión de la herramienta awk de Unix/LinuxJava: existen varias bibliotecas hechas para java que permiten el uso de RegEx, y Sun planea dar soporte a estas desde el SDKJavaScript: a partir de la versión 1.2 (ie4+, ns4+) JavaScript tiene soporte integrado para expresiones regulares.Perl: es el lenguaje que hizo crecer a las expresiones regulares en el ámbito de la programación hasta llegar a lo que son hoy en día.PCRE: biblioteca de ExReg para C, C++ y otros lenguajes que puedan utilizar bibliotecas dll (Visual Basic 6 por ejemplo).PHP: tiene dos tipos diferentes de expresiones regulares disponibles para el programador, aunque la variante POSIX (ereg) va a ser desechada en PHP 6.Python: lenguaje de "scripting" popular con soporte a Expresiones Regulares..Net Framework: provee un conjunto de clases mediante las cuales es posible utilizar expresiones regulares para hacer búsquedas, reemplazar cadenas y validar patrones.

Nota: de las herramientas mencionadas con anterioridad se utilizan el EditPad Pro y el .Net Framework para dar ejemplos, aunque es posible utilizar las expresiones regulares con cualquier combinación de las herramientas mencionadas. Aunque en general las Expresiones Regulares utilizan un lenguaje común en todas las herramientas, las explicaciones prácticas acerca de la utilización de las herramientas y los ejemplos de código deben ser interpretados de forma diferente. También es necesario hacer notar que existen algunos detalles de sintaxis de las expresiones regulares que son propios del .Net Framework que se utilizan en forma diferente en las demás herramientas de programación. Cuando estos casos se den se hará notar en forma explícita para que el lector pueda buscar información respecto a estos detalles en fuentes adicionales. En el futuro se incluirán adicionalmente ejemplos de otras herramientas y lenguajes de programación.

2.- Expresiones regulares como motor de búsqueda.

Las expresiones regulares permiten encontrar porciones específicas de texto dentro de una cadena más grande de caracteres. Así, si es necesario encontrar el texto "lote" en la expresión" el ocelote saltó al lote contiguo" cualquier motor de búsqueda sería capaz de efectuar esta labor. Sin embargo, la mayoría de los motores de búsqueda encontrarían también el fragmento "lote" de la palabra "ocelote", lo cual podría no ser el resultado esperado.

Page 9: Lenguajes Y Automatas

Algunos motores de búsqueda permiten adicionalmente especificar que se desea encontrar solamente palabras completas, solucionando este problema. Las expresiones regulares permiten especificar todas estas opciones adicionales y muchas otras sin necesidad de configurar opciones adicionales, sino utilizando el mismo texto de búsqueda como un lenguaje que permite enviarle al motor de búsqueda exactamente lo que deseamos encontrar en todos los casos, sin necesidad de activar opciones adicionales al realizar la búsqueda.

3.- Expresiones regulares como lenguaje.

Para especificar opciones dentro del texto a buscar se utiliza un lenguaje o convención mediante el cual se le transmite al motor de búsqueda el resultado que se desea obtener. Este lenguaje le da un significado especial a una serie de caracteres. Por lo tanto cuando el motor de búsqueda de expresiones regulares encuentre estos caracteres no los buscará en el texto en forma literal, sino que buscará lo que los caracteres significan. A estos caracteres se les llama algunas veces "meta-caracteres". A continuación se listan los principales meta-caracteres y su función y cómo los interpreta el motor de expresiones regulares.

UNIDAD 3. AUTOMATAS FINITOS.

Partiendo del conocimiento de sus comportamientos, aspectos y características más relevantes de estos autómatas. Los autómatas son esencialmente importantes en las actividades sociales, ya que se encuentran dentro de todo tipo de maquinaria y aplicaciones desarrolladas, donde estas tienen las funcionalidades específicas con las que realizan sus operaciones y actividades; además de sus comportamientos, características y funcionalidad que tienden los autómatas se detallara cómo influyen en la vida social y real de los ser humanos.

Los autómatas finitos, son antes de todos logísticas matemáticas, en las que se realizan operaciones en cada estado de los eventos, estos eventos pueden ser de un solo estado o varios; al tener acciones con estados de dos o más eventos, los autómatas finitos tienden a cambiar de finitos determinísticos a no determinísticos.

Dentro de estas hojas se denotan las esquematizaciones de los nuevos autómatas finitos:

Determinísticos No Determinísticos

Se conocerán su estructuras, funcionalidades y comportamientos entre estos dos tipos de autómatas, dentro de ello se abarcara las conversiones o transformaciones entre estos autómatas.

Como breve definición un autómata finito o máquina de estado finito: es un modelo matemático de un sistema que recibe una cadena constituida por símbolos de un alfabeto y determina si esa cadena pertenece al lenguaje que el autómata reconoce.

En la sección de la MT, se conocerá deforma formal que es una máquina de Turing y sus componentes; además de ello se detallara de forma explícita algunos conceptos sobre su desarrollo y formación.

La máquina de Turing es un dispositivo capaz de establecer los problemas intratables, para conocer si es resolutorio o no. Tales confirmaciones se deben y se detallan de cada proceso u problemas matemáticos de la vida real.

Al igual que los AF la máquina de Turing utiliza estructuras, transiciones y formas de conformación para la representación de los modelos matemáticos, de situación en las que se desea conocer si estos tienen soluciones, ya que un computador no puede definir dicha confirmación, ya que es un proceso tardado.

3.1 DEFINICIÓN FORMAL

Definición 1

El Autómata Finito es la máquina más restrictiva de todas y desde luego que se puede definir como un caso particular de una MT. También podemos verla como un AP sin pila. Obviamente que al sacarle la pila lo único

Page 10: Lenguajes Y Automatas

que queda es la cinta finita de entrada. Este modelo matemático abstracto representa la solución del problema de aceptación de lenguajes de tipo 3 o LR.

Definición 2

Son máquinas formales que se usan para reconocer lenguajes regulares. Lenguajes más sencillos, los lenguajes que son generados por gramáticas regulares.

Con ello se deduce que un autómata finito es; una máquina con un número finito de estados que lee símbolos de una cinta de entrada infinita. El comportamiento de la máquina está determinado únicamente por el estado en que se encuentra y el símbolo en la cinta de entrada. Al leer un símbolo de la cinta de entrada cambia de estado y avanza en la cinta de entrada. Cuando ya no quedan símbolos por leer, se detiene. Aun cuando la cinta es infinita, la cadena que guía el comportamiento del autómata no lo es. Esta cadena puede ser tan larga como se quiera, pero siempre finita.

Definición 3

Un autómata finito tiene un conjunto de estados y su “control” pasa de un estado a otro en respuesta a las “entradas” externas. Una de las diferencias fundamentales entre las clases de autómatas finitos es si dicho control es “determinista”, lo que quiere decir que el autómata no puede encontrarse en más de un estado a un mismo tiempo, o “no determinista”, lo que significa que sí puede estar en varios estados a la vez.

Un autómata finito es un vector de tres elementos M = (I,S,δ, F)donde I es el conjunto finito de entradas, S es el conjunto finito de estados (no vacío), δ es la función de transición de estados y F es el conjunto finito de estados finales (incluidos en S).

Un autómata es una representación gráfica que muestra el proceso de reconocimiento de una cadena de entrada. La simbología utilizada es simple:

Diagrama DescripciónUn círculo representa un estado n, donde n es un número natural o bien una letra, generalmente.

Un arco representa la lectura de un símbolo a en la entrada. Transición entre estados.

Estado de inicio s. Es generalmente 0 (cero)

Estado de aceptación f.

3.2 CLASIFICACIÓN DE AF

Un AF tiene un conjunto de estados y su control se mueve de estado en estado, en respuesta a entradas externas. Estas entradas forman las cadenas a ser analizadas. Los estados de un AF, son de tres tipos: estado inicial, que permite empezar la ejecución del autómata; estados finales o estados “de aceptación” que permiten realizar la salida de aceptación de la cadena de entrada en el caso de que no haya más símbolos en la entrada, y estados intermedios, que son los que permiten pasar del estado inicial a algún estado final.

Los AF se dividen en diversas clases, dependiendo de si su control es “determinista” (lo que significa que el autómata no puede estar en más de un estado simultáneamente) o “no determinista” (lo que significa que el autómata puede estar en varios estados al mismo tiempo).

Los autómatas finitos se pueden clasificar en función del tipo de control como:

Deterministas, el autómata únicamente puede estar en un estado en un momento determinado. No Deterministas, el autómata puede estar en varios estados simultáneamente.

Ambos definen los mismos lenguajes (regulares), sin embargo los No deterministas permiten describir más eficientemente determinados problemas.

n

Page 11: Lenguajes Y Automatas

Para conocer más afondo sobre los autómatas finitos determinísticos y no determinísticos, a continuación se detallara de forma breve cada uno de estos autómatas; ya que es necesario para poder entender y comprender el siguiente tema de conversiones de un autómata finito no determinístico a un autómata finito determinístico.

Definiciones de autómatas finitos no determinísticos y determinísticos.

Autómata finito determinístico (AFD); es aquel que siempre está en un solo estado después de leer cualquier secuencia de entradas; la palabra determinista nos dice que para cada entrada existe un único estado al que el autómata puede llegar partiendo del estado actual; comencemos dando la definición formal. El autómata finito determinista. El término “determinista” hace referencia al hecho de que, para cada entrada, existe un único estado al que el autómata pueda llegar partiendo del estado actual. Un AFD genera un solo tipo de salida: acepta o no una secuencia de símbolos de entrada. Esa aceptación está representada si el autómata se encuentra en algún estado del conjunto F. El comportamiento de un AFD, comienza en el estado inicial (q0), y según se van recibiendo los símbolos de la entrada transita entre los estados (del conjunto Q), de acuerdo a la función de transición f. Si en un determinado momento se encuentra en un estado de aceptación (del conjunto F), reconoce como válida la cadena formada por los símbolos de entrada leídos hasta el momento. Si no, no es aceptada. Fig. 1. AFD. Representación de un autómata finito determinístico

Definición Un Autómata Finito Determinístico (AFD) es una quíntupla: M = (Q;Σ; q 0; f; F ), donde Q Es un conjunto nito no vacío (los elementos de Q son llamados estados) Σ es un conjunto de símbolos de entrada al que llamaremos alfabeto. q1∈ Q, es un estado al que llamaremos estado inicial. f Es una función Q x Σ → Q que se llama función de transición; esta recibe como argumentos un estado y una entrada y devuelve un estado. q F ∁ Q es un conjunto de estados a los cuales llamaremos estados finales o de aceptación.

Existen dos notaciones preferibles para describir los autómatas:

1. Un diagrama de transiciones, que es un grafo. 2. Una tabla de transiciones, que es una enumeración tabular (tabla) de la función f, que a la vez describe el conjunto de estados, y el alfabeto de entrada.

Diagramas de transiciones

Un diagrama de transiciones para un AFD A = (Σ, Q, q0, f, F), es un grafo definido de la siguiente forma:

a) Hay un nodo para cada estado de Q.b) El nodo correspondiente al estado inicial q0, tendrá una flecha sin origen (o arco entrante) no etiquetado. c) Los nodos correspondientes a los estados de aceptación (los que pertenecen a F) están marcados con un doble círculo. Los que no pertenecen a F tienen un círculo simple. d) Habrá un arco etiquetado con a entre el nodo p y el nodo q, si f(p,a) = q. Si existen varios símbolos de entrada que provocan una transición del estado p a q, entonces el arco entre p y q puede estar etiquetado con la lista de esos símbolos.

Un autómata puede ser representado mediante un grafo dirigido (digrafo) el cual se conoce como diagrama de transiciones, donde los vértices del mismo corresponden a los estados del autómata, en el caso del estado inicial este tendrá una flecha que apunta hacia él, y los estados finales se representaran mediante un circulo con línea doble; si existe una transición del estado q al p sobre la entrada a entonces existe un arco con

Page 12: Lenguajes Y Automatas

etiqueta a que va del estado q al estado p en el diagrama de transición. El autómata acepta una cadena 𝜔 si la secuencia de transiciones correspondientes a los símbolos de 𝜔 conducen del estado inicial a un estado final.

Si se modifica el modelo del autómata finito, para permitirle ninguna, una o más transiciones de un estado sobre el mismo símbolo de entrada, al nuevo modelo lo conoceremos como autómata finito no determinístico. Tiene la capacidad de estar en varios estados simultáneamente. La diferencia entre AFD y un AFN está en la función de transición. Para el AFN, f es una función que toma como argumentos un estado y un símbolo de entrada, pero devuelve un conjunto de cero, uno o más estados (en vez de devolver un estado, como en el caso del AFD).

Definición: Un Autómata Finito No Determinístico (AFND) es una quíntupla M = (Q; Σ; I; R; F ), donde Q es un conjunto de estados Σ es un alfabeto. I ∁ Q es un conjunto de estados a los cuales llamaremos estados iniciales. R es una relación sobre Q × Σ𝑥 Q que se llama relación de transición. F ∁ Q es un conjunto de estados a los cuales llamaremos estados finales.

Fig. 2 AFND: representación de autómatas finitos no determinísticos

Tabla de transiciones

Una tabla de transiciones es una representación tabular convencional de una función como f, que recibe dos argumentos y devuelve un valor. Esta tabla tendrá las siguientes características:

a) En las filas estarán los estados q ∈Q b) El estado inicial se precederá del símbolo -> c) Cada estado final se precederá del símbolo * d) En las columnas estarán los símbolos de entrada a ∈ Σ e) El valor correspondiente a la fila del estado qy a la entrada aes el estado que determine

Fig. 3 Ejemplo de tabla de transiciones

3.3 CONVERSIÓN DE UN AFND A AFD

Se observa que el AFN de la Figura 1, tiene dos transiciones desde el estado “0” con la entrada “a”; es decir, puede ir al estado “0” o al 1.

Page 13: Lenguajes Y Automatas

Ahora se introduce un algoritmo para construir a partir de un AFND un AFD que reconozca el mismo lenguaje. Este algoritmo se le conoce como construcción de subconjuntos, es útil para simular un AFND por medio de un programa de computador.

Fig. 4 autómata finito no determinista

Construcción de subconjuntos. Construcción de un AFD a partir de un AFN.

Entrada. Un AFN N.

Salida. Un AFD D que acepta el mismo lenguaje.

Método. El algoritmo construye una tabla de transiciones tranD para “D”. Cada estado del AFD es un conjunto de estados del AFN y se construye tranD de modo que “D” simulará en paralelo todos los posibles movimientos que “N” puede realizar con una determinada cadena de entrada.

Se utilizan las operaciones del Cuadro 2, para localizar los conjuntos de los estados del AFN (“s” representa un estado del AFN, y “T”, un conjunto de estados del AFN). Antes de detectar el primer símbolo de entrada, “N” se puede encontrar en cualquiera de los estados del conjunto cerradura-?(s0), donde s0 es el estado de inicio de K. Supóngase que exactamente los estados del conjunto “T” son alcanzables desde s0 con una secuencia dada de símbolos de entrada, y sea a el siguiente símbolo de entrada. Al ver a, “N” puede trasladarse a cualquiera de los estados del conjunto mover (T, a). Cuando se permiten transiciones- ? , N puede encontrarse en cualquiera de los estados de cerradura-? (T, a), después de ver la “a”. Se construyen estados “D”; el conjunto de estados de “D”; y tranD, la tabla de transiciones de “D”, de la siguiente forma. Cada estado de “D” corresponde a un conjunto de estados de AFN en los que podría estar “N” después de leer alguna secuencia de símbolos de entrada, incluidas todas las posibles transiciones- ? anteriores o posteriores a la lectura de símbolos. El estado de inicio de “D”es cerradura-? (s0). Se añaden los estados y las transiciones a “D”. Un estado de “D” es un estado de aceptación si es un conjunto de estados de AFN que contenga al menos un estado de aceptación de “N”.

El cálculo de cerradura-? (T) es un proceso típico de búsqueda en un grafo de nodos alcanzables desde un conjunto dado de nodos. En este caso, los estados de “T” son el conjunto dado de nodos, y el grafo está compuesto solamente por las aristas del AFN etiquetadas por ? . Un algoritmo sencillo para calcular cerradura-? (T) utiliza una estructura de datos tipo pila para guardar estados en cuyas aristas no se hayan buscado transiciones etiquetadas con ? .

Implementación de los algoritmos para convertir un AFN en un AFD

Para la implementación de estos algoritmos se utiliza el AFN “N”. Que acepta el lenguaje (a|b)*abb. Se aplica el Algoritmo 2. Construcción de subconjuntos a “N”. El estado de inicio del AFD equivalente es cerradura-? (0), que es A = {0,1,2,4,7}, puesto que estos son alcanzados desde el estado 0 por un camino en que todas las aristas están etiquetadas por ? . El alfabeto de símbolos de entrada es {a, b}. Ahora el algoritmo indica que debe marcarse “A” y después calcular cerradura- ? (mover(A, a)).

Page 14: Lenguajes Y Automatas

Calculando primero mover(A, a), el conjunto de estados de “N” que tiene transiciones en “a” desde miembros de “A”. Entre los estados 0,1,2,4 y 7 sólo 2 y 7 tienen dichas transiciones, a 3 y a 8, de modo que:

cerradura- ? (mover({0,1,2,4,7}, a)) =cerradura- ? (3,8) = {1,2,3,4,6,7,8}

Este conjunto se denominará “B”. Así, tranD[A, a] = B. Se presenta el cálculo de la cerradura-? . Entre los estados de “A”, sólo 4 tienen una transición en “b” a 5, de modo que el AFD tiene una transición en “b” desde “A a”.

cerradura- ? (A, b) cerradura- ? (mover(A, b)) =cerradura- ? ({5}) cerradura- ? ({5}) = {1,2,4,5,6,7}

Por lo que, tranD[A, b] = C. Es decir; C = {1,2,4,5,6,7} Se continúa este proceso con los conjuntos B y C, ahora sin marcar, finalmente se llegará al punto en que todos los conjuntos que son del estado AFD estén marcados.

3.4 REPRESENTACIÓN DE ER USANDO AFND

ERs, AFDs y AFNDs son mecanismos equivalentes para denotar los lenguajes regulares. En estas tres secciones demostraremos esto mediante convertir ER →AFND → AFD → ER. Las dos primeras conversiones son muy relevantes en la práctica, pues permiten construir verificadores o buscadores eficientes a partir de ERs.

Definición: La función Th convierte ERs en AFNDs según las siguientes reglas.

Prueba: Es fácil verificarlo por inspección y aplicando inducción estructural. La única parte que puede causar problemas es la clausura de Kleene, donde otros esquemas alternativos que podrían sugerirse (por ejemplo M = (K1, Σ, Δ1∪ {(f1, ε, s1), (s1, ε, f1)}, s1, {f1}) tienen el problema de permitir terminar un recorrido de Th(E1) antes de tiempo. Por ejemplo el ejemplo que acabamos de dar, aplicado sobre E1 = a ⋆ b, reconocería la cadena x = aa.

Representación de la expresión regular

Page 15: Lenguajes Y Automatas

Existen algoritmos que relacionan la especificación de tokens -expresiones regulares-, con el reconocimiento de éstos -autómatas finitos-. Es posible dada una expresión regular obtener el AFD que reconozca las cadenas del lenguaje denotado por la expresión regular. También es posible obtener el AFND que reconozca el lenguaje representado por dicha expresión regular.

El algoritmo que permite construir el autómata finito determinístico está fuera del alcance de estas notas ( el alumno no tiene los prerrequisitos para su estudio en este curso). Sin embargo, el algoritmo utilizado para la construcción del autómata finito no determinístico AFND, es relativamente sencillo de aplicar, ya que se basa en reglas simples. Existen muchas variantes de este algoritmo denominado “Algoritmo de Thompson”.

Este algoritmo es dirigido por sintaxis, es decir, usa la estructura sintáctica de la expresión regular para guiar el proceso de construcción del autómata AFND.

Supongamos que N(s)y N(t)son AFND’s para las expresiones regulares sy t, respectivamente.

a) Para la expresión regular s | t(alternancia), construir el siguiente AFND, N(s|t) :

b) Para la expresión regular st(concatenación), construir el AFND, N(st) :

c) Para la expresión regular s*, construir el AFND, N(s*) :

3.5 MINIMIZACIÓN DE ESTADOS EN UN AF

Dos estados de un autómata finito determinista son estados equivalentes si al unirse en un sólo estado, pueden reconocer el mismo lenguaje regular que si estuviesen separados. Esta unión de estados implica la unión tanto de sus transiciones de entrada como de salida. Si dos estados n o son equivalentes, se di ce que son estados distinguibles. Un estado final con un estado no- final nunca serán equivalentes.

Un AFD está minimizado, si todos sus estados son distinguibles y alcanzables. Un algoritmo de minimización de AFD es el siguiente:

1. Eliminar los estados inaccesibles es del autómata. 2. Construir una tabla con todos los pares (p, q) de estados restantes. 3. Marcar en la tabla aquellas entradas donde un estado es final y el otro es no-final, es decir, aquellos pares de estados que son claramente distinguibles.

Page 16: Lenguajes Y Automatas

4. Para cada par (p, q) y cada símbolo a del alfabeto, tal que r = δ(p,a) y s = δ(q,a): 1. Si (r, s) ya ha sido marcado, entonces p y q también son distinguibles, por lo tanto marcar la entrada (p, q). 2. De lo contrario, colocar (p, q) en una lista asociada a la entrada (r, s). 5. Agrupar los pares de estados no marcados.

Luego del tercer paso, si la tabla creada queda completamente marcada, entonces el AFD inicial ya era mínimo. La complejidad computacional del problema de minimizar u n AFD es polinomio. De hecho, existen algoritmos más eficientes aún que el mostrado en este artículo (aunque menos intuitivos). Sin embargo, el problema de minimizar un autómata finito no determinista es NP- completo y PSPACE- completo.

3.6 APLICACIONES (DEFINICIÓN DE UN CASO DE ESTUDIO)

Construcción del vehículo evasor de obstáculos

Uno de los primeros trabajos que comenzaron a formalizar la dinámica de robots móviles es (Crowley, 1989) en el que se utilizan dispositivos ultrasónicos en el vehículo para su posicionamiento y orientación. En (Maes, 1990) se muestra un estudio del comportamiento de robots autónomos y se divide en construcción de mapas, exploración, transitar y evasión de obstáculos. En (Seng, 1997) se plantea como una de las mayores problemáticas de la navegación robótica la localización y se proponen los pasos claves para el diseño, calibración y modelado de autómatas. Hay otros autores que refuerzan la evasión de objetos o desarrollo de trayectorias mediante técnicas de navegación como son: navegación inercial, compases magnéticos y triangulación. (Borenstein, 1997).

(Betke, 1997) considera que el autómata puede reconocer marcas especificas en el medio por el cual se desplaza usando reconocimiento de patrones visuales. La localización robótica así como la evasión de obstáculos del autómata, ha llegado a ser uno de los problemas fundamentales en los robots móviles, y por ello, en (Fox, 1999) se presenta una versión de la localización Markov, en donde la idea principal es mantener una densidad de probabilidad sobre el espacio de todas las localizaciones posibles de un robot en su entorno.

El Vehículo Evasor de Obstáculos (VEO de aquí en adelante) obtiene información del medio por el cual transita a través de unos fotodiodos y unas fotorresistencias que actúan como sensores, estos sensores arrojan como resultado niveles de voltaje que varían en proporción directa con la proximidad al obstáculo, los niveles de voltaje después de pasar por un comparador de niveles se convierten en niveles digitales, los cuales determinan una dirección especifica al actuar como entradas en el bus de direcciones de una memoria RAM, la cual se ha cargado con un programa, que contiene instrucciones precisas para lograr la evasión de obstáculos, estas instrucciones que provienen del bus de datos de la memoria RAM, controlan directamente 2 dispositivos transistorizados conocidos como puentes H, los cuales interactúan directamente con los motores de dirección del vehículo, indicándoles la acción de giro y por tanto ejecutando los diferentes movimientos para los cuales se diseño VEO.

Es necesario por tal motivo presentar el programa que se cargo en la memoria RAM según (Catálogo,2010), lo cual representa el punto de partida para definir el alfabeto que se emplea para la descripción de la dinámica de VEO a través de autómatas finitos.

En la figura 5 se puede observar la apariencia física del vehículo evasor de obstáculos.

La forma en que se encuentran distribuidos los cuatro sensores en el vehículo se puede apreciar en la figura 2, donde cada uno de los sensores establece un bit en el bus de direcciones de la memoria RAM, teniendo por consecuencia 24direcciones definidas en la memoria. El sensor 4 establece el primer bit de izquierda a derecha en el bus de direcciones, es decir el bit menos significativo, el sensor 3 establece el segundo bit, el sensor 2 el tercer bit, y el sensor 1 el cuarto bit, es decir el más significativo. Cabe mencionar que bajo ninguna presencia de obstáculo los sensores arrojan de manera permanente un bit en estado 0 hacia el bus de direcciones de la

Page 17: Lenguajes Y Automatas

memoria, pero con la presencia de un obstáculo, estos arrojan un bit en estado 1. La presencia de un obstáculo en el sensor 1 arrojaría como resultado la secuencia de bits 1000 por ejemplo (ver figura 5).

En cada una de las direcciones de la memoria RAM determinadas por los sensores, existe una instrucción cargada que establece la dirección de giro del motor, después de haber interactuado con el puente H transistorizado, el cual requiere de 2 bits de control (teniendo por tanto 4 posibles entradas) para realizar 3 acciones básicas que son: giro del motor hacia un sentido, giro hacia el lado contrario y permanencia estática del motor. Estas acciones se ejemplifican con mayor claridad en la tabla 1.

Tabla 1. Operación del puente H y direcciones de giro de los motores.

El VEO cuenta con 2 motores de dirección, cada uno de los cuales está controlado por un puente H de manera independiente. En la figura 6 se aprecia la distribución de los motores en el vehículo, de donde se estableció el siguiente lineamiento de operación: el motor derecho será controlado por el puente H número 1, y el motor izquierdo será controlado por el puente H número 2.

Teniendo por consecuencia la distribución de bits provenientes del bus de datos de la memoria RAM, según lo muestra la tabla 2.

Las acciones evasoras mencionadas en la tabla 2, se describen en la tabla 3.

En la acción evasora A, la entrada para el autómata finito estará definida por y donde y puede tomar cualquiera de las dos posibles entradas que originan el estado A en el vehículo y que son: a y d. Mientras que en la acción evasora G, la entrada para el autómata finito estará definida por z donde z puede tomar cualquiera de las 9 posibles entradas que provienen de los sensores y que originan el estado G en el vehículo, que son: f, g, h, j, k, l, n, ñ, o. Las estrategias C y D están diseñadas para evadir obstáculos que se presenten en la parte

Page 18: Lenguajes Y Automatas

trasera del vehículo, es decir cuando se presentan obstáculos en los sensores 3 y 4. Las estrategias evasivas E y F están diseñadas para evitar obstáculos que se presenten en la parte delantera del vehículo, es decir cuando se presentan obstáculos en los sensores 1 y 2. En la figura 4(a) se resumen los movimientos anteriormente descritos.

Antes de presentar el diagrama de transiciones que caracteriza la dinámica de VEO, es necesario establecer el conjunto de trayectorias posibles, lo cual lo hacemos con ayuda de una pequeña retícula, que representa un plano bidimensional, la cual tiene un conjunto de obstáculos a evadir, estos últimos están representados por cuadros negros en la figura 4(b); de donde se observa que el conjunto de acciones evasivas serían en forma ordenada: C, D, C, D, y que las entradas al sistema (VEO) que harían posible una trayectoria valida serían: b, c, b, c. Nótese que la permanencia en un estado no está definida como una trayectoria valida, por tanto dicho de otra forma una cadena definida por y,y,y ó b,b,b ó c,c,c ó d,d,d, etc. no es permitida por el autómata, pues en el diagrama de transición presentado en una sección posterior ni siquiera permite una transición de estados.

Un análisis detallado a los estados posibles del vehículo y las trayectorias validas, y considerando lo establecido en la descripción de las acciones evasoras, nos permite denotar de manera formal el autómata finito no determinístico correspondiente como sigue:

M = (Q, Σ, δ, q0, F)Donde Q = {q0, q1, q2, q3, q4, q5, q6,}.Σ = {b, c, e, i, m, y, z}.F = {Ø}.

Donde se define a F como un elemento nulo, ya que como se aprecia en la tabla 3 el vehículo no tiene definido estados finales. De una observación directa al autómata anteriormente planteado se distingue que el modelado descriptivo del vehículo se pudo realizar utilizando siete estados, después de haber redefinido el alfabeto del autómata, este se compone de cinco entradas y finalmente el estado inicial se encuentra definido por un solo estado que es q0.

Resultados

El modelado de la trayectoria del vehículo VEO presentado en este artículo por medio de autómatas finitos no determinísticos resultó ser una valiosa herramienta para describir de manera formal su dinámica, lo cual no representaba una tarea tan sencilla, pues VEO tiene bien definidos 7 posibles estados, lo cual complica un poco su entendimiento. Se puede notar por inspección directa por parte del lector a través de un análisis al diagrama de transición y a la función de transición presentados en este trabajo en las figuras 7 y 8 respectivamente, que el siguiente estado del vehículo, con siete estados finitos y siete entradas conocidas, se puede estimar de una forma muy sencilla y concisa, lo cual representó uno de los retos primordiales de este trabajo.

Page 19: Lenguajes Y Automatas

UNIDAD 4 MAQUINA DE TURING.

Adentrándose a la Historia de la MT

Poco de historia

A finales del siglo XIX, el matemático David Hilbert se preguntó si era posible encontrar un algoritmo para determinar la verdad o falsedad de cualquier proposición matemática. En particular, se preguntaba si existiría un modo de determinar si cualquier fórmula del cálculo de predicados de primer orden, aplicado a enteros, es verdadera. Dado que el cálculo de predicados de primer orden sobre los enteros es suficientemente potente como para expresar frases como esta gramática es ambigua, si Hilbert hubiera tenido éxito, existirían algoritmos para dichos problemas, que ahora sabemos que no existen esta proposición se conoce con el nombre de problema de Hilbert.

En 1963, Alan Mathinson Turing propuso la máquina que lleva su nombre como modelo de cualquier computación posible. Este modelo se parece más a una computadora que a un programa, aunque las verdaderas computadoras electrónicas, o incluso los electromecánicas, tardaron varios años en ser construidas. La máquina de Turing consta de una unidad de control, que pueda estar en cualquier estado tomado de un conjunto infinito. Hay una cinta dividida en cuadrados o casillas, y cada casilla puede contener un símbolo, tomado de otro conjunto infinito. Inicialmente, se sitúa en la cinta de entrada, que es una cadena de símbolos de longitud infinita, elegidos del alfabeto de entrada. El resto de las casillas de la cinta, que se extiende infinitamente hacia la derecha y hacia la izquierda, contiene, inicialmente, un símbolo denominado espacio en blanco. El espacio en blanco es un símbolo de cinta, pero no un símbolo de entrada, y puede haber también otros símbolos de cinta además de los símbolos de entrada y del espacio en blanco. Existe una cabeza de la cinta que siempre está situada sobre una de las casillas de la cinta. Se dice que la máquina de Turing está señalando dicha casilla. Al principio, la cabeza de la cinta se encuentra en la casilla de la entrada situada más a la izquierda. Un movimiento de la máquina de Turing es una función del estado de la unidad de control y del símbolo de la cinta al que señala la cabeza.

4.1 DEFINICIÓN FORMAL MT

Definición 1:

Una Máquina de Turing es un modelo matemático que consiste en un autómata capaz de implementar cualquier problema matemático expresado por medio de un algoritmo. Alan Turing; fue un matemático inglés que vivió durante la primera mitad del siglo XX. Aunque fue un matemático brillante en muchos campos, destacando especialmente en criptografía, su principal interés se centraba en la lógica, que en aquellos momentos se encontraba en plena ebullición gracias al intento de David Hilbert de hallar una formulación de las matemáticas sobre una base estricta de lógica formal. La Máquina de Turing, o Máquina de Computación Lógica como la llamaba él, fue quizás la mayor aportación de Alan Turing a esta tarea y con seguridad su

Page 20: Lenguajes Y Automatas

descubrimiento de mayor transcendencia, ya que abrió el camino de la ciencia de la Computación, que a su vez nos lleva al computador que en estos momentos estoy utilizando para escribir esto, o al que usted está usando para leerlo. En definitiva, Alan Turing fue uno de los científicos más importantes de la primera mitad del siglo XX y, sin duda, una de las mentes que más influyó en la manera actual que tenemos de ver el mundo e interactuar con él.

“Una Máquina de Turing es un modelo matemático“

“Modelo matemático” es una expresión de esas que se utilizan con cierta frecuencia pero que pocas veces nos paramos a pensar qué significa. Y aunque parezca algo complicado, en realidad se trata de un concepto bastante sencillo.

Es un conjunto de reglas que “encajan” en la explicación y resolución de un problema, es decir, que modelizan una situación concreta para poder explicarla y encontrar el modo de resolverla. Más aún, se podría decir que un modelo matemático es un conjunto de reglas capaces de generalizar y resolver un problema matemático concreto y cualquier otro de su misma naturaleza que se pueda plantear.

“Una máquina de Turing es un autómata”En matemáticas, un autómata es lo que se conoce como una máquina teórica, es decir, un dispositivo cuyo funcionamiento se estudia sin necesidad de construirlo realmente. En concreto un autómata es una máquina teórica que lee unas instrucciones en forma de símbolos y cambia de estado según éstas.

Una máquina de Turing es un autómata que consta de una cabeza lectora y una cinta infinita en la que la cabeza puede leer símbolos, borrarlos, escribirlos y moverse a la derecha o a la izquierda. Por supuesto también consta de una función de estado que determinará los cambios de un estado a otro que se deben producir en función de las instrucciones que reciba.

Definición 2

La Máquina de Turing (MT) es el modelo de autómata con máxima capacidad computacional: la unidad de control puede desplazarse a izquierda o derecha y sobre escribir símbolos en la cinta de entrada.

Definición formal:

Una Máquina de Turing MT es una séxtupla M = donde

Q El conjunto finito de estados de la unidad de control.Σ El conjunto finito de símbolos de entrada.

El conjunto completo de símbolos de la cinta; Σ siempre es un subconjunto de

𝛿 La función de transición. Los argumentos de (q; X ) son un estado q y un símbolo de la cinta X . El valor de (q; X ), si esta es una tupla (p; Y; S ) donde

1. p es el estado siguiente de Q2. Y es el símbolo de , que se escribe en la casilla señalada por la cabeza de la cinta y que sustituye al símbolo que se encontraba en dicha casilla.3. S es un sentido I o D (izquierda o derecha) que nos indica en qué sentido se mueve la cabeza q0

Page 21: Lenguajes Y Automatas

Es el estado inicial.

B Es el símbolo del espacio en blanco B ∈ , y aparecerá inicialmente en todas las casillas de la cinta, menos en aquellas que contienen los símbolos de entradaF ∁ es el conjunto de estados finales o de aceptación

Definición formal:

Una Máquina de Turing (MT) es una tupla M = (K, Σ, δ, s), donde

• K es un conjunto finito de estados, h K.• Σ es un alfabeto finito, # ∈ Σ.

• s ∈ K es el estado inicial

• , Es la función de transición.

4.2 CONSTRUCCIÓN MODULAR DE UNA MT

Construcción definición

Para describir formalmente lo que hace una máquina de Turing, es necesario desarrollar una notación para describir sus configuraciones o descripciones instantáneas, parecida a la notación que se desarrolla para los autómatas a pila. En principio una máquina de Turing dispone de una cinta de longitud infinita, por lo cual podrá suponerse que no es posible describir espáticamente su configuración. Sin embargo, después de un número finito de movimientos, la máquina de Turing solo habrá recorrido un número finito de casillas. Por tanto, para cualquier configuración existe un prefijo y un sufijo infinito de casillas que no se han recorrido nunca. El contenido de dichas casillas debe Ser espacios en blanco o símbolos del conjunto finito de símbolos de entrada.

Por lo tanto, en una configuración solo se muestran las casillas que se encuentren entre el símbolo más a la izquierda y el símbolo más a la derecha de la cinta que no sean espacios en blanco, además, habrá que incluir un número finito de espacios en blanco en la configuración, si se da la condición especial de que la cabeza de la cinta señale a uno de los espacios en blanco situados antes o después de la cadena de entrada.

Además de la representación de la cinta, debe ser posible representar el estado de la unidad de control, así como la posición de la cabeza de la cinta. Para ello, insertaremos el estado en la cinta, situándolo inmediatamente a la izquierda de la casilla señalada por la cabeza. Para que la cadena que representa el contenido de la cinta junto con el estado de la unidad de control no resulte ambigua, es necesario asegurarse de que no se utiliza como estado ningún símbolo que forme parte del conjunto de símbolos de cinta. Sin embargo, es sencillo cambiar los nombres de los estados de forma que no tengan nada en común con los símbolos de la cinta, dado que la operación de la máquina de Turing no depende de cómo se llamen sus estados. Por tanto, utilizaremos la cadena x1x2 ...xi−1qxixi+1 ...xn para representar una configuración en la que:

1. q es el estado de la máquina de Turing.2. La cabeza de la cinta señala al i-enésimo símbolo a partir de la izquierda.3. x1x2...xn es la porción de la cinta que se encuentra entre los símbolos no blancos situados más a la izquierda y más a la derecha. Como excepción, si la cabeza señala a alguna casilla a la izquierda del símbolo no blanco que se encuentre más a la izquierda, o a alguna casilla a la derecha del símbolo no blanco que se encuentre más a la derecha, entonces algunos caracteres prefijos o sufijos de x1x2 ...xn serán espacios en blanco, siendo i = 1 o i = n, respectivamente.

Los movimientos de una máquina de Turing se describen utilizando la notación 7→M.

Construcción definición 2:

Mediante esta técnica se puedan desarrollarse máquinas de Turing complejas a partir de bloques de elemental es a partir de máquinas más pequeñas mediaste diagramas de transiciones .La construcción de máquinas de Turing se lleva a cabo median te los diagramas de transición y combinarlos de manera parecida a lo que se real i z a en la formación de la unión y concatenación de los autómatas finitos.

Page 22: Lenguajes Y Automatas

- Construcción de máquinas de Turing complejas a partir de bloques elementales.- Transferencia de control entre máquinas: →M1→ M2- Transferencia de control con varios símbolos: →M1 → }→ M2→ M3

Construcción definición 3:

En la notación modular de MTs una MT se verá como un grafo, donde los nodos serán acciones y las aristas condiciones. En cada nodo se podrá escribir una secuencia de acciones, que se ejecutan al llegar al nodo. Luego de ejecutarlas, se consideran las aristas que salen del nodo. Estas son, en principio, flechas rotuladas con símbolos de Σ. Si la flecha que sale del nodo está rotulada con la letra que coincide con la que tenemos bajo el cabezal luego de ejecutar el nodo, entonces seguimos la flecha y llegamos a otro nodo. Nunca debe haber más de una flecha aplicable a cada nodo. Permitiremos rotular las flechas con conjuntos de caracteres. Habrá un nodo inicial, donde la MT comienza a operar, y cuando de un nodo no haya otro nodo adonde ir, la MT se detendrá. Las acciones son realmente MTs. Comenzaremos con 2 + |Σ| acciones básicas, que corresponden a las acciones que pueden escribirse en δ, y luego podremos usar cualquier MT que definamos como acción para componer otras.

Las acciones básicas de la notación modular de MTs son:

• Moverse hacia la izquierda (): Esta es una MT que, pase lo que pase, se mueve hacia la izquierda una casilla y se detiene. = ({s},Σ,δ,s), donde.

(Notar que estamos sobrecargando el símbolo, pero no debería haber confusión.)

• Moverse hacia la derecha (): Esta es una MT que, pase lo que pase, se mueve hacia la derecha una casilla y se detiene. = ({s},Σ,δ,s), donde.• Escribir el símbolo b ∈ Σ (b): Esta es una MT que, pase lo que pase, escribe b en la cinta y se detiene. b = ({s},Σ,δ,s), donde ∀a ∈ Σ, δ(s,a) = (h,b). Nuevamente, estamos sobrecargando el símbolo b ∈ Σ para denotar una MT.

Construcción definición 4:

Mediante esta técnica se puedan desarrollarse máquinas de Turing complejas a partir de bloques de elementales a partir de máquinas más pequeñas mediaste diagramas de transiciones.

La construcción de máquinas de Turing se lleva a cabo mediante los diagramas de transición y combinarlos de manera parecida a lo que se realiza en la formación de la unión y concatenación de los autómatas finitos.

Pasos para la construcción de una máquina de Turing

a) Elimine las características de inicio de los estados iniciales de las máquinas, excepto la de aquel donde iniciara la maquina compuesta.b) Elimine las características de detención de los estados de parada de todas la maquinas e introduzca un nuevo estado de parada que no se encuentre en ninguno de los diagramas que se combinan.c) Para cada uno de los antiguos estados de parada p y cada x en y.

4.3 LENGUAJES ACEPTADOS POR LA MT.

LAMT

Podremos decir que la forma en la que una máquina de Turing acepta una cadena es la siguiente: la cadena de entrada se sitúa en la cinta y la cabeza comienza señalando el símbolo de entrada que se encuentra más a la izquierda; si la máquina de Turing llega a un estado de aceptación al final del proceso, se considera que la cadena es reconocida, en caso contrario, decimos que la cadena no fue aceptada.

Page 23: Lenguajes Y Automatas

De manera formal dada una máquina de Turing M = (Q,Σ,Γ,δ,q0,B,F), el lenguaje L(M) es el conjunto de cadenas ω de Σ∗ tales que q0ω 7→∗ αpβ para algún estado p del conjunto de estado finales F, y cualesquiera dos cadenas de cinta α y β. Los lenguajes que son pueden ser aceptados por la máquina de Turing reciben el nombre de lenguajes recursivamente enumérales o lenguajes RE.

Sin embargo este no es el único método para la aceptación de una cadena, existe otro que comúnmente se le conoce con el nombre de aceptación por parada. Se dice que una máquina de Turing se para si alcanza un estado q cuando señala a un símbolo de la cinta X, sin que se produzca ningún movimiento en dicha situación; es decir δ(q,X) no está definida. Siempre se puede suponer que una máquina de Turing se para si acepta, es decir sin introducir variaciones en el lenguaje aceptado, se puede hacer que δ(q,X) se quede sin definir siempre que q sea un estado de aceptación. En general a menos que se especifique lo contrario, suponemos que una máquina de Turing siempre se para cuándo esta´ en un estado de aceptación, aunque no en todos los casos ocurre ´esto. Los lenguajes reconocidos por máquinas de Turing que siempre se paran, acepten o no, se les conoce con el nombre de recursivos. Las máquinas de Turing que siempre se paran con independencia de que acepten o no, son un buen modelo de algoritmo. Si existe un algoritmo para resolver un problema dado, entonces se dice que el problema es decidible, con lo cual se observa que las máquinas de Turing que siempre se paran, tienen un papel importante en la teoría de la dicisibilidad.

LAMT

Una máquina de Turing se puede comportar como un aceptador de un lenguaje. Si colocamos una cadena w en la cinta, situamos la cabeza de lectura/escritura sobre el símbolo del extremo izquierdo de la cadena w y ponemos en marcha la máquina a partir de su estado inicial. Entonces w es aceptada si, después de una secuencia de movimientos, la máquina de Turing llega a un estado final y para. Por tanto w es aceptada. Si qw * w1pw2 para algún estado final p y unas cadenas w1 y w2.

Entonces, se obtiene la siguiente definición:

Sea M = (Q, , , q0=q1, B, F, ) una máquina de Turing. Entonces el lenguaje aceptado por M es: L(M) = {w *q1w * w1pw2 para pF y wi*}.

Los lenguajes formales que son aceptados por una máquina de Turing son exactamente aquellos que pueden ser generados por una gramática formal. El cálculo Lambda es una forma de definir funciones. Las funciones que pueden se computadas con el cálculo Lambda son exactamente aquellas que pueden ser computadas con una máquina de Turing.

Estos tres formalismos, las máquinas de Turing, los lenguajes formales y el cálculo Lambda son formalismos muy disímiles y fueron desarrollados por diferentes personas. Sin embargo, ellos son todos equivalentes y tienen el mismo poder de expresión. Generalmente se toma esta notable coincidencia como evidencia de que la tesis de Church-Turing es cierta, que la afirmación de que la noción intuitiva de algoritmo o procedimiento efectivo de cómputo corresponde a la noción de cómputo en una máquina de Turing.

Gramáticas estructuradas por frases:

Parte izquierda de las reglas: combinación de símbolos terminales y no terminales, con al menos un no terminal.Parte derecha de las reglas: combinación de símbolos terminales y no terminales de cualquier longitud (incluso 0).- Las máquinas de Turing aceptan lenguajes estructurados por frases.

UNIDAD 5 ANÁLISIS LÉXICO.

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 información en el programa fuente. En cada caso un token representa un cierto patrón de caracteres que el analizador léxico 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 patrón de

Page 24: Lenguajes Y Automatas

transición entre los caracteres de entrada, generando tokens, que posteriormente serán clasificados. Este mecanismo es posible crearlo a partir de un tipo específico de máquina de estados llamado autómata finito.

5.1 FUNCIONES DEL ANALIZADOR LÉXICO.

Las funciones de un analizador léxico pueden ser las siguientes:

- Leer los caracteres de la entrada.- Generar una secuencia de componentes léxicos. (TOKENS).- Eliminar comentarios, delimitadores (espacios, símbolos de puntuación, fin de la línea).- Relacionar los mensajes de error con las líneas del programa fuente.- Introducir los identificadores en la tabla de símbolos.

Este lee la secuencia de caracteres del programa fuente, carácter a carácter, y los agrupa para formar unidades con significado propio, los componentes léxicos. Estos componentes léxicos representan:

- Palabras reservadas if, while, do, …- Identificadores: asociados a variables, nombres de funciones, tipos definidos por el usuario, etiquetas,

… por ejemplo: posición, velocidad, tiempo,…- Operadores: = * + - / == > < & ¡ = …- Símbolos especiales: ; () [] {}- Constantes numéricas: literales que representan valores enteros, en coma flotante, etc, 982, 0xf678, -

83.2E+2…- Constantes de caracteres: literales que representan cadenas concretas de caracteres, “hola mundo”, …

Estas serían funciones secundarias de un analizador léxico:

- Manejo del fichero de entrada del programa fuente: abrirlo, leer sus caracteres, cerrarlo y gestionar posibles errores de lectura.

- Eliminar comentarios, espacios en blanco, tabuladores y saltos de línea (caracteres no válidos para formar un token). Inclusión de ficheros: # include…

- La expansión de macros y funciones inline: # define… - Contabilizar el número de líneas y columnas para emitir mensajes de error. - Reconocimiento y ejecución de las directivas de compilación (por ejemplo, para depurar u optimizar el

código fuente). - Ventajas de separar el análisis léxico y el análisis sintáctico: - Facilita transportabilidad del traductor (por ejemplo, si decidimos en un momento dado cambiar las

palabras reservadas begin y end de inicio y fin de bloque, por f y g, solo hay que cambiar este módulo. - Se simplifica el diseño: el analizador es un objeto con el que se interactúa mediante ciertos métodos. Se

localiza en un único modulo la lectura física de los caracteres, por lo que facilita tratamientos especializados de E/S.

5.2 COMPONENTES LÉXICOS, PATRONES Y LEXEMAS

Componente léxico: es la secuencia lógica y de caracteres relativo a una categoría: identificador, palabra reservada (cadena/numérica), operador o carácter de puntuación, el componente léxico puede tener uno o varios lexemas. Patrón: regla que genera la secuencia de caracteres que puede representar a un determinado componente léxico. Lexema: es una cadena de caracteres que concuerda con un patrón que describe un componente léxico.

El analizador léxico recoge información sobre componentes léxicos. Los tokens influyen en el análisis sintáctico, los atributos en la traducción de tokens. En práctica léxico suele tener solo un atributo. Para efectos de diagnóstico, puede considerarse tanto el lexema para un identificador como el número de línea en el que se encontró por primera vez.

5.3 CREACIÓN DE TABLA DE TOKENS

Page 25: Lenguajes Y Automatas

Una tabla de símbolos 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 símbolos dependen en algún grado de la naturaleza del lenguaje de programación para el cual se escribe el compilador. La organización de la tabla variará dependiendo de las limitaciones de memoria y tiempo de acceso.

Una tabla de símbolo provee la siguiente información:

- Da un identificador. - Que información es asociada con un nombre. - Como se asocia esa información con un nombre.- Como acceder esta información.

Pero las dos funciones importantes que realizan las tablas de símbolos (también llamadas tablas de identificadores y tablas de nombres), en el proceso de traducción son:

- Verificar que la semántica sea correcta- Ayudar en la generación apropiada de código.

Cuando Construir La Tabla De Simbolos Y Cuando Interactuar Con Ella

El punto del procesador de traducción en el cual son invocadas las rutinas de manejo de la tabla de símbolos depende primeramente del número y la naturaleza de los pasos del compilador.

En un compilador multipasos, la tabla de símbolos es creada durante el paso de análisis léxico. Por medio de un índice se entra a la tabla de símbolos para ubicar la variable, a partir del token generado por el scanner.

5.4 ERRORES LÉXICOS

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.

Suponiendo que una situación en la cual el analizador léxico no puede continuar por que 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 realizar lo siguiente:

1. Reportar clara y exactamente la presencia de errores 2. 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

5.5 GENERADORES DE ANALIZADORES LÉXICOS.

Todos los analizadores léxicos realizan la misma función (se implementan de igual forma) excepto en los tokens que reconocen, las expresiones regulares que los definen. Resulta entonces natural y una forma de ahorrar esfuerzo, utilizargeneradores automáticos de analizadores léxicos. Estos generadores solo necesitan conocer la especificación de tokens a reconocer.

5.6 Aplicaciones (Caso de estudio)

UNIDAD 6 ANÁLISIS SINTÁCTICO.

Page 26: Lenguajes Y Automatas

6.1 GLC.

Capturan la noción de constituyente sintáctico y la noción de orden.Herramienta formal que puede ser vista tanto desde un punto de vista generador como estructurador.

Propiedades computacionales interesantes: se puede reconocer en tiempo polinómico.

Una Gramática Libre de Contexto es una tupla con 4 parámetros:

G = (V,T,P,S)

V – conjunto de símbolos variables T – conjunto de símbolos terminales S Î V, símbolo inicial P – conjunto de reglas de producción: A ® α, con α sucesión de símbolos de V È T, eventualmente vacía (α = ε).

Una GLC es un dispositivo generador.

Definimos el lenguaje LG generado por una gramática G del siguiente modo:LG = { w / S ⇒* w } , siendo ⇒* una “especie” de clausura transitiva de ®y w una tira de terminales.

Reglas para oraciones aseverativas (esbozo)

O ® GN GVO ® GVGV ® VGV ® V GNGV ® V GAdjGV ® V GAdvGV ® GV GP [1]

6.2 ÁRBOLES DE DERIVACIÓN.

Podemos decir:

Del mismo modo se puede decir

deriva en uno o más pasos.

Una derivación por la izquierda es aquella en la que se reemplaza el no terminal más a la izquierda en cada paso de la derivación.

. análogamente para la derecha

Una derivación por la izquierda corresponde a la numeración preorden de los nodos internos de su árbol de análisis gramatical asociado.

. derecha . postorden inversa.

Page 27: Lenguajes Y Automatas

Toda derivación de las gramáticas de tipo 1, 2 ó 3 se puede representar mediante un árbol.

6.3 FORMAS NORMALES DE CHOMSKY.

Una gramática formal está en Forma normal de Chomsky si todas sus reglas de producción son de alguna de las siguientes formas:

donde , y son símbolos no terminales (o variables) y α es un símbolo terminal.

Todo lenguaje independiente del contexto que no posee a la cadena vacía, es expresable por medio de una gramática en forma normal de Chomsky (GFNCH) y recíprocamente. Además, dada una gramática independiente del contexto, es posible algorítmicamente producir una GFNCH equivalente, es decir, que genera el mismo lenguaje.

En algunos textos se puede encontrar una definición de una GFNCH de forma que cualquier GFNCH produzca cualquier lenguaje independiente del contexto y de la misma manera, que para cualquier lenguaje independiente del contexto exista una GFNCH que lo defina. Esta definición apenas se diferencia en permitir una regla ε de la siguiente forma:

donde es el símbolo distinguido (o inicial) de la gramática, es un símbolo no terminal (o variable), y también son símbolos no terminales pero distintos de , α es un símbolo terminal, y ε es la cadena nula (o vacía).

a) <w> ::= <w1> <w2> <w3>

b) <w> ::= <w1><w2> | <w1>a | bc<w2>

c) <w> ::= ab<w>.

Page 28: Lenguajes Y Automatas

d) <w> ::= ab | ab<w>.

6.5 ELIMINACIÓN DE LA AMBIGÜEDAD.

Una GLC es ambigua si existe una cadena w Î L(G) que tiene más de una derivación por la izquierda o más de una derivación por la derecha o si tiene dos o más árboles de derivación. En caso de que toda cadena w Î L(G) tenga un único árbol de derivación, la gramática no es ambigua.

TIPOS DE AMBIGÜEDAD Dentro del estudio de gramáticas existen dos tipos fundamentales de ambigüedad, los cuales son:Ambigüedad Inherente:

Las gramáticas que presentan este tipo de ambigüedad no pueden utilizarse para lenguajes de programación, ya que por más transformaciones que se realicen sobre ellas, nunca se podrá eliminar completamente la ambigüedad que presentan.

Un lenguaje L es inherentemente ambiguo si todas sus gramáticas son ambiguas; si existe cuando menos una gramática no ambigua para L, L no es ambiguo.

- El lenguaje de las expresiones no es Ambiguo- Las expresiones regulares no son ambiguas

Ambigüedad Transitoria:

Este tipo de ambigüedad puede llegar a ser eliminada realizando una serie de transformaciones sobre la gramática original. Una vez que se logra lo anterior, la gramática queda lista para ser reconocida por la mayor parte de los analizadores sintácticos. (Se le considera "ambigüedad" porque existen métodos para realizar análisis sintáctico que no aceptan gramáticas con estas características).

Dónde se presenta la Ambigüedad Transitoria generalmente la ambigüedad se presenta cuando existen producciones con factores comunes (distintas alternativas para un símbolo no-terminal que inician de la misma forma); ó cuando existen producciones que son recursivas izquierdas (producciones para unsímbolo no-terminal en las cuales el primer símbolo de su forma sentencial es ese mismo símbolo no-terminal).

¿Cómo solucionar el problema de la Ambigüedad Transitoria?

Para eliminar este tipo de ambigüedad, es necesario, primero eliminar:

- Factores comunes izquierdos inmediatos y No-inmediatos.- Recursividad izquierda inmediata y No-inmediata.

ELIMINACIÓN DE LA AMBIGÜEDAD.

- No existe un algoritmo que nos indique si una GIC es ambigua- Existen LIC que sólo tienen GIC ambiguas: inherentemente ambiguos- Para las construcciones de los lenguajes de programación comunes existen técnicas para la eliminación

de la ambigüedad

Page 29: Lenguajes Y Automatas

Ejemplo: causas de ambigüedad en la siguiente gramáticaNo se respeta la precedencia de operadores

Una secuencia de operadores idénticos puede agruparse desde la izquierda y desde la derecha. Lo convencional es agrupar desde la izquierda.

6.6 GENERACIÓN DE MATRIZ PREDICTIVA (CÁLCULO FIRST Y FOLLOW)

FIRST

Si α es cualquier cadena de símbolos gramaticales, se considera FIRST(α) como el conjunto de terminales que encabezan las cadenas derivadas de α. Si α = * => λ, entonces λ también está en FIRST(α).

Para calcular FIRST(X) para algún símbolo X de la gramática, se aplican las siguientes reglas hasta que no se pueda añadir nada nuevo al conjunto FIRST:

1. Si X es terminal, entonces FIRST(X) es {X}.2. Si X es no terminal y existe la producción X → λ, entonces añadir λ a FIRST(X).3. Si X es no terminal y X → Y1 Y2 .. . Yk es una producción entonces, para todo i (con i variando desde 1 hasta k) tal que Y1 , Y2 , ..., Yi-1 sean todos no terminales y FIRST(Y1), FIRST(Y2), ..., FIRST(Yi-1) contengan todos λ, se añaden todos los símbolos no nulos de FIRST(Yi ) a FIRST(X). Finalmente, si λ está en FIRST(Yj ) para j = 1, 2, ..., k (o sea, en todos), entonces se añade λ a FIRST(X).

Dicho de otra forma, lo anterior significa que todos los elementos de FIRST (Y1), excepto λ, pertenecen también a FIRST(X). Si Y1 no deriva λ, entonces ya ha terminado el cálculo de FIRST(X), pero en caso contrario, es decir, si Y1 =*=> λ, entonces todos los elementos de FIRST(Y2) excepto λ pertenecen también a FIRST(X), y así sucesivamente. Finalmente, si todos los Yi derivan λ, entonces λ se añade a FIRST(X).

FOLLOW

Se define FOLLOW(A), para el no terminal A, como el conjunto de terminales a que pueden aparecer inmediatamente a la derecha de A en alguna forma sentencial, es decir, el conjunto de terminales a tal que haya una derivación de la forma S=*=>αAaβ para algún α y β. Si A puede ser el símbolo de más a la derecha en alguna forma sentencial, entonces $ está en FOLLOW(A).

Para calcular FOLLOW(A) para un símbolo no terminal A, se aplican las siguientes reglas hasta que no se pueda añadir nada más al conjunto FOLLOW.

1. $ está en FOLLOW(S), siendo S el axioma de G.2. Si existe una producción A → αBβ, entonces todo lo que esté en FIRST(β), excepto λ, está en FOLLOW(B).3. Si existe la producción A → αBβ y FIRST(β) contiene λ (es decir, β=*=>λ), o bien si existe una producción A → αB, entonces todo lo que esté en FOLLOW(A) está en FOLLOW(B).

6.7 TIPOS DE ANALIZADORES SINTÁCTICOS

Analizador Descendente:

Se construye el árbol de análisis sintáctico partiendo del símbolo inicial y aplicando las producciones mediante derivaciones por la izquierda, el símbolo a expandir es el que este más a la izquierda.

Ejemplo:G=({+,*, ID, (, )}, {E, T, P}, E, P)P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) }FraseID + ( ID * ID )

Analizador Ascendente:

Page 30: Lenguajes Y Automatas

Se construye el árbol de análisis sintáctico partiendo de la frase a reconocer y aplicando las producciones mediante reducciones hasta llegar a símbolo inicial de la gramática.

Ejemplo:G=({+,*, ID, (, )}, {E, T, P}, E, P)P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) }FraseID + ( ID * ID )

6.8 MANEJO DE ERRORES

Rutinas de Manejo de Errores

Ocupan gran parte de los compiladores

Objetivos- Informar con claridad, exactitud- Recuperación rápida- recuperación no es corrección- No debe retrasar el procesamiento de programas sin errores- No generar errores en cascada (ej. eliminar identificador)

Acciones posibles- Detectar errores- Informar de los errores- Recuperar de los errores- Corregir errores

¿Necesidad actual de recuperación?

Más rápido re-compilar que leer siguiente erro

Tipos de errores

Page 31: Lenguajes Y Automatas

- Léxicos: escribir mal un identificador, número.- Sintácticos: no poner un “;” al final de una sentencia, estructura incorrecta.- Semánticos: multiplicar por una variable booleana- Lógicos: bucle infinito

Herramientas para disminuir el número de errores- Léxicos- Si se utiliza alguna herramienta que complete palabras- Sintácticos- Si se utiliza algún editor basado en sintaxis (colores)- Semánticos- Busca funciones/clases e indica tipos especificados

Modo de Pánico

Características- Método más sencillo- Lo pueden usar la mayoría de los AS- No entra en lazos infinitos- Adecuado para lenguajes en los que son raros múltiples errores en la misma proposición

Funcionamiento general- El AS desecha símbolos de la entrada, uno por uno, hasta encontrar un token de sincronización para

continuar- Delimitadores (punto y coma, palabras clave como end) Inconvenientes- Podrían omitirse gran cantidad de símbolos sin analizar

A nivel de frase

Características- Correcciones en la cadena de entrada

Funcionamiento- Descubierto el error se corrige (localmente) la entrada por un prefijo que permite continuar el AS- Sustituir una coma por un punto y coma, insertar un punto y coma, etc.-

Inconvenientes.- Dificultad para resolver situaciones en las que el error se produjo antes de la detección de éste- Pueden producir lazos infinitos- Evitar insertar símbolos antes del símbolo actual en la entrada-

Producciones de error

Funcionamiento- Conocidos los errores más comunes, se extiende la gramática con producciones de error- Reconocido el error, se dan diagnósticos precisos de la construcción errónea- Ej.:- E->E op T | E->T- E-> E T //falta operador- T->id | num-

Inconvenientes- Dificultad para ir más allá de los casos particulares más frecuentes- Generación ambigüedades

6.9 GENERADORES DE ANALIZADORES SINTÁCTICOS

Page 32: Lenguajes Y Automatas

Hemos visto cómo el análisis léxico facilita la tarea de reconocer los elementos de un lenguaje uno a uno. A partir de ahora, vamos a centrarnos en el análisis sintáctico, que nos permitirá averiguar si un fichero de entrada cualquiera respeta las reglas de una gramática concreta. Para el tema del análisis sintáctico vamos a utilizar la herramienta yacc (Yet Another Compiler Compiler).

Funcionamiento de yacc

Igual que sucedía con lex, yacc no es directamente un analizador sino un generador de analizadores. A partir de un fichero fuente en yacc, se genera un fichero fuente en C que contiene el analizador sintáctico. Sin embargo, un analizador sintáctico de yacc no puede funcionar por sí solo, sino que necesita un analizador léxico externo para funcionar. Dicho de otra manera, el fuente en C que genera yacc contiene llamadas a una función yylex() que debe estar definida y debe devolver el tipo de lexema encontrado. Además, es necesario incorporar también una función yyerror(), que será invocada cuando el analizador sintáctico encuentre un símbolo que no encaja en la gramática.

El lenguaje Yacc

Esquema general

Un programa fuente de Yacc se parece bastante a uno de lex. La diferencia principal está en la sección de reglas, que en vez de expresiones regulares contiene las reglas de la gramática:

- De estas tres secciones, sólo la segunda es obligatoria, y no debe estar vacía (nótese que en lex, las tres secciones pueden estar vacías). Esto quiere decir que el mínimo programa en yacc es:

%%

regla gramatical acción en C

La sección de declaraciones puede incluir varias cosas, tal y como ocurría en lex, pero ahora su función principal no es definir expresiones regulares, sino declarar los símbolos terminales de la gramática mediante la directriz %token. Todo lo que no sea un terminal, será considerado un símbolo no terminal, y por tanto debe haber una regla para él:

%token IF,ELSE,LLAVE_AB,LLAVE_CE,IDENT

- La sección de reglas contiene la gramática en sí. Componentes es una combinación de terminales y no terminales que describe al no terminal de la izquierda de la regla:

Page 33: Lenguajes Y Automatas

no_terminal: componentes {acciones en C}

- La sección de rutinas tiene la misma función que la de lex, pero yacc (dependiendo de su variante) no define por defecto las funciones main(), yylex() e yyerror(), así que hay que incluirlas aquí, o bien en otro fichero que se enlazará en la fase final de la compilación.

Yacc genera una función llamada yyparse() que contiene el analizador sintáctico. Esta función se comporta como una máquina de estados cuya misión es intentar reducir todo el fichero de entrada al símbolo inicial de la gramática (el primero que se haya definido). Si yacc lo consigue, el analizador sintáctico volverá sin error, y en caso contrario, se invocará a la función yyerror(), que debe estar definida también en algún sitio.