Вы находитесь на странице: 1из 120

INSTITUTO TECNOLOGICO

DE CANCN

CATEDRATICO: Rodolfo Ponce.

ASIGNATURA: Lenguaje Y Autmatas I

Titulo del Trabajo: Unidad 1

PRESENTA: Daniel Noe Vera Morales.

CARRERA: Ingeniera en sistemas computacionales, 5 Semestre.

"No nos atrevemos a muchas cosas porque son difciles, pero son difciles porque no nos atrevemos a hacerlas."

-Lucio Anneo Sneca-

CANCN, QROO. A 15 DE FEBRERO DE 2013.

Introduccin a la Teora de Lenguajes Formales.


En matemticas, lgica, y ciencias de la computacin, un lenguaje formal es un lenguaje cuyos
smbolos primitivos y reglas para unir esos smbolos estn formalmente especificados.1 2 Al
conjunto de los smbolos primitivos se le llama el alfabeto (o vocabulario) del lenguaje, y al
conjunto de las reglas se lo llama la gramtica formal (o sintaxis). A una cadena de smbolos
formada de acuerdo a la gramtica se la llama una frmula bien formada (o palabra) del lenguaje.
Estrictamente hablando, un lenguaje formal es idntico al conjunto de todas sus frmulas bien
formadas. A diferencia de lo que ocurre con el alfabeto (que debe ser un conjunto finito) y con cada
frmula bien formada (que debe tener una longitud tambin finita), un lenguaje formal puede estar
compuesto por un nmero infinito de frmulas bien formadas.
Por ejemplo, un alfabeto podra ser el conjunto {a,b}, y una gramtica podra definir a las frmulas
bien formadas como aquellas que tienen el mismo nmero de smbolos a que b. Entonces, algunas
frmulas bien formadas del lenguaje seran: ab, ba, abab, ababba, etc.; y el lenguaje formal sera el
conjunto de todas esas frmulas bien formadas.

Alfabeto y Lenguajes Formales.


Existen dos tipos bsicos y reconocidos de lenguajes: los lenguajes naturales y los lenguajes
formales. El origen y desarrollo de los primeros, como pueden ser el castellano, el ingls o el
francs, es natural, es decir, sin el control de ninguna teora. Las teoras de lenguajes naturales y
las gramticas, fueron establecidas a priori, esto es, despus de que el lenguaje haba ya
madurado. Por otro lado, los lenguajes formales como las matemticas y la lgica, fueron
desarrollados generalmente a travs del establecimiento de una teora, la cual le da las bases para
dichos lenguajes.

DEFINICIN DE LENGUAJE
Las lenguas son sistemas ms o menos complejos, que asocian contenidos de pensamiento y
significacin a manifestaciones simblicas tanto orales como escritas. Aunque en sentido estricto,
el lenguaje sera la capacidad humana para comunicarse mediante lenguas, se suele usar para
denotar los mecanismos de comunicacin no humanos (el lenguaje de las abejas o el de los
delfines), o los creados por los hombres con fines especficos (los lenguajes de programacin, los
lenguajes de la lgica, los lenguajes de la aritmtica...).
Nosotros, vamos a definir el lenguaje como un conjunto de palabras. Cada lenguaje est
compuesto por secuencias de smbolos tomados de alguna coleccin finita. En el caso de
cualquier lengua natural (castellano, ingls, francs...), la coleccin finita es el conjunto de las
letras del alfabeto junto con los smbolos que se usan para construir palabras (tales como el guion,
el apstrofe en el caso del ingls...). De forma similar, la representacin de enteros, son
secuencias de caracteres del conjunto de los dgitos {0,1,2,3,4,5,6,7,8,9}.
Una secuencia finita de smbolos de un determinado alfabeto, se conoce como palabra sobre dicho
alfabeto. Nuestra experiencia, nos lleva a identificar el trmino palabra con las palabras de
cualquier lenguaje natural, por esta razn, a menudo se usa el trmino cadena en lugar de palabra,
con el fin de evitar esta idea preconcebida. Se tratarn igual los trminos cadena y palabra.
Cada smbolo de un alfabeto, es una cadena sobre dicho alfabeto. La cadena vaca, es una
palabra sobre cualquier alfabeto. La palabra vaca, es una secuencia vaca de smbolos, tomados
de cualquiera que sea el alfabeto en cuestin.
Los lenguajes, pueden ser bastante grandes, como lo es el caso de todas las palabras "correctas"
que se pueden formar en castellano sobre el alfabeto castellano. Dado que un lenguaje es un
conjunto de cadenas, se puede tener el lenguaje compuesto por ninguna cadena, el lenguaje
vaco. ste, no es el mismo lenguaje que el que consta de la cadena vaca.
SMBOLO
Es una entidad abstracta, que no se va a definir. Normalmente los smbolos son letras (a,b,c,z),
dgitos (0,1,29) y otros caracteres (+,*,/,- ...).
Un smbolo tambin puede estar formado por varias letras o caracteres, como las palabras
reservadas de un lenguaje de programacin son smbolos de dicho lenguaje. Ejemplo:
- a,b,c,#,+,-,*, then, begin, end, else,

VOCABULARIO O ALFABETO
Un vocabulario o alfabeto es un conjunto finito de smbolos, no vaco. Para definir que un
smbolo a pertenece a un alfabeto V, se utiliza la siguiente notacin aV.
Los alfabetos se definen por enumeracin de los smbolos que contienen, podemos ver los
siguientes ejemplos:
V1={A,B,C,D,E,F,..,X,Y,Z}
V2={a,b,c,d,0,1,2,3,4,*,#,+}
V3={0,1}
V4={if, then, begin, end, else, a,b,;,=,>}
Tambin se pueden definir las tablas ASCII y EBCDIC como los alfabetos de distintos ordenadores.
CADENA
Una cadena es una secuencia finita de smbolos de un determinado alfabeto.
Ejm. Tomando en cuenta los alfabetos o vocabularios definidos anteriormente, podemos decir que:
abcb es una cadena del alfabeto V2
a+2*b es una cadena del alfabeto V2
000111 es una cadena del alfabeto V3
If a>b then b=a; es una cadena del alfabeto V4
LONGITUD DE CADENA
La longitud de una cadena consiste en el nmero de smbolos pertenecientes a la cadena. Ejm.
Tomando en cuenta los ejemplos de cadena podemos decir que:
|abcb| es de longitud 4
|a + 2*b| es de longitud 5
|000111| es de longitud 6
|if a>b then a=b;| es de longitud 9
CADENA VACA
Se denomina cadena vaca, que no tiene smbolos y se denota con l, por lo que su longitud es 0.
CONCATENACIN DE CADENAS
Sean A y B dos cadenas cualesquiera, se denomina concatenacin de A y B a una nueva cadena
AB constituida por los smbolos de la cadena A seguidos por los de la cadena B.
El elemento neutro de la concatenacin es l:
A l = lA = A
UNIVERSO DEL DISCURSO
El conjunto de todas las cadenas que se pueden formar con los smbolos de un alfabeto, se
denomina universo del discurso V y se representa por W(V). Evidentemente W(V) es un conjunto
infinito. La cadena vaca pertenece a W(V).Ej:
Sea un alfabeto con una sola letra V={a}, entonces el universo del discurso es:
W(V) = {l, a, aa, aaa, aaaa, .} que contiene infinitas cadenas.

GRAMTICA
Veamos algunos conceptos que nos ayuden a formular el concepto de gramtica:
(Del lat. grammatca, y este del gr. ). f. Ciencia que estudia los elementos de
una lengua y sus combinaciones. Arte de hablar y escribir correctamente una lengua. Estudio de
una lengua regido por el principio de que todos sus elementos mantienen entre s relaciones
sistemticas. La que trata de formular una serie de reglas capaces de generar o producir todas las
oraciones posibles y aceptables de un idioma o lenguaje.
Una definicin un tanto tcnica: La gramtica es un ente formal para especificar, de una manera
finita, el conjunto de cadenas de smbolos que constituyen un lenguaje" . La gramtica genera o
describe un lenguaje.
AUTMATA
(Del latin. automta, t. f. de -tus, y este del gr. , espontneo). Instrumento o aparato que
encierra dentro de s el mecanismo que le imprime determinados movimientos o respuestas.
Mquina que imita la figura y los movimientos de un ser animado.
En el caso de los Procesadores de Lenguaje un autmata es una construccin lgica que recibe
como entrada una cadena de smbolos y produce una salida indicando si dicha cadena pertenece o
no a un determinado lenguaje.
LENGUAJE
Conjunto de sonidos articulados con que el hombre manifiesta lo que piensa o
siente. Sistema de comunicacin verbal. Manera de expresarse. Conjunto de seales que dan a
entender algo. El lenguaje de los ojos, el de las flores. En Informtica Conjunto de signos y reglas
que permite la comunicacin con un ordenador.
Podemos expresarlo de manera ms sencilla como un conjunto de palabras cadenas de
smbolos (palabras, oraciones, textos o frases) de un determinado alfabeto.
LENGUAJE VACO
Existe un lenguaje denominado lenguaje vaco, que es un conjunto vaco y que se denota por {}.
El lenguaje vaco no debe confundirse con un lenguaje que contenga una sola cadena, y que sta
sea la cadena vaca, es decir {l}, ya que el nmero de elementos (cardinalidad) de estos
dos conjuntos es diferente.
Cardinal ({ }) = 0
Cardinal ({ l }) = 1

Lenguajes y tipos de lenguajes.


Los lenguajes naturales y formales tienen puntos en comn que nos pueden servir de inicio para
una discusin. En principio se tiene la existencia de un conjunto finito llamado alfabeto, el cual
est constituido de smbolos simples llamados comnmente letras
. En los
lenguajes naturales se tienen como ejemplos los alfabetos: latino y rabe-persa, entre otros. En
los formales como la lgica se tiene el lxico del: clculo proposicional y de predicados. Mediante
la concatenacin de las letras del alfabeto formaremos: monemas, fonemas o palabras que
determinan un conjunto extendido denominado
y se encuentran en el interior de un enunciado.
El conjunto de palabras que tengan un significado constituirn el diccionario del lenguaje (p. ejem.
el Webster) y, en lenguajes formales todas las palabras que puedan ser aceptadas por un cierto
autmata. A partir de lo anterior, tendremos que un lenguaje se considera como un conjunto,
usualmente es infinito, de oraciones o enunciados que se forman con palabras del diccionario. En
este punto, podemos distinguir entre dos clases de lenguajes; los ``lenguajes naturales" como el
francs, ingls, y castellano y, los ``lenguajes formales" como el de las matemticas y la lgica.
El lenguaje castellano puede ser definido como el conjunto (tericamente infinito) de todas las
oraciones en castellano. Esas oraciones son consistentes en forma natural con la experiencia
prctica humana que se organiza automticamente al tiempo que organiza el lenguaje en s
mismo. Una oracin en castellano es una secuencia finita de palabras del castellano, donde
sabemos que el conjunto de esas palabras es finito. Una oracin en castellano puede ser
considerada como una secuencia finita de elementos tomados de un conjunto finito dado. Sin
embargo, no todas las combinaciones de palabras son permitidas, es necesario que esas
combinaciones sean correctas (con respecto a una sintaxis) y tengan sentido (con respecto a la
semntica), estas sern las que se encontrarn dentro de un diccionario. Finalmente, dentro del
enfoque de la lingstica del castellano, tanto la sintaxis como la semntica constituyen un orden
del lenguaje que permite la definicin de todas las oraciones en castellano, as como, del mismo
lenguaje castellano.
De la particularizacin del castellano como lenguaje natural, se desprende que a la formacin de
las oraciones, principalmente del lenguaje hablado, procedi la formalizacin del mismo por medio
de una teora o una gramtica. Por esta razn, un lenguaje es llamado natural lo que quiere decir,
es no-artificial o no construido. El calificativo natural, se opone al de formal", por el hecho que
este ltimo considera una teora que tiene reglas y axiomas de formacin para determina lo que se
denomina como lenguaje artificial. En el mismo orden de ideas de particularizacin, tenemos que
un lenguaje formal como la lgica consiste de un conjunto de oraciones generalmente llamadas
frmulas u expresiones bien formadas, las cuales podemos obtener de la aplicacin de las leyes de
la lgica. En los sistemas formales los enunciados del lenguaje consisten de una lista de smbolos
(lgicos o matemticos) sujetos a diversas interpretaciones. Por otro lado, en los lenguajes
naturales las palabras en una oracin poseen un significado y tienen su significante. Esto quiere
decir que independientemente del significado de cada palabra, debemos tomar en cuenta el
sentido correcto que stas adquieren, segn el contexto en las que se expresen en un momento
dado. Una de las metas en computacin es poder especificar rigurosamente estos significados por
los mtodos de interpretacin de los sistemas formales, estos mtodos en cuestin, constituyen las
semnticas del lenguaje formal.
En un primer resumen podemos decir que los lenguajes naturales y formales, difieren
significativamente uno de otro por su origen y por su rea de aplicacin. Primeramente vamos a
intentar identificar las propiedades ms importantes de estos dos tipos de lenguajes, con el fin de
examinar una de las preguntas fundamentales de la Inteligencia Artificial (IA): >Hasta qu punto
pueden los lenguajes naturales ser representados (traducidos) por medio de lenguajes formales?;
ms especficamente, estaremos interesados en la utilizacin de lenguajes computacionales
intentando representar y manipular lenguajes naturales. A este respecto, en el ltimo captulo se
presenta con ms detalle el procesamiento computacional de los lenguajes naturales.

Estructura de un traductor y fases de un compilador.


Un traductor es un programa que tiene como entrada un texto escrito en un lenguaje (lenguaje
fuente) y como salida produce un texto escrito en un lenguaje (lenguaje objeto) que preserva el
significado de origen. Ejemplos de traductores son los ensambladores y los compiladores.

En el proceso de traduccin se identifican dos fases principales:

Fase de anlisis

Fase de Sntesis

Ensambladores.
El programa ensamblador es el programa que realiza la traduccin de un programa escrito en
ensamblador a lenguaje mquina. Esta traduccin es directa e inmediata, ya que las instrucciones
en ensamblador no son ms que nemotcnicos de las instrucciones mquina que ejecuta
directamente
la
CPU.
Tipos de ensambladores
Podemos distinguir entre tres tipos de ensambladores:

Ensambladores bsicos. Son de muy bajo nivel, y su tarea consiste bsicamente en ofrecer
nombres simblicos a las distintas instrucciones.
Ensambladores modulares, o macro ensambladores. Descendientes de los ensambladores
bsicos. Hacen todo lo que puede hacer un ensamblador, y adems proporcionan una serie de
directivas para definir e invocar macroinstrucciones.
Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que aparecieron como
respuesta a una nueva arquitectura de procesadores de 32 bits, realizan la misma tarea que los
anteriores, permitiendo tambin el uso de macros, permiten utilizar estructuras de programacin
ms complejas propias de los lenguajes de alto nivel.

Compiladores.
Un compilador es un programa informtico que traduce un programa escrito en un lenguaje de
programacin a otro lenguaje de programacin, es decir programa que permite traducir el cdigo
fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (lenguaje
mquina). Generando un programa equivalente a capaz de interpretar.

Estructura de un Compilador.

Cualquier compilador debe realizar dos tareas principales: anlisis del programa a compilar y
sntesis de un programa en lenguaje mquina. Para el estudio de un compilador, es necesario
dividir su trabajo en fases. Cada fase representa una transformacin al cdigo fuente para obtener
el cdigo objeto. En cada una de las fases se utiliza un administrador de la tabla de smbolos y un
manejador de errores.
Componentes en que se divide un compilador:
Anlisis Lxico. En esta fase se lee los caracteres del programa fuente y se agrupan en cadenas
que representan los componentes lxicos. A la secuencia de caracteres que representa un
componente lxico se le llama lexema (o con su nombre en ingls token).
Anlisis Sintctico. Los componentes lxicos se agrupan en frases gramaticales que el
compilador utiliza para sintetizar la salida.
Anlisis Semntico. Intenta detectar instrucciones que tengan la estructura sintctica correcta,
pero que no tengan significado para la operacin implicada.
Generacin de cdigo Intermedio. Se puede considerar esta operacin intermedia como un
subprograma para una mquina abstracta, a esta representacin debe tener dos propiedades
importantes: debe ser fcil de producir y fcil de traducir al programa objeto.
Optimizacin de Cdigo. Se trata de mejorar el cdigo intermedio, de modo que resulte un cdigo
de mquina ms rpido de ejecutar.

Generacin
de
Cdigo.
Esta
constituye
la
fase
final
de
un
compilador.
Administrador de la tabla de smbolos. Se encarga de manejar los accesos a la tabla de smbolos,
en cada una de las etapas de compilacin de un programa.
Manejador de errores. Es posible encontrar errores. De esta forma podrn controlarse ms
eficientemente los errores encontrados en cada una de las fases de la compilacin de un
programa.
Intrpretes.
Los intrpretes realizan normalmente dos operaciones:

Traducen el cdigo fuente a un formato interno.


Ejecutan o interpretan el programa traducido al formato interno.
La primera parte del intrprete se llama a veces "el compilador", aunque el cdigo interno que
genera no es el lenguaje de la mquina, ni siquiera lenguaje simblico, ni tampoco un lenguaje de
alto
nivel.
Estructura

Particularidades de la interpretacin:

Ahorra memoria.
Produce un resultado que no se puede almacenar, lo cual hace la ejecucin lenta.
No demasiado eficiente, cada vez que se entre en un bucle se analizaran sus sentencias.
Facilita el proceso de depuracin.
No produce resultados transportables.

La interpretacin es til en:


Sistemas interactivos.
Programas de pequea envergadura.
Programas de prototipo y de enseanza.

UNIDAD 2

2.- Expresiones regulares.


Introduccin.
Hoy en da la tecnologa se ha extendido por todos lados a tal punto de hacerse transparente para
los usuarios que simplemente ven una interfaz bonita y elegante, sin imaginarse todo el trabajo que
se esconde en el cdigo. Otra caracterstica importante, es que el internet se ha extendido tanto
que es posible aprender en un dos por tres a utilizar una computadora, no solo para tareas
cotidianas, sino que muchas personas pueden aprender a manipular sus dispositivos con cdigo
nativo programados por ellos mismos. Esto es interesante, sobre todo porque la programacin es
un arte. Sin embargo, el problema de aprender de manera rpida es que no se toca a fondo el
porqu de una seccin de cdigo, solo se aprende lo que hace esa seccin de cdigo, lo cual es
un problema cuando intentas avanzar dentro del amplio mundo de las computadoras, ya que si se
entendiera un poquito ms formalmente estos detalles todo sera ms fcil.
Tal es el caso de las expresiones regulares, los cuales en la mayora de los lenguajes de
programacin se encuentran disponibles para ser explotados al mximo, y es que son de gran
ayuda para aquellos desarrolladores que requieren de un anlisis de patrones en cadena de
caracteres u otro tipo de aplicacin.
Para los desarrolladores webs, las expresiones regulares (ReGex), son de vital importancia cuando
validar un formulario de contacto o entradas de usuarios a un form de esta manera se podr
verificar que las cajas que requieren datos no estn en blanco o que el correo electrnico del
usuario cumpla con todos los componentes lxicos que hacen a un e-mail. Ya sea que una
aplicacin sea escrita en PHP, ASP, JAVA, PYTHON, PERL, RUBY, PASCAL, las expresiones
regulares seguirn siendo importantes.
Adems de la bsqueda de patrones en formularios, las expresiones regulares son muy utilizados
en el anlisis lexicogrfico, sintctico y semntico dentro de los compiladores de lenguajes de
programacin, ya que, para poder procesar el cdigo fuente y convertirlo a un ejecutable o
interpretarlo es necesario eliminar comentarios y espacios en blancos, posteriormente se hace el
anlisis basndose en patrones para encontrar tokens y determinar los lexemas, despus de
tantos procesos se llegara a la conversin del cdigo fuente a un lenguaje de bajo nivel como
ensamblador el cual ser procesado por el ensamblador y dar como resultado un hermoso
archivo objeto que ser enlazado al sistema mediante un linker que nos dar un bellsimo
ejecutable. Deliciosamente las expresiones regulares hacen uso de los smbolos y la teora de
conjuntos adems de que est directamente relacionado con la jerarqua de Chomsky.
Pero vayamos por partes, definamos lo que es formalmente una expresin regular y cules son sus
utilidades y operaciones.

2.1-Definicin formal de una expresin regular.


Definicin:
Una expresin regular es un conjunto de patrones que define un lenguaje regular, y que es
utilizado para la coincidencia de smbolos dentro de una coleccin finita que pertenecen a un
Alfabeto. Las expresiones regulares se basan en smbolos que permiten hacer mucho ms sencilla
la escritura y el reconocimiento de patrones en complejas cadenas de caracteres y en los
analizadores sintcticos (parser). Es claro que los smbolos utilizados representan una operacin y
tienen un significado que flexibiliza la bsqueda y operaciones en cadenas no vacas. El objetivo
de las expresiones regulares es representar todos los posibles lenguajes definidos sobre un
alfabeto, en base a una serie de lenguajes primitivos, y unos operadores de composicin.
Lenguajes primitivos: el lenguaje vaco, el lenguaje formado por la palabra vaca, y los lenguajes
correspondientes a los distintos smbolos del alfabeto.
Operadores de composicin: la unin, la concatenacin y el cierre.
Ms formalmente podemos decir que dado un alfabeto , las expresiones regulares sobre y los
conjuntos denotados por ellas se definen recursivamente como sigue:
El conjunto vaco es una expresin regular que denota al lenguaje
La cadena vaca es una expresin regular que denota al lenguaje {}
Cualquier smbolo a es una expresin regular que denota al lenguaje {a}
Si r y s son expresiones regulares denotando los lenguajes L(r) y L(s) respectivamente,
entonces, r s (o rs) es una expresin regular que denota al lenguaje L(r) L(s).
5) Si r y s son expresiones regulares denotando los lenguajes L(r) y L(s) respectivamente,
entonces, r + s es una expresin regular que denota al lenguaje L(r) L(s).
6) Si r es una expresin regular denotando al lenguaje L(r), entonces, r* es una expresin regular
que denota al lenguaje L(r)*.
7) Slo son expresiones regulares las que pueden obtenerse mediante la aplicacin de las reglas
anteriores.
1)
2)
3)
4)

