You are on page 1of 9

PROGRAMA DE COMPILADORES

1. Introduccin
1.1. Tipos de traductores
1.2. Autmatas
1.3. Gramticas formales
1.4. Fases de un compilador
2. Anlisis Lxico
2.1. Definir un reconocedor de cadenas no trivial
2.2. Programar sistemticamente el reconocedor en lo referente a la
obtencin del autmata, almacenarlo eficientemente y manejar
adecuadamente el archivo fuente
2.3. Utilera LEX
2.4. Notaciones y nomenclatura en LEX
2.5. Programacin LEX del mismo reconocedor
2.6. Comparacin de dos tipos de tcnicas
3. Anlisis Sintctico
3.1. Parsers LR
3.2. Gramticas LR
3.3. Mtodos SLR, LR cannico, LARL
3.4. Construccin de tablas de anlisis SLR, LR cannico y LARL
3.5. Manejo de gramticas ambiguas
3.6. Recuperacin de errores
3.7. Empleo de YACC
3.8. Notacin de YACC
3.9. Manejo de errores en YACC
4. Problemas de Implementacin
4.1. Estrategias de acceso a memoria. Tcnicas de acceso dinmico
4.2. Acceso a nombres no locales, bloques, alcance
4.3. Paso de parmetros
4.4. Tablas de datos, hashing, representacin del alcance. Diferentes tipos
de tablas
5. Generacin de Cdigo Intermedio
5.1. Representaciones de cdigo intermedio
5.2. Generacin de cdigo intermedio y anlisis semntico en compilacin
top-down
5.3. Generacin de cdigo intermedio y anlisis semntico en compilacin
bottom-up
5.4. Instrucciones de asignacin. Expresiones booleanas. Instrucciones de
control. Instrucciones de entrada y salida

6. Generacin de Cdigo
6.1. Aspectos generales de la generacin de cdigo. Manejo de memoria
6.2. Seleccin de instrucciones. Acceso de registros
6.3. Aspectos relacionados con la mquina anfitriona
6.4. Bloques bsicos y grficas de flujo
6.5. Grficas dirigidas acclicas
6.6. Algoritmos para generacin de cdigo
6.7. Generacin de cdigo en YACC
7. Optimizacin de Cdigo
7.1. Optimizacin de cdigo
7.2. Optimizacin de cdigo intermedio
7.3. Fuentes principales de optimizacin. Subexpresiones comunes
7.4. Propagacin de copias. Eliminacin de cdigo muerto. Ciclos
7.5. Optimizacin de bloques bsicos
7.6. Ciclos de grfica de flujo
7.7. Anlisis de flujo de datos
8. Proyectos
8.1. Definicin del proyecto
8.2. Anlisis y diseo del compilador

BIBLIOGRAFA
1. Compilers: Principles, Techniques and Tools.
A.V. Aho, M.S. Lam, R. Sethi, J.D. Ullman.
Addison-Wesley; 2nd edition (August 31, 2006)
Se encuentra en las bibliotecas: FISMATIN-Xalapa y ECONOMIA-Xalapa.
(QA76.76.C65 A36)
2. Compilers: Construction for Digital Computers
D. Gries.
Wiley International Edition.
Se encuentra en las bibliotecas: USBI-Xalapa, FISMATIN-Xalapa y
MIA-Xalapa (QA76.5 G74).
3. The Theory and Practice of Compiler Writing.
L.P. Tremblay, P.G. Serenson.
McGraw Hill (1985).
Se encuentra en la biblioteca: ECONOMIA-Xalapa. (QA76.6 T73)

4. Machines, Languages and Computations.


P.J. Denning, J.B. Dennis, J.E Qualitz.
Prentice Hall (July 1978).
Se encuentra en la biblioteca: INVESBIO-Xalapa. (QA267.D46)
5. Theory of Computation: Formal Languages, Automata and
Complexity.
J. Glenn
Benjamin/Cummings Series in Computer Science (January 1989).
Se encuentra en las bibliotecas: USBI-Xalapa y ECONOMIA-Xalapa.
(QA267.B76)
6. Fundamentos de Compiladores: Cmo Traducir al Lenguaje Mquina.
Karen A. Lemone.
Editorial Continental.
Se encuentra en las bibliotecas: USBI-Xalapa, FISMATIN-Xalapa y
ECONOMIA-Xalapa. (QA76.76.C65 L45)
7. Construccin de Compiladores: Principios y Prctica.
Kenneth C. Louden.
San Jose State University.
Ed. Thomson (2004).
Se encuentra en la biblioteca: USBI-Xalapa y ECONOMIA-Xalapa.
(QA76.76.C65 L68 C6).
8. Engineering a Compiler.
Keith D. Cooper and Linda Torczon.
Morgan Kaufman; 1st edition (September 2003).
9. Introduction to the Theory of Computation (Second Edition)
Michael Sipser.
Ed. Thomson (2006).

