2010-04-19 Richard Guenther <rguenther@suse.de>
[official-gcc.git] / gcc / fortran / matchexp.c
blobf66623f82d0bfd15676bb3165f725447e5c4e1f1
1 /* Expression parser.
2 Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "gfortran.h"
25 #include "arith.h"
26 #include "match.h"
28 static char expression_syntax[] = N_("Syntax error in expression at %C");
31 /* Match a user-defined operator name. This is a normal name with a
32 few restrictions. The error_flag controls whether an error is
33 raised if 'true' or 'false' are used or not. */
35 match
36 gfc_match_defined_op_name (char *result, int error_flag)
38 static const char * const badops[] = {
39 "and", "or", "not", "eqv", "neqv", "eq", "ne", "ge", "le", "lt", "gt",
40 NULL
43 char name[GFC_MAX_SYMBOL_LEN + 1];
44 locus old_loc;
45 match m;
46 int i;
48 old_loc = gfc_current_locus;
50 m = gfc_match (" . %n .", name);
51 if (m != MATCH_YES)
52 return m;
54 /* .true. and .false. have interpretations as constants. Trying to
55 use these as operators will fail at a later time. */
57 if (strcmp (name, "true") == 0 || strcmp (name, "false") == 0)
59 if (error_flag)
60 goto error;
61 gfc_current_locus = old_loc;
62 return MATCH_NO;
65 for (i = 0; badops[i]; i++)
66 if (strcmp (badops[i], name) == 0)
67 goto error;
69 for (i = 0; name[i]; i++)
70 if (!ISALPHA (name[i]))
72 gfc_error ("Bad character '%c' in OPERATOR name at %C", name[i]);
73 return MATCH_ERROR;
76 strcpy (result, name);
77 return MATCH_YES;
79 error:
80 gfc_error ("The name '%s' cannot be used as a defined operator at %C",
81 name);
83 gfc_current_locus = old_loc;
84 return MATCH_ERROR;
88 /* Match a user defined operator. The symbol found must be an
89 operator already. */
91 static match
92 match_defined_operator (gfc_user_op **result)
94 char name[GFC_MAX_SYMBOL_LEN + 1];
95 match m;
97 m = gfc_match_defined_op_name (name, 0);
98 if (m != MATCH_YES)
99 return m;
101 *result = gfc_get_uop (name);
102 return MATCH_YES;
106 /* Check to see if the given operator is next on the input. If this
107 is not the case, the parse pointer remains where it was. */
109 static int
110 next_operator (gfc_intrinsic_op t)
112 gfc_intrinsic_op u;
113 locus old_loc;
115 old_loc = gfc_current_locus;
116 if (gfc_match_intrinsic_op (&u) == MATCH_YES && t == u)
117 return 1;
119 gfc_current_locus = old_loc;
120 return 0;
124 /* Call the INTRINSIC_PARENTHESES function. This is both
125 used explicitly, as below, or by resolve.c to generate
126 temporaries. */
128 gfc_expr *
129 gfc_get_parentheses (gfc_expr *e)
131 gfc_expr *e2;
133 e2 = gfc_get_expr();
134 e2->expr_type = EXPR_OP;
135 e2->ts = e->ts;
136 e2->rank = e->rank;
137 e2->where = e->where;
138 e2->value.op.op = INTRINSIC_PARENTHESES;
139 e2->value.op.op1 = e;
140 e2->value.op.op2 = NULL;
141 return e2;
145 /* Match a primary expression. */
147 static match
148 match_primary (gfc_expr **result)
150 match m;
151 gfc_expr *e;
153 m = gfc_match_literal_constant (result, 0);
154 if (m != MATCH_NO)
155 return m;
157 m = gfc_match_array_constructor (result);
158 if (m != MATCH_NO)
159 return m;
161 m = gfc_match_rvalue (result);
162 if (m != MATCH_NO)
163 return m;
165 /* Match an expression in parentheses. */
166 if (gfc_match_char ('(') != MATCH_YES)
167 return MATCH_NO;
169 m = gfc_match_expr (&e);
170 if (m == MATCH_NO)
171 goto syntax;
172 if (m == MATCH_ERROR)
173 return m;
175 m = gfc_match_char (')');
176 if (m == MATCH_NO)
177 gfc_error ("Expected a right parenthesis in expression at %C");
179 /* Now we have the expression inside the parentheses, build the
180 expression pointing to it. By 7.1.7.2, any expression in
181 parentheses shall be treated as a data entity. */
182 *result = gfc_get_parentheses (e);
184 if (m != MATCH_YES)
186 gfc_free_expr (*result);
187 return MATCH_ERROR;
190 return MATCH_YES;
192 syntax:
193 gfc_error (expression_syntax);
194 return MATCH_ERROR;
198 /* Build an operator expression node. */
200 static gfc_expr *
201 build_node (gfc_intrinsic_op op, locus *where,
202 gfc_expr *op1, gfc_expr *op2)
204 gfc_expr *new_expr;
206 new_expr = gfc_get_expr ();
207 new_expr->expr_type = EXPR_OP;
208 new_expr->value.op.op = op;
209 new_expr->where = *where;
211 new_expr->value.op.op1 = op1;
212 new_expr->value.op.op2 = op2;
214 return new_expr;
218 /* Match a level 1 expression. */
220 static match
221 match_level_1 (gfc_expr **result)
223 gfc_user_op *uop;
224 gfc_expr *e, *f;
225 locus where;
226 match m;
228 where = gfc_current_locus;
229 uop = NULL;
230 m = match_defined_operator (&uop);
231 if (m == MATCH_ERROR)
232 return m;
234 m = match_primary (&e);
235 if (m != MATCH_YES)
236 return m;
238 if (uop == NULL)
239 *result = e;
240 else
242 f = build_node (INTRINSIC_USER, &where, e, NULL);
243 f->value.op.uop = uop;
244 *result = f;
247 return MATCH_YES;
251 /* As a GNU extension we support an expanded level-2 expression syntax.
252 Via this extension we support (arbitrary) nesting of unary plus and
253 minus operations following unary and binary operators, such as **.
254 The grammar of section 7.1.1.3 is effectively rewritten as:
256 R704 mult-operand is level-1-expr [ power-op ext-mult-operand ]
257 R704' ext-mult-operand is add-op ext-mult-operand
258 or mult-operand
259 R705 add-operand is add-operand mult-op ext-mult-operand
260 or mult-operand
261 R705' ext-add-operand is add-op ext-add-operand
262 or add-operand
263 R706 level-2-expr is [ level-2-expr ] add-op ext-add-operand
264 or add-operand
267 static match match_ext_mult_operand (gfc_expr **result);
268 static match match_ext_add_operand (gfc_expr **result);
270 static int
271 match_add_op (void)
273 if (next_operator (INTRINSIC_MINUS))
274 return -1;
275 if (next_operator (INTRINSIC_PLUS))
276 return 1;
277 return 0;
281 static match
282 match_mult_operand (gfc_expr **result)
284 gfc_expr *e, *exp, *r;
285 locus where;
286 match m;
288 m = match_level_1 (&e);
289 if (m != MATCH_YES)
290 return m;
292 if (!next_operator (INTRINSIC_POWER))
294 *result = e;
295 return MATCH_YES;
298 where = gfc_current_locus;
300 m = match_ext_mult_operand (&exp);
301 if (m == MATCH_NO)
302 gfc_error ("Expected exponent in expression at %C");
303 if (m != MATCH_YES)
305 gfc_free_expr (e);
306 return MATCH_ERROR;
309 r = gfc_power (e, exp);
310 if (r == NULL)
312 gfc_free_expr (e);
313 gfc_free_expr (exp);
314 return MATCH_ERROR;
317 r->where = where;
318 *result = r;
320 return MATCH_YES;
324 static match
325 match_ext_mult_operand (gfc_expr **result)
327 gfc_expr *all, *e;
328 locus where;
329 match m;
330 int i;
332 where = gfc_current_locus;
333 i = match_add_op ();
335 if (i == 0)
336 return match_mult_operand (result);
338 if (gfc_notification_std (GFC_STD_GNU) == ERROR)
340 gfc_error ("Extension: Unary operator following "
341 "arithmetic operator (use parentheses) at %C");
342 return MATCH_ERROR;
344 else
345 gfc_warning ("Extension: Unary operator following "
346 "arithmetic operator (use parentheses) at %C");
348 m = match_ext_mult_operand (&e);
349 if (m != MATCH_YES)
350 return m;
352 if (i == -1)
353 all = gfc_uminus (e);
354 else
355 all = gfc_uplus (e);
357 if (all == NULL)
359 gfc_free_expr (e);
360 return MATCH_ERROR;
363 all->where = where;
364 *result = all;
365 return MATCH_YES;
369 static match
370 match_add_operand (gfc_expr **result)
372 gfc_expr *all, *e, *total;
373 locus where, old_loc;
374 match m;
375 gfc_intrinsic_op i;
377 m = match_mult_operand (&all);
378 if (m != MATCH_YES)
379 return m;
381 for (;;)
383 /* Build up a string of products or quotients. */
385 old_loc = gfc_current_locus;
387 if (next_operator (INTRINSIC_TIMES))
388 i = INTRINSIC_TIMES;
389 else
391 if (next_operator (INTRINSIC_DIVIDE))
392 i = INTRINSIC_DIVIDE;
393 else
394 break;
397 where = gfc_current_locus;
399 m = match_ext_mult_operand (&e);
400 if (m == MATCH_NO)
402 gfc_current_locus = old_loc;
403 break;
406 if (m == MATCH_ERROR)
408 gfc_free_expr (all);
409 return MATCH_ERROR;
412 if (i == INTRINSIC_TIMES)
413 total = gfc_multiply (all, e);
414 else
415 total = gfc_divide (all, e);
417 if (total == NULL)
419 gfc_free_expr (all);
420 gfc_free_expr (e);
421 return MATCH_ERROR;
424 all = total;
425 all->where = where;
428 *result = all;
429 return MATCH_YES;
433 static match
434 match_ext_add_operand (gfc_expr **result)
436 gfc_expr *all, *e;
437 locus where;
438 match m;
439 int i;
441 where = gfc_current_locus;
442 i = match_add_op ();
444 if (i == 0)
445 return match_add_operand (result);
447 if (gfc_notification_std (GFC_STD_GNU) == ERROR)
449 gfc_error ("Extension: Unary operator following "
450 "arithmetic operator (use parentheses) at %C");
451 return MATCH_ERROR;
453 else
454 gfc_warning ("Extension: Unary operator following "
455 "arithmetic operator (use parentheses) at %C");
457 m = match_ext_add_operand (&e);
458 if (m != MATCH_YES)
459 return m;
461 if (i == -1)
462 all = gfc_uminus (e);
463 else
464 all = gfc_uplus (e);
466 if (all == NULL)
468 gfc_free_expr (e);
469 return MATCH_ERROR;
472 all->where = where;
473 *result = all;
474 return MATCH_YES;
478 /* Match a level 2 expression. */
480 static match
481 match_level_2 (gfc_expr **result)
483 gfc_expr *all, *e, *total;
484 locus where;
485 match m;
486 int i;
488 where = gfc_current_locus;
489 i = match_add_op ();
491 if (i != 0)
493 m = match_ext_add_operand (&e);
494 if (m == MATCH_NO)
496 gfc_error (expression_syntax);
497 m = MATCH_ERROR;
500 else
501 m = match_add_operand (&e);
503 if (m != MATCH_YES)
504 return m;
506 if (i == 0)
507 all = e;
508 else
510 if (i == -1)
511 all = gfc_uminus (e);
512 else
513 all = gfc_uplus (e);
515 if (all == NULL)
517 gfc_free_expr (e);
518 return MATCH_ERROR;
522 all->where = where;
524 /* Append add-operands to the sum. */
526 for (;;)
528 where = gfc_current_locus;
529 i = match_add_op ();
530 if (i == 0)
531 break;
533 m = match_ext_add_operand (&e);
534 if (m == MATCH_NO)
535 gfc_error (expression_syntax);
536 if (m != MATCH_YES)
538 gfc_free_expr (all);
539 return MATCH_ERROR;
542 if (i == -1)
543 total = gfc_subtract (all, e);
544 else
545 total = gfc_add (all, e);
547 if (total == NULL)
549 gfc_free_expr (all);
550 gfc_free_expr (e);
551 return MATCH_ERROR;
554 all = total;
555 all->where = where;
558 *result = all;
559 return MATCH_YES;
563 /* Match a level three expression. */
565 static match
566 match_level_3 (gfc_expr **result)
568 gfc_expr *all, *e, *total;
569 locus where;
570 match m;
572 m = match_level_2 (&all);
573 if (m != MATCH_YES)
574 return m;
576 for (;;)
578 if (!next_operator (INTRINSIC_CONCAT))
579 break;
581 where = gfc_current_locus;
583 m = match_level_2 (&e);
584 if (m == MATCH_NO)
586 gfc_error (expression_syntax);
587 gfc_free_expr (all);
589 if (m != MATCH_YES)
590 return MATCH_ERROR;
592 total = gfc_concat (all, e);
593 if (total == NULL)
595 gfc_free_expr (all);
596 gfc_free_expr (e);
597 return MATCH_ERROR;
600 all = total;
601 all->where = where;
604 *result = all;
605 return MATCH_YES;
609 /* Match a level 4 expression. */
611 static match
612 match_level_4 (gfc_expr **result)
614 gfc_expr *left, *right, *r;
615 gfc_intrinsic_op i;
616 locus old_loc;
617 locus where;
618 match m;
620 m = match_level_3 (&left);
621 if (m != MATCH_YES)
622 return m;
624 old_loc = gfc_current_locus;
626 if (gfc_match_intrinsic_op (&i) != MATCH_YES)
628 *result = left;
629 return MATCH_YES;
632 if (i != INTRINSIC_EQ && i != INTRINSIC_NE && i != INTRINSIC_GE
633 && i != INTRINSIC_LE && i != INTRINSIC_LT && i != INTRINSIC_GT
634 && i != INTRINSIC_EQ_OS && i != INTRINSIC_NE_OS && i != INTRINSIC_GE_OS
635 && i != INTRINSIC_LE_OS && i != INTRINSIC_LT_OS && i != INTRINSIC_GT_OS)
637 gfc_current_locus = old_loc;
638 *result = left;
639 return MATCH_YES;
642 where = gfc_current_locus;
644 m = match_level_3 (&right);
645 if (m == MATCH_NO)
646 gfc_error (expression_syntax);
647 if (m != MATCH_YES)
649 gfc_free_expr (left);
650 return MATCH_ERROR;
653 switch (i)
655 case INTRINSIC_EQ:
656 case INTRINSIC_EQ_OS:
657 r = gfc_eq (left, right, i);
658 break;
660 case INTRINSIC_NE:
661 case INTRINSIC_NE_OS:
662 r = gfc_ne (left, right, i);
663 break;
665 case INTRINSIC_LT:
666 case INTRINSIC_LT_OS:
667 r = gfc_lt (left, right, i);
668 break;
670 case INTRINSIC_LE:
671 case INTRINSIC_LE_OS:
672 r = gfc_le (left, right, i);
673 break;
675 case INTRINSIC_GT:
676 case INTRINSIC_GT_OS:
677 r = gfc_gt (left, right, i);
678 break;
680 case INTRINSIC_GE:
681 case INTRINSIC_GE_OS:
682 r = gfc_ge (left, right, i);
683 break;
685 default:
686 gfc_internal_error ("match_level_4(): Bad operator");
689 if (r == NULL)
691 gfc_free_expr (left);
692 gfc_free_expr (right);
693 return MATCH_ERROR;
696 r->where = where;
697 *result = r;
699 return MATCH_YES;
703 static match
704 match_and_operand (gfc_expr **result)
706 gfc_expr *e, *r;
707 locus where;
708 match m;
709 int i;
711 i = next_operator (INTRINSIC_NOT);
712 where = gfc_current_locus;
714 m = match_level_4 (&e);
715 if (m != MATCH_YES)
716 return m;
718 r = e;
719 if (i)
721 r = gfc_not (e);
722 if (r == NULL)
724 gfc_free_expr (e);
725 return MATCH_ERROR;
729 r->where = where;
730 *result = r;
732 return MATCH_YES;
736 static match
737 match_or_operand (gfc_expr **result)
739 gfc_expr *all, *e, *total;
740 locus where;
741 match m;
743 m = match_and_operand (&all);
744 if (m != MATCH_YES)
745 return m;
747 for (;;)
749 if (!next_operator (INTRINSIC_AND))
750 break;
751 where = gfc_current_locus;
753 m = match_and_operand (&e);
754 if (m == MATCH_NO)
755 gfc_error (expression_syntax);
756 if (m != MATCH_YES)
758 gfc_free_expr (all);
759 return MATCH_ERROR;
762 total = gfc_and (all, e);
763 if (total == NULL)
765 gfc_free_expr (all);
766 gfc_free_expr (e);
767 return MATCH_ERROR;
770 all = total;
771 all->where = where;
774 *result = all;
775 return MATCH_YES;
779 static match
780 match_equiv_operand (gfc_expr **result)
782 gfc_expr *all, *e, *total;
783 locus where;
784 match m;
786 m = match_or_operand (&all);
787 if (m != MATCH_YES)
788 return m;
790 for (;;)
792 if (!next_operator (INTRINSIC_OR))
793 break;
794 where = gfc_current_locus;
796 m = match_or_operand (&e);
797 if (m == MATCH_NO)
798 gfc_error (expression_syntax);
799 if (m != MATCH_YES)
801 gfc_free_expr (all);
802 return MATCH_ERROR;
805 total = gfc_or (all, e);
806 if (total == NULL)
808 gfc_free_expr (all);
809 gfc_free_expr (e);
810 return MATCH_ERROR;
813 all = total;
814 all->where = where;
817 *result = all;
818 return MATCH_YES;
822 /* Match a level 5 expression. */
824 static match
825 match_level_5 (gfc_expr **result)
827 gfc_expr *all, *e, *total;
828 locus where;
829 match m;
830 gfc_intrinsic_op i;
832 m = match_equiv_operand (&all);
833 if (m != MATCH_YES)
834 return m;
836 for (;;)
838 if (next_operator (INTRINSIC_EQV))
839 i = INTRINSIC_EQV;
840 else
842 if (next_operator (INTRINSIC_NEQV))
843 i = INTRINSIC_NEQV;
844 else
845 break;
848 where = gfc_current_locus;
850 m = match_equiv_operand (&e);
851 if (m == MATCH_NO)
852 gfc_error (expression_syntax);
853 if (m != MATCH_YES)
855 gfc_free_expr (all);
856 return MATCH_ERROR;
859 if (i == INTRINSIC_EQV)
860 total = gfc_eqv (all, e);
861 else
862 total = gfc_neqv (all, e);
864 if (total == NULL)
866 gfc_free_expr (all);
867 gfc_free_expr (e);
868 return MATCH_ERROR;
871 all = total;
872 all->where = where;
875 *result = all;
876 return MATCH_YES;
880 /* Match an expression. At this level, we are stringing together
881 level 5 expressions separated by binary operators. */
883 match
884 gfc_match_expr (gfc_expr **result)
886 gfc_expr *all, *e;
887 gfc_user_op *uop;
888 locus where;
889 match m;
891 m = match_level_5 (&all);
892 if (m != MATCH_YES)
893 return m;
895 for (;;)
897 uop = NULL;
898 m = match_defined_operator (&uop);
899 if (m == MATCH_NO)
900 break;
901 if (m == MATCH_ERROR)
903 gfc_free_expr (all);
904 return MATCH_ERROR;
907 where = gfc_current_locus;
909 m = match_level_5 (&e);
910 if (m == MATCH_NO)
911 gfc_error (expression_syntax);
912 if (m != MATCH_YES)
914 gfc_free_expr (all);
915 return MATCH_ERROR;
918 all = build_node (INTRINSIC_USER, &where, all, e);
919 all->value.op.uop = uop;
922 *result = all;
923 return MATCH_YES;