Analysis: always a WIP but we would expect that the end is nearer than the begin
[scilab.git] / scilab / modules / ast / includes / ast / printvisitor.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 #ifndef AST_PRINTVISITOR_HXX
14 #define AST_PRINTVISITOR_HXX
15
16 #include <string.h>
17
18 #include "visitor.hxx"
19 #include "allexp.hxx"
20 #include "allvar.hxx"
21 #include "alldec.hxx"
22 #include "token.hxx"
23
24 namespace ast
25 {
26 class EXTERN_AST PrintVisitor : public GenVisitor<const_kind>
27 {
28 public:
29
30     PrintVisitor(std::wostream& my_ostr, bool parenthesis_display = true, bool _displayOriginal = true) :
31         ostr (&my_ostr),
32         force_parenthesis (parenthesis_display),
33         displayOriginal(_displayOriginal),
34         indent(0) { }
35
36     /** \name Visit Matrix Expressions nodes.
37     ** \{ */
38 public :
39     virtual void visit (const MatrixExp &e);
40     virtual void visit (const MatrixLineExp &e);
41     /** \} */
42
43     /** \name Visit Cell Expressions nodes.
44     ** \{ */
45 public :
46     virtual void visit (const CellExp &e);
47     /** \} */
48
49     /** \name Visit Constant Expressions nodes.
50     ** \{ */
51 public :
52     virtual void visit (const StringExp &e);
53     virtual void visit (const CommentExp &e);
54     virtual void visit (const DoubleExp  &e);
55     virtual void visit (const BoolExp  &e);
56     virtual void visit (const NilExp &e);
57     /** \} */
58
59     /** \name Visit Variable related nodes.
60     ** \{ */
61     virtual void visit (const SimpleVar &e);
62     virtual void visit (const ColonVar &e);
63     virtual void visit (const DollarVar &e);
64     virtual void visit (const ArrayListVar &e);
65     /** \} */
66
67     /** \name Visit Control Expressions or Instructions nodes.
68     ** \{ */
69     virtual void visit (const FieldExp &e);
70     virtual void visit (const OpExp &e);
71     virtual void visit (const LogicalOpExp &e);
72     virtual void visit (const AssignExp  &e);
73     virtual void visit (const CellCallExp &e);
74     virtual void visit (const CallExp &e);
75     virtual void visit (const IfExp  &e);
76     virtual void visit (const TryCatchExp  &e);
77     virtual void visit (const WhileExp  &e);
78     virtual void visit (const ForExp  &e);
79     virtual void visit (const BreakExp &e);
80     virtual void visit (const ContinueExp &e);
81     virtual void visit (const ReturnExp &e);
82     virtual void visit (const SelectExp &e);
83     virtual void visit (const CaseExp &e);
84     virtual void visit (const SeqExp  &e);
85     virtual void visit (const ArrayListExp  &e);
86     virtual void visit (const AssignListExp  &e);
87     /** \} */
88
89     /** \name Visit Single Operation nodes.
90     ** \{ */
91     virtual void visit (const NotExp &e);
92     virtual void visit (const TransposeExp &e);
93     /** \} */
94
95     /** \name Visit Declaration nodes.
96     ** \{ */
97     /** \brief Visit Var declarations. */
98     virtual void visit (const VarDec  &e);
99     virtual void visit (const FunctionDec  &e);
100     /** \} */
101
102     /** \name Visit Type dedicated Expressions related node.
103     ** \{ */
104 public:
105     virtual void visit(const ListExp &e);
106
107     /* optimized */
108     virtual void visit(const OptimizedExp &e);
109     virtual void visit(const MemfillExp &e);
110     virtual void visit(const DAXPYExp &e);
111     virtual void visit(const IntSelectExp &e);
112     virtual void visit(const StringSelectExp &e);
113     /** \} */
114
115
116     /*-------------.
117     | Attributes.  |
118     `-------------*/
119 protected:
120     std::wostream   *ostr;
121     int             indent;
122     bool            force_parenthesis;
123     const bool      displayOriginal;
124     bool            is_last_matrix_line;
125     bool            is_last_column_comment;
126
127     void            apply_indent(void);
128     void            enable_force_parenthesis(void);
129     void            set_force_parenthesis(bool new_state);
130
131 private:
132
133     void printString(const std::wstring & value)
134     {
135         std::wstring::const_iterator it;
136         *ostr << SCI_OPEN_STRING;
137         for (it = value.begin() ; it != value.end() ; ++it)
138         {
139             if ( *it == '\'' || *it == '"')
140             {
141                 // ' -> '' and " -> "" in scilab strings
142                 *ostr << *it;
143             }
144             *ostr << *it;
145         }
146         *ostr << SCI_CLOSE_STRING;
147     }
148 };
149 }
150 #endif // !AST_PRINTVISITOR_HXX