Sei sulla pagina 1di 49

COMPILADORES

M.C. Hilda Castillo Zacatelco


BUAP
Historia de los compiladores
1946, se desarrolla el primer ordenador digital (lenguaje de mquina)
1950, John Backus dirige una investigacin en IBM en un lenguaje algebraico
1954, se comienza a desarrollar FORTRAN
1957, FORTRAN se utiliza en la IBM modelo 704
Surge el concepto traductor
El primer compilador de FORTRAN tard 18 aos-persona en realizarse
FORTRAN era dependiente de la mquina
Paralelamente al desarrollo de FORTRAN en Amrica, en Europa surge una corriente que
pretende que los lenguajes fuesen independientes de la mquina, esta corriente estaba influida
por los trabajos sobre GLC de Chomsky
Surge un grupo Europeo encabezado por F.L. Bauer, en la que particip ACM y John Backus.
De este grupo surge un informe que define un Lenguaje Algebraico Internacional, publicado en
Zurich en 1958
1969, aparece Algol 60
Junto con los lenguajes tambin la tcnica de los compiladores avanza

Introduccin
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Historia de los compiladores
1958, Strong y otros proponen una solucin al problema de que un compilador
fuera portable, y esta era dividir al compilador en dos fases front end (analiza
el programa fuente) y back end (genera cdigo objeto para la mquina
objeto).
El puente de unin era un lenguaje intermedio denominado UNCOL (no
funcion)
1959, Rabin y Scott proponen el empleo de AFD y AFN para el reconocimiento
lexicogrfico de los lenguajes
Aparece BNF (Backus-1960, Naur-1963, Knuth-1964) como una gua para el
desarrollo del anlisis sintctico
1959, Sheridan describe un mtodo de parsing de FORTRAN para introducir
parntesis en una expresin
En los 60s se desarrollan diversos mtodos de parsers ascendentes y
descendentes
Introduccin
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Historia de los compiladores

Floyd ms adelante introduce la tcnica de precedencia de operadores y uso de funciones
de precedencia
1961, se usa por primera vez un parsing descendente recursivo
En los 60s se estudia el paso de parmetros por nombre, valor y referencia y se incluyen
los procedimientos recursivos para Algol 60
Se desarrolla la localizacin dinmica de datos
1968, se estudia y definen las GLC, los parsers predictivos y la eliminacin de
recursividad izquierda
1975, aparece LEX generador automtico de analizadores lxicos a partir de expresiones
regulares bajo UNIX
A mitad de los 70s Johnson crea YACC para UNIX (generador de analizadores
sintcticos)
Ahora un compilador de divide en varias varias
El ltimo lenguaje de programacin de amplia aceptacin es JAVA (es interpretado)
Introduccin
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Conceptos Bsicos
Traductor. Cualquier programa que toma como entrada un texto escrito en un
lenguaje llamado fuente y da como salida un programa equivalente en otro
lenguaje, el lenguaje objeto.
Si el lenguaje fuente de un lenguaje de programacin de alto nivel y el objeto un
lenguaje de bajo nivel (ensamblador o cdigo de mquina), al traductor se le
denomina compilador.
Ensamblador. Es un programa traductor cuyo lenguaje fuente es el lenguaje
ensamblador.
I ntrprete. Es un programa que no genera un programa equivalente, sino que
toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce
al cdigo equivalente y al mismo tiempo lo ejecuta.
En un principio debido a la escasez de memoria se utilizaban ms los intrpretes,
ahora se usan ms los compiladores (a excepcin de JAVA)

COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Conceptos bsicos
Ventajas de compilar vs a interpretar
Se compila una vez, se ejecuta n veces
En ciclos, la compilacin genera cdigo equivalente, interpretndolo se
traduce tantas veces una lnea como veces se repite el ciclo
El compilador tiene un visin global del programa

Ventajas del intrprete vs el compilador
Un intrprete necesita menos memoria que un compilador
Permiten una mayor interactividad con el cdigo en tiempo de desarrollo

COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Programas que el compilador necesita para obtener un programa
ejecutable
Preprocesador
Ligador
Cargador
Depurador
Ensamblador
Tipos de compiladores
De una pasada
De mltiples pasadas
De carga y ejecucin
De depuracin
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
De optimizacin
Ensamblador
Compilador cruzado
Compilador con montador
Autocompilador
Metacompilador
Descompilador
Modelo de anlisis y sntesis de la compilacin
Partes en la que est dividida la compilacin: anlisis y sntesis
La sntesis es la que requiere las tcnicas ms especializadas.

COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Herramientas de software que realizan algn tipo de anlisis a los programas fuente
que manipulan:
Editores de estructuras
Impresoras estticas
Verificadores estticos
Intrpretes
La tecnologa de compiladores se aplica en otros lugares, en especial la parte de
anlisis de los siguientes ejemplos es parecida a la de un compilador
convenvcional:
Formadores de Texto . P/E T
E
X
Compiladores de circuitos de silicio
Intrpretes de consultas
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Estructura de un compilador
Para la realizacin del proceso de traduccin es necesario dividir el compilador en
varias fases.
Anlisis sintctico
Anlisis lxico
Anlisis semntico
Generacin de
cdigo intermedio
Optimizacin de cdigo
Generacin de cdigo
Programa objeto
Manejo
de
errores
Manejo de la
Tabla de
smbolos
Programa fuente
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Antes
Una computadora no tena memoria suficiente
Se tuvo que dividir al compilador en fases
Cada fase lea un archivo y produca otro
Actualmente
Se tiene memoria suficiente
El tamao del archivo ejecutable es relativamente pequeo
Se han reducido el nmero de pasadas y el nmero de archivos que se tienen
que leer y escribir
Las fases de un compilador se agrupan en dos partes o etapas:

Anlisis lxico (lineal)
Anlisis sintctico (jerrquico)
Anlisis semntico
Optimizacin de cdigo
Generacin de cdigo
Generacin de cdigo intermedio
Front end (anlisis)
Back end (sntesis)
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Front end
Dependiente del lenguaje fuente
Independiente de la mquina objeto para la que se va a generar cdigo
Back end
Independiente del lenguaje objeto
Dependiente del lenguaje objeto
Anlisis lxico
Tambin llamado exploracin o scanner. Lee caracteres uno a uno desde la
entrada y va formando grupos de caracteres con alguna relacin entre s llamados
tokens, los que sern la entrada para la siguiente etapa del compilador.
Tipos de tokens:
Tiras especficas
Tiras no especficas
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Componentes de un token
Tipo
Valor
Las tiras especficas solo tienen tipo.
Anlisis sintctico (parser)
Recibe como entrada los tokens que le pasa el analizados lxico y comprueba si
estos van llegando en el orden correcto. Su salida terica sera un rbol
sintctico.
Sus funciones son:
Aceptar lo que es vlido sintcticamente y rechazar lo que no lo es
Hacer explcito el orden jerrquico que tienen los operadores en el lenguaje de
que se trate
Guiar el proceso de traduccin (traduccin dirigida por sintaxis)

COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Un factor de divisin entre el anlisis lxico y sintctico es la recursin.
Anlisis semntico
Es ms difcil de formalizar que el sintctico. Este trata de encontrar errores
semnticos y reunir informacin sobre los tipos para la fase de generacin de
cdigo, realizar verificacin de tipos. En definitiva comprobar que el significado
de lo que va leyendo es vlido.
La salida terica ser un rbol semntico.
Ejemplo:
int i,j,k; Anlisis Lxico: Devuelve secuencia de tokens.
char s[10]; tipo id coma id coma id coma puntoycoma
s=i+j*k; tipo id cora entero corc puntoycoma
id asignacin id suma id multiplicacin id puntoycoma

Anlisis sintctico: El orden de los tokens es vlido