Entonces podemos decir que Una expresin regular es un lenguaje especializado para la
coincidencia de patrones. Estos se encuentran en muchos editores de texto y lenguajes de
programacin. Como haba escrito anteriormente, las expresiones regulares vindolo desde un
Angulo formal, hacen uso de la teora de conjuntos y las teoras creadas por Noam Chomsky,
quien en fue punto clave para el desarrollo de la teora de lenguajes formales y los conceptos
adjuntos a dicha temtica.
Hasta hace unos aos los que se dedicaban al secretariado acostumbraban a usar la taquigrafa
un tipo de lenguaje para escritura que ayudaba a las secretarias a tomar apuntes de manera
rpida, resumida y sin tantas palabras. Dichos smbolos son extensos sin embargo son capaz de
resumir grandes cantidades de texto. La taquigrafa entonces funge como expresiones regulares
que ayudan a abreviar, resumir, de manera coherente y con significado una serie de cadena de
caracteres.

Por otro lado podemos decir que las expresiones regulares tambin son como la secretaria que
toma resumen ejecutivo de un texto extenso dado por su jefe, es entonces cuando vemos que las
expresiones regulares son patrones, abreviaciones y smbolos que nos permiten reducir la
informacin de manera ordenada a una extensin tan pequea que no pierda la esencia del
mensaje pero s que cambie la morfologa de la presentacin del mensaje.

Definicin de la teora de autmatas:


Un autmata es un modelo matemtico para una mquina de estado finita
(FSM sus siglas en ingls). Una FSM es una mquina que, dada una entrada
de smbolos, "salta" a travs de una serie de estados de acuerdo a una funcin
de transicin (que puede ser expresada como una tabla). En la variedad comn
"Mealy" de FSMs, esta funcin de transicin dice al autmata a qu estado
cambiar dados un determinado estado y smbolo.
La entrada es leda smbolo por smbolo, hasta que es "consumida"
completamente (piense en sta como una cinta con una palabra escrita en ella,
que es leda por una cabeza lectora del autmata; la cabeza se mueve a lo
largo de la cinta, leyendo un smbolo a la vez) una vez la entrada se ha
agotado, el autmata se detiene.
Dependiendo del estado en el que el autmata finaliza se dice que este ha
aceptado o rechazado la entrada. Si ste termina en el estado "acepta", el
autmata acepta la palabra. Si lo hace en el estado "rechaza", el autmata
rechaz la palabra, el conjunto de todas las palabras aceptadas por el autmata
constituyen el lenguaje aceptado por el mismo.
Lo descrito anteriormente es precisamente lo que hace y procesa un autmata como lo es un
analizador sintctico. Basado en un conjunto de reglas gramaticales el autmata es capaz de
diferenciar entre un lenguaje aceptado y uno que no corresponda o que no cumpla las reglas, si
bien es verdad que el alfabeto puede contener caracteres o smbolos, no siempre sern vlidos
para el programa ya que no existira la coherencia o no tendra significado alguno para el que lo
procesa.

EJEMPLO DE AUTOMATA, CON


ESTADOS Y TRANSICIONES.

2.2-Operaciones con REGEX.


Es necesario conocer los smbolos que hacen posible la existencia de las expresiones regulares y
que a continuacin se presentan con su respectiva descripcin:

- Externos:
.
()

Representacin de cualquier carcter, excepto el final de lnea


Modificacin en el orden de aplicacin de las operaciones

Operacin alternativa

Operacin estrella

Operacin opcionalidad

Operacin repeticin una o ms veces

{}

Operacin repeticin limitada: cuando la secuencia entre llaves empieza por un dgito;
los caracteres que estn entre las llaves forman parte del operador

{}

Incorporacin del nombre de una sobrexpresin: cuando la secuencia entre llaves


empieza por una letra o por el carcter guion inferior; los caracteres que estn entre las
llaves forman el nombre y tambin son meta caracteres

[]

Definicin de un conjunto de caracteres

\
""

Supresin de la calidad de meta carcter; excepto en las secuencias de escape


Supresin de la calidad de meta carcter; excepto para el carcter \

Ajuste al principio de una lnea; cuando es el primer smbolo de la expresin

Ajuste al final de una lnea; cuando es el ltimo smbolo de la expresin

/
<>

Fijacin de un contexto por la derecha


Condicin de contexto; cuando est delante del primer smbolo de la expresin
El smbolo representa en esta relacin el carcter espacio en blanco; el espacio en
blanco como meta carcter significa la terminacin de la escritura de una expresin
regular

- Internos:
^

Definicin complementaria de un conjunto

Rango de caracteres en un conjunto

Supresin de la calidad de meta carcter; excepto en las secuencias de escape

Pongamos algunos ejemplos sobre los REGEX, queremos representar la posibilidad de que sean
aceptadas las siguientes palabras mediante regex: tarro, carro, narro. La forma ms sencilla de
hacerlo sera de la siguiente manera:
[tcn]arro o tambin podemos utilizar (t|c|n)arro, el cual aceptara tanto que la palabra arro comience
con la letra t o c o n.
Para determinar que nuestro cdigo solo admitira letras y nmeros pero no smbolo la expresin
regular nos quedara as para la parte numrica:
(0|1|2|3|4|5|6|7|8|9)

1-Representacin del autmata del REGEX


Sin embargo para la parte de las letras del abecedario sera muy cansado ir poniendo un elemento
a la vez, por lo que usaremos rangos y diremos que admitiremos todos los caracteres de la a a la
z minsculas y maysculas as:
[a-za-Z]

2- Autmata del REGEX


Uniendo los nmeros con las letras nuestra expresin final nos quedara as:
[0-9A-Za-z]
El punto representa cualquier carcter. Escribiendo un punto en un patrn querrs decir que ah
hay un carcter, cualquiera. Desde la A a la Z (en minscula y mayscula), del 0 al 9, o algn otro
smbolo.
ca.a coincide con cana, cama, casa, caja, etc No coincide con casta ni caa.

Si queremos indicar al patrn qu es el principio de la cadena o qu es el final, debemos hacerlo


con ^ para inicio y $ para final.
^olivas coincide con olivas verdes, pero no con quiero olivas.
Los parntesis nos sirven para agrupar un subconjunto. Como hemos visto en el ejemplo anterior,
nos es til para definir la alternancia, pero agrupar un subpatrn nos permite trabajar con l como
si fuera un nico elemento.
(abc)+
coincide
con
abc,
ca(sca)?da coincide con cascada y con cada.

abcabc,

abcabcabc,

etc

Las expresiones regulares definen patrones para un texto.


Pongamos un ejemplo en la vida real con python, el lenguaje de programacin ms fcil y elegante
que existe para las expresiones regulares. Por s solo, definir una expresin regular no sirve para
nada ya que simplemente es un patrn pero si no le decimos a python que hacer con ese patrn
sobre un string entonces no veremos resultados. A dichas acciones sobre un string con una ER se
le llama funcin, y algunas de las funciones son las siguientes:

*Search: Bsqueda.
*Match: Coincidencias.
*Split: Dividir.
*Replace: Reemplazar.
*find: Encontrar.

Estas funciones son muy importantes para el proceso de las expresiones regulares en un lenguaje
de programacin ya que de lo contario no tendra mucho caso el uso de los Regex si no es posible
ser sometido el string a un algoritmo. Uno de las funciones ms usadas son el replace, el Split y el
search. En nuestro caso el cdigo utiliza la funcin SEARCH, para indicar si se encuentra el patrn
en el string. Para un find o un match en un string se utiliza lo siguiente:
#regex (ER)
reg1="@"

String sobre el que ser aplicado:


mail=mail@hotmail.com

La operacin est dado por:


Regex = re.search(reg1, mail)
Notamos que est dado por re.search(er,string), para poder usar el re.search necesitamos
importar la librera de python llamada RE con: import re, de esta manera podemos usar
expresiones regulares con sus respectivas funciones.
El reg1 nos indica que queremos coincidir en el string el smbolo @, si se encuentra, python
devuelve la direccin de memoria del elemento (al estilo de C, ya que python deriva de C) de lo
contrario nos arroja la palabra NONE.

2.3-Aplicacin en problemas.
Ejemplificando ER con Buscadores.

Un buscador es una mquina, un programa, un software, un conjunto de algoritmos que deben


procesar informacin en segundos, y deben hacer ese proceso de forma eficiente y bien, sin
embargo nada de eso sera posible sin las expresiones regulares, de hecho un buscador sera
demasiado montono si no aplicara las ER, y claro no habra tanta exactitud en las bsquedas. Es
por ello que vamos a poner 2 tipos de expresiones regulares aplicados en los buscadores, temas
tan interesantes como el mismo buscador.
Una expresin regular en un navegador como lo es google y bing es lo que conforma el alma de
las bsquedas, y es que a pesar de que nosotros mimos podemos usar los ER para acertar
bsquedas tambin hay que tener en cuenta que los que disean sitios, y los que se dedican al
posicionamiento de sitios en motores de bsqueda hacen uso de los ER para obligarnos a
encontrar sus sitios de internet. Claro que s, ellos pueden obligar al navegador a darnos sus sitios
con el simple uso de pequeas ER.
Adems, las expresiones regulares tienen otra variante en cuanto a GOOGLE y BING ya que
existen ER personalizadas para los mismos buscadores y que amplan las ER estndares, cabe
mencionar que existen otro nivel de ER al que le solemos llamar DORKING ya que proporcionan
una exactitud enorme en cuanto a bsquedas especificas ya no solo de contenido sino tambin en
cuanto a patrones de indexacin y de informacin de un sitio web.
Pongamos un ejemplo, queremos encontrar lo ms pronto posible un sitio de internet que nos
arroje pginas sobre perritos, pero queremos ver que otras alternativas tenemos y es entonces
cuando podemos usar sinnimos y utilizarlos en la bsqueda aplicando el smbolo | que resprenta
un OR, es decir alternativas.
Nuestra ER para GOOGLE quedara de la siguiente manera: (perritos | cachorritos) y la bsqueda
nos arrojara:

Otra alternativa es la de hacer uso explcito de la palabra OR, tambin es posible usar AND, y
caracteres de concatenacin como: +, - , * y de agrupacin como: (), [].

Comentaba hace unos instantes que los diseadores y posicionadores de pginas utilizan las ER
para obligarnos a encontrar sus sitios webs, dichos trucos de posicionamiento funcionan con el
simple hecho de colocar en los TITLES o en las secciones de META DESCRIPCIONES de los
sitios webs palabras claves mezclados con ER de tal manera que los SPIDERS de los buscadores
nos devuelvan ese sitio web al buscar ciertas palabras en los motores:
<title> Casas | hogares </title>
<title> Quimicos | ingenieros</title>
Otra caracterstica importante en cuanto a ER es en el llamado DORKING, o lo que es lo mismo
son ER personalizadas creadas por los motores de bsqueda para facilitar las bsquedas como
por ejemplo: intext:"Dinosaurios, el cual indica que queremos encontrar aquellos sitios que
contengan en su texto la palabra Dinosaurios, y por supuesto podemos mezclar los ER estndar
con los propios del navegador como podemos observar a continuacin: intext:"Dinosaurios |
reptiles". Otro ejemplo ms lo podemos encontrar al usar: site:.org.mx, el cual nos dar todos
los sitios que tengan en su nombre de dominio l .org.mx, otro ejemplo es el de:
inurl:paginacion, el cual nos encontrara todos los sitios web que contengan en su URL la
palabra paginacin.

Y de igual manera, tenemos lo que se denomina GOOGLE HACKING, que no es ms que otra
cosa que el uso de Expresiones regulares propias y estndar en google con el fin, la tica y el
objetivo de encontrar informacin sensible en el internet que por error los humanos ha dejado y
google ha indexado a sus resultados.

3.-Regex en Google.
Expresiones regulares como lenguaje
Para especificar opciones dentro del texto a buscar se utiliza un lenguaje o convencin mediante el
cual se le transmite al motor de bsqueda el resultado que se desea obtener. Este lenguaje le da
un significado especial a una serie de caracteres. Por lo tanto cuando el motor de bsqueda de
expresiones regulares encuentre estos caracteres no los buscar en el texto en forma literal, sino
que buscar lo que los caracteres significan. A estos caracteres se les llama algunas veces "metacaracteres".

Motores para el programador: permiten automatizar el proceso de bsqueda de modo que sea
posible utilizarlo muchas veces para un propsito especfico.

Analizador sintctico.

