/* DERIVACION DE EXPRESIONES DE UNA VARIABLE {X} */
/* ==================================================*/
/* === Programa: derivadas.yac ===*/
/* === TEcnica: Dirigida por la sintAxis ===*/
/* === Programador: J. Rafael R. ochoa ===*/
/* ==================================================*/
%{
struct genera
{
char de[80];
char le[80];
};
%}
%union
{
struct genera *estructura;
char str[80];
}
%token LEFT RIGHT MAS MENOS POR LINEA SALIR CUALQUIER_COSA
%token <str> NUM VAR
%type <estructura> expr factor termino
%%
/* producciones de la gramatica */
inicio : cadena
| cadena inicio
| error LINEA {printf("\n:-) ");} inicio
;
cadena : SALIR { return 1; }
| expr LINEA {
if (!$1) return;
printf("\n%s\n\n",$1);
printf(" o~ok\n");
printf("/|\\\n");
printf(" M ");
}
| otro LINEA { printf("error...capturado");}
;
otro : CUALQUIER_COSA
;
expr : expr MAS termino { if (!$1 || !$3) $$ = NULL;
else
{
$$ = reserva_mem();
sprintf($$->le,"%s + %s",$1->le,$3->le);
sprintf($$->de,"%s + %s",$1->de,$3->de);
}
}
| expr MENOS termino { if (!$1 || !$3) $$ = NULL;
else
{
$$ = reserva_mem();
sprintf($$->le,"%s - %s",$1->le,$3->le);
sprintf($$->de,"%s - %s",$1->de,$3->de);
}
}
| termino {
if (!$1) $$ = NULL;
else
{
$$ = reserva_mem();
sprintf($$->le,"%s",$1->le);
sprintf($$->de,"%s",$1->de);
}
}
;
termino : termino POR factor { if(!$1 || !$3) $$ = NULL;
else
{
$$ = reserva_mem();
sprintf($$->de,"%s * %s + %s * %s",$1->le,$3->de,$3->le,$1->de);
sprintf($$->le,"%s * %s",$1->le,$3->le);
}
}
| factor {
if (!$1) $$ = NULL;
else
{
$$ = reserva_mem();
sprintf($$->le,"%s",$1->le);
sprintf($$->de,"%s",$1->de);
}
}
;
factor : VAR { $$ = reserva_mem();
strcpy($$->le,"x");
strcpy($$->de,"1");
}
| NUM { $$ = reserva_mem();
sprintf($$->le,"%s",$1);
strcpy($$->de,"0");
}
| LEFT expr RIGHT { $$ = reserva_mem();
sprintf($$->de,"(%s)",$2->de);
sprintf($$->le,"(%s)",$2->le);
}
;
%%
/* funciones auxiliares */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int yylex(); /* Liga con la funcion yylex generada por LEX */
extern int yynerrs;
int yyparse();
void main(void)
{
printf("\n\n");
printf("=========================================\n");
printf("Por ejemplo 3*x+x\n");
printf("para terminar, teclee \"salir\"\n");
printf("===================================INICIO\n\n");
printf(":-) ");
yyparse();
printf ("\n\n:-) ok\n");
}
yyerror() /* llamado por yyparse() cuando ocurra */
{ /* un error */
printf("\n error de sintaxis \n");
return 1;
}
struct genera *reserva_mem(void)
{
return (struct genera *)malloc(sizeof(struct genera));
}