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

/* Ejemplo de Evaluacion de postfijo simple
 * 1 1 2 3 * - + (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;
}

int stack[1024];
int sp=0;
void push(int i) {
    stack[sp++]=i;
}
int pop() {
    if(sp==0) {
	fprintf(stderr, "Stack Vacio!\n");
	longjmp(syn_error, 1);
    }
    return stack[--sp];
}

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() {
    while(NextToken != SCOLON) {
    switch(NextToken) {
    case INT: push(atoi(TokName));GetNextToken();
    break;
    case ADD: GetNextToken(); push(pop()+pop());
    break;
    case MUL: GetNextToken(); push(pop()*pop());
    break;
    case DIV: GetNextToken(); push(pop()/pop());
    break;
    case SUB: GetNextToken(); push(pop()-pop());
    break;
    default: fprintf(stderr, "Error Sintactico, estoy en \"%s\"\n", TokName);
	     longjmp(syn_error, 1);
    break;
    }
    }
    return pop();
}