Un analizador sintctico es aquel programa que sigue ciertos patrones y busca consumir
caracteres hasta que se agoten las entradas, cuando se consumen los caracteres simplemente se
verifican que pertenezcan a una familia valida (token) y que el lexema sea correcto. De esta
manera cada carcter que se consume se va concatenando hasta formar la palabra, es as como al
final del programa, el analizador debera arrojar los tokens generados para que posteriormente
sean tratados por los otros componentes del compilador.
El programa que ha sido analizado consta de 3 clases llamadas: Main, Lexer, y charReader.
Main es el inicio del programa y es el encargado de pasarle el nombre del archivo donde se
encuentra el cdigo fuente a analizar, el cual es llamado prueba.txt, con una serie de pasadas de
argumentos a los parmetros de las clases se logra inicializar el programa con este archivo,
posteriormente se procede a cargar todo el cdigo fuente del txt en una variable de tipo entera la
cual convertir el contenido en nmeros ASCII, luego ser convertido por casting todo el contenido
a char, lo cual obligara a extraer un carcter ASCII de dicha variable dejando en el buffer o en la
otra variable el resto de los caracteres.
Posteriormente el programa ira verificando si los patrones corresponden a un token de tipo
numrico, alfabeto, con signos, flotante, identificador, etc. Dependiendo del tipo se le ira
asignando un numero de token, de lo contrario dara error se eliminara del string y se procedera a
la lectura del siguiente carcter.
En el caso del siguiente string: 3 + 4 + 52 * 6 / 2@150 200, el programa dar los siguientes
resultados:

UNIDAD 3

3.1 Definicin formal Autmatas Finitos


Cuando se utiliza terminologa matemtica en vez de grficos, decimos que se trata de una
notacin formal. Una mquina de estados finitos determinista M o Autmata Finito Determinista
(AFD), es un quntuplo (E, Q, f, q0, F). Un autmata finito o mquina de estado finito es un modelo
matemtico de un sistema que recibe una cadena constituida por smbolos de un alfabeto y
determina si esa cadena pertenece al lenguaje que el autmata reconoce.

E: alfabeto de entrada.
Q: conjunto de estados; es conjunto finito no vaco.
f: funcin de transicin. f(p,a)=q
q0: (perteneciente a Q) estado inicial.
F: (perteneciente a Q) conjunto de estados finales o de aceptacin.

1) La funcin de transicin indica a qu estado se va a pasar sabiendo cul es el estado actual y


el smbolo que se est leyendo.
2) Es importante notar que es una funcin y no simplemente una relacin; esto implica que para
un estado y un smbolo del alfabeto dados, habr un y slo un estado siguiente. Esta
caracterstica, que permite saber siempre cul ser el siguiente estado, se llama determinismo.
3) La diferencia entre los diagramas de estado y los AFD en notacin formal es solamente de
notacin, siendo la informacin exactamente la misma, por lo que es sencillo pasar de una
representacin a la otra.
4) Tanto en los diagramas de estado como en la representacin formal hay que tener cuidado en
respetar las condiciones para que tengamos un autmata valido; en particular, el nmero de
transiciones que salen de cada estado debe ser igual a la cantidad de caracteres del alfabeto,
puesto que es una funcin que est denida para todas las entradas posibles.
5) Recurdese que una funcin no puede tener ms de un resultado (en este caso, un estado de
llegada) para cada entrada en este caso, un estado de salida y un caracter consumido). .
6) Otra condicin es que debe haber exactamente un estado inicial, en cambio, la cantidad de
estados nales puede ser cualquiera, inclusive cero, hasta un mximo de |K | (la cantidad de
estados).
7) En la notacin formal tambin hay que seguir las transiciones, que ahora no son representadas
como echas, sino como elementos del conjunto de transiciones.
Los autmatas nitos pueden ser utilizados para reconocer ciertas palabras y diferenciarlas de
otras palabras. Decimos que un AFD reconoce o acepta una palabra si se cumplen las siguientes
condiciones:

Se consumen todos los caracteres de dicha palabra de entrada, siguiendo las transiciones
y pasando en consecuencia de un estado a otro;
Al terminarse la palabra, el estado al que llega es uno de los estados nales del autmata
(los que tienen doble crculo en los diagramas, o que son parte del conjunto F en la
representacin formal).
El concepto de lenguaje aceptado es una simple extensin de aquel de palabra aceptada.
El lenguaje aceptado por una mquina M es el conjunto de palabras aceptadas por dicha
mquina.

Funcionamiento.
En el comienzo del proceso de reconocimiento de una cadena de entrada, el autmata finito se
encuentra en el estado inicial y a medida que procesa cada smbolo de la cadena va cambiando de
estado de acuerdo a lo determinado por la funcin de transicin. Cuando se ha procesado el ltimo
de los smbolos de la cadena de entrada, el autmata se detiene en el estado final del proceso. Si
el estado final en el que se detuvo es un estado de aceptacin, entonces la cadena pertenece al
lenguaje reconocido por el autmata; en caso contrario, la cadena no pertenece a dicho lenguaje.
Note que el estado inicial de un autmata finito siempre es nico, en tanto que los estados finales
pueden ser ms de uno, es decir, el conjunto puede contener ms de un elemento. Tambin
puede darse el caso de que un estado final corresponda al mismo estado inicial.
Un autmata finito es un modelo matemtico de una mquina que acepta cadenas de un lenguaje
definido sobre un alfabeto A. Consiste en un conjunto finito de estados y un conjunto de
transiciones entre esos estados, que dependen de los smbolos de la cadena de entrada. El
autmata finito acepta una cadena x si la secuencia de transiciones correspondientes a los
smbolos de x conduce desde el estado inicial a un estado final.
Si para todo estado del autmata existe como mximo una transicin definida para cada smbolo
del alfabeto, se dice que el autmata es determinstico (AFD). Si a partir de algn estado y para el
mismo smbolo de entrada, se definen dos o ms transiciones se dice que el autmata es no
determinstico (AFND).

3.2 Clasificacin de Autmatas Finitos.


Los autmatas se pueden clasificar en:

Deterministas
Cada combinacin (estado, smbolo de entrada) produce un solo estado.

No Deterministas
Cad
a
com
bina
cin
(est
ado,
smb
olo
de
entr
ada)
prod
uce
vario
s
estados y adems son posibles las transiciones con .

Los autmatas se pueden representar mediante tablas de transicin o diagramas de transicin.


Tablas de transicin:
Filas encabezadas por los estados (Q)
Columnas encabezadas por los smbolos de entrada (E)

TABLA
->p

*q

q3

q3
r

r
r

q3

Diagramas de transicin:
Nodos etiquetados por los estados(Q)
Arcos entre nodos etiquetados con ( E)
Q0 se seala con ->
El estado final se seala con * o con doble circulo

AFD

AFND

3.3 Conversin de un AFND a AFD.


A continuacin veremos dos diagramas de transicin de autmatas finitos no
deterministas:

1,2,3

S1

1
1,2,3
start

1,2,3
2

S0

S2

Sf

1,2,3
3

S3

Este autmata reconoce el lenguaje de las cadenas sobre {1, 2, 3} que terminan en un
smbolo que haya aparecido previamente.

4
start

8
6

Mientras que este reconoce el lenguaje definido por la expresin regular a*. ( a | b ).
En ambos casos podemos ver que existen estados para los cuales hay ms de una
transicin ante un mismo smbolo de entrada:
1

S0

S1

(S0,1) = { S0,S1}

(0,) = { 1,3}

Desde el punto de vista de programacin, esta situacin es importante que no suceda,


debido a que se dificulta la representacin del AF y disminuye sensiblemente la eficiencia
del reconocedor. Por tal motivo es conveniente poder transformar un AFND en un AFD
equivalente, o sea, que reconozca el mismo lenguaje. Por otra parte, los AF que se
obtienen a partir de expresiones regulares son no deterministas con -transiciones.
Presentaremos a continuacin un algoritmo que construye, a partir de un AFND, un AFD
equivalente. Este algoritmo se denomina a menudo, construccin de subconjuntos. En la
tabla de transiciones de un AFND, cada entrada es un conjunto de estados; mientras que
en la de un AFD, cada entrada es un nico estado. La idea general de este algoritmo es
asociar a cada conjunto de estados del AFND, un nuevo estado en el AFD. Cada estado
en el AFD representa todos los posibles estados en los cuales el AFND puede
encontrarse despus de leer cada smbolo de entrada. Esto equivale a decir, que despus
de leer los smbolos a1a2...an, el AFD se encuentra en un estado que representa el
subconjunto de todos los estados que son alcanzables partiendo del estado inicial del
AFND a travs de algn camino a1a2...an.
As por ejemplo, los estados del AFD del 1er autmata seran:
{ { S0}, { S1}, { S2}, { S3}, { Sf}, { S0,S1}, { S0,S2},...} = P(S)

El nmero de estados en el AFD puede ser exponencial con respecto el nmero de


estados del AFND. Si el AFND tiene n estados, el AFD puede llegar a tener 2n estados,
pero en la prctica este caso crtico ocurre raramente. Las transiciones para cada uno de
los nuevos estados se determinan formando el conjunto de estados que se obtiene al
aplicar la funcin de transicin original a cada uno de los estados del conjunto.
As por ejemplo:

'({ S0,S1},1) = (S0,1) (S1,1) = { S0,S1,Sf }.

Este, por supuesto, es uno de los estados del AFD.

Sin embargo, la construccin del AFD no es conveniente realizarla de esta manera,


puesto que de los 2 n posibles estados del nuevo autmata existen algunos
(probablemente muchos) que no cumplen ninguna funcin, ya que son inaccesibles en el
autmata.

Un estado es inaccesible: Si no existe alguna cadena para la cual, el autmata pueda


llegar a l partiendo de la configuracin inicial, realizando un nmero finito de transiciones.

El estado S es accesible, si:


w * | (S0,w)

(S,)

A continuacin disearemos un algoritmo que determine el conjunto de estados


accesibles de un AF.
Luego, la idea del algoritmo para convertir a AFD es la misma descrita anteriormente,
pero de forma tal que vamos obteniendo para el nuevo autmata solamente los estados
accesibles. Por tanto, no se determinan ni se incluyen las transiciones de los estados
inaccesibles.
El algoritmo debe tener en cuenta los e-movimientos, que representan transiciones a
estados sin tener en cuenta el smbolo actual. Los e-movimientos incorporan cierta
complejidad al algoritmo, ya que en un momento dado, si el autmata est en un estado
que posee e-movimientos, podr tambin estar en cualquiera de los estados a los cuales

se pasa por esos e-movimientos, ya que en esta decisin no interviene el smbolo de


entrada.
En el segundo autmata, por ejemplo, al comenzar el reconocimiento de una cadena,
realmente se puede estar en cualquiera de los estados 0, 1, 3, 4 y 6, ya que el estado
inicial 0 posee dos e-movimientos a los estados 1 y 3, y el estado 3 a su vez posee dos emovimientos a 4 y a 6. Por lo tanto, se hace necesario conocer para cada estado, el
conjunto de estados a los cuales se puede llegar partiendo de l por e-movimientos.
Denominaremos e-clausura(S) a la funcin que calcula todos los estados a los cuales se
puede llegar por -movimientos partiendo de S. Esta funcin podemos extenderla para
calcular la e-clausura de un conjunto de estados como la unin de las e-clausuras de
cada uno de los estados del conjunto.
Esto es, e-clausura ({ a,b} ) = e-clausura(a) e-clausura(b).
As:
e-clausura (0) = { 0,1,3,4,6}
e-clausura (0,5) = { 0,1,3,4,6,5,8}

Algoritmo Obtencin de e-clausura(T), donde T es un conjunto de estados.

colocar todos los estados de T en una pila


inicializar e-clausura(T) con T
mientras la pila no est vaca hacer

sacar U de la pila

para cada estado V tal que ,

hacer

si U e-clausura(T)
aadir V a e-clausura(T)
colocar V en la pila

Necesitaremos tambin una funcin que para un conjunto de estados T y un smbolo a,


calcule los estados a los cuales se puede llegar a travs de a, partiendo de los estados de
T. Denominaremos a esta funcin mover (T,a).

El algoritmo para obtener el AFD construye el autmata simulando todos los posibles
movimientos del AFND ante cualquier cadena de entrada. A travs de esta simulacin se
van obteniendo los estados del AFD.

Algoritmo: Construccin de un AFD a partir de un AFND


Entrada: Un AFND N = (S,,,S0,F)

Salida: Un AFD N' = (S',',,S'0,F'), tal que L(N) = L(N')

1. S'0 = e-clausura( {S0} )


2. S' = {S'0} e indicar en S' que S0' est NO MARCADO
3. mientras exista un estado T NO MARCADO en S' hacer
marcar T
para cada smbolo a hacer
A = mover(T,a)
U = e-clausura(A)
si U S' entonces
aadir U a S' como un estado no marcado

'(T,a) = U

4. F' son todos los estados T de S' que contengan algn estado de F, o sea, TF=0

Notemos que si el autmata no tiene e-movimientos, entonces S0' = { S0} y alobtener


las transiciones del estado T ante el smbolo a, solo es necesario
calcular mover(T,a).

Si el AFND no tiene e-movimientos, entonces e-clausura(T) = T.

Ejemplo: Apliquemos el algoritmo al segundo autmata de la conferencia

e-clausura(0) = { 0,1,3,4,6} = A
mover(A,a) = { 2,5}
'(A,a) = e-clausura({ 2,5} ) = { 2,5,1,3,4,6,8} = B
mover(A,b) = { 7}
'(A,b) = e-clausura( { 7} ) = { 7,8} = C
mover(B,a) = { 2,5}
'(B,a) = e-clausura( { 2,5} ) = B
mover(B,b) = { 7}
'(B,b) = e-clausura( { 7} ) = C
mover(C,a) = { }
'(C,a) = e-clausura( { } ) = { } = D
mover(C,b) = { }
'(C,b) = e-clausura( { } ) = { } = D
mover(D,a) = { }
'(D,a) = e-clausura( { } ) = D
mover(D,b) = { }
'(D,b) = e-clausura( { } ) = D

'

{ 0,1,3,4,6}

{ 2,5,1,3,4,6,8}

{ 7,8}

{ }

Los estados finales del nuevo autmata seran: F = { B,C }

a
a
start

A
b

a,b

D
a,b

Reconoce a*.(a|b)

Un resultado terico importante es que todo lenguaje regular (definido por un autmata
finito) posee un AFD mnimo que lo reconoce. Esto quiere decir, por ejemplo, que para las
expresiones regulares (a|b)* y (a*.b*)* (las cuales definen el mismo lenguaje *) existe un
solo autmata finito determinista mnimo. Sin embargo, al obtener los AFND a partir de las
expresiones regulares, resultan autmatas diferentes. Este resultado nos permite
entonces, obtener el AFD mnimo que reconoce un lenguaje regular, independientemente
de la expresin regular que lo defina. Los pasos para obtener el AFD mnimo a partir de la
expresin regular que define el lenguaje son:

Obtener el AFND a partir de la expresin regular.


Convertir el AFND en AFD.
Minimizar el AFD.

La minimizacin de un AF se basa en la eliminacin de estados inaccesibles y en la


reunin de los estados redundantes. Ambas estrategias intentan reducir al mnimo el
nmero de estados del AFD. La primera parte consiste en determinar cules son los
estados inaccesibles del AFD y eliminarlos conjuntamente con sus transiciones. En el
caso de los autmatas construidos a partir de expresiones regulares o AFD obtenidos a
partir de AFND, no es necesario realizar este paso, puesto que estos algoritmos generan
solamente los estados accesibles. Centraremos nuestra atencin, por tanto, en la
minimizacin de los AFD a travs de la reunin de los estados redundantes.

El algoritmo de minimizacin requiere que el AFD sea completamente definido. Si no fuera


este el caso, se agrega un nuevo estado muerto M, con transiciones a l mismo ante
todos los smbolos de entrada, y para cada estado S que no tenga definida una transicin
ante el smbolo a, se adiciona una transicin de S a M por a. Los estados redundantes se
obtienen particionando el conjunto de estados en clases de equivalencia de forma tal que
cada clase contiene los estados que son mutuamente indistinguibles.

Veamos cuando dos estados son distinguibles: Sea N = (S,,,S0,F) un AFND, y S1, S2
dos estados de S. Decimos que la cadena w * distingue a S1 de S2, si:

(S1,w)

(S3, )

(S2,w)

(S4, )

y slo uno entre S3 y S4 pertenece a F.

Decimos que S1 y S2 son k-indistinguibles (S1


S2) si y solo si no existe w * y |w| k
que distinga a S1 de S2. Decimos que S1 y S2 son indistinguibles (S1 S2) si son kindistinguibles para k 0.

Tomemos, por ejemplo, el siguiente autmata:

S0

S1

S0

S1

S2

S1

S2

S1

S2

Cules seran los estados 0-indistinguibles?

En primer lugar, para que dos estados sean 0-distinguibles es necesario encontrar una
cadena de longitud 0 (o sea, la cadena ) que los distinga. Veamos qu estados
pueden ser distinguidos por la cadena vaca:

(S0, )

(S0, )

(S1, )

(S1, )

(S2, )

(S2, )

S0 se distingue de S1 ya que solo uno entre S0 y S1 F.


S1 se distingue de S2 por la misma razn, y S0 no se distingue de S2 ya que S0 y S2 F
ambos. Luego, la cadena vaca divide el conjunto de estados en dos clases de
equivalencia: las clases de los estados 0-indistinguibles, que seran los estados finales en
un grupo y lo no finales en otro.

El algoritmo se basa en ir formando los grupos de estados indistinguibles para cada una
de las posibles cadenas de entrada, y a la misma vez, separando en grupos diferentes a
aquellos estados que se distinguen por alguna cadena. El proceso de obtencin de estos
grupos se realiza particionado de forma iterativa el conjunto de estados en nuevos
subgrupos hasta que nos sea posible particionar nuevamente ningn grupo.

