Práctica 4: Compilador MINICOMP
Versión 8. Sentencias iterativas MIENTRAS y PARA.
- Añade la sentencia iterativa mientras. Su sintaxis será:
mientras condición hacer lista-de-sentencias fin
Aquí tienes un ejemplo de programa válido:
globales num: entero; fin secuencia num = 1; mientras num <= 10 hacer escribe num, " "; num = num + 1; fin fin
- Añade la sentencia iterativa para. Su sintaxis será:
para variable = expresion1 hasta expresion2 hacer lista-de-sentencias fin
El comportamiento del bucle debe ser el que ilustra la figura 1 de este control de Miniint del curso 2007/2008 y se especifica en ese enunciado, con cuatro diferencias: (i) cambiamos desde por el símbolo de la asignación; (ii) exigimos que la expresión inicial se evalúe antes que la expresión final; (iii) no obligamos al usuario a utilizar secuencia y fin para delimitar el cuerpo del bucle; y (iv) si la variable de control es una componente de un vector, exigimos que las expresiones de los índices se evalúen una sola vez.
Este primer ejemplo ilustra algunos de estos aspectos:
globales i : entero; fin secuencia para i = 100 hasta 500 hacer escribe i, " "; i = i * 2; // Se modifica la variable de control escribe i, " "; fin escribe "-> ", i, "\n"; fin
Al ejecutar este programa la salida debe ser la siguiente
100 200 201 402 403 806 -> 807
Es importante que tengas en cuenta que la evaluación de cualquier expresión puede tener efectos secundarios que hagan que el resultado de la ejecución del programa no sea el mismo si la expresión se evalúa varias veces, como ilustra este segundo ejemplo:
globales i, contador : entero; fin funcion IncrementaContador() : entero es secuencia contador = contador + 1; devuelve contador; fin secuencia contador = 0; para i = llama IncrementaContador() hasta 3 hacer escribe i, " "; fin escribe "contador=", contador, "\n"; para i = 0 hasta llama IncrementaContador() + 5 hacer escribe i, " "; fin escribe "contador=", contador, "\n"; fin
Al ejecutar este programa la salida debe ser la siguiente
1 2 3 contador=1 0 1 2 3 4 5 6 7 contador=2
Lo mismo sucede en los accesos a vectores con las expresiones de los índices, como ilustra este tercer ejemplo en el que se intenta reproducir lo que pasaría si el lenguaje tuviera el operador de auto-incremento y el usuario hiciera algo tan habitual en otros lenguajes como v[contador++]:
globales i, contador : entero; v : vector[2] de entero; fin funcion IncrementaContador() : entero es secuencia contador = contador + 1; devuelve contador; fin secuencia contador = 0; para v[0] = 100 hasta 102 hacer escribe v[0], "\n"; fin escribe v[0], "\n"; escribe "=========\n"; para v[llama IncrementaContador()] = 100 hasta 102 hacer escribe v[0], " ", v[1], "\n"; fin escribe v[0], " ", v[1], "\n"; fin
Al ejecutar este programa la salida debe ser la siguiente
100 101 102 103 ========= 103 100 103 101 103 102 103 103
Para conseguirlo, debes tener mucho cuidado con la forma en que usas las funciones generaCodigo y generaDir de la clase NodoAccesoVector. Observa que generaDir genera el código que evalúa las expresiones de los índices para calcular la dirección a la que queremos acceder, y que generaCodigo llama a generaDir. Piensa bien las consecuencias de que tu implementación llame a ambas o llame más de una vez a alguna de ellas, y ten eso presente en cualquier modificación futura del compilador. Si no entiendes esto, habla con tu profesor de prácticas.
Última actualización: 4 de mayo de 2010.