-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathvisitor_ex
executable file
·132 lines (100 loc) · 2.41 KB
/
visitor_ex
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/bin/bash
#
# A simple example to demo implementation of an expression calc. (Not
# entirely an indented use case of the library.)
readonly DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
. ${DIR}/../gobash
function Val() {
local -r val="${1}"
make_ "$FUNCNAME" \
"val" "${val}"
}
function Val_accept() {
local val="${1}"
$val val
}
function AddExpr() {
local -r l="${1}"
local -r r="${2}"
make_ "$FUNCNAME" \
"l" "${l}" \
"r" "${r}"
}
function AddExpr_accept() {
local -r e="${1}"
local -r v="${2}"
$v visit_add "$e"
}
function MulExpr() {
local -r l="${1}"
local -r r="${2}"
make_ "$FUNCNAME" \
"l" "${l}" \
"r" "${r}"
}
function MulExpr_accept() {
local -r e="${1}"
local -r v="${2}"
$v visit_mul "$e"
}
function SubExpr() {
local -r l="${1}"
local -r r="${2}"
make_ "$FUNCNAME" \
"l" "${l}" \
"r" "${r}"
}
function SubExp_accept() {
local -r e="${1}"
local -r v="${2}"
$v visit_sub "$e"
}
function DivExpr() {
local -r l="${1}"
local -r r="${2}"
make_ "$FUNCNAME" \
"l" "${l}" \
"r" "${r}"
}
function DivExpr_accept() {
local -r e="${1}"
local -r v="${2}"
$v visit_div "$e"
}
function Visitor() {
make_ "$FUNCNAME"
}
function Visitor_visit_add() {
local -r v="${1}"
local -r e="${2}"
local lv=$($($e l) accept "$v")
local rv=$($($e r) accept "$v")
math_calc "${lv} + ${rv}"
}
function Visitor_visit_mul() {
local -r v="${1}"
local -r e="${2}"
local lv=$($($e l) accept "$v")
local rv=$($($e r) accept "$v")
math_calc "${lv} * ${rv}"
}
function Visitor_visit_sub() {
local -r v="${1}"
local -r e="${2}"
local lv=$($($e l) accept "$v")
local rv=$($($e r) accept "$v")
math_calc "${lv} - ${rv}"
}
function Visitor_visit_div() {
local -r v="${1}"
local -r e="${2}"
local lv=$($($e l) accept "$v")
local rv=$($($e r) accept "$v")
math_calc "${lv} / ${rv}"
}
# (5 + 3) * (10 / 2)
l=$(AddExpr "$(Val 5)" "$(Val 3)")
r=$(DivExpr "$(Val 10)" "$(Val 2)")
root=$(MulExpr "$l" "$r")
v=$(Visitor)
$root accept "$v"