parser.bison 783 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. %define api.value.type { double }
  2. %start prog;
  3. %token NUMBER_TOKEN // Numbers
  4. %token MULT_TOKEN // *
  5. %token DIV_TOKEN // /
  6. %token SUB_TOKEN // -
  7. %token ADD_TOKEN // +
  8. %token RESULT_TOKEN // ;
  9. %left RESULT_TOKEN
  10. %left ADD_TOKEN SUB_TOKEN
  11. %left MULT_TOKEN DIV_TOKEN
  12. %{
  13. #include <stdio.h>
  14. #include "common.h"
  15. %}
  16. %%
  17. prog: /* empty */
  18. | prog result { printf("Result: %f\n", $2); }
  19. ;
  20. expr: NUMBER_TOKEN { $$ = $1; }
  21. | expr ADD_TOKEN expr { $$ = $1 + $3; }
  22. | expr SUB_TOKEN expr { $$ = $1 - $3; }
  23. | expr MULT_TOKEN expr { $$ = $1 * $3; }
  24. | expr DIV_TOKEN expr { $$ = $1 / $3; }
  25. ;
  26. result: expr RESULT_TOKEN { $$ = $1; }
  27. ;
  28. %%
  29. #include <stdio.h>
  30. int main(int argc, char **argv)
  31. {
  32. if (argc > 0) yyin = fopen(argv[1], "r");
  33. yyparse();
  34. return 0;
  35. }