Sie sind auf Seite 1von 52

CATEDRATICO: Ing. Margarita Ostos Abreu Asesor: Ing.

Gabriela Clavel Martnez

Apuntes de la materia de Teora de la Computacin


Presenta:
Albail Morales Diego Bolaos Prez Esteban Jimnez Cinta Guillermo Alberto

FECHA: DICIEMBRE/2006

Manual de lenguajes y autmatas

TEMARIO DE LENGUAJES Y AUTOMATAS


1. INTRODUCCIN Antecedentes (paradojas) Autmatas, compatibilidad y complejidad Nociones matemticas Conjuntos Funciones y relaciones Cadenas y lenguajes 2. Lenguajes regulares Autmatas finitos Determinsticos No determinsticos No determinsticos - Expresiones regulares (e,r,s) 3. Lenguajes libres de contexto Autmatas de pila rbol de derivacin Gramticas libres de contexto 03 03 04 06 06 07 08 09 5. Aplicaciones a Lenguajes 09 11 14 15 16 18 18 20 21 Diseo Autmatas Gramticas Comunicacin Fase lxica Fase sintctica Bibliografas 39 39 42 43 46 46 49 53 Ambigedad Gramticas sensibles al contexto 4. Lenguajes recursivamente enumerables Mquinas de Turing Extensin de la mquina de Turing Problemas indecibles 25 27 28 28 32 37

Manual de lenguajes y autmatas

1. INTRODUCCIN
1.1. Antecedentes (paradojas)

Todos los cretenses son mentirosos: Una de las ms viejas paradojas lgicas se remonta a la antigedad, se trata de una afirmacin que dice: "Todos los cretenses son mentirosos" Esta frase aparentemente anodina no es objeto de un comentario especial si la pronuncia una persona que no haya nacido en Creta, pues en ese caso tenemos dos posibilidades: 1) pensar que la afirmacin es verdadera y admitir que todos los cretenses son mentirosos. 2) por el contrario que no todos los cretenses son mentirosos, y la afirmacin sera falsa. Pero la cosa se complica si la frasecita dichosa la pronunciase un cretense. En este caso si pensamos que la afirmacin es cierta, todos los cretenses son mentirosos; el cretense que lo afirma es pues un mentiroso; la declaracin es pues inexacta. Pero si la afirmacin es falsa, entonces no todos los cretenses son mentirosos; y la declaracin es pues verdadera. Parece que entramos en un crculo vicioso. El razonamiento precedente presenta no obstante un fallo. No se puede decir en efecto que, si la afirmacin es falsa, todo lo que dicen los cretenses sea verdad. Lo contrario de "todos los cretenses son mentirosos" no es "todos los cretenses dicen la verdad", sino "no todos los cretenses son mentirosos". La declaracin hecha por el cretense es pues falsa, y no hay paradoja ya que el cretense que habla puede, o bien decir la verdad, o bien mentir.

Una paradoja propone algo que parece asombroso, alejado del sentido comn, incluso absurdo. Define la dificultad lgica o semntica que surge en una proposicin que despus de haberse afirmado a s misma, se contradice. El trmino paradoja se usa indistintamente en vez de apora o como sinnimo de antinomia. El sentido paradjico recorre algunos proyectos del Laboratorio, en el ttulo se hace alusin a la imposibilidad o quizs al sin sentido como proposicin; propuestas como "continuidad indivisible de cambio" o "secuencias de continuidad" parecen considerar aspectos del tiempo, como fluencia indivisible o indescomponible, en momentos que como conceptos parecen alejados de lo comn. Algunos ejemplos de paradojas son:

Prueba de la existencia de Dios: Sea la frase: "Dios existe o esta frase es falsa". La frase es una disyuncin, formada por dos partes; la parte p1 es "Dios existe"; la parte p2 es "esta frase es falsa"; la frase completa es "p1 .O. p2", donde .O. simboliza la disyuncin. La frase es cierta cuando p1 o p2 (o ambas) lo son; es falsa cuando p1 y p2 (ambas) lo son. Supongamos que la frase es falsa; en ese caso p1 y p2 deben ser falsas; pero p2 es "esta frase es falsa", que resultara cierta; por lo tanto, la frase no puede ser falsa. En consecuencia debe ser verdadera; en ese caso p1 o p2 deben ser verdaderas; pero p2 es "esta frase es falsa", que resulta una afirmacin falsa; al ser p2 falsa, siendo la frase completa verdadera, debe ser p1 cierta; es decir, Dios existe.

Manual de lenguajes y autmatas

problema de ordenamiento es fcil de resolver. Digamos que usted tiene que arreglar una lista de nmeros en orden ascendente. Hasta una computadora pequea puede ordenar, de manera rpida, hasta un milln de nmeros. Ahora, comprelo con un problema de plantacin. Digamos que usted debe encontrar un horario de clases, para toda una universidad, que satisfaga ciertas (limitaciones) razonables como que 2 clases no pueden ser impartidas dentro del mismo saln a la misma hora.

1.2.

Autmatas, compatibilidad y complejidad

La teora de la computacin se encarga del estudio de los niveles abstractos de la computacin de manera interna, esta divida en 3 reas centrales tradicionales: autmata, computabilidad y complejidad. Estas reas estn ligadas por la siguiente pregunta: Cuales son las capacidades y limitaciones fundamentales de las computadoras? Esta pregunta nos remonta a la dcada de 1930 cuando los logsticos matemticos primero empezaron a explorar el significado de computacin. Los avances tecnolgicos desde aquella poca han incrementado inmensamente nuestra habilidad para computar y consigo han trado esta pregunta del mbito terico al mbito prctico. En cada una de estas 3 reas autmata, computabilidad y complejidad esta pregunta es interpretada de manera diferente, y las respuestas varan acorde a la interpretacin obtenida.

El problema de planeacin parece ser mucho ms difcil que el problema del ordenamiento. Si existieran solo mil clases, encontrar el mejor horario puede tardar siglos, aun si contamos con una supercomputadora. Qu es lo que hace que algunos problemas, computacionalmente hablando, sean ms difciles que otros? Esta es la pregunta principal de la teora de la complejidad. Extraordinariamente, todava se desconoce la respuesta, a pesar de que ha sido investigada de manera intensiva durante los ltimos 25 aos. En uno de los mas importantes logros de la teora de la complejidad hasta ahora, investigadores han descubierto un esquema elegante para clasificar problemas acorde a su complejidad computacional. Este descubrimiento es anlogo a la tabla peridica para clasificar elementos acorde a sus propiedades qumicas. Usando este esquema, se puede demostrar un mtodo de dar evidencia que ciertos problemas son computacionalmente mas difciles, aun si no podemos probar que los son. Se cuenta con muchas opciones para lidiar con un problema que aparenta ser computacionalmente difcil. Primero, se debe entender que aspecto del problema es la raz de la dificultad, para que, alterndola, el problema sea ms fcil de resolver. Segundo, se debe determinar una solucin que sea casi perfecta para el problema. En ciertos casos encontrar soluciones que se aproximen a una

Teora de la complejidad
Los problemas de computacin se presentan en diversas formas, algunas veces son fciles otras veces son difciles, por ejemplo, el

Manual de lenguajes y autmatas

solucin prefecta es relativamente fcil. Tercero, algunos problemas son difciles solo bajo el peor caso, pero fciles para los dems casos. Dependiendo de la aplicacin, esto puede ser satisfecho con un procedimiento que ocasionalmente es lento pero es rpido la mayor parte del tiempo. Finalmente, se debe considerar los tipos alternativos de computacin, como la computacin aleatoria, que puede agilizar ciertas tareas.

computadoras que eventualmente puedan ayudar a la construccin de las actuales computadoras. La teora de la computabilidad y la teora de la complejidad son ntimas compaeras. En la teora de la complejidad, el objetivo es el clasificar los problemas como fciles o difciles, mientras que en la teora de la computabilidad la clasificacin de los problemas determina si pueden ser resueltos o no. La teora de la computabilidad toma bastantes conceptos usados en la teora de la complejidad.

Una rea aplicada que ha sido afectada directamente por la teora de la complejidad es el antiguo campo de la criptografa. En la mayora de los campos, un problema computacionalmente fcil es preferible a uno difcil por que los problemas fciles son sencillamente resueltos. Para la criptografa es inusual, por que especficamente requiere problemas computacionales que son difciles, ms que fciles, debido a que los cdigos secretos deben ser difciles de descifrar sin la llave secreta o la contrasea. La teora de la complejidad ha llevado a criptgrafos hacia los problemas computacionalmente difciles sobre los cuales han diseado cdigos nuevos revolucionarios.

Teora del autmata


La teora del autmata lidia con las definiciones y propiedades de los modelos matemticos de computacin. Estos modelos juegan un papel importantes en muchas reas aplicadas de las ciencias computacionales. Un modelo, llamado autmata finito, es usado en procesamiento de texto, compiladores y para el diseo de hardware. Otro modelo, llamado gramticas libres de contexto, es usado en programacin de lenguajes e inteligencia artificial. La teora del autmata es un excelente lugar para empezar el estudio de la teora de la computacin. Las teoras de computabilidad y complejidad requieren una precisa definicin de computadora. La teora del autmata nos permite practicar con definiciones formales de computacin as como presenta conceptos relevantes para otras reas prcticas de las ciencias computacionales.

Teora de la computabilidad
Durante la primera mitad del siglo 20, matemticos como Kart Godel, Alan Turing, y Alonso Church descubrieron que ciertos problemas bsicos no pueden ser resueltos por computadoras. Un ejemplo de este fenmeno es el problema de determinar si un enunciado matemtico es cierto o falso. Esta tarea es el pan de cada da de los matemticos. Parece ser que una solucin generada por computadora puede hacerse dado que estas residen en el reino de las matemticas. Pero ningn algoritmo computacional puede realizar esta tarea. Entre las consecuencias de este profundo resultado es el desarrollo de ideas concernientes a los modelos tericos de las

Manual de lenguajes y autmatas

secuencia continua indefinidamente. As, se escribe el conjunto de nmeros naturales N como: {1, 2, 3, ...} El conjunto de enteros Z se escribe como: {..., -2, -1, 0, 1, 2, ...}

1.3.

Nociones matemticas

El conjunto que tiene cero elementos es llamado conjunto vaco y se escribe como . Cuando se desea describir algn conjunto que contiene elementos de acuerdo a alguna regla, se escribe {n | regla acerca de n}. Por ejemplo: {n | n = m2 para toda m N} Es el conjunto de todos los cuadrados perfectos. Para dos conjuntos A y B, se dice que A es subconjunto de B, escrito como A B, si cada miembro de A tambin es miembro de B. Se dice que A es subconjunto propio de B, escrito A B, si A es subconjunto de B pero no es igual a B. El orden no es importante cuando se describe un conjunto, tampoco es importante la repeticin de sus miembros. Se obtendra el mismo conjunto {57, 7, 7, 7, 21}. Si no se desea tomar el nmero de ocurrencias de los miembros en un conjunto, se le llama multiconjunto, en vez de conjunto. As, {7} y {7, 7} son diferentes como multiconjuntos pero iguales como conjuntos. Si se tienen dos conjuntos A y B, la unin de A y B, descrito como A B, es el conjunto que contiene la combinacin de todos los elementos de A y B en un solo conjunto. La interseccin de A y B, descrito como A B, es el conjunto de elementos que estn en ambos conjuntos, en A y en B. el complemento de A, descrito como A, es el conjunto de todos los elementos que no se encuentran en A.

1.3.1.

Conjuntos

Un conjunto es un grupo de objetos representados como una unidad. Los conjuntos pueden contener cualquier tipo de objetos, incluyendo nmeros, smbolos e, incluso, otros conjuntos. Los objetos que pertenecen a un conjunto son conocidos como miembros o elementos. Los conjuntos pueden ser descritos informalmente de muchas maneras. Una forma de hacerlo es listando los elementos del conjunto entre llaves. As el conjunto: {7, 21, 57} contiene los elementos 7, 21, y 57. Los smbolos y denotan pertenencia y no pertenencia respectivamente. Se escribe 7 {7, 21, 57} y 8 {7, 21, 57}. El orden de mencin de los elementos de un conjunto no es importante, as como las repeticiones que pueda haber de alguno de ellos. Podemos referirnos al conjunto anterior como {57, 7, 7, 7, 21}. Un conjunto infinito contiene un nmero infinito de elementos. No se puede escribir la lista de un conjunto infinito de elementos as que normalmente se utilizan los puntos suspensivos ... para indicar que la

Manual de lenguajes y autmatas

Como es comn en las matemticas, las imgenes ayudan a aclarar los conceptos. Para conjuntos, se utiliza un tipo de imagen llamado Diagrama de Venn. ste representa conjuntos como regiones representadas por crculos.. Por ejemplo, en la siguiente figura, el crculo representa el conjunto empieza-t. Algunos de los miembros de este conjunto se representan como puntos dentro del crculo.

Una funcin tambin es llamada mapeo y, si f(a) = b, se dice que f mapea a en b.El conjunto de las posibles entradas de una funcin es llamado dominio. Las salidas de una funcin forman un nuevo conjunto llamado rango del dominio. La notacin para decir que f es una funcin con dominio D y rango R es: f : D R Considere la funcin f : {0, 1, 2, 3, 4} {0, 1, 2, 3, 4} F(n3 ) 1 2 3 4 5 0

