/* -- eval.y --       
   Evaluation d'une expression       
   Partie analyseur grammatical.    

   Utilisation : bison eval.y */

%{
#include <stdio.h>

/* Pré-déclarations */
int yylex (void);
void yyerror (const char *);

/* Variable définie dans un autre fichier */
extern char* yytext;

%}

%defines /* Génère le fichier en-tête eval.tab.h */

%token  nombre

%start  EXPR_CALCS /* Axiome de la grammaire */

%%

EXPR_CALCS	: EXPR_CALC
		| EXPR_CALCS EXPR_CALC
		;

EXPR_CALC	: EXPR '=' 	{ printf("%d\n", $1); }
		;

EXPR	: EXPR '+' EXPR		{$$ = $1 + $3;}
	| EXPR '-' EXPR		{$$ = $1 - $3;}
	| FACTOR
	;

FACTOR	: nombre		{$$ = $1;}
	| FACTOR '*' FACTOR	{$$ = $1 * $3;}
	| '(' EXPR ')'		{$$ = $2;}
	;

%%
#include <stdio.h>
#include "eval.tab.h"

void yyerror (const char * error) 
{
    fprintf (stderr, "Erreur: %s sur l'expression %s\n", error, yytext);
}

int main() {
    if ( yyparse() != 0 ) {
        fprintf(stderr,"Syntaxe incorrecte\n"); return 1; }
    else
        return 0;
}