miércoles, mayo 02, 2007

De regreso!!

Solo para afirmar una vez mas que la clase mas interesante que recibi en la universidad fue Compiladores, impartida por el mejor maestro Ing. Fucth; ahora que ya termine la carrera me llega leer este blog y recordar lo makina que fue llevar la clase aunque me desvelo y me saco canas verdes!! ;)

sábado, junio 18, 2005

Codigo Intermedio !

Aun no termino con Diseño que Colera !!! Pero el lunes salgo y me dedico a Compi en cuerpo y alma....
Bueno medio genero codigo intermedio, pero no me convence como lo estoy haciendo, asi que hoy me desvelo para cambiarlo, solo he estado trabajando a intervalos asi que no lo veo muy congruente.
Lo siento esta semana no hubo mucho avanzce..

viernes, junio 10, 2005

Stack Frames !!

Bueno esta semana he estado leyendo para implementar los stack frames en el proyecto, es bastante confuso de entender, por lo menos para mi.
Hasta donde sé, es como un "encabezado" que debo de colocar en cada funcion, tanto en el codigo intermedio como en Asembler, bueno creo que debe tener un tamaño fijo de n(multiplo de 8).
Para la generacion de codigo intermedio tengo pensado tener un arreglo(los quads) o talvez una clase para cada vez que necesite generar un quad, instanciarla.
No he programado mucho porque mi Clase de Diseño de Sistemas me ha consumido todo el tiempo, me arrepiento de haberlas metido juntas ya que me parece que Diseño me quita tiempo valioso de compi.. que mal me hubiera gustado aprobechar mejor la clase, realmente me gusta.

viernes, junio 03, 2005

Generación de Codigo Intermedio !!

Esta es la parte mas interesante del compilador, porque debemos diseñar dicho codigo de manera que la traudcción a Código objeto sea fácil.
Para implementar esta etapa, pienso hacer uso(estoy en pruebas) de un arreglo de quads, donde se almacena el código generado por cada una de las producciones de la gramática. Dicho arreglo será recorrido linealmente para la generación del código objeto (assembler para MIPS).

Lo único que es un poco indeficiente ya que tengo que declarar un arreglo muy grande, estoy pensando guardarlo mejor en un archivo de texto.

Para la generacion de cada una de las etiquetas, seran generadas secuencialmente,sin reutilizarlas. En el caso de las variables temporales que voy a necesitar seran declaradas 10 variables de t0-t9 para un paso directo a MIPS.

viernes, mayo 27, 2005

Pequeño Error!!!

Creo que estaba un poco confundida con el chequeo de tipos.. crei necesitar el AST para eso pero la verdad solo implica eso chequear los tipos; y no acarrear el resultado de las operaciones.
Por cierto tengo una duda, cuando encuentra constantes String, no debe permitirse hacer las operaciones de expresion (+,-,/,*,), pero si debe aparecer en los printf y puts.. mmm debo solventar eso..

El chequeo lo implemente retornando de cada produccion su tipo, algo como:
:
:
factor returns [int tipo=9;]:
tipo=constant
|
;

constant returns [int tipo=9;]: // inicializacion
STRING_CONST^ {tipo=4;}
| INT_CONST^ {tipo=1;}
| CHAR_CONST {tipo=0;}
;

y asi hasta arriba, lo que chequeo es que tengan el mismo tipo, sino lanzo un error, pero esto llega al nivel mas alto.. expression

expression returns [int tipo=9;]{int ta=9, tb=9;}:
ta=equalityExp tb=expressionP
{
if (ta==1 & tb==1)tipo=1;
if (ta==0 & tb==0)tipo=0;
}
;
y los stament estan compuestos por expresiones cuando llega aquí, ya se chequeo el tipo en realidad, solo tengo que repetir el mismo procedimiento para subir a los siguientes niveles.

- Estuve leyendo sobre MIPS (el apendice).... y la verdad como dijo el Ing, es muy dificil usar esos árboles de ANTLR prefiero usar codigo de 3 direcciones para la representacion Intermedia, en eso trabajo ahora, paralelamente a la conclusion del chequeo de Tipos.
(Y haciendo un pequeño parentésis.. esta SUPER BUENA Episodio III, me gusto bastante, sé que debo trabajar en el Proy pero tenia que verla. ;))

viernes, mayo 20, 2005

Proyecto... Un dia Lluvioso :(

Del trabajo atrasado de la semana pasada pude avanzar en el acarreo de tipos y valores, ya que la parte que no sabia como implementar era exactamente donde guardar la informacion, bueno ahora extendi el Tree Parser generado en la clase parser y copie unicamente las reglas que implican las expresiones(suma, resta, mult,div), cada regla devuelve un valor, y donde estan los operadores se efectua la operacion correspondiente.
En cada regla se declaran las variables necesarias para la operacion.
Aun no lo pruebo, ya escribi las acciones, pero aproveche que dejo de llover un rato, para venir a subir esto, ya que no sabia si despúes tendría otra oportunidad de no mojarme tanto ;).

Tambien he estado buscando y probando ejemplos de Asembler,espero mañana subir un mayor avance.

jueves, mayo 12, 2005

Semántica del Proyecto ....

Entre los pocos avances que tuve esta semana estan:
- Verificación de #parametros < 4
- Identificación de los siguientes puntos en el chequeo de tipos (expresiones):
1) Si el tipo de cualquiera de los dos operandos es erróneo, entonces el tipo de la expresión es erróneo.
2) En las asignaciones el tipo que se pasa al padre es vacio, que lo he definido como un token mas del lexer.
3) En las comparaciones el tipo es vacio, deberia ser booleano, pero MicroC solo soporta 2 tipos básicos: int, char.
4) En las operaciones suma,resta,multiplicación,divisón los dos operandos deben poseer el mismo tipo y la expresion tendrá ese mismo tipo; pero hay algo que me confunde, la Gramatica permite efectuar todas estas operaciones sobre Constantes char y string. entonces, ¿es permitido realizar algo como: char_constant / char_constant ? creo que no, pero nose como ni donde manejar este caso...
5) Debemos también, en este caso establecer cuando son Obligatorios los Lvalue y Rvalue.
6) Por el momento las expresiones deben acarrear dos atributos: tipo y valor, para mantener la coherencia de las operaciones y poder mostrar en resultado.


- Se me hizo muy dificil mover el manejo de errores a otra clase, estuve colocando algunas de las acciones del analizador semantico, no fue muy bien. Espero avanzar un poco mas este fin.

- Por cierto, estuve pensando un poco en el código de asembler que debemos ejecutar, mas que todo como vamos a correr el código de SPIM en Java?