* Bug 15599 fixed: now degree of zero polynomial is -Inf
[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         is_last_matrix_line(false),
40         is_last_column_comment(false) { }
41
42     PrintVisitor* clone()
43     {
44         return new PrintVisitor(*ostr, force_parenthesis, displayOriginal, headerOnly);
45     }
46
47     /** \name Visit Matrix Expressions nodes.
48     ** \{ */
49 public :
50     virtual void visit (const MatrixExp &e);
51     virtual void visit (const MatrixLineExp &e);
52     /** \} */
53
54     /** \name Visit Cell Expressions nodes.
55     ** \{ */
56 public :
57     virtual void visit (const CellExp &e);
58     /** \} */
59
60     /** \name Visit Constant Expressions nodes.
61     ** \{ */
62 public :
63     virtual void visit (const StringExp &e);
64     virtual void visit (const CommentExp &e);
65     virtual void visit (const DoubleExp  &e);
66     virtual void visit (const BoolExp  &e);
67     virtual void visit (const NilExp &e);
68     /** \} */
69
70     /** \name Visit Variable related nodes.
71     ** \{ */
72     virtual void visit (const SimpleVar &e);
73     virtual void visit (const ColonVar &e);
74     virtual void visit (const DollarVar &e);
75     virtual void visit (const ArrayListVar &e);
76     /** \} */
77
78     /** \name Visit Control Expressions or Instructions nodes.
79     ** \{ */
80     virtual void visit (const FieldExp &e);
81     virtual void visit (const OpExp &e);
82     virtual void visit (const LogicalOpExp &e);
83     virtual void visit (const AssignExp  &e);
84     virtual void visit (const CellCallExp &e);
85     virtual void visit (const CallExp &e);
86     virtual void visit (const IfExp  &e);
87     virtual void visit (const TryCatchExp  &e);
88     virtual void visit (const WhileExp  &e);
89     virtual void visit (const ForExp  &e);
90     virtual void visit (const BreakExp &e);
91     virtual void visit (const ContinueExp &e);
92     virtual void visit (const ReturnExp &e);
93     virtual void visit (const SelectExp &e);
94     virtual void visit (const CaseExp &e);
95     virtual void visit (const SeqExp  &e);
96     virtual void visit (const ArrayListExp  &e);
97     virtual void visit (const AssignListExp  &e);
98     /** \} */
99
100     /** \name Visit Single Operation nodes.
101     ** \{ */
102     virtual void visit (const NotExp &e);
103     virtual void visit (const TransposeExp &e);
104     /** \} */
105
106     /** \name Visit Declaration nodes.
107     ** \{ */
108     /** \brief Visit Var declarations. */
109     virtual void visit (const VarDec  &e);
110     virtual void visit (const FunctionDec  &e);
111     /** \} */
112
113     /** \name Visit Type dedicated Expressions related node.
114     ** \{ */
115 public:
116     virtual void visit(const ListExp &e);
117
118     /* optimized */
119     virtual void visit(const OptimizedExp &e);
120     virtual void visit(const MemfillExp &e);
121     virtual void visit(const DAXPYExp &e);
122     virtual void visit(const IntSelectExp &e);
123     virtual void visit(const StringSelectExp &e);
124     /** \} */
125
126
127     /*-------------.
128     | Attributes.  |
129     `-------------*/
130 protected:
131     std::wostream   *ostr;
132     bool            force_parenthesis;
133     const bool      displayOriginal;
134     const bool      headerOnly;
135     int             indent;
136     bool            is_last_matrix_line;
137     bool            is_last_column_comment;
138
139     void            apply_indent(void);
140     void            enable_force_parenthesis(void);
141     void            set_force_parenthesis(bool new_state);
142
143 private:
144
145     void printString(const std::wstring & value)
146     {
147         std::wstring::const_iterator it;
148         *ostr << SCI_OPEN_STRING;
149         for (it = value.begin() ; it != value.end() ; ++it)
150         {
151             if ( *it == '\'' || *it == '"')
152             {
153                 // ' -> '' and " -> "" in scilab strings
154                 *ostr << *it;
155             }
156             *ostr << *it;
157         }
158         *ostr << SCI_CLOSE_STRING;
159     }
160 };
161 }
162 #endif // !AST_PRINTVISITOR_HXX