Está en la página 1de 26

Compilador

Un compilador es un programa que puede leer un programa en un lenguaje (el lenguaje


fuente) y traducirlo en un programa equivalente en otro lenguaje (el lenguaje destino). Una
funcin importante del compilador es reportar cualquier error en el programa fuente que
detecte durante el proceso de traduccin.

El Diseo de un compilador surge como resultado de:

Desarrollo de un nuevo lenguaje de programacin


Adicin de extensiones a los ya existentes
Explotacin de las caractersticas del hardware.

A futuro:

Extensin para el cmputo paralelo y distribuido


Explotacin de caractersticas multimedia (MMX) .

Tipos de Sistemas de Compilacin

Ensamblador: traducen programas escritos en lenguaje ensamblador a cdigo


mquina.
Compilador: traducen programas escritos en lenguaje de alto nivel a cdigo
intermedio o a cdigo mquina
Interprete: no genera cdigo objeto, analiza y ejecuta directamente cada proposicin
del Programa Fuente (PF)
Preprocesador: sustituyen macros, incluyen archivos o extensin del lenguaje.

La estructura de un Compilador

Anlisis (Etapa Inicial):

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.

Sntesis (Etapa Final)

La parte de la sntesis construye el programa destino deseado a partir de la representacin


intermedia y de la informacin en la tabla de smbolos.
Anlisis del Programa Fuente

Anlisis de lxico o escaneo

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).

Ej de Token: SI Nuevo > MaxNm ENTONCES

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 construcciones lxicas no requieren recursin (ej. Reconocer un identificador) mientras


que las sintcticas suelen requerirlas (ej. Emparejamiento de parntesis o Begin-End)

La estructura jerrquica de un programa normalmente se expresa mediante reglas recursivas

Las gramticas libres de contexto (GLC) son una formalizacin de reglas recursivas que pueden
guiar el anlisis sintctico.

Anlisis semntico

Utiliza el rbol sintctico y la informacin en la tabla de smbolos para comprobar la


consistencia semntica del programa fuente con la definicin del lenguaje. Recopila
informacin sobre el tipo y la guarda, para usarla ms tarde durante la generacin de cdigo
intermedio.

Una parte importante del anlisis semntico es la comprobacin (verificacin) de tipos, en


donde el compilador verifica que cada operador tenga operandos que coincidan.

Generacin de cdigo intermedio

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

Cada posicin de memoria puede actuar como registro.


Cada instruccin tiene como mximo 3 operandos.

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.

Administracin de la tabla de smbolos

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.

El agrupamiento de fases en pasadas

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.

Algunos tipos especiales de Compiladores

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

Deteccin e informacin de errores

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

Un Compilador de una sola pasada

Forma de Organizacin

El A. Lex., A. Sint., A. Seman. y Generacin de cdigo intermedio, se agrupan en una


pasada.
La cadena de Comp. Lx., despus del A.L. puede traducirse directamente a cdigo
intermedio.
El A. Sint., opera como encargado del control. Intenta descubrir la estructura
gramatical de los Comp. Lex. observados (llama al A. Lex.)
A medida que el A. Sint. descubre la estructura gramatical, llama al GCI para que haga
el A. Sem. y genere una parte del cdigo.

Notaciones y Herramientas

Para especificar la sintaxis de un lenguaje se utiliza notacin de Gramticas


Independientes o Libres del Contexto y BNF (Forma de Backus_Naur para las GLC).
Para organizar la etapa inicial se emplea la tcnica de compilacin Traduccin Dirigida
por Sintaxis.
La Traduccin dirigida por sintaxis es una combinacin de un analizador sintctico y un
generador de cdigo intermedio.

Definicin de la Sintaxis

Una GLC describe de forma natural la estructura jerrquica de muchas construcciones de los
lenguajes de prog.

if ( expresion ) proposicion else proposicin

prop --> if ( exp ) prop else prop

Una GLC tiene 4 componentes:

