comparison src/pt-exp.h @ 2980:cd5ad3fd8049

[project @ 1997-05-16 01:12:13 by jwe]
author jwe
date Fri, 16 May 1997 01:13:19 +0000
parents a3556d2adec9
children daa1ed1f5462
comparison
equal deleted inserted replaced
2979:a3556d2adec9 2980:cd5ad3fd8049
18 along with Octave; see the file COPYING. If not, write to the Free 18 along with Octave; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 20
21 */ 21 */
22 22
23 #if !defined (octave_tree_expr2_h) 23 #if !defined (octave_tree_expr_h)
24 #define octave_tree_expr2_h 1 24 #define octave_tree_expr_h 1
25 25
26 #if defined (__GNUG__) 26 #if defined (__GNUG__)
27 #pragma interface 27 #pragma interface
28 #endif 28 #endif
29 29
30 class ostream; 30 #include <string>
31
32 class tree_identifier;
33 class tree_index_expression;
34 class tree_indirect_ref;
35 class tree_argument_list;
36 class tree_assignment_lhs;
37
38 class tree_walker;
39 31
40 class octave_value; 32 class octave_value;
41 class octave_value_list;
42 class octave_lvalue; 33 class octave_lvalue;
43 34
44 #include "oct-obj.h" 35 #include "pt-base.h"
45 #include "pt-exp-base.h"
46 36
47 // Unary expressions. 37 // A base class for expressions.
48 38
49 class 39 class
50 tree_unary_expression : public tree_expression 40 tree_expression : public tree
51 { 41 {
52 public: 42 public:
53 43
54 tree_unary_expression (int l = -1, int c = -1) 44 tree_expression (int l = -1, int c = -1)
55 : tree_expression (l, c), op (0) { } 45 : tree (l, c), num_parens (0), postfix_indexed (false),
46 print_flag (false) { }
56 47
57 tree_unary_expression (tree_expression *e, int l = -1, int c = -1) 48 virtual ~tree_expression (void) { }
58 : tree_expression (l, c), op (e) { }
59 49
60 ~tree_unary_expression (void) { delete op; } 50 virtual bool is_constant (void) const
51 { return false; }
61 52
62 tree_expression *operand (void) { return op; } 53 virtual bool is_matrix_constant (void) const
54 { return false; }
55
56 virtual bool is_identifier (void) const
57 { return false; }
58
59 virtual bool is_index_expression (void) const
60 { return false; }
61
62 virtual bool is_indirect_ref (void) const
63 { return false; }
64
65 virtual bool is_assignment_expression (void) const
66 { return false; }
67
68 virtual bool is_prefix_expression (void) const
69 { return false; }
70
71 virtual bool is_logically_true (const char *);
72
73 virtual bool lvalue_ok (void) const
74 { return false; }
75
76 virtual bool rvalue_ok (void) const
77 { return false; }
78
79 virtual octave_value rvalue (void);
80
81 virtual octave_value_list rvalue (int nargout);
82
83 virtual octave_lvalue lvalue (void);
84
85 int paren_count (void) const
86 { return num_parens; }
87
88 bool is_postfix_indexed (void) const
89 { return postfix_indexed; }
90
91 bool print_result (void) const
92 { return print_flag; }
93
94 virtual string oper (void) const
95 { return "<unknown>"; }
96
97 virtual string name (void) const
98 { return "<unknown>"; }
99
100 virtual string original_text (void) const;
101
102 tree_expression *mark_in_parens (void)
103 {
104 num_parens++;
105 return this;
106 }
107
108 tree_expression *mark_postfix_indexed (void)
109 {
110 postfix_indexed = true;
111 return this;
112 }
113
114 tree_expression *set_print_flag (bool print)
115 {
116 print_flag = print;
117 return this;
118 }
63 119
64 protected: 120 protected:
65 121
66 // The operand for the expression. 122 // A count of the number of times this expression appears directly
67 tree_expression *op; 123 // inside a set of parentheses.
68 }; 124 //
125 // (((e1)) + e2) ==> 2 for expression e1
126 // ==> 1 for expression ((e1)) + e2
127 // ==> 0 for expression e2
128 int num_parens;
69 129
70 // Prefix expressions. 130 // A flag that says whether this expression has an index associated
131 // with it. See the code in tree_identifier::rvalue for the rationale.
132 bool postfix_indexed;
71 133
72 class 134 // Print result of rvalue for this expression?
73 tree_prefix_expression : public tree_unary_expression 135 bool print_flag;
74 {
75 public:
76
77 enum type
78 {
79 unknown,
80 unot,
81 uminus,
82 increment,
83 decrement
84 };
85
86 tree_prefix_expression (int l = -1, int c = -1)
87 : tree_unary_expression (l, c), etype (unknown) { }
88
89 tree_prefix_expression (type t = unknown, tree_expression *e,
90 int l = -1, int c = -1)
91 : tree_unary_expression (e, l, c), etype (t) { }
92
93 ~tree_prefix_expression (void) { }
94
95 bool rvalue_ok (void) const
96 { return true; }
97
98 octave_value rvalue (void);
99
100 octave_value_list rvalue (int nargou);
101
102 void eval_error (void);
103
104 string oper (void) const;
105
106 void accept (tree_walker& tw);
107
108 private:
109
110 // The type of the expression.
111 type etype;
112 };
113
114 // Postfix expressions.
115
116 class
117 tree_postfix_expression : public tree_unary_expression
118 {
119 public:
120
121 enum type
122 {
123 unknown,
124 hermitian,
125 transpose,
126 increment,
127 decrement
128 };
129
130 tree_postfix_expression (int l = -1, int c = -1)
131 : tree_unary_expression (l, c), etype (unknown) { }
132
133 tree_postfix_expression (type t = unknown, tree_expression *e,
134 int l = -1, int c = -1)
135 : tree_unary_expression (e, l, c), etype (t) { }
136
137 ~tree_postfix_expression (void) { }
138
139 bool rvalue_ok (void) const
140 { return true; }
141
142 octave_value rvalue (void);
143
144 octave_value_list rvalue (int nargout);
145
146 void eval_error (void);
147
148 string oper (void) const;
149
150 void accept (tree_walker& tw);
151
152 private:
153
154 // The type of the expression.
155 type etype;
156 };
157
158 // Binary expressions.
159
160 class
161 tree_binary_expression : public tree_expression
162 {
163 public:
164
165 tree_binary_expression (int l = -1, int c = -1,
166 octave_value::binary_op t
167 = octave_value::unknown_binary_op)
168 : tree_expression (l, c), op_lhs (0), op_rhs (0), etype (t) { }
169
170 tree_binary_expression (tree_expression *a, tree_expression *b,
171 int l = -1, int c = -1,
172 octave_value::binary_op t
173 = octave_value::unknown_binary_op)
174 : tree_expression (l, c), op_lhs (a), op_rhs (b), etype (t) { }
175
176 ~tree_binary_expression (void)
177 {
178 delete op_lhs;
179 delete op_rhs;
180 }
181
182 bool rvalue_ok (void) const
183 { return true; }
184
185 octave_value rvalue (void);
186
187 octave_value_list rvalue (int nargou);
188
189 void eval_error (void);
190
191 string oper (void) const;
192
193 tree_expression *lhs (void) { return op_lhs; }
194 tree_expression *rhs (void) { return op_rhs; }
195
196 void accept (tree_walker& tw);
197
198 protected:
199
200 // The operands for the expression.
201 tree_expression *op_lhs;
202 tree_expression *op_rhs;
203
204 private:
205
206 // The type of the expression.
207 octave_value::binary_op etype;
208 };
209
210 // Boolean expressions.
211
212 class
213 tree_boolean_expression : public tree_binary_expression
214 {
215 public:
216
217 enum type
218 {
219 unknown,
220 bool_and,
221 bool_or
222 };
223
224 tree_boolean_expression (int l = -1, int c = -1, type t = unknown)
225 : tree_binary_expression (l, c), etype (t) { }
226
227 tree_boolean_expression (tree_expression *a, tree_expression *b,
228 int l = -1, int c = -1, type t = unknown)
229 : tree_binary_expression (a, b, l, c), etype (t) { }
230
231 ~tree_boolean_expression (void) { }
232
233 bool rvalue_ok (void) const
234 { return true; }
235
236 octave_value rvalue (void);
237
238 octave_value_list rvalue (int nargout);
239
240 string oper (void) const;
241
242 private:
243
244 // The type of the expression.
245 type etype;
246 };
247
248 // Simple assignment expressions.
249
250 class
251 tree_simple_assignment : public tree_expression
252 {
253 public:
254
255 tree_simple_assignment (bool plhs = false, int l = -1, int c = -1,
256 octave_value::assign_op t = octave_value::asn_eq)
257 : tree_expression (l, c), lhs (0), rhs (0), preserve (plhs), etype (t) { }
258
259 tree_simple_assignment (tree_expression *le, tree_expression *re,
260 bool plhs = false, int l = -1, int c = -1,
261 octave_value::assign_op t = octave_value::asn_eq)
262 : tree_expression (l, c), lhs (le), rhs (re), preserve (plhs),
263 etype (t) { }
264
265 ~tree_simple_assignment (void);
266
267 bool rvalue_ok (void) const
268 { return true; }
269
270 octave_value rvalue (void);
271
272 octave_value_list rvalue (int nargout);
273
274 bool is_assignment_expression (void) const
275 { return true; }
276
277 void eval_error (void);
278
279 string oper (void) const;
280
281 tree_expression *left_hand_side (void) { return lhs; }
282
283 tree_expression *right_hand_side (void) { return rhs; }
284
285 void accept (tree_walker& tw);
286
287 private:
288
289 void do_assign (octave_lvalue& ult, const octave_value_list& args,
290 const octave_value& rhs_val);
291
292 void do_assign (octave_lvalue& ult, const octave_value& rhs_val);
293
294 // The left hand side of the assignment.
295 tree_expression *lhs;
296
297 // The right hand side of the assignment.
298 tree_expression *rhs;
299
300 // True if we should not delete the lhs.
301 bool preserve;
302
303 // True if this is an assignment to the built-in variable ans.
304 bool ans_ass;
305
306 // The type of the expression.
307 octave_value::assign_op etype;
308 };
309
310 // Colon expressions.
311
312 class
313 tree_colon_expression : public tree_expression
314 {
315 public:
316
317 tree_colon_expression (int l = -1, int c = -1)
318 : tree_expression (l, c), op_base (0), op_limit (0), op_increment (0) { }
319
320 tree_colon_expression (tree_expression *e, int l = -1, int c = -1)
321 : tree_expression (l, c), op_base (e), op_limit (0), op_increment (0) { }
322
323 ~tree_colon_expression (void)
324 {
325 delete op_base;
326 delete op_limit;
327 delete op_increment;
328 }
329
330 tree_colon_expression *append (tree_expression *t);
331
332 bool rvalue_ok (void) const
333 { return true; }
334
335 octave_value rvalue (void);
336
337 octave_value_list rvalue (int nargout);
338
339 void eval_error (const string& s = string ());
340
341 tree_expression *base (void) { return op_base; }
342 tree_expression *limit (void) { return op_limit; }
343 tree_expression *increment (void) { return op_increment; }
344
345 void accept (tree_walker& tw);
346
347 private:
348
349 // The components of the expression.
350 tree_expression *op_base;
351 tree_expression *op_limit;
352 tree_expression *op_increment;
353 };
354
355 // Index expressions.
356
357 class
358 tree_index_expression : public tree_expression
359 {
360 public:
361
362 tree_index_expression (tree_expression *e = 0, tree_argument_list *lst = 0,
363 int l = -1, int c = -1)
364 : tree_expression (l, c), expr (e), list (lst), arg_nm () { }
365
366 ~tree_index_expression (void);
367
368 bool is_index_expression (void) const
369 { return true; }
370
371 tree_expression *expression (void)
372 { return expr; }
373
374 tree_argument_list *arg_list (void)
375 { return list; }
376
377 bool rvalue_ok (void) const
378 { return true; }
379
380 octave_value rvalue (void);
381
382 octave_value_list rvalue (int nargout);
383
384 octave_lvalue lvalue (void);
385
386 void eval_error (void);
387
388 void accept (tree_walker& tw);
389
390 private:
391
392 tree_expression *expr;
393
394 tree_argument_list *list;
395
396 string_vector arg_nm;
397 };
398
399 // Multi-valued assignment expressions.
400
401 class
402 tree_multi_assignment : public tree_expression
403 {
404 public:
405
406 tree_multi_assignment (bool plhs = false, int l = -1, int c = -1)
407 : tree_expression (l, c), preserve (plhs), lhs (0), rhs (0) { }
408
409 tree_multi_assignment (tree_argument_list *lst, tree_expression *r,
410 bool plhs = false, int l = -1, int c = -1)
411 : tree_expression (l, c), preserve (plhs), lhs (lst), rhs (r) { }
412
413 ~tree_multi_assignment (void);
414
415 bool is_assignment_expression (void) const
416 { return true; }
417
418 bool rvalue_ok (void) const
419 { return true; }
420
421 octave_value rvalue (void);
422
423 octave_value_list rvalue (int nargout);
424
425 void eval_error (void);
426
427 tree_argument_list *left_hand_side (void) { return lhs; }
428
429 tree_expression *right_hand_side (void) { return rhs; }
430
431 void accept (tree_walker& tw);
432
433 private:
434
435 bool preserve;
436 tree_argument_list *lhs;
437 tree_expression *rhs;
438 }; 136 };
439 137
440 #endif 138 #endif
441 139
442 /* 140 /*