La particin inicial es aquella cuyos grupos estn formados por los estados 0indistinguibles. Esta particin contiene, como ya hemos visto, solamente dos grupos de
estados: el grupo de los estados finales y el de los no finales. De manera general, la idea
del algoritmo es la siguiente: supongamos que estamos en la k-sima particin k y en
ellas tenemos los grupos G1, G2, , Gn. En este momento los estados de cada Gi son kindistinguibles y cualquier par de estados tomados de grupos diferentes son distinguibles
para alguna cadena w, |w| k. Para obtener la nueva particin solo es necesario analizar
si es posible dividir alguno de los grupos, puesto que en lo adelante dos estados de
grupos distintos no podrn reunirse nuevamente en algn grupo. Si dos estados son
distinguidos por alguna cadena de longitud k, ya no podrn ser indistinguibles. Para
analizar cada grupo se toman sus estados dos a dos y se comprueba si son (k+1)indistinguibles analizando sus transiciones ante cada smbolo de entrada. Tomemos, por
ejemplo, los estados S1 y S2 de G1 y analicemos sus transiciones ante el smbolo a:
(S1,a) y (S2,a). Si estas transiciones son a estados que se encuentran en grupos
distintos de la particin k, entonces estos estados han sido distinguidos por una cadena
wa, |wa| = k+1, luego, ellos deben ser separados en grupos distintos de la nueva particin.
Para que dos estados continen perteneciendo a un mismo grupo en la nueva particin es
necesario que para todos los smbolos de entrada sus transiciones ante cada smbolo
sean a estados de un mismo grupo.
El algoritmo termina cuando k+1 = k.

Algoritmo: Minimizacin de un AFD reuniendo sus estados redundantes


Entrada: Un AFD N = (S,,,S0,F)
Salida: Un AFD N' = (S',',,S'0,F') mnimo, tal que L(N) = L(N')

1. Construir una particin inicial 0, con dos grupos de estados, los finales y los no
finales.
k=1
2. Aplicar el siguiente procedimiento a k-1 para obtener k.
a) Para cada grupo G k-1, particionar G en subgrupos de forma tal que
dos estados S y T de G estn en un mismo subgrupo si y solo si para todo smbolo a
(S,a) y (T,a) son a estados de un mismo grupo de k-1
b) k es la nueva particin formada por los subgrupos obtenidos.

3. Si k = k-1, entonces hacer final = k e ir a 4, de lo contrario hacer k = k+1 e ir a 2.

4. Construir el nuevo autmata de la siguiente forma:


a) Tomar de cada grupo de final un estado representante
b) Los estados de N' son los representantes de cada grupo
c) Para cada estado representante S, si existe una transicin por a de S a T
en N, entonces en N' habr una transicin por a de S a R, donde R es el
representante del grupo de T
d) El estado inicial es el representante del grupo donde est el estado
inicial de N, y los estados finales son los representantes de los grupos que
contienen estados finales del autmata original

Ejemplo: Apliquemos el algoritmo al siguiente autmata

0
0
start

B
0

A
1

C
1

0
1

F
0

Primero debemos determinar los estados accesibles:

A, ABD, ABDC, ABDCE, ABDCE, por tanto, F y G son inaccesibles


Minimizacin
0: G1 = { A,B,D }

G2 = { C,E }

A,B,D son 0-indistinguibles


C,E

son 0-indistinguibles

G1

G2

G1

G1

G1

G2

G1

G2

G1

G2

G1

G2

En G1, B y D son 1-indistinguibles, mientras que A se distingue de ambos. Luego,


es necesario separar A de B y D en la prxima particin.

En G2, C y E son 1-indistinguibles, por lo que no podrn separarse en el prximo


paso.

1: G1 = { A } G2 = { B,D }

G3 = { C,E }

2: G1 = { A } G2 = { B,D }

G3 = { C,E }

2 = 1 = final

El autmata resultante es:

0
start

0,1

1
0

3.4 Representacin de una Expresin Regular usando AFND


Los lenguajes aceptados por un AF son fcilmente descritos por una simple expresin llamada
expresin regular. Una expresin regular es un patrn que se crea utilizando caracteres del
alfabeto con la ayuda de operacin de unin, concatenacin y clausura de kleene (*) para
representar un lenguaje regular.

La familia de los lenguajes aceptados por los autmatas finitos coincide con la familia de los
lenguajes que pueden representarse mediante expresiones regulares. Esto se demuestra
comprobando que:

Dada una expresin regular, existe un autmata que acepta el mismo lenguaje que el
representado por la expresin regular.
Dado un autmata finito existe siempre una expresin regular que representa el lenguaje
aceptado por el autmata.

La primera transformacin es ms til, ya que inicialmente los lenguajes se representan mediante


expresiones regulares y despus necesitamos algoritmos (autmatas) que reconozcan estos
lenguajes.
Sea
un conjunto finito de smbolos y sean L, L1 y L2 conjuntos de cadenas de
*. La
concatenacin de L1 y L2, denotada por L1L2, es el conjunto {xy|x est en L1 e y est en L2}.
Definimos
= {E} y = L
para toda i >= 1. La cerradura de Kleene de L, denotada por L*, es
el conjunto:

Y la cerradura positiva de L, denotada por L+ es el conjunto:

L+ contiene a E si y solo si L la contiene.

Ejemplo:

Sea L1 = {10,1} y L2 = {011,11}. Entonces L1L2 = {10011, 1011,111}.


Tambin {10,11}* = {E, 10,11,1010,1011,1110,1111,}
Sea
un alfabeto. Las expresiones regulares sobre
definidas recursivamente como:

y los conjuntos que ellas denotan son

1) es una expresin regular y denota al conjunto vaco.


2) E es una expresin regular y denota al conjunto {E}.
3) Para cada a en

, a es una expresin regular y denota al conjunto {a}.

4) Si r y s son expresiones regulares que denotan los lenguajes R y S, respectivamente,


entonces (r + s), (rs) y (r*) son expresiones regulares que denotan los conjuntos R U S,
RS, y R*, respectivamente.

Ejemplo:
00 es una expresin regular que representa a {00}. La expresin (0 + 1 )* denota todas las
cadenas de 0s y 1s. As (0 + 1)* 00 (0 + 1)* denota todas las cadenas de 0s y 1s con al
menos dos ceros consecutivos.

Ahora demostraremos que los lenguajes que aceptan los autmatas finitos son precisamente
los lenguajes denotados por las expresiones regulares.
Teorema 2.3: Sea r una expresin regular. Entonces existe un AFND con transiciones-E que
acepta L( r ). (L ( r ) es el lenguaje denotado por r).
Demostracin:
a) r = E
b) r = 0
c) r=a
d) r= r1 + r2
e) r = r1r2
f) r =

r1*

Como ejemplo para este documento de unidad 3 de lenguajes y autmatas vamos a construir un
AFND para la expresin regular 01* + 1. La expresin anterior es realmente (0(1*)) + 1, as que
es de la forma r1 + r2, donde r1=01* y r2=1.
El autmata para r2 es:

Se puede expresar r1 como r3r4, donde r3=0 y r4=1*.


El autmata para r3 es:

R4 es r5*, donde r5 es 1, y el AFND para r5 es:

Finalmente se tienen los siguientes AFND:


a) Para r4 = 1*

b) Para r1 = 01*

c) Para r=01* +1

3.5 Minimizacin de estados en un Autmata Finito.


Dos estados de un autmata finito determinista son estados equivalentes si al unirse en un slo
estado, pueden reconocer el mismo lenguaje regular que si estuviesen separados. Esta unin de
estados implica la unin tanto de sus transiciones de entrada como de salida. Si dos estados no
son equivalentes, se dice que son estados distinguibles. Un estado final con un estado no-final
nunca ser equivalente.
Un AFD est minimizado, si todos sus estados son distinguibles y alcanzables. Un algoritmo de
minimizacin de AFD es el siguiente:

Eliminar los estados inaccesibles del autmata.


Construir una tabla con todos los pares (p, q) de estados restantes.
Marcar en la tabla aquellas entradas donde un estado es final y el otro es no-final, es decir,
aquellos pares de estados que son claramente distinguibles.
Para cada par (p, q) y cada smbolo a del alfabeto, tal que r = (p,a) y s = (q,a):
Si (r, s) ya ha sido marcado, entonces p y q tambin son distinguibles, por lo tanto marcar
la entrada (p, q).
De lo contrario, colocar (p, q) en una lista asociada a la entrada (r, s).
Agrupar los pares de estados no marcados.

Luego del tercer paso, si la tabla creada queda completamente marcada, entonces el AFD inicial
ya era mnimo.
La complejidad computacional del problema de minimizar un AFD es polinomial. De hecho, existen
algoritmos ms eficientes. Sin embargo, el problema de minimizar un autmata finito no
determinista es NP-completo y PSPACE-completo.

En la primera figura del ejemplo, se muestra un autmata con el estado inaccesible d, el cual
puede eliminarse inmediatamente. Luego se construye la tabla de pares de estados, y a
continuacin se marcan, de acuerdo a la tercera lnea del algoritmo, las filas y columnas
correspondientes a los estados finales c y g, salvo la celda que representa el par (c,g), puesto que
al ser ambos estados finales, pueden ser estados equivalentes. Posteriormente, se marcan las
celdas restantes de acuerdo a la cuarta lnea del algoritmo, notando que el par (b, f) queda
asociado con el par (c, g), y as finalmente se obtiene el autmata final, agrupando los estados b y
f, as como c y g, tal y como se muestra en la segunda figura del ejemplo.

Cuando se trabaja en compiladores, se requiere utilizar gramticas y autmatas asociados a stas.


Existen herramientas que permiten simplificar la utilizacin de los autmatas. En particular, para los
autmatas finitos deterministas (AFD), es de suma utilidad aplicar el algoritmo de minimizacin, ya
que de sta forma se obtiene un autmata equivalente, pero mucho ms eficiente.
El algoritmo de minimizacin consiste en cinco pasos, aunque stos a veces deben ser repetidos:

Particin inicial
Particin de nuevos conjuntos
Verificar la nueva particin
Eliminar los estados que se encuentren en el mismo grupo
Remover estados sumidero y no alcanzables desde smbolo inicial

De los pasos anteriores, el segundo y el tercero forman un ciclo, mientras que los dems son
procesos mecnicos que slo se deben aplicar una vez. A continuacin, detallaremos cada uno de
estos pasos.
A partir de un autmata determinista (AFD), ya sea una tabla con los valores o su dibujo, se
determinan dos conjuntos: uno que contiene a todos los estados finales y otro que contiene a los
dems estados. Por ejemplo, en la tabla de abajo, los estados finales son aquellos que tienen (f)

despus del nmero (3 y 4) y los estados no finales son los dems (1 y 2). Para el dibujo, los
estados finales son los que tienen doble crculo (3 y 4), mientras que los no finales son los que
tienen crculo sencillo (1 y 2). A este proceso se le conoce como particin inicial.

ESTADS \ TRANSICIONES

1(i)

2
3(f)
4(f)

1
4
D
(i)

= Estado inicial

(f)

=Estado final

b
4
3
3

Tabla de representacin de un autmata finito determinista.

A partir de cada estado en cada uno de los conjuntos que se tiene, se estudia cules transiciones
tienen, a cules estados se dirigen y a cules conjuntos pertenecen estos estados de llegada. Si
dos estados del mismo conjunto se dirigen a estados de conjuntos distintos por medio de una de
las transiciones, entonces estos estados deben separarse, formando as una nueva particin. A
esto se le llama particin de nuevos conjuntos. Asimismo, si uno de los estados del conjunto tiene
una transicin hacia otro estado y los dems estados del conjunto no van a ninguna parte con el
terminal de la transicin, entonces el que s la tiene debe separarse.
En estrecha relacin con el paso anterior se encuentra el paso de verificacin de la nueva
particin. Este indica que se debe repetir la fase de particin hasta que los conjuntos ya no se
puedan separar ms. Los conjuntos no se pueden separar cuando quedan con nicamente un
estado o cuando todos los estados del conjunto tienen transiciones hacia estados de los mismos
conjuntos. Cuando ya no se puede realizar ms particiones a los conjuntos, se sigue con el cuarto
paso. Resulta de suma importancia considerar que cuando se separan dos estados de un conjunto,
esto puede afectar las futuras particiones.

Se dispone ahora de una particin final. Si todos los estados estn en conjuntos distintos, no hay
que hacer nada. Si, por el contrario, hay varios estados en uno o varios de los conjuntos, estos
estados deben fusionarse. La justificacin es sencillamente que todos los estados de un conjunto
cumplen una misma funcin y el autmata no se ve afectado si se unen. Para realizar esta fusin,
se determina arbitrariamente un estado representante por cada conjunto. En la tabla del autmata,
se reemplazan los dems estados del conjunto por el representante. Luego, se eliminan las filas
repetidas. Finalmente, se debe remover aquellos estados no finales que slo tienen transiciones
hacia ellos mismos o, en otras palabras, aquellos a partir de los cuales no se puede llegar a ningn
estado final. A estos se les denomina estados sumideros.

Asimismo, se debe eliminar los estados a los que no se puede llegar desde el estado inicial.
1

B
C
D
[E]
F
G

B
A
D
E
G
G

C
E
G
E
F
G

El estado A es inicial y el estado E es final. Se aplicar el algoritmo de minimizacin descrito


anteriormente.
Primer paso. Se separan los estados en estados finales y no finales. Tenemos los conjuntos: {A B
C D F G} y {E}.
Segundo paso. A excepcin de C, todos los estados tienen transiciones hacia los estados del
primer conjunto {A B C D F G}. Como C se dirige a E por medio de 0, separamos a este estado.
Nos quedan entonces los conjuntos: {A B D F G} {C} {E}.
Los estados C y E han quedado solos en sus conjuntos y entonces no pueden ser separados ms.
Se vuelve a realizar el paso 2. B se dirige a C mediante 0. Como C se encuentra en un conjunto
diferente al de los dems estados de llegada a partir del conjunto {A B D F G}, hay que separar a
B. Esto nos da: {A D F G} {B} {C} {E}. B ya no puede ser particionado.
Se vuelve a realizar el paso 2. A se dirige a B mediante 1 y B est en un grupo distinto del conjunto
de llegada de {D F G}. Por lo tanto, A debe separarse del grupo.
Nos queda: {D F G} {A} {B} {C} {E}. A no puede separarse ms.
Tercer paso. {D F G} no se puede separar ms ya que todos sus estados se dirigen a un mismo
conjunto de estados ({D F G}).
Cuarto paso. Para el nico conjunto con ms de un estado {D F G}, se escoge el representante D.
En la tabla, reemplazamos por D donde sea que aparezca F o G.
Tenemos la siguiente tabla:

B
C
D
[E]
D
D

B
A
D
E
D
D

C
E
D
E
D
D

Como resultado, se tiene tres filas idnticas. Por lo tanto, se elimina dos de ellas, obteniendo la
siguiente tabla:
1

B
C
D
[E]

B
A
D
E

C
E
D
E

Ahora, el autmata que se tiene no tiene estados sumidero y todos los estados son alcanzables a
partir del estado inicial A. El autmata ha sido minimizado.
El uso del algoritmo de minimizacin es de gran utilidad para disminuir el nmero de estados de un
autmata determinista. Sin embargo, esto no asegura que el nmero de transiciones entre estados
se reduzca. El algoritmo es bastante sencillo de aprender, aunque es necesario realizar mucha
prctica para poder dominarlo. Para facilitar la obtencin de un autmata mnimo se recomienda
partir de un autmata simple si se da la oportunidad de crearlo a partir de una expresin regular.
Entre ms estados tenga un autmata, ms complejo resultar y ser ms difcil de manejar.

3.6 Aplicaciones Autmatas Finitos (definicin de un caso de estudio)


Construccin del vehculo evasor de obstculos
La teora de autmatas finitos consiste en modelos matemticos de sistemas, con entradas y
salidas discretas. El sistema puede estar en cualquiera de un nmero finito de configuraciones o
estados. El estado del sistema resume la informacin concerniente a entradas anteriores y que es
necesaria para determinar el comportamiento del sistema para entradas posteriores. En la ciencia
de la computacin encontramos muchos ejemplos de sistemas de estados finitos, y la teora de
autmatas finitos es una herramienta muy til en lo que a esta ciencia concierne. Un ejemplo es
un circuito de interrupcin, como la unidad de control de una computadora, el que est compuesto
por un nmero finito de compuertas, cada una de las cuales pueden utilizar dos condiciones
posibles, por lo general denotadas por 0 y 1 hablando de valores lgicos de voltaje. En este
contexto el presente trabajo est enfocado a utilizar la tcnica de autmatas finitos para modelar
las trayectorias posibles de un Vehculo Evasor de Obstculos (VEO), que son las diferentes
salidas (estados) que se presentan ante diferentes entradas al sistema, las que provienen de los
sensores con los que ha sido equipado el vehculo.
(Hopcroft,1997) establece que un Autmata Finito consiste en un conjunto finito de estados y un
conjunto de transiciones de estado a estado, que se dan sobre smbolos de entrada tomados de
un alfabeto . Para cada smbolo de entrada existe exactamente una transicin a partir de cada
estado (posiblemente de regreso al mismo estado). Un estado, por lo general denotado como q0,
es el estado inicial en el que el autmata tiene su origen, mientras que otros estados estn
designados como finales o de aceptacin.
Un tipo especial de autmatas son los Autmatas Finitos no Determinsticos que de acuerdo a
(Brookshear,1989) analizan cadenas construidas a partir de un alfabeto finito y solo puede tener un
numero finito de estados, algunos de los cuales son de aceptacin y uno es el estado inicial. En
este tipo de autmatas, la transicin que se ejecuta en una etapa dada puede ser incierta, es decir
en la transicin de un estado a otro pueden existir ms de un arco rotulado e inclusive arcos que
conlleven al mismo estado, considere la figura 1 para clarificar el concepto.
Uno de los primeros trabajos que comenzaron a formalizar la dinmica de robots mviles es
(Crowley, 1989) en el que se utilizan dispositivos ultrasnicos en el vehculo para su
posicionamiento y orientacin. En (Maes, 1990) se muestra un estudio del comportamiento de
robots autnomos y se divide en construccin de mapas, exploracin, transitar y evasin de
obstculos. En (Seng,1997) se plantea como una de las mayores problemticas de la navegacin
robtica la localizacin y se proponen los pasos claves para el diseo, calibracin y modelado de
autmatas. Hay otros autores que refuerzan la evasin de objetos o desarrollo de trayectorias
mediante tcnicas de navegacin como son: navegacin inercial, compases magnticos y
triangulacin.(Borenstein,1997).
(Betke, 1997) considera que el autmata puede reconocer marcas especificas en el medio por el
cual se desplaza usando reconocimiento de patrones visuales. La localizacin robtica as como la
evasin de obstculos del autmata, ha llegado a ser uno de los problemas fundamentales en los
robots mviles, y por ello, en (Fox, 1999) se presenta una versin de la localizacin Markov, en
donde la idea principal es mantener una densidad de probabilidad sobre el espacio de todas las
localizaciones posibles de un robot en su entorno.