1. Un conjunto de componentes lxicos, denominados smbolos terminales.


2. Un conjunto de no terminales.
3. Un conjunto de producciones: cada produccin consta de un no terminal (NT), llamado
lado izquierdo de la produccin y una secuencia de componentes lxicos y no
terminales, o ambos, llamado lado derecho de la produccin.
4. La denominacin de uno de los NT como smbolo inicial.

Otros ejemplos usando BNF

La forma de Backus Naur permite especificar la sintaxis de un lenguaje de programacin


Terminologa de Gramticas y Lenguajes

Alfabeto: conjunto arbitrario pero finito de smbolos


Smbolos: elementos del vocabulario de un lenguaje formal
Componente lxico: ocurrencias mltiples de smbolos
Frase: secuencia de smbolos
Gramtica: sintaxis de un lenguaje ( define si una frase es significativa - correcta)
Cadena: secuencia finita de elementos de un alfabeto
Producciones: especifican como se puede combinar los terminales y los no terminales
para formar cadenas.
Smbolos terminales: conjunto de palabras reservadas de un lenguaje de
programacin. Incluye caracteres especiales y operadores tanto aritmticos como
lgicos.
T: conjunto de smbolos terminales
T*: conj. de todas las cadenas posibles en t (clausura)
Smbolos no terminales: conjunto de variables que utilizamos en las producciones de
las gramticas como smbolos de transicin.
Vocabulario: v = n U t

rboles de Anlisis Sintctico

Indica grficamente cmo del smbolo inicial de una gramtica deriva una cadena de lenguaje.

A -> XYZ

En una GLC, un rbol AS es un rbol con las propiedades

1. La raz est etiquetada con el smbolo inicial.


2. Cada hoja est etiquetada con un componente lxico o con (vaco).
3. Cada nodo interior est etiquetado con un no terminal.
4. Si A es el no terminal que etiqueta a algn nodo interior y X1, X2,.....Xn son las
etiquetas de los hijos de ese nodo, de izquierda a derecha, entonces A --> X1, X2,. Xn
es una produccin.

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.

Para aplicaciones de compilacin es necesario disear G no ambiguas o utilizar gramticas


ambiguas con reglas adicionales para resolver ambigedades.
Asociatividad de Operadores

Cuando un operando tiene operadores a izquierda y derecha, se necesitan convenciones para


decidir que operador considera ese operando. Ej: 9 + 5 + 2 ?.

En la mayora de los lenguajes de programacin, los cuatro operadores aritmticos, son


asociativos por la izquierda.

Otros asocian a la derecha:

La exponenciacin
El operador de asignacin = en C.

Asociatividad Izquierda y Derecha

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.

Sintaxis de Expresiones: utilizando una Tabla que muestre la Asociatividad y precedencia de


operadores se puede construir una gramtica para expresiones aritmticas.

Sintaxis de Proposiciones: las palabras clave permiten reconocer proposiciones en la mayora


de los lenguajes.

Traduccin Dirigida por la Sintaxis

Especifica la traduccin de una construccin en funcin de atributos asociados con sus


componentes sintcticos. Para especificar traducciones, se introduce tambin una notacin
ms orientada a procedimientos, denominada esquema de traduccin.
Notacin Postfija

Si E es una variable o una constante, entonces la NP de E es tambin E


Si E es una expresin de la forma E1 op E2, donde op es cualquier operador binario,
entonces la NP de E es E1 E2 op, donde E1 y E2 son las notaciones postfijas de E1 y
E2 respectivamente.
Si E es una expresin de la forma (E1), entonces la NP de E1 es tambin la NP de E.
La NP no necesita parntesis, porque la posicin y la ariedad (nmero de argumentos)
de los operadores permiten solo una descodificacin de una expresin postfija

(9-5)+2 = 95-2+

9-(5+2) = 952+-

Definiciones dirigidas por sintaxis

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.

Una traduccin es una transformacin de una entrada en una salida.

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.

Ejemplo: Traducir expresiones con suma y resta a notacin postfija

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.

