viernes, abril 22, 2005

Errores en Comentarios !!!

Aún no logro capturar bien estos errores, en el lexer tenia algo como:
COMMENT:
("/*") CUERPO ("*/")
|
CUERPO ("*/") {/*lazar error de encabezado sin cabeza*/}
|
("/*") CUERPO {/*lazar error de encabezado sin final*/}
;

pero creo que no esta bien porque aunque este bien el comentario entra al error, aun sigo trabajando en eso.

Análisis Semántico... Chequeo de Tipos

La siguiente parte del proyecto es la fase de análisis semántico,donde una de sus partes principales es el chequeo de tipos.
Para poder llevar a cabo dicho chequeo necesito por lo menos saber el tipo de la variable, o del valor a retornar de una funcion.
Esta semana comencé modificar mi tabla de simbolos para guardar mas informacion: lexema, tipo, tipo de token, posicion en el código fuente...; Ya que los analizadores anteriores no requerian almacenar tanta informacion.

Hasta donde he entendido, las reglas(código) de este análisis van en la clase parser, precisamente donde esta definida la gramática de MicroC, creo que asi porque debo realizar una accion por cada produccion de la G. Pero no se si estoy equivocada.

Pero aun estoy leyendo la "guia" y el libro del tigre para poder comenzar a ecribir código, espero este fin de semana sea mas produtivo que el anterior, cuando intentaba capturar los errores en los comentarios, se me arruino el proyecto, se quedaba colgado, compilaba pero cuando lo corria me "colgaba" la maquina, lo arregle gracias al Ingeniero, pero perdi tiempo.

viernes, abril 15, 2005

Laboratorio MIPS(SPIM)

- Cuando ejecuté el ejemplo ´Suma´ me di cuenta que hacer un "open" del archivo es hacerle un "load", y luejo solo hay que invocar "go" para que se ejecute.
La salida que produjo es la indicada en la descripcion del laboratorio.
Al principio me daba un error: No podia encontrar el archivo de exceptions.s ya que lo buscaba por default en la carpeta "Program Files" y yo tengo el Windows en español, y por lo tanto estaba en la carpeta "Archivos de Programa". Una vez le cambie la dirección funciono perfectamente.


- En la ejecucion paso a paso se entiende mejor el funcionamiento del programa.
QUe interesante poder observar la ejecucion detalladamente, asi los errores se
encuentran un poco mas fácil.
Una de las cosas que pude observar fue, que mientras no se haga un SYSCALL las
operaciones de I/O no se llevan a cabo, es decir esta instruccion viene a ser la
orden de ejecucion para el CPU.
Aunque hay partes que aun no entiendo del programa, ya que al verlo correr asi, se
ven todas las instrucciones en Asembler.
Necesito profundizar un poco mas en mi lectura para poder comprender al 100%.


- Para comprobar el valor de los registros, segun lo que leí en el documento, es con el comando "print" pero en las opciones disponibles no lo encontre. Talvez baje una version vieja de SPIM, la que instale es la v 7.1.

- Suma1.s ....
con este no tube mucho problema, solo le agrege unas pocas lineas:

-> un string adicional
cad3: .asciiz " y el producto de ambos es: "

-> una instrucion de multiplacion que guarda en un tercer registro $s3 el
-> producto de $s0 y$s1
mul $s3, $s0, $s1 # Se multiplican ambos números

-> un conjunto de intrucciones para imprimir el resultado, casi iguales a la
->provistas en suma.s con diferentes strings y registro de resultado.
addi $v0, $zero, 4
la $a0, cad3
syscall
# Se escribe el resultado2
addi $v0, $zero, 1
add $a0, $zero, $s3
syscall

- Suma2.s ....
Este ejemplo requiere un poco mas de trabajo, le agregue mas lineas:

-> dos strings adicionales
cad2: .asciiz "El menor de los números es:: "
cad3: .asciiz "Los dos numeros son iguales! "

-> tres instrucciones de comparacion, A=primer número leido, B=segundo
->número leido C=guarda comparaciones
beq $s0, $s1, if_iguales # Se verifica si los numeros son iguales
slt $s3 $s0 $s1 # Se verifica si A < B y setea C($s3) a 1 si
# es cierto, sino a 0
blez $s3, AmayorB # Se verifica si C <= 0. Si es A > B

# Si es A < B
addi $v0, $zero, 4
la $a0, cad2
syscall
# Se escribe el numero
addi $v0, $zero, 1
add $a0, $zero, $s0
syscall

b end_if # Salta statements

if_iguales:
# Se escribe el mensaje de igualdad
addi $v0, $zero, 4
la $a0, cad3
syscall
# Fin del programa.
addi $v0, $zero, 10
syscall

AmayorB:
addi $v0, $zero, 4
la $a0, cad2
syscall
# Se escribe el numero
addi $v0, $zero, 1
add $a0, $zero, $s1
syscall
end_if:



->Lo que hago, logicamente, es comparo si son iguales si es cierto ejecuto las
instruciones de la etiqueta if_iguales, sino comparo si A < B guardo
resultado, si no es cierto (1) ejecuta las instrucciones de etiqueta
AmayorB, sino imprime A es menor.


* En general no hubo dificultad para explorar y entender el emulador y el conjunto de instrucciones assembler, solo lo que normalmente le lleva a uno "asumir" una nueva herramienta, con la diferencia que esta me gusto mucho. Pero aun me falta profundizar mas.
Con lo que si tube problemas fue con bajar el documento, ya que los links estan malos, nunca pude bajar los pdf, baje los .ps y los pase a pdf.
*En general el laboratorio estubo interesante y entretenido.