El Vehculo Evasor de Obstculos (VEO de aqu en adelante) obtiene informacin del medio por el
cual transita a travs de unos fotodiodos y unas fotorresistencias que actan como sensores, estos
sensores arrojan como resultado niveles de voltaje que varan en proporcin directa con la
proximidad al obstculo, los niveles de voltaje despus de pasar por un comparador de niveles se
convierten en niveles digitales, los cuales determinan una direccin especifica al actuar como
entradas en el bus de direcciones de una memoria RAM, la cual se ha cargado con un programa,
que contiene instrucciones precisas para lograr la evasin de obstculos, estas instrucciones que
provienen del bus de datos de la memoria RAM, controlan directamente 2 dispositivos
transistorizados conocidos como puentes H, los cuales interactan directamente con los motores
de direccin del vehculo, indicndoles la accin de giro y por tanto ejecutando los diferentes
movimientos para los cuales se dise VEO. Es necesario por tal motivo presentar el programa
que se carg en la memoria RAM segn (Catlogo,2010), lo cual representa el punto de partida
para definir el alfabeto que se emplea para la descripcin de la dinmica de VEO a travs de
autmatas finitos.

4Diagrama de transiciones para el autmata finito no determinstico que describe la dinmica de VEO.

5Funcin de Transicin para el autmata finito no determinstico de la figura anterior.

UNIDAD 4

Mquinas de Turing
4.1 Definicin formal Maquina de Turing
Alan Turing fue un matemtico ingls que vivi durante la primera mitad del siglo XX. Aunque fue
un matemtico brillante en muchos campos, destacando especialmente en criptografa, su principal
inters se centraba en la lgica, que en aquellos momentos se encontraba en plena ebullicin
gracias al intento de David Hilbert de hallar una formulacin de las matemticas sobre una base
estricta de lgica formal. La Mquina de Turing, o Mquina de Computacin Lgica como la
llamaba l, fue quizs la mayor aportacin de Alan Turing a esta tarea y con seguridad su
descubrimiento de mayor transcendencia, ya que abri el camino de la ciencia de la Computacin,
que a su vez nos lleva al computador que en estos momentos estoy utilizando para escribir esto, o
al que usted est usando para leerlo. En definitiva, Alan Turing fue uno de los cientficos ms
importantes de la primera mitad del siglo XX y, sin duda, una de las mentes que ms influy en la
manera actual que tenemos de ver el mundo e interactuar con l.
Es un dispositivo de reconocimientos de lenguaje, es ms general que cualquier autmata finito y
cualquier autmata de pila, debido a que ellas pueden reconocer tanto los lenguajes regulares,
como los lenguajes independientes de contexto y adems muchos otros tipos de lenguajes.
La mquina de Turing (abreviado MT) tiene, un control finito, una cabeza lectora y una cinta donde
puede haber caracteres, y donde eventualmente viene la palabra de entrada. La cinta es de
longitud infinita hacia la derecha, hacia donde se extiende indefinidamente, llenndose los
espacios con el carcter blanco (que representaremos con t). La cinta no es infinita hacia la
izquierda, por lo que hay un cuadro de la cinta que es el extremo izquierdo, la MT la cabeza lectora
es de lectura y escritura, por lo que la cinta puede ser modificada en curso de ejecucin. Adems,
en la MT la cabeza se mueve bidireccionalmente (izquierda y derecha), por lo que puede pasar
repetidas veces sobre un mismo segmento de la cinta.
Este modelo est conformado por un alfabeto de entrada y uno de salida, un smbolo especial
llamado blanco (normalmente b, o 0), un conjunto de estados finitos y un conjunto de
transiciones entre dichos estados. Su funcionamiento se basa en una funcin de transicin, que
recibe un estado inicial y una cadena de caracteres (la cinta, la cual es finita por la izquierda)
pertenecientes al alfabeto de entrada. Luego va leyendo una celda de la cinta, borrando el smbolo,
escribir el nuevo smbolo perteneciente al alfabeto de salida y finalmente avanza a la izquierda o a
la derecha (solo una celda a la vez), repitiendo esto segn se indique en la funcin de transicin,
para finalmente detenerse en un estado final o de aceptacin, representando as la salida.

La mquina de Turing consta de un cabezal lector/escritor y una cinta infinita en la que el cabezal
lee el contenido, borra el contenido anterior y escribe un nuevo valor. Las operaciones que se
pueden realizar en esta mquina se limitan a: avanzar el cabezal lector/escritor hacia la derecha.
Avanzar el cabezal lector/escritor hacia la izquierda. El cmputo es determinado a partir de una
tabla de estados de la forma: (estado, valor) (nuevo estado, nuevo valor, direccin).
Esta tabla toma como parmetros el estado actual de la mquina y el carcter ledo de la cinta,
dando la direccin para mover el cabezal, el nuevo estado de la mquina y el valor a ser escrito en
la cinta. Con este aparato extremadamente sencillo es posible realizar cualquier cmputo que un
computador digital sea capaz de realizar.
Mediante este modelo terico y el anlisis de complejidad de algoritmos, fue posible la
categorizacin de problemas computacionales de acuerdo a su comportamiento, apareciendo as,
el conjunto de problemas denominados P y NP, cuyas soluciones en tiempo polinmico son
encontradas segn el determinismo y no determinismo respectivamente de la mquina de Turing.
De hecho, se puede probar matemticamente que para cualquier programa de computadora es
posible crear una mquina de Turing equivalente. Esta prueba resulta de la Tesis de ChurchTuring, formulada por Alan Turing y Alonzo Church, de forma independiente a mediados del siglo
XX.
Una mquina de Turing es un dispositivo que transforma un INPUT en un OUTPUT despus de
algunos pasos. Tanto el INPUT como el OUPUT constan de nmeros en cdigo binario (ceros y
unos). En su versin original la mquina de Turing consiste en una cinta infinitamente larga con
unos y ceros que pasa a travs de una caja. La caja es tan fina que solo el trozo de cinta que
ocupa un bit (0 1) est en su interior. La mquina tiene una serie de estados internos finitos que
tambin se pueden numerar en binario.
Para llevar a cabo algn algoritmo, la mquina se inicializa en algn estado interno arbitrario. A
continuacin, se pone en marcha y la mquina lee el bit que se encuentra en ese momento en su
interior y ejecuta alguna operacin con ese bit (lo cambia o no, dependiendo de su estado interno).
Despus se mueve hacia la derecha o hacia la izquierda, y vuelve a procesar el siguiente bit de la
misma manera. Al final se para, dejando el resultado al lado izquierdo por ejemplo.

Una instruccin tpica podra ser: 0111011i


La traduccin es como sigue: si la mquina se encuentra en el estado interno 0 y lee 1 en la cinta,
entonces pasar al estado interno 1101 (13), escribir 1 y se mover hacia la izquierda un paso (la
cinta se mover hacia la derecha).
A continuacin es conveniente inventar una notacin para la secuencia del INPUT. Esta notacin
se llama notacin binaria expandida. Consiste en cambiar la secuencia original binaria por otra
construida de la siguiente forma: el 0 se cambia por 0 y el 1 por 10 y se ponen un cero a la
izquierda y/o a la derecha del resultado si empieza o acaba en 1 respectivamente. As por ejemplo,
el nmero 13 que en binario es 1101 es en binario expandido 1010010 con un cero delante por
esta ltima regla 01010010. Para volver al original hay que contraer el binario expandido con la
siguiente regla:
Empezamos a leer por la izquierda el binario expandido. Cuando encontremos un 0 tomamos nota
de cuntos 1 hay hasta llegar al siguiente 0 y lo escribimos. Si encontramos que hay dos 0
seguidos, apuntaramos un 0 porque no habra ningn 1.Veamos con el 13 cmo se hara. El
primer 0 se encuentra en la primera posicin y el siguiente 0 est en la posicin 3. Entre los dos
solo hay un 1. Lo anotamos. Seguidamente hay un 1, y despus un 0, entonces apuntamos 1
porque hay un 1 entre medias de ellos. Esto es lo que se hace sucesivamente y encontramos:
1101 que es el nmero original.
La mquina de Turing consta de un cabezal lector/escritor y una cinta infinita en la que el cabezal
lee el contenido, borra el contenido anterior y escribe un nuevo valor. Las operaciones que se
pueden realizar en esta mquina se limitan a:

Avanzar el cabezal lector/escritor hacia la derecha.


Avanzar el cabezal lector/escritor hacia la izquierda.

El cmputo es determinado a partir de una tabla de estados de la forma: (Estado, valor) (Nuevo
estado, nuevo valor, direccin). Esta tabla toma como parmetros el estado actual de la mquina y
el carcter ledo de la cinta, dando la direccin para mover el cabezal, el nuevo estado de la
mquina y el valor a ser escrito en la cinta.
La memoria ser la cinta la cual se divide en espacios de trabajo denominados celdas, donde se
pueden escribir y leer smbolos. Inicialmente todas las celdas contienen un smbolo especial
denominado blanco. Las instrucciones que determinan el funcionamiento de la mquina tienen la
forma, si estamos en el estado x leyendo la posicin y, donde hay escrito el smbolo z, entonces
este smbolo debe ser reemplazado por este otro smbolo, y pasar a leer la celda siguiente, bien a
la izquierda o bien a la derecha. La mquina de Turing puede considerarse como un autmata
capaz de reconocer lenguajes formales. En ese sentido es capaz de reconocer los lenguajes
recursivamente enumerables, de acuerdo a la jerarqua de Chomsky. Su potencia es, por tanto,

superior a otros tipos de autmatas, como el autmata finito, o el autmata con pila, o igual a otros
modelos con la misma potencia computacional.

4.2 Construccin modular de una Maquinas de Turing


Mediante esta tcnica se puedan desarrollarse mquinas de Turing complejas a partir de bloques
de elementales a partir de mquinas ms pequeas mediaste diagramas de transiciones. La
construccin de mquinas de Turing se lleva a cabo mediante los diagramas de transicin y
combinarlos de manera parecida a lo que se realiza en la formacin de la unin y concatenacin
de los autmatas finitos.
Pasos para la construccin de una mquina de Turing:
a)
b)

c)

Elimine las caractersticas de inicio de los estados iniciales de las maquinas, excepto la
de aquel donde iniciara la maquina compuesta.
Elimine las caractersticas de detencin de los estados de parada de todas la maquinas e
introduzca un nuevo estado de parada que no se encuentre en ninguno de los diagramas
que se combinan.
Para cada uno de los antiguos estados de parada p y cada x en y.

Ejemplificacin de dicha construccin:

Una mquina de Turing es un autmata que se mueve sobre una secuencia lineal de datos. En
cada instante la mquina puede leer un solo dato de la secuencia (generalmente un carcter) y
realiza ciertas acciones en base a una tabla que tiene en cuenta su "estado" actual (interno) y el
ltimo dato ledo. Entre las acciones est la posibilidad de escribir nuevos datos en la secuencia;
recorrer la secuencia en ambos sentidos y cambiar de "estado" dentro de un conjunto finito de
estados posibles.

EJEMPLO.
Supongamos una mquina de Turing con un alfabeto unario, en la que el nulo (ausencia de dato) lo
sealamos con 0. La mquina puede tener cinco estados que denominamos {e0, e1, e2, e3, e4}.
El estado inicial es e0; su tabla de accin se muestra a la derecha.

Observe que la tabla debe contener al menos tantas filas como estados distintos. La primera
columna representa lo que podamos denominar "estado mental" de la mquina. La segunda
columna indica el carcter ledo; representa la entrada (input) al autmata. Las siguientes (en otro
color) representan el comportamiento o respuesta de la mquina para la combinacin
estado/carcter-ledo. Esta respuesta tiene tres componentes:

Una salida (escribir en la cinta). Indicado en la columna W.


Un movimiento de avance o retroceso del cabezal sobre la cinta (indicado en la columna
M).
Un cambio del estado interno actual del autmata a otro nuevo (columna N).

Observe que las filas pueden repetir el primer elemento; significan las acciones a tomar en cada
estado segn el carcter ledo. Cada vez que se alcanza un estado para el que no exista una
entrada para el carcter ledo, la mquina se detiene. En nuestro autmata la tabla seala
acciones concretas para cualquier carcter ledo (0 o 1) en cualquiera de los estados e1, e2, e3 y
e4, pero si en el estado e0 se lee un 0, la mquina se detiene.
La sucesin de pasos de cmputo es la siguiente (suponemos un estado inicial cualquiera ex):
a)
b)
c)
d)

1.- Se lee un carcter c (en nuestro caso es necesariamente 0 o 1)


2.- Se mira en la tabla que fila corresponde a la combinacin ex/c.
3a.- Si no existe entrada la mquina se detiene.
3b.- Si existe entrada se ejecuta la instruccin (columnas en marrn claro) en el siguiente
orden:
e) 3b1.- Se escribe en la posicin actual el carcter sealado (puede ser el mismo que
haba).
f) 3b2.- Se mueve el cabezal una posicin a izquierda o derecha.
g) 3b3.- Se pasa al estado sealado en la ltima columna (puede implicar no cambiar de
estado).
h) 3b4.- Se repite el ciclo desde el punto 1.
Un ejemplo concreto debe comenzar en un estado determinado y con una cinta que contenga
cualquier conjunto no nulo de caracteres del alfabeto del autmata. El autmata de nuestro
ejemplo [4] espera estar situado en el primer carcter (izquierdo) de una cantidad cualquiera

representada en unario ( 0.1). El programa hace que el autmata lea la cantidad y la repita a la
derecha separado por un nulo (0). Por ejemplo, si encuentra 111100000 lo transforma en
111101111.
Un ejemplo del proceso de esta mquina puede ser el que se muestra a continuacin. Como el
nmero de pasos de cmputo hasta que la mquina se detiene, depende de la cantidad inicial
representada en la cinta, para hacer el ciclo ms breve supondremos que hay un 2 (110000...).
Los pasos ejecutados por el autmata para realizar el proceso se muestran en la tabla inferior. La
informacin contenida en la cinta para cada paso es la existente "antes" de la ejecucin del ciclo
correspondiente. El carcter en negrita indica la posicin de la cabeza en el momento de la
lectura.

P1: La mquina ejecuta el primer paso. Arranca en el estado e0, donde lee un 1; entonces, de
acuerdo con su tabla de accin escribe un 0 en esa posicin, se mueve a la derecha y entra en
estado e1.

P2: En e1 lee un 1, escribe un 1 y se mueve a la derecha. Sigue en e1.


P3: En e1 lee 0, escribe 0, se mueve a la derecha y cambia a e2
P4: En e2 lee 0, escribe 1, se mueve a la izquierda y cambia a e3
P5: En e3 lee 0, escribe 0, se mueve a la izquierda y cambia a e4
P6: En e4 lee 1, escribe 1, se mueve a la izquierda y sigue en e4
El proceso sigue la misma lgica a travs de los sucesivos pasos hasta llegar al ltimo.

P15: En e0 lee 0; no existe ninguna entrada en la tabla para esta combinacin, por lo que el
autmata se detiene. Comprobamos como al final ha escrito en la cinta la cantidad esperada:
11011.

4.3 Lenguajes aceptados por la Maquina de Turing.


Aceptan lenguajes formales que pueden ser generados por una gramtica de tipo 0:
recursivamente innumerable (r.e) Las mquinas de turing son los reconocedores de lenguaje ms
poderosos que existen.
Lenguajes regulares: las gramticas (de tipo 3) formales definen un lenguaje describiendo como se
pueden generar las cadenas del lenguaje Las gramticas regulares (aquellos reconocidos por un
autmata finito). Son las gramticas ms restrictivas. El lado derecho de una produccin debe
contener un smbolo Terminal y como mximo un smbolo no Terminal.
Lenguajes Libres de contexto: Estas gramticas conocidas tambin como gramticas de tipo 2 o
gramticas independientes del contexto, son las que generan los lenguajes libres o independientes
del contexto. Los lenguajes libres del contexto son aquellos que pueden ser reconocidos por un
autmata de pila determinstico o no determinstico. Como toda gramtica se definen mediante una
cudrupla G=N, T, S, P), siendo N un conjunto finito de smbolos no terminales; T un conjunto de
smbolos terminales: P un conjunto finito de producciones; S es el smbolo distinguido o axioma.
Ejemplo1
Aqu se describe una MT M2 que reconoce el lenguaje consistente de todas las cadenas de 0s
cuya longitud es una potencia de 2. La MT decide el lenguaje A = { 02n | n 0}.
M2 = Sobre la cadena de entrada w:
1.
2.
3.
4.
5.

