* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / ast / dummyvisitor.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __DUMMYVISITOR_HXX__
17 #define __DUMMYVISITOR_HXX__
18
19 #include "visitor.hxx"
20 #include "allexp.hxx"
21 #include "allvar.hxx"
22 #include "alldec.hxx"
23
24 /*
25 ** This class defines a dummy visitor which only purpose is to
26 ** followup itself through the AST.
27 */
28
29 namespace ast
30 {
31 class EXTERN_AST DummyVisitor : public ConstVisitor
32 {
33 protected:
34     DummyVisitor() {}
35
36     DummyVisitor* clone()
37     {
38         return new DummyVisitor();
39     }
40
41     virtual void visit(const MatrixExp &e)
42     {
43         exps_t lines = e.getLines();
44         for (exps_t::const_iterator it = lines.begin(), itEnd = lines.end(); it != itEnd ; ++it)
45         {
46             (*it)->accept (*this);
47         }
48     }
49
50     virtual void visit (const MatrixLineExp &e)
51     {
52         exps_t columns = e.getColumns();
53         for (exps_t::const_iterator it = columns.begin(), itEnd = columns.end(); it != itEnd ; ++it)
54         {
55             (*it)->accept (*this);
56         }
57     }
58
59     virtual void visit (const CellExp &e)
60     {
61         exps_t lines = e.getLines();
62         for (exps_t::const_iterator it = lines.begin(), itEnd = lines.end(); it != itEnd ; ++it)
63         {
64             (*it)->accept (*this);
65         }
66     }
67
68     virtual void visit (const StringExp &/*e*/)
69     {
70         // Nothing to follow up ...
71     }
72
73     virtual void visit (const CommentExp &/*e*/)
74     {
75         // Nothing to follow up ...
76     }
77
78     virtual void visit (const DoubleExp  &/*e*/)
79     {
80         // Nothing to follow up ...
81     }
82
83     virtual void visit (const BoolExp  &/*e*/)
84     {
85         // Nothing to follow up ...
86     }
87
88     virtual void visit (const NilExp &/*e*/)
89     {
90         // Nothing to follow up ...
91     }
92
93     virtual void visit (const SimpleVar &/*e*/)
94     {
95         // Nothing to follow up ...
96     }
97
98     virtual void visit (const ColonVar &/*e*/)
99     {
100         // Nothing to follow up ...
101     }
102
103     virtual void visit (const DollarVar &/*e*/)
104     {
105         // Nothing to follow up ...
106     }
107
108     virtual void visit (const ArrayListVar &e)
109     {
110         exps_t vars = e.getVars();
111         for (exps_t::const_iterator it = vars.begin (), itEnd = vars.end(); it != itEnd; ++it)
112         {
113             (*it)->accept(*this);
114         }
115     }
116
117     virtual void visit (const FieldExp &e)
118     {
119         e.getHead()->accept(*this);
120         e.getTail()->accept(*this);
121     }
122
123     virtual void visit(const OpExp &e)
124     {
125         e.getLeft().accept(*this);
126         e.getRight().accept(*this);
127     }
128
129     virtual void visit(const LogicalOpExp &e)
130     {
131         e.getLeft().accept(*this);
132         e.getRight().accept(*this);
133     }
134
135     virtual void visit (const AssignExp  &e)
136     {
137         e.getLeftExp().accept (*this);
138         e.getRightExp().accept (*this);
139     }
140
141     virtual void visit(const CellCallExp &e)
142     {
143         e.getName().accept (*this);
144
145         exps_t args = e.getArgs();
146         for (auto arg : args)
147         {
148             arg->accept(*this);
149         }
150     }
151
152     virtual void visit(const CallExp &e)
153     {
154         e.getName().accept (*this);
155
156         exps_t args = e.getArgs();
157         for (auto arg : args)
158         {
159             arg->accept(*this);
160         }
161     }
162
163     virtual void visit (const IfExp  &e)
164     {
165         e.getTest().accept(*this);
166         e.getThen().accept(*this);
167         if (e.hasElse())
168         {
169             e.getElse().accept(*this);
170         }
171     }
172
173     virtual void visit (const TryCatchExp  &e)
174     {
175         e.getTry().accept(*this);
176         e.getCatch().accept(*this);
177     }
178
179     virtual void visit (const WhileExp  &e)
180     {
181         e.getTest().accept (*this);
182         e.getBody().accept (*this);
183     }
184
185     virtual void visit (const ForExp  &e)
186     {
187         e.getVardec().accept(*this);
188         e.getBody().accept (*this);
189     }
190
191     virtual void visit (const BreakExp &/*e*/)
192     {
193         // Nothing to follow up ...
194     }
195
196     virtual void visit (const ContinueExp &/*e*/)
197     {
198         // Nothing to follow up ...
199     }
200
201     virtual void visit (const ReturnExp &e)
202     {
203         if (!e.isGlobal())
204         {
205             e.getExp().accept(*this);
206         }
207     }
208
209     virtual void visit (const SelectExp &e)
210     {
211         e.getSelect()->accept(*this);
212
213         exps_t cases = e.getCases();
214         for (auto exp : cases)
215         {
216             exp->accept(*this);
217         }
218
219         if (e.getDefaultCase() != NULL)
220         {
221             e.getDefaultCase()->accept(*this);
222         }
223     }
224
225     virtual void visit (const CaseExp &e)
226     {
227         e.getTest()->accept(*this);
228         e.getBody()->accept(*this);
229     }
230
231     virtual void visit (const SeqExp  &e)
232     {
233         for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
234         {
235             (*it)->accept(*this);
236         }
237     }
238
239     virtual void visit (const ArrayListExp  &e)
240     {
241         for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
242         {
243             (*it)->accept (*this);
244         }
245     }
246
247     virtual void visit (const AssignListExp  &e)
248     {
249         for (exps_t::const_iterator it = e.getExps().begin (), itEnd = e.getExps().end(); it != itEnd; ++it)
250         {
251             (*it)->accept (*this);
252         }
253     }
254     /** \} */
255
256     /** \name Visit Single Operation nodes.
257      ** \{ */
258     virtual void visit (const NotExp &e)
259     {
260         e.getExp().accept (*this);
261     }
262
263     virtual void visit (const TransposeExp &e)
264     {
265         e.getExp().accept (*this);
266     }
267     /** \} */
268
269     /** \name Visit Declaration nodes.
270      ** \{ */
271     /** \brief Visit Var declarations. */
272     virtual void visit (const VarDec  &e)
273     {
274         e.getInit().accept(*this);
275     }
276
277     virtual void visit (const FunctionDec  &e)
278     {
279         e.getArgs().accept(*this);
280         e.getReturns().accept(*this);
281         e.getBody().accept(*this);
282     }
283     /** \} */
284
285     /** \name Visit Type dedicated Expressions related node.
286      ** \{ */
287     virtual void visit(const ListExp &e)
288     {
289         e.getStart().accept(*this);
290         e.getStep().accept(*this);
291         e.getEnd().accept(*this);
292     }
293     /** \} */
294
295     /* optimized */
296     virtual void visit(const OptimizedExp &e)
297     {
298         e.getOriginal()->accept(*this);
299     }
300
301     virtual void visit (const DAXPYExp &e)
302     {
303         e.getOriginal()->accept(*this);
304     }
305
306     virtual void visit(const IntSelectExp &e)
307     {
308         e.getOriginal()->accept(*this);
309     }
310
311     virtual void visit(const StringSelectExp &e)
312     {
313         e.getOriginal()->accept(*this);
314     }
315
316     virtual void visit(const MemfillExp &e)
317     {
318         e.getOriginal()->accept(*this);
319     }
320
321 };
322 }
323
324 #endif /* !__DUMMYVISITOR_HXX__ */