GPL + CeCILL Header change
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  * === LICENSE_END ===
14  *
15  */
16
17 #ifndef AST_PRINTVISITOR_HXX
18 #define AST_PRINTVISITOR_HXX
19
20 #include <string.h>
21
22 #include "visitor.hxx"
23 #include "allexp.hxx"
24 #include "allvar.hxx"
25 #include "alldec.hxx"
26 #include "token.hxx"
27
28 namespace ast
29 {
30 class EXTERN_AST PrintVisitor : public GenVisitor<const_kind>
31 {
32 public:
33
34     PrintVisitor(std::wostream& my_ostr, bool parenthesis_display = true, bool _displayOriginal = true, bool _headerOnly = false) :
35         ostr (&my_ostr),
36         force_parenthesis (parenthesis_display),
37         displayOriginal(_displayOriginal),
38         headerOnly(_headerOnly),
39         indent(0) { }
40
41     PrintVisitor* clone()
42     {
43         return new PrintVisitor(*ostr, force_parenthesis, displayOriginal, headerOnly);
44     }
45
46     /** \name Visit Matrix Expressions nodes.
47     ** \{ */
48 public :
49     virtual void visit (const MatrixExp &e);
50     virtual void visit (const MatrixLineExp &e);
51     /** \} */
52
53     /** \name Visit Cell Expressions nodes.
54     ** \{ */
55 public :
56     virtual void visit (const CellExp &e);
57     /** \} */
58
59     /** \name Visit Constant Expressions nodes.
60     ** \{ */
61 public :
62     virtual void visit (const StringExp &e);
63     virtual void visit (const CommentExp &e);
64     virtual void visit (const DoubleExp  &e);
65     virtual void visit (const BoolExp  &e);
66     virtual void visit (const NilExp &e);
67     /** \} */
68
69     /** \name Visit Variable related nodes.
70     ** \{ */
71     virtual void visit (const SimpleVar &e);
72     virtual void visit (const ColonVar &e);
73     virtual void visit (const DollarVar &e);
74     virtual void visit (const ArrayListVar &e);
75     /** \} */
76
77     /** \name Visit Control Expressions or Instructions nodes.
78     ** \{ */
79     virtual void visit (const FieldExp &e);
80     virtual void visit (const OpExp &e);
81     virtual void visit (const LogicalOpExp &e);
82     virtual void visit (const AssignExp  &e);
83     virtual void visit (const CellCallExp &e);
84     virtual void visit (const CallExp &e);
85     virtual void visit (const IfExp  &e);
86     virtual void visit (const TryCatchExp  &e);
87     virtual void visit (const WhileExp  &e);
88     virtual void visit (const ForExp  &e);
89     virtual void visit (const BreakExp &e);
90     virtual void visit (const ContinueExp &e);
91     virtual void visit (const ReturnExp &e);
92     virtual void visit (const SelectExp &e);
93     virtual void visit (const CaseExp &e);
94     virtual void visit (const SeqExp  &e);
95     virtual void visit (const ArrayListExp  &e);
96     virtual void visit (const AssignListExp  &e);
97     /** \} */
98
99     /** \name Visit Single Operation nodes.
100     ** \{ */
101     virtual void visit (const NotExp &e);
102     virtual void visit (const TransposeExp &e);
103     /** \} */
104
105     /** \name Visit Declaration nodes.
106     ** \{ */
107     /** \brief Visit Var declarations. */
108     virtual void visit (const VarDec  &e);
109     virtual void visit (const FunctionDec  &e);
110     /** \} */
111
112     /** \name Visit Type dedicated Expressions related node.
113     ** \{ */
114 public:
115     virtual void visit(const ListExp &e);
116
117     /* optimized */
118     virtual void visit(const OptimizedExp &e);
119     virtual void visit(const MemfillExp &e);
120     virtual void visit(const DAXPYExp &e);
121     virtual void visit(const IntSelectExp &e);
122     virtual void visit(const StringSelectExp &e);
123     /** \} */
124
125
126     /*-------------.
127     | Attributes.  |
128     `-------------*/
129 protected:
130     std::wostream   *ostr;
131     int             indent;
132     bool            force_parenthesis;
133     const bool      displayOriginal;
134     const bool      headerOnly;
135     bool            is_last_matrix_line;
136     bool            is_last_column_comment;
137
138     void            apply_indent(void);
139     void            enable_force_parenthesis(void);
140     void            set_force_parenthesis(bool new_state);
141
142 private:
143
144     void printString(const std::wstring & value)
145     {
146         std::wstring::const_iterator it;
147         *ostr << SCI_OPEN_STRING;
148         for (it = value.begin() ; it != value.end() ; ++it)
149         {
150             if ( *it == '\'' || *it == '"')
151             {
152                 // ' -> '' and " -> "" in scilab strings
153                 *ostr << *it;
154             }
155             *ostr << *it;
156         }
157         *ostr << SCI_CLOSE_STRING;
158     }
159 };
160 }
161 #endif // !AST_PRINTVISITOR_HXX