Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1322
I Semestre 2001
[<=] [home] [<>] [\/] [=>]
CI-1322 Autómatas y compiladores

Tarea #1 [solución]

Calculadora de expresiones

E -> E+T | E-T |  T
T -> T*F | T/F |  F
F -> DIGITO    | (E)
Figura 1

      Escriba un programa que reciba expresiones artiméticas y las evalúe. Puede usar la gramática de la Figura 1.

/* Libro del dragón: Figura 2.24 */

#include <stdlib.h>	/* exit()    */
#include <stdio.h>	/* printf()  */
#include <ctype.h>	/* isdigit() */

int lookahead;

void error() {
    printf("error de sintaxis\n");    /* imprime mensaje de error */
    exit(1);                          /* y después se detiene     */
}

void match(int t) {
    if (lookahead == t) {
        lookahead = getchar();
    }
    else {
        error();
    }
}

void termino() {
    if ( isdigit(lookahead) ) {
        putchar(lookahead);
        match(lookahead);
    }
    else {
        error();
    }
}

void expr() {
    termino();
    while(1) {
        if (lookahead == '+') {
            match('+'); termino(); putchar('+');
        }
        else {
            if (lookahead == '-') {
                match('-'); termino(); putchar('-');
            }
            else {
                break;
            }
        }
    }
}

int main() {
    lookahead = getchar();
    expr();
    putchar('\n');    /* agrega un caracter de linea nueva al final */
    return 0;
}
Figura 2

      Para realizar su trabajo, escriba un analizador sintáctico predictivo, recursivo descendente, que haga la traducció dirigida por sintaxis, como el de la Figura 2.24 del libro de texto, el que se muestra en la Figura 2.

      Puede usar la siguiente estrategia para escribir su programa:

  1. Elimine la recursividad izquierda de la gramática de la Figura 1.
  2. Agregue al programa de la Figura 2 el manejo de factores y paréntesis.
  3. Escriba en C un pequeño analizador sintáctico que sirva para leer números completos, de manera que el programa no esté limitado a procesar únicamente dígitos.
  4. Opcionalmente, incorpore en su programa la capacidad de procesar la expresión desde la línea de comandos.

      Para hacer útil su calculadora, permita que los números que procese tenga comas que marcan la posición de los milenios. Al desplegar los resultados, use comas también:


C:\DIR\Subdir\> calc (1,200 * 4 / (3-2)) * 1,,000
C:\DIR\Subdir\> 4,800,000
C:\DIR\Subdir\> calc ((1,200 * 4 )
                                  ! Error

      Luego de imprimir la documentación de su programa, y entregarla en clase, envíe su trabajo al asistente del curso por correo electrónico. Para esto, haga un archivo empacado .zip cuyo nombre sea su número de carnet. Incluya en ese archivo lo siguiente:

  1. Un documento en formato HTML que describa el trabajo que realizó. Incluya el nombre del compilador que usó.
  2. El código fuente de su programa de prueba.
  3. Los datos de prueba para su programa.

      Las cuentas de computador en la ECCI se asignan de acuerdo al número de carnet. Por ejemplo, si su carnet es el número 95-28-09, para entregar su tarea usted debe crear el archivo 952809.zip para enviarlo por correo electrónico al asistente del curso.

      Luego haga en su cuenta personal un subdirectorio llamado public_html, que es bajo el que se instalan todas sus páginas Internet. Por ejemplo, si su solución está en el archivo HTML llamado "OLP/t3sol952809.htm", entonces usted debe instalar esa página en el archivo
      public_html/OLP/t3sol952809.htm
de su cuenta. Luego, para acceder esa página Internet, debe entrar a este sitio:
      http://anubis.ecci.ucr.ac.cr/~e952809/OLP/t3sol952809.htm

      Como todas las cuentas de estudiante son la letra "e" seguida del número de carnet, para el estudiante de carnet "952809" la cuenta es "e952809". Para indicarle al servidor Internet a cuál cuenta entrar se usa el caracter "~" (Alt-126), seguido del nombre de la cuenta: "~e952809".

      Después de la fecha de entrega del programa, puede usted instalar en su cuenta personal su solución (no instale antes su solución en Internet, pues en ese caso sería usted culpable de facilitar la copia de su trabajo, y en consecuencia se haría acreedor a la sanción respectiva).

[mailto:] Andrés Arias
Tiempo de entrega: 1 semana
Modalidad: Individual

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2001
Derechos de autor reservados © 2001
[home] <> [/\]