Mtodos de Anlisis Sintctico

Comprendidos en dos clases de mtodos: descendente y ascendente. Hacen referencia al


orden en que se construyen los nodos del rbol de AS.

Descendentes: se pueden construir manualmente analizadores sintcticos eficientes con


mayor facilidad.

Ascendente: puede manejar una clase mayor de gramticas y esquemas de traduccin. Las
herramientas de software utilizan este mtodo.

ANLISIS LXICO

Fase de Anlisis Lxico

El cdigo fuente es un flujo de caracteres.


La tarea del analizador lxico es reconocer smbolos en este flujo de caracteres y
presentarlos en una representacin ms til para el anlisis sintctico.

Funcin del Analizador 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

Eliminar espacios, comentarios, caracteres de tabulacin, saltos de lnea, etc.


Reconocer identificadores y palabras claves
Introducir los identificadores en la Tabla de Smbolos
Reconocer constantes y numerales
Generar un listado para el compilador.
Interaccin entre el Analizador Lxico y el Analizador Sintctico

Recibida la orden obtener el siguiente componente lxico" del analizador sintctico, el


analizador lxico lee los caracteres de entrada hasta que pueda identificar el siguiente
componente lxico.

Proceso de Anlisis Lxico

El reconocimiento del AL puede verse como una transformacin en un flujo de


smbolos reducido
Tambin debe relacionar los mensajes de error del compilador con el programa
fuente. En algunos casos se hace una copia del programa fuente con los errores
marcados
Puede realizar preprocesamiento de macros
Se pueden dividir en dos etapas : Examen y Anlisis Lxico

Por qu conviene separar el Analizador Lxico del Analizador Sintctico

Se simplifican las fases.


Se mejora la eficiencia del compilador (manejo de buffers).
Se mejora la transportabilidad del compilador.
Eliminacin de espacios en blanco, tabuladores, saltos de lnea y comentarios.

El Analizador Lxico y la Tabla de Smbolos

Durante el A Lxico los lexemas se guardan en la tabla de Smbolos. Cuando se guarda un


lexema, tambin se guarda el componente Lxico asociado.

Componentes lxicos, patrones y lexemas

Un lexema es una secuencia de caracteres en el programa fuente con la que concuerda el


patrn para un componente lxico.

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).

Manejo de Buffers de Entrada

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.

Hay 3 mtodos generales para la implantacin de un AL

Utilizar un generador de AL, como el LEX para producir un AL a partir de una


especificacin basada en expr. regulares
Escribir el AL en un leng. de prog. de sistemas, utilizando las posibilidades de e/s de
este leng.
Escribir el AL en lenguaje ensamblador y manejar explcitamente la lectura de la
entrada

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.

Los autmatas (o MAQUINAS RECONOCEDORAS) son dispositivos formales que permiten


definir un lenguaje por medio de la va de aceptacin de cadenas o tiras que lo componen:

Gramticas: generan las cadenas a partir de las reglas de produccin.


Autmatas: deciden si una cadena pertenece o no a un lenguaje dado
Un Autmata consta de

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

Los tipos estn en relacin con el tipo de lenguaje que aceptan.

Autmatas Finitos: reconocen lenguajes regulares, de movimiento unidireccional, sin


memoria auxiliar. Usados para AL.
Autmata con Pila: reconocen lenguajes libres de contexto, de movimiento
unidireccional, memoria en estructura de pila. Usados en AS tericos.
Autmatas Bidireccionales: reconocen lenguajes dependientes del contexto.
Mquinas de Turing: reconocen lenguajes sin restricciones. Bidireccionales.

Autmata Finito Determinista

El autmata ms simple es el autmata finito determinstico (FDA).

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

Un autmata finito determinstico puede definirse formalmente como una quntupla

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

Autmatas y Diagramas de Transicin

Un FDA se puede representar mediante un Diagrama de Transicin:

Los estados son crculos marcados con el nombre.


