1 import minilang_test_parser
3 # An naive recursive stack-based interpreter of the minilang language.
7 # A stack of numeric values
8 var stack
= new Array[Int]
10 # A stack of boolean values
11 var bstack
= new Array[Bool]
13 # The current values assigned to each variable
14 var vars
= new HashMap[String, Int]
16 redef fun visit
(n
) do n
.accept_minilang
(self)
20 # Execution of the node by the interpreter `v`
21 fun accept_minilang
(v
: Interpretor) do visit_children
(v
)
25 redef fun accept_minilang
(v
) do v
.stack
.push
(text
.to_i
)
29 redef fun accept_minilang
(v
) do
31 v
.vars
[n_id
.text
] = v
.stack
.pop
36 redef fun accept_minilang
(v
) do
41 redef class Ns_print_str
42 redef fun accept_minilang
(v
) do
44 text
= text
.substring
(1, text
.length-2
)
48 redef class Ns_println
49 redef fun accept_minilang
(v
) do
54 redef fun accept_minilang
(v
) do
60 if nelse
!= null then v
.enter_visit
(nelse
)
65 redef fun accept_minilang
(v
) do
68 if not v
.bstack
.pop
then break
69 v
.enter_visit
(n_stmts
)
76 redef fun accept_minilang
(v
) do
80 v
.bstack
.push
(b1
and b2
)
85 redef fun accept_minilang
(v
) do
89 v
.bstack
.push
(b1
or b2
)
94 redef fun accept_minilang
(v
) do
96 v
.bstack
.push
(not v
.bstack
.pop
)
101 redef fun accept_minilang
(v
) do
103 v
.bstack
.push
(v
.stack
.pop
== v
.stack
.pop
)
108 redef fun accept_minilang
(v
) do
110 v
.bstack
.push
(v
.stack
.pop
!= v
.stack
.pop
)
115 redef fun accept_minilang
(v
) do
117 v
.bstack
.push
(v
.stack
.pop
> v
.stack
.pop
)
122 redef fun accept_minilang
(v
) do
124 v
.bstack
.push
(v
.stack
.pop
>= v
.stack
.pop
)
129 redef fun accept_minilang
(v
) do
131 v
.bstack
.push
(v
.stack
.pop
< v
.stack
.pop
)
136 redef fun accept_minilang
(v
) do
138 v
.bstack
.push
(v
.stack
.pop
<= v
.stack
.pop
)
143 redef fun accept_minilang
(v
) do
145 v
.stack
.push
(v
.stack
.pop
+v
.stack
.pop
)
149 redef fun accept_minilang
(v
) do
152 v
.stack
.push
(v
.stack
.pop-n1
)
156 redef fun accept_minilang
(v
) do
158 v
.stack
.push
(-v
.stack
.pop
)
162 redef fun accept_minilang
(v
) do
164 v
.stack
.push
(v
.stack
.pop
*v
.stack
.pop
)
168 redef fun accept_minilang
(v
) do
171 v
.stack
.push
(v
.stack
.pop
/n1
)
175 redef fun accept_minilang
(v
) do
176 v
.stack
.push v
.vars
[n_id
.text
]
180 redef fun accept_minilang
(v
) do
186 var t
= new TestParser_minilang
189 var v
= new Interpretor