Miércoles 28 de Abril

La sintaxis de Java - 2da. parte

Objetivos: Entregar las reglas gramaticales que describen otras categorías sintácticas del lenguaje Java.

Temas:


Invocación de métodos y funciones

Los operadores de Java (+ - * etc.) permiten escribir en forma cómoda las operaciones más frecuentes que uno pueda necesitar en un programa. Para otras operaciones menos frecuentes (como min, max, sqrt, etc.) existe una categoría sintáctica que se denomina invocación de función o método (Obs.: más adelante veremos que las funciones son también métodos).

Por ejemplo, en la siguiente instrucción, sqrt(...) es una invocación de función:

    double raiz= sqrt(b*b-4*a*c);
Las reglas sintácticas que describen lo que puede ser una invocación de función o método son las siguientes:

exp -> ident ( args ) La invocación de una función
-> exp . ident ( args ) La invocación de un método
args -> No hay argumentos
-> exp más-args Hay al menos un argumento
más-args -> No hay más argumentos
-> , exp más-args Queda al menos un argumento adicional

El siguiente es el árbol sintáctico para max(a,1):

     max  (   a   ,   1           )
      |   |   |   |   |           |
    ident | ident | const         |
      |   |   |   \   |           |
      \   |  exp   \ exp más-args |
       \  \   \     \  \  /       /
        \  \   \    más-args     /
         \  \   \    /          /
          \  \   args          /
           \  \   |           /
            ------+-----------
                 exp
Observe que la aparición de la categoría más-args a partir de nada se justifica con la regla que dice:

más-args ->
El árbol sintáctico para lect.readLine() es:

    lect  . readLine (      )
      |   |   |      |      |
    ident | ident    |      |
      |   |   |      |      |
     exp  |   |      | args |
        \ \   |      / /    /
         -----+-------------
             exp

Creación de objetos

La creación de un objeto mediante el operador new es una expresión. La regla sintáctica que permite este tipo de expresiones es:

exp -> new tipo ( args )
En las reglas sintácticas colocamos en negritas las palabras que deben aparecer textualmente en el programa y colocamos en cursiva las categorías sintácticas y que por lo tanto deben ser reemplazadas por ``algo'' que aparece en el programa.

Un tipo es una categoría sintáctica que representa todos los tipos de Java: int, double, String, TextReader, etc.

Ejercicio: demuestre que new TextReader("datos.txt").close() es una expresión (construya su árbol sintáctico). Explique en palabras qué hace la expresión.


Ejercicio:

Escriba un programa que entregue la distancia entre Santiago y alguna ciudad de Chile. El diálogo debe ser el siguiente:

    Nombre de ciudad ? arica
    La distancia entre Santiago y Arica es 2030 kilómetros
Para obtener la distancia, Ud. dispone de un archivo "dist.txt" que contiene las distancias entre Santiago y las ciudades más importantes de Chile en el siguiente formato:

Arica:2030
Puerto Mont:1012
Valparaiso:109
...
Observe que el usuario ingresa arica en minúsculas y que la misma ciudad aparece en mayúsculas en el archivo. El programa debe ignorar este tipo de diferencias.

Si la ciudad solicitada por el usuario no aparece en el archivo, el programa debe desplegar el siguiente mensaje:

    Nombre de ciudad ? Mendoza
    La ciudad de Mendoza no se encuentra en mi base de datos
Solución:

    print("Nombre de ciudad ? ");
    String ciudadBusc= readLine();
    TextReader lect= new TextReader("dist.txt");
    int existe= 0;
    String linea= lect.readLine();
    while (!lect.eofReached() && existe==0) {
      FieldParser decod= new FieldParser(linea, ":");
      String ciudad= decod.readString();
      if (compare(lower(ciudad), lower(ciudadBusc))==0) {
        int dist= decod.readInt();
        println("La distancia entre Santiago y "+ciudad+" es "+dist+
                "kilometros");
        existe= 1;
      }
      linea= lect.readLine();
    }
    if (existe!=0)
      println("La ciudad de "+ciudadBusc+
              " no se encuentra en mi base de datos");
    lect.close();
Observación: La comparación se debe hacer ignorando la diferencia entre mayúsculas y minúscula. Por esta razón, se usó la función lower que traduce todo a letras minúsculas.

Si se encuentra la ciudad, no tiene sentido seguir leyendo el archivo. Por esta razón se agregó la variable existe. Esta variable permanece en 0 mientras no se haya encontrado la ciudad. Cuando se encuentra la ciudad se le asigna un 1, lo que se traduce en que el ciclo termina, puesto que no satisface la condición existe==0.