License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / includes / exps / forexp.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 /**
17  ** \file forexp.hxx
18  ** Define the For Expression class.
19  */
20
21 #ifndef AST_FOREXP_HXX
22 #define AST_FOREXP_HXX
23
24 #include "controlexp.hxx"
25 #include "vardec.hxx"
26
27 namespace ast
28 {
29
30 /** \brief Abstract a For Expression node.
31 **
32 ** \b Example: for i = 0:2097 do print("WipeOut") */
33 class ForExp : public ControlExp
34 {
35     /** \name Ctor & dtor.
36     ** \{ */
37 public:
38     /** \brief Construct a For Expression node.
39     ** \param location scanner position informations
40     ** \param vardec implicit variable declaration
41     ** \param body instructions executed in the for loop
42     **
43     ** \b Example: for i = 0:2097 do print("WipeOut")
44     ** \li "i = 0:2097" is the variable declaration
45     ** \li "print("WipeOut")" is the body
46     */
47     ForExp (const Location& location,
48             Exp& vardec, SeqExp& body)
49         : ControlExp (location)
50     {
51         vardec.setParent(this);
52         body.setParent(this);
53         _exps.push_back(&vardec);
54         _exps.push_back(body.getAs<Exp>());
55
56         body.setBreakable();
57         body.setContinuable();
58     }
59
60     /** \brief Destroy a For Expression node.
61     **
62     ** Delete vardec, hi and body (see constructor). */
63     virtual ~ForExp ()
64     {
65     }
66     /** \} */
67
68     virtual ForExp* clone()
69     {
70         ForExp* cloned = new ForExp(getLocation(), *getVardec().clone(), *getBody().clone()->getAs<SeqExp>());
71         cloned->setVerbose(isVerbose());
72         return cloned;
73     }
74
75     /** \name Visitors entry point.
76     ** \{ */
77 public:
78     /** \brief Accept a const visitor \a v. */
79     virtual void accept (Visitor& v)
80     {
81         v.visit (*this);
82     }
83     /** \brief Accept a non-const visitor \a v. */
84     virtual void accept (ConstVisitor& v) const
85     {
86         v.visit (*this);
87     }
88     /** \} */
89
90
91     /** \name Accessors.
92     ** \{ */
93 public:
94     /** \brief Return the implicit variable declaration (read only) */
95     Exp& getVardec() const
96     {
97         return *_exps[0];
98     }
99     /** \brief Return the implicit variable declaration (read and write) */
100     Exp& getVardec()
101     {
102         return *_exps[0];
103     }
104
105     /** \brief Return the body of the loop (read only) */
106     const Exp& getBody() const
107     {
108         return *_exps[1];
109     }
110     /** \brief Return the body of the loop (read and write) */
111     Exp& getBody()
112     {
113         return *_exps[1];
114     }
115     /** \} */
116
117     virtual ExpType getType() const
118     {
119         return FOREXP;
120     }
121     inline bool isForExp() const
122     {
123         return true;
124     }
125 };
126
127 } // namespace ast
128
129 #endif // !AST_FOREXP_HXX