Anlisis semntico: Tipo de variables asignadas incorrecta
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Generacin de cdigo intermedio
Transforma un rbol sintctico (semntico) en un representacin en un lenguaje
intermedio, que suele ser cdigo sencillo que despus se convertir en cdigo de
mquina.
Propiedades de la representacin intermedia:
Debe ser fcil de producir
Debe ser fcil de traducir al programa objeto
Un formato de cdigo intermedio es el cdigo de tres direcciones.
Forma: A:= B op C, donde A,B,C son operandos y op es un operador binario
Se permiten condicionales simples simples y saltos.
P/E
while (a >0) and (b<(a*4-5)) do a:=b*a-10;
L1: if (a>0) goto L2 L4: t1:=b*a
goto L3 t2:=t1-10
L2: t1:=a*4 a:=t2
t2:=t1-5 goto L1
if (b < t2) goto L4 L3: .
goto L3
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Optimizacin de cdigo
Trata de conseguir que el programa objeto sea ms rpido en la ejecucin y que
necesite menos memoria a la hora de ejecutarse.(No todos los compiladores llevan
a cabo esta etapa)
Posibles optimizaciones locales:
Cuando hay dos saltos seguidos se puede quedar uno solo
P/E El ejemplo anterior quedara as:
L1: if (a<=0) goto L3 t1:=b*a
t1:=a*4 t2:=t1-10
t2:=t1-5 a:=t2
if (b >= t2) goto L3 goto L1
L3: .
Eliminar expresiones comunes en favor de una sola expresin
a:=b+c+d Quedara t1:=b+c b:=t1+e
b:=b+c+e a:=t1+d
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
Optimizacin de bucles y lazos (sacar expresiones invariantes)
P/E
Repeat Se saca x:=3
x:=3;
y:=y-x*2;
until y<0;
Generacin de cdigo
Es la fase final de un compilador y consiste en generar cdigo relocalizable o en
ensamblador
Tabla de smbolos
En esta estructura se almacena informacin como: variables, etiquetas, tipos, etc.
Los accesos a la tabla deben ser lo ms rpido posibles
Manejo de errores
Es una de las misiones ms importantes del compilador. Se utiliza ms en el
anlisis pero los errores pueden darse en cualquier fase. El manejo de errores es
una tarea difcil por dos motivos:

COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Introduccin
1. A veces algunos errores ocultan otros
2. Un error puede provocar una avalancha de errores que se solucionan con el
primero
Criterios a seguir a la hora de manejar errores
1. Pararse al detectar el primer error (conveniente para un compilador interactivo)
2. Detectar todos los errores de una pasada (conveniente para un compilador de
lnea)
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
El papel del analizador lxico
Es la primera fase del programa traductor
Es el nico que gestiona el fichero de entrada
Es el que lee los caracteres del programa fuente y construye smbolos
intermedios, los cuales sern la entrada del analizador sintctico
Por qu separar el anlisis lxico del sintctico?
El diseo de las partes posteriores dedicadas al anlisis queda simplificada
Con fases separadas se pueden aplicar tcnicas especficas y diferenciadas para
cada fase
Se facilita la portabilidad
Los componentes lxicos se especifican mediante expresiones regulares que
generan lenguajes regulares ms fciles de reconocer que los LLC
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
Errores Lxicos
El analizador lxico tpicamente detecta los siguientes errores:
El utilizar caracteres que no pertenecen al alfabeto del lenguaje
Encontrar una cadena que no coincide con ninguno de los patrones de los
tokens posibles
Posibles acciones que el analizador lxico puede llevar a cabo para recuperarse
de los errores
Ignorar los caracteres no vlidos hasta formar un token segn los patrones
dados
Borrar los caracteres extraos
Insertar un caracter que pudiera faltar
Reemplazar un caracter presuntamente incorrecto por uno correcto
Conmutar las posiciones de dos caracteres adyacentes
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
Funcionamiento del analizador lxico
Su principal funcin es procesar la cadena de caracteres y devolver pares
(token, lexema). Generalmente debe funcionar como una subrutina del analizador
sintctico.
Analizador
sintctico
Analizador
lxico
Tabla de
smbolos
Programa
fuente
token
Operaciones que realiza el analizador lxico
Procesador lxico del programa fuente e identificacin de tokens y de sus
lexemas
Manejo del fichero del programa fuente
Ignorar comentarios y en los lenguajes de formato libre, ignorar los
separadores
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
Cuando se produzca una situacin de error ser el analizador lxico el que site
el error en el programa fuente
Preproceso de macros, definiciones, constantes y rdenes de inclusin de otros
ficheros
El analizador lxico debe intentar leer siempre el token ms largo posible
Especificacin de un analizador lxico
Trminos comunes en esta fase: token, patrn, lexema y atributo
Ejemplo:
Token Lexema Patrn (ER)
Identificador cont, i, aux Let(let|dig)*
entero 178, -675 (+|-|e)digdig*
reservada for for

COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
Diagrama de Transiciones (DT)
Diferencias entre un DT y un AFD
Un AFD slo dice si la cadena de caracteres pertenece al lenguaje o no; un DT
debe funcionar como un analizador lxico, debe retornar el token ledo y debe
dejar el buffer de entrada listo para el siguiente llamado
Un DT no puede tener estados de absorcin ni de error
De los estados de aceptacin de un DT no deben salir transiciones
En el caso de las tiras no especficas, ncesitamos otro estado al que ir cuando se
lea un caracter que no pueda formar parte del patrn (caracteres de retroceso, se
indican con un * o ms dependiendel nmero de caracteres de retroceso)
Ejemplo: Reconocedor de enteros sin signo
0 1
0 1 2
[0-9]
[0-9]
[0-9]
[0-9]
otro *
Num_entero
AFD
DT
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
Atributos de los componentes lxicos
Cuando concuerda con un lexema ms de un patrn el AL debe proporcionar
informacin adicional sobre el lexema (atributos) p/e while es una palabra
reservada pero tambin concuerda con el patrn de identificador.
En la prctica los componentes lxicos suelen tener un solo atributo, un
apuntador a la entrada de la tabla de smbolos donde se guarda informacin
sobre los componentes lxicos.
Identificacin de palabras reservadas
Todas las palabras reservadas responden al mismo patrn que los
identificadores, pero son tokens diferententes a los identificadores.
Enfoques:
1. Buscar una solucin prctica
2. Integrar los DT de las PR en la mquina reconocedora
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
Pasos a seguir en la primera solucin:
Iniciar la tabla de smbolos con todas las palabras reservadas, PR, (por orden
alfabetico)
Cuando encuentra un token id, ir a la tabla donde se encuentran las PR y revisar si el
token es una PR, si la encuentra entonces el token es una PR; sino la encuentra,
entonces el token es un identificador el cual ser aadido a la tabla de smbolos
Segunda solucin:
Se utilizarn formalmente expresiones regulares y diagramas de transicin.
Problema: una PR puede ser un prefijo de un ID
Ejemplo:
0 1 2
L-i
L|D
otro
*
L=letra D=digito
otro=Caracteres-{L,D}
Id
3
i
4 5
*
f
otro
a 1
L-f|D
otro
a 2
PR_if
L|D
a 1
DT que revisa la PR if
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
Tabla de transicin
Forma general
Estado token retroceso
Entradas
Ejemplo: Obtener la tabla de transicion para el DT anterior
Entradas
Estado i f L D otro token retroceso
0 3 1 1 - - - -
1 1 1 1 1 2 - -
2 - - - - - Id 1
3 1 4 1 1 2 - -
4 1 1 1 1 5 - -
5 - - - - - PR_if 1
while ((Estado!= Final) || Error) Estado=TablaTransiciones[Estado, Entrada];
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Lxico
Implementacin de analizadores lxicos

1. Usar un generador automtico de analizadores lxicos (LEX)
Ventaja: comodidad y rapidez en el desarrollo
Desventaja: ineficiencia del analizador resultante y mantenimiento complicado

2. Escribir el AL en un lenguaje de alto nivel
Ventaja: ms eficiente
Desventaja: hay que hacerlo todo

3. Hacerlo en lenguaje ensamblador
Ventaja: mxima eficiencia
Desventaja: muy complicado de desarrollar

COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
Se puede describir la sintaxis de las construcciones de los LP por medio de
gramticas independientes del contexto o notacin BNF.
Una gramtica da una especificacin sintctica precisa y fcil de entender de un
LP
A partir de algunas clases de gramticas se puede construir automticamente un
analizador sintctico eficiente que determine si un programa fuente est
sintcticamente bien formado
Una gramtica diseada adecuadamente imparte una estructura a un lenguaje de
programacin til para la traduccin de programas fuente a cdigo objeto correcto
y para la deteccin de errores
Los lenguajes evolucionan con el tiempo, adquiriendo nuevas construcciones y
realizando tareas adicionales
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
La funcin del analiador sintctico
La principal tarea del analizador sintctico (o parser) no es comprobar que la sintaxis
del programa fuente sea correcta, sino construir una representacin interna de ese
programa y, en el caso de que sea un programa incorrecto, dar un mensaje de error.
A.L.
A.S.
Tabla de
smbolos
Resto de
etapas
Cdigo
fuente
token
siguiente
El A.S. constituye el esqueleto principal del compilador
Tipos de Analizadores Sintcticos
Ascendentes. Construyen rboles sintcticos a partir de las hojas y suben a la raz
Descendentes. Construyen rboles sintcticos de la raz a las hojas
En ambos casos se examina la entrada al A.S. de izquierda a derecha, un smbolo a la vez
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
Manejo de errores sintcticos
A menudo, gran parte de la deteccin y recuperacin de errores en un compilador se
centra en la fase de anlisis sintctico
Razones
La cadena de componentes lxicos no obedece las reglas gramaticales que definen al
L.P.
Precisin en los mtodos modernos de A.S.
El manejador de errores en un A.S. tiene objetivos fciles de establecer:
Debe informar de la presencia de errores con claridad y exactitud
Se debe recuperar de cada error con la suficiente rapidez como para detectar errores
posteriores
No debe retrasar de manera significativa el procesamiento de programas correctos
El manejador de errores debe informar de la presencia de un error, indicando el lugar
preciso en el programa, y si sabe cul es el error, se incluye un mensaje.
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
Opciones para implementar un parser
1. a mano
2. Utilizando un generador de analizadores sintcticos, por ejemplo YACC
Notacin EBNF
Extended Backus-Naur Form. Objetivo, reducir el nmero de producciones en las
gramticas. Notaciones adicionales.
1. Alternativas de una regla. Se utiliza el smbolo | para separar las distintas
posibilidades que definen al no terminal de la izquierda.
Ejemplo: Si Sa y SaSb entonces se escribe como S a | aSb
2. Llaves {}. Lo que aparece dentro de ellos se repite de cero a n veces.
Ejemplo: Linea_dec Tipo iden { , iden} ;
3. Llaves con repeticin especificada: { }
y
x
. Lo que aparece dentro de ellas se repite un
nmero de veces comprendido entre x e y.
Ejemplo: iden letra {digito | letra}
7
0
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
4. Corchetes:[]. Es un caso particular de 3 ({}
1
0
). Lo que esta dentro puede o no
aparecer.
Ejemplo: prop_if if condicion then bloque [else bloque]
Diseo de gramticas para lenguajes de programacin
1. Recursividad
Problema: Un compilador debe procesar correctamente un nmero infinito de
programas, pero por otra parte la especificacin sintctica de un lenguaje debe ser
finita.
Solucin: Recursividad
Estructura de la recursividad
1. Regla no recursiva que se define como caso base
2. Una o mas reglas recursivas que permiten el crecimiento a partir del caso base
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
Ejemplo: Gramtica para definir un nmero entero
Digito 0 |1|2||9
Entero Digito Entero Regla recursiva
Entero Digito Caso base
Definicin. Una gramtica es recursiva, si podemos derivar una tira en la que nos
vuelve a aparecer el smbolo no terminal que aparece en la parte izquierda de la regla de
derivacin. A oA|
A A| Recursividad izquierda
A oA Recursividad derecha
2. Ambigedad
Una gramtica es ambigua si el lenguaje que define contiene alguna sentencia que tenga
ms de un nico rbol de anlisis sintctico, es no ambigua cuando cualquier tira del
lenguaje que representa, tiene un nico rbol sintctico.
No es posible construir analizadores sintcticos eficientes para gramticas ambiguas.
No se disponen de tcnicas para saber si una gramtica es ambigua o no. La nica forma
de saberlo es encontrando una cadena con dos o ms rboles sintcticos distintos
Nota: En este caso la gramtica es
recursiva y el no terminal recursivo es
Entero
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
Algunas de las caractersticas que tiene las gramticas ambiguas son las siguientes:
Gramticas con ciclos simples o menos simples
S A | a
A S
Alguna regla con una forma
E E E
Un conjunto de reglas de forma parecida a:
S A | B
A B
Producciones recursivas en las que las variables no recursivas de la produccin
puedan derivar a la cadena vaca:
S HRS | s
H h |
R r |
Variables que puedan derivar a la cadena vaca y a la misma cadena de terminales, y
que aparezcan juntas en la parte derecha de una regla o en alguna forma sentencial:
S HR
H h |
R r | h |
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
Ejemplo: Sea la gramtica
S Aa | C
C S | Ac
A a
La tira aa tiene dos rboles sintcticos.
Para solucionar la ambigedad se deben modificar las reglas de
produccin de la gramtica
S
A a
a
S
C
S
A a
a
3. Asociatividad y precedencia de operadores
Asociatividad
La asociatividad de un operador se define cmo se operan tres o ms operandos.
Tipos de asociatividad:
Asociatividad izquierda (se evala de izquierda a derecha)
Asociatividad derecha (se evala de derecha a izquierda)
La asociatividad en una gramtica se refleja en el tipo de recursividad que se
emplea. Si la asociatividad del operador es por la izquierda, la regla sintctica en la que
interviene dicho operador debe ser recursiva por la izquierda; en el caso de
asociatividad por la derecha se utiliza recursin por la derecha.
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
Precedencia
La precedencia de un operador especifica el orden relativo de cada operador con
respecto a los dems operadores.
La precedencia en una gramtica se refleja de la siguiente manera: cuanto ms cerca
est la produccin de la del smbolo inicial, menor ser la precedencia del operador.
Parentizacin
Los parntesis son operadores especiales que tiene la mxima precedencia.
Para incluirlos en la gramtica, se aade una variable que produzca expresiones entre
parntesis y los operandos (nmeros, variables, etc.) a la mayor distancia posible del
smbolo inicial. En esta produccin se colocan los operadores unarios a no ser que
tengan una precedencia menor.
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico
Tipos de anlisis sintctico
Estrategias para construir el rbol sintctico:
Anlisis ascendente
Anlisis descendente
Ambas estrategias recorren la cadena de entrada de izquierda a derecha una sola vez, y
necesitan que la gramtica no se ambigua.
Para las GLC los algoritmos de anlisis sintctico tienen un coste de O(n
3
), por lo tanto
es necesario buscar subclases de gramticas que permitan un anlisis sintctico en orden
lineal.
Las estrategias anteriores son eficientes (tienen un coste lineal O(n)) pero no son
capaces de trabajar con todo tipo de gramticas. Algunas de las adecuadas son:
Anlisis LL(n)
Anlisis LR(n)
donde:
L Left to Right: la secuencia de tokens de entrada se analiza de izquierda a derecha
L Left-most (R = Right-most): utiliza las derivaciones ms a la izquierda (a la derecha)
n es el nmero de smbolos de entrada que es necesario conocer en cada momento para poder
hacer el anlisis.
.Se utilizan GLC
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Gramticas LL(1)
El anlisis sintctico descendente puede incluir retrocesos (backtracking), en la
prctica esto no es necesario.
Ejemplo:
S Ad
A ab | a Analizar la cadena de entrada cad
Analizadores Sintcticos Predictivos (ASP)
Para que el algoritmo tenga una complejidad lineal, siempre debe saber qu regla se
debe aplicar, no debe hacer backtracking. Por lo tanto, es necesario que el analizador
realice una prediccin de la regla a aplicar.
La alternativa apropiada debe poderse predecir slo con ver el primer smbolo que
produce.
Ejemplo:
Instruccion printf ( arg_escritura ); | scanf (arg_lectura); | id = asigna;
En este tipo de analizadores se utilizan las gramticas LL(1).
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Analizadores Sintcticos Predictivos = Analizadores Sintcticos Descendentes sin Retroceso.
Conjuntos de prediccin
Son conjuntos de tokens que ayudan a predecir qu regla se debe aplicar para la variable
que hay que derivar.
Para saber qu regla se debe aplicar en cada caso, el analizador consulta el siguiente
token en la entrada y si pertenece al conjunto de prediccin de una regla, aplica esa
regla; sino se produce un mensaje de error.
Las gramticas que pertencen al tipo LL(1) satisfacen lo siguiente:
La secuencia de tokens se analiza de izquierda a derehca
Utilizaremos la derivacin del no terminal que aparezca ms a la izquierda
Slo tendremos que ver un token de la secuencia de entrada para saber qu produccin
seguir.
Ejemplo:
Lista_variables id , Lista_variables | id No pertenece a las gramticas LL(1)
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Clculo de los conjuntos de prediccin
Los conjuntos de prediccin de una regla se calculan en funcin de los primeros
smbolos que puede generar la parte derehca de esa regla, y a veces en funcin de los
smbolos que pueden aparecer a continuacin de la parte izquierda de la regla en una
forma sentencial.
Los conjuntos de PRIMEROS Y SIGUIENTES contienen smbolos terminales.
Clculo del conjunto de PRIMEROS.
Definicin:
Si o es una forma sentencial compuesta por una concatenacin de smbolos,
PRIMEROS (o) es el conjunto de terminales (o ) que pueden aparecer iniciado
las cadenas que pueden derivar de o.
Definicin formal:
a e PRIMEROS(o) si a e (T {}) | - o * a| para alguna tira |.
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Reglas para el clculo del conjunto de los PRIMEROS
1. Si o e T, PRIMEROS(o)={o}
2. Si o e N:
Inicialmente, PRIMEROS(o)=C
Si aparece la produccin o , PRIMEROS(o)=PRIMEROS(o) {}
Si o a
1
a
2
a
n
entonces PRIMEROS(o)=PRIMEROS(o)
PRIMEROS(a
1
a
2
a
n
) y para el clculo de PRIMEROS(a
1
a
2
a
n
) pueden darse
dos casos:
Si e PRIMEROS(a
1
) entonces PRIMEROS(o) =PRIMEROS(o)
PRIMEROS(a
1
)
Si e PRIMEROS(a
1
) entonces PRIMEROS(o)= PRIMEROS(o)
(PRIMEROS(a
1
)-{}) PRIMEROS(a
2
a
n
) y de nuevo pueden darse
estos dos casos para PRIMEROS(a
2
a
n
) y siguientes, hasta a
n
.
Si I, e PRIMEROS(a
i
) entonces PRIMEROS(o)=PRIMEROS(o) {}
3. Para recoger todos los casos posibles habra que considerar que
Si o o
1
| o
2
| | o
n
entonces PRIMEROS (o) = PRIMEROS(o
i
)