EVALUACIN

Dos exmenes parciales (20% cada uno)


Programas computacionales (Proyecto)
Participacin en clase (individual y equipo),
Dicha participacin incluye trabajos de
investigacin redactados de forma adecuada
Prcticas individuales y por equipo

-------------------

40%
40%
10%

-------

10%

Importante:
-

Para poder exentar el examen ordinario, la mnima calificacin parcial


deber ser de 8. Dicha calificacin estar conformada por cada uno de
los criterios de evaluacin arriba descritos.
Para tener derecho a presentar los exmenes parciales, debern cubrir
como mnimo el 80% de las asistencias. Se pasar lista 15 minutos
despus de iniciar la clase. Pasado este tiempo, si el estudiante no est
presente, se considerar inasistencia (no se consideran retardos).
La fecha de entrega de los programas computacionales ser
exclusivamente los siguientes das: la primera parte del proyecto
deber entregarse el 22 de Abril de 2009 y la segunda parte el 15 de
Junio de 2009 durante la clase. No se recibirn programas enviados va
electrnica.
Para integrar la calificacin de las personas que presenten examen
ordinario, se promediar la calificacin de dicho examen con sus
participaciones, prcticas y programas computacionales entregados
durante el curso. En otras palabras, el examen ordinario valdr un
mximo de 40% de la calificacin final mientras que el 60% restante
estar integrado por los criterios de evaluacin arriba descritos.
En el examen extraordinario se aplicar el criterio anterior.
El reporte escrito de los programas computacionales, deber contener
los siguientes puntos.
1. Introduccin. En esta seccin se deber proporcionar el contexto del
problema.
2. Planteamiento del problema. En esta seccin se describir el
problema a resolver.
3. Solucin
Anlisis. En esta seccin se identificarn las posibles soluciones
al problema.
Diseo. En esta seccin se propondrn los mtodos para
solucionar el problema.

4. Pruebas y Discusin. En esta seccin se presentarn los resultados


de la implementacin as como un amplio y profundo anlisis de los
mismos.
5. Conclusiones. En esta seccin se presentarn las resoluciones
obtenidas a partir del estudio y solucin del problema propuesto.
6. Referencias. Esta seccin contendr la lista de referencias
bibliogrficas utilizadas para la presentacin de los puntos
anteriores.

Descripcin del Proyecto (Tomado del libro Construccin de compiladores:


principios y prctica. Autor: Kenneth C. Louden. Pginas: 491 a 501).
Convenciones Lxicas de C
1) Las palabras clave o reservadas del lenguaje son las siguientes:
else if int return void while.
Todas las palabras reservadas o clave estn reservadas, y deben ser
escritas en minsculas.
2) Los smbolos especiales son los siguientes:
+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */
3) Otros tokens son ID y NUM definidos mediante las siguientes expresiones
regulares:
ID = letra letra*
NUM = digito digito*
letra = a|....|z|A|.....|z
digito = 0|....|9
Se distingue entre letras minsculas y maysculas.
4) Los espacios en blanco se componen de blancos, retornos de lnea y
tabulaciones. El espacio en blanco es ignorado, excepto cuando deba
separar ID, NUM y palabras reservadas.
5) Los comentarios estn encerrados entre las anotaciones habituales del
lenguaje C /*....*/. Los comentarios se pueden colocar en cualquier lugar
donde pueda aparecer un espacio en blanco (es decir, los comentarios no
pueden ser colocados dentro de los token) y pueden incluir ms de una
lnea. Los comentarios no pueden estar anidados.

