Command line debugger first version
[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     //force devrived class to implement clone method
88     virtual GenVisitor* clone() = 0;
89
90
91     /** \name Visit Variable related nodes.
92      ** \{ */
93 public:
94     virtual void visit (typename select_const<K, SimpleVar>::t & e) = 0;
95     virtual void visit (typename select_const<K, DollarVar>::t & e) = 0;
96     virtual void visit (typename select_const<K, ColonVar>::t & e) = 0;
97     virtual void visit (typename select_const<K, ArrayListVar>::t & e) = 0;
98     /** \} */
99
100     /** \name Visit Constant Expressions related nodes.
101      ** \{ */
102 public:
103     virtual void visit (typename select_const<K, DoubleExp>::t & e) = 0;
104     virtual void visit (typename select_const<K, BoolExp>::t & e) = 0;
105     virtual void visit (typename select_const<K, StringExp>::t & e) = 0;
106     virtual void visit (typename select_const<K, CommentExp>::t & e) = 0;
107     virtual void visit (typename select_const<K, NilExp>::t & e) = 0;
108     /** \} */
109
110     /** \name Visit Instructions related nodes.
111      ** \{ */
112 public:
113     virtual void visit (typename select_const<K, CallExp>::t & e) = 0;
114     virtual void visit (typename select_const<K, CellCallExp>::t & e) = 0;
115     virtual void visit (typename select_const<K, OpExp>::t & e) = 0;
116     virtual void visit (typename select_const<K, LogicalOpExp>::t & e) = 0;
117     virtual void visit (typename select_const<K, AssignExp>::t & e) = 0;
118     virtual void visit (typename select_const<K, IfExp>::t & e) = 0;
119     virtual void visit (typename select_const<K, WhileExp>::t & e) = 0;
120     virtual void visit (typename select_const<K, ForExp>::t & e) = 0;
121     virtual void visit (typename select_const<K, BreakExp>::t & e) = 0;
122     virtual void visit (typename select_const<K, ContinueExp>::t & e) = 0;
123     virtual void visit (typename select_const<K, TryCatchExp>::t & e) = 0;
124     virtual void visit (typename select_const<K, SelectExp>::t & e) = 0;
125     virtual void visit (typename select_const<K, CaseExp>::t & e) = 0;
126     virtual void visit (typename select_const<K, ReturnExp>::t & e) = 0;
127     virtual void visit (typename select_const<K, FieldExp>::t & e) = 0;
128     /** \} */
129
130     /** \name Visit Single Operation related nodes.
131      ** \{ */
132 public:
133     virtual void visit (typename select_const<K, NotExp>::t & e) = 0;
134     virtual void visit (typename select_const<K, TransposeExp>::t & e) = 0;
135     /** \} */
136
137     /** \name Visit Matrix related nodes.
138      ** \{ */
139 public:
140     virtual void visit (typename select_const<K, MatrixExp>::t & e) = 0;
141     virtual void visit (typename select_const<K, MatrixLineExp>::t & e) = 0;
142     /** \} */
143
144     /** \name Visit Cell related nodes.
145      ** \{ */
146 public:
147     virtual void visit (typename select_const<K, CellExp>::t & e) = 0;
148     /** \} */
149
150     /** \name Visit List of Expressions related nodes.
151       ** \{ */
152 public:
153     virtual void visit (typename select_const<K, SeqExp>::t & e) = 0;
154     virtual void visit (typename select_const<K, ArrayListExp>::t & e) = 0;
155     virtual void visit (typename select_const<K, AssignListExp>::t & e) = 0;
156     /** \} */
157
158
159     /** \name Visit Declaration related nodes.
160      ** \{ */
161 public:
162     virtual void visit (typename select_const<K, VarDec>::t & e) = 0;
163     virtual void visit (typename select_const<K, FunctionDec>::t & e) = 0;
164     /** \} */
165
166     /** \name Visit Type dedicated Expressions related node.
167      ** \{ */
168 public:
169     virtual void visit (typename select_const<K, ListExp>::t & e) = 0;
170     /** \} */
171
172 public:
173     virtual void visit (typename select_const<K, OptimizedExp>::t & e) = 0;
174     virtual void visit (typename select_const<K, MemfillExp>::t & e) = 0;
175
176     /*optimized*/
177     virtual void visit (typename select_const<K, DAXPYExp>::t & e) = 0;
178
179     virtual void visit (typename select_const<K, IntSelectExp>::t & e) = 0;
180     virtual void visit (typename select_const<K, StringSelectExp>::t & e) = 0;
181 };
182
183 /** \brief Define shortand type for a const visitor */
184 typedef GenVisitor<const_kind> ConstVisitor;
185 /** \brief Define shortand type for a non const visitor */
186 typedef GenVisitor<non_const_kind> Visitor;
187
188 } // namespace ast
189
190
191 #endif // !AST_VISITOR_HXX