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