CALC

23/Abril/2003

 

Ejemplo de un analizador simple de expresiones enteras con soporte de variables y funciones.

El programa esta basado en uno de los ejemplos del curso en ingles : A Guide to Lex & Yacc del autor Thomas Niemann.

Este programa es realmente muy simple para ser realmente practico, pero creo que da una buena idea de lo relativamente sencillo que es hacer este tipo de software usando las herramientas YACC y LEX.

Basicamente el programa leera y interpretara un archivo de texto en el que cada linea tendra una expresion. CALC soporta variables aunque el nombre de estas solo deben ser del tamaņo de un caracter y debe ser una letra del abecedario en tipo minuscula (a,b,c,d,... etc) y por cierto el unico tipo de datos que se soporta son los enteros.

Para ejecutar CALC lo unico que tiene que hacer es digitar el nombre "CALC" seguido del simbolo menos "<" y el nombre del programa; Ejemplo :

    CALC < EJEMPLO.PRG  [Enter]

 

Expresiones que soporta Calc

Los operadores de uso son "+", "-", "*", "/" y el uso de parentesis "(" y ")" para alterar la precedencia de evaluacion.

El unico comando soportado es : print <Cadena> [;]; Que imprimira el texto entre comillas que siguen al comando; Opcionalmente si pone punto y coma luego de la cadena, no se emitira un salto de linea y cualquier impresion posterior ira despues de esta.

Existen dos funciones soportadas :

abs( <expresion> )  Retorna valor absoluto de la expresion.
max( <expresion1> , <expresion2> ) Retorna el valor de la mayor de las dos expresiones.

Ejemplo :

 
   
print ""
print "calc"
print "----"
print ""

a = 5
b = 10 + a
print "b = ";
b
print "----------------------"
c = 10 + 4 * 2
print "c = ";
c

print "----------------------"
d = ( 10 + 4 ) * 2
print "d = ";
d

print "----------------------"
e = 0 - 7
print "e = ";
e
e = abs( e )
print "abs(e) = ";
e

print "----------------------"
m = max( e , d )
print "max( e , d ) = ";
m

print ""
print "Adios..."

 

 

Aņadir Funciones a Calc

Para aņadir funciones a Calc tiene que agregar una linea en el archivo CALC.L que identifique el nombre de la funcion; Hagalo en la zona en que existe un comentario que dice funciones, luego de la funcion max; Por ejemplo si va a aņadir una funcion llamada min, tendria que poner :

/* funciones */
"abs" return FUNC_ABS;
"max" return FUNC_MAX;
"min" return FUNC_MIN;    <--(Linea aņadida)

Tambien tiene que retornar una constante que identifique a esa funcion; En este caso FUNC_MIN; Realmente puede poner el nombre que desee, pero el texto "FUNC_" hace obvia la funcion de la constante.

Luego en el archivo CALC.Y en la linea de definicion de tokens (%token), tiene que definir la constante que uso en el archivo del lex (CALC.L), en este caso seria (en rojo lo aņadido) :

%token ENTERO VARIABLE CMD_PRINT CADENA FUNC_ABS FUNC_MAX FUNC_MIN

Finalmente en el mismo archivo, en la regla que define las expresiones aņadiria en si el codigo de su Funcion :

expr:
    ENTERO
    | VARIABLE { $$ = sim[$1]; }
    | expr '+' expr { $$ = $1 + $3; }
    | expr '-' expr { $$ = $1 - $3; }
    | expr '*' expr { $$ = $1 * $3; }
    | expr '/' expr { $$ = $1 / $3; }
    | '(' expr ')' { $$ = $2; }
    | FUNC_ABS '(' expr ')' { $$ = abs( $3 ); }
    | FUNC_MAX '(' expr ',' expr ')' {    if ( $3 > $5 )
                                             $$ = $3;
                                          else
                                             $$ = $5;
                                     }
    | FUNC_MIN '(' expr ',' expr ')' {   
                                       Aca aņadiria el Codigo
                                       de su Funcion
                                     }
    ;

No se olvide de respetar el punto y coma final.

 

Compilar Calc

Si desea recompilar el programa debe tener el compilador MINGW listo e igualmente debe tener instalado el paquete YACC (Puede usar los paquetes que viene en mi pagina web : http://www.geocities.com/transdiv); En caso de usar el YACC que se descarga de mi pagina, lo unico que tiene que hacer es digitar :

    COMPILA [Enter]

Y se recreara el programa CALC.EXE

Hugo Rozas
hugo-rozas@iespana.es