Friday, April 22, 2005

Comentario Segunda Semana Compiladores2

Sobre esta semana se nos asigno una tarea del capitulo 6 y no logre realizar los ejercicios 6.1 parte c) ni los ejercicios 6.2 y 6.5, el 6.1 c) y el 6.2 por no saber que hacer con lo que se pedia y con el 6.5 por no poder utilizar el esquema de la seccion 6.2 de calculos de tipos de las expresiones, espero poder realizarlos mas adelante y comprenderlos.

Friday, April 15, 2005

Comentario Primer Semana Compiladores2 Gramatica de Comentario

Lo de modificar el comentario si se abre /* pero no se cierra puedo capturar el error desde el main diciendo que hubo un error en el parsing si no hay comentario que abre y solo comentario que cierra */ el mensaje que pude desplegar fue en el main diciendo que hubo un error en el lexer lo raro es que me dice que esperaba un }, pero si se escribe esto: /*/*int a*/ funciona ya que el segundo /* queda como comentario, si se escribe esto /*/*int a*/*/ no funciona y me desplega un error del lexer diciendo que se encontro un * y se esperaba otra cosa.
COMENTARIO: "/*"
(('*' NEWLINE) => '*' NEWLINE //Nueva Linea
|('*' ~('/'|'\n'|'\r')) => '*' ~('/'|'\n'|'\r') //Modificada
|NEWLINE
|~('\n'|'\r'|'*'))*
"*/"
{$setType(Token.SKIP);}
;

Comentario Primer Semana Compiladores2 Laboratorio1

El laboratorio me dejo con mucas curiosidad y pica acerca de como usar MIPS, la forma de las instrucciones y poder aprenderselas.

Primer Punto (step)
sobre el programa suma.s y que luego de correrlo probarlo con esta opcion del menu llamada step, que es como un debugger(creo), lo inteserante de esto es que me permitio observar las lineas de codigo que se estan ejecutando y que es lo esta haciendo en ese momento y ademas darme cuenta de los posibles errorres que se hayan cometido en el algoritmo ya sea de escritura o logicos, ademas que me sirvio para orientarme de como se maneja este lenguaje ya que las instrucciones son completamente desconocidas para mi, pero ya estoy descubriendo la forma de usarlas y creo que sabiendo usar muy bien a de ser un lenguaje muy facil de impletar, claro esta sabiendo bien todos los comandos que pose ey la forma de implementarlos.

Segundo Punto(suma1.s)
Acerca de imprimir ademas de la suma tambien la multiplicacion de los numeros que se introduce.
En esta parte tuve problemas en hacer los saltos de linea no los encuentro por ningun lado porque la forma que dedusco que se usa en el ejemplo dado es que se espera un red_in que es la siguiente instruccion
addi $v0, $zero, 5
syscall
con los pasos de step anteriormente explicado pude descubrir que de lo anterior se espera una lectura y hay que presionar enter sino no hace lo que pensaba , tambien probe escribiendo dos syscall seguidos pero para mi sorpresa es que de esa forma lo que hace es que imprime dos veces la misma operacion, y luego de muchos intentos por lograr resolver esto se me ocurrio imprimir un espacio y que todo
quedara en la misma linea, pero vino el otro problemita, como hacer para imprimir un espacio?, busque algo que me indicara como imprimir un espacio o letra pero tampoco tuve exito y lo que termine haciendo fue que en la parte de las declaraciones del .data cree una variable que lo unico que tiene es un espacio en blanco y luego de imprimir la suma imprimo ese espacio en blanco, para luego imprimir la multiplicacion, es por esto que es el comentario anterior escribi que estoy con pica de como resolver estas situaciones, claro esta me hace falta buscar mucho en internet acerca de esto, ya que hay muchas posibilidades que alli encuentre una forma mas sencilla y optima de realizar esto, a continuacion el codigo:

.data
cad0: .asciiz "Introduzca un número entero: "
cad1: .asciiz "Introduzca otro número entero: "
cad2: .asciiz "La suma de ambos es: "
cad3: .asciiz "La multiplicacion de ambos es: "
cad6: .asciiz " "
cr: .byte 13,10,0
.text
main:
# Se escribe el string pidiendo el primer número
addi $v0, $zero, 4
la $a0, cad0
syscall
# Se lee el primer número
addi $v0, $zero, 5
syscall
add $s0, $v0, $zero # Se guarda el número en $s0
# Se escribe el string pidiendo el segundo número
addi $v0, $zero, 4
la $a0, cad1
syscall
# Se lee el segundo número
addi $v0, $zero, 5
syscall
add $s1, $v0, $zero # Se guarda el número en $s1
add $s2, $s0, $s1 # Se suman ambos números
mul $s3, $s0, $s1 # Se multiplican ambos números
# Se escribe el mensaje de string previo al resultado
addi $v0, $zero, 4
la $a0, cad2
syscall
# Se escribe el resultado
addi $v0, $zero, 1
add $a0, $zero, $s2
syscall
#dejar un espacio
addi $v0, $zero, 4
la $a0, cad6
syscall
# Se escribe el mensaje de string previo al resultado de la multiplicacion
addi $v0, $zero, 4
la $a0, cad3
syscall
# Se escribe el resultado de la multiplicacion
addi $v0, $zero, 1
add $a0, $zero, $s3
syscall
#dejar un espacio
addi $v0, $zero, 4
la $a0, cad6
syscall