Recorrer la cinta de izquierda a derecha, marcando un cero s y otro no.


Si en el paso 1 la cinta contiene slo un cero, aceptar.
Si en el paso 1 la cinta contiene ms de un cero y la cantidad de ceros es impar, rechazar.
Regresar la cabeza de la cinta hasta la posicin ms a la izquierda.
Ir al paso 1.

Q = { q1, q2, q3, q4, q5, q aceptar, q rechazar }


={0}
= { 0, x, }
se describe en el diagrama de estados de la figura 4.4
Los estados inicial de aceptacin y rechazo son q1, q aceptar, q rechazar,
respectivamente.

En la figura, la etiqueta 0 , R aparece en la transicin de q1 a q2. Esto significa que,


cuando M2 se encuentra en el estado q1 con la cabeza de la cinta leyendo un 0, la mquina va
al estado q2, escribe y mueve la cabeza de la cinta a la derecha (R). En otras palabras (q1,
0) = (q2, , R). Para mayor claridad se usa 0 R en la transicin de q3 a q4, lo cual significa
que M2 se mueve a la derecha cuando lee un 0 en el estado q3, pero no altera la cinta, (q3,
0) = (q4, 0, R).
A continuacin podemos ver una corrida de M2 sobre la cadena de entrada 0000.

UNIDAD 5

5 - Anlisis lxico
5.1 Funciones del analizador lxico
La fase de rastreo (scanner), tiene las funciones de leer el programa fuente como un archivo de
caracteres y dividirlo en tokens. Los tokens son las palabras reservadas de un lenguaje, secuencia
de caracteres que representa una unidad de informacin en el programa fuente.
En cada caso un token representa un cierto patrn de caracteres que el analizador lxico
reconoce, o ajusta desde el inicio de los caracteres de entrada. De tal manera es necesario
generar un mecanismo computacional que nos permita identificar el patrn de transicin entre los
caracteres de entrada, generando tokens, que posteriormente sern clasificados. Este mecanismo
es posible crearlo a partir de un tipo especfico de mquina de estados llamado autmata finito.
Es la primera fase de un compilador. Su principal funcin consiste en leer la secuencia de
caracteres del programa fuente, carcter a carcter, y elaborar como salida la secuencia de
componentes lxicos que utiliza el analizador sintctico. El analizador sintctico emite la orden al
analizador lxico para que agrupe los caracteres y forme unidades con significado propio llamados
componentes lxicos (tokens). Los componentes lxicos representan:
Palabras reservadas: if, while, do,

Identificadores: variables, funciones, tipos definidos por el usuario, etiquetas,


Operadores: =, >, <, >=, <=, +, *,
Smbolos especiales: ( ), { },
Constantes numricas. Literales que representan valores enteros y flotantes.
Constantes de carcter: literales que representan cadenas de caracteres.

El analizador lxico opera bajo peticin del analizador sintctico devolviendo un componente lxico
conforme el analizador sintctico lo va necesitando para avanzar en la gramtica. Los
componentes lxicos son los smbolos terminales de la gramtica. Suele implementarse como una
subrutina del analizador sintctico. Cuando recibe la orden obtn el siguiente componente lxico,
el analizador lxico lee los caracteres de entrada hasta identificar el siguiente componente lxico.

Adems el analizador lxico es responsable de:

Manejo de apertura y cierre de archivo, lectura de caracteres y gestin de posibles errores


de apertura.
Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea.
Inclusin de archivos y macros.
Contabilizar nmero de lneas y columnas para emitir mensajes de error.

Una de las ventajas de separar el anlisis lxico y anlisis sintctico es que facilita la
transportabilidad del traductor si se decide realizar cambios posteriores, por ejemplo cambiar las
etiquetas begin-end por llaves de apertura y cierre { }.

6Fases de un compilador

5.2 Componentes lxicos patrones y lexemas

En la fase de anlisis, los trminos componentes lxicos (token), patrn y lexema se emplean con
significados especficos. Un analizador lxico, inicialmente lee los lexemas y le asigna un
significado propio.

componente lxico es la secuencia lgica y coherente de caracteres relativo a una


categora: identificador, palabra reservada, literales (cadena/numrica), operador o
carcter de puntuacin, adems de que un componente lxico puede tener uno o varios
lexemas.
patrn es una regla que genera la secuencia de caracteres que puede representar a un
determinado componente lxico (expresin regular).
Lexema es una cadena de caracteres que concuerda con un patrn que describe un
componente lxico (valor de cadena).

Ejemplo de una cadena de cdigo: const pi = 3.1416;

El analizador lxico recoge informacin sobre los componentes lxicos en sus atributos asociados.
Los tokens influyen en las decisiones del anlisis sintctico, y los atributos, en la traduccin de los
tokens. En la prctica los componentes lxicos suelen tener solo un atributo.
Para efectos de diagnstico, puede considerarse tanto el lexema para un identificador como el
nmero de lnea en el que se encontr por primera vez. Esta informacin puede ser almacenada
en la tabla de smbolos para el identificador (estructura de datos).
Para la cadena E=M*C**2 de ejemplo, los componentes lxicos y los valores de atributo asociado
son:
<identificador, atributo para el smbolo E>
<op_asignacion>
<Identificador, atributo para el smbolo M>
<op_multiplica>
<identificador, apuntador al smbolo C>
<op_exponente>
<Numero, atributo valor 2>
Tome en cuenta que ciertas parejas no necesitan un valor de atributo. Los atributos relacionados
con ese token debern ser conservados y transferidos a alguna estructura de datos para que sean
empleados en las siguientes etapas del anlisis.

El valor asociado a una categora o unidad de lxico. Se representa como un nmero entero o una
constante de un byte. Ejemplo: el token de un identificador puede ser 1 id (si id fue definida como
1).Los tokens son las unidades lxicas bsicas de igual forma que las palabras y signos de
puntuacin son las unidades bsicas de un enunciado. Los tokens varan del lenguaje al lenguaje e
incluso de compilador a compilador para el mismo lenguaje, la eleccin de los tokens es tarea del
diseador del compilador.
En la mayora de lenguajes tendremos tokens para:
Palabras clave:
IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;
Operadores
Identificadores
Constantes (reales, enteras y de tipo carcter), strings de caracteres y signos de puntuacin.
1. Tipos de tokens:
Tiras especficas, tales como palabras reservadas (if, while, begin,etc.), el punto y
coma, la asignacin, los operadores aritmticos o lgicos, etc.
Tiras no especficas, como identificadores, constantes o etiquetas.

2. Prioridad de los tokens


Se da prioridad al token con el lexema ms largo: Si se lee >= y > se reconoce
el primero.
Si el mismo lexema se puede asociar a dos tokens, estos patrones estarn
definidos en un orden determinado.

5.3 Creacin de Tabla de tokens

Una tabla de smbolos o tokens es una estructura de datos que usa el proceso de traduccin de un
lenguaje de programacin, por un compilador o un intrprete, donde cada smbolo en el cdigo
fuente de un programa est asociado con informacin tal como la ubicacin, el tipo de datos y el
mbito de cada variable, constante o procedimiento.
Una implementacin comn de una tabla de smbolos puede ser una tabla hash, la cual ser
mantenida a lo largo de todas las fases del proceso de compilacin de ticses.
Puede tratarse como una estructura transitoria o voltil, que sea utilizada nicamente en el proceso
de traduccin de un lenguaje de programacin, para luego ser descartada, o integrada en la salida
del proceso de compilacin para una explotacin posterior, como puede ser por ejemplo, durante
una sesin de depuracin, o como recurso para obtener un informe de diagnstico durante o
despus la ejecucin de un programa.
Los smbolos en la tabla de smbolos pueden referirse a constantes, a funciones o a tipos de datos
en el cdigo fuente de un programa.
La tabla de smbolos forma parte de cada fichero que contiene el cdigo objeto durante el enlazado
o linking de los diferentes ficheros; recae en la responsabilidad del linker o enlazador resolver
cualquier referencia no resuelta.
Es como un diccionario variable, debe darle apoyo a la insercin, bsqueda y cancelacin de
nombres (identificadores) con sus atributos asociados, representando las vinculaciones con las
declaraciones. Debe aclararse que no necesariamente deber estar representada en una tabla
como su nombre indica ya que tambin se emplean rboles, pilas, etc.
Los smbolos se guardan en la tabla con su nombre y una serie de atributos opcionales que
dependern del lenguaje y de los objetivos del procesador, este conjunto de atributos almacenados
se denominan registro de la tabla de smbolos.
Una forma de organizacin simple es imaginar la TS como una tabla con una serie de filas, cada
fila contiene una lista de atributos que estn asociados a un identificador.
Las clases de atributos que aparecen en una TS dependen de la naturaleza del lenguaje de
programacin para el cual est escrito el compilador. Por ejemplo, un lenguaje de programacin
puede no tener tipos, entonces el atributo tipo no necesita aparecer en la tabla.
La organizacin de la TS variar segn las limitaciones de memoria y tiempo de acceso donde se
implemente el compilador.

7- Ejemplo de una tabla de tokens


La lista siguiente de atributos no es necesaria para todos los compiladores, sin embargo cada uno
de ellos se puede utilizar en la implementacin de un compilador particular.

Nombre de identificador.
Direccin en tiempo de ejecucin a partir de la cual se almacenar el identificador
si es una variable. En el caso de funciones puede ser la direccin a partir de la cual
se colocar el cdigo de la funcin.
Tipo del identificador. Si es una funcin, es el tipo que devuelve la funcin.
Nmero de dimensiones del array, o nmero de miembros de una estructura o
clase, o nmero de parmetros si se trata de una funcin.
Tamao mximo o rango de cada una de las dimensiones de los arrays, si tienen
dimensin esttica.
Tipo y forma de acceso de cada uno de los miembros de las estructuras, uniones o
clases. Tipo de cada uno de los parmetros de las funciones o procedimientos.
Valor del descriptor del fichero y tipo de los elementos del fichero en el caso de
lenguajes basados en ficheros homogneos.
Nmero de la lnea del texto fuente en que la variable est declarada.
Nmero de la lnea del texto fuente en que se hace referencia a la variable.
Campo puntero para construir una lista encadenada que permita listar las variables
en orden alfabtico en las fases de depuracin de cdigo.

5.4 Errores lxicos


El anlisis lxico constituye la primera fase, aqu se lee el programa fuente de izquierda a derecha
y se agrupa en componentes lxicos (tokens), que son secuencias de caracteres que tienen un
significado. Adems, todos los espacios en blanco, lneas en blanco, comentarios y dems
informacin innecesaria se elimina del programa fuente. Tambin se comprueba que los smbolos
del lenguaje (palabras clave, operadores,...) se han escrito correctamente.
Como la tarea que realiza el analizador lxico es un caso especial de coincidencia de patrones, se
necesitan los mtodos de especificacin y reconocimiento de patrones, y estos mtodos son
principalmente las expresiones regulares y los autmatas finitos. Sin embargo, un analizador lxico
tambin es la parte del traductor que maneja la entrada del cdigo fuente, y puesto que esta
entrada a menudo involucra un importante gasto de tiempo, el analizador lxico debe funcionar de
manera tan eficiente como sea posible.
Son pocos los errores simplemente en el nivel lxico ya que tiene una visin muy restringida de un
programa fuente. El analizador lxico debe devolver el componente lxico de un identificador y
dejar a otra fase se ocupe de los errores.
Suponga que una situacin en la cual el analizador lxico no puede continuar por que ninguno de
los patrones concuerda con un prefijo de la entrada. Tal vez la estrategia de recuperacin ms
sencilla sea recuperacin EN MODO PANICO (este mtodo de recuperacin es donde se borra
caracteres sucesivos de la entrada hasta que el analizador lxico pueda encontrar un componente
lxico bien formado). Los programas no siempre son correctos!!
El compilador tiene que:

Reportar clara y exactamente la presencia de errores


Recuperarse de cada error lo suficientemente rpido para poder detectar errores
subsiguientes:
Tratar de evitar mensajes falsos de error
Un error que produce un token errneo
Errores lxicos posibles

Un token o componente lxico es una cadena de caracteres que tiene un significado coherente en
cierto lenguaje de programacin. Ejemplos de tokens, podran ser palabras clave (if, while, int),
identificadores, nmeros, signos, o un operador de varios caracteres. Son los elementos ms
bsicos sobre los cuales se desarrolla toda traduccin de un programa, surgen en la primera fase,
llamada anlisis lxico.

Estrategias de Recuperacin de Errores Lxicos.


Modo Pnico:

obvia los siguientes caracteres de la entrada hasta encontrar un token bien formado.

Tratar de Arreglar la entrada:

Borrar el carcter extrao


Insertar el carcter perdido
Reemplazar un carcter incorrecto por uno correcto
Encontrar que cambio genera el menor nmero de errores sintcticos, y aplicarlo

5.5 Generadores de analizadores Lxicos.


Existen generadores de analizadores lxicos que nos ayudan a generar nuestro propio scanner,
claro solo debemos colocarle que tipo de cadenas queremos que acepte nuestro compilador y
automticamente el generador nos devolver un cdigo en algn respectivo lenguaje de
programacin. A continuacin una lista de generadores.
Lex
Cdigo generado: C.
Flex
Cdigo generado: C++.
Zlex
Cdigo generado: C.
Soporta cdigos de carateres de 16 bits.
Jax
Cdigo generado: Java.
No soporta entornos, est basado en expresiones regulares.
No soporta Unicode.
Jlex
Cdigo generado: Java.

Similar a lex.
Diseado para ser usado junto con CUP.
Jflex
Cdigo generado: Java.
Diseado para ser usado junto con CUP.
Otros: Ragel, ScanGen, RE2C, Gobo, YooLex.

El generador de analizadores lxicos Lex


Lex es un programa para generar analizadores lxicos (en ingls scanners o lexers). Lex se utiliza
comnmente con el programa yacc que se utiliza para generar anlisis sintctico. Lex, escrito
originalmente por Eric Schmidt y Mike Lesk, es el analizador lxico estndar en los sistemas Unix,
y se incluye en el estndar de POSIX. Lex toma como entrada una especificacin de analizador
lxico y devuelve como salida el cdigo fuente implementando el analizador lxico en C.
Aunque tradicionalmente se trata de software propietario, existen versiones libres de lex basadas
en el cdigo original de AT&T en sistemas como OpenSolaris y Plan 9 de los laboratorios Bell. Otra
versin popular de software libre de lex es Flex.
Es una herramienta conocida como Lex o Flex, la cual nos permite especificar un analizador lxico
mediante la especificacin de expresiones regulares para describir patrones de los tokens.
La notacin de entrada para esta herramienta es el lenguaje Lex, la cual es en s, el compilador
Lex.
Este transforma los patrones de entrada en un diagrama de transicin y genera cdigo en un
archivo llamado lex.yy.c que simula el diagrama de transicin.

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

Declaraciones: incluye variables, constantes de manifiesto, definiciones regulares, como