Los estados finales se identifican oscuros.
Los estados se conectan por arcos marcados con caracteres de entrada permitidos.
Anlisis Sintctico

Rol del Analizador Sintctico

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.

Tipos Generales de A Sintctico

Mtodos Universales: pueden analizar cualquier tipo de gramtica. Poco usado en la


produccin de compiladores.
Descendentes: construyen rboles sintcticos de arriba a abajo. Examinan la entrada
de izquierda a derecha. Se basan en una subclase de gramticas: las LL, que permiten
analizar una frase de entrada sin que existan bloqueos mutuos.
Ascendentes: construyen rboles sintcticos de abajo hacia arriba. Examinan la
entrada de izquierda a derecha. Se basan en una subclase de gramticas: las LR.

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.

Manejo de Errores Sintcticos

Los programas pueden contener distinto tipo de errores:

Lxicos ( escribir mal un identificador u operador)


Sintcticos ( parntesis no equilibrados en una expresin)
Semnticos ( operador aplicado a operando incompatible)
Lgicos ( llamada infinitamente recursiva)

La mayora de las especificaciones de lenguajes de programacin no describen como debe


responder un compilador a los errores: la respuesta se deja al diseador del compilador.

Objetivos del manejo de errores

Informar de la presencia de errores con claridad y exactitud


Recuperarse de cada error con la suficiente rapidez como para detectar errores
posteriores
No retrasar de manera significativa el procesamiento de programas correctos.

Propiedad de prefijo viable

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

Detectado el error, en general no es adecuado que el AS abandone, porque el posterior


procesamiento de la entrada podra revelar ms errores.

Una recuperacin inadecuada puede producir muchos errores extraos, introducidos por el AS
durante la recuperacin del error

Tambin la recuperacin de un error sintctico, puede introducir errores semnticos extraos,


que luego detectar la fase de Analizador Semntico o Generacin de cdigo.

Hay varias estrategias para recuperacin de errores sintcticos pero ninguna de carcter
universal.

Diferentes Mtodos

Mtodo en modo de pnico

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.

EJ: sustituir una , coma por un ; punto y coma.

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

Se busca el mnimo de cambios posibles al procesar una cadena incorrecta.


En general es costoso en tiempo y espacio (de inters terico)
Proporciona una escala para evaluar tcnicas de recuperacin de errores.

Gramticas Libres de Contexto (GLC)

Una gramtica libre de contexto es un tipo ms sofisticado de especificacin sintctica de un


lenguaje.
En una GLC, un no terminal es considerado como un smbolo inicial, y el conjunto de cadenas
que representa es el lenguaje definido por la gramtica.

Para reconocer cadenas de un lenguaje se pueden considerar dos procesos:

Construccin de rboles de AS.


Secuencia de derivaciones.

Arboles Sintcticos y Derivaciones

Derivaciones

Un rbol de AS es una representacin grfica de una derivacin que NO muestra la eleccin


relativa al orden de sustitucin.

Las derivaciones pueden ser:

Derivacin por izquierda: E --> E+E --> id + E --> id + id


Derivacin por derecha: E --> E+E --> E + id --> id + id

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.

Para id * id + id, hay dos derivaciones izquierdas:

E --> E * E --> id * E --> id * E + E --> id * id + E --> id *id + id


E --> E + E--> E *E + E --> id * E + E --> id * id + E--> id *id +id

Escritura de una Gramtica

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

En ocasiones una gramtica se puede reescribir para eliminar 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

En todos los lenguajes de programacin con proposiciones condicionales de esta forma, se


prefiere el primer rbol de AS. La regla general es, emparejar cada else con el then sin
emparejar anterior ms cercano, esta regla se puede incorporar directamente a la gramtica.

Se puede reescribir la gramtica como la siguiente gramtica:

Una prop que aparezca entre un THEN y un ELSE debe estar emparejada.

Factorizacin por la Izquierda

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.

Al ver el componente lxico de entrada if, no se puede saber de inmediato si qu produccin


