279107ce44dfd49cefc402b4013819bbb23a2a21
[scilab.git] / scilab / modules / ast / includes / exps / exp.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2007-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 /**
14 ** \file exp.hxx
15 ** Define the Expression mother class.
16 */
17
18 #ifndef AST_EXP_HXX
19 #define AST_EXP_HXX
20
21 #include <list>
22 #include <vector>
23 #include <algorithm>
24 #include "ast.hxx"
25
26 namespace ast
27 {
28
29 /** \brief Define a shorthand for list of Exp* manipulation. */
30 typedef std::vector<Exp *> exps_t;
31
32 /** \brief Abstract an Expression node. */
33 class Exp : public Ast
34 {
35
36     /** \name Ctor & dtor.
37     ** \{ */
38 public:
39     /** \brief Construct an Expression node.
40     ** \param location scanner position informations */
41     Exp (const Location& location)
42         : Ast (location),
43           _verbose(false),
44           _bBreak(false),
45           _bBreakable(false),
46           _bReturn(false),
47           _bReturnable(false),
48           _bContinue(false),
49           _bContinuable(false),
50           parent(NULL),
51           original(NULL)
52     {
53         original = this;
54     }
55     /** \brief Destroys an Expression node. */
56     virtual ~Exp ()
57     {
58         for (exps_t::const_iterator it = _exps.begin(), itEnd = _exps.end(); it != itEnd; ++it)
59         {
60             if (*it != NULL)
61             {
62                 delete *it;
63             }
64         }
65
66         if (original && original != this)
67         {
68             delete original;
69         }
70     }
71     /** \} */
72
73     virtual Exp* clone() = 0;
74
75     virtual bool equal(const Exp & e) const
76     {
77         if (getType() == e.getType() && _exps.size() == e._exps.size())
78         {
79             for (exps_t::const_iterator i = _exps.begin(), j = e._exps.begin(), _e = _exps.end(); i != _e; ++i, ++j)
80             {
81                 if (!(*i)->equal(**j))
82                 {
83                     return false;
84                 }
85             }
86             return true;
87         }
88         return false;
89     }
90
91     inline bool operator==(const Exp & R) const
92     {
93         return equal(R);
94     }
95
96     inline bool operator!=(const Exp & R) const
97     {
98         return !equal(R);
99     }
100
101 public:
102     /** \brief Return if an expression should be displayed or not. */
103     inline void mute(void)
104     {
105         _verbose = false;
106     }
107
108     /** \brief Return if an expression should be displayed or not. */
109     inline void setVerbose(bool verbose)
110     {
111         _verbose = verbose;
112     }
113
114     /** \brief Return if an expression should be displayed or not. */
115     inline virtual bool isVerbose(void) const
116     {
117         return _verbose;
118     }
119
120     //manage break instruction
121     inline void setBreak(void)
122     {
123         _bBreak = true;
124     }
125
126     inline void resetBreak(void)
127     {
128         _bBreak = false;
129     }
130
131     inline virtual bool isBreak(void) const
132     {
133         return _bBreak;
134     }
135
136     virtual inline void setBreakable(void)
137     {
138         _bBreakable = true;
139     }
140
141     inline void resetBreakable(void)
142     {
143         _bBreakable = false;
144     }
145
146     inline virtual bool isBreakable(void) const
147     {
148         return _bBreakable;
149     }
150
151     //manage return instruction
152     inline void setReturn(void)
153     {
154         _bReturn = true;
155     }
156
157     inline void resetReturn(void)
158     {
159         _bReturn = false;
160     }
161
162     inline virtual bool isReturn(void) const
163     {
164         return _bReturn;
165     }
166
167     virtual inline void setReturnable(void)
168     {
169         _bReturnable = true;
170     }
171
172     inline void resetReturnable(void)
173     {
174         _bReturnable = false;
175     }
176
177     inline virtual bool isReturnable(void) const
178     {
179         return _bReturnable;
180     }
181
182     //manage continue instruction
183     inline void setContinue(void)
184     {
185         _bContinue = true;
186     }
187
188     inline void resetContinue(void)
189     {
190         _bContinue = false;
191     }
192
193     inline virtual bool isContinue(void) const
194     {
195         return _bContinue;
196     }
197
198     virtual inline void setContinuable(void)
199     {
200         _bContinuable = true;
201     }
202
203     inline void resetContinuable(void)
204     {
205         _bContinuable = false;
206     }
207
208     inline virtual bool isContinuable(void) const
209     {
210         return _bContinuable;
211     }
212
213     //manage derived exp
214     enum ExpType
215     {
216         SIMPLEVAR,
217         DOLLARVAR,
218         COLONVAR,
219         ARRAYLISTVAR,
220         DOUBLEEXP,
221         BOOLEXP,
222         STRINGEXP,
223         COMMENTEXP,
224         CONSTEXP,
225         NILEXP,
226         CALLEXP,
227         CELLCALLEXP,
228         OPEXP,
229         LOGICALOPEXP,
230         ASSIGNEXP,
231         IFEXP,
232         WHILEEXP,
233         FOREXP,
234         BREAKEXP,
235         CONTINUEEXP,
236         TRYCATCHEXP,
237         SELECTEXP,
238         CASEEXP,
239         RETURNEXP,
240         FIELDEXP,
241         NOTEXP,
242         TRANSPOSEEXP,
243         MATRIXEXP,
244         MATRIXLINEEXP,
245         CELLEXP,
246         SEQEXP,
247         ARRAYLISTEXP,
248         ASSIGNLISTEXP,
249         VARDEC,
250         FUNCTIONDEC,
251         LISTEXP,
252         OPTIMIZEDEXP,
253         MEMFILLEXP,
254         DAXPYEXP,
255         STRINGSELECTEXP,
256         TABLEINTSELECTEXP,
257         MAPINTSELECTEXP,
258         SMALLINTSELECTEXP,
259     };
260
261     virtual ExpType getType() const = 0;
262
263     template <class T>
264     inline T* getAs(void)
265     {
266         return static_cast<T*>(this);
267     }
268
269     template <class T>
270     inline const T* getAs(void) const
271     {
272         return static_cast<const T*>(this);
273     }
274
275     inline virtual bool isSimpleVar() const
276     {
277         return false;
278     }
279
280     inline virtual bool isDollarVar() const
281     {
282         return false;
283     }
284
285     inline virtual bool isColonVar() const
286     {
287         return false;
288     }
289
290     inline virtual bool isArrayListVar() const
291     {
292         return false;
293     }
294
295     inline virtual bool isDoubleExp() const
296     {
297         return false;
298     }
299
300     inline virtual bool isBoolExp() const
301     {
302         return false;
303     }
304
305     inline virtual bool isStringExp() const
306     {
307         return false;
308     }
309
310     inline virtual bool isCommentExp() const
311     {
312         return false;
313     }
314
315     inline virtual bool isConstExp() const
316     {
317         return false;
318     }
319
320     inline virtual bool isNilExp() const
321     {
322         return false;
323     }
324
325     inline virtual bool isCallExp() const
326     {
327         return false;
328     }
329
330     inline virtual bool isCellCallExp() const
331     {
332         return false;
333     }
334
335     inline virtual bool isOpExp() const
336     {
337         return false;
338     }
339
340     inline virtual bool isLogicalOpExp() const
341     {
342         return false;
343     }
344
345     inline virtual bool isAssignExp() const
346     {
347         return false;
348     }
349
350     inline virtual bool isIfExp() const
351     {
352         return false;
353     }
354
355     inline virtual bool isWhileExp() const
356     {
357         return false;
358     }
359
360     inline virtual bool isForExp() const
361     {
362         return false;
363     }
364
365     inline virtual bool isBreakExp() const
366     {
367         return false;
368     }
369
370     inline virtual bool isContinueExp() const
371     {
372         return false;
373     }
374
375     inline virtual bool isTryCatchExp() const
376     {
377         return false;
378     }
379
380     inline virtual bool isSelectExp() const
381     {
382         return false;
383     }
384
385     inline virtual bool isCaseExp() const
386     {
387         return false;
388     }
389
390     inline virtual bool isReturnExp() const
391     {
392         return false;
393     }
394
395     inline virtual bool isFieldExp() const
396     {
397         return false;
398     }
399
400     inline virtual bool isNotExp() const
401     {
402         return false;
403     }
404
405     inline virtual bool isTransposeExp() const
406     {
407         return false;
408     }
409
410     inline virtual bool isMatrixExp() const
411     {
412         return false;
413     }
414
415     inline virtual bool isMatrixLineExp() const
416     {
417         return false;
418     }
419
420     inline virtual bool isCellExp() const
421     {
422         return false;
423     }
424
425     inline virtual bool isSeqExp() const
426     {
427         return false;
428     }
429
430     inline virtual bool isArrayListExp() const
431     {
432         return false;
433     }
434
435     inline virtual bool isAssignListExp() const
436     {
437         return false;
438     }
439
440     inline virtual bool isVarDec() const
441     {
442         return false;
443     }
444
445     inline virtual bool isFunctionDec() const
446     {
447         return false;
448     }
449
450     inline virtual bool isListExp() const
451     {
452         return false;
453     }
454
455     inline virtual bool isOptimizedExp() const
456     {
457         return false;
458     }
459
460     inline virtual bool isMemfillExp() const
461     {
462         return false;
463     }
464
465     inline virtual bool isFastSelectExp() const
466     {
467         return false;
468     }
469
470     inline virtual bool isStringSelectExp() const
471     {
472         return false;
473     }
474
475     inline virtual bool isIntSelectExp() const
476     {
477         return false;
478     }
479
480     inline virtual bool isTableIntSelectExp() const
481     {
482         return false;
483     }
484
485     inline virtual bool isMapIntSelectExp() const
486     {
487         return false;
488     }
489
490     inline virtual bool isSmallIntSelectExp() const
491     {
492         return false;
493     }
494
495     inline Exp* getParent() const
496     {
497         return parent;
498     }
499
500     inline Exp* getParent()
501     {
502         return parent;
503     }
504
505     inline void setParent(Exp* _ast)
506     {
507         parent = _ast;
508     }
509
510     inline Exp* getOriginal() const
511     {
512         return original;
513     }
514
515     inline Exp* getOriginal()
516     {
517         return original;
518     }
519
520     inline void setOriginal(Exp* _ast)
521     {
522         original = _ast;
523     }
524
525     inline void replace(Exp* _new)
526     {
527         if (parent && _new)
528         {
529             parent->replace(this, _new);
530         }
531     }
532
533     inline void replace(Exp* _old, Exp* _new)
534     {
535         if (_old && _new)
536         {
537             for (exps_t::iterator it = _exps.begin(), itEnd = _exps.end(); it != itEnd; ++it)
538             {
539                 if (*it == _old)
540                 {
541                     _new->setOriginal(_old);
542                     *it = _new;
543                     _new->setParent(this);
544                     return;
545                 }
546             }
547         }
548     }
549
550     inline const exps_t & getExps() const
551     {
552         return _exps;
553     }
554
555     inline exps_t & getExps()
556     {
557         return _exps;
558     }
559
560 private:
561     bool _verbose;
562     bool _bBreak;
563     bool _bBreakable;
564     bool _bReturn;
565     bool _bReturnable;
566     bool _bContinue;
567     bool _bContinuable;
568 protected:
569     exps_t _exps;
570     Exp* parent;
571     Exp* original;
572 };
573 } // namespace ast
574
575 #endif // !AST_EXP_HXX