00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 static char USMID[] = "\n@(#)5.0_pl/sources/p_asg_expr.c 5.3 06/17/99 09:28:10\n";
00038
00039 # include "defines.h"
00040
00041 # include "host.m"
00042 # include "host.h"
00043 # include "target.m"
00044 # include "target.h"
00045
00046 # include "globals.m"
00047 # include "tokens.m"
00048 # include "sytb.m"
00049 # include "p_globals.m"
00050 # include "debug.m"
00051
00052 # include "globals.h"
00053 # include "tokens.h"
00054 # include "sytb.h"
00055 # include "p_globals.h"
00056
00057
00058
00059
00060
00061
00062 boolean parse_level_1 (opnd_type *);
00063 boolean parse_mult_opnd (opnd_type *);
00064 boolean parse_add_opnd (opnd_type *);
00065 boolean parse_level_2 (opnd_type *);
00066 boolean parse_level_3 (opnd_type *);
00067 boolean parse_level_4 (opnd_type *);
00068 boolean parse_and_opnd (opnd_type *);
00069 boolean parse_or_opnd (opnd_type *);
00070 boolean parse_equiv_opnd (opnd_type *);
00071 boolean parse_level_5 (opnd_type *);
00072 boolean parse_lhs (opnd_type *, int);
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 void parse_assignment_stmt (void)
00092
00093 {
00094 int attr_idx;
00095 int buf_idx;
00096 int col;
00097 int host_attr_idx;
00098 int host_name_idx;
00099 int ir_idx;
00100 int line;
00101 int name_idx;
00102 opnd_type opnd = INIT_OPND_TYPE;
00103 stmt_category_type save_curr_stmt_category;
00104 char str[2];
00105 int stmt_num;
00106
00107
00108 TRACE (Func_Entry, "parse_assignment_stmt", NULL);
00109
00110
00111 attr_idx = srch_sym_tbl (TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
00112
00113 if (attr_idx == NULL_IDX) {
00114 host_attr_idx = srch_host_sym_tbl(TOKEN_STR(token),
00115 TOKEN_LEN(token),
00116 &host_name_idx,
00117 FALSE);
00118
00119 if (host_attr_idx != NULL_IDX && IS_STMT_ENTITY(host_attr_idx)) {
00120
00121
00122 host_attr_idx = NULL_IDX;
00123 }
00124
00125 if (host_attr_idx != NULL_IDX) {
00126
00127
00128
00129
00130 attr_idx = ntr_host_in_sym_tbl(&token, name_idx, host_attr_idx,
00131 host_name_idx, TRUE);
00132 }
00133 else {
00134 attr_idx = ntr_sym_tbl(&token, name_idx);
00135 SET_IMPL_TYPE(attr_idx);
00136 }
00137 }
00138
00139 if (AT_OBJ_CLASS(attr_idx) == Data_Obj) {
00140 ATD_SEEN_OUTSIDE_IMP_DO(attr_idx) = TRUE;
00141 }
00142
00143 if (curr_stmt_category < Executable_Stmt_Cat &&
00144 LA_CH_VALUE == LPAREN &&
00145 AT_ATTR_LINK(attr_idx) == NULL_IDX &&
00146 AT_OBJ_CLASS(attr_idx) == Data_Obj &&
00147 ATD_ARRAY_IDX(attr_idx) == NULL_IDX &&
00148 (TYP_TYPE(ATD_TYPE_IDX(attr_idx)) != Character ||
00149 ! is_substring_ref())) {
00150
00151 parse_stmt_func_stmt(attr_idx, name_idx);
00152 goto EXIT;
00153 }
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 if (CURR_BLK_NO_EXEC &&
00169 CURR_BLK != Where_Else_Blk &&
00170 CURR_BLK != Where_Then_Blk &&
00171 CURR_BLK != Where_Else_Mask_Blk &&
00172 CURR_BLK != Forall_Blk) {
00173
00174 if (iss_blk_stk_err()) {
00175 parse_err_flush(Find_EOS, NULL);
00176 goto EXIT;
00177 }
00178 }
00179
00180 save_curr_stmt_category = curr_stmt_category;
00181 curr_stmt_category = Executable_Stmt_Cat;
00182 NTR_IR_TBL(ir_idx);
00183 SH_IR_IDX(curr_stmt_sh_idx) = ir_idx;
00184
00185 if (!parse_lhs(&opnd, attr_idx)) {
00186 parse_err_flush(Find_EOS, NULL);
00187 goto EXIT;
00188 }
00189
00190 COPY_OPND(IR_OPND_L(ir_idx), opnd);
00191
00192 IR_LINE_NUM(ir_idx) = LA_CH_LINE;
00193 IR_COL_NUM(ir_idx) = LA_CH_COLUMN;
00194
00195 line = LA_CH_LINE;
00196 col = LA_CH_COLUMN;
00197 buf_idx = LA_CH_BUF_IDX;
00198 stmt_num = LA_CH_STMT_NUM;
00199
00200 if (LA_CH_VALUE == EOS) {
00201 PRINTMSG(line, 724, Error, col, EOS_STR);
00202 curr_stmt_category = save_curr_stmt_category;
00203 }
00204 else if (MATCHED_TOKEN_CLASS(Tok_Class_Punct) &&
00205 (TOKEN_VALUE(token) == Tok_Punct_Eq ||
00206 TOKEN_VALUE(token) == Tok_Punct_Rename)) {
00207 IR_OPR(ir_idx) = (TOKEN_VALUE(token) == Tok_Punct_Eq) ? Asg_Opr :
00208 Ptr_Asg_Opr;
00209 parse_expr(&opnd);
00210 COPY_OPND(IR_OPND_R(ir_idx), opnd);
00211 }
00212 else {
00213 reset_lex(buf_idx, stmt_num);
00214 str[0] = LA_CH_VALUE;
00215 str[1] = '\0';
00216 PRINTMSG(line, 724, Error, col, str);
00217 parse_err_flush(Find_EOS, NULL);
00218 curr_stmt_category = save_curr_stmt_category;
00219 }
00220
00221 if (LA_CH_VALUE != EOS) {
00222 parse_err_flush(Find_EOS, "operator or " EOS_STR);
00223 }
00224
00225 EXIT:
00226
00227 NEXT_LA_CH;
00228
00229 TRACE (Func_Exit, "parse_assignment_stmt", NULL);
00230
00231 return;
00232
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251 boolean parse_expr (opnd_type *result)
00252
00253 {
00254 int attr_idx;
00255 int host_attr_idx;
00256 int host_name_idx;
00257 int ir_idx;
00258 int list1_idx;
00259 int list2_idx;
00260 int name_idx;
00261 opnd_type opnd = INIT_OPND_TYPE;
00262 boolean parsed_ok = TRUE;
00263
00264 TRACE (Func_Entry, "parse_expr", NULL);
00265
00266
00267 parsed_ok = parse_level_5(&opnd);
00268
00269 while (TOKEN_VALUE(token) == Tok_Op_Defined) {
00270
00271 NTR_IR_TBL(ir_idx);
00272 IR_OPR(ir_idx) = Defined_Bin_Opr;
00273
00274 attr_idx = srch_sym_tbl (TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
00275 host_attr_idx = attr_idx;
00276
00277 if (attr_idx == NULL_IDX) {
00278 host_attr_idx = srch_host_sym_tbl(TOKEN_STR(token),
00279 TOKEN_LEN(token),
00280 &host_name_idx,
00281 TRUE);
00282
00283 if (host_attr_idx) {
00284 attr_idx = ntr_host_in_sym_tbl(&token,
00285 name_idx,
00286 host_attr_idx,
00287 host_name_idx,
00288 TRUE);
00289
00290 attr_idx = host_attr_idx;
00291 }
00292 }
00293 else if (AT_ATTR_LINK(attr_idx)) {
00294 host_attr_idx = AT_ATTR_LINK(attr_idx);
00295 while (AT_ATTR_LINK(host_attr_idx)) {
00296 host_attr_idx = AT_ATTR_LINK(attr_idx);
00297 }
00298 }
00299
00300 if (attr_idx == NULL_IDX || AT_OBJ_CLASS(host_attr_idx) != Interface) {
00301
00302
00303
00304 PRINTMSG(TOKEN_LINE(token), 318, Error, TOKEN_COLUMN(token),
00305 TOKEN_STR(token));
00306 parsed_ok = FALSE;
00307 }
00308 else if (AT_NOT_VISIBLE(host_attr_idx)) {
00309 PRINTMSG(TOKEN_LINE(token), 486, Error,
00310 TOKEN_COLUMN(token),
00311 AT_OBJ_NAME_PTR(host_attr_idx),
00312 AT_OBJ_NAME_PTR(AT_MODULE_IDX((host_attr_idx))));
00313 parsed_ok = FALSE;
00314 }
00315
00316 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
00317 IR_IDX_L(ir_idx) = attr_idx;
00318
00319 IR_LINE_NUM_L(ir_idx) = TOKEN_LINE(token);
00320 IR_COL_NUM_L(ir_idx) = TOKEN_COLUMN(token);
00321 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00322 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00323
00324
00325 NTR_IR_LIST_TBL(list1_idx);
00326 NTR_IR_LIST_TBL(list2_idx);
00327 IR_FLD_R(ir_idx) = IL_Tbl_Idx;
00328 IR_LIST_CNT_R(ir_idx) = 2;
00329 IR_IDX_R(ir_idx) = list1_idx;
00330 IL_NEXT_LIST_IDX(list1_idx) = list2_idx;
00331 IL_PREV_LIST_IDX(list2_idx) = list1_idx;
00332
00333 COPY_OPND(IL_OPND(list1_idx), opnd);
00334
00335 parsed_ok = parse_level_5(&opnd) && parsed_ok;
00336
00337 COPY_OPND(IL_OPND(list2_idx), opnd);
00338
00339 OPND_FLD(opnd) = IR_Tbl_Idx;
00340 OPND_IDX(opnd) = ir_idx;
00341 }
00342
00343 COPY_OPND((*result), opnd)
00344
00345 TRACE (Func_Exit, "parse_expr", NULL);
00346
00347 return(parsed_ok);
00348 }
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366 boolean parse_level_1(opnd_type *result)
00367
00368 {
00369 int attr_idx;
00370 int def_idx = NULL_IDX;
00371 int host_attr_idx;
00372 int host_name_idx;
00373 int name_idx;
00374 opnd_type opnd = INIT_OPND_TYPE;
00375 boolean parsed_ok = TRUE;
00376
00377 TRACE (Func_Entry, "parse_level_1", NULL);
00378
00379 if (LA_CH_VALUE == DOT && matched_specific_token(Tok_Op_Defined,
00380 Tok_Class_Op)) {
00381
00382
00383 NTR_IR_TBL(def_idx);
00384 IR_OPR(def_idx) = Defined_Un_Opr;
00385 attr_idx = srch_sym_tbl (TOKEN_STR(token), TOKEN_LEN(token), &name_idx);
00386 host_attr_idx = attr_idx;
00387
00388 if (attr_idx == NULL_IDX) {
00389 host_attr_idx = srch_host_sym_tbl(TOKEN_STR(token),
00390 TOKEN_LEN(token),
00391 &host_name_idx,
00392 TRUE);
00393
00394 if (host_attr_idx) {
00395 attr_idx = ntr_host_in_sym_tbl(&token,
00396 name_idx,
00397 host_attr_idx,
00398 host_name_idx,
00399 TRUE);
00400
00401 attr_idx = host_attr_idx;
00402 }
00403 }
00404 else if (AT_ATTR_LINK(attr_idx)) {
00405 host_attr_idx = AT_ATTR_LINK(attr_idx);
00406 while (AT_ATTR_LINK(host_attr_idx)) {
00407 host_attr_idx = AT_ATTR_LINK(attr_idx);
00408 }
00409 }
00410
00411 if (attr_idx == NULL_IDX || AT_OBJ_CLASS(host_attr_idx) != Interface) {
00412
00413
00414
00415 PRINTMSG(TOKEN_LINE(token), 318, Error, TOKEN_COLUMN(token),
00416 TOKEN_STR(token));
00417 parsed_ok = FALSE;
00418 }
00419 else if (AT_NOT_VISIBLE(host_attr_idx)) {
00420 PRINTMSG(TOKEN_LINE(token), 486, Error,
00421 TOKEN_COLUMN(token),
00422 AT_OBJ_NAME_PTR(host_attr_idx),
00423 AT_OBJ_NAME_PTR(AT_MODULE_IDX((host_attr_idx))));
00424 parsed_ok = FALSE;
00425 }
00426 else {
00427
00428 IR_FLD_L(def_idx) = AT_Tbl_Idx;
00429 IR_IDX_L(def_idx) = attr_idx;
00430
00431 IR_LINE_NUM_L(def_idx) = TOKEN_LINE(token);
00432 IR_COL_NUM_L(def_idx) = TOKEN_COLUMN(token);
00433 IR_LINE_NUM(def_idx) = TOKEN_LINE(token);
00434 IR_COL_NUM(def_idx) = TOKEN_COLUMN(token);
00435 }
00436 }
00437
00438 parsed_ok = parse_operand(&opnd) && parsed_ok;
00439
00440 if (def_idx) {
00441 COPY_OPND(IR_OPND_R(def_idx), opnd)
00442 OPND_FLD((*result)) = IR_Tbl_Idx;
00443 OPND_IDX((*result)) = def_idx;
00444 }
00445 else {
00446 COPY_OPND((*result), opnd)
00447 }
00448 TRACE (Func_Exit, "parse_level_1", NULL);
00449
00450 return(parsed_ok);
00451 }
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469 boolean parse_mult_opnd(opnd_type *result)
00470
00471 {
00472 int ir_idx;
00473 opnd_type opnd = INIT_OPND_TYPE;
00474 boolean parsed_ok = TRUE;
00475
00476
00477 TRACE (Func_Entry, "parse_mult_opnd", NULL);
00478
00479 parsed_ok = parse_level_1(&opnd);
00480
00481 if (MATCHED_TOKEN_CLASS(Tok_Class_Op)) {
00482
00483 if (TOKEN_VALUE(token) == Tok_Op_Power) {
00484
00485 NTR_IR_TBL(ir_idx);
00486 IR_OPR(ir_idx) = Power_Opr;
00487 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00488 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00489
00490 COPY_OPND(IR_OPND_L(ir_idx), opnd)
00491
00492 parsed_ok = parse_mult_opnd(&opnd) && parsed_ok;
00493
00494 COPY_OPND(IR_OPND_R(ir_idx), opnd)
00495
00496 OPND_FLD((*result)) = IR_Tbl_Idx;
00497 OPND_IDX((*result)) = ir_idx;
00498 }
00499 else if (TOKEN_VALUE(token) == Tok_Const_True ||
00500 TOKEN_VALUE(token) == Tok_Const_False) {
00501
00502 PRINTMSG(TOKEN_LINE(token), 197, Error, TOKEN_COLUMN(token),
00503 "operator", "logical literal constant");
00504 parse_err_flush(Find_Expr_End, NULL);
00505 parsed_ok = FALSE;
00506 }
00507 else if (TOKEN_VALUE(token) == Tok_Op_Assign ||
00508 TOKEN_VALUE(token) == Tok_Op_Deref ||
00509 TOKEN_VALUE(token) == Tok_Op_Ptr_Assign ||
00510 TOKEN_VALUE(token) == Tok_Op_Not) {
00511
00512 reset_lex(TOKEN_BUF_IDX(token), TOKEN_STMT_NUM(token));
00513 COPY_OPND((*result),opnd);
00514 }
00515 else {
00516 COPY_OPND((*result),opnd);
00517 }
00518 }
00519 else {
00520 COPY_OPND((*result),opnd);
00521 }
00522
00523 TRACE (Func_Exit, "parse_mult_opnd", NULL);
00524
00525 return(parsed_ok);
00526 }
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544 boolean parse_add_opnd(opnd_type *result)
00545
00546 {
00547 int ir_idx;
00548 opnd_type opnd = INIT_OPND_TYPE;
00549 boolean parsed_ok = TRUE;
00550
00551 TRACE (Func_Entry, "parse_add_opnd", NULL);
00552
00553 parsed_ok = parse_mult_opnd(&opnd);
00554
00555 while (TOKEN_VALUE(token) == Tok_Op_Mult ||
00556 TOKEN_VALUE(token) == Tok_Op_Div) {
00557
00558 NTR_IR_TBL(ir_idx);
00559 switch (TOKEN_VALUE(token)) {
00560 case Tok_Op_Mult :
00561 IR_OPR(ir_idx) = Mult_Opr;
00562 break;
00563 case Tok_Op_Div :
00564 IR_OPR(ir_idx) = Div_Opr;
00565 }
00566 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00567 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00568
00569 COPY_OPND(IR_OPND_L(ir_idx), opnd);
00570
00571 parsed_ok = parse_mult_opnd(&opnd) && parsed_ok;
00572
00573 COPY_OPND(IR_OPND_R(ir_idx), opnd);
00574
00575 OPND_FLD(opnd) = IR_Tbl_Idx;
00576 OPND_IDX(opnd) = ir_idx;
00577 }
00578
00579 COPY_OPND((*result), opnd)
00580
00581 TRACE (Func_Exit, "parse_add_opnd", NULL);
00582
00583 return(parsed_ok);
00584 }
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602 boolean parse_level_2(opnd_type *result)
00603
00604 {
00605 int ir_idx = NULL_IDX;
00606 opnd_type opnd = INIT_OPND_TYPE;
00607 boolean parsed_ok = TRUE;
00608
00609 TRACE (Func_Entry, "parse_level_2", NULL);
00610
00611 if (LA_CH_VALUE == PLUS || LA_CH_VALUE == MINUS) {
00612 NTR_IR_TBL(ir_idx);
00613 switch (LA_CH_VALUE) {
00614 case PLUS :
00615 IR_OPR(ir_idx) = Uplus_Opr;
00616 break;
00617 case MINUS :
00618 IR_OPR(ir_idx) = Uminus_Opr;
00619 }
00620 IR_LINE_NUM(ir_idx) = LA_CH_LINE;
00621 IR_COL_NUM(ir_idx) = LA_CH_COLUMN;
00622 NEXT_LA_CH;
00623 }
00624
00625 parsed_ok = parse_add_opnd(&opnd);
00626
00627 if (ir_idx) {
00628 COPY_OPND(IR_OPND_L(ir_idx), opnd);
00629 OPND_FLD(opnd) = IR_Tbl_Idx;
00630 OPND_IDX(opnd) = ir_idx;
00631 }
00632
00633 while (TOKEN_VALUE(token) == Tok_Op_Add ||
00634 TOKEN_VALUE(token) == Tok_Op_Sub) {
00635
00636 NTR_IR_TBL(ir_idx);
00637 switch (TOKEN_VALUE(token)) {
00638 case Tok_Op_Add :
00639 IR_OPR(ir_idx) = Plus_Opr;
00640 break;
00641 case Tok_Op_Sub :
00642 IR_OPR(ir_idx) = Minus_Opr;
00643 }
00644 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00645 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00646
00647 COPY_OPND(IR_OPND_L(ir_idx), opnd);
00648
00649 parsed_ok = parse_add_opnd(&opnd) && parsed_ok;
00650
00651 COPY_OPND(IR_OPND_R(ir_idx), opnd);
00652
00653 OPND_FLD(opnd) = IR_Tbl_Idx;
00654 OPND_IDX(opnd) = ir_idx;
00655 }
00656
00657 COPY_OPND((*result), opnd)
00658
00659 TRACE (Func_Exit, "parse_level_2", NULL);
00660
00661 return(parsed_ok);
00662 }
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680 boolean parse_level_3(opnd_type *result)
00681
00682 {
00683 int ir_idx;
00684 opnd_type opnd = INIT_OPND_TYPE;
00685 boolean parsed_ok = TRUE;
00686
00687 TRACE (Func_Entry, "parse_level_3", NULL);
00688
00689 parsed_ok = parse_level_2(&opnd);
00690
00691 while (TOKEN_VALUE(token) == Tok_Op_Concat) {
00692
00693 NTR_IR_TBL(ir_idx);
00694 IR_OPR(ir_idx) = Concat_Opr;
00695 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00696 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00697
00698 COPY_OPND(IR_OPND_L(ir_idx), opnd);
00699
00700 parsed_ok = parse_level_2(&opnd) && parsed_ok;
00701
00702 COPY_OPND(IR_OPND_R(ir_idx), opnd);
00703
00704 OPND_FLD(opnd) = IR_Tbl_Idx;
00705 OPND_IDX(opnd) = ir_idx;
00706 }
00707
00708 COPY_OPND((*result), opnd)
00709
00710 TRACE (Func_Exit, "parse_level_3", NULL);
00711
00712 return(parsed_ok);
00713 }
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731 boolean parse_level_4(opnd_type *result)
00732
00733 {
00734 int ir_idx;
00735 opnd_type opnd = INIT_OPND_TYPE;
00736 boolean parsed_ok = TRUE;
00737
00738 TRACE (Func_Entry, "parse_level_4", NULL);
00739
00740 parsed_ok = parse_level_3(&opnd);
00741
00742 if (TOKEN_VALUE(token) == Tok_Op_Eq ||
00743 TOKEN_VALUE(token) == Tok_Op_Ne ||
00744 TOKEN_VALUE(token) == Tok_Op_Ge ||
00745 TOKEN_VALUE(token) == Tok_Op_Gt ||
00746 TOKEN_VALUE(token) == Tok_Op_Le ||
00747 TOKEN_VALUE(token) == Tok_Op_Lt ||
00748 TOKEN_VALUE(token) == Tok_Op_Lg) {
00749
00750 NTR_IR_TBL(ir_idx);
00751 switch (TOKEN_VALUE(token)) {
00752 case Tok_Op_Eq :
00753 IR_OPR(ir_idx) = Eq_Opr;
00754 break;
00755 case Tok_Op_Ne :
00756 IR_OPR(ir_idx) = Ne_Opr;
00757 break;
00758 case Tok_Op_Ge :
00759 IR_OPR(ir_idx) = Ge_Opr;
00760 break;
00761 case Tok_Op_Gt :
00762 IR_OPR(ir_idx) = Gt_Opr;
00763 break;
00764 case Tok_Op_Le :
00765 IR_OPR(ir_idx) = Le_Opr;
00766 break;
00767 case Tok_Op_Lt :
00768 IR_OPR(ir_idx) = Lt_Opr;
00769 break;
00770 case Tok_Op_Lg :
00771 IR_OPR(ir_idx) = Lg_Opr;
00772 PRINTMSG(TOKEN_LINE(token), 1243, Ansi, TOKEN_COLUMN(token));
00773 break;
00774 }
00775 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00776 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00777
00778 COPY_OPND(IR_OPND_L(ir_idx), opnd);
00779
00780 parsed_ok = parse_level_3(&opnd) && parsed_ok;
00781
00782 COPY_OPND(IR_OPND_R(ir_idx), opnd);
00783
00784 OPND_FLD(opnd) = IR_Tbl_Idx;
00785 OPND_IDX(opnd) = ir_idx;
00786 }
00787
00788 COPY_OPND((*result), opnd)
00789
00790 TRACE (Func_Exit, "parse_level_4", NULL);
00791
00792 return(parsed_ok);
00793 }
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811 boolean parse_and_opnd(opnd_type *result)
00812
00813 {
00814 int buf_idx;
00815 int i;
00816 int ir_idx = NULL_IDX;
00817 char op[8];
00818 opnd_type opnd = INIT_OPND_TYPE;
00819 boolean parsed_ok = TRUE;
00820 int stmt_num;
00821
00822
00823 TRACE (Func_Entry, "parse_and_opnd", NULL);
00824
00825 if (LA_CH_VALUE == DOT) {
00826 buf_idx = LA_CH_BUF_IDX;
00827 stmt_num = LA_CH_STMT_NUM;
00828
00829 NEXT_LA_CH;
00830
00831 for (i = 0; i < 4; i++) {
00832 op[i] = LA_CH_VALUE;
00833
00834 if (LA_CH_VALUE == DOT ||
00835 LA_CH_VALUE == EOS) {
00836 break;
00837 }
00838 NEXT_LA_CH;
00839 }
00840
00841 reset_lex(buf_idx, stmt_num);
00842
00843 if (((i == 1 && strncmp(op, "N.", 2) == 0) ||
00844 (i == 3 && strncmp(op, "NOT.", 4) == 0)) &&
00845 matched_specific_token(Tok_Op_Not, Tok_Class_Op)) {
00846
00847 NTR_IR_TBL(ir_idx);
00848 OPND_FLD((*result)) = IR_Tbl_Idx;
00849 OPND_IDX((*result)) = ir_idx;
00850 IR_OPR(ir_idx) = Not_Opr;
00851 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00852 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00853 }
00854 }
00855
00856 parsed_ok = parse_level_4(&opnd);
00857
00858 if (ir_idx) {
00859 COPY_OPND(IR_OPND_L(ir_idx), opnd);
00860 }
00861 else {
00862 COPY_OPND((*result), opnd);
00863 }
00864
00865 TRACE (Func_Exit, "parse_and_opnd", NULL);
00866
00867 return(parsed_ok);
00868 }
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886 boolean parse_or_opnd(opnd_type *result)
00887
00888 {
00889 int ir_idx;
00890 opnd_type opnd = INIT_OPND_TYPE;
00891 boolean parsed_ok = TRUE;
00892
00893 TRACE (Func_Entry, "parse_or_opnd", NULL);
00894
00895 parsed_ok = parse_and_opnd(&opnd);
00896
00897 while (TOKEN_VALUE(token) == Tok_Op_And) {
00898
00899 NTR_IR_TBL(ir_idx);
00900 IR_OPR(ir_idx) = And_Opr;
00901 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00902 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00903
00904 COPY_OPND(IR_OPND_L(ir_idx), opnd)
00905
00906 parsed_ok = parse_and_opnd(&opnd) && parsed_ok;
00907
00908 COPY_OPND(IR_OPND_R(ir_idx), opnd)
00909
00910 OPND_FLD(opnd) = IR_Tbl_Idx;
00911 OPND_IDX(opnd) = ir_idx;
00912 }
00913
00914 COPY_OPND((*result), opnd)
00915
00916 TRACE (Func_Exit, "parse_or_opnd", NULL);
00917
00918 return(parsed_ok);
00919 }
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937 boolean parse_equiv_opnd(opnd_type *result)
00938
00939 {
00940 int ir_idx;
00941 opnd_type opnd = INIT_OPND_TYPE;
00942 boolean parsed_ok = TRUE;
00943
00944 TRACE (Func_Entry, "parse_equiv_opnd", NULL);
00945
00946 parsed_ok = parse_or_opnd(&opnd);
00947
00948 while (TOKEN_VALUE(token) == Tok_Op_Or) {
00949
00950 NTR_IR_TBL(ir_idx);
00951 IR_OPR(ir_idx) = Or_Opr;
00952 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
00953 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
00954
00955 COPY_OPND(IR_OPND_L(ir_idx), opnd)
00956
00957 parsed_ok = parse_or_opnd(&opnd) && parsed_ok;
00958
00959 COPY_OPND(IR_OPND_R(ir_idx), opnd)
00960
00961 OPND_FLD(opnd) = IR_Tbl_Idx;
00962 OPND_IDX(opnd) = ir_idx;
00963 }
00964
00965 COPY_OPND((*result), opnd)
00966
00967 TRACE (Func_Exit, "parse_equiv_opnd", NULL);
00968
00969 return(parsed_ok);
00970 }
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988 boolean parse_level_5(opnd_type *result)
00989
00990 {
00991 int ir_idx;
00992 opnd_type opnd = INIT_OPND_TYPE;
00993 boolean parsed_ok = TRUE;
00994
00995 TRACE (Func_Entry, "parse_level_5", NULL);
00996
00997 parsed_ok = parse_equiv_opnd(&opnd);
00998
00999 while (TOKEN_VALUE(token) == Tok_Op_Eqv ||
01000 TOKEN_VALUE(token) == Tok_Op_Neqv) {
01001
01002 NTR_IR_TBL(ir_idx);
01003 switch (TOKEN_VALUE(token)) {
01004 case Tok_Op_Eqv :
01005 IR_OPR(ir_idx) = Eqv_Opr;
01006 break;
01007 case Tok_Op_Neqv :
01008 IR_OPR(ir_idx) = Neqv_Opr;
01009 }
01010 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
01011 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
01012
01013 COPY_OPND(IR_OPND_L(ir_idx), opnd)
01014
01015 parsed_ok = parse_equiv_opnd(&opnd) && parsed_ok;
01016
01017 COPY_OPND(IR_OPND_R(ir_idx), opnd)
01018
01019 OPND_FLD(opnd) = IR_Tbl_Idx;
01020 OPND_IDX(opnd) = ir_idx;
01021 }
01022
01023 COPY_OPND((*result), opnd)
01024
01025 TRACE (Func_Exit, "parse_level_5", NULL);
01026
01027 return(parsed_ok);
01028 }
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045 boolean parse_operand (opnd_type *the_opnd)
01046
01047 {
01048 opnd_type cmplx_opnd = INIT_OPND_TYPE;
01049 int cmplx_lin_type;
01050 int cmplx_dcl_val;
01051 int cmplx_desc;
01052 int col;
01053 int cx_l = NULL_IDX;
01054 int cx_r = NULL_IDX;
01055 long_type constant[MAX_WORDS_FOR_NUMERIC];
01056 expr_arg_type exp_desc;
01057 int ir_idx;
01058 int line;
01059 int list_idx;
01060 int list2_idx;
01061 opnd_type opnd = INIT_OPND_TYPE;
01062 boolean parsed_ok = TRUE;
01063 boolean save_in_constructor;
01064 int type_idx;
01065 int type_l;
01066 int type_r;
01067
01068
01069 TRACE (Func_Entry, "parse_operand", NULL);
01070
01071 if (LA_CH_VALUE == LPAREN && matched_specific_token(Tok_Punct_Lparen,
01072 Tok_Class_Punct)) {
01073
01074 line = TOKEN_LINE(token);
01075 col = TOKEN_COLUMN(token);
01076
01077 if (!parse_expr(the_opnd)) {
01078 parsed_ok = FALSE;
01079 }
01080 else if (LA_CH_VALUE == RPAREN) {
01081
01082 NTR_IR_TBL(ir_idx);
01083 IR_OPR(ir_idx) = Paren_Opr;
01084 COPY_OPND(IR_OPND_L(ir_idx), (*the_opnd));
01085 OPND_FLD((*the_opnd)) = IR_Tbl_Idx;
01086 OPND_IDX((*the_opnd)) = ir_idx;
01087 IR_LINE_NUM(ir_idx) = line;
01088 IR_COL_NUM(ir_idx) = col;
01089
01090 NEXT_LA_CH;
01091 goto EXIT;
01092 }
01093
01094 else if (OPND_FLD((*the_opnd)) == CN_Tbl_Idx) {
01095 cx_l = OPND_IDX((*the_opnd));
01096 }
01097 else if (OPND_FLD((*the_opnd)) == AT_Tbl_Idx &&
01098 AT_OBJ_CLASS(OPND_IDX((*the_opnd))) == Data_Obj &&
01099 ATD_CLASS(OPND_IDX((*the_opnd))) == Constant &&
01100 ATD_FLD(OPND_IDX((*the_opnd))) == CN_Tbl_Idx) {
01101
01102 cx_l = ATD_CONST_IDX(OPND_IDX((*the_opnd)));
01103 }
01104 else if (OPND_FLD((*the_opnd)) == IR_Tbl_Idx &&
01105 (IR_OPR(OPND_IDX((*the_opnd))) == Uplus_Opr ||
01106 IR_OPR(OPND_IDX((*the_opnd))) == Uminus_Opr) &&
01107 (IR_FLD_L(OPND_IDX((*the_opnd))) == CN_Tbl_Idx ||
01108 (IR_FLD_L(OPND_IDX((*the_opnd))) == AT_Tbl_Idx &&
01109 AT_OBJ_CLASS(IR_IDX_L(OPND_IDX((*the_opnd)))) == Data_Obj &&
01110 ATD_CLASS(IR_IDX_L(OPND_IDX((*the_opnd)))) == Constant &&
01111 ATD_FLD(IR_IDX_L(OPND_IDX((*the_opnd)))) == CN_Tbl_Idx))) {
01112
01113 exp_desc.rank = 0;
01114 xref_state = CIF_No_Usage_Rec;
01115 comp_gen_expr = TRUE;
01116 parsed_ok = expr_semantics(the_opnd, &exp_desc);
01117 comp_gen_expr = FALSE;
01118
01119 if (OPND_FLD((*the_opnd)) == CN_Tbl_Idx) {
01120 cx_l = OPND_IDX((*the_opnd));
01121 }
01122 }
01123
01124 if (cx_l &&
01125 (TYP_TYPE(CN_TYPE_IDX(cx_l)) == Real ||
01126 TYP_TYPE(CN_TYPE_IDX(cx_l)) == Integer) &&
01127 LA_CH_VALUE == COMMA ) {
01128
01129 NEXT_LA_CH;
01130
01131 if (!parse_expr(&cmplx_opnd)) {
01132 parsed_ok = FALSE;
01133 }
01134 else {
01135
01136 if (OPND_FLD(cmplx_opnd) == CN_Tbl_Idx) {
01137 cx_r = OPND_IDX(cmplx_opnd);
01138 }
01139 else if (OPND_FLD(cmplx_opnd) == AT_Tbl_Idx &&
01140 AT_OBJ_CLASS(OPND_IDX(cmplx_opnd)) == Data_Obj &&
01141 ATD_CLASS(OPND_IDX(cmplx_opnd)) == Constant &&
01142 ATD_FLD(OPND_IDX(cmplx_opnd)) == CN_Tbl_Idx) {
01143
01144 cx_r = ATD_CONST_IDX(OPND_IDX(cmplx_opnd));
01145 }
01146 else if (OPND_FLD(cmplx_opnd) == IR_Tbl_Idx &&
01147 (IR_OPR(OPND_IDX(cmplx_opnd)) == Uplus_Opr ||
01148 IR_OPR(OPND_IDX(cmplx_opnd)) == Uminus_Opr) &&
01149 (IR_FLD_L(OPND_IDX(cmplx_opnd)) == CN_Tbl_Idx ||
01150 (IR_FLD_L(OPND_IDX(cmplx_opnd)) == AT_Tbl_Idx &&
01151 AT_OBJ_CLASS(IR_IDX_L(OPND_IDX(cmplx_opnd)))==Data_Obj &&
01152 ATD_CLASS(IR_IDX_L(OPND_IDX(cmplx_opnd))) == Constant &&
01153 ATD_FLD(IR_IDX_L(OPND_IDX(cmplx_opnd))) == CN_Tbl_Idx))){
01154
01155 exp_desc.rank = 0;
01156 xref_state = CIF_No_Usage_Rec;
01157 comp_gen_expr = TRUE;
01158 parsed_ok = expr_semantics(&cmplx_opnd, &exp_desc);
01159 comp_gen_expr = FALSE;
01160
01161 if (OPND_FLD(cmplx_opnd) == CN_Tbl_Idx) {
01162 cx_r = OPND_IDX(cmplx_opnd);
01163 }
01164 }
01165
01166
01167 if (cx_r &&
01168 (TYP_TYPE(CN_TYPE_IDX(cx_r)) == Real ||
01169 TYP_TYPE(CN_TYPE_IDX(cx_r)) == Integer)) {
01170 type_r = CN_TYPE_IDX(cx_r);
01171 type_l = CN_TYPE_IDX(cx_l);
01172
01173 if (TYP_TYPE(type_l) == Real &&
01174 TYP_TYPE(type_r) == Real) {
01175
01176 if (TYP_LINEAR(type_l) > TYP_LINEAR(type_r)) {
01177 cmplx_lin_type = TYP_LINEAR(type_l);
01178 cmplx_dcl_val = TYP_DCL_VALUE(type_l);
01179 cmplx_desc = TYP_DESC(type_l);
01180 }
01181 else {
01182 cmplx_lin_type = TYP_LINEAR(type_r);
01183 cmplx_dcl_val = TYP_DCL_VALUE(type_r);
01184 cmplx_desc = TYP_DESC(type_r);
01185 }
01186 }
01187 else if (TYP_TYPE(type_l) == Real &&
01188 TYP_TYPE(type_r) == Integer) {
01189 cmplx_lin_type = TYP_LINEAR(type_l);
01190 cmplx_dcl_val = TYP_DCL_VALUE(type_l);
01191 cmplx_desc = TYP_DESC(type_l);
01192
01193 }
01194 else if (TYP_TYPE(type_l) == Integer &&
01195 TYP_TYPE(type_r) == Real) {
01196 cmplx_lin_type = TYP_LINEAR(type_r);
01197 cmplx_dcl_val = TYP_DCL_VALUE(type_r);
01198 cmplx_desc = TYP_DESC(type_r);
01199
01200 }
01201 else {
01202 cmplx_lin_type = REAL_DEFAULT_TYPE;
01203 cmplx_dcl_val = 0;
01204 cmplx_desc = 0;
01205 }
01206
01207 type_idx = cmplx_lin_type;
01208 parsed_ok = folder_driver((char *)&CN_CONST(cx_l),
01209 type_l,
01210 NULL,
01211 NULL_IDX,
01212 constant,
01213 &type_idx,
01214 line,
01215 col,
01216 1,
01217 Cvrt_Opr) && parsed_ok;
01218
01219 type_idx = cmplx_lin_type;
01220 parsed_ok = folder_driver((char *)&CN_CONST(cx_r),
01221 type_r,
01222 NULL,
01223 NULL_IDX,
01224 &(constant[num_host_wds[cmplx_lin_type]]),
01225 &type_idx,
01226 line,
01227 col,
01228 1,
01229 Cvrt_Opr) && parsed_ok;
01230
01231 switch(cmplx_lin_type) {
01232 case Real_4 :
01233 cmplx_lin_type = Complex_4;
01234 # if defined(_WHIRL_HOST64_TARGET64)
01235 {
01236 float *p = (float*)(&constant);
01237 p[1] = p[2];
01238 }
01239 # endif
01240 break;
01241
01242 case Real_8 :
01243 cmplx_lin_type = Complex_8;
01244 break;
01245
01246 case Real_16 :
01247 cmplx_lin_type = Complex_16;
01248 break;
01249
01250 }
01251
01252 OPND_FLD((*the_opnd)) = CN_Tbl_Idx;
01253
01254 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
01255 TYP_TYPE(TYP_WORK_IDX) = Complex;
01256 TYP_LINEAR(TYP_WORK_IDX) = (linear_type_type) cmplx_lin_type;
01257 TYP_DCL_VALUE(TYP_WORK_IDX) = cmplx_dcl_val;
01258 TYP_DESC(TYP_WORK_IDX) = (type_desc_type) cmplx_desc;
01259 type_idx = ntr_type_tbl();
01260
01261 OPND_IDX((*the_opnd)) = ntr_const_tbl(type_idx,
01262 FALSE,
01263 constant);
01264 }
01265 else {
01266 parse_err_flush(Find_Rparen, "CONSTANT");
01267 parsed_ok = FALSE;
01268 }
01269 }
01270 }
01271
01272 if (LA_CH_VALUE == RPAREN) {
01273 NEXT_LA_CH;
01274 }
01275 else if (parse_err_flush(Find_Rparen, ")")) {
01276 NEXT_LA_CH;
01277 parsed_ok = FALSE;
01278 }
01279 else {
01280 parsed_ok = FALSE;
01281 }
01282 goto EXIT;
01283 }
01284 else if (LA_CH_CLASS == Ch_Class_Digit ||
01285 LA_CH_CLASS == Ch_Class_Letter ||
01286 LA_CH_VALUE == DOT ||
01287 LA_CH_VALUE == QUOTE ||
01288 LA_CH_VALUE == DBL_QUOTE) {
01289
01290 if (MATCHED_TOKEN_CLASS(Tok_Class_Opnd)) {
01291 OPND_LINE_NUM((*the_opnd)) = TOKEN_LINE(token);
01292 OPND_COL_NUM((*the_opnd)) = TOKEN_COLUMN(token);
01293 OPND_FLD((*the_opnd)) = CN_Tbl_Idx;
01294
01295 switch (TOKEN_VALUE(token)) {
01296
01297 case Tok_Id :
01298
01299 if (! parse_deref(the_opnd, NULL_IDX)) {
01300 parsed_ok = FALSE;
01301 }
01302 break;
01303
01304 case Tok_Const_Char :
01305
01306 if (LA_CH_VALUE == LPAREN && is_substring_ref ()) {
01307 NTR_IR_TBL(ir_idx);
01308 IR_OPR(ir_idx) = Substring_Opr;
01309 IR_LINE_NUM(ir_idx) = LA_CH_LINE;
01310 IR_COL_NUM(ir_idx) = LA_CH_COLUMN;
01311 OPND_FLD((*the_opnd)) = IR_Tbl_Idx;
01312 OPND_IDX((*the_opnd)) = ir_idx;
01313 IR_FLD_L(ir_idx) = CN_Tbl_Idx;
01314 IR_IDX_L(ir_idx) = TOKEN_CONST_TBL_IDX(token);
01315 IR_LINE_NUM_L(ir_idx) = TOKEN_LINE(token);
01316 IR_COL_NUM_L(ir_idx) = TOKEN_COLUMN(token);
01317
01318 IR_FLD_R(ir_idx) = IL_Tbl_Idx;
01319 IR_LIST_CNT_R(ir_idx) = 2;
01320 NTR_IR_LIST_TBL(list_idx);
01321 NTR_IR_LIST_TBL(list2_idx);
01322 IR_IDX_R(ir_idx) = list_idx;
01323 IL_NEXT_LIST_IDX(list_idx) = list2_idx;
01324 IL_PREV_LIST_IDX(list2_idx) = list_idx;
01325
01326
01327 NEXT_LA_CH;
01328
01329 if (LA_CH_VALUE != COLON) {
01330 parsed_ok = parse_expr(&opnd) && parsed_ok;
01331 COPY_OPND(IL_OPND(list_idx), opnd);
01332 }
01333
01334 if (LA_CH_VALUE != COLON) {
01335 if (parse_err_flush(Find_Rparen, ":")) {
01336 NEXT_LA_CH;
01337 }
01338 parsed_ok = FALSE;
01339 goto EXIT;
01340 }
01341 else {
01342 NEXT_LA_CH;
01343 }
01344 if (LA_CH_VALUE != RPAREN) {
01345 parsed_ok = parse_expr(&opnd) && parsed_ok;
01346 COPY_OPND(IL_OPND(list2_idx), opnd);
01347 }
01348
01349 if (LA_CH_VALUE != RPAREN) {
01350
01351 if (parse_err_flush(Find_Rparen, ")")) {
01352 NEXT_LA_CH;
01353 }
01354 parsed_ok = FALSE;
01355 }
01356 else {
01357 NEXT_LA_CH;
01358 }
01359 }
01360 else {
01361 OPND_IDX((*the_opnd)) = TOKEN_CONST_TBL_IDX(token);
01362 }
01363 break;
01364
01365 case Tok_Const_Hollerith :
01366 case Tok_Const_Boolean :
01367 case Tok_Const_Boz :
01368 case Tok_Const_Int :
01369 case Tok_Const_Real :
01370 case Tok_Const_Dbl :
01371 case Tok_Const_Quad :
01372 case Tok_Const_False :
01373 case Tok_Const_True :
01374
01375 OPND_IDX((*the_opnd)) = TOKEN_CONST_TBL_IDX(token);
01376 break;
01377 }
01378 }
01379 else if (TOKEN_VALUE(token) == Tok_Unknown) {
01380 parsed_ok = FALSE;
01381 parse_err_flush(Find_Expr_End, parse_operand_insert);
01382 }
01383 else {
01384 parsed_ok = FALSE;
01385 parse_err_flush(Find_Expr_End, NULL);
01386 }
01387 }
01388 else if (LA_CH_VALUE == LPAREN && matched_specific_token(Tok_Punct_Lbrkt,
01389 Tok_Class_Punct)) {
01390
01391
01392
01393 NTR_IR_TBL(ir_idx);
01394 IR_OPR(ir_idx) = Array_Construct_Opr;
01395 IR_LINE_NUM(ir_idx) = TOKEN_LINE(token);
01396 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(token);
01397 OPND_FLD((*the_opnd)) = IR_Tbl_Idx;
01398 OPND_IDX((*the_opnd)) = ir_idx;
01399
01400 save_in_constructor = in_constructor;
01401 in_constructor = TRUE;
01402 parsed_ok = parse_io_list(&opnd) && parsed_ok;
01403 in_constructor = save_in_constructor;
01404
01405 COPY_OPND(IR_OPND_R(ir_idx), opnd);
01406
01407 if (LA_CH_VALUE == SLASH && matched_specific_token(Tok_Punct_Rbrkt,
01408 Tok_Class_Punct)) {
01409
01410
01411 }
01412 else {
01413 parse_err_flush(Find_EOS, "/)");
01414 parsed_ok = FALSE;
01415 }
01416 }
01417 else {
01418 parsed_ok = FALSE;
01419 parse_err_flush(Find_Expr_End, parse_operand_insert);
01420
01421 if (LA_CH_VALUE == EOS) {
01422 TOKEN_STR_WD(token, 0) = 0;
01423 TOKEN_VALUE(token) = Tok_EOS;
01424 TOKEN_KIND_STR(token)[0] = EOS;
01425 TOKEN_KIND_LEN(token) = 0;
01426 TOKEN_LEN(token) = 0;
01427 TOKEN_LINE(token) = LA_CH_LINE;
01428 TOKEN_COLUMN(token) = LA_CH_COLUMN;
01429 }
01430 }
01431
01432 EXIT:
01433 TRACE (Func_Exit, "parse_operand", NULL);
01434
01435 return(parsed_ok);
01436
01437 }
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455 boolean parse_lhs (opnd_type *result_opnd,
01456 int attr_idx)
01457
01458 {
01459
01460 int array_idx;
01461 int amb_attr_idx;
01462 token_type attr_name;
01463 int col;
01464 int ir_idx;
01465 int line;
01466 int list_idx;
01467 int list2_idx;
01468 int list3_idx;
01469 opnd_type opnd = INIT_OPND_TYPE;
01470 boolean parsed_ok = TRUE;
01471 int rank;
01472 int subs_idx = NULL_IDX;
01473 int substring_idx;
01474 int trip_idx;
01475
01476
01477 TRACE (Func_Entry, "parse_lhs", NULL);
01478
01479 attr_name = token;
01480
01481 amb_attr_idx = attr_idx;
01482
01483 while (AT_ATTR_LINK(amb_attr_idx)) {
01484 amb_attr_idx = AT_ATTR_LINK(amb_attr_idx);
01485 }
01486
01487
01488
01489 if (AT_DCL_ERR(attr_idx)) {
01490 SH_ERR_FLG(curr_stmt_sh_idx) = TRUE;
01491
01492 parse_err_flush(Find_Ref_End, NULL);
01493 parsed_ok = FALSE;
01494 goto EXIT;
01495 }
01496
01497
01498
01499 switch (AT_OBJ_CLASS(amb_attr_idx)) {
01500 case Data_Obj :
01501
01502 break;
01503
01504 case Pgm_Unit :
01505
01506
01507
01508 if (ATP_PGM_UNIT(amb_attr_idx) == Function &&
01509 ATP_SCP_ALIVE(amb_attr_idx)) {
01510
01511 if (ATP_RSLT_NAME(amb_attr_idx)) {
01512
01513
01514
01515 PRINTMSG(TOKEN_LINE(token), 299, Error,
01516 TOKEN_COLUMN(token));
01517 parse_err_flush(Find_Ref_End, NULL);
01518 parsed_ok = FALSE;
01519 goto EXIT;
01520 }
01521 else {
01522 attr_idx = ATP_RSLT_IDX(amb_attr_idx);
01523 amb_attr_idx = attr_idx;
01524 }
01525 }
01526 else {
01527
01528 if (AT_NOT_VISIBLE(amb_attr_idx)) {
01529 PRINTMSG(TOKEN_LINE(token), 486, Error,
01530 TOKEN_COLUMN(token),
01531 AT_OBJ_NAME_PTR(amb_attr_idx),
01532 AT_OBJ_NAME_PTR(AT_MODULE_IDX((amb_attr_idx))));
01533 }
01534 else {
01535 PRINTMSG(TOKEN_LINE(token), 281, Error,
01536 TOKEN_COLUMN(token));
01537 }
01538 parsed_ok = FALSE;
01539 parse_err_flush(Find_Ref_End, NULL);
01540 goto EXIT;
01541 }
01542
01543 break;
01544
01545 default :
01546
01547 if (AT_NOT_VISIBLE(amb_attr_idx)) {
01548 PRINTMSG(TOKEN_LINE(token), 486, Error,
01549 TOKEN_COLUMN(token),
01550 AT_OBJ_NAME_PTR(amb_attr_idx),
01551 AT_OBJ_NAME_PTR(AT_MODULE_IDX((amb_attr_idx))));
01552 }
01553 else {
01554 PRINTMSG(TOKEN_LINE(token), 281, Error,
01555 TOKEN_COLUMN(token));
01556 }
01557
01558 parsed_ok = FALSE;
01559 parse_err_flush(Find_Ref_End, NULL);
01560 goto EXIT;
01561 }
01562
01563 OPND_FLD((*result_opnd)) = AT_Tbl_Idx;
01564 OPND_IDX((*result_opnd)) = attr_idx;
01565 OPND_LINE_NUM((*result_opnd)) = TOKEN_LINE(token);
01566 OPND_COL_NUM((*result_opnd)) = TOKEN_COLUMN(token);
01567
01568 # ifdef COARRAY_FORTRAN
01569 if (LA_CH_VALUE != PERCENT && LA_CH_VALUE != LPAREN &&
01570 ((! cmd_line_flags.co_array_fortran) || LA_CH_VALUE != LBRKT))
01571 # else
01572 if (LA_CH_VALUE != PERCENT && LA_CH_VALUE != LPAREN)
01573 # endif
01574 {
01575 goto EXIT;
01576 }
01577
01578
01579 if (LA_CH_VALUE == LPAREN) {
01580
01581 array_idx = ATD_ARRAY_IDX(amb_attr_idx);
01582
01583 if (array_idx) {
01584
01585 rank = 0;
01586 NTR_IR_TBL(subs_idx);
01587 IR_FLD_L(subs_idx) = AT_Tbl_Idx;
01588 IR_IDX_L(subs_idx) = attr_idx;
01589 IR_LINE_NUM_L(subs_idx) = TOKEN_LINE(token);
01590 IR_COL_NUM_L(subs_idx) = TOKEN_COLUMN(token);
01591
01592
01593 IR_LINE_NUM(subs_idx) = LA_CH_LINE;
01594 IR_COL_NUM(subs_idx) = LA_CH_COLUMN;
01595
01596 IR_OPR(subs_idx) = Subscript_Opr;
01597 IR_FLD_R(subs_idx) = IL_Tbl_Idx;
01598
01599 list_idx = NULL_IDX;
01600
01601 do {
01602 NEXT_LA_CH;
01603
01604 if (list_idx == NULL_IDX) {
01605 NTR_IR_LIST_TBL(list_idx);
01606 IR_IDX_R(subs_idx) = list_idx;
01607 }
01608 else {
01609 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01610 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01611 list_idx = IL_NEXT_LIST_IDX(list_idx);
01612 }
01613
01614 if (LA_CH_VALUE != COLON) {
01615 parsed_ok = parse_expr(&opnd) && parsed_ok;
01616 COPY_OPND(IL_OPND(list_idx), opnd);
01617 }
01618
01619
01620
01621 if (LA_CH_VALUE == COLON) {
01622 NTR_IR_TBL(trip_idx);
01623 IR_LINE_NUM(trip_idx) = LA_CH_LINE;
01624 IR_COL_NUM(trip_idx) = LA_CH_COLUMN;
01625
01626 NEXT_LA_CH;
01627
01628 IR_OPR(trip_idx) = Triplet_Opr;
01629 IR_FLD_L(trip_idx) = IL_Tbl_Idx;
01630 IR_LIST_CNT_L(trip_idx) = 3;
01631 NTR_IR_LIST_TBL(list2_idx);
01632 IR_IDX_L(trip_idx) = list2_idx;
01633 IL_OPND(list2_idx) = IL_OPND(list_idx);
01634 IL_FLD(list_idx) = IR_Tbl_Idx;
01635 IL_IDX(list_idx) = trip_idx;
01636 NTR_IR_LIST_TBL(list3_idx);
01637 IL_NEXT_LIST_IDX(list2_idx) = list3_idx;
01638 IL_PREV_LIST_IDX(list3_idx) = list2_idx;
01639
01640 if (LA_CH_VALUE != COLON &&
01641 LA_CH_VALUE != COMMA &&
01642 LA_CH_VALUE != RPAREN) {
01643 parsed_ok = parse_expr(&opnd) && parsed_ok;
01644 COPY_OPND(IL_OPND(list3_idx), opnd);
01645 }
01646
01647 NTR_IR_LIST_TBL(list2_idx);
01648 IL_NEXT_LIST_IDX(list3_idx) = list2_idx;
01649 IL_PREV_LIST_IDX(list2_idx) = list3_idx;
01650
01651 if (LA_CH_VALUE == COLON) {
01652 NEXT_LA_CH;
01653 parsed_ok = parse_expr(&opnd) && parsed_ok;
01654 COPY_OPND(IL_OPND(list2_idx), opnd);
01655 }
01656 }
01657 rank++;
01658 }
01659 while (LA_CH_VALUE == COMMA);
01660
01661 if (! matched_specific_token(Tok_Punct_Rparen, Tok_Class_Punct)) {
01662 if (parse_err_flush(Find_Rparen, ")")) {
01663 NEXT_LA_CH;
01664 }
01665 parsed_ok = FALSE;
01666 goto EXIT;
01667 }
01668
01669 IR_LIST_CNT_R(subs_idx) = rank;
01670
01671 }
01672
01673
01674
01675 if (LA_CH_VALUE == LPAREN) {
01676
01677 if (is_substring_ref ()) {
01678
01679 if (TYP_TYPE(ATD_TYPE_IDX(amb_attr_idx)) != Character) {
01680
01681 PRINTMSG(TOKEN_LINE(token), 508, Error, TOKEN_COLUMN(token));
01682 parsed_ok = FALSE;
01683 parse_err_flush(Find_Ref_End, NULL);
01684 goto EXIT;
01685 }
01686
01687 NTR_IR_TBL(substring_idx);
01688 IR_OPR(substring_idx) = Substring_Opr;
01689 IR_LINE_NUM(substring_idx) = LA_CH_LINE;
01690 IR_COL_NUM(substring_idx) = LA_CH_COLUMN;
01691 OPND_FLD((*result_opnd)) = IR_Tbl_Idx;
01692 OPND_IDX((*result_opnd)) = substring_idx;
01693
01694 if (subs_idx) {
01695 IR_FLD_L(substring_idx) = IR_Tbl_Idx;
01696 IR_IDX_L(substring_idx) = subs_idx;
01697
01698 }
01699 else {
01700 IR_FLD_L(substring_idx) = AT_Tbl_Idx;
01701 IR_IDX_L(substring_idx) = attr_idx;
01702 IR_LINE_NUM_L(substring_idx) = TOKEN_LINE(token);
01703 IR_COL_NUM_L(substring_idx) = TOKEN_COLUMN(token);
01704 }
01705
01706 IR_FLD_R(substring_idx) = IL_Tbl_Idx;
01707 IR_LIST_CNT_R(substring_idx) = 2;
01708 NTR_IR_LIST_TBL(list_idx);
01709 NTR_IR_LIST_TBL(list2_idx);
01710 IR_IDX_R(substring_idx) = list_idx;
01711 IL_NEXT_LIST_IDX(list_idx) = list2_idx;
01712 IL_PREV_LIST_IDX(list2_idx) = list_idx;
01713
01714
01715 NEXT_LA_CH;
01716
01717 if (LA_CH_VALUE != COLON) {
01718 parsed_ok = parse_expr(&opnd) && parsed_ok;
01719 COPY_OPND(IL_OPND(list_idx), opnd);
01720 }
01721
01722 if (LA_CH_VALUE != COLON) {
01723 if (parse_err_flush(Find_Rparen, ":")) {
01724 NEXT_LA_CH;
01725 }
01726 parsed_ok = FALSE;
01727 goto EXIT;
01728 }
01729 else {
01730 NEXT_LA_CH;
01731 }
01732
01733 if (LA_CH_VALUE != RPAREN) {
01734 parsed_ok = parse_expr(&opnd) && parsed_ok;
01735 COPY_OPND(IL_OPND(list2_idx), opnd);
01736 }
01737
01738 if (LA_CH_VALUE != RPAREN) {
01739
01740 if (parse_err_flush(Find_Rparen, ")")) {
01741 NEXT_LA_CH;
01742 }
01743 parsed_ok = FALSE;
01744 goto EXIT;
01745 }
01746 else {
01747 NEXT_LA_CH;
01748 }
01749 goto EXIT;
01750 }
01751 }
01752
01753 if (LA_CH_VALUE != PERCENT) {
01754
01755 if (subs_idx) {
01756 OPND_FLD((*result_opnd)) = IR_Tbl_Idx;
01757 OPND_IDX((*result_opnd)) = subs_idx;
01758 }
01759 else {
01760
01761 OPND_FLD((*result_opnd)) = AT_Tbl_Idx;
01762 OPND_IDX((*result_opnd)) = attr_idx;
01763 OPND_LINE_NUM((*result_opnd)) = TOKEN_LINE(attr_name);
01764 OPND_COL_NUM((*result_opnd)) = TOKEN_COLUMN(attr_name);
01765
01766 }
01767 }
01768 }
01769
01770 # ifdef COARRAY_FORTRAN
01771 if (cmd_line_flags.co_array_fortran &&
01772 LA_CH_VALUE == LBRKT &&
01773 AT_OBJ_CLASS(amb_attr_idx) == Data_Obj) {
01774
01775 if (ATD_PE_ARRAY_IDX(amb_attr_idx) == NULL_IDX) {
01776
01777 PRINTMSG(LA_CH_LINE, 1245, Error, LA_CH_COLUMN,
01778 AT_OBJ_NAME_PTR(amb_attr_idx));
01779 parsed_ok = FALSE;
01780 parse_err_flush(Find_Ref_End, NULL);
01781 goto EXIT;
01782 }
01783
01784 if (subs_idx == NULL_IDX) {
01785 NTR_IR_TBL(subs_idx);
01786
01787
01788 IR_LINE_NUM(subs_idx) = LA_CH_LINE;
01789 IR_COL_NUM(subs_idx) = LA_CH_COLUMN;
01790
01791 IR_OPR(subs_idx) = Subscript_Opr;
01792 IR_FLD_R(subs_idx) = IL_Tbl_Idx;
01793 IR_LIST_CNT_R(subs_idx) = 0;
01794
01795 if (OPND_FLD((*result_opnd)) == AT_Tbl_Idx) {
01796 COPY_OPND(IR_OPND_L(subs_idx), (*result_opnd));
01797
01798
01799 OPND_FLD((*result_opnd)) = IR_Tbl_Idx;
01800 OPND_IDX((*result_opnd)) = subs_idx;
01801 }
01802 else if (OPND_FLD((*result_opnd)) == IR_Tbl_Idx &&
01803 IR_OPR(OPND_IDX((*result_opnd))) == Substring_Opr) {
01804
01805 COPY_OPND(IR_OPND_L(subs_idx), IR_OPND_L(OPND_IDX((*result_opnd))));
01806
01807 IR_FLD_L(OPND_IDX((*result_opnd))) = IR_Tbl_Idx;
01808 IR_IDX_L(OPND_IDX((*result_opnd))) = subs_idx;
01809 }
01810 # ifdef _DEBUG
01811 else {
01812 PRINTMSG(LA_CH_LINE, 626, Internal, LA_CH_COLUMN,
01813 "AT_Tbl_Idx", "parse_deref");
01814 }
01815 # endif
01816
01817 list_idx = NULL_IDX;
01818 }
01819 else {
01820
01821 list_idx = IR_IDX_R(subs_idx);
01822
01823 while (IL_NEXT_LIST_IDX(list_idx) != NULL_IDX) {
01824 list_idx = IL_NEXT_LIST_IDX(list_idx);
01825 }
01826 }
01827
01828 do {
01829 NEXT_LA_CH;
01830
01831 if (list_idx == NULL_IDX) {
01832 NTR_IR_LIST_TBL(list_idx);
01833 IR_IDX_R(subs_idx) = list_idx;
01834 }
01835 else {
01836 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01837 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01838 list_idx = IL_NEXT_LIST_IDX(list_idx);
01839 }
01840
01841 IL_PE_SUBSCRIPT(list_idx) = TRUE;
01842
01843 if (LA_CH_VALUE != COLON) {
01844 parsed_ok = parse_expr(&opnd) && parsed_ok;
01845 COPY_OPND(IL_OPND(list_idx), opnd);
01846 }
01847
01848
01849
01850 if (LA_CH_VALUE == COLON) {
01851
01852 NTR_IR_TBL(trip_idx);
01853 IR_LINE_NUM(trip_idx) = LA_CH_LINE;
01854 IR_COL_NUM(trip_idx) = LA_CH_COLUMN;
01855
01856 NEXT_LA_CH;
01857
01858 IR_OPR(trip_idx) = Triplet_Opr;
01859 IR_FLD_L(trip_idx) = IL_Tbl_Idx;
01860 IR_LIST_CNT_L(trip_idx) = 3;
01861 NTR_IR_LIST_TBL(list2_idx);
01862 IR_IDX_L(trip_idx) = list2_idx;
01863 IL_OPND(list2_idx) = IL_OPND(list_idx);
01864 IL_FLD(list_idx) = IR_Tbl_Idx;
01865 IL_IDX(list_idx) = trip_idx;
01866 NTR_IR_LIST_TBL(list3_idx);
01867 IL_NEXT_LIST_IDX(list2_idx) = list3_idx;
01868 IL_PREV_LIST_IDX(list3_idx) = list2_idx;
01869
01870 if (LA_CH_VALUE != COLON &&
01871 LA_CH_VALUE != COMMA &&
01872 LA_CH_VALUE != RBRKT) {
01873 parsed_ok = parse_expr(&opnd) && parsed_ok;
01874 COPY_OPND(IL_OPND(list3_idx), opnd);
01875 }
01876
01877 NTR_IR_LIST_TBL(list2_idx);
01878 IL_NEXT_LIST_IDX(list3_idx) = list2_idx;
01879 IL_PREV_LIST_IDX(list2_idx) = list3_idx;
01880
01881 if (LA_CH_VALUE == COLON) {
01882 NEXT_LA_CH;
01883 parsed_ok = parse_expr(&opnd) && parsed_ok;
01884 COPY_OPND(IL_OPND(list2_idx), opnd);
01885 }
01886 }
01887 (IR_LIST_CNT_R(subs_idx))++;
01888 }
01889 while (LA_CH_VALUE == COMMA);
01890
01891 if (LA_CH_VALUE != RBRKT) {
01892 parse_err_flush(Find_EOS, "]");
01893 parsed_ok = FALSE;
01894 goto EXIT;
01895 }
01896 else {
01897
01898 NEXT_LA_CH;
01899 }
01900 }
01901 # endif
01902
01903 if (LA_CH_VALUE == PERCENT) {
01904
01905
01906
01907 if (TYP_TYPE(ATD_TYPE_IDX(amb_attr_idx)) != Structure) {
01908
01909 if (SCP_IMPL_NONE(curr_scp_idx) && !AT_TYPED(amb_attr_idx) &&
01910 !AT_DCL_ERR(amb_attr_idx)) {
01911 AT_DCL_ERR(amb_attr_idx) = TRUE;
01912 PRINTMSG(TOKEN_LINE(attr_name), 113, Error,
01913 TOKEN_COLUMN(attr_name),
01914 TOKEN_STR(attr_name));
01915 }
01916 else {
01917 PRINTMSG(TOKEN_LINE(attr_name), 212, Error,
01918 TOKEN_COLUMN(attr_name),
01919 TOKEN_STR(attr_name),
01920 get_basic_type_str(ATD_TYPE_IDX(amb_attr_idx)));
01921 }
01922
01923 parse_err_flush(Find_Ref_End, NULL);
01924 parsed_ok = FALSE;
01925 goto EXIT;
01926 }
01927 line = LA_CH_LINE;
01928 col = LA_CH_COLUMN;
01929 NEXT_LA_CH;
01930
01931 if (MATCHED_TOKEN_CLASS(Tok_Class_Id)) {
01932 NTR_IR_TBL(ir_idx);
01933 IR_OPR(ir_idx) = Struct_Opr;
01934 IR_LINE_NUM(ir_idx) = line;
01935 IR_COL_NUM(ir_idx) = col;
01936
01937 if (subs_idx) {
01938 IR_FLD_L(ir_idx) = IR_Tbl_Idx;
01939 IR_IDX_L(ir_idx) = subs_idx;
01940 }
01941 else {
01942 IR_FLD_L(ir_idx) = AT_Tbl_Idx;
01943 IR_IDX_L(ir_idx) = attr_idx;
01944
01945 IR_LINE_NUM_L(ir_idx) = TOKEN_LINE(attr_name);
01946 IR_COL_NUM_L(ir_idx) = TOKEN_COLUMN(attr_name);
01947 }
01948
01949 OPND_FLD((*result_opnd)) = IR_Tbl_Idx;
01950 OPND_IDX((*result_opnd)) = ir_idx;
01951
01952 parsed_ok = parse_deref(result_opnd,
01953 TYP_IDX(ATD_TYPE_IDX(amb_attr_idx)));
01954
01955 }
01956 else {
01957
01958 parse_err_flush(Find_Ref_End, "IDENTIFIER");
01959 parsed_ok = FALSE;
01960 }
01961 }
01962
01963 EXIT:
01964
01965 if (parsed_ok) {
01966
01967 if (ATD_CLASS(amb_attr_idx) == Function_Result) {
01968 AT_DEFINED(ATD_FUNC_IDX(amb_attr_idx)) = TRUE;
01969 }
01970 else if (ATD_CLASS(amb_attr_idx) == Atd_Unknown) {
01971 ATD_CLASS(amb_attr_idx) = Variable;
01972 }
01973
01974 AT_DEFINED(attr_idx) = TRUE;
01975 }
01976
01977 TRACE (Func_Exit, "parse_lhs", NULL);
01978
01979 return(parsed_ok);
01980
01981 }