Empieza-t

. . .

Terrible Tundra Teora f(n) = (n + 1) mod 5

N 0 1 2 3 4 5

Fig. 1 Diagrama de Venn para el conjunto empieza-t

Algunas veces se utiliza una tabla bidimensional cuando el dominio de una funcin es el producto cartesiano de dos conjuntos. Por ejemplo la funcin g: Z x Z Z en donde la entrada de la fila, etiquetada i, y la columna, etiquetada j, en la tabla es el valor de g(i, j). g4 0 1 2 3 g(i, j) = (i + j) mod 4 0 0 1 2 3 1 1 2 3 0 2 2 3 0 1 3 3 0 1 2

1.3.2. Funciones y relaciones


Una funcin, es un objeto que establece una relacin de entrada salida. Una funcin, toma una entrada y produce una salida. En todas las funciones, la misma entrada siempre produce la misma salida. Si f es una funcin cuya salida es b cuando tiene como entrada a, se escribe: f(a) = b

Manual de lenguajes y autmatas

Cuando el dominio de una funcin f es A1 x A2 x x An para los conjuntos A1, A2, , An, se dice que la entrada de la funcin es una n-tupla (a1, a2, , an) y se llama a an argumento de f. Una funcin con n argumentos es llamada funcin n-aria y n es llamada la cardinalidad de la funcin. Si n es 1, f tiene un solo argumento, f es llamada funcin unaria. Si n es 2, es una funcin binaria. Ciertas funciones binarias comunes son escritas en forma infija, con el smbolo de la funcin colocado entre los dos argumentos (por ejemplo a + b), a diferencia de la notacin prefija en donde el smbolo de la funcin les precede (por ejemplo suma(a, b)). Un predicado o propiedad es una funcin cuyo rango es {verdadero, falso}. Por ejemplo, par es una funcin que devuelve verdadero si la entrada a la funcin es un nmero par y falso si la entrada a una funcin es un nmero impar. Una propiedad cuyo dominio es el conjunto de n-tuplas A x x A es llamada una relacin, una relacin naria o una relacin n-aria sobre A. Un tipo especial de relacin binaria, llamada relacin equivalente captura la nocin de dos objetos siendo iguales en algn aspecto. Una relacin binaria R es una relacin equivalente si R cumple con tres condiciones:

La nocin ms primitiva es la de smbolo, que es simplemente una representacin distinguible de cualquier informacin. Los smbolos pueden ser cualesquiera, como w, 9, #, etc., pero nosotros vamos a utilizar las letras a, b, c, etc. Un smbolo es una entidad indivisible. Las cadenas de caracteres son llamadas tambin palabras. La longitud de una palabra es la cantidad de letras que contiene, contando las repeticiones; por ejemplo, |perro| es 5. Cuando escribimos varias palabras o caracteres uno a continuacin de otro, se supone que forman una sola palabra (se concatenan). La notacin usada para denotar la concatenacin de dos cadenas A y B es AB. Por ejemplo, si w = abra y v = cada, entonces wvbra es la palabra abracadabra. La concatenacin de palabras es asociativa, esto es, (xy)z = x(yz), pero no conmutativa en el caso general. La longitud de una concatenacin cumple la propiedad: |uv| = |u|+|v|. Una palabra v es sub cadena de otra w cuando existen cadenas x, y - posiblemente vacas tales que xvy = w. Por ejemplo, bora es sub cadena de vbora. Lenguajes Un lenguaje es simplemente un conjunto de palabras. As, {abracadabra} es un lenguaje (de una sola palabra), {Al, baba, y, sus, cuarenta, ladrones} es otro, etc. Formalmente, la palabra casa es la secuencia de letras c, a, s, a. Dado que los lenguajes son conjuntos, podemos efectuar con ellos todas las operaciones de los conjuntos (unin, interseccin, diferencia). Definiremos adems la operacin de concatenacin de lenguajes, escrita como L1 L2, como una extensin de la concatenacin de palabras: L1 L2 = {w|w = xy, x 2 L1, y 2 L2}.

1. R es reflexiva si para cada x, xRx; 2. R es simtrica si para cada x y y, xRy si y slo si yRx; y 3. R es transitiva si para cada x, y y z, xRy y yRz implica xRz.

1.3.3. Cadenas y lenguajes


Cadenas

Manual de lenguajes y autmatas

Por ejemplo, dados los lenguajes L1 = {ca,ma} y L2 = {nta, sa}, la concatenacin L1L2 sera {canta, casa, manta, masa}. Como se ve en este ejemplo, para calcular la concatenacin de dos lenguajes hay que concatenar cada palabra del primero de ellos con cada una del segundo. Una operacin mas complicada es la llamada estrella de Kleene o cerradura de Kleene, en honor al matemtico norteamericano S. C. Kleene, quien la propuso. La definicin de la cerradura de kleene dice: Si L es un lenguaje, L*, llamado cerradura de Kleene de L, es el mas pequeo conjunto que contiene:

La palabra vaca El conjunto L Todas las palabras formadas por la concatenacin de miembros de L*

2.
2.1.

LENGUAJES REGULARES

Autmatas Finitos

Por ejemplo, si L = {abra, cadabra}, L* = {", abra, abraabra, abracadabra, cadabraabra, . . .}. Obsrvese que la definicin de la estrella de Kleene es recursiva, pues en la tercera regla estamos suponiendo que ya hay palabras en L*, las cuales concatenamos para producir una nueva palabra. Esta nocin se puede conceptualizar fcilmente de la siguiente forma: Supongamos que inicialmente L* contiene solo la palabra vaca y los elementos de L. Entonces de ah tomamos dos elementos cualesquiera, que no necesitan ser distintos, y los concatenamos, para producir una palabra, la cual aadimos a L* si no estaba ya. Continuando indefinidamente con esta accin, se ira obteniendo todos los elementos de L*.

Para el estudio de la teora de la computacin se necesitan tres herramientas matemticas bsicas. a) La notacin terica establecida, b) El dominio de los conceptos de funciones y relaciones, c) Buenos conocimientos de induccin matemtica. La capacidad para usar notacin la terica establecida depende, fundamentalmente, del conocimiento de las definiciones bsicas de smbolos y sus significados. Conocer las otras dos herramientas depende de la capacidad para entender razonamientos lgicos. El campo de las ciencias computacionales incluye un amplio rango de temas especiales, desde el diseo de una mquina hasta la programacin. El uso de la computacin en el mundo involucra una riqueza de detalles especficos que deben ser aprendidos para

Manual de lenguajes y autmatas

aplicaciones exitosas. La construccin de modelos es unas de las esencias de cualquier disciplina cientfica, y el uso de una disciplina depende de la existencia de teoras y reglas. La Teora de Lenguajes y Autmatas tiene diversas aplicaciones, como son el diseo digital, lenguajes de programacin y compiladores. Para modelar el hardware de una computadora introducimos la nocin de autmata, que es una construccin que posee las caractersticas indispensables de una computadora digital. Acepta una entrada, produce una salida, puede tener un almacenamiento temporal, y puede decidir en la transformacin de la entrada en la salida.

1.

uv = u {(i+|u|,j)|(i,j) v} En s=xyz, x es llamado prefijo, y es una subcadena, z es un sufijo de s Propiedades de la concatenacin de cadenas: (xy)z = z(yz) x = x = x = x = x

A continuacin se describen algunos conceptos bsicos:

1. Un lenguaje formal: 2. 3. 4.

Consiste de un conjunto de smbolos y algunas reglas de formacin por los cuales esos smbolos pueden ser combinados en entidades llamadas sentencias. Un smbolo: Es una entidad abstracta que no se define formalmente, por ejemplo a,b,1,,@ Un alfabeto : Es un conjunto finito de smbolos, por ejemplo {a,b,c}, {1,2,3} Una cadena: Es una secuencia de smbolos s= s1 s2 ...sn donde si Por ejemplo: casa, del alfabeto {c,a,s,a}

7. Teorema de cardinalidad Es conveniente describir un teorema importante de cardinalidad, el cual nos ayudar a comprender mejor la cerradura de Kleen. Teorema. El conjunto 2N no es numerable Demostracin. Supongamos que 2N es numerable. Dado que es un conjunto infinito, debe suponerse que 2n es enumerable y que por lo tanto, puede ser enumerado de la forma 2N = {A0,A1,.}. Sea D={n n }. Obsrvese que D y, por tanto, D= Ak , para algn k. Consideremos dicho k.Si k Ak, entonces puesto que Ak = D, k no puede estar en Ak. Por otro lado, si k Ak, entonces k D y por tanto k debe estar en Ak. Ambas posibilidades nos llevan a una contradiccin. Por consiguiente, la suposicin de que 2 es enumerable es incorrecta.

5. La cadena nula : Es la cadena de longitud 0


6. Concatenacin: Si x y y son cadenas, la concatenacin de las dos se denota xy Si tenemos las cadenas: la, pelota del alfabeto {l,a,p,e,o,t}, entonces la concatenacin de ambas cadenas es: la pelota Sean u,v dos cadenas, entonces

10

Manual de lenguajes y autmatas

8. La Concatenacin de Lenguajes: Es una extensin de la


concatenacin de cadenas; es una operacin que se puede manejar desde diferentes puntos de vista. 9. Un lenguaje: L es un conjunto finito o infinito de cadenas tomadas de algn alfabeto, por ejemplo el lenguaje espaol, ingls, binario. Los lenguajes que nos interesan son aquellos que se componen por cadenas que cumplen ciertas propiedades. 10. Un lenguaje de cardinalidad infinita: Puede ser descrito por un conjunto finito de reglas (sintaxis, gramtica). La teora de lenguajes formales estudia los procedimientos de especificacin, reconocimiento y manipulacin de conjuntos de cadenas formadas a partir de un conjunto de smbolos. 11. El reconocimiento de patrones: Es usado en Procesamiento de Seales, Inteligencia Artificial, Bases de Datos, etc. Normalmente se representa al patrn como una cadena de caracteres que hay que reconocer en una cadena ms grande 2.1.1. AUTMATAS FINITOS DETERMINSTICOS (DFA) Concepto: Si = {a,b}, entonces * = {a, aa, aaa, ..., b, bb, ..., ab, aba, abb } Si es el alfabeto, entonces L *, siendo L un lenguaje del alfabeto Un autmata finito determinstico es una quinta tupla (Q, , q0, F, ) donde: Q: : q0: F: : Conjunto finito de estados (Conjunto de estados). Alfabeto de entrada finito (Alfabeto). Elemento de Q, el estado inicial (Estado inicial). F Q el conjunto de estados finales o de aceptacin (Conjunto de estados finales). Q x Q que determina el nico estado siguiente para el par (q1,), correspondiente al estado actual q1 y a la entrada . (Funcin asociadas con el DFA M).

Caractersticas de autmatas finitos determinsticos (DFA):

11

Manual de lenguajes y autmatas

Un conjunto finito de estados y un conjunto de transiciones de estado a estado, que se dan sobre smbolos de entrada tomados en un alfabeto . Para cada smbolo de entrada existe exactamente una transicin d a partir de cada estado. Un estado, por lo general denotado como q0 es el estado inicial, en el que el autmata comienza. Algunos estados estn designados como final o de aceptacin.

F = {q1}

Tabla 1. Tabla de transicin

Se puede utilizar tambin la siguiente lista para definir la funcin (q0, a) = q1 (q0, b) = q0 (q1, b) = q1 (q1, b) = q0 El diagrama de transicin se muestra a continuacin:

a a

Ejemplo 1: El lenguaje que acepta el DFA esta formado por todas las cadenas sobre Q={q0, q1} el alfabeto = {a,b}, q0= q0, F = {q1} y se define mediante la tabla 1.

q0

q1

= { a, b } q 0 = q0

q0

A q1 q1

b q0 q0
Fig. 2 Diagrama de transicin

Q = {q0, q1}

q1

12

Manual de lenguajes y autmatas

Ejemplo 2: El DFA M = {Q, , q0, F, } acepta el lenguaje L(M) = {w {a,b}* que no contiene tres bs consecutivas} y esta represntada por Q={q0, q1, q2, q3} = {a,b} q0= q0, F = { q0, q1, q2} y dada por la tabla 2 q0 q1 q2 q3 A Q0 Q0 Q0 q3 b q1 q2 q3 q3
a a a b b a, b

q
o

q
1

q a
2

q
3

Fig 3 Diagrama de transicin

13

Manual de lenguajes y autmatas

Ejemplo 3:
2.1.2. AUTMATAS FINITOS NO DETERMINSTICOS (NFA).
a a a

Un autmata finito no determinstico es una quinta tupla (Q, , q0, F, ) donde: Q: : q0: F: : Conjunto finito de estados (Conjunto de estados). Alfabeto de entrada finito (Alfabeto). Elemento de Q, el estado inicial (Estado inicial). F Q el conjunto de estados finales o de aceptacin (Conjunto de estados finales). Es una transformacin de Q x a 2Q (Recurdese que 2Q es el conjunto de potencias de Q, el conjunto de todos los subconjuntos de Q). Es una relacin para todo par (q, ) compuesto por el estado actual y el smbolo de la entrada (q, ), es una coleccin de ceros o ms estados [es decir, (q, )Q]. Indica que para todo estado q1, se puede tener cero o ms alternativas a elegir como estado siguiente, todos para el mismo smbolo de entrada.
q
0

