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

Práctica 4: Compilador MINICOMP

Versión 10. Funciones.

  1. Haz las modificaciones necesarias para poder utilizar en las funciones variables locales y parámetros de tipo real, y para especificar que una función devuelve un resultado de tipo real. Un ejemplo de programa válido sería:
    funcion area_triangulo(base, altura: real): real
    es
    secuencia
       devuelve base*altura/2;
    fin
    
    secuencia
       escribe llama area_triangulo(3.0, 5.0);
    fin
    

    Realiza también las modificaciones necesarias para llevar a cabo una promoción implícita de entero a real en las siguientes situaciones:

    • en una llamada a función con un argumento entero para un parámetro real, y
    • en una sentencia devuelve con expresión de tipo entero dentro de una función con tipo devuelto real.

    Aquí tienes un ejemplo que ilustra el primer caso:

    funcion area_triangulo(base, altura: real): real
    es
    secuencia
       devuelve base*altura/2;
    fin
    
    secuencia
       escribe llama area_triangulo(2, 10);
    fin
    

  2. Haz las modificaciones necesarias para que las funciones permitan el paso de parámetros por referencia. Cuando en el perfil de una función se anteponga la palabra reservada pr al identificador de un parámetro, el argumento correspondiente se pasará por referencia en vez de por valor. Dicho argumento deberá ser una expresión con valor-i cuyo tipo deberá coincidir con el del parámetro. Por ejemplo, mediante la siguiente definición:
    funcion f(a, pr b, c: real) : entero
    
    se establece que a y c son parámetros por valor y que b es un parámetro por referencia. Suponiendo definidas las variables e (entera), r (real) y v (vector de 10 reales), si se hicieran las siguientes llamadas:
    llama f(4.5, r, e)
    llama f(r, v[0], e)
    llama f(r, r, e)
    llama f(v[0], r, 2*e)
    llama f(r, 4.5, v[0])
    llama f(r, r*1, v[0])
    llama f(3, e, 5)
    
    las cuatro primeras serían correctas, la quinta y la sexta serían incorrectas porque el segundo argumento no tiene valor-i, y la última sería incorrecta porque el tipo del argumento (entero) no coincide con el del parámetro (real). Fíjate en que en este caso no se aplica promoción implícita de enteros a reales.

    Recuerda que cuando en el cuerpo de una función se utilice el identificador de un parámetro por referencia, en realidad se estará accediendo al objeto pasado como argumento. Para implementar ese comportamiento, puede ayudarte almacenar, en el objeto que representa una variable, un indicador de si se trata de un parámetro por referencia o no.

    Nota: Consideramos que una expresión tiene valor-i (l-value) si puede utilizarse a la izquierda (left) de una asignación para cambiarle su valor. Ello requiere que tenga asociada una dirección de memoria modificable. Por ejemplo, suponiendo definidas las mismas variables del ejemplo anterior, en las siguientes asignaciones:

    r = 9.9;
    v[0] = 8.8;
    v = 7.7;
    llama f(4.5, r, e) = 5;
    3 + 4 = 5;
    
    las dos primeras son correctas, y las tres últimas son incorrectas porque la expresión que hay a la izquierda de la asignación no tiene valor-i (en la tercera, además, el tipo de las expresiones a ambos lados de la asignación no es el mismo).

Aclaración para estudiantes repetidores: Respecto del curso pasado hemos movido hasta aquí el apartado 1, que se hacía en la versión 1.

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