comparison src/pt-unop.cc @ 3203:bc61b0e8d60e

[project @ 1998-10-30 20:26:27 by jwe]
author jwe
date Fri, 30 Oct 1998 20:26:31 +0000
parents 20f5cec4f11c
children 096ad38d7ab5
comparison
equal deleted inserted replaced
3202:44d82b369c78 3203:bc61b0e8d60e
33 #include "oct-lvalue.h" 33 #include "oct-lvalue.h"
34 #include "ov.h" 34 #include "ov.h"
35 #include "pt-unop.h" 35 #include "pt-unop.h"
36 #include "pt-walk.h" 36 #include "pt-walk.h"
37 37
38 // Unary expressions.
39
40 string
41 tree_unary_expression::oper (void) const
42 {
43 return octave_value::unary_op_as_string (etype);
44 }
45
38 // Prefix expressions. 46 // Prefix expressions.
39 47
40 octave_value_list 48 octave_value_list
41 tree_prefix_expression::rvalue (int nargout) 49 tree_prefix_expression::rvalue (int nargout)
42 { 50 {
59 if (error_state) 67 if (error_state)
60 return retval; 68 return retval;
61 69
62 if (op) 70 if (op)
63 { 71 {
64 if (etype == unot || etype == uminus) 72 if (etype == octave_value::incr || etype == octave_value::decr)
73 {
74 octave_lvalue ref = op->lvalue ();
75
76 if (error_state)
77 eval_error ();
78 else if (ref.is_defined ())
79 {
80 ref.do_unary_op (etype);
81
82 retval = ref.value ();
83 }
84 else
85 eval_error ();
86 }
87 else
65 { 88 {
66 octave_value val = op->rvalue (); 89 octave_value val = op->rvalue ();
67 90
68 if (! error_state) 91 if (error_state)
69 { 92 eval_error ();
70 if (val.is_defined ()) 93 else if (val.is_defined ())
94 {
95 retval = ::do_unary_op (etype, val);
96
97 if (error_state)
71 { 98 {
72 if (etype == unot) 99 retval = octave_value ();
73 retval = val.not (); 100 eval_error ();
74 else
75 retval = val.uminus ();
76 } 101 }
77 else 102 }
78 error ("argument to prefix operator `%s' undefined", 103 else
79 oper () . c_str ()); 104 eval_error ();
80 } 105 }
81 }
82 else if (etype == increment || etype == decrement)
83 {
84 octave_lvalue ref = op->lvalue ();
85
86 if (! error_state)
87 {
88 if (ref.is_defined ())
89 {
90 if (etype == increment)
91 ref.increment ();
92 else
93 ref.decrement ();
94
95 retval = ref.value ();
96 }
97 else
98 error ("argument to prefix operator `%s' undefined",
99 oper () . c_str ());
100 }
101 }
102 else
103 error ("prefix operator %d not implemented", etype);
104 } 106 }
105 107
106 return retval; 108 return retval;
107 } 109 }
108 110
110 tree_prefix_expression::eval_error (void) 112 tree_prefix_expression::eval_error (void)
111 { 113 {
112 if (error_state > 0) 114 if (error_state > 0)
113 ::error ("evaluating prefix operator `%s' near line %d, column %d", 115 ::error ("evaluating prefix operator `%s' near line %d, column %d",
114 oper () . c_str (), line (), column ()); 116 oper () . c_str (), line (), column ());
115 }
116
117 string
118 tree_prefix_expression::oper (void) const
119 {
120 string retval = "<unknown>";
121
122 switch (etype)
123 {
124 case unot:
125 retval = "!";
126 break;
127
128 case uminus:
129 retval = "-";
130 break;
131
132 case increment:
133 retval = "++";
134 break;
135
136 case decrement:
137 retval = "--";
138 break;
139
140 default:
141 break;
142 }
143
144 return retval;
145 } 117 }
146 118
147 void 119 void
148 tree_prefix_expression::accept (tree_walker& tw) 120 tree_prefix_expression::accept (tree_walker& tw)
149 { 121 {
174 if (error_state) 146 if (error_state)
175 return retval; 147 return retval;
176 148
177 if (op) 149 if (op)
178 { 150 {
179 if (etype == transpose || etype == hermitian) 151 if (etype == octave_value::incr || etype == octave_value::decr)
152 {
153 octave_lvalue ref = op->lvalue ();
154
155 if (error_state)
156 eval_error ();
157 else if (ref.is_defined ())
158 {
159 retval = ref.value ();
160
161 ref.do_unary_op (etype);
162 }
163 else
164 eval_error ();
165 }
166 else
180 { 167 {
181 octave_value val = op->rvalue (); 168 octave_value val = op->rvalue ();
182 169
183 if (! error_state) 170 if (error_state)
184 { 171 eval_error ();
185 if (val.is_defined ()) 172 else if (val.is_defined ())
173 {
174 retval = ::do_unary_op (etype, val);
175
176 if (error_state)
186 { 177 {
187 if (etype == transpose) 178 retval = octave_value ();
188 retval = val.transpose (); 179 eval_error ();
189 else
190 retval = val.hermitian ();
191 } 180 }
192 else 181 }
193 error ("argument to postfix operator `%s' undefined", 182 else
194 oper () . c_str ()); 183 eval_error ();
195 } 184 }
196 }
197 else if (etype == increment || etype == decrement)
198 {
199 octave_lvalue ref = op->lvalue ();
200
201 if (! error_state)
202 {
203 if (ref.is_defined ())
204 {
205 retval = ref.value ();
206
207 if (etype == increment)
208 ref.increment ();
209 else
210 ref.decrement ();
211 }
212 else
213 error ("argument to postfix operator `%s' undefined",
214 oper () . c_str ());
215 }
216 }
217 else
218 error ("postfix operator %d not implemented", etype);
219 } 185 }
186 else
187 eval_error ();
220 188
221 return retval; 189 return retval;
222 } 190 }
223 191
224 void 192 void
225 tree_postfix_expression::eval_error (void) 193 tree_postfix_expression::eval_error (void)
226 { 194 {
227 if (error_state > 0) 195 if (error_state > 0)
228 ::error ("evaluating postfix operator `%s' near line %d, column %d", 196 ::error ("evaluating postfix operator `%s' near line %d, column %d",
229 oper () . c_str (), line (), column ()); 197 oper () . c_str (), line (), column ());
230 }
231
232 string
233 tree_postfix_expression::oper (void) const
234 {
235 string retval = "<unknown>";
236
237 switch (etype)
238 {
239 case transpose:
240 retval = ".'";
241 break;
242
243 case hermitian:
244 retval = "'";
245 break;
246
247 case increment:
248 retval = "++";
249 break;
250
251 case decrement:
252 retval = "--";
253 break;
254
255 default:
256 break;
257 }
258
259 return retval;
260 } 198 }
261 199
262 void 200 void
263 tree_postfix_expression::accept (tree_walker& tw) 201 tree_postfix_expression::accept (tree_walker& tw)
264 { 202 {