q
1

q
2

a b q
3

q
4

(q, ) Q:

Fig. 4

14

Manual de lenguajes y autmatas

El NFA anterior acepta el lenguaje formado por cualquier numero (incluyendo el cero) de as, concatenadas a una b una a concatenada a cualquier nmero (incluyendo el cero) de bs. Se presenta de la siguiente forma: Q = {q0, q1, q2, q3, q4} F = {q2, q3, q4} q0= q0 = {a,b} Y Tabla 3

Q: : q0: F: :

Conjunto finito de estados (Conjunto de estados). Alfabeto de entrada finito (Alfabeto). Elemento de Q, el estado inicial (Estado inicial). F Q el conjunto de estados finales o de aceptacin (Conjunto de estados finales). Es una transformacin de Q x ( { }a 2Q para incluir transiciones de un estado a otro que no dependan de ninguna entrada. Se puede aadir una columna de para colocar los pares de la forma (q0, ). Cuando hay transiciones en un NFA es conveniente suponer que cada estado tiene una - transiciones que cicla en ese estado.

Ejemplo 4: El siguiente diagrama de transicin acepta el lenguaje consistente en cualquier nmero (incluyendo ceros) de 0s seguidos por cualquier nmero de 1s seguido, a su vez, por cualquier nmero de 2s.

Estados q0 q1 q2 q3 q4
Q3

a {q1, q4} {q1}

b {q3} {q2} { q4}

2.1.3. AUTMATAS FINITOS NO DETERMINSTICOS -


Un autmata finito no determinstico con movimiento (entrada vaca ) es una quntupla:
q0 q1

q2

15

Manual de lenguajes y autmatas

Fig 5 Diagrama de transicin

concepto y enfatizar en las tres operaciones vlidas que se pueden utilizar entre ellos. Lenguaje regular: Es aquel que puede ser descrito por expresiones regulares y autmatas finitos deterministas Expresiones regulares (e.r.): De un alfabeto son conjuntos de cadenas definidos como sigue:

es una e.r. que denota el conjunto vaco es una e.r. que denota el conjunto {}

{a}

Para cada a , a es una e.r. que denota el conjunto Si p y q son e.r. entonces (p+q), (pq) y (p*) denotan los conjuntos PQ, PQ y P* respectivamente

Estados q0 q1 q2

0 {q0}

1 {q0}

2 {q0}

{q0} {q0}

Son expresiones regulares: (x + y)*w (0 + 1)* (0 + 1 + ... + 9 )* (0 + 1 + ... + 9 )* No son expresiones regulares : xn yn an b2k an Cada expresin regular r de un alfabeto representa un lenguaje denotado por L(r). Existen diferentes formas de representar expresiones regulares, dependiendo de la complejidad de la condicin establecida. Como veremos, el significado de una ER da como resultado un conjunto, por lo tanto las propiedades de los conjuntos son vlidas para las ER. Sin embargo debemos considerar el orden cuando se trata de una operacin

Tabla 4 de transicin

2.2.

Expresiones y conjuntos regulares


Lenguaje regular: Es aquel que puede ser descrito por Expresiones Regulares, para ello debemos definir este

16

Manual de lenguajes y autmatas

de concatenacin de palabras ya que all si afecta la propiedad conmutativa. b(a+b)* = b,bb,ba,. El significado de una expresin regular: 2
*

El significado de una expresin regular es una funcin definida de la manera siguiente:

: ER

La parte de la derecha tiene que ser un elemento de un conjunto ya que la funcin va de una ER a un elemento del conjunto. En * no hay un elemento de esa naturaleza, pero en 2 * si lo hay Una ER que tenga cadenas con al menos dos ceros consecutivos, est representada por: (0+1)*00(0+1)* La inversa de una cadena abc es cba. Este concepto es fcilmente entendido por una persona que programa, porque existen funciones en los lenguajes de programacin que obtienen la inversa de una cadena.


R,S son ER

() = ( ) = { } (a) = {a }, a

(RS) =(R) (S) (R+S) =(R) (S) (R*) =(R)*

Equivalencias principales de las Expresiones Regulares La prctica se pone de manifiesto cuando queremos detectar igualdades de expresiones regulares. Existen ocho equivalencias principales, las cuales se usarn como frmulas para extender a otras expresiones. Equivalencias principales:

En el alfabeto = {a,b} Tenemos que


2
*

*= 0 1 2 3 * = {a,b} {ab, ba, aa, bb} * = {a,b,ab,ba,aa,bb,}

= { a,b,ab,ba,aa,bb, {a,b}, {a,ab}, {a,aa},,{a,b,ab},}

Si tenemos una ER que reconozca a las palabras que empiecen con la letra b, entonces la solucin sera:

17

Manual de lenguajes y autmatas

Tabla 5

que est en la cima. El dispositivo ser no determinstico y tendr un nmero finito de alternativas de movimiento en cada situacin.
3. R (S+T)=R S + R T (S+T) R=S R+T R 6.(R+S)*=(R*+S*)* =(R*S*)*=(R*S)*R* =R*(SR*)* R*+S* 9. R=SR+T ssi R=S*T R=RS+T ssi R=TS*

1. (R+S)=(S+R) (R+S)+T=R+(S+T) R+=+R=R R+R=R 4.R*=R* R*=(R*)*= (+R)* 7. R*R=RR* R(SR)*=(RS)*R

2. R = R=R R = R= (R S) T=R (S T) 5.R*=+RR*

C Estado q1 R

0
Cinta de entrada

8. (R*S)*= +(R+S)*S (RS*)*=+R(R+S)*

Lo que procede es la comprobacin de las igualdades, considerando las definiciones de cerradura de Kleen, cerradura positiva de Kleen y concatenacin de ER.

Cima de la pila

Fig. 6 Autmata de pila

3.

LENGUAJES LIBRES DE CONTEXTO

Un autmata de pila M es un sistema (Q, , , q0, Z0, F, ), en donde: Q Es un conjunto finito de estados Es el alfabeto llamado alfabeto de entrada Es el alfabeto, conocido como alfabeto de pila q0 Q Es el estado inicial Z0 Es el smbolo llamado smbolo inicial. F Q Es el conjunto de estados finales Es una transformacin de Q x ( { }) x subconjuntos finitos Q x *.

3.1.

Autmatas de pila (PDA)

Autmata de pila (Push-down): Es un autmata que cuenta con un mecanismo que permite almacenamiento ilimitado y opera como una pila. Tiene una cinta de entrada, un control finito y una pila. La pila es una cadena de smbolos de algn alfabeto. El smbolo que se encuentra ms a la izquierda se considera como

en los

Ejemplo:

18

Manual de lenguajes y autmatas

El siguiente ejemplo representa un autmata de pila que acepta a {wcwR|w (0+1)*} mediante un agotamiento de pila M = (Q, , , q0, Z0, F, ) donde: Q = { q1, q2} q0 = q1 = {0, 1, C} Z0 = R = {R, B, G} F= Y est definida por: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. (q1, O, R) = {(q1, BR)} (q1, O, B) = {(q1, BB)} (q1, O, G) = {(q1, BG)} (q1, c, R) = {(q2, R)} (q1, c, B) = {(q2, B)} (q1, c, G) = {(q1, G)} (q2, O, B) = {(q2, )} (q2, , R) = {(q2, )} (q1, 1, R) = {(q1, GR)} (q1, 1, B) = {(q1, GB)} (q1, 1, G) = {(q1, GG)} (q1, 1, G) = {(q2, )}

3.2.

rbol de derivacin

Las GLC (Gramticas libres al contexto) tienen la propiedad de que las derivaciones pueden ser representadas en forma arborescente. Por ejemplo, considrese la gramtica siguiente para producir el lenguaje de los parntesis bien balanceados, que tiene palabras como (()), ()(), (()()) (), pero no a (() ni)(. Esta gramtica puede ser diseada adaptando la de {anbn}, reemplazando a por (yb por), y agregando la primera regla, que toma en cuenta la posibilidad de tener varios grupos de parntesis anidados. 1. S SS 2. S (S) 3. S () Usando esta gramtica, la palabra (()())() puede ser derivada de la manera que se ilustra en la figura. En dicha figura se puede apreciar la estructura que se encuentra implcita en la palabra (()())(). A estas estructuras se les llama rboles de derivacin, o tambin rboles de compilacin por usarse extensivamente en los compiladores y son de vital importancia para la teora de los compiladores de los lenguajes de programacin.

Analizando la cadena 01C10 usando el PDA anterior se obtiene lo siguiente: (q1, 01C10, R) por la regla 1 (q1, 1C10, BR) por la regla 10 (q1, C10, GBR) por la regla 6 (q1, 10, GBR) por la regla 12 (q1, 0, BR) por la regla 7 (q1, , R) por la regla 8 (q1, , ) y se agota la pila.

19

Manual de lenguajes y autmatas

Fig. 7 Se puede considerar que un rbol de derivacin es ms abstracto que una derivacin lineal es decir, una sucesin S w en el sentido de que para un solo rbol de derivacin puede haber varias derivaciones lineales, segn el orden en que se decida expandir los no terminales. Por ejemplo, para el rbol de la figura arriba, hay al menos las derivaciones siguientes (anotamos como subndice de) el numero de regla aplicado): 1. S )1 SS )2 (S)S )3 (S)() )1 (SS)() )3 (S())() )3 (()())(). 2. S )1 SS )3 S() )2 (S)() )1 (SS)() )3 (()S)() )3 (()())(). Formalmente, un rbol de derivacin es un grafo dirigido arborescente. Un grafo arborescente se caracteriza por no tener ciclos, y por el hecho de que existe una trayectoria nica para llegar de la raz a un nodo cualquiera, definido de la manera siguiente: Definicin. 1. 2. 3. 4. Sea G = (V, , R, S) una GLC. Entonces un rbol de derivacin cumple las siguientes propiedades:

nodos hoja, en un recorrido en orden del rbol de derivacin, se llama el producto del rbol. Es decir, al efectuar un recorrido en orden del rbol de derivacin recuperamos la cadena a partir de la cual se construy dicho rbol. As, el problema de compilar una cadena de caracteres consiste en construir el rbol de derivacin a partir del producto de ste.

Cada nodo tiene una etiqueta La raz tiene etiqueta S. La etiqueta de los nodos que no son hojas debe estar en V, y las de las hojas en { }. Si un nodo n tiene etiqueta A, y los nodos n1, . . . , nm son sus hijos (de izquierda a derecha), con etiquetas respectivamente A1, . . . , Am, entonces A A1, . . . ,Am R.

Definicin.

La cadena de caracteres que resulta de concatenar los caracteres terminales encontrados en las etiquetas de los

3.3. Gramticas libres de contexto

20

Manual de lenguajes y autmatas

Introduccin: Los Lenguajes Libres de Contexto (abreviado LLC) forman una clase de lenguajes ms amplia que los Lenguajes Regulares, de acuerdo con la Jerarqua de Chomsky. Estos lenguajes son importantes tanto desde el punto de vista terico, por relacionar las llamadas Gramticas Libres de Contexto con los Autmatas de Pila, como desde el punto de vista prctico, ya que casi todos los lenguajes de programacin estn basados en los LLC. En efecto, a partir de los aos 70s, con lenguajes como Pascal, se hizo comn la prctica de formalizar la sintaxis de los lenguajes de programacin usando herramientas basadas en las Gramticas Libres de Contexto, que representan a los LLC. Por otra parte, el anlisis automtico de los LLC es computacionalmente mucho ms eficiente que el de otras clases de lenguajes ms generales. Una regla es una expresin de la forma , en donde tanto como son cadenas de smbolos en donde pueden aparecer tanto elementos del alfabeto (llamados constantes) como unos nuevos smbolos, llamados variables. Una gramtica es bsicamente un conjunto de reglas. Consideremos, por ejemplo, la siguiente gramtica para producir un pequeo subconjunto del idioma espaol: 1. <frase> <sujeto> <predicado> 2. <sujeto> <articulo> <sustantivo> 3. <articulo> el | la 4. <sustantivo> perro | luna 5. <predicado> <verbo> 6. <verbo> brilla | corre

donde el smbolo | separa varias alternativas. En esta gramtica se supone que las variables son <frase>, <sujeto>, <articulo>, <sustantivo>, <predicado> y <verbo>, mientras que las constantes son el, la, perro y luna. La variable <frase> ser considerada el smbolo inicial.