por ejemplo el nombre de un token. Tambin podemos agregar definiciones de manera
explcita en el cdigo generado escribiendo lo que deseamos agregar en medio de %{
%}, como por ejemplo %{ #define DIGITO 265 %}.
Reglas de traduccin: Estn dadas de la forma Patrn {Accin}, cada patrn es una
expresin regular, la cual puede usar declaraciones regulares de la seccin de
declaraciones. las acciones son fragmentos de cdigo, escritos en C.
Funciones auxiliares: contiene las funciones adicionales que se utilizan en las acciones.

5.6 - APLICACIN DE LOS ANALIZADORES LEXICOS.


En HTML.
HTML (HyperText Markup Language) es un lenguaje de marcas. Para que un lexema sea
considerado palabra clave, debe ir delimitado por los caracteres principio de marca < y fin de
marca >. Todo lo que no se encuentre entre estos dos caracteres se considera texto normal que
no hay que interpretar.
Un documento en HTML consta de texto y elementos estructurales. El texto forma el contenido de
la pgina web, y los elementos indican cmo organizarlo en la ventana del navegador. En general,
un elemento de HTML tiene la siguiente sintaxis:

HTML no diferencia entra maysculas y minsculas, as que un elemento <nombre> es igual que
otro llamado <Nombre> <NOMBrE>.
Hay elementos que no necesitan la etiqueta final, otros no llevan contenido, e incluso para algunos
elementos es ilegal escribir alguna de estas partes. De igual manera, para algunos elementos es
obligatorio definir ciertos atributos. Cada elemento concreto tiene su propia sintaxis.
HTML es un subconjunto de un lenguaje ms general: SGML (Standard Generalized Markup
Language), y como tal, utiliza una parte de sus elementos estructurales. La especificacin
completa de HTML se puede encontrar en http://www.w3.org. Para esta prctica, sin embargo,
vamos a centrarnos en los ms imprescindibles.
Un documento en HTML debe estar encerrado en un elemento <HTML>. A su vez, el elemento
<HTML> debe contener siempre una cabecera y un cuerpo, denotados, respectivamente, por los
elementos <HEAD> y <BODY>. Veamos un primer ejemplo de documento en HTML:
<HTML>
<HEAD> <TITLE>Documento Hola Mundo</TITLE> </HEAD>
<BODY>
Hola, Mundo
</BODY>
</HTML>

Todo documento en HTML debera de incluir un elemento <TITLE> dentro de la seccin de


cabecera, que normalmente se muestra en el espacio reservado para el ttulo de la ventana del
navegador.
Para esta prctica, nos interesa especialmente el elemento <A> (Anchor), que sirve para
establecer enlaces con otros documentos. El elemento <A> tiene la siguiente estructura:
< a atributos href="documento_destino" atributos >Descripcin< /a >
Por ejemplo, el cdigo HTML para la frase Pulse en este enlace para continuar sera:
Pulse en <a href="doc_destino.html">este enlace</a> para continuar

UNIDAD 6

Unidad 6 - Anlisis Sintctico


6.1 GLC (Gramticas libres de contexto)
Estas gramticas, conocidas tambin como gramticas de tipo 2 o gramticas independientes del
contexto, son las que generan los lenguajes libres o independientes del contexto. Los lenguajes
libres del contexto son aquellos que pueden ser reconocidos por un autmata de pila determinstico
o no determinstico.
Como toda gramtica se definen mediante una cudrupla G = (N, T, P, S), siendo:
- N es un conjunto finito de smbolos no terminales
- T es un conjunto finito de smbolos terminales N T =
- P es un conjunto finito de producciones
- S es el smbolo distinguido o axioma S (N T)
En una gramtica libre del contexto, cada produccin de P tiene la forma:

Es decir, que en el lado izquierdo de una produccin pueden aparecer el smbolo distinguido o un
smbolo no terminal y en el lado derecho de una produccin cualquier cadena de smbolos
terminales y/o no terminales de longitud mayor o igual que 1.
La gramtica puede contener tambin la produccin S si el lenguaje que se quiere generar
contiene la cadena vaca. En lingstica e informtica, una gramtica libre de contexto (o de
contexto libre) es una gramtica formal en la que cada regla de produccin es de la forma:
Vw
Donde V es un smbolo no terminal y w es una cadena de terminales y/o no terminales. El trmino
libre de contexto se refiere al hecho de que el no terminal V puede siempre ser sustituido por w sin
tener en cuenta el contexto en el que ocurra. Un lenguaje formal es libre de contexto si hay una
gramtica libre de contexto que lo genera.
Las gramticas libres de contexto permiten describir la mayora de los lenguajes de programacin,
de hecho, la sintaxis de la mayora de lenguajes de programacin est definida mediante
gramticas libres de contexto. Por otro lado, estas gramticas son suficientemente simples como
para permitir el diseo de eficientes algoritmos de anlisis sintctico que, para una cadena de
caracteres dada determinen cmo puede ser generada desde la gramtica. Los analizadores LL y
LR tratan restringidos subconjuntos de gramticas libres de contexto.
La notacin ms frecuentemente utilizada para expresar gramticas libres de contexto es la forma
Backus-Naur.

En resumen una gramtica libre de contexto es un conjunto finito de variables, cada una de las
cuales representa un lenguaje. Los lenguajes representados por las variables se describen
recursivamente en trminos de otros lenguajes o de smbolos primitivos llamados terminales. Las
reglas que describen el lenguaje asociado con cada variable se llaman producciones.
La motivacin original para las gramticas libres de contexto fue la descripcin de lenguajes
naturales tal como ocurre con las siguientes reglas:
<Oracin> <Frase sustantivo> <frase verbal>
< Frase sustantivo > <adjetivo> <Frase sustantivo>
< Frase sustantivo > <sustantivo>
<Sustantivo > nio
<Adjetivo > pequeo
Donde las variables se escriben dentro de corchetes angulares y las terminales son por ejemplo, la
palabra nio. Una Gramtica independientes del contexto (GIC) es una gramtica formal en la
que cada regla de produccin es de la forma:
Exp x

Donde Exp es un smbolo no terminal y x es una cadena de terminales y/o no terminales. El


trmino independiente del contexto se refiere al hecho de que el no terminal Exp puede siempre
ser sustituido por x sin tener en cuenta el contexto en el que ocurra. Un lenguaje formal es
independiente de contexto si hay una gramtica libre de contexto que lo genera, este tipo de
gramtica fue creada por Backus-Naur y se utiliza para describir la mayora de los lenguajes de
programacin.

Una GIC est compuesta por 4 elementos:

1.
2.
3.
4.

Smbolos terminales (elementos que no generan nada)


No terminales (elementos del lado izquierdo de una produccin, antes de la flecha "->")
Producciones (sentencias que se escriben en la gramtica)
Smbolo inicial (primer elemento de la gramtica)

Ejemplo 1: Teniendo un lenguaje que genera expresiones de tipo:


9+52
Para determinar si una GIC est bien escrita se utilizan los arboles de anlisis sintctico, as:

Producciones:

Lista -> lista + digito

Lista -> lista - digito

Lista -> digito

Digito -> 0|1|2|3|4|5|6|7|8|9

rbol de anlisis sintctico:

La gramtica es correcta siempre y cuando el smbolo inicial este al lado izquierdo de las
producciones y sea la raz del rbol.

En los lenguajes de programacin.


Las gramticas de los lenguajes de programacin estn formadas por un conjunto de reglas BNF,
cuyo nmero suele ser bastante amplio, lo cual incide en la ocultacin de distintos problemas que
pueden producirse, tales como tener reglas que produzcan smbolos que no se usen despus, o
que nunca se llegue a cadenas terminales. Todo esto se puede solventar realizando la
transformacin de la gramtica inicial sucia a una gramtica limpia.
Definiciones.

Smbolo muerto (superfluo): es un smbolo no terminal que no genera ninguna cadena de


smbolos terminales.
Smbolo vivo: es un smbolo no terminal del cual se puede derivar una cadena de smbolos
terminales. Todos los smbolos terminales son smbolos vivos. Es decir son smbolos vivos
lo que no son muertos.

Smbolo inaccesible: es un smbolo no terminal al que no se puede llegar por medio de


producciones desde el smbolo inicial.
Smbolo accesible: es un smbolo que aparece en una cadena derivada del smbolo inicial.
Es decir, aquel smbolo que no es inaccesible.
Smbolo extrao: se denomina as a todo smbolo muerto o inaccesible.
Gramtica sucia: es toda gramtica que contiene smbolos extraos.
Gramtica limpia: es toda gramtica que no contiene smbolos extraos.

Toda gramtica en bruto ha de limpiarse con el objetivo de eliminar todos los smbolos extraos.

El mtodo de limpiar las gramticas sucias consiste en detectar en primer lugar todos los
smbolos muertos, y a continuacin se detectan todos los smbolos inaccesibles. Es
importante seguir este orden, puesto que la eliminacin de smbolos muertos puede
generar nuevos smbolos inaccesibles.

6.2 Arboles de derivacin.


Un rbol de derivacin (o rbol sintctico) es una representacin grfica de cmo se deriva una
forma sentencia a partir del smbolo no-terminal inicial.
Un rbol es un grafo dirigido a cclico en el cual cada nodo se conecta con un nodo distinguido,
llamado nodo raz mediante un nico camino. Un nodo n1 se dice descendiente de otro nodo n2 si
se puede llegar a n1 a partir de n1. El nodo raz no es descendiente de ningn nodo, y los nodos
que no tienen descendientes se denominan hojas. El resto de los nodos se denominan nodos
interiores.

Un rbol de derivacin tiene las siguientes propiedades:


1. El nodo raz est rotulado con el smbolo distinguido (inicial) de la gramtica.
2. Cada hoja corresponde a un smbolo terminal o un smbolo no-terminal.
3. Cada nodo interior corresponde a un smbolo no-terminal.
Un rbol de derivacin muestra grficamente las derivaciones (substituciones de smbolos no
terminales) que hay que llevar a cabo para llegar a una forma sentencia a partir del smbolo inicial.
Ejemplo:
Ejemplo: Sea la GIC

S AB
A aA | a
B bB | b
la cadena w = aabbb puede ser derivada

Un rbol de derivacin permite mostrar grficamente cmo se puede derivar cualquier cadena de
un lenguaje a partir del smbolo distinguido de una gramtica que genera ese lenguaje.

Un rbol es un conjunto de puntos, llamados nodos, unidos por lneas, llamadas arcos. Un
arco conecta dos nodos distintos. Para ser un rbol un conjunto de nodos y arcos debe
satisfacer ciertas propiedades:
Hay un nico nodo distinguido, llamado raz (se dibuja en la parte superior) que no tiene
arcos incidentes.
Todo nodo c excepto el nodo raz est conectado con un arco a otro nodo k, llamado el
padre de c (c es el hijo de k). El padre de un nodo, se dibuja por encima del nodo.
Todos los nodos estn conectados al nodo raz mediante un nico camino.

Los nodos que no tienen hijos se denominan hojas, el resto de los nodos se denominan
nodos interiores.

Propiedades de un rbol de derivacin.


Sea G = (N,T,S,P) una gramtica libre de contexto, sea una variable. Diremos que un rbol TA =
(N,E) etiquetado es un rbol de derivacin asociado a G si verifica las propiedades siguientes:

La raz del rbol es un smbolo no terminal


cada hoja corresponde a un smbolo terminal o .
cada nodo interior corresponde a un smbolo no terminal.

Para cada cadena del lenguaje generado por una gramtica es posible construir (al menos) un
rbol de derivacin, en el cual cada hoja tiene como rtulo uno de los smbolos de la cadena.

Para cada cadena del lenguaje generado por una gramtica es posible construir (al menos) un
rbol de derivacin, en el cual cada hoja tiene como rtulo uno de los smbolos de la cadena.
Si un nodo est etiquetado con una variable X y sus descendientes (ledos de izquierda a derecha)
en el rbol son X1,,Xk , entonces hay una produccin X X1Xk en G.
Sea G=(N,T,S,P) una GLC. Un rbol es un rbol de derivacin para G si:
1. Todo vrtice tiene una etiqueta tomada de
2. La etiqueta de la raz es el smbolo inicial S
3. Los vrtices interiores tienen etiquetas de N
4. Si un nodo n tiene etiqueta A y n1n2...nk respectivamente son hijos del vrtice n, ordenados de
izquierda a derecha, con etiquetas x1,x2..xk respectivamente, entonces: A x1x2...xk debe ser
una produccin en P
5. Si el vrtice n tiene etiqueta , entonces n es una hoja y es el nico hijo de su padre.
rbol de derivacin. Ejemplo
Sea G=(N,T,S,P) una GLC con P: S ab|aSb
La derivacin de la cadena aaabbb ser:

y el rbol de derivacin:

Relacin entre derivaciones y rboles


Si leemos las etiquetas de las hojas de izquierda a derecha tenemos una sentencia. Llamamos a
esta cadena la produccin del rbol de derivacin.
Teorema. Sea G=(N,T,S,P) una GLC. Entonces (de S se deriva ) si y slo si hay un rbol de
derivacin en la gramtica G con la produccin .
Si w es una cadena de L(G) para la gramtica libre de contexto G, entonces w tiene al menos un
rbol de derivacin. Referido a un rbol de derivacin particular, w tendr una nica derivacin a la
izquierda y otra nica a la derecha.
Ejemplo.

Derivacin a la izquierda:
Derivacin a la derecha:

6.3 Formas normales de Chomsky.


Toda gramtica libre de contexto es equivalente a una gramtica libre de contexto en Forma
Normal de Chomsky. Adems, esta equivalencia es algortmicamente computable. Una gramtica
se dice que est en la Forma Normal de Chomsky si sus reglas son de una de estas formas:
A BC
A a
Siendo A, B, C no terminales y a un terminal.

Teorema de la forma normal de Chomsky


Toda gramtica libre de contexto sin la cadena vaca tiene una gramtica
equivalente cuyas producciones estn en la Forma Normal de Chomsky.
Forma Normal de Chomsky (FNC)
Una gramtica se dice que est en la Forma Normal de Chomsky si sus reglas son
de una de estas formas:
A BC
Aa

Las gramticas formales, como por ejemplo que son las gramticas formales, notacin en forma de
Backus, la jerarqua de Chomsky, pasar una gramtica des formalizada a forma normal de
Chomsky, pasar de una gramtica des formalizada a forma normal de Greibach, etc.

Qu es una gramtica?

Una gramtica describe la estructura de las frases y de las palabras de un lenguaje y se aplica por
igual a:
Las lenguas naturales humanas
Lenguajes de programacin.
Una gramtica es un ente formal para especificar de manera finita el conjunto de cadenas de
smbolos que constituyen un lenguaje. Por ejemplo, la sintaxis de la lengua castellana puede
representarse mediante reglas que definen las partes de la oracin.
LA FORMA BNF
La notacin de Backus-Naur, tambin conocida por sus denominaciones inglesas Backus-Naur
form (BNF), Backus-Naur formalism o Backus normal form, es una meta sintaxis usada para
expresar gramticas libres de contexto: es decir, una manera formal de describir lenguajes
formales.
El BNF se utiliza extensamente como notacin para las gramticas de los lenguajes de
programacin de la computadora, de los sistemas de comando y de los protocolos de
comunicacin, as como una notacin para representar partes de las gramticas de la lengua
natural (por ejemplo, el metro en la poesa de Venpa). La mayora de los libros de textos para la
teora o la semntica del lenguaje de programacin documentan el lenguaje de programacin en
BNF.
Algunas variantes, tales como la Augmented Backus-Naur form (ABNF) y la Extended Backus
Naur Form (EBNF), tienen su propia documentacin.
Historia
La idea de transcribir la estructura del lenguaje con reglas de reescritura se remontan cuando
menos al trabajo del gramtico indio Panini (hacia el 460 a. C.), que la utiliz en su descripcin de
la estructura de palabras del idioma snscrito (algunos incluso han sugerido renombrar BNF a
Forma Panini-Backus). Lingstas estadounidenses como Leonard Bloomfield y Zellig Harris
llevaron esta idea un paso ms adelante al tratar de formalizar el lenguaje y su estudio en trminos
de definiciones formales y procedimientos (1920-1960).
Noam Chomsky, maestro de lingstica de alumnos de teora de la informacin del MIT, combin la
lingstica y las matemticas, tomando esencialmente el formalismo de Axel Thue como la base de

su descripcin de la sintaxis del lenguaje natural. Tambin introdujo una clara distincin entre
reglas generativas (de la gramtica libre de contexto) y reglas transformativas (1956).
John Backus, un diseanor de lenguajes de programacin de IBM, adopt las reglas generativas
de Chomsky para describir la sintaxis del nuevo lenguaje de programacin IAL, conocido en la
actualidad como ALGOL 58 (1959), presentando en el primer Congreso de Computacin Mundial
(World Computer Congress) el artculo "The syntax and semantics of the proposed international
algebraic language of the Zurich ACM-GAMM Conference".
Peter Naur, en su reporte sobre ALGOL 60 de 1963, identific la notacin de Backus como la
Forma Normal de Backus (Backus Normal Form), y la simplific para usar un conjunto de smbolos
menor, pero a sugerencia de Donald Knuth, su apellido fue agregado en reconocimiento a su
contribucin, reemplazando la palabra "Normal" por Naur, dado que no se trata de una forma
normal en ningn sentido, a diferencia, por ejemplo de la Forma Normal de Chomsky.

EN QUE CONSISTE ESTE METODO


Una especificacin de BNF es un sistema de reglas de derivacin, escrito como:
<Smbolo> ::= <expresin con smbolos>
Donde <smbolo> es un no terminal, y la expresin consiste en secuencias de smbolos o
secuencias separadas por la barra vertical, '|', indicando una opcin, el conjunto es una posible
substitucin para el smbolo a la izquierda. Los smbolos que nunca aparecen en un lado izquierdo
son terminales.
Ejemplo
Como ejemplo, considere este BNF para una direccin postal de los EE.UU.
<direccin postal> ::= <nombre> <direccin> <apartado postal>
<personal> ::= <primer nombre> | <inicial> "."

<nombre> ::= <personal> <apellido> [<trato>] <EOL>


| <personal> <nombre>
<direccin> ::= [<dpto>] <nmero de la casa> <nombre de la calle> <EOL>
<apartado postal> ::= <ciudad> "," <cdigo estado> <cdigo postal> <EOL>

Forma Normal de Chomsky

Sea

una gramtica con

smbolo no-terminal (o una variable). Podemos clasificar tales smbolos

un

en tres clases:

Variables accesibles:
Si existe una derivacin desde el smbolo inicial que contiene

donde

, es decir, existe

Variables generativas:
Si

existe

sentencia

una
,

derivacin desde el la variable que produce una

es

decir, existe

donde

Variables tiles:
Si existe una derivacin desde el smbolo inicial usando

, es decir, existe

que produce una sentencia

y.

donde

Una gramtica est en forma normal de Chomsky (FNC)

si

si todas las producciones de

(es decir, su

) solamente contiene variables tiles y

o bien de la forma

o bien de la forma

(es decir, en su

) son

con
con

si

(es decir, el smbolo

inicial de

de

ninguna

tambin est permitido que

produccin,

) no aparece al lado derecho

La tercera condicin es necesaria para poder derivar

. Si

aparece a la derecha, primero habr

que sustituir las producciones implicadas adecuadamente como lo vimos en la conversin de una
gramtica lineal por la derecha a una gramtica lineal por la izquierda.
Observamos:

la primera condicin garantiza que todas las variables son necesarias para derivar por lo
menos una sentencia.

la segunda condicin garantiza que un rbol de derivacin es un rbol binario.

Obviamente cualquier gramtica en forma normal de Chomsky es una gramtica libre de contexto
que se verifica directamente analizando la forma de producciones permitidas.
Pero tambin es vlido la otra direccin: para cualquier lenguaje libre de contexto existe una
gramtica en forma normal de Chomsky, que genera el mismo lenguaje.
La comprobacin de este hecho detallamos con la siguiente construccin donde a partir de una
gramtica libre de contexto dada, elaboramos una nueva gramtica en forma normal de Chomsky.

Su gramtica consiste en lo siguiente:


El principal paradigma de esta nueva gramtica consiste en partir de un conjunto de elementos
finitos (las palabras de una lengua), donde podemos crear otro conjunto de elementos infinitos (las
oraciones).
Adems segn muchos estudiosos, empleamos el lenguaje de una forma mucho ms parecida a
los planteamientos de la gramtica generativa que a los de la gramtica tradicional.
Esto nos lleva a la conclusin de que las lenguas cambian continuamente. Todos los procesos de
cambio, aprendizaje y evolucin son el principal campo del estudio de la gramtica generativa.

6.4 - Diagramas de Sintaxis


Un segundo mtodo para desplegar las producciones de ciertas gramticas de tipo 2 es el
diagrama de sintaxis. Permite ver al usuario como un movimiento a travs de diagramas.
Es una imagen de las producciones que permite al usuario ver las sustituciones en forma dinmica
es decir verlas como un movimiento a travs del diagrama. Son los diagramas de traduccin de
conjuntos de producciones tpicos.
Un enunciado BNF que tiene una nica produccin, <w >:: = <w1 ><w2><w3>
Produce como resultado al siguiente diagrama:

Los smbolos (palabra) que forman el lado derecho de la produccin son trazados en serie de
izquierda a derecha.
Las flechas indican la direccin la direccin en la que se debe hacer los
Bloque
movimientos para realizar una sustitucin, mientras que la etiqueta w indica lo que se est
sustituyendo en vez del smbolo w. Los rectngulos que encierran a w1, w2, w3, denotan el hecho
de que son smbolos no terminales. Si existen smbolos terminales, se los encierra en crculo o
elipse.

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

<w> ::= ab<w>.

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

6.5 - Eliminacin de la ambigedad.


Una gramtica ambigua permite ms de una derivacin para la misma forma sentencia por lo que
tambin habr ms de un [rbol de derivacin] para la misma. Por ello basta con encontrar dos
[rboles derivacin] distintos para la misma forma sentencia para demostrar que una gramtica es
ambigua.
A continuacin se presentan conceptos importantes dentro del estudio de las caractersticas de las
gramticas:
AMBIGEDAD:
Sea G = { N , T , P , S } una gramtica libre de contexto y sea L(G) el lenguaje generado por esa
gramtica.
Si existe un string w (donde w oe L(G) ) para el cual existen dos ms formas de realizar la
derivacin de ms a la izquierda (S w) existen dos ms formas de realizar la derivacin de
ms a la derecha (S w), entonces se dice que: G es una gramtica ambigua.

TIPOS DE AMBIGEDAD:
Dentro del estudio de gramticas existen dos tipos fundamentales de ambigedad, los cuales son:
Ambigedad Inherente: Las gramticas que presentan este tipo de ambigedad no pueden
utilizarse para lenguajes de programacin, ya que por ms transformaciones que se realicen sobre
ellas, NUNCA se podr eliminar completamente la ambigedad que presentan.
Ambigedad Transitoria: Este tipo de ambigedad puede llegar a ser eliminada realizando una
serie de transformaciones sobre la gramtica original. Una vez que se logra lo anterior, la
gramtica queda lista para ser reconocida por la mayor parte de los analizadores sintcticos. (Se le
considera "ambigedad" porque existen mtodos para realizar anlisis sintctico que no aceptan
gramticas con estas caractersticas)

Dnde se presenta la Ambigedad Transitoria:


Generalmente la ambigedad se presenta cuando existen producciones con factores comunes
(distintas alternativas para un smbolo no-terminal que inician de la misma forma); cuando existen
producciones que son recursivas izquierdas (producciones para un smbolo no-terminal en las
cuales el primer smbolo de su forma sentencia es ese mismo smbolo no-terminal).

Cmo solucionar el problema de la Ambigedad Transitoria?:


Para eliminar este tipo de ambigedad, es necesario, primero eliminar:
- Factores comunes izquierdos inmediatos y No-inmediatos.
- Recursividad izquierda inmediata y No-inmediata.

Eliminacin de Factores Comunes Izquierdos


FACTORIZACION DE TERMINOS COMUNES IZQUIERDOS INMEDIATOS.
Existen gramticas que tiene producciones de la forma A 1 | 2 como por ejemplo:
SiEtSeS|iEtS
Donde es el trmino comn en las producciones de A. Sin embargo para poder llevar a cabo el
anlisis sintctico de las mismas mediante algunas tcnicas se debe eliminar los trminos comunes
izquierdos llevando a cabo el proceso de factorizacin siguiente:

Las producciones A 1| 2 se transforman en las siguientes


A A
A | 2

Las cuales nos generan el mismo lenguaje. Existe un nuevo smbolo no terminal A en la
gramtica, el cual no altera la gramtica del lenguaje.
Generalizando el procedimiento para n producciones de A que tienen factor comn izquierdo:

1. Agrupar todas las producciones de A, sin importar cuantas sean.


A 1 | 2 | ... | n |
*donde representa otras producciones de A que no tienen factor comn izquierdo.
2. Remplazar las producciones de A a un conjunto equivalente mediante la siguiente
transformacin

A A |
A 1 | 2 | ... | n

ELIMINACION DE RECURSIVIDAD IZQUIERDA INMEDIATA.

Una gramtica tiene recursividad izquierda si tiene un no terminal A tal que existe una derivacin A
A para algn string . Algunas tcnicas de anlisis sintctico no pueden manejar gramticas
con recursividad izquierda por ello se debe eliminar primero.

Pasos para eliminar la recursividad izquierda inmediata.

1. Agrupar todas las producciones de A, sin importar cuantas sean.


A A 1 | A 2 | ... | A m | 1 | 2 | ... | n
Donde i no inicia con A.

2. Reemplazar las producciones de A a un conjunto equivalente mediante la siguiente


transformacin.
A 1 A | 2 A | ... | n A
A 1 A | 2 A | ... | m A |

En el caso de obtener producciones con recursividad izquierda al momento de realizar este


segundo paso, se debe repetir el procedimiento.

ELIMINACION DE LA AMBIGEDAD TRANSITORIA NO-INMEDIATA:

Este tipo de ambigedad se presenta cuando, despus de realizar un conjunto de sustituciones se


generan factores comunes recursividad izquierda. Para poder eliminarla, ee deben sustituir todas
las alternativas de los smbolos No-terminales involucrados para convertir esa ambigedad Noinmediata en inmediata, para posteriormente aplicar las reglas expuestas anteriormente.

Eliminacin de Recursividad Izquierda


La recursividad consiste en realizar una definicin de un concepto en trminos del propio concepto
que se est definiendo.

Ejemplos:
Los nmeros naturales se pueden definir de la siguiente forma:
0 es un Nmero natural y el sucesor de un nmero natural es tambin un nmero natural.
La factorial de un nmero natural n, es 1 si dicho nmero es 0, o n multiplicado por el factorial del
nmero n-1, en caso contrario.
La n-sima potencia de un nmero x, es 1 si n es igual a 0, o el producto de x por la potencia (n-1)sima de x, cuando n es mayor que 0.

En todos estos ejemplos se utiliza el concepto definido en la propia definicin.


Solucin de problemas recursivos:
Divisin sucesiva del problema original en uno o varios ms pequeos, del mismo tipo que el
inicial.
Se van resolviendo estos problemas ms sencillos.
Con las soluciones de stos se construyen las soluciones de los problemas ms complejos.

6.6 Generacin de matriz predictiva


Se facilita la construccin de una analizador sintctico predictivo con 2 funciones asociadas a una
gramtica (G).
Estas funciones P y S permiten rellenar siempre que sean posible las entradas de una tabla de
anlisis sintctico predictivo para una gramtica.
Tambin se puede utilizar los conjuntos de componentes lxicos devueltos por la funcin S como
componentes lxicos de sincronizacin durante la recuperacin de errores.
Si es una cadena de smbolos gramaticales se considera primeros de como el conjunto de
terminales que inician las cadenas derivadas de .
Si entonces el vaco tambin est en primeros de .
Se define siguientes de A para el no terminal de A, como el conjunto de terminales de A que
pueden aparecer inmediatamente a la derecha de A en alguna forma de frase, es decir, el conjunto
de terminales de A tal que haya una derivacin de la forma S Aa para algn y .
Primeros.
Primero () es el conjunto de smbolos terminales que inician cualquier derivacin de .

Clculo:
a)

