eval.y 928 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. Syntax analyser
  3. for `bison`
  4. */
  5. %{
  6. #include <stdio.h>
  7. /* Prototypes */
  8. int yylex (void);
  9. void yyerror (const char *);
  10. /* Variable from lexical analysis */
  11. extern char* yytext;
  12. %}
  13. %defines /* Geneates eval.tab.h */
  14. %token number
  15. %start EXPR_CALCS /* Axiom */
  16. %%
  17. EXPR_CALCS : EXPR_CALC
  18. | EXPR_CALCS EXPR_CALC
  19. ;
  20. EXPR_CALC : EXPR '=' { printf("%d\n", $1); }
  21. ;
  22. EXPR : EXPR '+' FACTOR {$$ = $1 + $3;}
  23. | EXPR '-' FACTOR {$$ = $1 - $3;}
  24. | FACTOR
  25. ;
  26. FACTOR : number {$$ = $1;}
  27. | FACTOR '*' FACTOR {$$ = $1 * $3;}
  28. | FACTOR '/' FACTOR {$$ = $1 / $3;}
  29. | '(' EXPR ')' {$$ = $2;}
  30. ;
  31. %%
  32. #include <stdio.h>
  33. #include "eval.tab.h"
  34. void yyerror (const char * error)
  35. {
  36. fprintf (stderr, "Error detected : %s\n for expression\n%s\n", error, yytext);
  37. }
  38. int main() {
  39. if ( yyparse() != 0 ) {
  40. fprintf(stderr, "Error detected : syntax error\n");
  41. return 1;
  42. }
  43. else
  44. return 0;
  45. }