elegir para expandir prop

En general: si A --> 1| 2, se puede expandir A--> A

Luego de ver la entrada derivada de , se puede expandir A a 1 o a 2


Algoritmo de Factorizacin por la Izquierda de una Gramtica

Para cada no terminal A, encuntrese el prefijo ms largo comn a dos o ms de sus


alternativas.

Si <> (prefijo no trivial), se sustituyen todas las producciones de A:

A --> 1| 2 | n | , donde representa todas las alternativas que no comienzan con ,


por:

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

Algunos lenguajes no pueden ser generados por ninguna GLC.

Ej1: L = { wcw | w est en (a|b)*} no es LLC.

Este ejemplo resume el problema de asegurar que los identificadores se declaren antes de su
uso en un programa.

Ej2: L = { an bm cn dm | n>=1 y m>=1} no es LLC.

Este resume el problema de comprobar si el nmero de parmetros formales en la declaracin


de un procedimiento coincide con el nmero de parmetros actuales en el uso de ese
procedimiento.

Aqu a y b son listas de parmetros formales de dos procedimientos. y c y d son listas de


parmetros reales en llamadas a dichos procedimientos

Ej3: L = { an bn cn / n>0} no es LLC.

Este resume el problema de los textos de tipografa, que utilizan sobreescritura donde los
textos comunes usan subrayado.

Un Autmata Finito no puede contar

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

Analizar sintcticamente una tira o cadena de tokens

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.

De la misma forma para el parsing a derecha, pero con reglas derechas.

El problema de Decisiones en el Anlisis

La decisin de qu regla aplicar, no solo se asocia a la ambigedad, sino que trae otro
problema: Bloqueo Mutuo o Deadlock.

Analizadores o Parsers con Retroceso

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.

Pero tienen desventajas:

Lentitud y dependencia del orden de las posibles alternativas


Limitacin para emitir buen diagnstico de errores
El retroceso dificulta la generacin de cdigo, pues habr que eliminarlo al retroceder

El Problema del Retroceso

Algoritmo Descendente con Retroceso

1. Se ordenan todas las reglas con NT izquierdos iguales consecutivos


2. Se construye descendentemente el rbol de A.S., comenzando por la raz y aplicando
las siguientes reglas. Al nodo en proceso de expansin se lo llama nodo activo (na)
3. Se toma para el na, la 1ra de sus alternativas posibles de reglas A--> X1 X2 X3...Xn,
creando los n descendientes directos para A. El na en ese momento pasa a ser el 1ro.
izq de sus descendientes (X1). Si n = 0, se toma como na el ms inmediato derecho de
A susceptible de ser derivado.
4. Si na es Terminal, se compara con el smbolo actual de entrada.
a. Si son = se avanza un smbolo a derecha
b. Si no son =, se retrocede al nodo inmediatamente a la derecha del T y se
retrocede al nodo padre y se intenta otra alternativa; sino se retrocede a uno
superior.

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.

Se emplea un mtodo llamado reduccin-desplazamiento


El AS utiliza derivaciones derechas
La cadena de tokens se introduce en una pila

Anlisis Sintctico Descendente

El estudio del Anlisis Sintctico Descendente se apoya en la construccin de rboles


sintcticos o derivaciones Izquierdas. Pueden utilizarse esquemas de traduccin simple o
traductores con pila.

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)

Anlisis Sintctico Ascendente

El estudio del Anlisis Sintctico Ascendente se apoya en la construccin de rboles sintcticos


o derivaciones derechas. Pueden utilizarse esquemas de traduccin simple o traductores con
pila. Si se emplea esquema de traduccin, luego hay que permutar la salida.

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)

Mtodos de Analizadores Ascendentes

Reduccin Desplazamiento
Precedencia Simple
Precedencia de Operadores
Lenguajes de Producciones
Gramticas y Anlisis LR

Analizadores Descendentes

Las tcnicas ms importantes de los A.S. Descendente son:

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.

S -> cAd A -> ab | a

