Home | History | Annotate | Line # | Download | only in fortran
      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