domingo, diciembre 04, 2005

Código Intermedio

Código Intermedio

Para generar el código intermedio se cuenta con una clase que simula una tabla (la tabla es guardada en memoria). La tabla esta estructurada con los siguientes elementos: Operador, Argumento1, Argumento2 y Resultado (cada elemento es del tipo ArrayList), al recorrer la gramática en la tabla se van almacenando información (esta información es manejada de acuerdo a los estándares del programador) que después será utilizada para generar el código Mips,
X=2+5
Oper: “:=#” -- Arg1:”2” -- Arg2:”” -- Resol:”$t0”
Oper: “:=#” -- Arg1:”5” -- Arg2:”” -- Resol:”$t1”
Oper: “operplus” -- Arg1:”$t0” -- Arg2:”$t1” -- Resol:”$t2”

Hasta el momento el código intermedio funciona para realizar traducciones de Código Mips para sumas, multiplicaciones, divisiones, restas, leer entero, escribir string, escribir entero, asignaciones, llamar funciones o procedimientos, pasar parámetros, detectar si existen arreglos (entero o char).

Preguntas sobre el proyecto de compiladores

1 pregunta:
program ejemplo();
     var x,y : integer;
     function suma(n,m:integer):integer;
          begin     
         x := 5; //Asigno 5 a x
               suma:=n+m
          end;
begin
     y:=suma(5,5);
     writeint( x )  // debería imprimir 5
     writeint( y )  // debería imprimir 10
end.

Cómo hago para guardar el valor 5 en la variable x, la cual es global.
En MIPS x esta representada como:
x: .word 0 ( el valor de x es 0, pero yo quiero saber como guardar el valor 5 cuando se le asigna a x, y ya el valor de x no seria 0 sino que 5. Esto debería pasar también con la variable y (debería almacenar la suma – 10)

2 pregunta:
Con la instrucción readchar, como hacer para leer el carácter.

#---------- Leer número ----------
addi $v0, $zero, 5
syscall
add $s0, $v0, $zero # $s0 almacena el numero

#---------- ¿Leer char? ----------

3 pregunta:
Con la instrucción writechar, como hacer para escribir el carácter.

#---------- Escribir número ----------
addi $v0, $zero, 1
add $a0, $zero, $t0
syscall

#---------- ¿Escribir char? ----------