# Se escribe un return al final
addi $v0, $zero, 4
la $a0, cr
syscall
# Fin del programa.
addi $v0, $zero, 10
syscall


Tercer Paso(suma2.s)
Acerca de imprimir el menor de los 2 numeros ingresados.
En esta parte la vi bien sencilla luego de observar el ejemplo sugerido pero me asuste un poco a la hora de la implementacion ya que cuando es verdadera una proposicion en el bloque if imediatamente se resuelve y luego la parte negativa pero en este lenguaje es al reves primero la parte negativa y luego una bandera para realizar la parte positiva, y me preocupo porque dije: esto va a estar mas dificil de lo que pensaba, pero en realidad solo tuve que observar mas detenidamente el ejemplo y ver como lo resolvia yo para darme cuenta de como en realidad funciona el
bloque if, que se maneja diferente a lo que me habian enseñado con los demas lenguajes de programacion que se.
No se si este ejercicio consistia en verificar que si 2 numeros ingresados podian ser iguales ya que solo dice verificar cual es el menor, pero luego de haber comprendido como funciona este bloque de desiciones no fue dificil verificar si ambos numeros so iguales y se desplega un mensaje indicando que los 2 numeros ingresados son iguales, a continuacion el codigo:

.data
cad0: .asciiz "Introduzca un número entero: "
cad1: .asciiz "Introduzca otro número entero: "
cad2: .asciiz "La suma de ambos es: "
cad3: .asciiz "La multiplicacion de ambos es: "
cad4: .asciiz "El menor de ambos numeros es: "
cad5: .asciiz "Ambos numeros son iguales: "
cad6: .asciiz " "
cr: .byte 13,10,0
.text
main:
# Se escribe el string pidiendo el primer número
addi $v0, $zero, 4
la $a0, cad0
syscall
# Se lee el primer número
addi $v0, $zero, 5
syscall
add $s0, $v0, $zero # Se guarda el número en $s0
# Se escribe el string pidiendo el segundo número
addi $v0, $zero, 4
la $a0, cad1
syscall
# Se lee el segundo número
addi $v0, $zero, 5
syscall
add $s1, $v0, $zero # Se guarda el número en $s1
add $s2, $s0, $s1 # Se suman ambos números
mul $s3, $s0, $s1 # Se multiplican ambos números
# Se escribe el mensaje de string previo al resultado
addi $v0, $zero, 4
la $a0, cad2
syscall
# Se escribe el resultado
addi $v0, $zero, 1
add $a0, $zero, $s2
syscall
#dejar un espacio
addi $v0, $zero, 4
la $a0, cad6
syscall
# Se escribe el mensaje de string previo al resultado de la multiplicacion
addi $v0, $zero, 4
la $a0, cad3
syscall
# Se escribe el resultado de la multiplicacion
addi $v0, $zero, 1
add $a0, $zero, $s3
syscall
#dejar un espacio
addi $v0, $zero, 4
la $a0, cad6
syscall

#verificar quien es el menor
beq $s0, $s1, elspart
blt $s0, $s1, elsepart
# Se escribe el mensaje de string de cual es el menor
addi $v0, $zero, 4
la $a0, cad4
syscall
# Se escribe el resultado del menor
addi $v0, $zero, 1
add $a0, $zero, $s1
syscall
b endif
elsepart:
# Se escribe el mensaje de string de cual es el menor
addi $v0, $zero, 4
la $a0, cad4
syscall
# Se escribe el resultado del menor
addi $v0, $zero, 1
add $a0, $zero, $s0
syscall
b endif
endif:
b end_if
elspart:
# Se escribe el mensaje de string de cual es el menor
addi $v0, $zero, 4
la $a0, cad5
syscall
# Se escribe el resultado del menor
addi $v0, $zero, 1
add $a0, $zero, $s0
syscall
b end_if
end_if:

# Se escribe un return al final
addi $v0, $zero, 4
la $a0, cr
syscall
# Fin del programa.
addi $v0, $zero, 10
syscall


Me agrada que se nos den trabajos que podamos resolverlos (incluida una ayudadita)
como los ejemplos sugeridos, y que no solo es copiarlos y ver que hace, sino que uno busca a resolver algo y a investigar y hasta quebrarse la cabeza de como realizar algunas cosas, me imagino que otros compañeros habran encontrado otras formas de resolver esto y problamente mejores que las mias, pero me agradan los laboratorios que se nos han asignado, lo curioso es que uno ya se cree el gran programador y trata de realizar algunas cosas sin saber como funcionan tal fue mi caso que no sabia el porque al imprimir se hace uso de numero del 1-10 hasta que lei detallamente el archivo de word en donde se nos explica como hacer funcionar MIPS y los ejercicios a resolver, ya que alli se encuentra una tablita que explican que numero escribir dependiendo lo que se quiera imprimir un 1 para enteros un 4 para string y otros, de los cuales yo queria escribir cualquiera y no funcionaban los ejercicios hasta que lei bien, cual usar para que necesidad.

Sobre la direccion ftp proporcionada nunca pude bajar el compilador asi que procedi
a utilizar el compilador proporcionado en el CD que se dio en compiladores1.