Documentos de Académico
Documentos de Profesional
Documentos de Cultura
A futuro:
La estructura de un Compilador
Divide el programa fuente en componentes e impone una estructura gramatical sobre ellas.
Despus crea una representacin intermedia del programa fuente. Si la parte del anlisis
detecta que el programa fuente est mal formado en cuanto a la sintaxis, debe proporcionar
mensajes informativos para que el usuario pueda corregirlo. La parte del anlisis tambin
recolecta informacin sobre el programa fuente y la almacena en una estructura de datos
llamada tabla de smbolos, la cual se pasa junto con la representacin intermedia a la parte de
la sntesis.
El analizador de lxico lee el flujo de caracteres que componen el programa fuente y los agrupa
en secuencias significativas, conocidas como lexemas. Para cada lexema, el analizador lxico
produce como salida un token de la forma: (nombre-token, valor-atributo).
Anlisis sintctico
La segunda fase del compilador es el anlisis sintctico o parsing. El parser utiliza los primeros
componentes de los tokens producidos por el analizador de lxico para crear una
representacin intermedia en forma de rbol que describa la estructura gramatical del flujo de
tokens. Una representacin tpica es el rbol sintctico, en el cual cada nodo interior
representa una operacin y los hijos del nodo representan los argumentos de la operacin.
Reglas Recursivas
Las gramticas libres de contexto (GLC) son una formalizacin de reglas recursivas que pueden
guiar el anlisis sintctico.
Anlisis semntico
Despus del anlisis sintctico y semntico del programa fuente, muchos compiladores
generan una representacin intermedia similar al cdigo mquina, que podemos considerar
como un programa para una mquina abstracta. Esta representacin intermedia debe tener
dos propiedades importantes: debe ser fcil de producir y fcil de traducir en la mquina
destino.
Cdigo Intermedio de 3 Direcciones
Optimizacin de cdigo
Trata de mejorar el cdigo intermedio, de manera que se produzca un mejor cdigo destino.
Por lo general, mejor significa ms rpido, pero pueden lograrse otros objetivos, como un
cdigo ms corto, o un cdigo de destino que consuma menos recursos.
Generacin de cdigo
El generador de cdigo recibe como entrada una representacin intermedia del programa
fuente y la asigna al lenguaje destino. Si el lenguaje destino es cdigo mquina, se seleccionan
registros o ubicaciones de memoria para cada una de las variables que utiliza el programa.
Despus, las instrucciones intermedias se traducen en secuencias de instrucciones de mquina
que realizan la misma tarea. Un aspecto decisivo es la asignacin de variables a registros.
La tabla de smbolos es una estructura de datos que contiene un registro para cada nombre de
variable, con campos para los atributos del nombre. Permite encontrar rpidamente cada ID y
almacenar o consultar datos de ese registro.
En una implementacin, las actividades de varias fases pueden agruparse en una pasada, la
cual lee un archivo de entrada y escribe en un archivo de salida. Por ejemplo, las fases
correspondientes al front-end del anlisis lxico, anlisis sintctico, anlisis semntico y
generacin de cdigo intermedio podran agruparse en una sola pasada.
Compile- link- go: se compilan segmentos por separado y luego se montan todos los
objetos producidos en un mdulo cargable listo.
Compilador de varias pasadas: no es ms lento. Ocupa poca memoria. Fcil de
mantener
Compilador incremental (o interactivo): se pueden compilar solo las modificaciones
Autocompilador: Comp. escrito en el propio leng. que traduce.
Metacompilador : Programa al que se le especifica el lenguaje para el que se quiere un
comp. y produce el comp. como resultado
Decompilador: traduce de cdigo mquina a leng. de alto nivel
Cada fase puede encontrar errores y debe tratarlo para continuar con la Compilacin,
permitiendo detectar ms errores
Las fases de Analisis Sintctico y Semntico manejan la mayora de los errores
En el Anilsis Semntico se detectan errores donde la estructura sintctica es correcta
pero no tiene significado la operacin
Forma de Organizacin
Notaciones y Herramientas
Definicin de la Sintaxis
Una GLC describe de forma natural la estructura jerrquica de muchas construcciones de los
lenguajes de prog.
Indica grficamente cmo del smbolo inicial de una gramtica deriva una cadena de lenguaje.
A -> XYZ
Ambigedad
Una Gramtica puede tener ms de un rbol de AS que genere una cadena dada de
componentes lxicos. Esta clase de Gramtica se dice que es ambigua.
La exponenciacin
El operador de asignacin = en C.
Precedencia de Operadores
Se dice que * tiene mayor precedencia que + si * considera sus operandos antes de que lo
haga +. La multiplicacin y divisin tienen mayor precedencia que la adicin y sustraccin.
(9-5)+2 = 95-2+
9-(5+2) = 952+-
Utiliza una GLC para especificar la estructura sintctica de la entrada. A cada smbolo de la
Gramtica le asocia un conjunto de atributos y a cada produccin un conjunto de reglas
semnticas para calcular los valores de los atributos asociados con los smbolos que aparecen
en esa produccin.
Atributo sintetizados: su valor en un nodo del rbol de AS se determina a partir de los valores
de los atributos de los hijos del nodo. Se pueden calcular durante un solo recorrido ascendente
del rbol de AS.
A cada no terminal est asociado un atributo t con un valor de la cadena que representa la NP
de la expresin generada por ese no terminal en un rbol de AS.
Recorridos en profundidad
Una definicin dirigida por la sintaxis no impone ningn orden especfico a la evaluacin de
atributos en un rbol de AS
Este recorrido empieza en la raz y visita recursivamente a los hijos de cada nodo en orden de
izquierda a derecha.
Se llama en profundidad porque siempre que pueda, visita a un hijo no visitado de un nodo,
de modo que intenta visitar los nodos ms alejados de la raz lo antes posible
Esquemas de Traduccin
El esquema de traduccin es una GLC en la que se han insertado fragmentos de cdigo en los
lados derechos de las producciones. Dichos fragmentos actan, calculan y modifican los
atributos asociados con los nodos del rbol sintctico.
Anlisis Sintctico
Proceso para determinar si una cadena de componentes lxicos puede ser generada por una
gramtica. Es til construir un rbol de AS, aunque un compilador no lo muestra. Un
Analizador Sintctico debe poder construir un rbol para garantizar que la traduccin sea
correcta.
Ascendente: puede manejar una clase mayor de gramticas y esquemas de traduccin. Las
herramientas de software utilizan este mtodo.
ANLISIS LXICO
Leer los caracteres de entrada y elaborar como salida una secuencia de componentes lxicos
(tokens) que utiliza el Analizador Sintctico para hacer el anlisis. Esta interaccin, suele
aplicarse convirtiendo al AL en una subrutina del Analizador Sintctico.
Otras funciones
Un Patrn es una regla que describe el conjunto de lexemas que pueden representar a un
determinado componente lxico en un programa fuente.
Errores Lxicos
Son pocos los errores que puede detectar el AL por la visin restringida del programa
fuente.
El AL debe devolver el comp. Lxico de un identificador y dejar que otra fase se ocupe
de los errores.
Cuando ninguno de los patrones concuerda con el prefijo de la entrada restante, el AL
puede seguir una estrategia de recuperacin
Ejemplos: borrar un carcter extrao, insertar un carcter que falta, reemplazar uno incorrecto
por otro correcto, intercambiar dos caracteres adyacentes).
El AL es la fase que lee char por char. El PF consume mucho tiempo, aunque las otras fases
sean ms complejas. La velocidad de un AL supone un problema en el diseo de compiladores.
Pareja de Buffers
Se utiliza un buffer dividido en dos mitades de N caracteres cada una (por lo general N
es el nmero de caracteres en un bloque de disco, por ejemplo, 1024 4096).
Se leen N caracteres de entrada en cada mitad del buffer con una orden de lectura, en
vez de invocar una instruccin de lectura para cada carcter de entrada.
Si quedan menos de N caracteres en la entrada, entonces se lee un carcter especial
eof, que marca el final del archivo fuente.
Autmatas
Modelos matemticos de los dispositivos que aceptan una entrada y producen una salida
apropiada.
La caracterstica de un autmata es que la entrada pasa por varios estados para producir la
salida, por lo que se puede establecer una correspondencia entre el problema de
reconocimiento (AL) y un autmata.
Una cinta de entrada: contiene una tira de smbolos del alfabeto, cada uno en una
celda y se lee de izquierda a derecha.
Una memoria: contiene una funcin de bsqueda y de direccionamiento
Un control de estados: que determina el comportamiento del mecanismo y debe ser
finito
Configuracin: Conjunto de elementos que definen la situacin del autmata en un
instante determinado.
Tipos de Autmatas
Consta de una memoria con un conjunto finito de estados internos (P), entre los cuales hay un
estado inicial (ei) y un conjunto designado (F) de estados finales.
Un autmata finito se dice determinstico si, para cada estado y carcter de entrada, tiene un
solo estado de transicin al cual puede cambiar.
Definicin de FDA
A = (P, S, M, ei, F) :
P: conjunto de estados
S: alfabeto
M: funcin de transicin de estados (M: PxS ---> P)
ei: estado inicial
F: conjunto de estados finales
El AS obtiene una cadena de componentes lxicos del AL y comprueba si la cadena puede ser
generada por la gramtica del lenguaje fuente.
Tambin debe informar sobre cualquier error y poder recuperarse de los errores ms
frecuentes y continuar procesando el resto de la entrada.
Mtodo Universal
El algoritmo de CYK determina si una cadena puede ser generada por una gramtica libre de
contexto y, si es posible, cmo puede ser generada.
Varios mtodos detectan el error lo antes posible nada ms con ver un prefijo de la entrada
que no es prefijo de ninguna cadena del lenguaje.
Recuperacin del Analizador Sintctico
Una recuperacin inadecuada puede producir muchos errores extraos, introducidos por el AS
durante la recuperacin del error
Hay varias estrategias para recuperacin de errores sintcticos pero ninguna de carcter
universal.
Diferentes Mtodos
Sencillo de implantar
Al descubrir un error, el AS desecha smbolos de entrada, de uno en uno, hasta que
encuentra uno perteneciente a un conjunto designado de componentes lxicos.
Adecuado para casos en donde son raros los errores mltiples en una misma
proposicin.
A nivel de fase
Al descubrir error, el AS puede realizar una correccin local de la entrada restante, es decir
sustituir un prefijo de la entrada restante por alguna cadena que permita continuar. Poco til
cuando el error es anterior al punto de deteccin.
Producciones de error
Si se conocen los errores comunes, se puede aumentar la gramtica del lenguaje con
producciones que generen las construcciones errneas.
Con la gramtica aumentada se construye el AS.
Se pueden generar diagnsticos de error apropiados para el error reconocido en la
entrada.
Correccin global
Derivaciones
Las hojas del rbol S, ledas de izquierda a derecha, constituyen una forma de frase izquierda.
Las derivaciones derechas se denominan cannicas
Ambigedad
Una gramtica ambigua es la que produce ms de una derivacin por la izquierda o por la
derecha para la misma frase.
Las GLC pueden describir la mayora, pero no todas las sintaxis de los lenguajes de
programacin. Un Anlisis lxico efecta una cantidad limitada de AS pues produce la
secuencia de componentes lxicos, a partir de los caracteres de entrada.
Ciertas limitaciones de la entrada (como que los id se declaren antes de ser utilizados) no
pueden describirse mediante una GLC
Las fases posteriores deben analizar la salida del AS para garantizar el cumplimiento de reglas
que el AS no comprueba.
Cada mtodo de AS puede manejar solo gramticas de una cierta forma, por lo que puede ser
necesario reescribirlas.
Supresin de la Ambigedad
Es ambigua, pues en la cadena: if e1 then if e2 then s1 else s2, el else puede corresponder a
cualquiera de los dos if
Una prop que aparezca entre un THEN y un ELSE debe estar emparejada.
Es una transformacin gramatical til para producir una gramtica adecuada para el anlisis
sintctico predictivo.
Cuando no est claro cul de dos producciones alternativas utilizar para ampliar un no terminal
A, se pueden reescribir las producciones de A para retrasar la decisin hasta haber visto lo
suficiente en la entrada como para elegir la opcin correcta.
Aqu A es un nuevo NT. Se aplica repetidamente esta transformacin hasta que no haya dos
alternativas para un NT con un prefijo comn.
Construcciones de Lenguajes No LC
Este ejemplo resume el problema de asegurar que los identificadores se declaren antes de su
uso en un programa.
Este resume el problema de los textos de tipografa, que utilizan sobreescritura donde los
textos comunes usan subrayado.
Significa que un AF no puede aceptar un lenguaje como L3, que le exigira llevar la cuenta del
nmero de caracteres a antes de ver los caracteres b.
Una Gramtica puede llevar la cuenta de dos elementos, pero no de tres. Puesto que con una
Gramtica se puede definir L3 pero no L3.
Anlisis o Parsers Derechos e Izquierdos
Es encontrar un rbol sintctico o derivacin que tenga como raz el smbolo distinguido o
axioma de la gramtica LC, mediante la aplicacin sucesiva de sus reglas de derivacin.
Un anlisis o parsing a izquierda para una cadena t son los nmeros de las reglas de derivacin
izquierda utilizadas para generar t a partir de S.
La decisin de qu regla aplicar, no solo se asocia a la ambigedad, sino que trae otro
problema: Bloqueo Mutuo o Deadlock.
Los Algoritmos con retroceso tratan de simular de manera determinista un proceso no-
determinista.
Es fcil construir parsers con retroceso, ya que son los que se deducen inmediatamente de la
misma sintaxis.
Si la gramtica es no recursiva por la izquierda, se pueden explotar todas las posibilidades del
retroceso. Si tiene algn tipo de recursividad, el proceso puede entrar en un bucle infinito.
Algoritmo Ascendente con Retroceso
Busca desde abajo hacia arriba. Tambin aqu se utiliza retroceso en la bsqueda de
reducciones.
Gramticas LL(k)
Analizan las cadenas desde izquierda (left) a derecha y producen parsers a izquierda (left). Su
anlisis puede realizarse con la exclusiva inspeccin de un nmero determinado (k) de
smbolos a la derecha del analizado en cada momento (generalmente 1)
Gramticas LR(k)
Analizan las cadenas desde izquierda (left) a derecha y producen parsers a derecha (rigth), que
funciona sin ambigedad con la inspeccin de un nmero determinado (k)
Reduccin Desplazamiento
Precedencia Simple
Precedencia de Operadores
Lenguajes de Producciones
Gramticas y Anlisis LR
Analizadores Descendentes
El Descenso Recursivo.
Parsing LL(1) con Tabla.
Descenso Recursivo (ASDR)
El descenso recursivo, puede incluir retroceso. Sin embargo, no hay muchos analizadores
sintcticos con retroceso. En parte, porque casi nunca se necesita el retroceso para analizar
sintcticamente las construcciones de los lenguajes de programacin.
Una gramtica no puede reconocerse con descenso recursivo si es recursiva por la izquierda.
Gramticas LL
Condicin para que una gramtica pueda ser reconocida por un parser determinista, es decir
sin retroceso, en forma descendente: debe ser LL (1).
Para cada produccin de la forma A --> s1 | s2 | ....| sn siempre debemos ser capaces de elegir
la alternativa correcta para la generacin de un rbol de AS.
El conjunto de todos los smbolos T que pueden aparecer al principio de una frase que
puede derivarse de una secuencia arbitraria de smbolos: PRIMERO
El conjunto de todos los smbolos T que pueden aparecer despus de uno NT:
SIGUIENTE
Para cada produccin. A --> s1 | s 2| ... | sn se requiere: para cada cadena de entrada,
existe slo una produccin posible en un cierto estado de derivacin.
Si puede derivarse de un no terminal X, se requiere: qu PRIMERO y SIGUIENTE no
sean iguales. Nos ayuda a evitar bloqueos mutuos.
Aclaraciones de Gramticas LL(1)
Una gramtica recursiva izquierda puede hacer que un AS por descenso recursivo,
incluso uno con retroceso, entre en un bucle infinito (un smbolo se expande
sucesivamente sin consumir caracteres de entrada)
Las gramticas LL(1) son NO AMBIGUAS y nunca pueden SER
RECURSIVAS_IZQUIERDAS (la interseccin de los conjuntos PRIMERO correspondientes
no estara vaca)
El Anlisis Sintctico Descendente por Descenso Recursivo con gramticas LL(1) no
necesita retroceso y se denomina predictivo.
No existe un algoritmo general que transforme una gramtica a LL(1). Pero en algunos casos se
puede obtener una transformacin o resolver el problema de alguna de las siguientes formas:
Hay un diagrama para cada NT. Las etiquetas de los arcos son Comp. Lex y NT.
Una transicin con un NT es una llamada al procedimiento correspondiente.
Para cada NT se crea un estado inicial y uno final y para la produccin.
Un programa para hacer ASDR basado en diag de trans intenta emparejar smbolos T con la
entrada y realiza una llamada potencialmente recursiva a un procedimiento, siempre que se
deba seguir una arista etiquetada con un NT.
El AS Tabular (predictivo no recursivo) busca la produccin que debe aplicarse en una Tabla de
Anlisis Sintctico (construida desde la gramtica).
Elementos de AS Tabular
Buffer de Entrada: memoria temporal que contiene la cadena que se debe analizar,
que va seguida de $
Pila: contiene una secuencia de smbolos gramaticales, con $ como marca en la parte
inferior. Al principio la pila solo contiene el smbolo distinguido de la gramtica. y $
Tabla de AS: matriz bidimensional P[Ni,t] , donde Ni es un NT y t es T o $.
Se controla el AS mediante un PROGRAMA DE AS que tiene en cuenta: el smbolo de entrada
vigente (a) y el smbolo de la cima de la pila (X).
Anlisis Ascendente
En cada paso de reduccin se sustituye una subcadena determinada que concuerde con el lado
derecho de una produccin por el smbolo del lado izquierdo de dicha produccin. Si en cada
paso se elige correctamente la subcadena, se traza una derivacin por la derecha en sentido
inverso.
Gramticas LR(k)
Las gramticas LR (k) son la clase de gramticas GLC ms amplias que se pueden analizar
sintcticamente en forma ascendente sin correr el riesgo de bloqueo mutuo.
Mango o Pivote
Un mango de una cadena es una subcadena que concuerda con el lado derecho de una
produccin y cuya reduccin al no terminal del lado izquierdo de la produccin representa un
paso a lo largo de la inversa de una derivacin por la derecha.
Notar que se habla de un mando, en lugar de el mando, porque la gramtica podra ser
ambigua, con ms de una derivacin por derecha de t.
Si una gramtica no es ambigua, entonces toda forma de frase derecha de la gramtica tiene
exactamente un mando
Actividades principales al usar una Pila son
Desplazamiento
Reduccin
Una gramtica es LR(k) si siempre es posible determinar en forma nica el mando, teniendo en
cuenta el convenio de la pila y los siguientes k smbolos de entrada (no habr conflictos de
desplazamiento-reduccin ni de reduccin-reduccin)
Anlisis de una frase mediante reducciones por izquierda, implementado con una pila
Existen cuatro acciones posibles que un analizador por desplazamiento y reduccin puede
realizar
Existen GLC para las cuales no se pueden utilizar analizadores sintcticos por desplazamiento y
reduccin. Todo analizador por desplazamiento y reduccin para estas gramticas puede
alcanzar una configuracin en la que el analizador sintctico, conociendo el contenido total de
la pila y el siguiente smbolo de entrada, no puede decidir si desplazar o reducir (un conflicto
de desplazamiento / reduccin), o no puede decidir qu tipo de reduccin efectuar (un
conflicto de reduccin / reduccin). Tcnicamente estas gramticas no estn dentro de la clase
LR(k), se las denomina gramticas No LR(k).
Ejemplo 2:
Suponer que se tiene un analizador lxico que devuelve el componente lxico id para todos los
identificadores, independientemente de su uso. El lenguaje invoca procedimientos dando sus
nombres, con parmetros encerrados en parntesis, y que con la misma sintaxis se hace
referencia a las matrices.
Una proposicin que comience por A(I, J) parecera, para el analizador sintctico, como la
cadena de componentes lxicos id(id, id). Despus de desplazar los tres primeros
componentes lxicos dentro de la pila, tendra la configuracin
Para una pequea pero importante clase de gramticas se pueden construir a mano eficientes
analizadores por D/R. Estas gramticas tienen la propiedad de que ningn lado derecho de la
produccin es ni tiene dos No Terminales adyacentes. Una gramtica con esta ltima
propiedad se llama Gramtica de Operadores.
Como tcnica general de anlisis sintctico, el anlisis por precedencia de operadores tiene
varios inconvenientes. Por ejemplo, es difcil manejar componentes lxicos como el signo
menos (-) que tiene dos precedencias distintas. Adems solo una pequea clase de gramtica
puede analizarse con esta tcnica.
<. ,=., y .> entre algunos pares de terminales, las cuales guan la seleccin de mangos.
Observar que no son relaciones aritmticas. Puede suceder que a<.b y a.>b para el mismo
lenguaje; tambin puede ser que entre a y b no se cumpla ninguna de las tres.
Tcnicas Heursticas
No resuelven las situaciones cuando un mismo operador es usado por ejemplo como
prefijo unario y como binario.
Aqu el AL debera diferenciar con componentes lxicos distintos los dos operadores.
En este caso el AL debe recordar el componente lxico anterior.
Funciones de Precedencia
En la mayora de los casos, la tabla se puede codificar mediante dos funciones de precedencia:
f y g, que transforman los smbolos terminales en enteros.
Para construir las funciones se emplea un grafo dirigido que representa las funciones de
precedencia., el cual no puede tener ciclos.
En el caso 1 se puede recuperar modificando la pila, la entrada o ambas. Para cada en blanco
en la tabla se especifica una rutina de error.
Analizador Sintctico LR
Se requiere un indicador para exhibir el avance del proceso de AS. Se definen elementos LR(0)
(no se incluye informacin de lectura por anticipado: Sea X--> G1G2 una produccin de la
gramtica G. Un elemento LR(0) de la gramtica G contiene un indicador (un punto) en la
posicin del lado derecho de las producciones de G.
X --> . G1 G2
X --> G1 . G2
X --> G1 G2 .