nitcc: introduce nitcc
[nit.git] / contrib / nitcc / examples / minilang.nit
1 import minilang_test_parser
2
3 class Interpretor
4 super Visitor
5 var stack = new Array[Int]
6 var bstack = new Array[Bool]
7 var vars = new HashMap[String, Int]
8
9 redef fun visit(n) do n.accept_calculator(self)
10 end
11
12 redef class Node
13 fun accept_calculator(v: Interpretor) do visit_children(v)
14 end
15
16 redef class Nint
17 redef fun accept_calculator(v) do v.stack.push(text.to_i)
18 end
19
20 redef class Ns_assign
21 redef fun accept_calculator(v) do
22 super
23 v.vars[n_id.text] = v.stack.pop
24 end
25 end
26
27 redef class Ns_print
28 redef fun accept_calculator(v) do
29 super
30 printn v.stack.pop
31 end
32 end
33 redef class Ns_print_str
34 redef fun accept_calculator(v) do
35 var text = n_str.text
36 text = text.substring(1, text.length-2)
37 printn text
38 end
39 end
40 redef class Ns_println
41 redef fun accept_calculator(v) do
42 print ""
43 end
44 end
45 redef class Ns_if
46 redef fun accept_calculator(v) do
47 v.enter_visit(n_c)
48 if v.bstack.pop then
49 v.enter_visit(n_then)
50 else
51 var nelse = n_else
52 if nelse != null then v.enter_visit(nelse)
53 end
54 end
55 end
56 redef class Ns_while
57 redef fun accept_calculator(v) do
58 loop
59 v.enter_visit(n_c)
60 if not v.bstack.pop then break
61 v.enter_visit(n_stmts)
62 end
63 end
64 end
65
66
67 redef class Nc_and
68 redef fun accept_calculator(v) do
69 super
70 var b1 = v.bstack.pop
71 var b2 = v.bstack.pop
72 v.bstack.push(b1 and b2)
73 end
74 end
75
76 redef class Nc_or
77 redef fun accept_calculator(v) do
78 super
79 var b1 = v.bstack.pop
80 var b2 = v.bstack.pop
81 v.bstack.push(b1 or b2)
82 end
83 end
84
85 redef class Nc_not
86 redef fun accept_calculator(v) do
87 super
88 v.bstack.push(not v.bstack.pop)
89 end
90 end
91
92 redef class Nc_eq
93 redef fun accept_calculator(v) do
94 super
95 v.bstack.push(v.stack.pop == v.stack.pop)
96 end
97 end
98
99 redef class Nc_ne
100 redef fun accept_calculator(v) do
101 super
102 v.bstack.push(v.stack.pop != v.stack.pop)
103 end
104 end
105
106 redef class Nc_lt
107 redef fun accept_calculator(v) do
108 super
109 v.bstack.push(v.stack.pop > v.stack.pop)
110 end
111 end
112
113 redef class Nc_le
114 redef fun accept_calculator(v) do
115 super
116 v.bstack.push(v.stack.pop >= v.stack.pop)
117 end
118 end
119
120 redef class Nc_gt
121 redef fun accept_calculator(v) do
122 super
123 v.bstack.push(v.stack.pop < v.stack.pop)
124 end
125 end
126
127 redef class Nc_ge
128 redef fun accept_calculator(v) do
129 super
130 v.bstack.push(v.stack.pop <= v.stack.pop)
131 end
132 end
133
134 redef class Ne_add
135 redef fun accept_calculator(v) do
136 super
137 v.stack.push(v.stack.pop+v.stack.pop)
138 end
139 end
140 redef class Ne_sub
141 redef fun accept_calculator(v) do
142 super
143 var n1 = v.stack.pop
144 v.stack.push(v.stack.pop-n1)
145 end
146 end
147 redef class Ne_neg
148 redef fun accept_calculator(v) do
149 super
150 v.stack.push(-v.stack.pop)
151 end
152 end
153 redef class Ne_mul
154 redef fun accept_calculator(v) do
155 super
156 v.stack.push(v.stack.pop*v.stack.pop)
157 end
158 end
159 redef class Ne_div
160 redef fun accept_calculator(v) do
161 super
162 var n1 = v.stack.pop
163 v.stack.push(v.stack.pop/n1)
164 end
165 end
166 redef class Ne_var
167 redef fun accept_calculator(v) do
168 v.stack.push v.vars[n_id.text]
169 end
170 end
171 redef class Ne_read
172 redef fun accept_calculator(v) do
173 var t = gets
174 v.stack.push(t.to_i)
175 end
176 end
177
178 var t = new MyTest
179 var n = t.main
180
181 var v = new Interpretor
182 v.enter_visit(n)