/* SI 413 Fall 2021
* This is a bison file that will use the hand-coded scanner to
* make a parser and interpreter for the simple calculator language.
*/
%define parse.error detailed
%define parse.lac full
%locations
%{
#include <iostream>
#include <cstdlib>
using namespace std;
// Prototype for our scanner function, aka getNextToken()
int yylex();
void yyerror(const char *s);
bool finished = false;
%}
//-- GRAMMAR SYMBOL DECLARATIONS
%union {
int val;
char sym;
};
%token<val> NUM
%token<sym> OPA OPM
%token LP RP STOP
%type<val> exp term factor
//-- GRAMMAR RULES
%%
res: exp STOP { cout << $1 << endl; YYACCEPT; }
| { cout << endl; finished = true; YYACCEPT; }
exp: exp OPA term { $$ = ($2 == '+' ? $1 + $3 : $1 - $3); }
| term { $$ = $1; }
term: term OPM factor { $$ = ($2 == '*' ? $1 * $3 : $1 / $3); }
| factor { $$ = $1; }
factor: NUM { $$ = $1; }
| LP exp RP { $$ = $2; }
%%
int main() {
do {
cout << "> " << flush;
} while (yyparse() == 0 && !finished);
return 0;
}
void yyerror(const char *s) {
cerr << s << endl;
}