Sintaxis y Semntica de C
Una gramtica BNF para C es como se describe a continuacin:
1) program  declaration-list
2) declaration-list  declaration-list declaration | declaration
3) declaration  var-declaration | fun-declaration
4) var-declaration  type-specifier ID ; | type-specifier ID [ NUM ] ;
5) type-specifier  int | void
6) fun-declaration  type-specifier ID ( params ) compound-stmt
7) params  param-list | void
8) param-list  param-list , param | param
9) param  type-specifier ID | type-specifier ID [ ]
10) compound-stmt  { local-declarations statement-list }
11) local-declarations  local-declarations var-declarations | empty
12) statement-list  statement-list statement | empty
13) statement  expression-stmt | compound-stmt | selection-stmt |
iteration-stmt | return-stmt
14) expression-stmt  expression ; | ;
15) selection-stmt  if ( expression ) statement
| if ( expression ) statement else statement
16) iteration-stmt  while (expression) statement
17) return-stmt  return ; | return expression ;
18) expression  var = expression | simple-expression
19) var  ID | ID [ expression ]
20) simple-expression  additive-expression relop additive-expression |
additive-expression
21) relop  <= | < | > | >= | == | !=
22) additive-expression  additive-expression addop term | term
23) addop  + | 24) term  term mulop factor | factor
25) mulop  * | /
26) factor  (expression) | var | call | NUM
27) call  ID (args)

28) args  arg-list | empty


29) arg-list  arg-list , expression | expression

Programas de Muestra en C
El siguiente es un programa que introduce dos enteros, calcula su mximo comn
divisor y lo imprime:
/* un programa para realizar el algoritmo de euclides
para calcular mcd */
int gcd(int u, int v){
if (v==0) return u;
else return gcd (v, u-u/v*v);
}
void main (void){
int x; int y;
x=input( ); y=input( );
output(gcd(x,y));
}
A continuacin tenemos un programa que introduce una lista de 10 enteros, los
clasifica por orden de seleccin, y los exhibe otra vez:
/* un programa para realizar ordenacin por seleccin
en un arreglo de 10 elementos */
int x[10];
int minloc (int a[], int low, int high) {
int i; int x; int k;
k = low;
x = a[low];
i = low+1;
while (i<high){
if (a[i] < x) {
x = a[i];

k = i;
}
i = i+1;
}
return k;
}
void sort (int a[ ], int low, int high){
int i; int k;
i = low;
while ( i< high-1) {
int t;
k = minloc (a, i, high);
t = a[k];
a[k] = a[i];
a[i] = t;
i = i+1;
}
}
void main (void){
int i;
i = 0;
while (i < 10) {
x[i] = input( );
i = i+1;
}
sort (x,0,10);
i = 0;
while (i < 10) {
output (x[i]);
i = i+1;
}

}
Primera Parte del Proyecto (fecha de entrega: 22 de abril):
1) Implementar una utilera de tabla de smbolos adecuada para el lenguaje
C. Esto requerir una estructura de tabla que incorpore informacin de
mbito, ya sea como tablas separadas vinculadas en conjunto o con un
mecanismo de eliminacin que funcione de manera basada en pilas,
como se describi en el capitulo 6. (Construccin de compiladores:
principios y prctica. Autor: Kenneth C. Louden.)
2) Implemente un analizador lxico de C, ya sea a mano como un DFA o
utilizando Lex, como se describio en el captulo 2. (Construccin de
compiladores: principios y prctica. Autor: Kenneth C. Louden.).

Segunda Parte del Proyecto (fecha de entrega: 15 de junio):


1) Disee una estructura de rbol sintctico para C apropiada para la
generacin mediante un analizador sintctico.
2) Implemente un analizador sintctico de C (esto requiere un analizador
lxico de C), ya sea a mano utilizando parsers LR o mediante el uso
de Yacc, como se describi en el capitulo 4 5. (Construccin de
compiladores: principios y prctica. Autor: Kenneth C. Louden.)
Y si el tiempo lo permite (20% extra de la calificacin final):
1) Implemente un analizador semntico para C. El requerimiento principal
del analizador, adems de obtener informacin en la tabla de smbolos, es
realizar verificacin de tipo en el uso de variables y funciones. Como no hay
apuntadores o estructuras, y el nico tipo bsico es el entero, los tipos que
necesitan ser tratados mediante el verificador de tipo son los tipos void,
integer, array y function.
2) Implemente un generador de cdigo para C, de acuerdo con el ambiente
de ejecucin descrito en la seccin A.4. ((Construccin de compiladores:
principios y prctica. Autor: Kenneth C. Louden)

You might also like