Академический Документы
Профессиональный Документы
Культура Документы
DE CANCN
"No nos atrevemos a muchas cosas porque son difciles, pero son difciles porque no nos atrevemos a hacerlas."
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
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:
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.
UNIDAD 2
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.
- Externos:
.
()
Operacin alternativa
Operacin estrella
Operacin opcionalidad
{}
Operacin repeticin limitada: cuando la secuencia entre llaves empieza por un dgito;
los caracteres que estn entre las llaves forman parte del operador
{}
[]
\
""
/
<>
- Internos:
^
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)
abcabc,
abcabcabc,
etc
*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="@"
2.3-Aplicacin en problemas.
Ejemplificando ER con Buscadores.
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
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.
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).
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 .
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
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}
(S,)
sacar U de la pila
hacer
si U e-clausura(T)
aadir V a e-clausura(T)
colocar V en la pila
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.
'(T,a) = U
4. F' son todos los estados T de S' que contengan algn estado de F, o sea, TF=0
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}
{ }
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:
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, )
S0
S1
S0
S1
S2
S1
S2
S1
S2
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, )
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.
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.
0
0
start
B
0
A
1
C
1
0
1
F
0
G2 = { C,E }
son 0-indistinguibles
G1
G2
G1
G1
G1
G2
G1
G2
G1
G2
G1
G2
1: G1 = { A } G2 = { B,D }
G3 = { C,E }
2: G1 = { A } G2 = { B,D }
G3 = { C,E }
2 = 1 = final
0
start
0,1
1
0
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.
Ejemplo:
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:
b) Para r1 = 01*
c) Para r=01* +1
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.
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
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
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.
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.
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.
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.
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.
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:
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)
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.
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.
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,
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.
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
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.
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.
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.
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.
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.
obvia los siguientes caracteres de la entrada hasta encontrar un token bien formado.
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.
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:
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>
UNIDAD 6
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
1.
2.
3.
4.
Producciones:
La gramtica es correcta siempre y cuando el smbolo inicial este al lado izquierdo de las
producciones y sea la raz del rbol.
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.
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.
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:
Derivacin a la izquierda:
Derivacin a la derecha:
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.
Sea
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
,
es
decir, existe
donde
Variables tiles:
Si existe una derivacin desde el smbolo inicial usando
, es decir, existe
y.
donde
si
(es decir, su
o bien de la forma
o bien de la forma
(es decir, en su
) son
con
con
si
inicial de
de
ninguna
produccin,
. Si
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.
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.
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.
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)
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:
A A |
A 1 | 2 | ... | n
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.
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.
Clculo:
a)
b)
x 1, 2........ n
1)
2)
Siguientes.
X YZ
1)
2)
a)
Si Z es un terminal se incluyen los primeros (Z) en siguientes (Y) a excepcin del vaco.
b)
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.
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]
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:
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
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