n
i 1 =
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Clculo del conjunto de SIGUIENTES.
En este caso se aade una produccin inicial: X S$
Definicin:
Si A es un smbolo no terminal de la gramtica, SIGUIENTES(A) es el conjunto de
terminales que pueden aparecer a continuacin de A en alguna forma sentencial
derivada del smbolo inicial.
Definicin formal:
a e SIGUIENTES(A) si a e (T {$}) | - S * oAa| para algn par de tiras o, |.
Reglas para el clculo del conjunto de los SIGUIENTES
1. Inicialmente, SIGUIENTES(A)= C
2. Si A es el smbolo inicial, entonces SIGUIENTES(A)=SIGUIENTES(A) {$}
3. (s1) Para cada regla de la forma:
B oA| entonces SIGUIENTES(A)=SIGUIENTES(A) PRIMEROS(|)-{}
4. (s2) Para cada regla de la forma:
B oA o bien B oA| en la que e PRIMEROS(|) entonces
SIGUIENTES(A)=SIGUIENTES(A) SIGUIENTES(B)
5. Repetir los pasos 3 y 4 hasta que no se puedan aadir ms smbolos a SIGUIENTES(A)
Nota: Las reglas (s1) y (s2) no son excluyentes
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Clculo del conjunto PREDICT
La funcin PREDICT se aplica a producciones de la gramtica (A o) y devuelve
un conjunto, llamado conjunto de prediccin, que puede contener cualesquiera
terminales de la gramtica y el smbolo $, pero nunca puede contener .
Reglas para el clculo del conjunto PREDICT
PREDICT(A o) =
Si e PRIMEROS(o) entonces = (PRIMEROS(o)-{}) {SIGUIENTES(A)}
sino = PRIMEROS(o)
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
La condicin LL(1)
La condicin LL(1) es necesaria y suficiente para poder construir un ASDP para una
gramtica.
Dadas todas las producciones de la gramtica para un mismo no terminal:
A1| 2| | n e N
Se debe cumplir la siguiente condicin:
i,j (i=j) PREDICT(A i) PREDICT(A j) = u
Modificacin de gramticas no LL(1)
1.Eliminacin de la ambigedad
2. Factorizacin izquierda
A|1| |2|| |n| i
Sustituir por: A A| I
A |1| |2|| |n
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
3. Eliminacin de la recursividad izquierda
AA1| A2|| Am| |1| |2|| |n
Sustituir por: A |1A| |2A|| |nA| I
A 1A|2A|| mA|
Eliminacin de recursividad indirecta
Pasos:
1. Ordenar los no terminales segn A1.A2,,An
2. Desde I 1 hasta n hacer
Desde j1 hasta I-1 hacer
Sustituir cada AiAj por Aio1 | o2|| ok
donde Aj o1 | o2 | | ok son las producciones actuales de Aj
Eliminar la recursividad izquierda directa de la produccin de Ai
Fin_para
Fin_para
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Algoritmo de ejecucin del Analizador Descendente Dirigido por Tabla:
Entrada: cadena de elementos lxicos devueltos por el A.L.
Salida: producciones que construyen su rbol de anlisis sintctico
Pasos:
push($)
push(S)
Repetir
Sea A el smbolo en el tope de la pila
Sea a smbolo de preanlisis
Si A es un terminal o $ entonces
Si A = a entonces
pop(A)
a:= analex()
sino
Error sintctico (encontrado lexema, esperaba A)
finsi
sino /* Es un no terminal */
Si Tabla[A,a]=Ao1o2ok entonces
pop(A)
Desde I:=k hasta 1 hacer push(oI) findesde
sino
Error sintctico
finsi
Hasta A=$ /* La pila esta vaca */
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Traduccin dirigida por sintaxis
Una definicin dirigida por sintaxis es un instrumento que nos permite planear
las acciones que queremos que se realicen por el analizador gramatical al
cumplimiento de ciertas reglas gramaticales.
Ejemplo:
E E escribe(E.s)
E E opsr T E.s = concatena (E.s, T.s, opsr.o)
E T E.s = T.s
T T opmd F T.s = concatena (T.s, F.s, opmd.o)
T F T.s = F.s
F (E) F.s = E.s
F numero F.s = numero.s
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis semntico
Verificacin de Tipos
1 2 3 4
1 1 2
2 2 2
3
Multiplicar/Dividir
1 Entero
2 Real
3 Caracter
Declaracin de Funciones
a 2
b 2
c 3
x Fun+2
y Fun+1
a 0
b 0
w 2
c 2
a 2
b 1
Variable
Tipo
Argumentos
Apuntador
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis semntico
Cdigo intermedio
Iteracion -> MIENTRAS expresion REPITE orden FMIENTRAS
-> REPITE orden HASTA QUE expresion FREPITE
En el caso de MIENTRAS-REPITE:
Evaluar
expresin
Orden
Falsa?
no
si
2
3
1
Iteracion -> MIENTRAS (1)
expresion (2)
REPITE orden
FMIENTRAS (3)
(1)
inicio_mientras=Genera_etiqueta();
fin_mientras=Genera_etiqueta();
Escribe(inicio_mientras,:);
(2)
Escribe(CMP, Expresion.I,0);
Escribe(JZ,fin_mientras);
(3)
Escribe(JMP,inicio_mientras);
Escribe(fin_mientras,:);
Inicio_mientras
Cdigo de expresin
CMP Expresin,0
JZ fin_mientras
Cdigo de orden
JMP inicio_mientras
Fin_mientras
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Cdigo intermedio

En el caso de REPITE-HASTA:
Iteracion -> REPITE (1) orden
HASTA QUE expresion (2)
FREPITE
(1)
inicio_repite=Genera_etiqueta();
Escribe(inicio_repite,:);
(2)
Escribe(CMP, Expresion.I,0);
Escribe(JZ,inicio_repite);