Académique Documents
Professionnel Documents
Culture Documents
LENGUAJES Y AUTMATAS I
Unidad 1. Introduccin a la Teora de los Lenguajes Formales
1 FUNDAMENTOS
1.1 Alfabeto
Se denomina alfabeto a un grupo de letras estructurado bajo un orden especfico aceptado a
nivel general en el marco de una lengua. Se trata de un conjunto compuesto por los smbolos
destinados a la representacin del lenguaje.
Un alfabeto es un conjunto finito no vaco de smbolos y se denota como
La pertenencia de un smbolo
a un alfabeto
se denota como
.
.
Ejemplo:
Se puede representar el alfabeto de las letras minsculas que utiliza el idioma espaol, el cual
contiene los 27 smbolos siguientes:
resulta en un
1.2 Cadenas
Una cadena o palabra es una secuencia finita de smbolos que pertenecen a un alfabeto y
comnmente se denota con la letra .
La cadena vaca se denota como y es una secuencia vaca de smbolos tomados
de cualquier alfabeto .
S el alfabeto es el espaol, algunas cadenas pueden ser: yomero, tumero y malnacido.
Dada la definicin anterior, cualquier palabra que contenga los smbolos del alfabeto es una
cadena vlida, sin importar si esta tiene o no significado alguno.
Si
es cualquier cadena, su longitud se denota como
, la longitud de una cadena es el
nmero de smbolos que contiene, por ejemplo, si se tiene la cadena
sobre el
alfabeto espaol entonces
. La cadena vaca
1.3 Lenguajes
1
cualquier cadena
donde
.
El lenguaje vaco es aquel que no contiene cadenas y no es lo mismo que el lenguaje
formado por la cadena vaca
vaco:
.
S se tiene una cadena
sobre un alfabeto
, entonces
Para llevar esto a cabo, la etapa de anlisis consta de las siguientes fases:
Anlisis lexicogrfico. Divide el programa fuente en los componentes bsicos del
lenguaje a compilar. Cada componente bsico es una sub-secuencia de caracteres del
programa fuente, y pertenece a una categora gramatical: nmeros, identificadores de
usuario (variables, constantes, tipos, nombres de procedimientos), palabras reservadas,
signos de puntuacin.
Anlisis sintctico. Comprueba que la estructura de los componentes bsicos sea
correcta segn las reglas gramaticales del lenguaje que se compila.
Anlisis semntico. Comprueba que el programa fuente respeta las directrices del
lenguaje que se compila (todo lo relacionado con el significado): chequeo de tipos,
rangos de valores, existencia de variables, etc.
Cualquiera de estas tres fases puede emitir mensajes de error derivados de fallos
cometidos por el programador en la redaccin de los textos fuente. Mientras ms errores
controle un compilador, menos problemas dar un programa en tiempo de ejecucin. Por
ejemplo, el lenguaje C no controla los lmites de un arreglo, lo que provoca que en tiempo de
ejecucin puedan producirse comportamientos del programa de difcil explicacin.
La etapa de sntesis construye el programa objeto deseado (equivalente
semnticamente al fuente) a partir de las estructuras generadas por la etapa de anlisis. Para
ello se compone de tres fases fundamentales:
.obj
.obj
Enlazador
.exe
.lib
Fig. 1,4 Mecanismo del Enlazador
Fig. 1.5 Esquema de Carga. El cargador suele ser parte del Sistema Operativo
Pasadas de compilacin
Es el nmero de veces que un compilador debe leer el programa fuente para generar el cdigo.
Hay algunas situaciones en las que, para realizar la compilacin, no es suficiente con leer el
fichero fuente una sola vez. Por ejemplo, en situaciones en las que existe recursin indirecta
(una funcin A llama a otra B y la B llama a la A).
Cuando se lee el cuerpo de A, no se sabe si B est declarada ms adelante o se le ha
olvidado al programador; o si lo est, si los parmetros reales coinciden en nmero y tipo con
los formales o no. Es ms, aunque todo estuviera correcto, an no se ha generado el cdigo
para B, luego no es posible generar el cdigo mquina correspondiente a la invocacin de B
puesto que no se sabe su direccin de comienzo en el segmento de cdigo. Por todo esto, en
una pasada posterior hay que controlar los errores y rellenar los datos que faltan.
Diferentes compiladores y lenguajes solucionan este problema de maneras distintas.
Una solucin consiste en hacer dos o ms pasadas de compilacin, pero ello consume
demasiado tiempo puesto que las operaciones de e/s son, hoy por hoy, uno de los puntos
fundamentales en la falta de eficiencia de los programas (incluidos los compiladores). Otra
solucin pasa por hacer una sola pasada de compilacin y modificar el lenguaje obligando a
hacer las declaraciones de funciones recursivas indirectas antes de su definicin. De esta
manera, lenguajes como Pascal o Modula-2 utilizan la palabra reservada FORWARD para ello:
FORWARD precede la declaracin de B, a continuacin se define A y por ltimo se define B.
Lenguajes como C tambin permiten el no tener que declarar una funcin si sta carece de
parmetros y devuelve un entero.
Otros lenguajes dan por implcito el FORWARD, y si an no se han encontrado aquello
a que se hace referencia, continan, esperando que el linker resuelva el problema, o emita el
mensaje de error.
Actualmente, cuando un lenguaje necesita hacer varias pasadas de compilacin, suele
colocar en memoria una representacin abstracta del fichero fuente, de manera que las
pasadas de compilacin se realizan sobre dicha representacin en lugar de sobre el fichero de
entrada, lo que soluciona el problema de la ineficiencia debido a operaciones de e/s.
Compilacin incremental
7
Autocompilador
Es un compilador escrito en el mismo lenguaje que compila (o parecido). Normalmente, cuando
se extiende entre muchas mquinas diferentes el uso de un compilador, y ste se desea
mejorar, el nuevo compilador se escribe utilizando el lenguaje del antiguo, de manera que
pueda ser compilado por todas esas mquinas diferentes, y d como resultado un compilador
ms potente de ese mismo lenguaje.
Metacompilador
Este es uno de los conceptos ms importantes con los que actualmente se trabaja. Un
metacompilador es un compilador de compiladores. Se trata de un programa que acepta como
entrada la descripcin de un lenguaje y produce el compilador de dicho lenguaje. Hoy por hoy
no existen metacompiladores completos, pero s parciales en los que se acepta como entrada
una gramtica de un lenguaje y se genera un autmata que reconoce cualquier sentencia del
lenguaje . A este autmata es posible aadirle cdigo para completar el resto del compilador.
Ejemplos de metacompiladores son: Lex, YACC, FLex, Bison, JavaCC, JLex, Cup, PCCTS,
MEDISE.
Los metacompiladores se suelen dividir entre los que pueden trabajar con gramticas
de contexto libre y los que trabajan con gramticas regulares. Los primeros se dedican a
reconocer la sintaxis del lenguaje y los segundos trocean los ficheros fuente y lo dividen en
palabras.
8
Descompilador
Un descompilador realiza una labor de traduccin inversa, esto es, pasa de un cdigo mquina
(programa de salida) al equivalente escrito en el lenguaje que lo gener (programa fuente).
Cada descompilador trabaja con un lenguaje de alto nivel concreto.
La descompilacin suele ser una labor casi imposible, porque al cdigo mquina
generado casi siempre se le aplica una optimizacin en una fase posterior, de manera que un
mismo cdigo mquina ha podido ser generado a partir de varios cdigos fuente. Por esto, slo
existen descompiladores de aquellos lenguajes en los que existe una relacin biyectiva entre el
cdigo destino y el cdigo fuente, como sucede con los desensambladores, en los que a cada
instruccin mquina le corresponde una y slo una instruccin ensamblador.
Los descompiladores se utilizan especialmente cuando el cdigo mquina ha sido
generado con opciones de depuracin, y contiene informacin adicional de ayuda al
descubrimiento de errores (puntos de ruptura, seguimiento de trazas, opciones de visualizacin
de variables).
Tambin se emplean cuando el compilador no genera cdigo mquina puro, sino
pseudocdigo para ser ejecutado a travs de un pseudo-intrprete. En estos casos suele existir
una relacin biyectiva entre las instrucciones del pseudocdigo y las construcciones sintcticas
del lenguaje fuente, lo que permite reconstruir un programa de alto nivel a partir del de un
bloque de pseudocdigo.
10