-
Notifications
You must be signed in to change notification settings - Fork 4
/
calc++-parser.yy
109 lines (94 loc) · 1.96 KB
/
calc++-parser.yy
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
%skeleton "lalr1.cc"
%require "3.0.4"
%defines
%define parser_class_name {calcxx_parser}
%define api.token.constructor
%define api.value.type variant
%define parse.assert
%code requires
{
#include <string>
class calcxx_driver;
}
%param { calcxx_driver& driver }
%locations
%initial-action
{
@$.begin.filename = @$.end.filename = &driver.file;
}
%define parse.trace
%define parse.error verbose
%code
{
#include "calc++-driver.hpp"
}
%define api.token.prefix {TOK_}
%token
END 0 "end of file"
ASSIGN ":="
MINUS "-"
PLUS "+"
STAR "*"
SLASH "/"
LPAREN "("
RPAREN ")"
;
%token <std::string> IDENTIFIER "identifier"
%token <int> NUMBER "number"
%type <int> exp
%left "+" "-"
%left "*" "/"
%printer { yyoutput << $$; } <*>;
%start unit;
%%
unit: assignments exp
{
driver.result = $2;
}
;
assignments: %empty
{
}
| assignments assignment
{
}
;
assignment: "identifier" ":=" exp
{
driver.variables[$1] = $3;
}
;
exp: exp "+" exp
{
$$ = $1 + $3;
}
| exp "-" exp
{
$$ = $1 - $3;
}
| exp "*" exp
{
$$ = $1 * $3;
}
| exp "/" exp
{
$$ = $1 / $3;
}
| "(" exp ")"
{
std::swap($$, $2);
}
| "identifier"
{
$$ =driver.variables[$1];
}
| "number"
{
std::swap($$, $1);
}
;
%%
void yy::calcxx_parser::error(const location_type &l, const std::string &m)
{
driver.error(l, m);
}