SUF=dummy
$(SUF) : y.tab.o lex.yy.o 
	cc -o $(SUF) y.tab.o lex.yy.o -lfl
	rm *.o
	rm *.c

y.tab.o : y.tab.c
	cc -c y.tab.c

y.tab.c y.tab.h : $(SUF).y
	yacc -d $(SUF).y

lex.yy.o : lex.yy.c y.tab.h
	cc -c lex.yy.c

lex.yy.c : $(SUF).l
	flex $(SUF).l

**************************************************************************

%{
#include "y.tab.h"
%}
%option yylineno
%% 
[\(\)]  return(*yytext); 
[0-9]+  { yylval.n = atoi(yytext); return(NUM); } 
[\+\-]  { yylval.op = yytext[0]; return(OP_AD); } 
[\*\/]  { yylval.op = yytext[0]; return(OP_MUL); } 
[\ \t\n]+ ; 
**************************************************************************

%{
#include 
extern int yylineno;
extern char *yytext;
%}
%token NUM OP_AD OP_MUL
%union{ int n; 
        char op; } 
%type  NUM Exp
%type  OP_AD OP_MUL 
%left OP_AD
%left OP_MUL

%% 


Exp : Exp OP_AD Exp 
      { switch($2) 
	  { 
	    case '+' : $$ = $1 + $3; 
		       break; 
	    case '-' : $$ = $1 - $3; 
		       break; 
	   }
      }	   	       
    | Exp OP_MUL Exp 
	{ switch($2) 
	    { 
	      case '*' : $$ = $1 * $3; 
			 break; 
	      case '/' : if ( $3 != 0 ) 
			   $$ = $1 / $3; 
			 else 
			   printf("\nERRO: divisao por ZERO!!!\n"); 
                         break; 
            } 
	 } 
      | NUM 
	 { $$ = $1; } 
      | '(' Exp ')' 
	 { $$ = $2; } 
       ; 

%%

void yyerror(char *s)
{ fprintf(stderr, "ERRO: %d: %s: %s\n", yylineno, s, yytext);
}

main() 
  {
    if(yyparse()==0) 
      printf("\n\nValor final da Exp: %d", yyval.n); 
    else
      printf("\n Ocorreram erros durante a Análise!!!!\n");
  }