Cadena de entrada w = cad

Una gramtica no puede reconocerse con descenso recursivo si es recursiva por la izquierda.

Estructura de una ASDR

La forma ms comn de implementar un ASDR es asociando un procedimiento a cada NT de la


gramtica.

El smbolo de bsqueda por anticipacin determina cul es el procedimiento llamado para


cada NT y no hay retrocesos.

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).

Regla para los AS

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.

Para cumplir esta regla necesitamos informacin adicional:

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

Definicin de Gramticas LL(1)

Una GLC se denomina LL(1) si tiene las siguientes caractersticas:

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.

Conversin de una gramtica a LL(1)

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:

Eliminacin de recursividad por izquierda.


Factorizacin y sustitucin.
Mediante aspectos semntico.

Diagramas de Transiciones (autmatas) para ASDR

Las diferencias entre un DT para AL y para AS son:

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.

Anlisis Sintctico Tabular

Se puede construir un AS Predictivo no recursivo, explcitamente, manteniendo una pila, en


lugar de hacerlo mediante llamadas recursivas.

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

El AS ascendente es conocido como AS por desplazamiento y reduccin

Dos formas generales de AS Ascendente son: por precedencia de operadores y AS LR.

El AS por Desplazamiento y Reduccin intenta construir un rbol de AS para una cadena de


entrada que comienza por las hojas (el fondo) y avanza hacia la raz (la cima). Se puede
considerar este proceso como reducir una cadena w al smbolo inicial de la gramtica.

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.

L: entrada leda de izquierda a derecha


R: derivaciones por derecha
k: lectura de k smbolos por anticipado

Estn basadas en el concepto de mando (mango, pivote).

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

Se desplaza un smbolo de la memoria intermedia (buffer) de entrada a la pila y si es un mando


se reducir a un no terminal.

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)

Algunas propiedades demostrables

Las gramticas LR(k) son no ambiguas


Cada gramtica LL(k) es tambin una gramtica LR(k)
Para cada gramtica LR(k) , con k>1, existe una gramtica LR(1) equivalente.

Implantacin por medio de una pila del AS DyR

Un modo adecuando de implantar un AS por desplazamiento y reduccin es mediante la


utilizacin de una pila para manejar smbolos gramaticales, y un buffer de entrada para
manejar la cadena w que se ha de analizar.

Anlisis de una frase mediante reducciones por izquierda, implementado con una pila

La frase que se analiza se desplaza paso a paso de la memoria de entrada a la pila.


Antes de cada desplazamiento verifica si hay un mando en la cima de la pila, si es as
reduce.
La entrada es aceptada si la memoria de entrada est vaca y el smbolo inicial de la
gramtica est en la cima.

Acciones del AS DyR

Existen cuatro acciones posibles que un analizador por desplazamiento y reduccin puede
realizar

Desplazar: el siguiente smbolo de entrada se desplaza a la cima de la pila.


Reducir: el analizador debe decidir el no terminal con que debe sustituir el mango.
Aceptar: el analizador anuncia la terminacin con xito del anlisis sintctico.
Error: el analizador descubre que se ha producido un error sintctico y llama a una
rutina de recuperacin de errores.

Conflictos durante el Anlisis Sintctico por Desplazamiento y Reduccin

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 1: Una gramtica ambigua nunca puede ser LR.

No se puede saber si IF expr THEN prop es el mango, independientemente de lo que aparezca


debajo de l en la pila. Hay conflicto de desplazamiento / reduccin.

Ejemplo 2:

Se sabe que se tiene un mango, pero el contenido de la pila y el siguiente smbolo de la


entrada no son suficientes para determinar qu produccin debe ser utilizada en una
reduccin

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

Es evidente que se debe reducir el id de la pila, pero por qu produccin? La eleccin


correcta es diferente segn A sea procedimiento o matriz. La pila no dice cul emplear; se
debe recurrir a la TS.

Una solucin es cambiar el componente lxico id en la produccin (1) a idproc y usar un AL


