bug #14047: wrong behaviour of break ( continue ) in if outside of loop.
[scilab.git] / scilab / modules / ast / includes / exps / ifexp.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2006-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_IFEXP_HXX
14 #define AST_IFEXP_HXX
15
16 #include <assert.h>
17 #include "controlexp.hxx"
18
19 namespace ast
20 {
21 /*
22 ** \brief Abstract an If Expression node.
23 **
24 ** \b Example: if (2097 = 0) then disp("fail") else disp("OK")
25 */
26 class IfExp : public ControlExp
27 {
28 public:
29     /*
30     ** \brief Construct an If Expression node.
31     ** \param location scanner position informations
32     ** \param test chose the instruction to execute
33     ** \param then instruction if test is true
34     ** \param else instruction if test is false
35     */
36     IfExp(const Location& location,
37           Exp& test, SeqExp& t, SeqExp& e)
38         : ControlExp (location),
39           _hasElse (true)
40     {
41         test.setParent(this);
42         t.setParent(this);
43         e.setParent(this);
44         _exps.push_back(&test);
45         _exps.push_back(t.getAs<Exp>());
46         _exps.push_back(e.getAs<Exp>());
47     }
48
49     IfExp(const Location& location,
50           Exp& test, Exp& t)
51         : ControlExp (location),
52           _hasElse (false)
53     {
54         test.setParent(this);
55         t.setParent(this);
56
57         _exps.push_back(&test);
58         _exps.push_back(t.getAs<Exp>());
59         _exps.push_back(new ast::CommentExp(location, new std::wstring(L"No else !!")));
60         _exps[2]->setParent(this);
61     }
62
63     virtual ~IfExp()
64     {
65     }
66
67     virtual IfExp* clone()
68     {
69         IfExp* cloned = new IfExp(getLocation(), *getTest().clone(), *getThen().clone()->getAs<SeqExp>(), *getElse().clone()->getAs<SeqExp>());
70         cloned->setVerbose(isVerbose());
71         return cloned;
72     }
73
74     // \brief Visitors entry point.
75 public:
76     virtual void        accept(Visitor& v)
77     {
78         v.visit (*this);
79     }
80     virtual void        accept(ConstVisitor& v) const
81     {
82         v.visit (*this);
83     }
84
85     // \brief Accessors.
86 public:
87     // \brief Return the select condition of the loop (read only).
88     const Exp&  getTest() const
89     {
90         return *_exps[0];
91     }
92     // \brief Return the select condition of the loop (read and write).
93     Exp& getTest()
94     {
95         return *_exps[0];
96     }
97
98     // \brief Return the intructions if test is true (read only).
99     const Exp&  getThen() const
100     {
101         return *_exps[1];
102     }
103     // \brief Return the instructions if test is true (read and write).
104     Exp& getThen()
105     {
106         return *_exps[1];
107     }
108
109     // \brief Return the instruction if test is false (read only).
110     const Exp& getElse() const
111     {
112         return *_exps[2];
113     }
114     // \brief Return the instruction if test is false (read and write).
115     Exp& getElse()
116     {
117         return *_exps[2];
118     }
119
120     // \brief Return if there is an else body
121     bool hasElse()
122     {
123         return _hasElse;
124     }
125     // \brief Return if there is an else body
126     bool hasElse() const
127     {
128         return _hasElse;
129     }
130
131     virtual ExpType getType() const
132     {
133         return IFEXP;
134     }
135     inline bool isIfExp() const
136     {
137         return true;
138     }
139 protected:
140     // \brief "has a value" qualifier.
141     bool _hasElse;
142 };
143
144 } // namespace ast
145
146 #endif // !AST_IFEXP_HXX