Miércoles 5 de Mayo

La sintaxis -- 3era. parte

Objetivos: Presentar las reglas sintaxis que describen las instrucciones.

Temas:


La sintaxis de las instrucciones

Una instrucción en Java se describe mediante las siguientes reglas:

inst -> ; La instrucción vacía
-> exp ; La evaluación de una expresión
-> tipo ident; Declaración sin inicialización
-> tipo ident= exp; Declaración con inicialización
-> break; El quiebre de ciclos
-> if ( exp ) inst If sin parte else
-> if ( exp ) inst else inst If con parte else
-> while ( exp ) inst Ciclo while
-> { lista-inst } Grupo de instrucciones
lista-inst ->
-> inst lista-inst
Observaciones:

Ejercicio:

Construir el árbol sintáctico del siguiente programa.

    while(x!=y) if (x>y) x= x-y; else y= y-x; println(x);
Solución: Para economizar espacio, no describiremos en detalle el árbol de las expresiones. Utilizaremos la notación exp => ... para indicar que una expresión puede ser ... aplicando varias reglas sintácticas sucesivas.

       while (x!=y) if  ( x>y ) x= x-y; else y= y-x; println(x);
          \  | || \  \  | ||  |   ||     |     ||       ||
           \ \ exp \  \ \ exp |  exp     |    exp      exp
            \ \ \   \  \ \    |   |      /     |        |
             \ \ \   \  \ \   |  inst   /     inst     inst
              \ \ \   \  \ \  \   |    /      /       /
               \ \ \   \  \ \  \  /   /      /       /
                \ \ \   |  ----inst----------       /
                 \ \ \  |     /                    /
                  \ \ \ |    /                    /
                   ----inst--                    /
                             \                  /
                              ------lista-inst--  lista-inst
                                        \         /
                                        lista-inst
Observe que no existe ningún árbol sintáctico que incluya el println como instrucción que está dentro del ciclo.

A partir del árbol se puede deducir la indentación correcta para este programa:

    while (x!=y)
      if ( x>y )
        x= x-y;
      else
        y= y-x;
    println(x);
La recomendación es muy simple: cada vez que una instrucción forma parte de otra instrucción (como un while o un if), se indenta en dos espacios a la derecha. En el ejemplo, x=x-y; aparece indentado con respecto al if porque forma parte de él. En cambio println(x); no se indenta con respecto al while porque ambas instrucciones están al mismo nivel.

Sobre indentación no hay reglas estrictas, sólo recomendaciones. Cada persona indenta de acuerdo a su gusto, ¡pero no indentar produce programas completamente ilegibles!

Desambiguación del if:

El siguiente programa es ambiguo porque posee dos árboles sintácticos:

    if ( ... ) ... if ( ... ) ... else ...
La regla de desambiguación dice que el else se asocia al if más cercano, para el cual no se haya determinado aún su parte else. Por lo tanto, el else se asocia con el segundo if y no con el primero.

El siguiente programa no es ambiguo:

    if ( ... ) ... if ( ... ) ... else ... else ...
¿Por qué?


Propuesto:


Motivación:

Se ha hecho una elección en la que participaron 8 candidatos. Cada candidato se identifica por un número entre 1 y 8. El resultado de la elección se encuentra en un archivo ``votos.txt'' que contiene una línea por cada sufragante. Esta línea indica el número del candidato que prefiere ese sufragante. Por ejemplo el contenido del archivo podría ser:

    3
    8
    1
    3
    1
En el archivo se observa que el candidato número 3 tiene 2 votos, al igual que el número 1 y que el candidato 8 tiene 1 voto.

Construir un programa que haga el recuento de los votos. El resultado de este programa debe ser:

    Candidato 1: xxx votos
    Candidato 2: yyy votos
    ...
    Candidato 8: zzz votos
Soluciones: