#include <stdio.h>
#include <setjmp.h>
#include "expr.h"

/* Ejemplo de Evaluacion de prefijo simple
 * + - * 2 3 1 1 (2*3)-1+1
 * No acepta ni comentarios ni signos en los operandos
 * OJO: Como agregar asignacion a la gramatica?
 * = id E
 */

extern char *yytext;

jmp_buf syn_error;

int NextToken;
char *TokName;

GetNextToken(){
    NextToken = yylex();
    TokName = yytext;
}

main() {
    int res;

    for(;;) {
	/* Buena idea usar longjmp para errores de parsing */
	if( setjmp(syn_error) != 0 )
            fprintf(stderr, "Error de sintaxis\n");

	printf("> "); fflush(stdout);
        GetNextToken();
	if(NextToken == EOF) break;
	res = Expr();
        if(NextToken == SCOLON)
            printf("%d\n", res);
	else
	    fprintf(stderr, "Falta el ;\n");
    }
}

Expr() {
    int res, op;

    switch(NextToken) {
    case INT: res=atoi(TokName);GetNextToken();
    break;
    case ADD: GetNextToken(); res = Expr()+Expr();
    break;
    case MUL: GetNextToken(); res = Expr()*Expr();
    break;
    case DIV: GetNextToken(); res = Expr()/Expr();
    break;
    case SUB: GetNextToken(); res = Expr()-Expr();
    break;
    default: fprintf(stderr, "Error Sintactico, estoy en \"%s\"\n", TokName);
	     longjmp(syn_error, 1);
    break;
    }
    return res;
}