ms complejo que devuelva el componente lxico idproc cuando reconozca un identificador
que sea el nombre de un procedimiento.
Anlisis Sintctico por Precedencia de Operadores

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.

AS por Precedencia de Operadores

Muchos compiladores utilizan esta tcnica por su sencillez.

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.

En el AS por precedencia de operadores, se definen tres relaciones de precedencia disjuntas:

<. ,=., y .> entre algunos pares de terminales, las cuales guan la seleccin de mangos.

a<. b a cede la precedencia a b


a=. b a tiene la misma precedencia que b
a. >b a tiene ms precedencia que b

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.

Para determinar las relaciones de precedencia:

Basado en nociones tradicionales de asociatividad y precedencia ( intuitivo)


Construir primero una gramtica no ambigua para el lenguaje que refleje la
asociatividad y precedencia y luego por un mtodo mecnico construir las relaciones
de precedencia de operadores.

Uso de las relaciones de precedencia de operadores

La intensin de las relaciones de precedencia es delimitar el mango de una forma de frase


derecha, marcando con <. el extremo izquierdo, con =. el interior y con .> el extremo derecho.

Obtencin de las Relaciones de Precedencia

Tcnicas Heursticas

Reglas de asociatividad y preceencia:

Si el operador O1 tiene mayor precedencia que O2: O1.>O2 y O2<.O1


Si O1 y O2 son de igual precedencia, O1.>O2 y O2.>O1 (si son asoc izq) y O1<.O2 y
O2<.O1 ( si son asoc der)
Problemas de las 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

No se necesita almacenar tablas de relaciones 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.

Se crean smbolos ft y gt para cada terminal t

Usando la relacin =. y la transitividad se crean grupos de manera que si a =. b entonces fa y gb


estn en el mismo grupo

Se crea un grafo dirigido tal que:

Si a<. b se agrega arista de gb a fa


Si a .> b se agrega arista de fa a gb

Recuperacin de Errores en el AS por Precedencia de Operadores

Existen dos puntos en el que el analizador puede descubrir errores sintcticos:

Si no se cumple ninguna relacin de precedencia entre el terminal de la cima de la pila


y la entrada en curso.
Si se ha encontrado un mango, pero no existe ninguna produccin con este mango
como lado derecho

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.

En el caso 2 se puede buscar el lado derecho ms parecido y emitir un mensaje.

Analizador Sintctico LR

La L es por el examen de la entrada de izquierda a derecha, la R por construir una


derivacin por la derecha en orden inverso, y la k por el nmero de smbolos de entrada de
examen por anticipado utilizados para tomar las decisiones del anlisis sintctico.
El AS LR es atractivo por varias razones

Se pueden construir analizadores sintcticos LR para reconocer prcticamente todas


las construcciones de los lenguajes de programacin para los que se pueden escribir
GLC.
El mtodo de AS LR es el mtodo de anlisis por desplazamiento y reduccin sin
retroceso ms general que se conoce.
La clase de gramticas que pueden analizarse con los mtodos LR es un supraconjunto
de la clase de gramticas que se pueden analizar con analizadores sintcticos
predictivos.
Un analizador sintctico LR puede detectar un error sintctico tan pronto como sea
posible hacerlo en un examen de izquierda a derecha de la entrada.

El principal inconveniente del mtodo es que supone demasiado trabajo construir un AS LR a


mano para una gramtica de un lenguaje de programacin tpico.

Procedimiento Tablas de Anlisis Sintctico

La construccin de tablas de AS es un proceso complejo y en general no se realiza


manualmente, se recurren a herramientas que permiten generar analizadores sintcticos.

Hay varios mtodos de construccin:

SLR (LR simple)


LR cannico
LALR (LR con lectura anticipada o look a head LR)

Procedimiento Tablas de AS SLR

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.

Los elementos para la produccin son:

X --> . G1 G2

X --> G1 . G2

X --> G1 G2 .

También podría gustarte