Gramticas y la jerarqua de Chomsky: Es posible restringir la forma de las reglas gramaticales de manera que se acomoden a patrones predeterminados. Por ejemplo, se puede imponer que el lado izquierdo de las reglas sea una variable, en vez de una cadena arbitraria de smbolos. Al restringir las reglas de la gramtica se restringen tambin las palabras que se pueden generar; no es extrao que las reglas de formas ms restringidas generen los lenguajes ms reducidos. N. Chomsky propuso varias formas estndares de reglas que se asocian a varias clases de lenguajes, que orden de manera tal que forman una jerarqua, es decir, los lenguajes ms primitivos estn incluidos en los ms complejos. As tenemos las siguientes clases de gramticas, asociadas a familias de lenguajes: 1. Gramticas regulares, o de tipo 3: Las reglas son de la forma A aB o bien A a, donde A y B son variables y a es constante. Estas gramticas son capaces de describir los lenguajes regulares. Gramticas Libres de Contexto (GLC), o de tipo 2: Las reglas son de la forma X , donde X es una variable y es una cadena que puede contener variables y constantes. Estas gramticas producen los lenguajes Libres de Contexto (abreviado LLC).

2.

21

Manual de lenguajes y autmatas

3.

Gramticas sensitivas al contexto o de tipo 1: Las reglas son de la forma A , donde A es una variable y , , y son cadenas cualesquiera que pueden contener variables y
Si , relacin entre | | y | |

Fig. 8 Clasificacin de Chomsky


Solucin

Gramtica

Lenguaje

Reglas de Produccin

Tipo-0 Tipo-1 Tipo-2 Tipo-3

Recursivas Dependiente de contexto Independiente de contexto Regular

Sin restricciones A A A> aB Aa | | | | | | = 1

Mquinas de Turing Autmatas lineales acotados Autmatas de pila Autmatas finitos, regulares

De forma grfica tenemos a continuacin la siguiente tabla: Tabla 6.

constantes. 4. Gramticas no restringidas, o de tipo 0. Con reglas de la forma , donde no puede ser vaco, que generan los lenguajes llamados recursivamente enumerables.

Los lenguajes de tipo 0 incluyen a los de tipo 1, estos a los de tipo 2, etc.

Lenguajes y gramticas libres de contexto (LLC y GLC):

22

Manual de lenguajes y autmatas

Podemos ver que la gramtica del espaol dada arriba es una GLC, pero no podra ser una gramtica regular, pues hay varias reglas que no corresponden al formato de las reglas de las gramticas regulares. Se ve por lo tanto que el formato de las reglas es menos rgido en las GLC que en las gramticas regulares, y as toda gramtica regular es GLC pero no viceversa. Por ejemplo, el lenguaje {anbn} que no es regular, tiene la gramtica libre de contexto con las siguientes reglas: 1. S aSb 2. S ab Como vimos en el caso de las gramticas regulares, aplicar una regla X de una gramtica consiste en reemplazar X por en una palabra. Por ejemplo, la regla S aSb se puede aplicar a una palabra aaSbb para obtener la palabra aaaSbbb, en donde es fcil ver que reemplazamos S por aSb. Al proceso de aplicar una regla se le conoce como paso de derivacin, y se denota usando una flecha gruesa , como en aaSbb aaaSbbb (aplicando una regla S aSb). Una secuencia de pasos de derivacin a partir de una variable especial de la gramtica llamada smbolo inicial se llama simplemente derivacin. Por ejemplo, una derivacin de la palabra aaabbb utilizando la gramtica de {anbn} sera (suponiendo que S es el smbolo inicial): S aSb aaSbb aaabbb

Como un ejemplo adicional, la gramtica con las reglas siguientes permite generar expresiones aritmticas con sumas y multiplicaciones de enteros: 1. E E + T 2. E T 3. T T F 4. T F 5. F CF 6. F C 7. C 0|1|2|3|4|5|6|7|8|9 El smbolo inicial aqu es E, las constantes son +, y las cifras 0 . . . 9; E, T, F, C son variables. Con esta gramtica podemos generar, por ejemplo, la expresin 25+312 de la manera siguiente:

23

Manual de lenguajes y autmatas

Formalizacin de las GLC: Definicin. V Una gramtica libre de contexto es un cudruplo (V, , R, S) en donde: Es un alfabeto de variables, tambin llamadas noterminales. Es un alfabeto de constantes, tambin llamadas terminales. Suponemos que V y son disjuntos, esto es, V = . El conjunto de reglas, es un subconjunto finito de V (V )*. El smbolo inicial, es un elemento de V . La gramtica de {anbn} que presentamos antes se representa formalmente como: ({S}, {a, b}, {(S, aSb), (S, ab)}, S) Usualmente las reglas no se escriben como pares ordenados (X, ), sino como X ; esto es simplemente cuestin de notacin. Tabla 7 Definicin. El lenguaje L(G) generado por una gramtica (V, , R, S) es el conjunto de palabras hechas exclusivamente de constantes, que son derivables a partir del smbolo inicial: L = {w |S . . . w} Es posible formalizar la definicin de lenguaje aceptado sin tener que recurrir a los puntos suspensivos . . . , que son un recurso poco elegante en la formalizacin matemtica desde el punto de vista de que recurren a la imaginacin del lector para reemplazarlos por la sucesin que se representa.

R S Ejemplo.

3.4.

Ambigedad

24

Manual de lenguajes y autmatas

Una GLC G: Se dice que es ambigua si existe alguna w L(G) que tiene al menos dos rboles de derivacin. Alternativamente, la ambigedad implica la existencia de dos o ms derivaciones por la izquierda o por la derecha. Ambigedad: Es una caracterstica comn de los lenguajes naturales, donde sta es tolerada y tratada con una variedad de formas. En los Lenguajes de Programacin, en donde debera haber una interpretacin para cada cadena, la ambigedad debe ser eliminada cuando sea posible. Siempre podemos lograrlo reescribiendo la gramtica en una forma no ambigua. Consideremos la gramtica G = (V,T,E,P) con V = {E,I}, T = {a,b,c,+,*,(,)}, y las producciones E I, E E + E, E E * E, E (E), I a|b|c. Las cadenas (a+b)*c y a*b+c estn en L(G). Es fcil ver que esta gramtica genera un subconjunto de expresiones aritmticas para lenguajes de programacin como C o Pascal. La gramtica es ambigua.

Fig. 9 Ejemplo de ambigedad dentro de un lenguaje G

Ejemplo de ambigedad: La cadena a+b*c tiene dos rboles de derivacin, tal y como se muestra en la siguiente figura:

Solucin:

25

Manual de lenguajes y autmatas

Una forma de resolver la ambigedad es asociar reglas de precedencia con los operadores + y *. Debido a que * normalmente tiene una precedencia mayor que +, tomaremos como parseo correcto el del primer rbol de la figura anterior, el cual indica que b*c es una subexpresin a ser evaluada antes de ejecutar la adicin. Sin embargo, esta resolucin est completamente fuera de la gramtica. Es mejor volver a escribir la gramtica de modo que solo un parser sea posible. Al re-escribir esta gramtica introducimos nuevas variables, tomando V como {E,T,F,I} y reemplazamos las producciones con E T, T F, F I, E E + T, T T * F, F (E), I a|b|c. Un rbol de derivacin de la sentencia a+b*c se muestra en la siguiente figura:

Fig. 10 rbol sintctico sin ambigedad Ningn otro rbol de derivacin es posible para esta cadena, es decir, la gramtica no es ambigua. No hay un procedimiento general para eliminar la ambigedad en una gramtica.

26

Manual de lenguajes y autmatas

3.5.

Gramticas sensibles al contexto

Las gramticas sensibles al contexto (CSG de sus siglas en ingls Context-Sensitive Grammar): Producen una clase de lenguajes que est estrictamente situada entre los lenguajes libres de contexto y los lenguajes recursivos y se conocen como lenguajes sensibles al contexto (CSL de sus siglas en ingls Context-Sensitive Language). Una gramtica G=(N, , S, P): Es una gramtica sensible al contexto si todas las producciones son de la forma , donde , , (N )+ y | | | |. Donde: N es un alfabeto de smbolos no terminales. es un alfabeto de smbolos terminales con N =. SN es el smbolo inicial. P es un conjunto finito de producciones de la forma , donde , , (N )+. Por ejemplo, la gramtica dada por: S abc|aAbc Ab bA Ac Bbcc bB Bb aB aa|aaA El anterior ejemplo es una gramtica sensible al contexto. Esta gramtica genera el lenguaje sensible al contexto {an bn cn| n 1}, con lo que tenemos un ejemplo de un lenguaje sensible al contexto que no es libre de contexto.

Toda gramtica libre de contexto se puede poner en forma normal de Chomsky, en la cual las producciones son de la forma A o tambin ABC. Puesto que las producciones de esta forma satisfacen la definicin de gramticas sensibles al contexto, se deduce que toda gramtica libre del contexto es tambin una gramtica sensible al contexto. Por tanto el conjunto de los lenguajes sensibles al contexto contiene el conjunto de los lenguajes libres de contexto. La restriccin de que el lado derecho de las producciones en una gramtica sensible al contexto sea al menos tan largo como el lado izquierdo hace que la gramtica sea no contrctil. Puesto que la cadena vaca tiene longitud 0, podemos definir que L(G), para cualquier gramtica G sensible al contexto. Los lenguajes sensibles al contexto son exactamente los lenguajes aceptados por los autmatas lineales acotados, mquinas de Turing no determinstica en donde la cabeza de la cinta visita un nmero de celdas que son una constante mltiple de la longitud de una cadena de entrada. NOTA: Los lenguajes sensibles al contexto contienen, propiamente, a los lenguajes libres de contexto. A su vez, los lenguajes recursivos contienen propiamente a los lenguajes sensibles al contexto, como se vio en la clasificacin de las gramticas

27

Manual de lenguajes y autmatas

4.
4.1.

Lenguajes recursivamente enumerables

En un movimiento, dependiendo del smbolo barrido por la cabeza de la cinta y del estado de control finito, la mquina de Turing: 1. Cambia de estado, 2. Imprime un smbolo en la celda de la cinta que est siendo barrida, sustituyendo lo que se encontraba ah escrito y 3. Mueve su cabeza una celda hacia la izquierda o la derecha. De manera formal, una mquina de Turing (TM de sus siglas en ingls Turing Machine) se representa por: M=(Q, , , , q0, B, F) en donde: Q B es un conjunto finito de estados. es el conjunto finito de smbolos de cinta admisibles. smbolo de , es el espacio en blanco. subconjunto de que no incluye a B, es el conjunto de los smbolos de entrada.

Mquinas de Turing

Explicacin del modelo bsico: Tiene un control finito, una cinta de entrada que est dividida en celdas y una cabeza de cinta que barre una celda de la cinta a la vez. La cinta tiene una celda que est ms a la izquierda, pero se extiende de manera infinita hacia la derecha. Cada celda de la cinta puede contener exactamente un smbolo de un nmero infinito de smbolos de la cinta. Inicialmente, las n celdas que estn ms a la izquierda, para alguna n 0 finita, sujetan la entrada, que es una cadena de smbolos escogidos de un subconjunto de los smbolos de la cinta, llamados smbolos de entrada. Cada una del nmero infinito de celdas restantes sujetan el espacio en blanco, que es un tipo especial de smbolo que no es de entrada.

a1

a2

...

ai

...

an

...

es la funcin de movimientos siguiente, una transformacin de Q x a Q x x {L, R} ( puede sin embargo, permanecer indefinida por algunos argumentos). q0 en Q es el estado inicial. F Q es el conjunto de estados finales. En esta definicin se supone que el valor inicial de todas las celdas de la cinta es el smbolo B. La definicin requiere que B . Generalmente permitimos que - {B}. La funcin de transicin transforma pares (q, ) formados por el estado actual y los smbolos de la cinta en ternas de la forma (p, t, x), donde p es el estado siguiente, t es el smbolo escrito en la cinta y x es un movimiento de lectura/escritura de la cabeza, que puede ser L o R, segn que el movimiento sea hacia la izquierda o hacia la derecha (nos imaginamos que la cinta se extiende de izquierda a derecha).

Cabeza de lectura/escritura

Fig. 11 Mquina de Turing 28

Manual de lenguajes y autmatas

Por ejemplo, la transicin (q1, a)=(q5, b, R) provoca que la TM pase de una configuracin de la figura izquierda a la configuracin de la figura derecha.

Ejemplo Consideremos la mquina de Turing que acepta el lenguaje regular a*, definida mediante

Cabeza Escritura/ Lectura


Estado interno q1. Fig. 12

Cabeza Escritura/ Lectura


Estado interno q1.

Q ={q1, q2} ={a, b} ={a, b, B} F ={q2} q0 =q1 y dada por la siguiente tabla 8: los datos de tambin se pueden listar de la siguiente manera:

1. (q1, a) = (q1, a, R) 2. (q1, B) = (q2, B,R)


Por lo tanto, la ejecucin de la mquina de Turing para la cadena aaa es la siguiente configuracin: q1aaa por la regla 1 por la regla 1 aaaq1B, por regla 2 aq1aa, por la regla 1 aaaBq2 aaq1a,

Usaremos una descripcin instantnea (ID) de la mquina de Turing, para su notacin denotando el paso de una configuracin a otra por medio del smbolo .

Esta mquina de Turing para en el estado q2, slo si se analiza + una cadena de cero o ms as. Las notaciones * y tienen el significado usual cero o ms o una o ms, respectivamente. Cuando (q, a) est indefinido y la configuracin de la mquina de Turing es imposible que pase a otra se dice que la mquina de Turing