Si X es un smbolo terminal, entonces primeros () = X

b)

Si X es un smbolo no terminal, entonces para cada produccin del tipo

x 1, 2........ n
1)

Incluir primeros de (i) el primeros de (X)

2)

De i=1 hasta n-1

Si est incluido en primeros de (i) incluir en primeros de (i+1).


3) Tomando como base el punto anterior, si vaco est incluido en primeros de (i) hasta
primeros de (n) incluir vacio en primeros de (X).
Ejemplo:
<S> <E> a
<E> op
<E>
P<S> = {P<E>} = {op, }
P<E> = {op, }

Siguientes.
X YZ
1)

Si X es la primera produccin de la gramtica se incluye $ en siguientes de X.

2)

Los siguientes de Y son:

a)

Si Z es un terminal se incluyen los primeros (Z) en siguientes (Y) a excepcin del vaco.

b)

Si Z es un no terminal se incluyen los primeros (Z) en siguientes de Y a excepcin del vaco.

3) Los siguientes de Z son, si Z es el ltimo trmino de la produccin, se incluyen los siguientes


de esa produccin en siguientes de Z.

No se incluye el vaco en vez de esto se incluyen los siguientes de la produccin que genera el
vaco.
Ejemplo:
1) <E> <T> <E>
2) <E> + <T> <E>
3) <E>
4) <T> <F> <T>
5) <T> * <F> <T>
6) <T>
7) <F> id
8) <F> (<E>)

Primeros.
P(<E>) = {P(<T>)} = {id, ( }
P(<E>) = {+, }
P(<T>) = {P(<F>)} = {id, ( }
P(<T>) = { *, }
P(<F>) = {id, ( }
Siguientes.

S(< E>) = { $, )}
S(<E>) = {S(<E>), S(<E>) } = { $, ) }
S(<T>) = {P(<E>)} = { +, S(<E>)} = { +, $, ) }
S(<T>) = {S(<T>), S(<T>)} = { +, $, ) }
S(<F>) = {P(<T>)} = { *, S(<T>) } = { *, +, $, ) }
Construccin de la matriz predictiva.
1. Para cada produccin A realizar lo siguiente:
a) Para cada smbolo terminal en primero de () agregar A en M[A, ]
b) Si est contenido en primero (), entonces para cada smbolo terminal en sig (A),
agregar M en [A,$]
2. Cada espacio de la matriz indefinido hace error.
A continuacin se muestra un ejemplo de cmo construir la matriz predictiva, se utiliz la gramtica
anterior para obtener los first y los follows.

6.7 - Tipos de analizadores sintcticos.


Tipos de Analizadores Sintcticos
Ascendentes. Construyen rboles sintcticos a partir de las hojas y suben a la raz
Descendentes. Construyen rboles sintcticos de la raz a las hojas
En ambos casos se examina la entrada al A.S. de izquierda a derecha, un smbolo a la vez

Manejo de errores sintcticos


A menudo, gran parte de la deteccin y recuperacin de errores en un compilador se centra en la
fase de anlisis sintctico
Razones
La cadena de componentes lxicos no obedece las reglas gramaticales que definen al L.P.
Precisin en los mtodos modernos de A.S.
El manejador de errores en un A.S. tiene objetivos fciles de establecer:
Debe informar de la presencia de errores con claridad y exactitud
Se debe recuperar de cada error con la suficiente rapidez como para detectar errores posteriores
No debe retrasar de manera significativa el procesamiento de programas correctos
El manejador de errores debe informar de la presencia de un error, indicando el lugar preciso en el
programa, y si sabe cul es el error, se incluye un mensaje.
Opciones para implementar un parser
1.a mano
2.Utilizando un generador de analizadores sintcticos, por ejemplo YACC

Notacin EBNF
Extended Backus-Naur Form. Objetivo, reducir el nmero de producciones en las gramticas.
Notaciones adicionales.
1.Alternativas de una regla. Se utiliza el smbolo | para separar las distintas posibilidades que
definen al no terminal de la izquierda.
Ejemplo: Si Sa y SaSb entonces se escribe como Sa | aSb
2. Llaves {}. Lo que aparece dentro de ellos se repite de cero a n veces.
Ejemplo: Linea_decTipo iden { , iden} ;
3. Llaves con repeticin especificada: { }yx . Lo que aparece dentro de ellas se repite un nmero de
veces comprendido entre x e y.
Ejemplo: idenletra {digito | letra}70
4. Corchetes:[]. Es un caso particular de 3 ({}10). Lo que est dentro puede o no aparecer.
Ejemplo: prop_ifif condicion then bloque [else bloque]

Generadores de analizadores sintcticos.


Hemos visto cmo el anlisis lxico facilita la tarea de reconocer los elementos de un lenguaje uno
a uno. A partir de ahora, vamos a centrarnos en el anlisis sintctico, que nos permitir averiguar si
un fichero de entrada cualquiera respeta las reglas de una gramtica concreta. Para el tema del
anlisis sintctico vamos a utilizar la herramienta
Para el diseo del parser, nos hemos basado en una gramtica que abarca todos los aspectos
requeridos en esta parte del proyecto. Despus de las discusiones en el foro de la asignatura y del
intercambio de impresiones constante en el aula concluimos que esta, era la gramtica que mejor
resultado nos dara.

yacc (Yet Another Compiler Compiler).


1. Funcionamiento de yacc
Igual que suceda con lex, yacc no es directamente un analizador sino un generador de
analizadores. A partir de un fichero fuente en yacc, se genera un fichero fuente en C que contiene
el analizador sintctico. Sin embargo, un analizador sintctico de yacc no puede funcionar por s
solo, sino que necesita un analizador lxico externo para funcionar. Dicho de otra manera, el fuente
en C que genera yacc contiene llamadas a una funcin yylex() que debe estar definida y debe
devolver el tipo de lexema encontrado. Adems, es necesario incorporar tambin una funcin y
yerror(), que ser invocada cuando el analizador sintctico encuentre un smbolo que no encaja en
la gramtica.

Un generador de analizadores es un programa que acepta como entrada la especificacin de las


caractersticas de un lenguaje L y produce como salida un analizador para L. La especificacin de
entrada puede referirse a la lexicografa, la sintaxis o la semntica; el analizador resultante servir
para analizar las caractersticas especificadas.

Generador
A
E Especificacin de las caractersticas del lenguaje L
A Analizador para L
Los generadores Lex y Yacc sirven, respectivamente, para generar analizadores lexicogrficos y
analizadores sintcticos para su aprovechamiento como partes de los compiladores de los
lenguajes de programacin; estos usos de Lex y Yacc no son los nicos, aunque s son los que
aqu se consideran principalmente. Para entender cabalmente el funcionamiento de los
generadores de analizadores, hay que conocer la teora de compiladores relacionada con las
tareas de anlisis de lenguajes.Cuando se emplea el trmino Lex, se mencionan dos posibles
significados:

a) una notacin para especificar las caractersticas lexicogrficas de un lenguaje de


programacin,
b) un traductor de especificaciones lexicogrficas.
Esta misma dualidad tambin es de aplicacin al trmino Yacc.

Esquema de uso
El esquema de la pgina siguiente ilustra la manera de usar los generadores Lex y Yacc para obtener un analizador lxico-sintctico de un lenguaje de programacin L, y de ejecutar el analizador
obtenido. Los nombres que aparecen en el esquema significan:
eLexic.l
es la especificacin de las caractersticas lexicogrficas del lenguaje L, escrita en Lex
eSint.y
es la especificacin de las caractersticas sintcticas del lenguaje L, escrita en Yacc
lex.yy.c
es el analizador lexicogrfico de L generado por Lex; est constituido, en su parte principal, por
una funcin escrita en C que realiza las tareas de anlisis lexicogrfico basndose en
autmatas regulares reconocedores de la forma de las piezas sintcticas de L
libl
es una librera asociada a Lex que contiene estructuras de datos y funciones a las que se puede
hacer referencia desde el cdigo generado
liby
es una librera asociada a Yacc con la misma utilidad que la anterior
y.tab.c
es el analizador sintctico generado por Yacc; est constituido, en su parte principal, por una
funcin escrita en C que realiza las tareas de anlisis sintctico segn el mtodo ascendente
LALR(1), basado en tablas

anLeSi: es el analizador generado; analiza las caractersticas lexicogrficas y sintcticas


especificadas del lenguaje L; acepta como entrada un programa escrito en L y comprueba si
est
codificado
Segn
las
especificaciones
dadas
P
programa escrito en el lenguaje L.

No es preciso que los nombres de los ficheros de entrada para Lex y Yacc tengan una
extensin determinada; los nombres de los ficheros generados por Lex y Yacc son siempre los

libl

eLexic.l

liby

lex.yy.c

lex
Compilador
Montador

de
C
yacc
eSint.y

y.tab.c

anLeSi

Resultado
del anlisis

indicados, con independencia de cul sea el nombre de los ficheros de entrada.

Вам также может понравиться