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