62dda71e0b6f823359b566e151b47209cd87f6af
[scilab.git] / scilab / modules / ast / includes / ast / debugvisitor.hxx
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 #ifndef AST_DEBUGVISITOR_HXX
14 #define AST_DEBUGVISITOR_HXX
15
16 #include <iostream>
17 #include <sstream>
18
19 #include "visitor.hxx"
20 #include "allexp.hxx"
21 #include "allvar.hxx"
22 #include "alldec.hxx"
23 #include "alltypes.hxx"
24
25 namespace ast
26 {
27 class EXTERN_AST DebugVisitor : public GenVisitor<const_kind>
28 {
29 public:
30     DebugVisitor(std::wostream & my_ostr = std::wcerr, const bool _printDecoration = false) : ostr(&my_ostr), printDecoration(_printDecoration) { }
31
32     /** \name Visit Matrix Expressions nodes.
33      ** \{ */
34 public :
35     virtual void visit (const MatrixExp &e);
36     virtual void visit (const MatrixLineExp &e);
37     /** \} */
38
39     /** \name Visit Cell Expressions nodes.
40      ** \{ */
41 public :
42     virtual void visit (const CellExp &e);
43     /** \} */
44
45     /** \name Visit Constant Expressions nodes.
46      ** \{ */
47 public :
48     virtual void visit (const StringExp &e);
49     virtual void visit (const CommentExp &e);
50     virtual void visit (const DoubleExp  &e);
51     virtual void visit (const BoolExp  &e);
52     virtual void visit (const NilExp &e);
53     /** \} */
54
55     /** \name Visit Variable related nodes.
56      ** \{ */
57     virtual void visit (const SimpleVar &e);
58     virtual void visit (const ColonVar &e);
59     virtual void visit (const DollarVar &e);
60     virtual void visit (const ArrayListVar &e);
61     /** \} */
62
63     /** \name Visit Control Expressions or Instructions nodes.
64      ** \{ */
65     virtual void visit (const FieldExp &e);
66     virtual void visit (const OpExp &e);
67     virtual void visit (const LogicalOpExp &e);
68     virtual void visit (const AssignExp  &e);
69     virtual void visit (const CellCallExp &e);
70     virtual void visit (const CallExp &e);
71     virtual void visit (const IfExp  &e);
72     virtual void visit (const TryCatchExp  &e);
73     virtual void visit (const WhileExp  &e);
74     virtual void visit (const ForExp  &e);
75     virtual void visit (const BreakExp &e);
76     virtual void visit (const ContinueExp &e);
77     virtual void visit (const ReturnExp &e);
78     virtual void visit (const SeqExp  &e);
79     virtual void visit (const SelectExp  &e);
80     virtual void visit (const CaseExp  &e);
81     virtual void visit (const ArrayListExp  &e);
82     virtual void visit (const AssignListExp  &e);
83     /** \} */
84
85     /** \name Visit Single Operation nodes.
86      ** \{ */
87     virtual void visit (const NotExp &e);
88     virtual void visit (const TransposeExp &e);
89     /** \} */
90
91     /** \name Visit Declaration nodes.
92      ** \{ */
93     /** \brief Visit Var declarations. */
94     virtual void visit (const VarDec  &e);
95     virtual void visit (const FunctionDec  &e);
96     /** \} */
97
98     /** \name Visit Type dedicated Expressions related node.
99      ** \{ */
100 public:
101     virtual void visit(const ListExp &e);
102
103     /* optimized */
104     virtual void visit(const OptimizedExp &e);
105     virtual void visit(const MemfillExp &e);
106     virtual void visit(const DAXPYExp &e);
107     virtual void visit(const IntSelectExp &e);
108     virtual void visit(const StringSelectExp &e);
109     /** \} */
110
111     template<typename T>
112     inline void printInternalType(std::wostringstream & stream, types::InternalType * pIT)
113     {
114         T * pT = static_cast<T *>(pIT);
115         if (pT)
116         {
117             const int size = pT->getSize();
118             if (size == 0)
119             {
120                 stream << L"[]";
121             }
122             else if (size == 1)
123             {
124                 stream << pT->get(0);
125             }
126             else
127             {
128                 stream << L"[";
129                 const int _size = std::min(4, size);
130                 for (unsigned int i = 0; i < _size - 1; ++i)
131                 {
132                     stream << pT->get(i) << L",";
133                 }
134                 stream << pT->get(_size - 1);
135                 if (size <= _size)
136                 {
137                     stream << L"]";
138                 }
139                 else
140                 {
141                     stream << L"...";
142                 }
143             }
144         }
145     }
146
147 protected:
148
149     std::wostream * ostr;
150     const bool printDecoration;
151
152 private:
153
154     void DEBUG_START_NODE(const ast::Ast & e);
155     void DEBUG_END_NODE(void);
156     void DEBUG(const std::wstring& str);
157     void DEBUG(const std::wstring& str, const Exp & e);
158 };
159 }
160 #endif // !AST_DEBUGVISITOR_HXX