29

Manual de lenguajes y autmatas

est parada. La secuencia de todos los movimientos que conducen a una configuracin de parada se llama computacin. Para los casos donde la mquina de Turing nunca parar se dice, que la mquina se encuentra en un bucle infinito.

Funciones De Una Mquina De Turing.

Si (i1,...,ik) se define para toda i1,...,ik, entonces decimos que es una funcin totalmente recursiva. La funcin (i1,...,ik) calculada por una mquina de Turing se conoce como funcin parcialmente recursiva. Las funciones parcialmente recursivas pueden detenerse o no en una entrada dada. Las funciones totalmente recursivas corresponden a los lenguajes recursivos, ya que son calculadas por TMs que siempre se detienen. Todas las funciones ariTMticas corrientes sobre los enteros, como la multiplicacin, n!, [log2nn] y 22n, son funciones totalmente recursivas. Ejemplo: La sustraccin propia, m n se define como m-n para m n y cero para m< n. La TM M=({q0, q1, ..., q6}, {0, 1}, {0, 1, B}, , q0, B, ) que se define ms adelante, y que comienza con 0m10n en su cinta, se detiene con 0m n en su cinta. M sustituye de manera repetida su 0 del frente por un espacio en blanco, entonces busca hacia la derecha un 1 seguido por un 0 y cambia el 0 por 1. En seguida M se mueve hacia la izquierda hasta que encuentra un espacio en blanco y entonces repite el ciclo. La repeticin termina si: a) Buscando hacia la derecha un 0, M encuentra un espacio en blanco. Entonces los n 0s, que estn en 0m10n han sido todos cambiados a 1s y n+1 de los m 0s se han cambiado a B. M sustituye a los n+1 1s por un 0 y n Bs, dejando m - n 0s en su cinta. b) Comenzando el ciclo, M no puede encontrar un 0 que sea cambiado a un espacio en blanco, debido a que los primeros m 0s ya han sido cambiados. Entonces n m, de modo que m n=0. M sustituye todos los 1s y 0s restantes por B.

La mquina de Turing puede considerarse como una computadora de funciones que van de los enteros a los enteros. El planteamiento tradicional consiste en representar a los enteros como

Estados q1 q2
Q3

a (q1, a, R) --

b ---

B (q2,B, R) --

nmeros unitarios; el entero i 0 se representa mediante la cadena 0i. Si una funcin tiene k argumentos, i1, i2, ..., ik, entonces estos enteros se colocan inicialmente en la cinta separados por 1s: 0i1 10i2 ... 10ik. Si la TM se detiene (est o no en un estado de aceptacin) con una cinta que consiste en 0m para alguna m, entonces decimos que (i1,i2,...,ik)=m, en donde es la funcin de k argumentos calculada por esta mquina de Turing. Advirtase que una TM puede calcular una funcin de un argumento, una funcin diferente de dos argumentos y as sucesivamente. Si la TM M calcula la funcin de k argumentos, entonces no necesariamente tiene un valor para cada conjunto diferente de k tuplas de enteros i1,...,ik.

30

Manual de lenguajes y autmatas

encontrar una B. Esta B se cambia de nuevo a 0, el estado q 6 es accesado y M se detiene. La funcin se descubre a continuacin:

1. (q0,0) = (q1,B,R)
Comienza. Sustituye el 0 del frente por B.

6. (q0,1) = (q5,B,R)

(q5,0) = (q5,B,R) (q5,1) = (q5,B,R) (q5,B) = (q6,B,R) Si en el estado q0 se encuentra un 1 en lugar de un 0, el primer bloque de 0s ha sido agotado, como en la situacin (b) anterior. M accede el estado q5 para borrar el resto de la cinta, entonces accede el estado q6 y se detiene.

2. (q1,0) = (q1,0,R)

(q1,1) = (q2,1,R) Estructura hacia la derecha, buscando el primer 1.

3. (q2,1) = (q2,1,R)

(q2,0) = (q3,1,L) Estructura hacia la derecha saltndose los1s hasta que se encuentra un 0. Cambia ese 0 por 1.

Nota: Recuerde que un movimiento de lectura/escritura de la cabeza, puede ser L o R, segn que el movimiento sea hacia la izquierda o hacia la derecha, vista en la definicin de TM.

4. (q3,0) = (q3,0,L)

(q3,1) = (q3,1,L) (q3,B) = (q0,B,R) Se mueve hacia la izquierda a un espacio en blanco. Accede el estado q0 para repetir el ciclo.

5. (q2,B) = (q4,B,L)

(q4,1) = (q4,B,L) (q4,0) = (q4,0,L) (q4,B) = (q6,0,R) Si en el estado q2 se encuentra una B antes que un 0, tenemos la situacin del inciso (a) descrita ms arriba. Se accesa el estado q 4 y se mueve hacia la izquierda, cambiando todos los 1 por Bs hasta

31

Manual de lenguajes y autmatas

4.2.

Extensin de la mquina de Turing

b.

Mquina de Turing Multipista

Hay otras definiciones de las mquinas de Turing que son equivalentes. Algunos de esos modelos alternativos son mucho ms complicados aunque todos tienen la misma potencia computacional (o de clculo). Muchas de ellas dotan de mayor flexibilidad al diseo de una mquina de Turing que resuelva un problema en particular. Ejemplos [Kelley Dean]: a. Mquina de Turing con Directiva de Permanecer

Es aquella mediante la cual cada celda de la cinta se divide en subceldas. Cada subcelda es capaz de contener smbolos de la cinta. La cinta tiene cada celda subdividida en tres subceldas. Se dice que esta cinta tiene mltiples pistas. Puesto que cada celda de esta mquina de Turing contiene mltiples caracteres, el contenido de las celdas de la cinta puede ser representado mediante n-tuplas ordenadas. En el ejemplo, las celdas de la cinta contienen (B, a, a), (b, a, a) y (b, b, B). Por tanto, los movimientos que realice est mquina dependern de su estado actual y de la n-tupla que represente el contenido de la celda actual. Fig. 13

Recurdese que la mquina de Turing sencilla sita la cabeza de lectura/escritura sobre el primer B que haya a la izquierda de la posicin actual. Para hacerlo, busca fuera de la celda actual y retrocede. Esto es debido a la definicin original que requiere que por cada transicin se mueva la cabeza de la cinta. La funcin de transicin estaba definida como: : Q x Q x x {R, L} y puede ser modificada como: : Q x Q x x {R, L, S} donde S significa permanecer, es decir no mover la cabeza de lectura/escritura. Por tanto (q, )=(p, , S) significa que se pasa del estado q al p, se escribe en la celda actual y la cabeza se queda sobre la celda actual.

Q3

B a a

b B a b a B

Una mquina de Turing multipista no tiene ms potencia que la mquina de Turing original. Sin embargo, hace que sea ms fcil la construccin de mquinas de Turing que resuelvan ciertos problemas.

32

Manual de lenguajes y autmatas

Ejemplo de una maquina de Turing multipista: Para una mquina de Turing que sume dos nmeros binarios. Primero se construye una mquina de Turing de tres pistas. La entrada sern dos nmeros binarios que ocupen las dos pistas superiores de la cinta. Suponiendo que sus dgitos se alinean por la derecha, que sus representaciones binarias son de la misma longitud (lo que se puede conseguir rellenndolas con tantos ceros como sea necesario) y que la cabeza de lectura/escritura se sita sobre la celda del extremo izquierdo de la cadena. Por tanto, si tuvieran que sumar 101 y 10, la cinta debera contener Fig. 14

La mquina de Turing realizar la suma en la tercera pista. Por tanto, el alfabeto de cinta estar formado por las ternas: (B, B, B) (0, 0, B) (0, 1, B) (1, 0, B) (1, 1, B) (0, 0, 0) (0, 1, 0) (1, 0, 0) (1, 1, 0) (0, 0, 1) (0, 1, 1) (1, 0, 1) (1, 1, 1) (B, B, 1)

Esta mquina de Turing buscar primero hacia la derecha el extremo derecho de los nmeros que van a ser sumados. Entonces sumar pares de dgitos, desde la derecha hacia la izquierda, llevando la cuenta de los resultados que se obtengan y sumando a quienes corresponda. Por tanto, se obtiene (suponiendo que q1 es el estado inicial):

B B B
Q3

1 0 B

0 1 B

1 B 0 B B B

Cabeza
Maquina de Turing de suma de nmeros binarios

(q1, ) = (q1, , R), si (B, B, B) (q2, (0, 0, B)) = (q2, (0, 0, 0), L) (q2, (0, 1, B)) = (q2, (0, 1, 1), L) (q2, (1, 0, B)) = (q2, (1, 0, 1), L) (q2, (1, 1, B)) = (q3, (1, 1, 0), L) (q2, (B, B, B)) = (q4, (B, B, B), S)

(q2, , L), si =(B, B, B) (q3, (0, 0, B)) = (q2, (0, 0, 1), L) (q3, (0, 1, B)) = (q3, (0, 1, 0), L) (q3, (1, 0, B)) = (q3, (1, 0, 0), L) (q3, (1, 1, B)) = (q3, (1, 1, 1), L) (q3, (B, B, B)) = (q4, (B, B, B), S)

Obsrvese que se necesita que esta mquina de Turing tenga la posibilidad de no moverse. La mquina de Turing transformar:

33

Manual de lenguajes y autmatas

d. Fig. 15

Mquina de Turing en Dos Direcciones

B B B
Q3

1 0 B

0 1 B

1 B 0 B B B

en:

B B B
Q3

B B 0

1 0 1

0 1 1

1 B 0 B 1 B

Una mquina de Turing con una cinta infinita en un sentido puede simular una mquina de Turing con la cinta infinita en los dos sentidos pero con dos pistas. Sea M una mquina de Turing con una cinta infinita en los dos sentidos. La mquina de Turing M, que tiene una cinta infinita en un sentido, puede simular a M si tiene una cinta con dos pistas. La cinta superior contiene la informacin correspondiente a la parte derecha de la cinta M, a partir de un punto de referencia dado. La pista inferior contiene la parte izquierda de la cinta M (en orden inverso). Por tanto, si la cinta de M contena:

Fig. 16

B
Q3

Punto de referencia Cinta M

a b

c.

Mquina de Turing de Cinta infinita en una Direccin la cinta de M podra ser como:

Mquina de Turing que usa una cinta que se extiende infinitamente en una nica direccin. Generalmente, se tiene una cinta que se extiende infinitamente hacia la derecha. No est permitido realizar ningn movimiento hacia la izquierda a partir de la celda del extremo izquierdo. Desde luego, cualquier mquina de Turing de esta forma puede ser simulada por una de las que responden a la definicin original. Para cada computacin, simplemente se marca una de las celdas de la cinta infinita por los dos lados, como la celda que se encuentra en el lmite izquierdo.

* *
Q3

b a

b a

a B

b B

Fig. 17

Cinta M

34

Manual de lenguajes y autmatas

, Xn)) significa que cambia del estado q a p, reemplaza i por cinta i y mueve la cabeza de la cinta i en la direccin Xi. El smbolo especial * marca el lmite izquierdo de la cinta. Cuando M tuviera que pasar el punto de referencia, M tendra que encontrarse con la celda marcada con *. Si M est trabajando sobre las celdas que estn a la derecha del punto de referencia, M est trabajando sobre la pista superior. Cuando M trabaja sobre las celdas que estn a la izquierda del punto de referencia, M trabaja sobre la pista inferior. Cuando M pasa al punto de referencia, M se encuentra con los *, cambia de direccin y cambia de pista sobre la que trabaja. e. Mquina de Turing Multicinta Ejemplo:

en la

Reconocimiento del lenguaje {anbn |n 1}. ste es bastante laborioso en una mquina de Turing con una nica cinta. Es mucho ms fcil realizarlo con una mquina de Turing de dos cintas. Suponiendo que, inicialmente, coloca la cadena a analizar en la cinta 1 y que q1 es el estado inicial. Si la cabeza de lectura/escritura de la cinta 1 est situada inicialmente sobre el carcter del extremo izquierdo de la cadena, las cuatro posiciones siguientes son fundamentales para el reconocimiento (cualquier otra transicin sera para cadenas mal formadas y se puede suponer que llega a un estado que no es de aceptacin): (q1, (a, B)) =(q1, (a, a), (R, R)) (q1, (b, B)) =( q2, (b, B), (S, L)) ( q2, (b, a)) =( q2, (b, a), (R, L)) ( q2, (B, B)) =( q3, (B, B), (R, L))

