1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* SI 413 Fall 2012
 * This is a bison file that will use the hand-coded scanner to
 * make a parser and interpreter for the simple calculator language.
 */
%{
#include <iostream>
#include <cstdlib>
using namespace std;
 
// Prototype for our scanner function, aka getNextToken()
int yylex(); 
 
int yyerror(const char *p) { 
  cerr << "Parser error!" << endl; 
  exit(2);
}
%}
 
//-- 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; exit(0); }
 
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() {
  while(1) {
    cout << "> " << flush;
    yyparse();
  }
  return 0;
}