Procesadores de Lenguaje - UJI - Curso 2009/2010 - Prácticas

Práctica 4: Compilador MINICOMP

Versión 8. Sentencias iterativas MIENTRAS y PARA.

  1. 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
    

  2. 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.

Aclaración para estudiantes repetidores: Respecto del curso pasado hemos añadido la sentencia iterativa para, que el curso 2008/2009 era un ejercicio de teoría realizable opcionalmente en prácticas y el curso 2007/2008 era la versión 14.

Última actualización: 4 de mayo de 2010.