La mquina de Turing multicinta tiene varias cintas, cada una de las cuales tiene su propia cabeza de lectura/escritura. Las cabezas de lectura/escritura se controlan independientemente (es decir, al mismo tiempo, no tienen que moverse en la misma direccin, ni realizar el mismo nmero de movimientos, ni incluso, hacer nada a la vez). En un solo movimiento, esta mquina de Turing: 1. Cambia de estado dependiendo del estado actual y del contenido de las celdas de todas las cintas, que estn analizando actualmente las cabezas de lectura/escritura. 2. Escriben un nuevo smbolo en cada una de las celdas barridas por sus cabezas de lectura/escritura. 3. Mueve cada una de sus cabezas hacia la izquierda o hacia la derecha (de forma independiente al resto de las cabezas). Por tanto, la funcin de transicin para una mquina de Turing con n cintas, es de la forma : Q x n Q x n x {R, L} n donde una transicin de la forma (q, ( 1, 2,, n)) = (p,( 1, 2, , n), (X1, X2,

Aunque esta mquina de Turing multicinta parece bastante distinta y posiblemente ms potente que la mquina de Turing definida originalmente, las dos son equivalentes en el sentido de que cada una de ellas puede ser simulada por la otra. f. Mquina de Turing Multidimensional.

La mquina de Turing multidimensional es aquella que permite que la cinta tenga muchas dimensiones. Por ejemplo, una cinta de dos dimensiones que se extienda hacia abajo y hacia arriba, al igual que hacia la derecha y hacia la izquierda. Dependiendo del estado actual de la mquina de Turing y del smbolo analizado, cambia de estado, escribe un

35

Manual de lenguajes y autmatas

smbolo en la celda actual y se mueve a la izquierda, al derecha, hacia arriaba o hacia abajo. Por tanto, la funcin de transicin para esta mquina de Turing ser de la forma: : Q x Q x x {R, L, U, D} Una mquina de Turing multidimensional simula una mquina de Turing estndar. Simplemente realizando todas sus computaciones en una nica dimensin. Una mquina de Turing estndar tambin puede simular una mquina de Turing multidimensional y, por tanto, la complejidad y la flexibilidad adicional que se debe a la mltiple dimensin, no es una capacidad real. Para simular una mquina de Turing de dos dimensiones mediante una mquina de Turing estndar, primero se asociara una direccin a todas las celdas de la cinta. Una forma de hacerlo es fijar, de forma arbitraria, un lugar en la cinta a partir del cual se asignarn las coordenadas a las celdas de la misma forma que se realiza en un plano de coordenadas. Entonces, se usara una cinta de dos pistas para simular la mquina de Turing. Una pista se encargar de almacenar el contenido de las celdas y la otra las coordenadas, utilizando un smbolo (*) para separar los valores de las coordenadas. Para simular un movimiento de una mquina de Turing de dos dimensiones, est mquina calcula la direccin de la celda a la que se mover la mquina de Turing dos dimensiones. Entonces, localiza la pista inferior la celda con dicha direccin y cambia el contenido de la celda en la pista superior. g. Mquina de Turing No determinista. Ejemplo:

(q, ) Q x x {R, L} Si la mquina de Turing tiene una transicin:

(q1, a) = {(q1, b, R), (q2, a, L)} entonces los movimientos abbq1ab son posibles. abbbq1b y abbq1ab abq2bab

Ya que cualquier mquina de Turing determinista es tambin no determinista, es lgico que una mquina de Turing determinista se puede simular mediante una no determinista. Tambin una mquina de Turing determinista puede simular una no determinista. Por tanto, no se gana ninguna potencia adicional a causa del no determinismo.

4.3.

Problemas indecibles (HALTING PROBLEM)

Un proceso es computable o tiene solucin algortmica cuando puede ser representado por medio de una mquina de Turing que llega, en algn momento, a un estado final. Si la mquina de Turing llega a un estado final con un s, se estar haciendo una correspondencia entre ella y el mdelo de decisin. Pero cuando la mquina no llega a este estado final pueden suceder dos cosas: que llega a un estado de trampa, de donde ya no salga, o que sencillamente nunca se pueda saber si terminar o no con la computacin. Para el primer caso bastar con hacer una equivalencia entre este estado de trampa y el no del modelo de decisin; pero para el segundo hay que decidir entre seguir esperando o no el resultado. En este caso se

La mquina de Turing No determinista es aquella que para un estado actual y el smbolo actual de la cinta, puede haber un nmero finito de movimientos a elegir. Por lo tanto, la regla de transicin de dicha mquina, satisface:

36

Manual de lenguajes y autmatas

podra esperar toda la eternidad para ver si la mquina se detiene o no, sin poder llegar a saber si se detendr en el siguiente instante.

El problema no es computable, o bien, que no es posible decidir, en un tiempo finito, si el proceso es representable algortmicamente. Los problemas de este tipo reciben el nombre de problemas indecibles o problemas no solucionables en forma algortmica, y representan una prueba de las capacidades del mtodo matemtico para explorar la realidad formal del mundo, ya que se est hablando de problemas que son posibles de describir, pero nunca representar por completo para todos los casos. Turing en la bsqueda de los problemas indecibles generaliz el concepto de mquina, como se explica a continuacin: La mquina universal de Turing: Es el mdelo terico de la computabilidad; basta con codificar cualquier mquina particular de Turing en su cinta para que sea entonces simulada y, por ende, pueda resolver ese problema particular algortmicamente. Y con esto es cuando Turing establece el problema de parada (Halting Problem en ingls) con la siguiente pregunta: Podr la mquina universal determinar si la mquina particular que est siendo simulada se va a detener (en un estado final) o no? Supngase que s puede: que existe una MT1 que determina si cualquier otra (que llamaremos MT0) se va a detener o no; es decir, termina con un s si MT0 se detiene, y con un no si MT0 no se detiene (vase la figura a continuacion). Entonces, tambin lo podr hacer para la codificacin de s misma (es decir, podr determinar si MT1 se detendr para cualquier caso particular o no).

MT1 MT2

Fig. 18 MT1 termina con un s, si MTO se detiene termina con un no, si MT0 no se detiene. Ahora si se construye una nueva mquina, MT2, que se detiene si MT0 no lo hace, y viceversa (vase la figura 5.5). Esto se puede lograr si se hace que MT2 entre en un ciclo infinito cuando MT0 se detiene (mediante un par de estados de trampa, que hacen que la operacin de la mquina oscile entre uno y otro). Qu sucede si MT2 trabaja sobre la codificacin de s misma? Pues que se detendr si MT2 no se detiene, y no se detendr s, y slo s, se detiene. Esto es una contradiccin total. Lo que quiere decir que tal mquina no puede existir; lo que a su vez equivale a decir que el problema que estamos estudiando es indecible.

MT2 MT0

37

Manual de lenguajes y autmatas

Fig. 19 MT2 termina con un s, si MTO no se detiene termina con un no, si MT0 se detiene. En resumen, los pasos fueron: 1. Se supone que se puede construir MT1, que determina si MT0 se detiene o no y que, por tanto, tambin puede determinar si ella misma lo hace, cuando trabaja sobre su propia codificacin. 2. Se construye MT2, que termina con un s, si MT0 no se detiene, y con no si MT0 se detiene mediante un par de estados especiales de atrampa que causan que entre en un ciclo infinito cuando MT0 llega a un estado final. 3. Cuando MT2 trabaja sobre su propia codificacin se llega a una contradiccin, lo cual significa que la suposicin del punto 1 es invlida.

5.

APLICACIONES A LENGUAJES

5.1.

Diseo

Lenguaje de programacin (describiendo el aspecto de sus programas): Es la sintaxis del lenguaje y el significado de sus programas que es la semntica del lenguaje. Para especificar la sintaxis de un lenguaje se utiliza una gramtica que describa de forma natural la estructura jerrquica del lenguaje de programacin. Dicha gramtica es la gramtica libre de contexto. Ejemplo: Para expresiones formadas por dgitos y signos ms (+) menos (-), como los casos 9-5+6, 8-3 y 2. Cmo un signo + - debe aparecer entre dos dgitos dichas expresiones son listas de dgitos separados por signos ms o menos. La siguiente gramtica describe la sintaxis de esas expresiones. listalista + dgito listalista - dgito listadgito dgito 0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

4.3.1. Hiptesis de Church

La hiptesis de Church es el concepto intuitivo de Funcin Calculable que puede identificarse con la clase de funciones parcialmente recursivas que son las funciones que realiza una mquina de Turing, sin embargo no podemos esperar una demostracin de dicha hiptesis, puesto que no se puede definir que es una funcin calculable porque dejara de ser intuitiva.

38

Manual de lenguajes y autmatas

Las tres primeras producciones con no terminal lista pueden agruparse de la siguiente forma equivalente: listalista + dgito | lista - dgito | dgito Los componentes lxicos de la gramtica son los smbolos terminales +, -, 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Los no terminales son lista y dgito. Una cadena de componentes lxicos es una secuencia de cero o ms componentes lxicos. La cadena que contiene cero componentes lxicos es la cadena vaca ( ).
cadena

cadena

cadena

cadena

cadena

cadena

De una gramtica libre de contexto se derivan cadenas, empezando con el smbolo inicial y reemplazando repetidamente un no terminal del lado derecho de una produccin para ese no terminal. Las cadenas de componentes lxicos derivadas del smbolo inicial forman el lenguaje que define la gramtica. Se debe tener cuidado de que la gramtica no sea ambigua, es decir, que genere cadenas de componentes lxicos que tengan ms de un rbol de anlisis sintctico ya que suelen tener ms de un significado por ejemplo, si la anterior gramtica se hubiera diseado de la siguiente forma:

cadena

- cadena

cadena

cadena

Fig. 20 rboles de anlisis sintctico iguales para la expresin 9-5+2

cadenacadena + cadena | cadena - cadena | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Los dos rboles de 9-5+2 corresponden a dos formas de agrupamiento entre parntesis dando las siguientes expresiones como resultado: (9-5)+2 y 9-(5+2). Esta segunda forma de agrupamiento entre parntesis da a la expresin el valor 2, en lugar del valor 6, cambiando la semntica del lenguaje. La primera gramtica definida no permite esta ambigedad, como se ilustra en la figura:

la expresin 9-5+2 tendra ms de un rbol de anlisis sintctico, como se observa en la figura:

39

Manual de lenguajes y autmatas

lista

lista

dgito

Lo anterior es un esquema de traduccin que es una gramtica libre de contexto en la que se encuentran intercalados, en los lados derechos de las producciones fragmentos de un programa llamados acciones semnticas. Un esquema de traduccin es como una definicin dirigida por la sintaxis, con la excepcin de que el orden de evaluacin de las reglas semnticas se muestra explcitamente. La posicin en que se ejecuta alguna accin se da entre llaves y se escribe en el lado derecho de una produccin. Cuando se dibuja un rbol de anlisis sintctico de un esquema de traduccin, se indica una accin construyendo un hijo adicional, conectando al nodo para su produccin por una lnea de punto. El nodo para una accin semntica no tiene hijos de modo que la accin se realiza cuando se ve por primera vez ese nodo, observe la figura de la siguiente pagina.
expr

lista

dgito

Fig. 21 rbol de anlisis sintctico para 9-5+2. Se puede ampliar la primera gramtica para expresiones aritmticas de la forma postfija, como se muestra en la figura 6.3. Por ejemplo, la notacin postfija de (9-5)+2 es 95-2+ y la notacin postfija de 9-(5+2) es 952+-. exprexpr + trmino{print (+)} exprexpr trmino {print (-)} exprtrmino trmino 0 {print (0)} trmino 1 {print (1)} ... trmino 9 {print (9)}
expr -

expr

trmino

{print (+)}

trmino

{print (-)} 2

{print (2)}

trmino

{print (5)}

{print (9)}

40

Manual de lenguajes y autmatas

Fig 22 Las acciones se efectan de izquierda a derecha y traducen 9-5+2 a 952+.

Las acciones semnticas en los esquemas de traduccin escribirn la salida de una traduccin en un archivo, una cadena o un carcter a la vez. Por ejemplo, se traduce 9-5+2 a 95-2+ imprimiendo cada carcter de 9-5+2 justo una vez, sin usar ningn almacenamiento para la traduccin de subexpresiones. Las sintaxis mencionadas hasta ahora tienen la propiedad de que la cadena que representa la traduccin del no terminal del lado izquierdo de cada produccin, es la concatenacin de las traducciones de los no terminales de la derecha, en igual orden que en la produccin, con algunas cadenas adicionales (tal vez ninguna) intercaladas.

5.1.1.

Autmatas

Implementacin de un Autmata Finito Un reconocedor de un lenguaje es un programa que toma como entrada una cadena X y responde si si X es una frase del programa, y no, si no lo es. Se compila una expresin regular en un reconocedor construyendo un diagrama de transiciones generalizado llamado autmata finito. Los autmatas finitos se usan en los problemas que implican por ejemplo bsqueda de una cadena en un archivo o el reconocimiento de cadenas de entrada que satisfagan ciertos criterios. Es sencillo traducir el autmata finito a un cdigo en un lenguaje de programacin; slo se necesita seguir el rastro de la posicin actual en la cadena y del estado actual. A la vez que se recorre la cadena, se comprueba a qu estado se ha llegado y, segn eso, se acepta o se rechaza la cadena. Por ejemplo, para escribir un programa sobre el alfabeto a, b que acepte cadenas que no contengan tres bs consecutivas se realiza lo siguiente: Se disea el autmata correspondiente:
a b q0 a q1 b q2 b a, b

q3

41
a

Manual de lenguajes y autmatas

int Tmp = 0; clrscr(); cout << "Introduce la Cadena: "; cadena. cin.getline(Cadena, 80); if(Cadena[Pos]==NULL){ no sea nula. cout << "Cadena Vaca!"; } else{ // Solicita al usuario una

Fig. 23 Con ayuda del autmata se obtiene el programa completo en C que se muestra a continuacin: #include <ctype.h> #include <conio.h> #include <string.h> #include <iostream.h> void main(void){ const int Max_Estados = 4; autmata. const int Max_Rechazos = 1; // Define el nmero de estados del //Define el nmero de estados de rechazo.

// Verifica que la cadena

Pos = 0; while( Pos<=strlen(Cadena) && Cadena[Pos]!=NULL ){ cout << "Paso No." << Pos+1 << " -(char)toupper(Cadena[Pos]) << " Estado: " << Estado;

Simbolo: " <<

int Automata[Max_Estados][2] = { 0,1, 0,2, 0,3, 3,3}; /* Este vector determina las salidas para los estados. El orden de las salidas es el siguiente: el primer parmetro es para la letra a y el segundo para la letra b. Las salidas son ligas hacia los dems estados. */ int Rechazos[Max_Rechazos] = {3}; int Estado = 0; char *Cadena = ""; usuario. int Rechazo = 0; aceptacin. int Pos = 0; // Almacena la cadena introducida por el // Para determinar si se alcanzo un edo. de no // Determina la posicin en el vector.

/* Mientras que no termine la cadena imprime el nmero de paso, el smbolo que se procesa y los estados de origen y destino. */ if( toupper( Cadena[Pos] ) == 65){ Estado = Automata[Estado][0];} else{ Estado = Automata[Estado][1]; } cout << " Salta a: " << Estado << endl; //Muestra el edo. en que se encuentra. Tmp = 0; while(Rechazo==0 && Tmp!=Max_Rechazos) { if( Estado==Rechazos[Tmp] ) { if(Cadena[Pos + 1]==NULL){ Rechazo = 1;} else{ Rechazo = 0; } } else{Rechazo = 0; } Tmp++; } Pos++;

42

Manual de lenguajes y autmatas

} if(Rechazo){ cout << "Cadena NO Aceptada!"; } else {cout << "Cadena Aceptada!"; } } }

main() { preanlisis= getchar(); expr(); putchar (\n);} /* Agrega un carcter de lnea nueva al final. */ expr() /* Genera los signos ms o menos. */ { trmino(); while(1) if (preanlisis== +) { parea (+); trmino(); putchar(+);} else if (preanlisis==-) { parea (-); trmino(); putchar(-);} else break;} trmino () { if (isdigit (preanlisis) { putchar (preanlisis); parea (preanlisis);} else error ();} parea (t) int t; { if (preanlisi==t) preanlisis=getchar(); else error();} error () { printf (Error de sintaxis \n); exit (1);} /* Genera los dgitos. */ /* Prueba si el smbolo es un dgito. */

5.1.2. Gramticas
Los lenguajes libres de contexto son de gran importancia prctica, sobre todo para describir la sintaxis de las construcciones de los lenguajes de programacin, en la formalizacin del concepto de anlisis de gramtica, simplificacin de la traduccin de lenguajes de programacin y en otras aplicaciones del procesamiento de cadenas. El uso de las gramticas libres de contexto ha simplificado la definicin de lenguajes de programacin y la construccin de compiladores. La razn para este suceso, es porque muchas construcciones de lenguajes de programacin tienen una estructura recursiva que se puede definir mediante gramticas libres de contexto. Ejemplo para Implementar una gramtica libre de contexto que traduce una expresin de la forma infija a la forma postfija. Primero se debe crear la gramtica correspondiente exprexpr + trmino exprexpr - trmino exprtrmino trmino 0 trmino 1 ... trmino 9 {print (+)} {print (-)} {print (0)} {print (1)} {print (9)}

/* Imprime mensaje de error. */ /* Se detiene. */

Con ayuda de la gramtica se obtiene el siguiente programa completo en C que se muestra a continuacin: # include <ctype> /* Carga el archivo que contiene el predicado isdigit. */ int preanlisis;

La primera lnea del programa en C comienza con # include, la cual carga <ctype>, que es un archivo de rutinas estndar que contiene el cdigo del predicado isdigit. Los componentes lxicos, que consisten en caracteres simples, los proporciona la rutina de biblioteca estndar getchar, que lee el

43

Manual de lenguajes y autmatas

siguiente carcter del archivo de entrada. Sin embargo, preanlisis est declarado como entero en la lnea 2 para prever los componentes lxicos adicionales. Ya que preanlisis est declarado fuera de cualquiera de las funciones, es global a cualquier funcin que se defina despus de la lnea 2. La funcin parea revisa componentes lxicos; lee el siguiente componente lxico de la entrada si el smbolo de preanlisis concuerda, y llama a la rutina de error en otro caso.La funcin error utiliza la funcin de biblioteca estndar printf para imprimir el mensaje error de sintaxis, y despus termina la ejecucin mediante la llamada exit(1) a otra funcin de biblioteca estndar. La funcin trmino genera los dgitos, la rutina isdigit prueba si el smbolo de preanlisis es un dgito, si el resultado es positivo, se imprime y se manda a la rutina parea el dgito, de otro modo; aparece un error. La funcin expr funciona mientras el smbolo de preanlisis sea un signo ms menos, se manda a la rutina parea el signo, posteriormente se llama la rutina trmino para que se lea el siguiente dgito en la rutina parea. Despus la rutina de biblioteca estndar de C putchar imprime el signo, ms o menos. Las funciones expr y trmino revisan el smbolo de preanlisis utilizando el identificador global preanlisis. (Obsrvese que parea modifica el smbolo de preanlisis, de modo que la impresin debe producirse antes de emparejar el dgito). El traductor anterior reconoce todos los caracteres de la entrada, de modo que los caracteres extraos, como los espacios en blanco, harn que falle.

ST$ T(T)T Nota: el smbolo $ se agrega para indicar el fin de cada cadena. Se debe tener cuidado con la recursividad hacia la izquierda esto se comprueba utilizando una cadena de entrada, en este caso utilizaremos la siguiente cadena: ( )( )( )$ la cual produce la siguiente derivacin: ST$ T( T )$ T( T )( T )$ T( T ) ( T ) ( T )$ ( ) ( ) ( )$ Como se observa el problema esta en T(T)T, que tiene recursin hacia la izquierda. La recursividad por la izquierda se define de la siguiente forma: Una definicin formal gramatical es recursiva por la izquierda si para algn no terminal A tiene una produccin de la forma A A Para eliminar la recursividad por la izquierda se modifica la gramtica. Esto se realiza al suponer, en general, que la produccin T de la gramtica tiene la forma: TT . Donde la cadena no comienza con T. Las cadenas que pueden ser obtenidas de T son de la forma n, para n 0. Si las dos producciones anteriores son remplazadas por: T U y U U , entonces el lenguaje permanece sin cambios y la recursin por la izquierda es eliminada. En el ejemplo, = ( T ) y = , se reemplaza T(T)T por: TU U( T ) U Ahora considere la siguiente CFG que produce tambin el lenguaje de cadenas balanceadas de parntesis. ST$ T(T) )T ( (T)T ) (

Antes de empezar a programar debe considerar tambin ciertas desventajas que poseen las gramticas libres de contexto ya que pueden provocar que se cicle un programa, utilizaremos para ejemplificar mejor esto la siguiente gramtica que genera el lenguaje de cadenas balanceadas de parntesis.

44

Manual de lenguajes y autmatas

Esta gramtica no tiene recursividad por la izquierda. Sin embargo el problema aqu es que del lado derecho de cada produccin T empieza con el mismo smbolo. Para remediar esto se descompone en factores cada produccin del lado derecho, como se muestra enseguida: T( U UT ) )T )T ) T Se descomponen en ms factores la produccin U, esto es el lado derecho empieza con T, se puede descomponer en el factor de salida T). Obtenindose las producciones: ST$ T( U UT ) W )W WT Se puede simplificar la gramtica eliminando la variable T con lo que se obtienen: S ( U $ U ( U ) W )W W( U De esta forma con la ayuda de la descomposicin de factores y eliminacin de recursividad por la izquierda, se facilita la programacin de las gramticas libres de contexto.

5.2.
5.2.1.

Comunicacin
Fase lxica

El analizador lxico lee los caracteres del programa fuente, y verifica que correspondan a una secuencia lgica (identificador, palabra reservada etc.). Esta secuencia de caracteres recibe el nombre componente lxico o lexema. FUNCIN DEL ANALIZADOR LXICO Su principal funcin consiste en leer los caracteres de entrada y elabora como salida una secuencia de componentes lxicos (tokens) que utiliza el analizador sintctico para hacer el anlisis. Es la parte del compilador que lee el texto fuente. Recibida la orden "obtn el siguiente componente lxico" del analizador sintctico, el analizador lxico lee los caracteres de entrada hasta que pueda identificar el siguiente componente lxico. Elimina del programa fuente comentarios, espacios en blanco, caracteres TAB y de lnea nueva. Otra funcin es relacionar los mensajes de error del compilador con el programa fuente.

45

Manual de lenguajes y autmatas

En algunos compiladores, el analizador lxico se encarga de hacer una copia del programa fuente en el que estn marcados los mensajes de error.

programa muy sencillo y funcionar siempre en tiempo lineal (si le asignamos un trabajo mayor es que seguramente lo estaremos sobrecargando con funciones de anlisis sintctico, lo cual nunca debiera ocurrir).

Realmente, el hecho de esta separacin simplemente busca simplificar al mximo la gramtica independiente del contexto trabajando con las unidades ms abstractas posibles. La gramtica que queda para el anlisis lxico, siempre debe ser regular, ya que cada unidad lxica puede venir determinada, por una expresin regular. Fig. 24 El analizador Lxico dentro del modelo de un compilador. En algunas ocasiones, los analizadores lxicos se dividen en dos fases; la primera llamada "examen", y la segunda, "anlisis lxico". El examinador se encarga de realizar tareas sencillas, mientras que el analizador lxico es el que realiza las operaciones ms complejas. El objetivo del anlisis lxico es gestionar el "bajo nivel" de la entrada (en este caso, texto) y suministrarle al analizador sintctico la misma ya "filtrada", es decir, conteniendo solamente terminales de la gramtica a definir. En ese trabajo se engloba facilitar la definicin de la gramtica ya que, el hecho de tener que incluir todas las reglas hasta llegar a los terminales ms bajos (caracteres) aumenta indeseablemente la gramtica. Este tipo de trabajos ms sencillos (como reconocer nmeros, buscar palabras clave, obviar espacios y dems separadores...) se suelen dejar al analizador lxico, que ser un La relacin entre el analizador lxico y el sintctico son los tokens y la tabla de smbolos, ya que la funcin principal del anlisis lxico es leer los caracteres de entrada y genera como salida una secuencia de componentes lxicos previamente definidos en expresiones regulares. ASPECTOS A CONSIDERAR PARA EL ANLISIS LXICO Un diseo sencillo de un analizador lxico corresponde a unas reglas del lenguaje meramente sencillas, sin embargo estas son algunas consideraciones importantes: Mientras menos complicadas sean las gramticas, ms fcil ser realizar un compilador, slo que previamente se deben considerar las expresiones regulares. Hay que considerar si se debe o puede mejorar la eficiencia del compilador. Tambin mejorar la transportabilidad del compilador, ya que las letras del alfabeto y los

46

Manual de lenguajes y autmatas

errores propios de los dispositivos pueden limitar al analizador lxico. El trabajo bsico es reconocer los terminales (que podemos llamar ya unidades lxicas), y para ello podemos hacer una tabla con todas las posibilidades que encontraremos en el fichero de la entrada y agruparlos en los tipos necesarios.

Una vez que tenemos la lista de entrada limpia se procede a la creacin de los tokens; para ello, se ha definido otro tipo de lista llamado Tokens que contendr el nombre del token (cadena leda por la pantalla) junto con el tipo al que pertenece.

Caracteres que corresponden directamente con la unidad lxica. Unidades lxicas (terminales) que pueden contener varios caracteres. Caracteres que pueden figurar en el texto pero que no se consideran (se desechan). Cualquier otro carcter es errneo, y producir, por ello, un error lxico.

La implementacin del analizador lxico responde al mtodo general de programacin visto en teora, por lo tanto se manejan dos punteros, uno al ltimo carcter ledo y otro al ltimo carcter aceptado con lo cual podemos movernos por la lista de entrada en bsqueda del siguiente token sin perder la posicin desde donde comenzamos la presente bsqueda. Los tokens, o smbolos terminales de la gramtica, han sido representados mediante dos tablas, una para los que van acompaados de un parntesis y otra para los que no. El motivo de esta separacin ha sido el trato distinto que se les ha dado a ambos para no tener que distinguir, dentro de las rdenes que lleva un parmetro, si entre el final de la orden y el parntesis que rodea al parmetro hay o no espacios. As las ordenes Mira (id) y Mira(id) son tratadas como el mismo token y toman el ``('' como parte de l. Los smbolos separadores (espacios, ``:'', etc.) han sido recogidos del mismo modo en otra tabla dado el trato distinto de los anteriores que recibirn. Con esta forma de recoger los tokens que reconoce este analizador hemos conseguido no tener que realizar grandes modificaciones sobre esta fase del compilador, si algn da fuera modificado el conjunto de smbolos terminales de la gramtica.

Bajo esta fase se generan los tokens. La generacin de los tokens se ha llevado a cabo mediante la carga del fichero que contiene el cdigo fuente en una lista, tras esto se procede a convertir tabuladores y saltos de lnea en espacios para despus dejar estrictamente los necesarios para diferenciar las distintas palabras introducidas en el archivo fuente. Por ejemplo, una entrada del tipo:
Si Entonces a>b a=c+d:

FinEntonces:

pasara a ser Si a>b Entonces a=c+d: FinEntonces: en nuestra lista de entrada.

47

Manual de lenguajes y autmatas

ANLISIS LXICO: DESARROLLO Objetivo El objetivo bsico del scanner o analizador lxico es separar el programa fuente en unidades mnimas y asociarles una determinada clase o token.

Funciones del scanner

Las funciones bsicas del scanner son: Leer el programa fuente Delimitar los lexemas Identificar cada token Asignar atributo a cada unidad lxica Para hacer la interaccin con el parser, lo ms habitual es convertir al scanner en una subrutina del parser, para que as pueda responder a la orden "obtener la siguiente unidad lxica" recibida del parser.

Por qu? Formalmente, para separar lo lineal de lo jerrquico. En el scanner no hay que mirar hacia atrs: las unidades lxicas se forman con caracteres siempre consecutivos y no pueden solaparse dos unidades lxicas. Hay que tener en cuenta que las reglas lxicas son bastante sencillas y no necesitan una notacin tan poderosa como una gramtica; las expresiones regulares son ms sencillas y fciles de entender que una gramtica. Eficiencia, porque es el nico proceso que lee el programa fuente y por ello pueden estudiarse tcnicas especializadas de manejo de dispositivos de almacenamiento (la eficiencia es ms fcilmente alcanzable partiendo de expresiones regulares que de gramticas). Diseo modular del compilador, relacionado con esto ltimo. Portabilidad, ya que la mayora de diferencias del mismo lenguaje entre distintos entornos suele ser en caracteres especiales, capitalizacin, cdigos de caracteres, etc. y as se encapsulan en el scanner.

Como el scanner lee el programa fuente, tambin realiza ciertas funciones secundarias como son eliminar comentarios y caracteres no significativos (espacios, tabuladores, retornos de carro...) o preprocesar las macros. Otra funcin secundaria del analizador lxico es relacionar los mensajes de error con el programa fuente (ya que para que al usuario le sean significativos es necesario que no se pierda esta relacin). En este sentido, en algunos compiladores el scanner va produciendo una copia del fuente en la que se marcan los mensajes de error, se expanden las macros, etc. La ltima funcin del scanner es detectar los errores lxicos que puedan producirse. A este nivel, los errores se restringen a localizar caracteres no reconocidos, combinaciones de caracteres imposibles, o intentos de lectura por detrs del fin de fichero.

48

Manual de lenguajes y autmatas

5.2.2.

Fase sintctica

pueden analizar cualquier gramtica. Estos mtodos sin embargo, son demasiado ineficientes para usarlos en la produccin de compiladores. Los mtodos empleados generalmente en la produccin de compiladores se clasifican como descendentes o ascendentes. Los dos tipos principales de anlisis sintctico son: Descendente: construye el rbol desde la raz hacia las hojas. Ascendente: construye el rbol desde las hojas hacia la raz. En ambos casos, se examina la entrada al analizador sintctico de izquierda a derecha, un smbolo a la vez. Los mtodos descendentes y ascendentes ms eficientes trabajan slo con subclases de gramticas. La salida del analizador sintctico es una representacin del rbol de anlisis sintctico para la cadena de componentes lxicos producida por el analizador lxico. En la prctica, hay varias tareas que se pueden realizar durante el anlisis sintctico, como recoger informacin sobre distintos componentes lxicos en la tabla de smbolos, realizar la verificacin de tipo y otras clases de anlisis semntico. Para la implementacin del analizador sintctico debe de ser necesaria la redefinicin de la gramtica dada en la prctica de modo que sea ``entendible'' por la computadora. Dentro de la gramtica generada se deber eliminar la recursividad a izquierdas. Se sabe que los programas pueden contener errores de muy diversos tipos. Por ejemplo los errores pueden ser: Lxicos, como escribir mal un identificador, palabra clave u operador. Sintcticos, como una expresin aritmtica con parntesis no equilibrados.

El objetivo fundamental del anlisis sintctico es "construir un rbol sintctico" con la cadena de entrada (el "programa"), en la forma de unidades lxicas que determina el analizador lxico, como se muestra en la siguiente figura:

Fig. 25. El Analizador Sintctico dentro del modelo de un compilador Si esto se consigue, el programa es (sintcticamente) correcto; y es incorrecto en caso contrario. Se supone que el analizador sintctico informar de cualquier error de sintaxis de manera inteligible. Tambin deber recuperarse de los errores que ocurren frecuentemente para poder continuar procesando el resto de su entrada. Existen tres tipos generales de analizadores sintcticos para gramticas. Los mtodos universales de anlisis sintctico, como el algoritmo de Cocke-Younger-Kasami y el de Earley,

49

Manual de lenguajes y autmatas

Semnticos, como un operador aplicado a un operando incompatible. Lgicos, como una llamada infinitamente recursiva.

A menudo, gran parte de la deteccin y recuperacin de errores en un compilador se centra en la fase de anlisis sintctico. Una razn es que muchos errores son de naturaleza sintctica o se manifiestan cuando la cadena de componentes lxicos que proviene del analizador lxico desobedece la reglas gramaticales que definen el lenguaje de programacin. Otra razn es la precisin de los mtodos modernos de anlisis sintctico, que pueden detectar la presencia de errores dentro de los programas de una forma muy eficiente. La deteccin exacta de la presencia de errores semnticos y lgicos en el momento de la compilacin es mucho ms difcil.

Varios mtodos de anlisis sintctico, detectan un error lo antes posible. Es decir, tienen la propiedad del prefijo viable, la cual quiere decir que detectan la presencia de un error nada ms con ver un prefijo de la entrada que no es prefijo de ninguna cadena del lenguaje. Cmo debe informar un manejador de errores de la presencia de un error ?, al menos debe informar del lugar en el programa fuente donde se detecta el error, porque es muy probable que el error real se haya producido en alguno de los componentes lxicos anteriores. Una estrategia comn empleada por muchos compiladores e imprimir la lnea errnea con un apuntador a la posicin donde se detecta el error. Si hay una posibilidad razonable de saber cul es realmente el error, tambin se incluye un mensaje de diagnstico informativo y comprensible; por ejemplo "Falta punto y coma en esta posicin". Una vez detectado el error, Cmo se debe de recuperar el analizador sintctico ?, En la mayora de los casos, no es adecuado que el analizador sintctico abandone despus de detectar el primer error, porque el posterior procesamiento de la entrada podra revelar ms errores. Normalmente, hay alguna forma de recuperacin del error donde el analizador sintctico intenta volver l mismo a un estado en el que el procesamiento de la entrada pueda continuar con una esperanza razonable de que har el anlisis de la entrada correcta o de que ser manejada correctamente por el compilador. Una estrategia conservadora para un compilador es inhibir los mensajes de error que provengan de errores descubiertos demasiado cerca uno de otros en la cadena de entrada. Despus de descubrir un error sintctico, el compilador podra exigir que varios componentes lxicos se analizarn sintcticamente con xito antes de permitir otro mensaje de error. En algunos casos,

El manejador de errores en un analizador sintctico tiene objetivos fciles de establecer: Debe de informar de la presencia de errores con claridad y exactitud. Se debe de recuperar de cada error con la suficiente rapidez como para detectar errores posteriores. No de be retrazar de manera significativa el procesamiento de programas correctos.

Afortunadamente lo errores ms comunes son simples y a menudo basta con un mecanismo sencillo de manejo de errores. sin embargo, en algunos casos un error pudo haber ocurrido mucho antes de la posicin en que se detect su presencia, y puede ser muy difcil deducir su naturaleza precisa de error. En los casos difciles, el manejador de errores quiz tenga que adivinar qu tena en mente el programador cuando escribi el programa.

50

Manual de lenguajes y autmatas

puede haber demasiados errores como para que el compilador contine un procesamiento razonable. Parece que una estrategia de recuperacin de errores tiene que ser un compromiso cuidadosamente considerado, teniendo en cuenta la clase de errores que se pueden presentar y que sean de procesamiento razonable. Algunos compiladores intentan reparar el error proceso en el cual el compilador intenta adivinar lo que pretenda escribir el programador. Hay muchas estrategias generales distintas que puede emplear un analizador sintctico para recuperarse de un error sintctico. Aunque ninguna de ellas ha demostrado ser la aceptacin universal, algunos mtodos tienen una amplia aplicabilidad. Mencionaremos algunas estrategias, entre las cuales estn:

Recuperacin en modo de pnico: Este es el mtodo ms sencillo de implantar y pueden utilizarlo la mayora de los mtodos de anlisis sintctico. Al descubrir un error, el analizador sintctico desecha smbolo de entrada, de uno en uno, hasta que encuentra uno perteneciente a un conjunto designado de componente lxicos de sincronizacin. Estos componente lxicos de sincronizacin son generalmente delimitadores, como el punto y coma o la palabra clave end, cuyo papel en el programa fuente est claro. Es evidente que quien disea el compilador debe seleccionar los componentes lxicos de sincronizacin adecuados para el lenguaje fuente. Aunque la correccin en modo de pnico a menudo omite una cantidad considerable de entrada sin comprobar la existencia de errores adicionales, tiene la ventaja de la sencillez y, a diferencia de otros mtodos, esta garantizado contra lazos infinitos. En situaciones en donde son raros los errores mltiples en la misma proposicin, este mtodo puede resultar bastante adecuado.

Recuperacin a nivel de frase: Al descubrir un error, el analizador sintctico puede realizar una correccin local de la entrada restante; es decir, puede sustituir un prefijo de la entrada restante por alguna cadena que permita continuar al analizador sintctico. Una correccin local tpica sera sustituir una coma por un punto y coma, suprimir un punto y coma sobrante e insertar un punto y coma que falta. La eleccin de la correccin local corresponde al diseador del compilador. Por supuesto se debe de tener cuidado de elegir sustituciones que no conduzcan a lazos infinitos. Este tipo de sustitucin puede corregir cualquier cadena de entrada y ha sido empleado en varios compiladores que corrigen los errores. El mtodo se us por primera vez en el anlisis sintctico descendente. Su principal desventaja es su dificultad para afrontar situaciones en que el error real se produjo antes del punto de deteccin. Producciones de error: Si se tiene una buena idea de los errores comunes que puede encontrarse, se puede aumentar la gramtica del lenguaje con producciones que generen las construcciones errneas. Entonces se usa esta gramtica aumentada con las producciones de error para construir el analizador sintctico. Si el analizador sintctico usa una produccin de error, se pueden generar diagnsticos de error apropiados para indicar la construccin errnea reconocida en la entrada. Correccin global: Idealmente, sera deseable que un compilador hiciera el mnimo de cambios posibles al procesar una cadena de entrada incorrecta. Existen algoritmos para elegir una secuencia mnima de cambios para obtener una correccin global de menor costo. Dada una cadena de entrada incorrecta x y la gramtica G, estos algoritmos encontrarn un rbol de anlisis sintctico para una cadena relacionada y, tal que el nmero de inserciones, supresiones y modificaciones de

51

Manual de lenguajes y autmatas

componentes lxicos necesarios para transformar x en y sea el mnimo posible. Por desgracia, la implantacin de estos mtodos es en general demasiado costosa en trminos de tiempo y espacio, as que estas tcnicas en la actualidad slo son de inters terico. Se debe sealar que un programa correcto ms parecido al original puede no ser lo que el programador tena en mente. Sin embargo, la nocin de correccin de costo mnimo proporciona una escala para evaluar las tcnicas de recuperacin de errores, y se ha usado para encontrar cadenas de sustitucin ptimas para recuperacin a nivel de frase.

Hopcroft, John E. y Jeffrey D. Ullman, Introduccin a la teora de autmatas, lenguajes y computacin, CECSA, Mxico, 1996. J. G. Brookshear, Teora de la Computacin: Lenguajes Formales, Autmatas y Complejidad, Addison-Wesley Iberoamericana, 1993. D. Kelley. Teora de Autmatas y Lenguajes Formales. Prentice-Hall, 1995. P. Isasi, P. Martnez y D. Borrajo. Lenguajes, Gramticas y Autmatas. Un Enfoque Prctico. Addison-Wesley, Madrid, 1997. M. Alfonseca, J. Sancho y M. Martnez. Teora de Lenguajes, Gramticas y Autmatas. Ediciones Universidad y Cultura, Madrid, 1990.

PAGINAS WEBS

http://delta.cs.cinvestav.mx/~mcintosh/comun/tes ismaestria/rene/tesisReneHtml/node15.html

http://www.dc.fi.udc.es/~alonso/tesis.html #informacion (tesis) G. Morales, Teora de Autmatas, CINVESTAV-IPN, Mxico.

BIBLIOGRAFIAS LIBROS

52

Das könnte Ihnen auch gefallen