GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
pt-loop.h
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1996-2025 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if ! defined (octave_pt_loop_h)
27#define octave_pt_loop_h 1
28
29#include "octave-config.h"
30
31class octave_value;
32
33#include "pt-cmd.h"
34#include "pt-walk.h"
35
37
38class comment_list;
40class tree_expression;
42
43// While.
44
46{
47public:
48
49 tree_while_command (const token& while_tok, tree_expression *expr, tree_statement_list *body, const token& end_tok)
50 : m_while_tok (while_tok), m_expr (expr), m_body (body), m_end_tok (end_tok)
51 { }
52
53 OCTAVE_DISABLE_COPY_MOVE (tree_while_command)
54
56
57 filepos beg_pos () const { return m_while_tok.beg_pos (); }
58 filepos end_pos () const { return m_end_tok.end_pos (); }
59
60 tree_expression * condition () { return m_expr; }
61
62 tree_statement_list * body () { return m_body; }
63
65 {
66 tw.visit_while_command (*this);
67 }
68
69private:
70
71 token m_while_tok;
72
73 // Expression to test.
74 tree_expression *m_expr;
75
76 // List of commands to execute.
77 tree_statement_list *m_body {nullptr};
78
79 token m_end_tok;
80};
81
82// Do-Until.
83
85{
86public:
87
88 tree_do_until_command (const token& do_tok, tree_statement_list *body, const token& until_tok, tree_expression *expr)
89 : m_do_tok (do_tok), m_body (body), m_until_tok (until_tok), m_expr (expr)
90 { }
91
92 OCTAVE_DISABLE_COPY_MOVE (tree_do_until_command)
93
95
96 filepos beg_pos () const { return m_do_tok.beg_pos (); }
97 filepos end_pos () const { return m_expr->end_pos (); }
98
99 tree_statement_list * body () { return m_body; }
100
101 tree_expression * condition () { return m_expr; }
102
104 {
105 tw.visit_do_until_command (*this);
106 }
107
108private:
109
110 token m_do_tok;
111
112 // List of commands to execute.
113 tree_statement_list *m_body {nullptr};
114
115 token m_until_tok;
116
117 // Expression to test.
118 tree_expression *m_expr;
119};
120
121// For.
122
124{
125public:
126
127 tree_simple_for_command (bool parfor, const token& for_tok, const token& open_paren, tree_expression *le, const token& eq_tok,
128 tree_expression *re, const token& sep_tok, tree_expression *maxproc_arg, const token& close_paren,
129 tree_statement_list *body, const token& end_tok)
130 : m_parfor (parfor), m_for_tok (for_tok), m_open_paren (open_paren), m_lhs (le), m_eq_tok (eq_tok),
131 m_expr (re), m_sep_tok (sep_tok), m_maxproc (maxproc_arg), m_close_paren (close_paren),
132 m_body (body), m_end_tok (end_tok)
133 { }
134
135 OCTAVE_DISABLE_COPY_MOVE (tree_simple_for_command)
136
138
139 bool in_parallel () { return m_parfor; }
140
141 filepos beg_pos () const { return m_for_tok.beg_pos (); }
142 filepos end_pos () const { return m_end_tok.end_pos (); }
143
144 tree_expression * left_hand_side () { return m_lhs; }
145
146 tree_expression * control_expr () { return m_expr; }
147
148 tree_expression * maxproc_expr () { return m_maxproc; }
149
150 tree_statement_list * body () { return m_body; }
151
153 {
154 tw.visit_simple_for_command (*this);
155 }
156
157private:
158
159 // FIXME: it would be better to get this info from FOR_TOK.
160 bool m_parfor {false};
161
162 token m_for_tok;
163
164 token m_open_paren;
165
166 // Expression to modify.
167 tree_expression *m_lhs;
168
169 token m_eq_tok;
170
171 // Expression to evaluate.
172 tree_expression *m_expr;
173
174 token m_sep_tok;
175
176 // Expression to tell how many processors should be used (only valid
177 // if parallel is TRUE).
178 tree_expression *m_maxproc {nullptr};
179
180 token m_close_paren;
181
182 // List of commands to execute.
183 tree_statement_list *m_body;
184
185 token m_end_tok;
186};
187
189{
190public:
191
193 tree_statement_list *body, const token& end_tok)
194 : m_for_tok (for_tok), m_lhs (le), m_eq_tok (eq_tok), m_expr (re), m_body (body), m_end_tok (end_tok)
195 { }
196
197 OCTAVE_DISABLE_COPY_MOVE (tree_complex_for_command)
198
200
201 filepos beg_pos () const { return m_for_tok.beg_pos (); }
202 filepos end_pos () const { return m_end_tok.end_pos (); }
203
204 tree_argument_list * left_hand_side () { return m_lhs; }
205
206 tree_expression * control_expr () { return m_expr; }
207
208 tree_statement_list * body () { return m_body; }
209
211 {
212 tw.visit_complex_for_command (*this);
213 }
214
215private:
216
217 token m_for_tok;
218
219 // Expression to modify.
220 tree_argument_list *m_lhs;
221
222 token m_eq_tok;
223
224 // Expression to evaluate.
225 tree_expression *m_expr;
226
227 // List of commands to execute.
228 tree_statement_list *m_body;
229
230 token m_end_tok;
231};
232
233OCTAVE_END_NAMESPACE(octave)
234
235#endif
Definition token.h:42
filepos end_pos() const
Definition token.h:129
filepos beg_pos() const
Definition token.h:128
void accept(tree_walker &tw)
Definition pt-loop.h:210
tree_argument_list * left_hand_side()
Definition pt-loop.h:204
tree_statement_list * body()
Definition pt-loop.h:208
tree_complex_for_command(const token &for_tok, tree_argument_list *le, const token &eq_tok, tree_expression *re, tree_statement_list *body, const token &end_tok)
Definition pt-loop.h:192
filepos end_pos() const
Definition pt-loop.h:202
tree_expression * control_expr()
Definition pt-loop.h:206
filepos beg_pos() const
Definition pt-loop.h:201
tree_expression * condition()
Definition pt-loop.h:101
void accept(tree_walker &tw)
Definition pt-loop.h:103
tree_do_until_command(const token &do_tok, tree_statement_list *body, const token &until_tok, tree_expression *expr)
Definition pt-loop.h:88
tree_statement_list * body()
Definition pt-loop.h:99
filepos beg_pos() const
Definition pt-loop.h:96
filepos end_pos() const
Definition pt-loop.h:97
tree_expression * maxproc_expr()
Definition pt-loop.h:148
tree_simple_for_command(bool parfor, const token &for_tok, const token &open_paren, tree_expression *le, const token &eq_tok, tree_expression *re, const token &sep_tok, tree_expression *maxproc_arg, const token &close_paren, tree_statement_list *body, const token &end_tok)
Definition pt-loop.h:127
filepos end_pos() const
Definition pt-loop.h:142
void accept(tree_walker &tw)
Definition pt-loop.h:152
filepos beg_pos() const
Definition pt-loop.h:141
tree_expression * left_hand_side()
Definition pt-loop.h:144
tree_expression * control_expr()
Definition pt-loop.h:146
tree_statement_list * body()
Definition pt-loop.h:150
virtual void visit_complex_for_command(tree_complex_for_command &)
Definition pt-walk.cc:259
virtual void visit_do_until_command(tree_do_until_command &)
Definition pt-walk.cc:640
virtual void visit_simple_for_command(tree_simple_for_command &)
Definition pt-walk.cc:235
virtual void visit_while_command(tree_while_command &)
Definition pt-walk.cc:626
tree_while_command(const token &while_tok, tree_expression *expr, tree_statement_list *body, const token &end_tok)
Definition pt-loop.h:49
void accept(tree_walker &tw)
Definition pt-loop.h:64
filepos end_pos() const
Definition pt-loop.h:58
tree_statement_list * body()
Definition pt-loop.h:62
tree_expression * condition()
Definition pt-loop.h:60
filepos beg_pos() const
Definition pt-loop.h:57
virtual filepos end_pos() const =0
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn