first ast optimization, constant opexp, constant matrixexp
[scilab.git] / scilab / modules / ast / src / cpp / ast / debugvisitor.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - DIGITEO - Bruno JOFRET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "debugvisitor.hxx"
14
15
16 namespace ast
17 {
18 static int level = -1;
19
20 static void DEBUG_START_NODE(const ast::Ast& e)
21 {
22     wcerr << L"(" << e.getNodeNumber() << L") ";
23     ++level;
24 }
25
26 static void DEBUG_END_NODE(void)
27 {
28     --level;
29 }
30
31 static void DEBUG(wstring str)
32 {
33     for (int i = 0 ; i < level; ++i)
34     {
35         wcerr << L"  ";
36     }
37     if (level > 0)
38     {
39         wcerr << L"     ";
40     }
41     wcerr << str << endl;
42 }
43
44 static void DEBUG(wstring str, const Exp &e)
45 {
46     for (int i = 0 ; i < level; ++i)
47     {
48         wcerr << L"  ";
49     }
50     if (level > 0)
51     {
52         wcerr << L"|_./ ";
53     }
54     wcerr << str;
55
56     Location loc = e.getLocation();
57     wcerr << L" @(" << loc.first_line << L"." << loc.first_column << L" -> ";
58     wcerr << loc.last_line << L"." << loc.last_column << L")" << endl;
59 }
60
61
62 void DebugVisitor::visit (const MatrixExp &e)
63 {
64     DEBUG_START_NODE(e);
65     DEBUG(L"Exec MatrixExp", e);
66     exps_t lines = e.getLines();
67     for (exps_t::const_iterator it = lines.begin(), itEnd = lines.end(); it != itEnd ; ++it)
68     {
69         (*it)->accept (*this);
70     }
71     DEBUG_END_NODE();
72 }
73
74 void DebugVisitor::visit (const MatrixLineExp &e)
75 {
76     DEBUG_START_NODE(e);
77     DEBUG(L"Exec MatrixLineExp", e);
78     exps_t columns = e.getColumns();
79     for (exps_t::const_iterator it = columns.begin(), itEnd = columns.end(); it != itEnd ; ++it)
80     {
81         (*it)->accept (*this);
82     }
83     DEBUG_END_NODE();
84 }
85
86 void DebugVisitor::visit (const CellExp &e)
87 {
88     DEBUG_START_NODE(e);
89     DEBUG(L"Exec CellExp", e);
90     exps_t lines = e.getLines();
91     for (exps_t::const_iterator it = lines.begin(), itEnd = lines.end(); it != itEnd ; ++it)
92     {
93         (*it)->accept (*this);
94     }
95     DEBUG_END_NODE();
96 }
97
98 void DebugVisitor::visit (const StringExp &e)
99 {
100     DEBUG_START_NODE(e);
101     DEBUG(L"Exec StringExp : " + e.getValue(), e);
102     DEBUG_END_NODE();
103 }
104
105 void DebugVisitor::visit (const CommentExp &e)
106 {
107     DEBUG_START_NODE(e);
108     DEBUG(L"Exec CommentExp : " + e.getComment(), e);
109     DEBUG_END_NODE();
110 }
111
112 void DebugVisitor::visit (const DoubleExp  &e)
113 {
114     DEBUG_START_NODE(e);
115     wostringstream stream;
116     stream << e.getValue();
117     DEBUG(L"Exec DoubleExp : " + stream.str(), e);
118     DEBUG_END_NODE();
119 }
120
121 void DebugVisitor::visit (const BoolExp  &e)
122 {
123     DEBUG_START_NODE(e);
124     wostringstream stream;
125     stream << e.getValue();
126     DEBUG(L"Exec getv    : " + stream.str(), e);
127     DEBUG_END_NODE();
128 }
129
130 void DebugVisitor::visit (const NilExp &e)
131 {
132     DEBUG_START_NODE(e);
133     DEBUG(L"Exec NilExp", e);
134     DEBUG_END_NODE();
135 }
136
137 void DebugVisitor::visit (const SimpleVar &e)
138 {
139     DEBUG_START_NODE(e);
140     DEBUG(L"Exec SimpleVar : " + e.getSymbol().getName(), e);
141     DEBUG_END_NODE();
142 }
143
144 void DebugVisitor::visit (const ColonVar &e)
145 {
146     DEBUG_START_NODE(e);
147     DEBUG(L"Exec ColonVar", e);
148     DEBUG_END_NODE();
149 }
150
151 void DebugVisitor::visit (const DollarVar &e)
152 {
153     DEBUG_START_NODE(e);
154     DEBUG(L"Exec DollarVar", e);
155     DEBUG_END_NODE();
156 }
157
158 void DebugVisitor::visit (const ArrayListVar &e)
159 {
160     DEBUG_START_NODE(e);
161     DEBUG(L"Exec ArrayListVar", e);
162     exps_t vars = e.getVars();
163     for (exps_t::const_iterator it = vars.begin (), itEnd = vars.end(); it != itEnd; ++it)
164     {
165         (*it)->accept(*this);
166     }
167     DEBUG_END_NODE();
168 }
169
170 void DebugVisitor::visit (const FieldExp &e)
171 {
172     DEBUG_START_NODE(e);
173     DEBUG(L"Exec FieldExp", e);
174     e.getHead()->accept(*this);
175     e.getTail()->accept(*this);
176     DEBUG_END_NODE();
177 }
178
179 void DebugVisitor::visit(const OpExp &e)
180 {
181     DEBUG_START_NODE(e);
182     DEBUG(L"Exec OpExp", e);
183     e.getLeft().accept(*this);
184     e.getRight().accept(*this);
185     DEBUG_END_NODE();
186 }
187
188 void DebugVisitor::visit(const LogicalOpExp &e)
189 {
190     DEBUG_START_NODE(e);
191     DEBUG(L"Exec LogicalOpExp", e);
192     e.getLeft().accept(*this);
193     e.getRight().accept(*this);
194     DEBUG_END_NODE();
195 }
196
197 void DebugVisitor::visit (const AssignExp  &e)
198 {
199     DEBUG_START_NODE(e);
200     DEBUG(L"Exec AssignExp", e);
201     e.getLeftExp().accept (*this);
202     e.getRightExp().accept (*this);
203     DEBUG_END_NODE();
204 }
205
206 void DebugVisitor::visit(const CellCallExp &e)
207 {
208     DEBUG_START_NODE(e);
209     DEBUG(L"Exec CellCallExp", e);
210     e.getName().accept (*this);
211
212     exps_t args = e.getArgs();
213     for (exps_t::const_iterator it = args.begin (), itEnd = args.end(); it != itEnd; ++it)
214     {
215         (*it)->accept(*this);
216     }
217     DEBUG_END_NODE();
218 }
219
220 void DebugVisitor::visit(const CallExp &e)
221 {
222     DEBUG_START_NODE(e);
223     DEBUG(L"Exec CallExp", e);
224     e.getName().accept (*this);
225
226     exps_t args = e.getArgs();
227     for (exps_t::const_iterator it = args.begin (), itEnd = args.end(); it != itEnd; ++it)
228     {
229         (*it)->accept (*this);
230     }
231     DEBUG_END_NODE();
232 }
233
234 void DebugVisitor::visit (const IfExp  &e)
235 {
236     DEBUG_START_NODE(e);
237     DEBUG(L"Exec IfExp", e);
238     e.getTest ().accept(*this);
239     e.getThen ().accept(*this);
240     if (e.hasElse())
241     {
242         e.getElse ().accept(*this);
243     }
244     DEBUG_END_NODE();
245 }
246
247 void DebugVisitor::visit (const TryCatchExp  &e)
248 {
249     DEBUG_START_NODE(e);
250     DEBUG(L"Exec TryCatchExp", e);
251     e.getTry ().accept(*this);
252     e.getCatch ().accept(*this);
253     DEBUG_END_NODE();
254 }
255
256 void DebugVisitor::visit (const WhileExp  &e)
257 {
258     DEBUG_START_NODE(e);
259     DEBUG(L"Exec WhileExp", e);
260     e.getTest().accept (*this);
261     e.getBody().accept (*this);
262     DEBUG_END_NODE();
263 }
264
265 void DebugVisitor::visit (const ForExp  &e)
266 {
267     DEBUG_START_NODE(e);
268     DEBUG(L"Exec ForExp", e);
269     e.getVardec().accept(*this);
270     e.getBody().accept (*this);
271     DEBUG_END_NODE();
272 }
273
274 void DebugVisitor::visit (const ContinueExp &e)
275 {
276     DEBUG_START_NODE(e);
277     DEBUG(L"Exec ContinueExp", e);
278     DEBUG_END_NODE();
279 }
280
281 void DebugVisitor::visit (const BreakExp &e)
282 {
283     DEBUG_START_NODE(e);
284     DEBUG(L"Exec BreakExp", e);
285     DEBUG_END_NODE();
286 }
287
288 void DebugVisitor::visit (const ReturnExp &e)
289 {
290     DEBUG_START_NODE(e);
291     DEBUG(L"Exec ReturnExp", e);
292     if (!e.isGlobal())
293     {
294         e.getExp().accept(*this);
295     }
296     DEBUG_END_NODE();
297 }
298
299 void DebugVisitor::visit (const SelectExp &e)
300 {
301     DEBUG_START_NODE(e);
302     DEBUG(L"Exec SelectExp", e);
303     e.getSelect()->accept(*this);
304
305     exps_t* cases = e.getCases();
306     for (exps_t::iterator it = cases->begin(), itEnd = cases->end(); it !=  itEnd ; ++it)
307     {
308         (*it)->accept(*this);
309     }
310
311     if (e.getDefaultCase() != NULL)
312     {
313         e.getDefaultCase()->accept(*this);
314     }
315     DEBUG_END_NODE();
316 }
317
318 void DebugVisitor::visit (const CaseExp &e)
319 {
320     DEBUG_START_NODE(e);
321     DEBUG(L"Exec CaseExp", e);
322     e.getTest()->accept(*this);
323     e.getBody()->accept(*this);
324     DEBUG_END_NODE();
325 }
326
327 void DebugVisitor::visit (const SeqExp  &e)
328 {
329     DEBUG_START_NODE(e);
330     DEBUG(L"Exec SeqExp", e);
331     for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
332     {
333         (*it)->accept(*this);
334     }
335     DEBUG_END_NODE();
336 }
337
338 void DebugVisitor::visit (const ArrayListExp  &e)
339 {
340     DEBUG_START_NODE(e);
341     DEBUG(L"Exec ArrayListExp", e);
342     for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
343     {
344         (*it)->accept (*this);
345     }
346     DEBUG_END_NODE();
347 }
348
349 void DebugVisitor::visit (const AssignListExp  &e)
350 {
351     DEBUG_START_NODE(e);
352     DEBUG(L"Exec AssignListExp", e);
353     for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
354     {
355         (*it)->accept (*this);
356     }
357     DEBUG_END_NODE();
358 }
359
360 void DebugVisitor::visit (const NotExp &e)
361 {
362     DEBUG_START_NODE(e);
363     DEBUG(L"Exec NotExp", e);
364     e.getExp().accept (*this);
365     DEBUG_END_NODE();
366 }
367
368 void DebugVisitor::visit (const TransposeExp &e)
369 {
370     DEBUG_START_NODE(e);
371     DEBUG(L"Exec TransposeExp", e);
372     e.getExp().accept (*this);
373     DEBUG_END_NODE();
374 }
375
376 void DebugVisitor::visit (const VarDec  &e)
377 {
378     DEBUG_START_NODE(e);
379     DEBUG(L"Exec VarDec", e);
380     DEBUG_START_NODE(e);
381     DEBUG(L"Exec Symbol : " + e.getSymbol().getName(), e);
382     DEBUG_END_NODE();
383     e.getInit().accept(*this);
384     DEBUG_END_NODE();
385 }
386
387 void DebugVisitor::visit (const FunctionDec  &e)
388 {
389     DEBUG_START_NODE(e);
390     DEBUG(L"Exec FunctionDec", e);
391     // FIXME
392
393     // First ask if there are some return values.
394     //visit(e.returns_get());
395
396     // Then get the function name
397     //visit(e.getName());
398
399     // Then get function args
400     //visit(e.args_get());
401
402     // Now debug function body
403     e.getBody().accept(*this);
404
405     DEBUG_END_NODE();
406 }
407
408 void DebugVisitor::visit(const ListExp &e)
409 {
410     DEBUG_START_NODE(e);
411     DEBUG(L"Exec ListExp", e);
412     e.getStart().accept(*this);
413     e.getStep().accept(*this);
414     e.getEnd().accept(*this);
415     DEBUG_END_NODE();
416 }
417
418 void DebugVisitor::visit(const OptimizedExp &e)
419 {
420     e.getOriginal()->accept(*this);
421 }
422
423 void DebugVisitor::visit(const DAXPYExp &e)
424 {
425     e.getOriginal()->accept(*this);
426 }
427
428 }