first ast optimization, constant opexp, constant matrixexp
[scilab.git] / scilab / modules / ast / includes / ast / visitor.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 visitor.hxx
15  ** \brief Defines the root class of all visitor classes.
16  **
17  ** There are two kinds of visitors, just like there are two kinds of
18  ** iterators: the ConstVisitors (which cannot modify the tree they
19  ** visit), and the NonConstVisitors (which *can* modify the tree).\n
20  ** \n
21  ** Both kind of visitors share the same form of hierarchy:
22  ** AbstractVisitor (<- AConcreteVisitor).\n
23  ** \n
24  ** Since we don't want to implement twice the AbstractVisitor and
25  ** twice the DefaultVisitor, we use class templates:
26  ** \li GenVisitor < const_kind >
27  ** \li GenVisitor < non_const_kind >
28  */
29
30 #ifndef AST_VISITOR_HXX
31 #define AST_VISITOR_HXX
32
33 #include "decls.hxx"
34 #include "dynlib_ast.h"
35
36 namespace ast
37 {
38
39 /** \name Allow const selection. */
40 /** \{ */
41 /** \brief Select const methods. */
42 struct const_kind {};
43 /** \brief Select non-const methods. */
44 struct non_const_kind {};
45 /** \} */
46
47 template <typename K, typename T>
48 /** \brief select_const<SELECTOR, TYPE>.
49  **
50  ** We use template to be able to select the const or not
51  ** const variety of a TYPE.\n
52  ** SELECTOR must be `const_kind' or `non_const_kind'. */
53 struct select_const
54 {
55     /** \brief \a t is non-const, just like T. */
56     typedef T t;
57 };
58
59 template <typename T>
60 /** \brief select_const<const_kind, TYPE>
61  **
62  ** Specialized version of select_const for const_kind.
63  ** \see select_const */
64 struct select_const<const_kind, T>
65 {
66     /** \brief \a t is the const version of type T. */
67     typedef const T t;
68 };
69
70
71 template <typename K>
72 /** \brief Root class of all visitors.
73  **
74  ** GenVisitor<CONSTNESS-SELECTOR> is the root class of all
75  ** visitors. */
76 class EXTERN_AST GenVisitor
77 {
78     /** \name Ctor & dtor.
79      ** \{ */
80 public:
81     /** \brief Destroys a GenVisitor */
82     virtual ~GenVisitor ()
83     {
84     }
85     /** \} */
86
87     /** \name Visit Variable related nodes.
88      ** \{ */
89 public:
90     virtual void visit (typename select_const<K, SimpleVar>::t & e) = 0;
91     virtual void visit (typename select_const<K, DollarVar>::t & e) = 0;
92     virtual void visit (typename select_const<K, ColonVar>::t & e) = 0;
93     virtual void visit (typename select_const<K, ArrayListVar>::t & e) = 0;
94     /** \} */
95
96     /** \name Visit Constant Expressions related nodes.
97      ** \{ */
98 public:
99     virtual void visit (typename select_const<K, DoubleExp>::t & e) = 0;
100     virtual void visit (typename select_const<K, BoolExp>::t & e) = 0;
101     virtual void visit (typename select_const<K, StringExp>::t & e) = 0;
102     virtual void visit (typename select_const<K, CommentExp>::t & e) = 0;
103     virtual void visit (typename select_const<K, NilExp>::t & e) = 0;
104     /** \} */
105
106     /** \name Visit Instructions related nodes.
107      ** \{ */
108 public:
109     virtual void visit (typename select_const<K, CallExp>::t & e) = 0;
110     virtual void visit (typename select_const<K, CellCallExp>::t & e) = 0;
111     virtual void visit (typename select_const<K, OpExp>::t & e) = 0;
112     virtual void visit (typename select_const<K, LogicalOpExp>::t & e) = 0;
113     virtual void visit (typename select_const<K, AssignExp>::t & e) = 0;
114     virtual void visit (typename select_const<K, IfExp>::t & e) = 0;
115     virtual void visit (typename select_const<K, WhileExp>::t & e) = 0;
116     virtual void visit (typename select_const<K, ForExp>::t & e) = 0;
117     virtual void visit (typename select_const<K, BreakExp>::t & e) = 0;
118     virtual void visit (typename select_const<K, ContinueExp>::t & e) = 0;
119     virtual void visit (typename select_const<K, TryCatchExp>::t & e) = 0;
120     virtual void visit (typename select_const<K, SelectExp>::t & e) = 0;
121     virtual void visit (typename select_const<K, CaseExp>::t & e) = 0;
122     virtual void visit (typename select_const<K, ReturnExp>::t & e) = 0;
123     virtual void visit (typename select_const<K, FieldExp>::t & e) = 0;
124     /** \} */
125
126     /** \name Visit Single Operation related nodes.
127      ** \{ */
128 public:
129     virtual void visit (typename select_const<K, NotExp>::t & e) = 0;
130     virtual void visit (typename select_const<K, TransposeExp>::t & e) = 0;
131     /** \} */
132
133     /** \name Visit Matrix related nodes.
134      ** \{ */
135 public:
136     virtual void visit (typename select_const<K, MatrixExp>::t & e) = 0;
137     virtual void visit (typename select_const<K, MatrixLineExp>::t & e) = 0;
138     /** \} */
139
140     /** \name Visit Cell related nodes.
141      ** \{ */
142 public:
143     virtual void visit (typename select_const<K, CellExp>::t & e) = 0;
144     /** \} */
145
146     /** \name Visit List of Expressions related nodes.
147       ** \{ */
148 public:
149     virtual void visit (typename select_const<K, SeqExp>::t & e) = 0;
150     virtual void visit (typename select_const<K, ArrayListExp>::t & e) = 0;
151     virtual void visit (typename select_const<K, AssignListExp>::t & e) = 0;
152     /** \} */
153
154
155     /** \name Visit Declaration related nodes.
156      ** \{ */
157 public:
158     virtual void visit (typename select_const<K, VarDec>::t & e) = 0;
159     virtual void visit (typename select_const<K, FunctionDec>::t & e) = 0;
160     /** \} */
161
162     /** \name Visit Type dedicated Expressions related node.
163      ** \{ */
164 public:
165     virtual void visit (typename select_const<K, ListExp>::t & e) = 0;
166     /** \} */
167
168 public:
169     virtual void visit (typename select_const<K, OptimizedExp>::t & e) = 0;
170
171     /*optimized*/
172     virtual void visit (typename select_const<K, DAXPYExp>::t & e) = 0;
173 };
174
175 /** \brief Define shortand type for a const visitor */
176 typedef GenVisitor<const_kind> ConstVisitor;
177 /** \brief Define shortand type for a non const visitor */
178 typedef GenVisitor<non_const_kind> Visitor;
179
180 } // namespace ast
181
182
183 #endif // !AST_VISITOR_HXX