1 module minilang
is example
3 import minilang_test_parser
5 # An naive recursive stack-based interpreter of the minilang language.
9 # A stack of numeric values
10 var stack
= new Array[Int]
12 # A stack of boolean values
13 var bstack
= new Array[Bool]
15 # The current values assigned to each variable
16 var vars
= new HashMap[String, Int]
18 redef fun visit
(n
) do n
.accept_minilang
(self)
22 # Execution of the node by the interpreter `v`
23 fun accept_minilang
(v
: Interpretor) do visit_children
(v
)
27 redef fun accept_minilang
(v
) do v
.stack
.push
(text
.to_i
)
31 redef fun accept_minilang
(v
) do
33 v
.vars
[n_id
.text
] = v
.stack
.pop
38 redef fun accept_minilang
(v
) do
43 redef class Ns_print_str
44 redef fun accept_minilang
(v
) do
46 text
= text
.substring
(1, text
.length-2
)
50 redef class Ns_println
51 redef fun accept_minilang
(v
) do
56 redef fun accept_minilang
(v
) do
62 if nelse
!= null then v
.enter_visit
(nelse
)
67 redef fun accept_minilang
(v
) do
70 if not v
.bstack
.pop
then break
71 v
.enter_visit
(n_stmts
)
78 redef fun accept_minilang
(v
) do
82 v
.bstack
.push
(b1
and b2
)
87 redef fun accept_minilang
(v
) do
91 v
.bstack
.push
(b1
or b2
)
96 redef fun accept_minilang
(v
) do
98 v
.bstack
.push
(not v
.bstack
.pop
)
103 redef fun accept_minilang
(v
) do
105 v
.bstack
.push
(v
.stack
.pop
== v
.stack
.pop
)
110 redef fun accept_minilang
(v
) do
112 v
.bstack
.push
(v
.stack
.pop
!= v
.stack
.pop
)
117 redef fun accept_minilang
(v
) do
119 v
.bstack
.push
(v
.stack
.pop
> v
.stack
.pop
)
124 redef fun accept_minilang
(v
) do
126 v
.bstack
.push
(v
.stack
.pop
>= v
.stack
.pop
)
131 redef fun accept_minilang
(v
) do
133 v
.bstack
.push
(v
.stack
.pop
< v
.stack
.pop
)
138 redef fun accept_minilang
(v
) do
140 v
.bstack
.push
(v
.stack
.pop
<= v
.stack
.pop
)
145 redef fun accept_minilang
(v
) do
147 v
.stack
.push
(v
.stack
.pop
+v
.stack
.pop
)
151 redef fun accept_minilang
(v
) do
154 v
.stack
.push
(v
.stack
.pop-n1
)
158 redef fun accept_minilang
(v
) do
160 v
.stack
.push
(-v
.stack
.pop
)
164 redef fun accept_minilang
(v
) do
166 v
.stack
.push
(v
.stack
.pop
*v
.stack
.pop
)
170 redef fun accept_minilang
(v
) do
173 v
.stack
.push
(v
.stack
.pop
/n1
)
177 redef fun accept_minilang
(v
) do
178 v
.stack
.push v
.vars
[n_id
.text
]
182 redef fun accept_minilang
(v
) do
188 var t
= new TestParser_minilang
191 var v
= new Interpretor