matchexp.cc revision 1.1 1 1.1 mrg /* Expression parser.
2 1.1 mrg Copyright (C) 2000-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Andy Vaught
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg #include "config.h"
22 1.1 mrg #include "system.h"
23 1.1 mrg #include "coretypes.h"
24 1.1 mrg #include "gfortran.h"
25 1.1 mrg #include "arith.h"
26 1.1 mrg #include "match.h"
27 1.1 mrg
28 1.1 mrg static const char expression_syntax[] = N_("Syntax error in expression at %C");
29 1.1 mrg
30 1.1 mrg
31 1.1 mrg /* Match a user-defined operator name. This is a normal name with a
32 1.1 mrg few restrictions. The error_flag controls whether an error is
33 1.1 mrg raised if 'true' or 'false' are used or not. */
34 1.1 mrg
35 1.1 mrg match
36 1.1 mrg gfc_match_defined_op_name (char *result, int error_flag)
37 1.1 mrg {
38 1.1 mrg static const char * const badops[] = {
39 1.1 mrg "and", "or", "not", "eqv", "neqv", "eq", "ne", "ge", "le", "lt", "gt",
40 1.1 mrg NULL
41 1.1 mrg };
42 1.1 mrg
43 1.1 mrg char name[GFC_MAX_SYMBOL_LEN + 1];
44 1.1 mrg locus old_loc;
45 1.1 mrg match m;
46 1.1 mrg int i;
47 1.1 mrg
48 1.1 mrg old_loc = gfc_current_locus;
49 1.1 mrg
50 1.1 mrg m = gfc_match (" . %n .", name);
51 1.1 mrg if (m != MATCH_YES)
52 1.1 mrg return m;
53 1.1 mrg
54 1.1 mrg /* .true. and .false. have interpretations as constants. Trying to
55 1.1 mrg use these as operators will fail at a later time. */
56 1.1 mrg
57 1.1 mrg if (strcmp (name, "true") == 0 || strcmp (name, "false") == 0)
58 1.1 mrg {
59 1.1 mrg if (error_flag)
60 1.1 mrg goto error;
61 1.1 mrg gfc_current_locus = old_loc;
62 1.1 mrg return MATCH_NO;
63 1.1 mrg }
64 1.1 mrg
65 1.1 mrg for (i = 0; badops[i]; i++)
66 1.1 mrg if (strcmp (badops[i], name) == 0)
67 1.1 mrg goto error;
68 1.1 mrg
69 1.1 mrg for (i = 0; name[i]; i++)
70 1.1 mrg if (!ISALPHA (name[i]))
71 1.1 mrg {
72 1.1 mrg gfc_error ("Bad character %qc in OPERATOR name at %C", name[i]);
73 1.1 mrg return MATCH_ERROR;
74 1.1 mrg }
75 1.1 mrg
76 1.1 mrg strcpy (result, name);
77 1.1 mrg return MATCH_YES;
78 1.1 mrg
79 1.1 mrg error:
80 1.1 mrg gfc_error ("The name %qs cannot be used as a defined operator at %C",
81 1.1 mrg name);
82 1.1 mrg
83 1.1 mrg gfc_current_locus = old_loc;
84 1.1 mrg return MATCH_ERROR;
85 1.1 mrg }
86 1.1 mrg
87 1.1 mrg
88 1.1 mrg /* Match a user defined operator. The symbol found must be an
89 1.1 mrg operator already. */
90 1.1 mrg
91 1.1 mrg static match
92 1.1 mrg match_defined_operator (gfc_user_op **result)
93 1.1 mrg {
94 1.1 mrg char name[GFC_MAX_SYMBOL_LEN + 1];
95 1.1 mrg match m;
96 1.1 mrg
97 1.1 mrg m = gfc_match_defined_op_name (name, 0);
98 1.1 mrg if (m != MATCH_YES)
99 1.1 mrg return m;
100 1.1 mrg
101 1.1 mrg *result = gfc_get_uop (name);
102 1.1 mrg return MATCH_YES;
103 1.1 mrg }
104 1.1 mrg
105 1.1 mrg
106 1.1 mrg /* Check to see if the given operator is next on the input. If this
107 1.1 mrg is not the case, the parse pointer remains where it was. */
108 1.1 mrg
109 1.1 mrg static int
110 1.1 mrg next_operator (gfc_intrinsic_op t)
111 1.1 mrg {
112 1.1 mrg gfc_intrinsic_op u;
113 1.1 mrg locus old_loc;
114 1.1 mrg
115 1.1 mrg old_loc = gfc_current_locus;
116 1.1 mrg if (gfc_match_intrinsic_op (&u) == MATCH_YES && t == u)
117 1.1 mrg return 1;
118 1.1 mrg
119 1.1 mrg gfc_current_locus = old_loc;
120 1.1 mrg return 0;
121 1.1 mrg }
122 1.1 mrg
123 1.1 mrg
124 1.1 mrg /* Call the INTRINSIC_PARENTHESES function. This is both
125 1.1 mrg used explicitly, as below, or by resolve.cc to generate
126 1.1 mrg temporaries. */
127 1.1 mrg
128 1.1 mrg gfc_expr *
129 1.1 mrg gfc_get_parentheses (gfc_expr *e)
130 1.1 mrg {
131 1.1 mrg gfc_expr *e2;
132 1.1 mrg
133 1.1 mrg e2 = gfc_get_operator_expr (&e->where, INTRINSIC_PARENTHESES, e, NULL);
134 1.1 mrg e2->ts = e->ts;
135 1.1 mrg e2->rank = e->rank;
136 1.1 mrg
137 1.1 mrg return e2;
138 1.1 mrg }
139 1.1 mrg
140 1.1 mrg
141 1.1 mrg /* Match a primary expression. */
142 1.1 mrg
143 1.1 mrg static match
144 1.1 mrg match_primary (gfc_expr **result)
145 1.1 mrg {
146 1.1 mrg match m;
147 1.1 mrg gfc_expr *e;
148 1.1 mrg
149 1.1 mrg m = gfc_match_literal_constant (result, 0);
150 1.1 mrg if (m != MATCH_NO)
151 1.1 mrg return m;
152 1.1 mrg
153 1.1 mrg m = gfc_match_array_constructor (result);
154 1.1 mrg if (m != MATCH_NO)
155 1.1 mrg return m;
156 1.1 mrg
157 1.1 mrg m = gfc_match_rvalue (result);
158 1.1 mrg if (m != MATCH_NO)
159 1.1 mrg return m;
160 1.1 mrg
161 1.1 mrg /* Match an expression in parentheses. */
162 1.1 mrg if (gfc_match_char ('(') != MATCH_YES)
163 1.1 mrg return MATCH_NO;
164 1.1 mrg
165 1.1 mrg m = gfc_match_expr (&e);
166 1.1 mrg if (m == MATCH_NO)
167 1.1 mrg goto syntax;
168 1.1 mrg if (m == MATCH_ERROR)
169 1.1 mrg return m;
170 1.1 mrg
171 1.1 mrg m = gfc_match_char (')');
172 1.1 mrg if (m == MATCH_NO)
173 1.1 mrg gfc_error ("Expected a right parenthesis in expression at %C");
174 1.1 mrg
175 1.1 mrg /* Now we have the expression inside the parentheses, build the
176 1.1 mrg expression pointing to it. By 7.1.7.2, any expression in
177 1.1 mrg parentheses shall be treated as a data entity. */
178 1.1 mrg *result = gfc_get_parentheses (e);
179 1.1 mrg
180 1.1 mrg if (m != MATCH_YES)
181 1.1 mrg {
182 1.1 mrg gfc_free_expr (*result);
183 1.1 mrg return MATCH_ERROR;
184 1.1 mrg }
185 1.1 mrg
186 1.1 mrg return MATCH_YES;
187 1.1 mrg
188 1.1 mrg syntax:
189 1.1 mrg gfc_error (expression_syntax);
190 1.1 mrg return MATCH_ERROR;
191 1.1 mrg }
192 1.1 mrg
193 1.1 mrg
194 1.1 mrg /* Match a level 1 expression. */
195 1.1 mrg
196 1.1 mrg static match
197 1.1 mrg match_level_1 (gfc_expr **result)
198 1.1 mrg {
199 1.1 mrg gfc_user_op *uop;
200 1.1 mrg gfc_expr *e, *f;
201 1.1 mrg locus where;
202 1.1 mrg match m;
203 1.1 mrg
204 1.1 mrg gfc_gobble_whitespace ();
205 1.1 mrg where = gfc_current_locus;
206 1.1 mrg uop = NULL;
207 1.1 mrg m = match_defined_operator (&uop);
208 1.1 mrg if (m == MATCH_ERROR)
209 1.1 mrg return m;
210 1.1 mrg
211 1.1 mrg m = match_primary (&e);
212 1.1 mrg if (m != MATCH_YES)
213 1.1 mrg return m;
214 1.1 mrg
215 1.1 mrg if (uop == NULL)
216 1.1 mrg *result = e;
217 1.1 mrg else
218 1.1 mrg {
219 1.1 mrg f = gfc_get_operator_expr (&where, INTRINSIC_USER, e, NULL);
220 1.1 mrg f->value.op.uop = uop;
221 1.1 mrg *result = f;
222 1.1 mrg }
223 1.1 mrg
224 1.1 mrg return MATCH_YES;
225 1.1 mrg }
226 1.1 mrg
227 1.1 mrg
228 1.1 mrg /* As a GNU extension we support an expanded level-2 expression syntax.
229 1.1 mrg Via this extension we support (arbitrary) nesting of unary plus and
230 1.1 mrg minus operations following unary and binary operators, such as **.
231 1.1 mrg The grammar of section 7.1.1.3 is effectively rewritten as:
232 1.1 mrg
233 1.1 mrg R704 mult-operand is level-1-expr [ power-op ext-mult-operand ]
234 1.1 mrg R704' ext-mult-operand is add-op ext-mult-operand
235 1.1 mrg or mult-operand
236 1.1 mrg R705 add-operand is add-operand mult-op ext-mult-operand
237 1.1 mrg or mult-operand
238 1.1 mrg R705' ext-add-operand is add-op ext-add-operand
239 1.1 mrg or add-operand
240 1.1 mrg R706 level-2-expr is [ level-2-expr ] add-op ext-add-operand
241 1.1 mrg or add-operand
242 1.1 mrg */
243 1.1 mrg
244 1.1 mrg static match match_ext_mult_operand (gfc_expr **result);
245 1.1 mrg static match match_ext_add_operand (gfc_expr **result);
246 1.1 mrg
247 1.1 mrg static int
248 1.1 mrg match_add_op (void)
249 1.1 mrg {
250 1.1 mrg if (next_operator (INTRINSIC_MINUS))
251 1.1 mrg return -1;
252 1.1 mrg if (next_operator (INTRINSIC_PLUS))
253 1.1 mrg return 1;
254 1.1 mrg return 0;
255 1.1 mrg }
256 1.1 mrg
257 1.1 mrg
258 1.1 mrg static match
259 1.1 mrg match_mult_operand (gfc_expr **result)
260 1.1 mrg {
261 1.1 mrg /* Workaround -Wmaybe-uninitialized false positive during
262 1.1 mrg profiledbootstrap by initializing them. */
263 1.1 mrg gfc_expr *e = NULL, *exp, *r;
264 1.1 mrg locus where;
265 1.1 mrg match m;
266 1.1 mrg
267 1.1 mrg m = match_level_1 (&e);
268 1.1 mrg if (m != MATCH_YES)
269 1.1 mrg return m;
270 1.1 mrg
271 1.1 mrg if (!next_operator (INTRINSIC_POWER))
272 1.1 mrg {
273 1.1 mrg *result = e;
274 1.1 mrg return MATCH_YES;
275 1.1 mrg }
276 1.1 mrg
277 1.1 mrg where = gfc_current_locus;
278 1.1 mrg
279 1.1 mrg m = match_ext_mult_operand (&exp);
280 1.1 mrg if (m == MATCH_NO)
281 1.1 mrg gfc_error ("Expected exponent in expression at %C");
282 1.1 mrg if (m != MATCH_YES)
283 1.1 mrg {
284 1.1 mrg gfc_free_expr (e);
285 1.1 mrg return MATCH_ERROR;
286 1.1 mrg }
287 1.1 mrg
288 1.1 mrg r = gfc_power (e, exp);
289 1.1 mrg if (r == NULL)
290 1.1 mrg {
291 1.1 mrg gfc_free_expr (e);
292 1.1 mrg gfc_free_expr (exp);
293 1.1 mrg return MATCH_ERROR;
294 1.1 mrg }
295 1.1 mrg
296 1.1 mrg r->where = where;
297 1.1 mrg *result = r;
298 1.1 mrg
299 1.1 mrg return MATCH_YES;
300 1.1 mrg }
301 1.1 mrg
302 1.1 mrg
303 1.1 mrg static match
304 1.1 mrg match_ext_mult_operand (gfc_expr **result)
305 1.1 mrg {
306 1.1 mrg gfc_expr *all, *e;
307 1.1 mrg locus where;
308 1.1 mrg match m;
309 1.1 mrg int i;
310 1.1 mrg
311 1.1 mrg where = gfc_current_locus;
312 1.1 mrg i = match_add_op ();
313 1.1 mrg
314 1.1 mrg if (i == 0)
315 1.1 mrg return match_mult_operand (result);
316 1.1 mrg
317 1.1 mrg if (gfc_notification_std (GFC_STD_GNU) == ERROR)
318 1.1 mrg {
319 1.1 mrg gfc_error ("Extension: Unary operator following "
320 1.1 mrg "arithmetic operator (use parentheses) at %C");
321 1.1 mrg return MATCH_ERROR;
322 1.1 mrg }
323 1.1 mrg else
324 1.1 mrg gfc_warning (0, "Extension: Unary operator following "
325 1.1 mrg "arithmetic operator (use parentheses) at %C");
326 1.1 mrg
327 1.1 mrg m = match_ext_mult_operand (&e);
328 1.1 mrg if (m != MATCH_YES)
329 1.1 mrg return m;
330 1.1 mrg
331 1.1 mrg if (i == -1)
332 1.1 mrg all = gfc_uminus (e);
333 1.1 mrg else
334 1.1 mrg all = gfc_uplus (e);
335 1.1 mrg
336 1.1 mrg if (all == NULL)
337 1.1 mrg {
338 1.1 mrg gfc_free_expr (e);
339 1.1 mrg return MATCH_ERROR;
340 1.1 mrg }
341 1.1 mrg
342 1.1 mrg all->where = where;
343 1.1 mrg *result = all;
344 1.1 mrg return MATCH_YES;
345 1.1 mrg }
346 1.1 mrg
347 1.1 mrg
348 1.1 mrg static match
349 1.1 mrg match_add_operand (gfc_expr **result)
350 1.1 mrg {
351 1.1 mrg gfc_expr *all, *e, *total;
352 1.1 mrg locus where, old_loc;
353 1.1 mrg match m;
354 1.1 mrg gfc_intrinsic_op i;
355 1.1 mrg
356 1.1 mrg m = match_mult_operand (&all);
357 1.1 mrg if (m != MATCH_YES)
358 1.1 mrg return m;
359 1.1 mrg
360 1.1 mrg for (;;)
361 1.1 mrg {
362 1.1 mrg /* Build up a string of products or quotients. */
363 1.1 mrg
364 1.1 mrg old_loc = gfc_current_locus;
365 1.1 mrg
366 1.1 mrg if (next_operator (INTRINSIC_TIMES))
367 1.1 mrg i = INTRINSIC_TIMES;
368 1.1 mrg else
369 1.1 mrg {
370 1.1 mrg if (next_operator (INTRINSIC_DIVIDE))
371 1.1 mrg i = INTRINSIC_DIVIDE;
372 1.1 mrg else
373 1.1 mrg break;
374 1.1 mrg }
375 1.1 mrg
376 1.1 mrg where = gfc_current_locus;
377 1.1 mrg
378 1.1 mrg m = match_ext_mult_operand (&e);
379 1.1 mrg if (m == MATCH_NO)
380 1.1 mrg {
381 1.1 mrg gfc_current_locus = old_loc;
382 1.1 mrg break;
383 1.1 mrg }
384 1.1 mrg
385 1.1 mrg if (m == MATCH_ERROR)
386 1.1 mrg {
387 1.1 mrg gfc_free_expr (all);
388 1.1 mrg return MATCH_ERROR;
389 1.1 mrg }
390 1.1 mrg
391 1.1 mrg if (i == INTRINSIC_TIMES)
392 1.1 mrg total = gfc_multiply (all, e);
393 1.1 mrg else
394 1.1 mrg total = gfc_divide (all, e);
395 1.1 mrg
396 1.1 mrg if (total == NULL)
397 1.1 mrg {
398 1.1 mrg gfc_free_expr (all);
399 1.1 mrg gfc_free_expr (e);
400 1.1 mrg return MATCH_ERROR;
401 1.1 mrg }
402 1.1 mrg
403 1.1 mrg all = total;
404 1.1 mrg all->where = where;
405 1.1 mrg }
406 1.1 mrg
407 1.1 mrg *result = all;
408 1.1 mrg return MATCH_YES;
409 1.1 mrg }
410 1.1 mrg
411 1.1 mrg
412 1.1 mrg static match
413 1.1 mrg match_ext_add_operand (gfc_expr **result)
414 1.1 mrg {
415 1.1 mrg gfc_expr *all, *e;
416 1.1 mrg locus where;
417 1.1 mrg match m;
418 1.1 mrg int i;
419 1.1 mrg
420 1.1 mrg where = gfc_current_locus;
421 1.1 mrg i = match_add_op ();
422 1.1 mrg
423 1.1 mrg if (i == 0)
424 1.1 mrg return match_add_operand (result);
425 1.1 mrg
426 1.1 mrg if (gfc_notification_std (GFC_STD_GNU) == ERROR)
427 1.1 mrg {
428 1.1 mrg gfc_error ("Extension: Unary operator following "
429 1.1 mrg "arithmetic operator (use parentheses) at %C");
430 1.1 mrg return MATCH_ERROR;
431 1.1 mrg }
432 1.1 mrg else
433 1.1 mrg gfc_warning (0, "Extension: Unary operator following "
434 1.1 mrg "arithmetic operator (use parentheses) at %C");
435 1.1 mrg
436 1.1 mrg m = match_ext_add_operand (&e);
437 1.1 mrg if (m != MATCH_YES)
438 1.1 mrg return m;
439 1.1 mrg
440 1.1 mrg if (i == -1)
441 1.1 mrg all = gfc_uminus (e);
442 1.1 mrg else
443 1.1 mrg all = gfc_uplus (e);
444 1.1 mrg
445 1.1 mrg if (all == NULL)
446 1.1 mrg {
447 1.1 mrg gfc_free_expr (e);
448 1.1 mrg return MATCH_ERROR;
449 1.1 mrg }
450 1.1 mrg
451 1.1 mrg all->where = where;
452 1.1 mrg *result = all;
453 1.1 mrg return MATCH_YES;
454 1.1 mrg }
455 1.1 mrg
456 1.1 mrg
457 1.1 mrg /* Match a level 2 expression. */
458 1.1 mrg
459 1.1 mrg static match
460 1.1 mrg match_level_2 (gfc_expr **result)
461 1.1 mrg {
462 1.1 mrg gfc_expr *all, *e, *total;
463 1.1 mrg locus where;
464 1.1 mrg match m;
465 1.1 mrg int i;
466 1.1 mrg
467 1.1 mrg where = gfc_current_locus;
468 1.1 mrg i = match_add_op ();
469 1.1 mrg
470 1.1 mrg if (i != 0)
471 1.1 mrg {
472 1.1 mrg m = match_ext_add_operand (&e);
473 1.1 mrg if (m == MATCH_NO)
474 1.1 mrg {
475 1.1 mrg gfc_error (expression_syntax);
476 1.1 mrg m = MATCH_ERROR;
477 1.1 mrg }
478 1.1 mrg }
479 1.1 mrg else
480 1.1 mrg m = match_add_operand (&e);
481 1.1 mrg
482 1.1 mrg if (m != MATCH_YES)
483 1.1 mrg return m;
484 1.1 mrg
485 1.1 mrg if (i == 0)
486 1.1 mrg all = e;
487 1.1 mrg else
488 1.1 mrg {
489 1.1 mrg if (i == -1)
490 1.1 mrg all = gfc_uminus (e);
491 1.1 mrg else
492 1.1 mrg all = gfc_uplus (e);
493 1.1 mrg
494 1.1 mrg if (all == NULL)
495 1.1 mrg {
496 1.1 mrg gfc_free_expr (e);
497 1.1 mrg return MATCH_ERROR;
498 1.1 mrg }
499 1.1 mrg }
500 1.1 mrg
501 1.1 mrg all->where = where;
502 1.1 mrg
503 1.1 mrg /* Append add-operands to the sum. */
504 1.1 mrg
505 1.1 mrg for (;;)
506 1.1 mrg {
507 1.1 mrg where = gfc_current_locus;
508 1.1 mrg i = match_add_op ();
509 1.1 mrg if (i == 0)
510 1.1 mrg break;
511 1.1 mrg
512 1.1 mrg m = match_ext_add_operand (&e);
513 1.1 mrg if (m == MATCH_NO)
514 1.1 mrg gfc_error (expression_syntax);
515 1.1 mrg if (m != MATCH_YES)
516 1.1 mrg {
517 1.1 mrg gfc_free_expr (all);
518 1.1 mrg return MATCH_ERROR;
519 1.1 mrg }
520 1.1 mrg
521 1.1 mrg if (i == -1)
522 1.1 mrg total = gfc_subtract (all, e);
523 1.1 mrg else
524 1.1 mrg total = gfc_add (all, e);
525 1.1 mrg
526 1.1 mrg if (total == NULL)
527 1.1 mrg {
528 1.1 mrg gfc_free_expr (all);
529 1.1 mrg gfc_free_expr (e);
530 1.1 mrg return MATCH_ERROR;
531 1.1 mrg }
532 1.1 mrg
533 1.1 mrg all = total;
534 1.1 mrg all->where = where;
535 1.1 mrg }
536 1.1 mrg
537 1.1 mrg *result = all;
538 1.1 mrg return MATCH_YES;
539 1.1 mrg }
540 1.1 mrg
541 1.1 mrg
542 1.1 mrg /* Match a level three expression. */
543 1.1 mrg
544 1.1 mrg static match
545 1.1 mrg match_level_3 (gfc_expr **result)
546 1.1 mrg {
547 1.1 mrg gfc_expr *all, *e, *total = NULL;
548 1.1 mrg locus where;
549 1.1 mrg match m;
550 1.1 mrg
551 1.1 mrg m = match_level_2 (&all);
552 1.1 mrg if (m != MATCH_YES)
553 1.1 mrg return m;
554 1.1 mrg
555 1.1 mrg for (;;)
556 1.1 mrg {
557 1.1 mrg if (!next_operator (INTRINSIC_CONCAT))
558 1.1 mrg break;
559 1.1 mrg
560 1.1 mrg where = gfc_current_locus;
561 1.1 mrg
562 1.1 mrg m = match_level_2 (&e);
563 1.1 mrg if (m == MATCH_NO)
564 1.1 mrg gfc_error (expression_syntax);
565 1.1 mrg if (m != MATCH_YES)
566 1.1 mrg {
567 1.1 mrg gfc_free_expr (all);
568 1.1 mrg return MATCH_ERROR;
569 1.1 mrg }
570 1.1 mrg
571 1.1 mrg total = gfc_concat (all, e);
572 1.1 mrg if (total == NULL)
573 1.1 mrg {
574 1.1 mrg gfc_free_expr (all);
575 1.1 mrg gfc_free_expr (e);
576 1.1 mrg return MATCH_ERROR;
577 1.1 mrg }
578 1.1 mrg
579 1.1 mrg all = total;
580 1.1 mrg all->where = where;
581 1.1 mrg }
582 1.1 mrg
583 1.1 mrg *result = all;
584 1.1 mrg return MATCH_YES;
585 1.1 mrg }
586 1.1 mrg
587 1.1 mrg
588 1.1 mrg /* Match a level 4 expression. */
589 1.1 mrg
590 1.1 mrg static match
591 1.1 mrg match_level_4 (gfc_expr **result)
592 1.1 mrg {
593 1.1 mrg gfc_expr *left, *right, *r;
594 1.1 mrg gfc_intrinsic_op i;
595 1.1 mrg locus old_loc;
596 1.1 mrg locus where;
597 1.1 mrg match m;
598 1.1 mrg
599 1.1 mrg m = match_level_3 (&left);
600 1.1 mrg if (m != MATCH_YES)
601 1.1 mrg return m;
602 1.1 mrg
603 1.1 mrg old_loc = gfc_current_locus;
604 1.1 mrg
605 1.1 mrg if (gfc_match_intrinsic_op (&i) != MATCH_YES)
606 1.1 mrg {
607 1.1 mrg *result = left;
608 1.1 mrg return MATCH_YES;
609 1.1 mrg }
610 1.1 mrg
611 1.1 mrg if (i != INTRINSIC_EQ && i != INTRINSIC_NE && i != INTRINSIC_GE
612 1.1 mrg && i != INTRINSIC_LE && i != INTRINSIC_LT && i != INTRINSIC_GT
613 1.1 mrg && i != INTRINSIC_EQ_OS && i != INTRINSIC_NE_OS && i != INTRINSIC_GE_OS
614 1.1 mrg && i != INTRINSIC_LE_OS && i != INTRINSIC_LT_OS && i != INTRINSIC_GT_OS)
615 1.1 mrg {
616 1.1 mrg gfc_current_locus = old_loc;
617 1.1 mrg *result = left;
618 1.1 mrg return MATCH_YES;
619 1.1 mrg }
620 1.1 mrg
621 1.1 mrg where = gfc_current_locus;
622 1.1 mrg
623 1.1 mrg m = match_level_3 (&right);
624 1.1 mrg if (m == MATCH_NO)
625 1.1 mrg gfc_error (expression_syntax);
626 1.1 mrg if (m != MATCH_YES)
627 1.1 mrg {
628 1.1 mrg gfc_free_expr (left);
629 1.1 mrg return MATCH_ERROR;
630 1.1 mrg }
631 1.1 mrg
632 1.1 mrg switch (i)
633 1.1 mrg {
634 1.1 mrg case INTRINSIC_EQ:
635 1.1 mrg case INTRINSIC_EQ_OS:
636 1.1 mrg r = gfc_eq (left, right, i);
637 1.1 mrg break;
638 1.1 mrg
639 1.1 mrg case INTRINSIC_NE:
640 1.1 mrg case INTRINSIC_NE_OS:
641 1.1 mrg r = gfc_ne (left, right, i);
642 1.1 mrg break;
643 1.1 mrg
644 1.1 mrg case INTRINSIC_LT:
645 1.1 mrg case INTRINSIC_LT_OS:
646 1.1 mrg r = gfc_lt (left, right, i);
647 1.1 mrg break;
648 1.1 mrg
649 1.1 mrg case INTRINSIC_LE:
650 1.1 mrg case INTRINSIC_LE_OS:
651 1.1 mrg r = gfc_le (left, right, i);
652 1.1 mrg break;
653 1.1 mrg
654 1.1 mrg case INTRINSIC_GT:
655 1.1 mrg case INTRINSIC_GT_OS:
656 1.1 mrg r = gfc_gt (left, right, i);
657 1.1 mrg break;
658 1.1 mrg
659 1.1 mrg case INTRINSIC_GE:
660 1.1 mrg case INTRINSIC_GE_OS:
661 1.1 mrg r = gfc_ge (left, right, i);
662 1.1 mrg break;
663 1.1 mrg
664 1.1 mrg default:
665 1.1 mrg gfc_internal_error ("match_level_4(): Bad operator");
666 1.1 mrg }
667 1.1 mrg
668 1.1 mrg if (r == NULL)
669 1.1 mrg {
670 1.1 mrg gfc_free_expr (left);
671 1.1 mrg gfc_free_expr (right);
672 1.1 mrg return MATCH_ERROR;
673 1.1 mrg }
674 1.1 mrg
675 1.1 mrg r->where = where;
676 1.1 mrg *result = r;
677 1.1 mrg
678 1.1 mrg return MATCH_YES;
679 1.1 mrg }
680 1.1 mrg
681 1.1 mrg
682 1.1 mrg static match
683 1.1 mrg match_and_operand (gfc_expr **result)
684 1.1 mrg {
685 1.1 mrg gfc_expr *e, *r;
686 1.1 mrg locus where;
687 1.1 mrg match m;
688 1.1 mrg int i;
689 1.1 mrg
690 1.1 mrg i = next_operator (INTRINSIC_NOT);
691 1.1 mrg where = gfc_current_locus;
692 1.1 mrg
693 1.1 mrg m = match_level_4 (&e);
694 1.1 mrg if (m != MATCH_YES)
695 1.1 mrg return m;
696 1.1 mrg
697 1.1 mrg r = e;
698 1.1 mrg if (i)
699 1.1 mrg {
700 1.1 mrg r = gfc_not (e);
701 1.1 mrg if (r == NULL)
702 1.1 mrg {
703 1.1 mrg gfc_free_expr (e);
704 1.1 mrg return MATCH_ERROR;
705 1.1 mrg }
706 1.1 mrg }
707 1.1 mrg
708 1.1 mrg r->where = where;
709 1.1 mrg *result = r;
710 1.1 mrg
711 1.1 mrg return MATCH_YES;
712 1.1 mrg }
713 1.1 mrg
714 1.1 mrg
715 1.1 mrg static match
716 1.1 mrg match_or_operand (gfc_expr **result)
717 1.1 mrg {
718 1.1 mrg gfc_expr *all, *e, *total;
719 1.1 mrg locus where;
720 1.1 mrg match m;
721 1.1 mrg
722 1.1 mrg m = match_and_operand (&all);
723 1.1 mrg if (m != MATCH_YES)
724 1.1 mrg return m;
725 1.1 mrg
726 1.1 mrg for (;;)
727 1.1 mrg {
728 1.1 mrg if (!next_operator (INTRINSIC_AND))
729 1.1 mrg break;
730 1.1 mrg where = gfc_current_locus;
731 1.1 mrg
732 1.1 mrg m = match_and_operand (&e);
733 1.1 mrg if (m == MATCH_NO)
734 1.1 mrg gfc_error (expression_syntax);
735 1.1 mrg if (m != MATCH_YES)
736 1.1 mrg {
737 1.1 mrg gfc_free_expr (all);
738 1.1 mrg return MATCH_ERROR;
739 1.1 mrg }
740 1.1 mrg
741 1.1 mrg total = gfc_and (all, e);
742 1.1 mrg if (total == NULL)
743 1.1 mrg {
744 1.1 mrg gfc_free_expr (all);
745 1.1 mrg gfc_free_expr (e);
746 1.1 mrg return MATCH_ERROR;
747 1.1 mrg }
748 1.1 mrg
749 1.1 mrg all = total;
750 1.1 mrg all->where = where;
751 1.1 mrg }
752 1.1 mrg
753 1.1 mrg *result = all;
754 1.1 mrg return MATCH_YES;
755 1.1 mrg }
756 1.1 mrg
757 1.1 mrg
758 1.1 mrg static match
759 1.1 mrg match_equiv_operand (gfc_expr **result)
760 1.1 mrg {
761 1.1 mrg gfc_expr *all, *e, *total;
762 1.1 mrg locus where;
763 1.1 mrg match m;
764 1.1 mrg
765 1.1 mrg m = match_or_operand (&all);
766 1.1 mrg if (m != MATCH_YES)
767 1.1 mrg return m;
768 1.1 mrg
769 1.1 mrg for (;;)
770 1.1 mrg {
771 1.1 mrg if (!next_operator (INTRINSIC_OR))
772 1.1 mrg break;
773 1.1 mrg where = gfc_current_locus;
774 1.1 mrg
775 1.1 mrg m = match_or_operand (&e);
776 1.1 mrg if (m == MATCH_NO)
777 1.1 mrg gfc_error (expression_syntax);
778 1.1 mrg if (m != MATCH_YES)
779 1.1 mrg {
780 1.1 mrg gfc_free_expr (all);
781 1.1 mrg return MATCH_ERROR;
782 1.1 mrg }
783 1.1 mrg
784 1.1 mrg total = gfc_or (all, e);
785 1.1 mrg if (total == NULL)
786 1.1 mrg {
787 1.1 mrg gfc_free_expr (all);
788 1.1 mrg gfc_free_expr (e);
789 1.1 mrg return MATCH_ERROR;
790 1.1 mrg }
791 1.1 mrg
792 1.1 mrg all = total;
793 1.1 mrg all->where = where;
794 1.1 mrg }
795 1.1 mrg
796 1.1 mrg *result = all;
797 1.1 mrg return MATCH_YES;
798 1.1 mrg }
799 1.1 mrg
800 1.1 mrg
801 1.1 mrg /* Match a level 5 expression. */
802 1.1 mrg
803 1.1 mrg static match
804 1.1 mrg match_level_5 (gfc_expr **result)
805 1.1 mrg {
806 1.1 mrg gfc_expr *all, *e, *total;
807 1.1 mrg locus where;
808 1.1 mrg match m;
809 1.1 mrg gfc_intrinsic_op i;
810 1.1 mrg
811 1.1 mrg m = match_equiv_operand (&all);
812 1.1 mrg if (m != MATCH_YES)
813 1.1 mrg return m;
814 1.1 mrg
815 1.1 mrg for (;;)
816 1.1 mrg {
817 1.1 mrg if (next_operator (INTRINSIC_EQV))
818 1.1 mrg i = INTRINSIC_EQV;
819 1.1 mrg else
820 1.1 mrg {
821 1.1 mrg if (next_operator (INTRINSIC_NEQV))
822 1.1 mrg i = INTRINSIC_NEQV;
823 1.1 mrg else
824 1.1 mrg break;
825 1.1 mrg }
826 1.1 mrg
827 1.1 mrg where = gfc_current_locus;
828 1.1 mrg
829 1.1 mrg m = match_equiv_operand (&e);
830 1.1 mrg if (m == MATCH_NO)
831 1.1 mrg gfc_error (expression_syntax);
832 1.1 mrg if (m != MATCH_YES)
833 1.1 mrg {
834 1.1 mrg gfc_free_expr (all);
835 1.1 mrg return MATCH_ERROR;
836 1.1 mrg }
837 1.1 mrg
838 1.1 mrg if (i == INTRINSIC_EQV)
839 1.1 mrg total = gfc_eqv (all, e);
840 1.1 mrg else
841 1.1 mrg total = gfc_neqv (all, e);
842 1.1 mrg
843 1.1 mrg if (total == NULL)
844 1.1 mrg {
845 1.1 mrg gfc_free_expr (all);
846 1.1 mrg gfc_free_expr (e);
847 1.1 mrg return MATCH_ERROR;
848 1.1 mrg }
849 1.1 mrg
850 1.1 mrg all = total;
851 1.1 mrg all->where = where;
852 1.1 mrg }
853 1.1 mrg
854 1.1 mrg *result = all;
855 1.1 mrg return MATCH_YES;
856 1.1 mrg }
857 1.1 mrg
858 1.1 mrg
859 1.1 mrg /* Match an expression. At this level, we are stringing together
860 1.1 mrg level 5 expressions separated by binary operators. */
861 1.1 mrg
862 1.1 mrg match
863 1.1 mrg gfc_match_expr (gfc_expr **result)
864 1.1 mrg {
865 1.1 mrg gfc_expr *all, *e;
866 1.1 mrg gfc_user_op *uop;
867 1.1 mrg locus where;
868 1.1 mrg match m;
869 1.1 mrg
870 1.1 mrg m = match_level_5 (&all);
871 1.1 mrg if (m != MATCH_YES)
872 1.1 mrg return m;
873 1.1 mrg
874 1.1 mrg for (;;)
875 1.1 mrg {
876 1.1 mrg uop = NULL;
877 1.1 mrg m = match_defined_operator (&uop);
878 1.1 mrg if (m == MATCH_NO)
879 1.1 mrg break;
880 1.1 mrg if (m == MATCH_ERROR)
881 1.1 mrg {
882 1.1 mrg gfc_free_expr (all);
883 1.1 mrg return MATCH_ERROR;
884 1.1 mrg }
885 1.1 mrg
886 1.1 mrg where = gfc_current_locus;
887 1.1 mrg
888 1.1 mrg m = match_level_5 (&e);
889 1.1 mrg if (m == MATCH_NO)
890 1.1 mrg gfc_error (expression_syntax);
891 1.1 mrg if (m != MATCH_YES)
892 1.1 mrg {
893 1.1 mrg gfc_free_expr (all);
894 1.1 mrg return MATCH_ERROR;
895 1.1 mrg }
896 1.1 mrg
897 1.1 mrg all = gfc_get_operator_expr (&where, INTRINSIC_USER, all, e);
898 1.1 mrg all->value.op.uop = uop;
899 1.1 mrg }
900 1.1 mrg
901 1.1 mrg *result = all;
902 1.1 mrg return MATCH_YES;
903 1.1 mrg }
904