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
00038
00039
00040
00041
00042
00043
00044
00045 static char USMID[] = "\n@(#)5.0_pl/sources/lex.c 5.8 08/23/99 17:26:51\n";
00046
00047 # include "defines.h"
00048
00049 # include "host.m"
00050 # include "host.h"
00051 # include "target.m"
00052 # include "target.h"
00053
00054 # include "globals.m"
00055 # include "tokens.m"
00056 # include "sytb.m"
00057 # include "lex.m"
00058 # include "debug.m"
00059
00060 # ifdef _ARITH_H
00061 # include "arith.h"
00062 # endif
00063
00064 # include "globals.h"
00065 # include "tokens.h"
00066 # include "sytb.h"
00067 # include "p_globals.h"
00068 # include "lex.h"
00069 # include <errno.h>
00070
00071
00072
00073
00074
00075 static boolean convert_const(void);
00076 static boolean fixed_get_keyword (void);
00077 static boolean free_get_keyword (void);
00078 static boolean get_directive (void);
00079 static boolean get_format_str (void);
00080 static boolean get_label (void);
00081 static boolean get_micro_directive (void);
00082 static boolean get_open_mp_directive (void);
00083 static boolean get_sgi_directive (void);
00084 static boolean get_operand_digit (void);
00085 static boolean get_operand_dot (void);
00086 static boolean get_operand_letter (void);
00087 static boolean get_operand_quote (void);
00088 static boolean get_operator (void);
00089 static boolean get_operator_dot (void);
00090 static boolean get_program_str (void);
00091 static boolean get_punctuator (void);
00092 static void convert_octal_literal (boolean);
00093 static void convert_hex_literal(boolean);
00094 static void convert_binary_literal(boolean);
00095 static void set_up_letter_idx_table(int *,kwd_type *, int);
00096
00097 # ifdef _DEBUG
00098 static boolean get_debug_directive (void);
00099 # endif
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 void init_lex (void)
00120
00121 {
00122 int word;
00123
00124
00125 TRACE (Func_Entry, "init_lex", NULL);
00126
00127
00128
00129 if (source_form == Fixed_Form) {
00130 get_char = fixed_get_char;
00131 get_char_literal = fixed_get_char_literal;
00132 }
00133 else {
00134 get_char = free_get_char;
00135 get_char_literal = free_get_char_literal;
00136 }
00137
00138
00139
00140
00141 NEXT_LA_CH;
00142
00143
00144
00145
00146 havent_issued_ndollarpes_ansi = TRUE;
00147
00148
00149
00150
00151 for (word = 0; word < NUM_ID_WDS; word++) {
00152 TOKEN_STR_WD(initial_token, word) = 0;
00153 }
00154
00155 TOKEN_LEN(initial_token) = 0;
00156 TOKEN_VALUE(initial_token) = Tok_Unknown;
00157 TOKEN_ERR(initial_token) = FALSE;
00158 TOKEN_KIND_STR(initial_token)[0] = EOS;
00159 TOKEN_KIND_LEN(initial_token) = 0;
00160 TOKEN_COLUMN(initial_token) = 0;
00161 TOKEN_LINE(initial_token) = 0;
00162 TOKEN_BUF_IDX(initial_token) = 0;
00163 TOKEN_STMT_NUM(initial_token) = 0;
00164
00165 TRACE (Func_Exit, "init_lex", NULL);
00166
00167 return;
00168
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 void flush_LA_to_EOS (void)
00189
00190 {
00191 TRACE (Func_Entry, "flush_LA_to_EOS", NULL);
00192
00193 la_ch = stmt_EOS_la_ch;
00194
00195 TRACE (Func_Exit, "flush_LA_to_EOS", NULL);
00196
00197 return;
00198
00199 }
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 void flush_LA_to_symbol (void)
00221
00222 {
00223
00224 TRACE (Func_Entry, "flush_LA_to_symbol", NULL);
00225
00226 do {
00227
00228 if (LA_CH_CLASS == Ch_Class_Letter) {
00229 NEXT_LA_CH;
00230 while (VALID_LA_CH) {
00231 NEXT_LA_CH;
00232 }
00233 }
00234 else if (LA_CH_CLASS == Ch_Class_Digit || LA_CH_VALUE == DBL_QUOTE ||
00235 LA_CH_VALUE == QUOTE) {
00236
00237
00238
00239 get_token(Tok_Class_Opnd);
00240 }
00241 else {
00242 NEXT_LA_CH;
00243 }
00244 }
00245 while (LA_CH_CLASS != Ch_Class_EOS && LA_CH_CLASS != Ch_Class_Symbol);
00246
00247 TRACE (Func_Exit, "flush_LA_to_symbol", NULL);
00248
00249 return;
00250
00251 }
00252 #ifdef KEY
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 static int id_too_long(int *tok_len)
00274 {
00275 if (*tok_len > ANSI90_ID_LEN) {
00276 if (*tok_len > MAX_ID_LEN) {
00277
00278 PRINTMSG (TOKEN_LINE(token), 67, Warning, TOKEN_COLUMN(token));
00279 *tok_len = MAX_ID_LEN;
00280 return 1;
00281 }
00282
00283
00284 PRINTMSG (TOKEN_LINE(token), 1671, Ansi, TOKEN_COLUMN(token));
00285 }
00286 return 0;
00287 }
00288
00289
00290
00291
00292
00293
00294
00295 static int kind_too_long(int *tok_len) {
00296 if (*tok_len > ANSI90_ID_LEN) {
00297 if (*tok_len > MAX_ID_LEN) {
00298
00299 *tok_len = MAX_ID_LEN;
00300 PRINTMSG(LA_CH_LINE, 67, Warning, LA_CH_COLUMN);
00301 return 1;
00302 }
00303
00304
00305 PRINTMSG(LA_CH_LINE, 101, Ansi, LA_CH_COLUMN);
00306 }
00307 return 0;
00308 }
00309
00310
00311
00312
00313
00314
00315
00316 static int defined_op_too_long(int *tok_len) {
00317 if (*tok_len > ANSI90_ID_LEN) {
00318 if (*tok_len > MAX_ID_LEN) {
00319
00320 *tok_len = MAX_ID_LEN;
00321 PRINTMSG(LA_CH_LINE, 67, Warning, LA_CH_COLUMN);
00322 return 1;
00323 }
00324
00325
00326 PRINTMSG(LA_CH_LINE, 65, Ansi, LA_CH_COLUMN);
00327 }
00328 return 0;
00329 }
00330 #endif
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 boolean get_token (token_class_type class)
00355
00356 {
00357 boolean result = FALSE;
00358 int tok_len = 0;
00359
00360
00361 TRACE (Func_Entry, "get_token", NULL);
00362
00363 comp_phase = Lex_Parsing;
00364
00365 switch (class) {
00366 case Tok_Class_Id :
00367
00368 if (LA_CH_CLASS == Ch_Class_Letter ||
00369 (on_off_flags.allow_leading_uscore &&
00370 LA_CH_VALUE == USCORE)) {
00371
00372 sig_blank = FALSE;
00373 result = TRUE;
00374 token = initial_token;
00375 TOKEN_LINE(token) = LA_CH_LINE;
00376 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00377 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00378 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00379 TOKEN_VALUE(token) = Tok_Id;
00380
00381 while (VALID_LA_CH) {
00382 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
00383 NEXT_LA_CH;
00384 }
00385 TOKEN_LEN(token) = tok_len;
00386
00387 #ifdef KEY
00388 if (id_too_long(&tok_len)) {
00389 TOKEN_LEN(token) = MAX_ID_LEN;
00390 }
00391 #else
00392 if (tok_len > MAX_ID_LEN) {
00393 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
00394 TOKEN_LEN(token) = MAX_ID_LEN;
00395 }
00396 #endif
00397 else if (tok_len == 5 &&
00398 strcmp(TOKEN_STR(token), "N$PES") == 0 &&
00399 havent_issued_ndollarpes_ansi) {
00400 PRINTMSG (TOKEN_LINE(token), 1414, Ansi, TOKEN_COLUMN(token));
00401 havent_issued_ndollarpes_ansi = FALSE;
00402 }
00403 }
00404 break;
00405
00406 case Tok_Class_Keyword :
00407
00408 if (LA_CH_CLASS == Ch_Class_Letter) {
00409 sig_blank = FALSE;
00410 token = initial_token;
00411 TOKEN_LINE(token) = LA_CH_LINE;
00412 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00413 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00414 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00415 result = (source_form == Fixed_Form) ?
00416 fixed_get_keyword () : free_get_keyword ();
00417 }
00418 else if (LA_CH_CLASS == Ch_Class_Dir1) {
00419
00420
00421
00422
00423 sig_blank = FALSE;
00424 token = initial_token;
00425 TOKEN_LINE(token) = LA_CH_LINE;
00426 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00427 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00428 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00429 TOKEN_VALUE(token) = Tok_Kwd_Dir;
00430 TOKEN_LEN(token) = 1;
00431
00432 for (tok_len = 0; tok_len < TOKEN_LEN(token); tok_len++) {
00433 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
00434 NEXT_LA_CH;
00435 }
00436 result = TRUE;
00437 }
00438 else if (LA_CH_CLASS == Ch_Class_Dir2) {
00439
00440
00441
00442
00443
00444 sig_blank = FALSE;
00445 token = initial_token;
00446 TOKEN_LINE(token) = LA_CH_LINE;
00447 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00448 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00449 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00450 TOKEN_VALUE(token) = Tok_Kwd_Dir;
00451 TOKEN_LEN(token) = 2;
00452
00453 for (tok_len = 0; tok_len < TOKEN_LEN(token); tok_len++) {
00454 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
00455 NEXT_LA_CH;
00456 }
00457 result = TRUE;
00458 }
00459 else if (LA_CH_CLASS == Ch_Class_Dir3) {
00460
00461
00462
00463
00464 sig_blank = FALSE;
00465 token = initial_token;
00466 TOKEN_LINE(token) = LA_CH_LINE;
00467 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00468 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00469 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00470 TOKEN_VALUE(token) = Tok_Kwd_Dir;
00471 TOKEN_LEN(token) = 3;
00472
00473 for (tok_len = 0; tok_len < TOKEN_LEN(token); tok_len++) {
00474 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
00475 NEXT_LA_CH;
00476 }
00477 result = TRUE;
00478 }
00479 else if (LA_CH_CLASS == Ch_Class_Dir4) {
00480
00481
00482
00483
00484 sig_blank = FALSE;
00485 token = initial_token;
00486 TOKEN_LINE(token) = LA_CH_LINE;
00487 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00488 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00489 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00490 TOKEN_VALUE(token) = Tok_Kwd_Dir;
00491 TOKEN_LEN(token) = 4;
00492
00493 for (tok_len = 0; tok_len < TOKEN_LEN(token); tok_len++) {
00494 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
00495 NEXT_LA_CH;
00496 }
00497 result = TRUE;
00498 }
00499 else if (LA_CH_VALUE == USCORE &&
00500 on_off_flags.allow_leading_uscore) {
00501
00502 sig_blank = FALSE;
00503 result = TRUE;
00504 token = initial_token;
00505 TOKEN_LINE(token) = LA_CH_LINE;
00506 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00507 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00508 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00509 TOKEN_VALUE(token) = Tok_Id;
00510
00511 while (VALID_LA_CH) {
00512 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
00513 NEXT_LA_CH;
00514 }
00515 TOKEN_LEN(token) = tok_len;
00516
00517 #ifdef KEY
00518 if (id_too_long(&tok_len)) {
00519 TOKEN_LEN(token) = MAX_ID_LEN;
00520 }
00521 #else
00522 if (tok_len > MAX_ID_LEN) {
00523 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
00524 TOKEN_LEN(token) = MAX_ID_LEN;
00525 }
00526 #endif
00527 }
00528
00529 break;
00530
00531 case Tok_Class_Punct :
00532 if (LA_CH_CLASS == Ch_Class_Symbol || LA_CH_CLASS == Ch_Class_EOS) {
00533 sig_blank = FALSE;
00534 token = initial_token;
00535 TOKEN_LINE(token) = LA_CH_LINE;
00536 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00537 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00538 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00539 result = get_punctuator ();
00540 }
00541 break;
00542
00543 case Tok_Class_Op :
00544 if (LA_CH_CLASS == Ch_Class_Symbol) {
00545 sig_blank = FALSE;
00546 token = initial_token;
00547 TOKEN_LINE(token) = LA_CH_LINE;
00548 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00549 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00550 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00551 result = get_operator ();
00552 }
00553 break;
00554
00555 case Tok_Class_Opnd :
00556 switch (LA_CH_CLASS) {
00557 case Ch_Class_Digit:
00558 sig_blank = FALSE;
00559 token = initial_token;
00560 TOKEN_LINE(token) = LA_CH_LINE;
00561 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00562 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00563 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00564 result = get_operand_digit ();
00565 break;
00566
00567 case Ch_Class_Letter:
00568 sig_blank = FALSE;
00569 token = initial_token;
00570 TOKEN_LINE(token) = LA_CH_LINE;
00571 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00572 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00573 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00574 result = get_operand_letter ();
00575
00576 if (TOKEN_LEN(token) == 5 &&
00577 strcmp(TOKEN_STR(token), "N$PES") == 0 &&
00578 havent_issued_ndollarpes_ansi) {
00579 PRINTMSG (TOKEN_LINE(token), 1414, Ansi, TOKEN_COLUMN(token));
00580 havent_issued_ndollarpes_ansi = FALSE;
00581
00582 }
00583
00584 break;
00585
00586 case Ch_Class_EOS:
00587 result = FALSE;
00588 break;
00589
00590 case Ch_Class_Symbol:
00591 if (LA_CH_VALUE == DOT) {
00592 sig_blank = FALSE;
00593 token = initial_token;
00594 TOKEN_LINE(token) = LA_CH_LINE;
00595 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00596 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00597 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00598 result = get_operand_dot ();
00599 }
00600 else if (LA_CH_VALUE == QUOTE || LA_CH_VALUE == DBL_QUOTE) {
00601 sig_blank = FALSE;
00602 token = initial_token;
00603 TOKEN_LINE(token) = LA_CH_LINE;
00604 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00605 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00606 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00607 result = get_operand_quote ();
00608 }
00609 break;
00610 }
00611 break;
00612
00613 case Tok_Class_Int_Spec :
00614 if (LA_CH_CLASS == Ch_Class_Digit) {
00615 sig_blank = FALSE;
00616 result = TRUE;
00617 token = initial_token;
00618 TOKEN_LINE(token) = LA_CH_LINE;
00619 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00620 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00621 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00622 TOKEN_VALUE(token) = Tok_Const_Int;
00623
00624 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
00625 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
00626 NEXT_LA_CH;
00627 }
00628
00629 CHECK_FOR_FREE_BLANK;
00630
00631 const_buf[tok_len] = '\0';
00632
00633 CONVERT_INT_CONST(INTEGER_DEFAULT_TYPE, tok_len, result);
00634 }
00635 break;
00636
00637 case Tok_Class_Label :
00638 if (LA_CH_CLASS == Ch_Class_Digit) {
00639 sig_blank = FALSE;
00640 token = initial_token;
00641 TOKEN_LINE(token) = LA_CH_LINE;
00642 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00643 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00644 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00645 result = get_label ();
00646 }
00647 break;
00648
00649 case Tok_Class_Construct_Def :
00650
00651
00652
00653
00654
00655
00656 if (LA_CH_CLASS == Ch_Class_Letter) {
00657 sig_blank = FALSE;
00658 token = initial_token;
00659 TOKEN_LINE(token) = LA_CH_LINE;
00660 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00661 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00662 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00663
00664 while (VALID_LA_CH) {
00665 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
00666 NEXT_LA_CH;
00667 }
00668
00669
00670
00671 if (LA_CH_VALUE != COLON) {
00672 reset_lex(TOKEN_BUF_IDX(token), TOKEN_STMT_NUM(token));
00673 }
00674 else {
00675 NEXT_LA_CH;
00676
00677 if (LA_CH_VALUE != COLON) {
00678 #ifdef KEY
00679 id_too_long(&tok_len);
00680 #else
00681 if (tok_len > MAX_ID_LEN) {
00682
00683 PRINTMSG (TOKEN_LINE(token), 67, Error,
00684 TOKEN_COLUMN(token));
00685 tok_len = MAX_ID_LEN;
00686 }
00687 #endif
00688 result = TRUE;
00689 TOKEN_LEN(token) = tok_len;
00690 TOKEN_VALUE(token) = Tok_Id;
00691 }
00692 else {
00693 reset_lex(TOKEN_BUF_IDX(token), TOKEN_STMT_NUM(token));
00694 }
00695 }
00696 }
00697 break;
00698
00699 case Tok_Class_DO :
00700 if (LA_CH_CLASS == Ch_Class_Letter) {
00701 sig_blank = FALSE;
00702 token = initial_token;
00703 TOKEN_LINE(token) = LA_CH_LINE;
00704 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00705 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00706 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00707
00708 if (source_form == Fixed_Form) {
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719 TOKEN_VALUE(token) = Tok_Kwd_Do;
00720 result = TRUE;
00721
00722 if (LA_CH_VALUE != 'D') {
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740 PRINTMSG (LA_CH_LINE, 38, Internal, LA_CH_COLUMN);
00741 }
00742 NEXT_LA_CH;
00743
00744 if (LA_CH_VALUE != 'O') {
00745 PRINTMSG (LA_CH_LINE, 38, Internal, LA_CH_COLUMN);
00746 }
00747
00748 TOKEN_STR(token)[0] = 'D';
00749 TOKEN_STR(token)[1] = 'O';
00750 TOKEN_LEN(token) = 2;
00751 NEXT_LA_CH;
00752 }
00753 else {
00754 result = free_get_keyword ();
00755 }
00756
00757 }
00758 break;
00759
00760 case Tok_Class_Dir_Kwd :
00761 if (LA_CH_CLASS == Ch_Class_Letter) {
00762 sig_blank = FALSE;
00763 token = initial_token;
00764 TOKEN_LINE(token) = LA_CH_LINE;
00765 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00766 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00767 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00768 result = get_directive ();
00769 }
00770 break;
00771
00772 case Tok_Class_Mic_Kwd :
00773 if (LA_CH_CLASS == Ch_Class_Letter) {
00774 sig_blank = FALSE;
00775 token = initial_token;
00776 TOKEN_LINE(token) = LA_CH_LINE;
00777 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00778 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00779 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00780 result = get_micro_directive ();
00781 }
00782 break;
00783
00784 case Tok_Class_Open_Mp_Dir_Kwd :
00785 if (LA_CH_CLASS == Ch_Class_Letter) {
00786 sig_blank = FALSE;
00787 token = initial_token;
00788 TOKEN_LINE(token) = LA_CH_LINE;
00789 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00790 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00791 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00792 result = get_open_mp_directive ();
00793 }
00794 break;
00795
00796 case Tok_Class_SGI_Dir_Kwd :
00797 if (LA_CH_CLASS == Ch_Class_Letter) {
00798 sig_blank = FALSE;
00799 token = initial_token;
00800 TOKEN_LINE(token) = LA_CH_LINE;
00801 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00802 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00803 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00804 result = get_sgi_directive ();
00805 }
00806 break;
00807
00808 # ifdef _DEBUG
00809 case Tok_Class_Dbg_Kwd :
00810 if (LA_CH_CLASS == Ch_Class_Letter) {
00811 sig_blank = FALSE;
00812 token = initial_token;
00813 TOKEN_LINE(token) = LA_CH_LINE;
00814 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00815 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00816 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00817 result = get_debug_directive ();
00818 }
00819 break;
00820 # endif
00821
00822 case Tok_Class_Format_Str :
00823 if (LA_CH_VALUE == LPAREN) {
00824 sig_blank = FALSE;
00825 token = initial_token;
00826 TOKEN_LINE(token) = LA_CH_LINE;
00827 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00828 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00829 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00830 result = get_format_str ();
00831 }
00832 break;
00833
00834 case Tok_Class_Program_Str :
00835 if (LA_CH_VALUE == LPAREN) {
00836 sig_blank = FALSE;
00837 token = initial_token;
00838 TOKEN_LINE(token) = LA_CH_LINE;
00839 TOKEN_COLUMN(token) = LA_CH_COLUMN;
00840 TOKEN_BUF_IDX(token) = LA_CH_BUF_IDX;
00841 TOKEN_STMT_NUM(token) = LA_CH_STMT_NUM;
00842 result = get_program_str ();
00843 }
00844 break;
00845 }
00846
00847 comp_phase = Pass1_Parsing;
00848
00849 TRACE (Func_Exit, "get_token", NULL);
00850
00851 return (result);
00852
00853 }
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876 void reset_lex (int buf_idx,
00877 int stmt_num)
00878
00879 {
00880 TRACE (Func_Entry, "reset_lex", NULL);
00881
00882 reset_src_input (--buf_idx, stmt_num);
00883
00884 NEXT_LA_CH;
00885
00886 TRACE (Func_Exit, "reset_lex", NULL);
00887
00888 return;
00889
00890 }
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913 static boolean get_directive (void)
00914
00915 {
00916 int beg_idx;
00917 la_type la_queue[MAX_KWD_LEN + 1];
00918 int letter_idx;
00919 int lim_idx;
00920 int tok_len = 0;
00921
00922
00923 TRACE (Func_Entry, "get_directive", NULL);
00924
00925 # ifdef _DEBUG
00926 if (LA_CH_CLASS != Ch_Class_Letter) {
00927 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
00928 "get_directive", "letter");
00929 }
00930 # endif
00931
00932 TOKEN_VALUE(token) = Tok_Id;
00933
00934
00935
00936 letter_idx = LA_CH_VALUE - 'A';
00937 beg_idx = kwd_dir_idx[letter_idx];
00938 lim_idx = kwd_dir_idx[letter_idx+1];
00939
00940 if (beg_idx != lim_idx) {
00941
00942 #ifdef _DEBUG
00943 if (kwd_dir_len[beg_idx] > MAX_ID_LEN) {
00944 PRINTMSG(TOKEN_LINE(token), 384, Internal, TOKEN_COLUMN(token),
00945 beg_idx, kwd_dir_len[beg_idx]);
00946 }
00947 # endif
00948
00949 while ((LA_CH_CLASS == Ch_Class_Letter || LA_CH_VALUE == USCORE) &&
00950 tok_len < kwd_dir_len[beg_idx]) {
00951
00952
00953
00954
00955 la_queue[tok_len] = la_ch;
00956 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
00957 tok_len++;
00958 NEXT_LA_CH;
00959 }
00960
00961 TOKEN_LEN(token) = tok_len;
00962
00963 if (tok_len >= kwd_dir_len[lim_idx-1]) {
00964
00965
00966
00967 while (beg_idx < lim_idx) {
00968
00969 if (kwd_dir_len[beg_idx] <= tok_len) {
00970
00971 if (strncmp(TOKEN_STR(token),
00972 kwd_dir[beg_idx].name,
00973 kwd_dir_len[beg_idx]) == IDENTICAL) {
00974
00975
00976
00977
00978 if (tok_len == kwd_dir_len[beg_idx] &&
00979 (LA_CH_VALUE == USCORE ||
00980 LA_CH_VALUE == DOLLAR ||
00981 LA_CH_VALUE == AT_SIGN)) {
00982 }
00983 else {
00984 TOKEN_VALUE(token) = kwd_dir[beg_idx].value;
00985
00986
00987
00988 if (tok_len > kwd_dir_len[beg_idx]) {
00989 tok_len = kwd_dir_len[beg_idx];
00990 la_ch = la_queue[tok_len];
00991 TOKEN_LEN(token) = tok_len;
00992 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
00993 }
00994 break;
00995 }
00996 }
00997 }
00998
00999 beg_idx++;
01000
01001 }
01002 }
01003 }
01004
01005 if (TOKEN_VALUE(token) == Tok_Id) {
01006
01007 while (VALID_LA_CH) {
01008 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
01009 NEXT_LA_CH;
01010 }
01011
01012 #ifdef KEY
01013 id_too_long(&tok_len);
01014 #else
01015 if (tok_len > MAX_ID_LEN) {
01016 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
01017 tok_len = MAX_ID_LEN;
01018 }
01019 #endif
01020
01021 TOKEN_LEN(token) = tok_len;
01022 }
01023
01024 TRACE (Func_Exit, "get_directive", NULL);
01025
01026 return (TRUE);
01027
01028 }
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051 static boolean get_format_str (void)
01052
01053 {
01054
01055 TRACE (Func_Entry, "get_format_str", NULL);
01056
01057 # ifdef _DEBUG
01058 if (LA_CH_VALUE != LPAREN) {
01059 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
01060 "get_format_str", "(");
01061 }
01062 # endif
01063
01064 TOKEN_VALUE(token) = Tok_Const_Char;
01065 TOKEN_CONST_TBL_IDX(token) = put_format_in_tbl();
01066
01067 TRACE (Func_Exit, "get_format_str", NULL);
01068
01069 return (TRUE);
01070
01071 }
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096 static boolean fixed_get_keyword (void)
01097
01098 {
01099 int beg_idx;
01100 la_type la_queue[MAX_KWD_LEN + 1];
01101 int letter_idx;
01102 int lim_idx;
01103 int tok_len = 0;
01104
01105
01106 TRACE (Func_Entry, "fixed_get_keyword", NULL);
01107
01108
01109 # ifdef _DEBUG
01110 if (LA_CH_CLASS != Ch_Class_Letter) {
01111 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
01112 "fixed_get_keyword", "letter");
01113 }
01114 # endif
01115
01116 TOKEN_VALUE(token) = Tok_Id;
01117
01118
01119 letter_idx = LA_CH_VALUE - 'A';
01120
01121 beg_idx = kwd_idx[letter_idx];
01122 lim_idx = kwd_idx[letter_idx+1];
01123
01124 if (beg_idx != lim_idx) {
01125
01126 #ifdef _DEBUG
01127 if (kwd_len[beg_idx] > MAX_ID_LEN) {
01128 PRINTMSG(TOKEN_LINE(token), 384, Internal, TOKEN_COLUMN(token),
01129 beg_idx, kwd_len[beg_idx]);
01130 }
01131 # endif
01132
01133 while (LA_CH_CLASS == Ch_Class_Letter && tok_len < kwd_len[beg_idx]) {
01134 la_queue[tok_len] = la_ch;
01135 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
01136 tok_len++;
01137 NEXT_LA_CH;
01138 }
01139
01140 TOKEN_LEN(token) = tok_len;
01141
01142 if (tok_len >= kwd_len[lim_idx-1]) {
01143
01144
01145
01146 while (beg_idx < lim_idx) {
01147 if (tok_len >= kwd_len[beg_idx]) {
01148 if (strncmp(TOKEN_STR(token),
01149 kwd[beg_idx].name,
01150 kwd_len[beg_idx]) == IDENTICAL) {
01151
01152
01153
01154
01155 if (tok_len == kwd_len[beg_idx] &&
01156 ! on_off_flags.allow_leading_uscore &&
01157 (LA_CH_VALUE == USCORE ||
01158 LA_CH_VALUE == DOLLAR ||
01159 LA_CH_VALUE == AT_SIGN)) {
01160 }
01161 else {
01162 TOKEN_VALUE(token) = kwd[beg_idx].value;
01163
01164
01165
01166 if (tok_len > kwd_len[beg_idx]) {
01167 tok_len = kwd_len[beg_idx];
01168 la_ch = la_queue[tok_len];
01169 TOKEN_LEN(token) = tok_len;
01170 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
01171 }
01172 break;
01173 }
01174 }
01175 }
01176
01177 beg_idx++;
01178
01179 }
01180 }
01181 }
01182
01183 if (TOKEN_VALUE(token) == Tok_Id) {
01184
01185 while (VALID_LA_CH) {
01186 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
01187 NEXT_LA_CH;
01188 }
01189
01190 #ifdef KEY
01191 id_too_long(&tok_len);
01192 #else
01193 if (tok_len > MAX_ID_LEN) {
01194 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
01195 tok_len = MAX_ID_LEN;
01196 }
01197 #endif
01198 TOKEN_LEN(token) = tok_len;
01199 }
01200
01201 TRACE (Func_Exit, "fixed_get_keyword", NULL);
01202
01203 return (TRUE);
01204
01205 }
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229 static boolean free_get_keyword (void)
01230
01231 {
01232 boolean all_letters = TRUE;
01233 int beg_idx;
01234 la_type la_queue[MAX_KWD_LEN + 1];
01235 int letter_idx;
01236 int lim_idx;
01237 int tok_len = 0;
01238
01239
01240 TRACE (Func_Entry, "free_get_keyword", NULL);
01241
01242 # ifdef _DEBUG
01243 if (LA_CH_CLASS != Ch_Class_Letter) {
01244 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
01245 "free_get_keyword", "letter");
01246 }
01247 # endif
01248
01249 TOKEN_VALUE(token) = Tok_Id;
01250
01251 while (VALID_LA_CH) {
01252 if (LA_CH_CLASS != Ch_Class_Letter) {
01253 #ifdef KEY
01254
01255 all_letters = all_letters && ('_' == LA_CH_VALUE);
01256 #else
01257 all_letters = FALSE;
01258 #endif
01259 }
01260
01261 if (tok_len < MAX_KWD_LEN) {
01262 la_queue[tok_len] = la_ch;
01263 }
01264 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
01265 NEXT_LA_CH;
01266 }
01267
01268 TOKEN_LEN(token) = tok_len;
01269
01270 if (all_letters && tok_len > 1 && tok_len <= MAX_KWD_LEN) {
01271
01272
01273
01274 letter_idx = TOKEN_STR(token)[0] - 'A';
01275 beg_idx = kwd_idx[letter_idx];
01276 lim_idx = kwd_idx[letter_idx+1];
01277
01278
01279 while (beg_idx < lim_idx) {
01280 if (kwd_len[beg_idx] == tok_len) {
01281 if (EQUAL_STRS(TOKEN_STR(token), kwd[beg_idx].name)) {
01282 TOKEN_VALUE(token) = kwd[beg_idx].value;
01283 break;
01284 }
01285 }
01286 beg_idx++;
01287 }
01288
01289 if (beg_idx == lim_idx) {
01290
01291
01292
01293 beg_idx = alt_kwd_idx[letter_idx];
01294 lim_idx = alt_kwd_idx[letter_idx+1];
01295
01296
01297
01298 while (beg_idx < lim_idx) {
01299 if (alt_kwd[beg_idx].len == tok_len) {
01300 if (EQUAL_STRS(TOKEN_STR(token), alt_kwd[beg_idx].name)) {
01301 TOKEN_VALUE(token) = alt_kwd[beg_idx].value;
01302 tok_len = alt_kwd[beg_idx].val_len;
01303 TOKEN_LEN(token) = tok_len;
01304
01305
01306
01307 la_ch = la_queue[tok_len];
01308
01309
01310
01311 sig_blank = FALSE;
01312
01313
01314
01315 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
01316 break;
01317 }
01318 }
01319
01320 beg_idx++;
01321
01322 }
01323 }
01324 }
01325
01326 if (TOKEN_VALUE(token) == Tok_Id) {
01327
01328 #ifdef KEY
01329 id_too_long(&tok_len);
01330 #else
01331 if (tok_len > MAX_ID_LEN) {
01332 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
01333 tok_len = MAX_ID_LEN;
01334 }
01335 #endif
01336 TOKEN_LEN(token) = tok_len;
01337 }
01338
01339 TRACE (Func_Exit, "free_get_keyword", NULL);
01340
01341 return (TRUE);
01342
01343 }
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360
01361
01362
01363
01364
01365 static boolean get_label (void)
01366
01367 {
01368 int tok_cnt = 0;
01369 int tok_len = 0;
01370
01371
01372 TRACE (Func_Entry, "get_label", NULL);
01373
01374 # ifdef _DEBUG
01375 if (LA_CH_CLASS != Ch_Class_Digit) {
01376 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
01377 "get_label", "digit");
01378 }
01379 # endif
01380
01381 TOKEN_VALUE(token) = Tok_Label;
01382
01383 while (LA_CH_VALUE == ZERO && !sig_blank) {
01384 NEXT_LA_CH;
01385 tok_cnt++;
01386 }
01387
01388 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
01389 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
01390 NEXT_LA_CH;
01391 tok_cnt++;
01392 }
01393
01394 CHECK_FOR_FREE_BLANK;
01395
01396 TOKEN_LEN(token) = tok_len;
01397
01398 if (tok_cnt == 0 || tok_cnt > 5) {
01399
01400 PRINTMSG (TOKEN_LINE(token), 68, Error, TOKEN_COLUMN(token));
01401
01402
01403 TOKEN_STR(token)[5] = '\0';
01404 TOKEN_LEN(token) = 5;
01405 TOKEN_ERR(token) = TRUE;
01406 }
01407 else if (tok_len == 0) {
01408 PRINTMSG (TOKEN_LINE(token), 69, Error, TOKEN_COLUMN(token));
01409 ADD_TO_TOKEN_STR ('0', TOKEN_LEN(token));
01410 TOKEN_ERR(token) = TRUE;
01411 }
01412
01413 TRACE (Func_Exit, "get_label", NULL);
01414
01415 return (TRUE);
01416
01417 }
01418
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440 static boolean get_micro_directive (void)
01441
01442 {
01443 int beg_idx;
01444 la_type la_queue[MAX_KWD_LEN + 1];
01445 int letter_idx;
01446 int lim_idx;
01447 int tok_len = 0;
01448
01449
01450 TRACE (Func_Entry, "get_micro_directive", NULL);
01451
01452 # ifdef _DEBUG
01453 if (LA_CH_CLASS != Ch_Class_Letter) {
01454 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
01455 "get_micro_directive", "letter");
01456 }
01457 # endif
01458
01459 TOKEN_VALUE(token) = Tok_Id;
01460
01461
01462 letter_idx = LA_CH_VALUE - 'A';
01463
01464 beg_idx = kwd_mic_idx[letter_idx];
01465 lim_idx = kwd_mic_idx[letter_idx+1];
01466
01467 if (beg_idx != lim_idx) {
01468
01469 #ifdef _DEBUG
01470 if (kwd_mic_len[beg_idx] > MAX_ID_LEN) {
01471 PRINTMSG(TOKEN_LINE(token), 384, Internal, TOKEN_COLUMN(token),
01472 beg_idx, kwd_mic_len[beg_idx]);
01473 }
01474 # endif
01475
01476 while (LA_CH_CLASS == Ch_Class_Letter && tok_len < kwd_mic_len[beg_idx]) {
01477 la_queue[tok_len] = la_ch;
01478 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
01479 tok_len++;
01480 NEXT_LA_CH;
01481 }
01482
01483 TOKEN_LEN(token) = tok_len;
01484
01485 if (tok_len >= kwd_mic_len[lim_idx-1]) {
01486
01487
01488
01489 while (beg_idx < lim_idx) {
01490
01491 if (kwd_mic_len[beg_idx] <= tok_len) {
01492
01493 if (strncmp(TOKEN_STR(token),
01494 kwd_mic[beg_idx].name,
01495 kwd_mic_len[beg_idx]) == IDENTICAL) {
01496
01497
01498
01499
01500 if (tok_len == kwd_mic_len[beg_idx] &&
01501 (LA_CH_VALUE == USCORE ||
01502 LA_CH_VALUE == DOLLAR ||
01503 LA_CH_VALUE == AT_SIGN)) {
01504 }
01505 else {
01506 TOKEN_VALUE(token) = kwd_mic[beg_idx].value;
01507
01508
01509
01510 if (tok_len > kwd_mic_len[beg_idx]) {
01511 tok_len = kwd_mic_len[beg_idx];
01512 la_ch = la_queue[tok_len];
01513 TOKEN_LEN(token) = tok_len;
01514
01515
01516 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
01517 }
01518 break;
01519 }
01520 }
01521 }
01522
01523 beg_idx++;
01524
01525 }
01526 }
01527 }
01528
01529 if (TOKEN_VALUE(token) == Tok_Id) {
01530
01531 while (VALID_LA_CH) {
01532 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
01533 NEXT_LA_CH;
01534 }
01535
01536 #ifdef KEY
01537 id_too_long(&tok_len);
01538 #else
01539 if (tok_len > MAX_ID_LEN) {
01540 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
01541 tok_len = MAX_ID_LEN;
01542 }
01543 #endif
01544 TOKEN_LEN(token) = tok_len;
01545 }
01546
01547 TRACE (Func_Exit, "get_micro_directive", NULL);
01548
01549 return (TRUE);
01550
01551 }
01552
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570 boolean is_par_directive (int start_idx)
01571
01572 {
01573 int beg_idx;
01574 int blank = ' ';
01575 int idx;
01576 boolean is_directive = FALSE;
01577 int letter_idx;
01578 int lim_idx;
01579 int newline = '\n';
01580 int tab = '\t';
01581 char upper_str[MAX_KWD_LEN + 1];
01582 int str_len = 0;
01583
01584
01585 TRACE (Func_Entry, "is_par_directive", NULL);
01586
01587 idx = start_idx;
01588
01589 while (nxt_line[idx] == blank || nxt_line[idx] == tab) {
01590 idx++;
01591 }
01592
01593 if (ch_class[nxt_line[idx]] != Ch_Class_Letter) {
01594 goto EXIT;
01595 }
01596 else if (islower(nxt_line[idx])) {
01597 upper_str[str_len] = TOUPPER(nxt_line[idx]);
01598 }
01599 else {
01600 upper_str[str_len] = nxt_line[idx];
01601 }
01602 str_len++;
01603 idx++;
01604
01605 letter_idx = upper_str[0] - 'A';
01606
01607 beg_idx = kwd_sgi_dir_idx[letter_idx];
01608 lim_idx = kwd_sgi_dir_idx[letter_idx+1];
01609
01610 if (beg_idx == lim_idx) {
01611 goto EXIT;
01612 }
01613
01614 while (nxt_line[idx] != newline && str_len <= kwd_sgi_dir_len[beg_idx]) {
01615 if (nxt_line[idx] == blank || nxt_line[idx] == tab) {
01616 idx++;
01617 }
01618 else {
01619 if (ch_class[nxt_line[idx]] != Ch_Class_Letter &&
01620 nxt_line[idx] != USCORE) {
01621 break;
01622 }
01623 else if (islower(nxt_line[idx])) {
01624 upper_str[str_len] = TOUPPER(nxt_line[idx]);
01625 }
01626 else {
01627 upper_str[str_len] = nxt_line[idx];
01628 }
01629 str_len++;
01630 idx++;
01631 }
01632 }
01633
01634 upper_str[str_len] = '\0';
01635
01636
01637 if (str_len >= kwd_sgi_dir_len[lim_idx-1]) {
01638
01639 while (beg_idx < lim_idx) {
01640
01641 if (kwd_sgi_dir_len[beg_idx] <= str_len) {
01642
01643 if (strncmp(upper_str,
01644 kwd_sgi_dir[beg_idx].name,
01645 kwd_sgi_dir_len[beg_idx]) == IDENTICAL) {
01646
01647 switch (kwd_sgi_dir[beg_idx].value) {
01648 case Tok_SGI_Dir_Barrier:
01649 case Tok_SGI_Dir_Criticalsection:
01650 case Tok_SGI_Dir_Endcriticalsection:
01651 case Tok_SGI_Dir_Endparallel:
01652 case Tok_SGI_Dir_Endpdo:
01653 case Tok_SGI_Dir_Endpsection:
01654 case Tok_SGI_Dir_Endpsections:
01655 case Tok_SGI_Dir_Endsingleprocess:
01656 case Tok_SGI_Dir_Parallel:
01657 case Tok_SGI_Dir_Paralleldo:
01658 case Tok_SGI_Dir_Pdo:
01659 case Tok_SGI_Dir_Psection:
01660 case Tok_SGI_Dir_Psections:
01661 case Tok_SGI_Dir_Section:
01662 case Tok_SGI_Dir_Singleprocess:
01663
01664 is_directive = TRUE;
01665 break;
01666
01667 default:
01668 break;
01669 }
01670 break;
01671 }
01672 }
01673
01674 beg_idx++;
01675
01676 }
01677 }
01678
01679 EXIT:
01680
01681 TRACE (Func_Exit, "is_par_directive", NULL);
01682
01683 return (is_directive);
01684
01685 }
01686
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702
01703
01704
01705
01706
01707
01708 static boolean get_open_mp_directive (void)
01709
01710 {
01711 int beg_idx;
01712 la_type la_queue[MAX_KWD_LEN + 1];
01713 int letter_idx;
01714 int lim_idx;
01715 int tok_len = 0;
01716
01717
01718 TRACE (Func_Entry, "get_open_mp_directive", NULL);
01719
01720 # ifdef _DEBUG
01721 if (LA_CH_CLASS != Ch_Class_Letter) {
01722 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
01723 "get_open_mp_directive", "letter");
01724 }
01725 # endif
01726
01727 TOKEN_VALUE(token) = Tok_Id;
01728
01729
01730 letter_idx = LA_CH_VALUE - 'A';
01731
01732 beg_idx = kwd_open_mp_dir_idx[letter_idx];
01733 lim_idx = kwd_open_mp_dir_idx[letter_idx+1];
01734
01735 if (beg_idx != lim_idx) {
01736
01737 #ifdef _DEBUG
01738 if (kwd_open_mp_dir_len[beg_idx] > MAX_ID_LEN) {
01739 PRINTMSG(TOKEN_LINE(token), 384, Internal, TOKEN_COLUMN(token),
01740 beg_idx, kwd_open_mp_dir_len[beg_idx]);
01741 }
01742 # endif
01743
01744 while ((LA_CH_CLASS == Ch_Class_Letter ||
01745 LA_CH_CLASS == Ch_Class_Digit ||
01746 LA_CH_VALUE == USCORE) &&
01747 tok_len < kwd_open_mp_dir_len[beg_idx]) {
01748 la_queue[tok_len] = la_ch;
01749 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
01750 tok_len++;
01751 NEXT_LA_CH;
01752 }
01753
01754 TOKEN_LEN(token) = tok_len;
01755
01756 if (tok_len >= kwd_open_mp_dir_len[lim_idx-1]) {
01757
01758
01759
01760 while (beg_idx < lim_idx) {
01761
01762 if (kwd_open_mp_dir_len[beg_idx] <= tok_len) {
01763
01764 if (strncmp(TOKEN_STR(token),
01765 kwd_open_mp_dir[beg_idx].name,
01766 kwd_open_mp_dir_len[beg_idx]) == IDENTICAL) {
01767
01768
01769
01770
01771 if (tok_len == kwd_open_mp_dir_len[beg_idx] &&
01772 (LA_CH_VALUE == USCORE ||
01773 LA_CH_VALUE == DOLLAR ||
01774 LA_CH_VALUE == AT_SIGN)) {
01775 }
01776 else {
01777 TOKEN_VALUE(token) = kwd_open_mp_dir[beg_idx].value;
01778
01779
01780
01781 if (tok_len > kwd_open_mp_dir_len[beg_idx]) {
01782 tok_len = kwd_open_mp_dir_len[beg_idx];
01783 la_ch = la_queue[tok_len];
01784 TOKEN_LEN(token) = tok_len;
01785
01786
01787 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
01788 }
01789 break;
01790 }
01791 }
01792 }
01793
01794 beg_idx++;
01795
01796 }
01797 }
01798 }
01799
01800 if (TOKEN_VALUE(token) == Tok_Id) {
01801
01802 while (VALID_LA_CH) {
01803 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
01804 NEXT_LA_CH;
01805 }
01806
01807 #ifdef KEY
01808 id_too_long(&tok_len);
01809 #else
01810 if (tok_len > MAX_ID_LEN) {
01811 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
01812 tok_len = MAX_ID_LEN;
01813 }
01814 #endif
01815 TOKEN_LEN(token) = tok_len;
01816 }
01817
01818 TRACE (Func_Exit, "get_open_mp_directive", NULL);
01819
01820 return (TRUE);
01821
01822 }
01823
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833
01834
01835
01836
01837
01838
01839
01840
01841
01842
01843
01844
01845 static boolean get_sgi_directive (void)
01846
01847 {
01848 int beg_idx;
01849 la_type la_queue[MAX_KWD_LEN + 1];
01850 int letter_idx;
01851 int lim_idx;
01852 int tok_len = 0;
01853
01854
01855 TRACE (Func_Entry, "get_sgi_directive", NULL);
01856
01857 # ifdef _DEBUG
01858 if (LA_CH_CLASS != Ch_Class_Letter) {
01859 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
01860 "get_sgi_directive", "letter");
01861 }
01862 # endif
01863
01864 TOKEN_VALUE(token) = Tok_Id;
01865
01866
01867 letter_idx = LA_CH_VALUE - 'A';
01868
01869 beg_idx = kwd_sgi_dir_idx[letter_idx];
01870 lim_idx = kwd_sgi_dir_idx[letter_idx+1];
01871
01872 if (beg_idx != lim_idx) {
01873
01874 #ifdef _DEBUG
01875 if (kwd_sgi_dir_len[beg_idx] > MAX_ID_LEN) {
01876 PRINTMSG(TOKEN_LINE(token), 384, Internal, TOKEN_COLUMN(token),
01877 beg_idx, kwd_sgi_dir_len[beg_idx]);
01878 }
01879 # endif
01880
01881 while ((LA_CH_CLASS == Ch_Class_Letter ||
01882 LA_CH_CLASS == Ch_Class_Digit ||
01883 LA_CH_VALUE == USCORE) &&
01884 tok_len < kwd_sgi_dir_len[beg_idx]) {
01885 la_queue[tok_len] = la_ch;
01886 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
01887 tok_len++;
01888 NEXT_LA_CH;
01889 }
01890
01891 TOKEN_LEN(token) = tok_len;
01892
01893 if (tok_len >= kwd_sgi_dir_len[lim_idx-1]) {
01894
01895
01896
01897 while (beg_idx < lim_idx) {
01898
01899 if (kwd_sgi_dir_len[beg_idx] <= tok_len) {
01900
01901 if (strncmp(TOKEN_STR(token),
01902 kwd_sgi_dir[beg_idx].name,
01903 kwd_sgi_dir_len[beg_idx]) == IDENTICAL) {
01904
01905
01906
01907
01908 if (tok_len == kwd_sgi_dir_len[beg_idx] &&
01909 (LA_CH_VALUE == USCORE ||
01910 LA_CH_VALUE == DOLLAR ||
01911 LA_CH_VALUE == AT_SIGN)) {
01912 }
01913 else {
01914 TOKEN_VALUE(token) = kwd_sgi_dir[beg_idx].value;
01915
01916
01917
01918 if (tok_len > kwd_sgi_dir_len[beg_idx]) {
01919 tok_len = kwd_sgi_dir_len[beg_idx];
01920 la_ch = la_queue[tok_len];
01921 TOKEN_LEN(token) = tok_len;
01922
01923
01924 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
01925 }
01926 break;
01927 }
01928 }
01929 }
01930
01931 beg_idx++;
01932
01933 }
01934 }
01935 }
01936
01937 if (TOKEN_VALUE(token) == Tok_Id) {
01938
01939 while (VALID_LA_CH) {
01940 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
01941 NEXT_LA_CH;
01942 }
01943
01944 #ifdef KEY
01945 id_too_long(&tok_len);
01946 #else
01947 if (tok_len > MAX_ID_LEN) {
01948 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
01949 tok_len = MAX_ID_LEN;
01950 }
01951 #endif
01952 TOKEN_LEN(token) = tok_len;
01953 }
01954
01955 TRACE (Func_Exit, "get_sgi_directive", NULL);
01956
01957 return (TRUE);
01958
01959 }
01960
01961
01962
01963
01964
01965
01966
01967
01968
01969
01970
01971
01972
01973
01974
01975
01976
01977
01978 boolean is_dollar_directive (int start_idx)
01979
01980 {
01981 int beg_idx;
01982 int blank = ' ';
01983 int idx;
01984 boolean is_directive = FALSE;
01985 int letter_idx;
01986 int lim_idx;
01987 int newline = '\n';
01988 int tab = '\t';
01989 char upper_str[MAX_KWD_LEN + 1];
01990 int str_len = 0;
01991
01992
01993 TRACE (Func_Entry, "is_dollar_directive", NULL);
01994
01995 idx = start_idx;
01996
01997 while (nxt_line[idx] == blank || nxt_line[idx] == tab) {
01998 idx++;
01999 }
02000
02001 if (ch_class[nxt_line[idx]] != Ch_Class_Letter) {
02002 goto EXIT;
02003 }
02004 else if (islower(nxt_line[idx])) {
02005 upper_str[str_len] = TOUPPER(nxt_line[idx]);
02006 }
02007 else {
02008 upper_str[str_len] = nxt_line[idx];
02009 }
02010 str_len++;
02011 idx++;
02012
02013 letter_idx = upper_str[0] - 'A';
02014
02015 beg_idx = kwd_sgi_dir_idx[letter_idx];
02016 lim_idx = kwd_sgi_dir_idx[letter_idx+1];
02017
02018 if (beg_idx == lim_idx) {
02019 goto EXIT;
02020 }
02021
02022 while (nxt_line[idx] != newline && str_len <= kwd_sgi_dir_len[beg_idx]) {
02023 if (nxt_line[idx] == blank || nxt_line[idx] == tab) {
02024 idx++;
02025 }
02026 else {
02027 if (ch_class[nxt_line[idx]] != Ch_Class_Letter &&
02028 nxt_line[idx] != USCORE) {
02029 break;
02030 }
02031 else if (islower(nxt_line[idx])) {
02032 upper_str[str_len] = TOUPPER(nxt_line[idx]);
02033 }
02034 else {
02035 upper_str[str_len] = nxt_line[idx];
02036 }
02037 str_len++;
02038 idx++;
02039 }
02040 }
02041
02042 upper_str[str_len] = '\0';
02043
02044
02045 if (str_len >= kwd_sgi_dir_len[lim_idx-1]) {
02046
02047 while (beg_idx < lim_idx) {
02048
02049 if (kwd_sgi_dir_len[beg_idx] <= str_len) {
02050
02051 if (strncmp(upper_str,
02052 kwd_sgi_dir[beg_idx].name,
02053 kwd_sgi_dir_len[beg_idx]) == IDENTICAL) {
02054
02055 switch (kwd_sgi_dir[beg_idx].value) {
02056 case Tok_SGI_Dir_Distribute:
02057 case Tok_SGI_Dir_Distribute_Reshape:
02058 case Tok_SGI_Dir_Doacross:
02059 case Tok_SGI_Dir_Dynamic:
02060 case Tok_SGI_Dir_Chunk:
02061 case Tok_SGI_Dir_Mp_Schedtype:
02062 case Tok_SGI_Dir_Page_Place:
02063 case Tok_SGI_Dir_Redistribute:
02064 case Tok_SGI_Dir_Copyin:
02065
02066 is_directive = TRUE;
02067 break;
02068
02069 default:
02070 break;
02071 }
02072 break;
02073 }
02074 }
02075
02076 beg_idx++;
02077
02078 }
02079 }
02080
02081 EXIT:
02082
02083 TRACE (Func_Exit, "is_dollar_directive", NULL);
02084
02085 return (is_directive);
02086
02087 }
02088
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106 boolean is_star_directive (int start_idx)
02107
02108 {
02109 int beg_idx;
02110 int blank = ' ';
02111 int idx;
02112 boolean is_directive = FALSE;
02113 int letter_idx;
02114 int lim_idx;
02115 int newline = '\n';
02116 int tab = '\t';
02117 char upper_str[MAX_KWD_LEN + 1];
02118 int str_len = 0;
02119
02120
02121 TRACE (Func_Entry, "is_star_directive", NULL);
02122
02123 idx = start_idx;
02124
02125 while (nxt_line[idx] == blank || nxt_line[idx] == tab) {
02126 idx++;
02127 }
02128
02129 if (ch_class[nxt_line[idx]] != Ch_Class_Letter) {
02130 goto EXIT;
02131 }
02132 else if (islower(nxt_line[idx])) {
02133 upper_str[str_len] = TOUPPER(nxt_line[idx]);
02134 }
02135 else {
02136 upper_str[str_len] = nxt_line[idx];
02137 }
02138 str_len++;
02139 idx++;
02140
02141 letter_idx = upper_str[0] - 'A';
02142
02143 beg_idx = kwd_sgi_dir_idx[letter_idx];
02144 lim_idx = kwd_sgi_dir_idx[letter_idx+1];
02145
02146 if (beg_idx == lim_idx) {
02147 goto EXIT;
02148 }
02149
02150 while (nxt_line[idx] != newline && str_len <= kwd_sgi_dir_len[beg_idx]) {
02151 if (nxt_line[idx] == blank || nxt_line[idx] == tab) {
02152 idx++;
02153 }
02154 else {
02155 if (ch_class[nxt_line[idx]] != Ch_Class_Letter &&
02156 nxt_line[idx] != USCORE) {
02157 break;
02158 }
02159 else if (islower(nxt_line[idx])) {
02160 upper_str[str_len] = TOUPPER(nxt_line[idx]);
02161 }
02162 else {
02163 upper_str[str_len] = nxt_line[idx];
02164 }
02165 str_len++;
02166 idx++;
02167 }
02168 }
02169
02170 upper_str[str_len] = '\0';
02171
02172
02173 if (str_len >= kwd_sgi_dir_len[lim_idx-1]) {
02174
02175 while (beg_idx < lim_idx) {
02176
02177 if (kwd_sgi_dir_len[beg_idx] <= str_len) {
02178
02179 if (strncmp(upper_str,
02180 kwd_sgi_dir[beg_idx].name,
02181 kwd_sgi_dir_len[beg_idx]) == IDENTICAL) {
02182
02183 switch (kwd_sgi_dir[beg_idx].value) {
02184 case Tok_SGI_Dir_Align_Symbol:
02185 case Tok_SGI_Dir_Aggressiveinner:
02186 case Tok_SGI_Dir_Assert:
02187 case Tok_SGI_Dir_Blockable:
02188 case Tok_SGI_Dir_Blockingsize:
02189 case Tok_SGI_Dir_Concurrentize:
02190 case Tok_SGI_Dir_Fill_Symbol:
02191 case Tok_SGI_Dir_Fission:
02192 case Tok_SGI_Dir_Fissionable:
02193 case Tok_SGI_Dir_Fusable:
02194 case Tok_SGI_Dir_Flush:
02195 case Tok_SGI_Dir_Fuse:
02196 case Tok_SGI_Dir_Inline:
02197 case Tok_SGI_Dir_Interchange:
02198 case Tok_SGI_Dir_Ipa:
02199 case Tok_SGI_Dir_Limit:
02200 case Tok_SGI_Dir_Minconcurrent:
02201 case Tok_SGI_Dir_Noblocking:
02202 case Tok_SGI_Dir_Noconcurrentize:
02203 case Tok_SGI_Dir_Nofission:
02204 case Tok_SGI_Dir_Nofusion:
02205 case Tok_SGI_Dir_Noinline:
02206 case Tok_SGI_Dir_Nointerchange:
02207 case Tok_SGI_Dir_Noipa:
02208 case Tok_SGI_Dir_Opaque:
02209 case Tok_SGI_Dir_Optional:
02210 #ifdef KEY
02211 case Tok_SGI_Dir_Options:
02212 #endif
02213 case Tok_SGI_Dir_Prefetch:
02214 case Tok_SGI_Dir_Prefetch_Manual:
02215 case Tok_SGI_Dir_Prefetch_Ref:
02216 case Tok_SGI_Dir_Prefetch_Ref_Disable:
02217 case Tok_SGI_Dir_Purpleconditional:
02218 case Tok_SGI_Dir_Purpleunconditional:
02219 case Tok_SGI_Dir_Regionbegin:
02220 case Tok_SGI_Dir_Regionend:
02221 case Tok_SGI_Dir_Section_Gp:
02222 case Tok_SGI_Dir_Section_Non_Gp:
02223 case Tok_SGI_Dir_Unroll:
02224
02225 is_directive = TRUE;
02226 break;
02227
02228 default:
02229 break;
02230 }
02231 break;
02232 }
02233 }
02234
02235 beg_idx++;
02236
02237 }
02238 }
02239
02240 EXIT:
02241
02242 TRACE (Func_Exit, "is_star_directive", NULL);
02243
02244 return (is_directive);
02245
02246 }
02247
02248
02249
02250
02251
02252
02253
02254
02255
02256
02257
02258
02259
02260
02261
02262
02263
02264
02265
02266
02267
02268
02269
02270
02271 static boolean get_operand_digit (void)
02272
02273 {
02274 char delim;
02275 char exponent = BLANK;
02276 boolean had_letter = FALSE;
02277 boolean had_zero = FALSE;
02278 int hollerith_len = 0;
02279 int i;
02280 boolean result = TRUE;
02281 la_type save_ch;
02282 int tok_len = 0;
02283
02284 TRACE (Func_Entry, "get_operand_digit", NULL);
02285
02286 # ifdef _DEBUG
02287 if (LA_CH_CLASS != Ch_Class_Digit) {
02288 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
02289 "get_operand_digit", "digit");
02290 }
02291 # endif
02292
02293 TOKEN_VALUE(token) = Tok_Const_Int;
02294
02295
02296 while (LA_CH_CLASS == Ch_Class_Digit &&
02297 !sig_blank &&
02298 LA_CH_VALUE == ZERO) {
02299
02300 had_zero = TRUE;
02301 NEXT_LA_CH;
02302 }
02303
02304 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
02305 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02306 NEXT_LA_CH;
02307 }
02308
02309 if (tok_len == 0 && had_zero) {
02310 ADD_TO_CONST_BUF (ZERO, tok_len);
02311 }
02312
02313
02314
02315 if (LA_CH_VALUE == DOT && !sig_blank) {
02316
02317
02318 save_ch = la_ch;
02319
02320 NEXT_LA_CH;
02321
02322 while (LA_CH_CLASS == Ch_Class_Letter) {
02323 had_letter = TRUE;
02324 NEXT_LA_CH;
02325 }
02326
02327 if (LA_CH_VALUE == DOT && had_letter) {
02328
02329
02330
02331
02332 la_ch = save_ch;
02333 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
02334 }
02335 else {
02336 TOKEN_VALUE(token) = Tok_Const_Real;
02337
02338
02339 la_ch = save_ch;
02340 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
02341 sig_blank = FALSE;
02342
02343
02344 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02345 NEXT_LA_CH;
02346
02347
02348 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
02349 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02350 NEXT_LA_CH;
02351 }
02352 }
02353 }
02354
02355
02356
02357 if ((LA_CH_VALUE == 'D' || LA_CH_VALUE == 'E' || LA_CH_VALUE == 'Q') &&
02358 !sig_blank) {
02359
02360 switch (LA_CH_VALUE) {
02361 case 'D':
02362 TOKEN_VALUE(token) = Tok_Const_Dbl;
02363 break;
02364
02365 case 'E':
02366 TOKEN_VALUE(token) = Tok_Const_Real;
02367 break;
02368
02369 case 'Q':
02370
02371 # if defined(_QUAD_PRECISION)
02372 TOKEN_VALUE(token) = Tok_Const_Quad;
02373 # else
02374 TOKEN_VALUE(token) = Tok_Const_Dbl;
02375 PRINTMSG(TOKEN_LINE(token), 1348, Caution,
02376 TOKEN_COLUMN(token));
02377 # endif
02378 break;
02379
02380 }
02381
02382 exponent = LA_CH_VALUE;
02383
02384 ADD_TO_CONST_BUF ('E', tok_len);
02385
02386 NEXT_LA_CH;
02387
02388
02389 if ((LA_CH_VALUE == PLUS || LA_CH_VALUE == MINUS) && !sig_blank) {
02390 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02391 NEXT_LA_CH;
02392 }
02393
02394
02395
02396 if (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
02397 do {
02398 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02399 NEXT_LA_CH;
02400 }
02401 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank);
02402 }
02403 else {
02404 PRINTMSG (LA_CH_LINE, 1308, Error, LA_CH_COLUMN);
02405 result = FALSE;
02406 }
02407
02408
02409
02410 if (LA_CH_VALUE == USCORE &&
02411 (exponent == 'D' ||
02412 exponent == 'Q') &&
02413 !sig_blank) {
02414
02415
02416
02417 PRINTMSG (TOKEN_LINE(token), 1309, Error, TOKEN_COLUMN(token));
02418 result = FALSE;
02419 }
02420 }
02421
02422 TOKEN_LEN(token) = tok_len;
02423 const_buf[tok_len] = '\0';
02424
02425
02426
02427
02428 if (LA_CH_VALUE == USCORE && !sig_blank) {
02429 NEXT_LA_CH;
02430
02431 tok_len = 0;
02432
02433 if (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
02434 do {
02435 ADD_TO_TOKEN_KIND_STR (LA_CH_VALUE, tok_len);
02436 NEXT_LA_CH;
02437 }
02438 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank);
02439
02440 #ifdef KEY
02441 if (kind_too_long(&tok_len)) {
02442 result = FALSE;
02443 }
02444 #else
02445 if (tok_len > MAX_ID_LEN) {
02446 tok_len = MAX_ID_LEN;
02447 PRINTMSG(LA_CH_LINE, 101, Error, LA_CH_COLUMN);
02448 result = FALSE;
02449 }
02450 #endif
02451 TOKEN_KIND_LEN(token) = tok_len;
02452 TOKEN_KIND_STR(token)[tok_len] = EOS;
02453 }
02454 else if (LA_CH_CLASS == Ch_Class_Letter && !sig_blank) {
02455 do {
02456 ADD_TO_TOKEN_KIND_STR (LA_CH_VALUE, tok_len);
02457 NEXT_LA_CH;
02458 }
02459 while (VALID_LA_CH);
02460
02461 #ifdef KEY
02462 if (kind_too_long(&tok_len)) {
02463 result = FALSE;
02464 }
02465 #else
02466 if (tok_len > MAX_ID_LEN) {
02467 tok_len = MAX_ID_LEN;
02468 PRINTMSG(LA_CH_LINE, 101, Error, LA_CH_COLUMN);
02469 result = FALSE;
02470 }
02471 #endif
02472 TOKEN_KIND_LEN(token) = tok_len;
02473 TOKEN_KIND_STR(token)[tok_len] = EOS;
02474 }
02475 else if ((LA_CH_VALUE == QUOTE || LA_CH_VALUE == DBL_QUOTE) &&
02476 !sig_blank) {
02477
02478
02479
02480 if (TOKEN_VALUE(token) == Tok_Const_Real) {
02481
02482
02483
02484 PRINTMSG (TOKEN_LINE(token), 89, Error, TOKEN_COLUMN(token));
02485 result = FALSE;
02486 }
02487 else {
02488 for (i = 0; i <= TOKEN_LEN(token); i++) {
02489 TOKEN_KIND_STR(token)[i] = const_buf[i];
02490 }
02491 TOKEN_KIND_LEN(token) = TOKEN_LEN(token);
02492 }
02493
02494 TOKEN_VALUE(token) = Tok_Const_Char;
02495
02496 delim = LA_CH_VALUE;
02497 NEXT_LA_CH;
02498
02499 result = convert_const() && result;
02500
02501 TOKEN_CONST_TBL_IDX(token) = put_char_const_in_tbl ('\0', &tok_len);
02502
02503 if (LA_CH_VALUE != delim){
02504 PRINTMSG (TOKEN_LINE(token), 83, Error, TOKEN_COLUMN(token), delim);
02505 result = FALSE;
02506 }
02507 else {
02508 NEXT_LA_CH;
02509 }
02510
02511 TOKEN_LEN(token) = tok_len;
02512
02513 goto EXIT;
02514 }
02515 else {
02516 PRINTMSG (LA_CH_LINE, 89, Error, LA_CH_COLUMN);
02517 result = FALSE;
02518 }
02519 }
02520
02521
02522 else if (LA_CH_VALUE == 'B' && !sig_blank) {
02523 TOKEN_VALUE(token) = Tok_Const_Boolean;
02524 TOKEN_KIND_STR(token)[0] = LA_CH_VALUE;
02525 TOKEN_KIND_STR(token)[1] = EOS;
02526 TOKEN_KIND_LEN(token) = 1;
02527
02528
02529
02530 PRINTMSG (TOKEN_LINE(token), 90, Ansi, TOKEN_COLUMN(token));
02531
02532 if (tok_len > MAX_OCT_CONST_LEN) {
02533 PRINTMSG(TOKEN_LINE(token), 91, Error, TOKEN_COLUMN(token),
02534 tok_len, MAX_OCT_CONST_LEN);
02535 }
02536 else if (tok_len == MAX_OCT_CONST_LEN) {
02537
02538 if (const_buf[0] < '0' || const_buf[0] > '1') {
02539
02540
02541 PRINTMSG (TOKEN_LINE(token), 92, Error, TOKEN_COLUMN(token));
02542 result = FALSE;
02543 }
02544 }
02545
02546
02547
02548 tok_len = 0;
02549
02550 while (IS_OCT_DIGIT(const_buf[tok_len])) {
02551 tok_len++;
02552 }
02553
02554 if (const_buf[tok_len] != EOS) {
02555 PRINTMSG(TOKEN_LINE(token), 93, Error, TOKEN_COLUMN(token),
02556 const_buf[tok_len]);
02557 result = FALSE;
02558 }
02559 NEXT_LA_CH;
02560
02561 if (result) {
02562 convert_octal_literal(FALSE);
02563 }
02564 else {
02565 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
02566 }
02567 }
02568
02569
02570
02571 else if ((LA_CH_VALUE == 'H' ||
02572 LA_CH_VALUE == 'L' ||
02573 LA_CH_VALUE == 'R') && !sig_blank) {
02574
02575
02576
02577 for (i = 0; i <= TOKEN_LEN(token); i++) {
02578 TOKEN_STR(token)[i] = const_buf[i];
02579 }
02580
02581 hollerith_len = atoi (TOKEN_STR(token));
02582 TOKEN_VALUE(token)= Tok_Const_Hollerith;
02583
02584
02585
02586 PRINTMSG (TOKEN_LINE(token), 96, Ansi, TOKEN_COLUMN(token));
02587
02588 if (hollerith_len > TARGET_CHARS_PER_WORD && LA_CH_VALUE == 'R') {
02589
02590
02591
02592
02593 PRINTMSG (TOKEN_LINE(token), 94, Error, TOKEN_COLUMN(token),
02594 TARGET_CHARS_PER_WORD);
02595 result = FALSE;
02596 }
02597
02598 TOKEN_KIND_STR(token)[0] = LA_CH_VALUE;
02599 TOKEN_KIND_STR(token)[1] = EOS;
02600 TOKEN_KIND_LEN(token) = 1;
02601
02602 if (hollerith_len) {
02603 NEXT_LA_CH_LITERAL;
02604
02605 TOKEN_CONST_TBL_IDX(token) =
02606 put_char_const_in_tbl (TOKEN_KIND_STR(token)[0], &tok_len);
02607
02608 TOKEN_LEN(token) = tok_len;
02609
02610 if (tok_len < hollerith_len) {
02611
02612
02613
02614 PRINTMSG(TOKEN_LINE(token), 84, Error, TOKEN_COLUMN(token),
02615 hollerith_len, tok_len);
02616 result = FALSE;
02617 }
02618
02619 # ifdef _TARGET_LITTLE_ENDIAN
02620 if (TOKEN_KIND_STR(token)[0] != 'R') {
02621 CN_HOLLERITH_ENDIAN(TOKEN_CONST_TBL_IDX(token)) = TRUE;
02622 }
02623 # endif
02624
02625 switch(TOKEN_KIND_STR(token)[0]) {
02626 case 'H':
02627 CN_HOLLERITH_TYPE(TOKEN_CONST_TBL_IDX(token)) = H_Hollerith;
02628 break;
02629
02630 case 'L':
02631 CN_HOLLERITH_TYPE(TOKEN_CONST_TBL_IDX(token)) = L_Hollerith;
02632 break;
02633
02634 case 'R':
02635 CN_HOLLERITH_TYPE(TOKEN_CONST_TBL_IDX(token)) = R_Hollerith;
02636 break;
02637
02638 }
02639
02640 }
02641 else {
02642 TOKEN_STR(token)[0] = EOS;
02643 TOKEN_LEN(token) = 0;
02644
02645
02646
02647 PRINTMSG (TOKEN_LINE(token), 85, Error, TOKEN_COLUMN(token));
02648 result = FALSE;
02649 }
02650
02651 goto EXIT;
02652 }
02653
02654 CHECK_FOR_FREE_BLANK;
02655
02656 if (result) {
02657 switch (TOKEN_VALUE(token)) {
02658 case Tok_Const_Int :
02659 case Tok_Const_Real :
02660 result = convert_const();
02661 break;
02662 case Tok_Const_Dbl :
02663
02664 # ifdef _TARGET_OS_MAX
02665 if (! cmd_line_flags.s_default32 &&
02666 on_off_flags.enable_double_precision) {
02667 PRINTMSG(TOKEN_LINE(token), 1110, Warning, TOKEN_COLUMN(token));
02668 TOKEN_VALUE(token) = Tok_Const_Real;
02669 result = convert_const();
02670 }
02671 else {
02672 CONVERT_DBL_CONST(DOUBLE_PRECISION_TYPE_IDX,
02673 TOKEN_LEN(token), result);
02674 }
02675 # else
02676 CONVERT_DBL_CONST(DOUBLE_PRECISION_TYPE_IDX,
02677 TOKEN_LEN(token), result);
02678 # endif
02679 break;
02680 case Tok_Const_Quad :
02681 CONVERT_REAL_CONST(Real_16,
02682 TOKEN_LEN(token), result);
02683 break;
02684 }
02685 }
02686 else if (TOKEN_VALUE(token) == Tok_Const_Int ||
02687 TOKEN_VALUE(token) == Tok_Const_Real ||
02688 TOKEN_VALUE(token) == Tok_Const_Quad ||
02689 TOKEN_VALUE(token) == Tok_Const_Dbl) {
02690 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
02691 }
02692
02693 EXIT:
02694
02695 TRACE (Func_Exit, "get_operand_digit", NULL);
02696
02697 return (result);
02698
02699 }
02700
02701
02702
02703
02704
02705
02706
02707
02708
02709
02710
02711
02712
02713
02714
02715
02716
02717
02718
02719
02720
02721
02722 static boolean get_operand_dot (void)
02723
02724 {
02725 int attr_idx;
02726 char exponent = BLANK;
02727 int name_idx;
02728 boolean result = TRUE;
02729 la_type save_ch;
02730 int tok_len = 0;
02731
02732
02733 TRACE (Func_Entry, "get_operand_dot", NULL);
02734
02735 # ifdef _DEBUG
02736 if (LA_CH_VALUE != DOT) {
02737 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
02738 "get_operand_dot", ".");
02739 }
02740 # endif
02741
02742
02743 save_ch = la_ch;
02744
02745 NEXT_LA_CH;
02746
02747 while (LA_CH_CLASS == Ch_Class_Letter && !sig_blank) {
02748 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
02749 NEXT_LA_CH;
02750 }
02751
02752 #ifdef KEY
02753 id_too_long(&tok_len);
02754 #else
02755 if (tok_len > MAX_ID_LEN) {
02756 PRINTMSG(TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
02757 tok_len = MAX_ID_LEN;
02758 }
02759 #endif
02760 TOKEN_LEN(token) = tok_len;
02761
02762 if (LA_CH_VALUE == DOT && !sig_blank) {
02763
02764 if (EQUAL_STRS(TOKEN_STR(token), "TRUE") ||
02765 EQUAL_STRS(TOKEN_STR(token), "FALSE") ||
02766 EQUAL_STRS(TOKEN_STR(token), "T") ||
02767 EQUAL_STRS(TOKEN_STR(token), "F")) {
02768
02769 TOKEN_VALUE(token) = (TOKEN_STR(token)[0] == 'T') ? Tok_Const_True :
02770 Tok_Const_False;
02771 NEXT_LA_CH;
02772
02773 if (tok_len == 1) {
02774 attr_idx = srch_sym_tbl(TOKEN_STR(token),
02775 TOKEN_LEN(token),
02776 &name_idx);
02777
02778 if (attr_idx == NULL_IDX) {
02779 attr_idx = srch_host_sym_tbl(TOKEN_STR(token),
02780 TOKEN_LEN(token),
02781 &name_idx,
02782 TRUE);
02783 }
02784
02785 if (attr_idx != NULL_IDX) {
02786
02787 while (AT_ATTR_LINK(attr_idx) != NULL_IDX) {
02788 attr_idx = AT_ATTR_LINK(attr_idx);
02789 }
02790 }
02791
02792
02793
02794 if (attr_idx != NULL_IDX && AT_OBJ_CLASS(attr_idx) == Interface) {
02795
02796
02797
02798
02799 reset_lex(TOKEN_BUF_IDX(token), TOKEN_STMT_NUM(token));
02800 TOKEN_VALUE(token) = Tok_Unknown;
02801 result = FALSE;
02802 goto EXIT;
02803 }
02804 else {
02805 PRINTMSG(TOKEN_LINE(token), 510, Ansi, TOKEN_COLUMN(token),
02806 TOKEN_STR(token));
02807 }
02808 }
02809
02810
02811 if (LA_CH_VALUE == USCORE) {
02812 NEXT_LA_CH;
02813
02814 tok_len = 0;
02815
02816 if (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
02817 do {
02818 ADD_TO_TOKEN_KIND_STR (LA_CH_VALUE, tok_len);
02819 NEXT_LA_CH;
02820 }
02821 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank);
02822 }
02823 else if (LA_CH_CLASS == Ch_Class_Letter && !sig_blank) {
02824 do {
02825 ADD_TO_TOKEN_KIND_STR (LA_CH_VALUE, tok_len);
02826 NEXT_LA_CH;
02827 }
02828 while (VALID_LA_CH);
02829 }
02830 else {
02831
02832 PRINTMSG (LA_CH_LINE, 89, Error, LA_CH_COLUMN);
02833 result = FALSE;
02834 }
02835 TOKEN_KIND_LEN(token) = tok_len;
02836 }
02837
02838 result = convert_const() && result;
02839
02840 }
02841 else {
02842
02843 la_ch = save_ch;
02844 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
02845 result = FALSE;
02846 sig_blank = FALSE;
02847 TOKEN_VALUE(token) = Tok_Unknown;
02848 }
02849 }
02850 else {
02851
02852 TOKEN_VALUE(token) = Tok_Const_Real;
02853
02854
02855 la_ch = save_ch;
02856 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
02857 sig_blank = FALSE;
02858
02859
02860 tok_len = 0;
02861 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02862 NEXT_LA_CH;
02863
02864
02865 if (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
02866 do {
02867 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02868 NEXT_LA_CH;
02869 }
02870 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank);
02871
02872
02873 if ((LA_CH_VALUE == 'D' ||
02874 LA_CH_VALUE == 'E' ||
02875 LA_CH_VALUE == 'Q') &&
02876 !sig_blank) {
02877
02878 exponent = LA_CH_VALUE;
02879
02880 switch (LA_CH_VALUE) {
02881 case 'D':
02882 TOKEN_VALUE(token) = Tok_Const_Dbl;
02883 break;
02884
02885 case 'E':
02886 TOKEN_VALUE(token) = Tok_Const_Real;
02887 break;
02888
02889 case 'Q':
02890 # if defined(_QUAD_PRECISION)
02891 TOKEN_VALUE(token) = Tok_Const_Quad;
02892 # else
02893 TOKEN_VALUE(token) = Tok_Const_Dbl;
02894 PRINTMSG(TOKEN_LINE(token), 1348, Caution,
02895 TOKEN_COLUMN(token));
02896 # endif
02897 break;
02898 }
02899
02900 ADD_TO_CONST_BUF ('E', tok_len);
02901
02902 NEXT_LA_CH;
02903
02904
02905 if ((LA_CH_VALUE == PLUS || LA_CH_VALUE == MINUS) && !sig_blank) {
02906 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02907 NEXT_LA_CH;
02908 }
02909
02910
02911 if (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
02912 do {
02913 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
02914 NEXT_LA_CH;
02915 }
02916 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank);
02917 }
02918 else {
02919 PRINTMSG (LA_CH_LINE, 1308, Error, LA_CH_COLUMN);
02920 result = FALSE;
02921 }
02922
02923
02924
02925 if (LA_CH_VALUE == USCORE &&
02926 (exponent == 'D' ||
02927 exponent == 'Q') &&
02928 !sig_blank) {
02929
02930
02931 PRINTMSG (TOKEN_LINE(token), 1309, Error, TOKEN_COLUMN(token));
02932 result = FALSE;
02933 }
02934 }
02935
02936 TOKEN_LEN(token) = tok_len;
02937 const_buf[tok_len] = '\0';
02938
02939
02940
02941 if (LA_CH_VALUE == USCORE && !sig_blank) {
02942 NEXT_LA_CH;
02943
02944 tok_len = 0;
02945
02946 if (LA_CH_CLASS == Ch_Class_Digit && !sig_blank) {
02947 do {
02948 ADD_TO_TOKEN_KIND_STR (LA_CH_VALUE, tok_len);
02949 NEXT_LA_CH;
02950 }
02951 while (LA_CH_CLASS == Ch_Class_Digit && !sig_blank);
02952 }
02953 else if (LA_CH_CLASS == Ch_Class_Letter && !sig_blank) {
02954 do {
02955 ADD_TO_TOKEN_KIND_STR (LA_CH_VALUE, tok_len);
02956 NEXT_LA_CH;
02957 }
02958 while (VALID_LA_CH);
02959 }
02960 else {
02961 PRINTMSG (LA_CH_LINE, 89, Error, LA_CH_COLUMN);
02962 result = FALSE;
02963 }
02964
02965 #ifdef KEY
02966 kind_too_long(&tok_len);
02967 #else
02968 if (tok_len > MAX_ID_LEN) {
02969 tok_len = MAX_ID_LEN;
02970 PRINTMSG(LA_CH_LINE, 101, Error, LA_CH_COLUMN);
02971 }
02972 #endif
02973 TOKEN_KIND_LEN(token) = tok_len;
02974 TOKEN_KIND_STR(token)[tok_len] = EOS;
02975 }
02976 }
02977 else {
02978
02979 PRINTMSG (TOKEN_LINE(token), 95, Error, TOKEN_COLUMN(token));
02980 result = FALSE;
02981
02982 #ifdef KEY
02983 id_too_long(&tok_len);
02984 #else
02985 if (tok_len > MAX_ID_LEN) {
02986 PRINTMSG(TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
02987 tok_len = MAX_ID_LEN;
02988 }
02989 #endif
02990 TOKEN_LEN(token) = tok_len;
02991 }
02992 }
02993
02994 if (TOKEN_VALUE(token) == Tok_Const_Real ||
02995 TOKEN_VALUE(token) == Tok_Const_Dbl ||
02996 TOKEN_VALUE(token) == Tok_Const_Quad) {
02997
02998 CHECK_FOR_FREE_BLANK;
02999
03000 if (result) {
03001 switch (TOKEN_VALUE(token)) {
03002 case Tok_Const_Real :
03003 result = convert_const();
03004 break;
03005 case Tok_Const_Dbl :
03006
03007 # ifdef _TARGET_OS_MAX
03008 if (! cmd_line_flags.s_default32 &&
03009 on_off_flags.enable_double_precision) {
03010 PRINTMSG(TOKEN_LINE(token), 1110, Warning,
03011 TOKEN_COLUMN(token));
03012 TOKEN_VALUE(token) = Tok_Const_Real;
03013 result = convert_const();
03014 }
03015 else {
03016 CONVERT_DBL_CONST(DOUBLE_PRECISION_TYPE_IDX,
03017 TOKEN_LEN(token), result);
03018 }
03019 # else
03020 CONVERT_DBL_CONST(DOUBLE_PRECISION_TYPE_IDX,
03021 TOKEN_LEN(token), result);
03022 # endif
03023 break;
03024 case Tok_Const_Quad :
03025 CONVERT_REAL_CONST(Real_16,
03026 TOKEN_LEN(token), result);
03027 break;
03028 }
03029 }
03030 else {
03031 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
03032 }
03033 }
03034
03035 EXIT:
03036
03037 TRACE (Func_Exit, "get_operand_dot", NULL);
03038
03039 return (result);
03040
03041 }
03042
03043
03044
03045
03046
03047
03048
03049
03050
03051
03052
03053
03054
03055
03056
03057
03058
03059
03060
03061
03062
03063
03064
03065 static boolean get_operand_letter (void)
03066
03067 {
03068 char delim;
03069 boolean had_zero = FALSE;
03070 char prefix;
03071 boolean result = TRUE;
03072 int tok_len = 0;
03073
03074
03075 TRACE (Func_Entry, "get_operand_letter", NULL);
03076
03077 # ifdef _DEBUG
03078 if (LA_CH_CLASS != Ch_Class_Letter) {
03079 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
03080 "get_operand_letter", "letter");
03081 }
03082 # endif
03083
03084 prefix = LA_CH_VALUE;
03085
03086 do {
03087 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
03088 NEXT_LA_CH;
03089 }
03090 while (VALID_LA_CH);
03091
03092 #ifdef KEY
03093 id_too_long(&tok_len);
03094 #else
03095 if (tok_len > MAX_ID_LEN) {
03096 PRINTMSG(TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
03097 tok_len = MAX_ID_LEN;
03098 }
03099 #endif
03100 TOKEN_LEN(token) = tok_len;
03101
03102 if ((LA_CH_VALUE == QUOTE || LA_CH_VALUE == DBL_QUOTE) && !sig_blank) {
03103 if (tok_len == 1) {
03104
03105 if (prefix == 'B' || prefix == 'O' || prefix == 'Z' || prefix == 'X') {
03106
03107 if (prefix == 'X') {
03108 PRINTMSG (TOKEN_LINE(token), 90, Ansi, TOKEN_COLUMN(token));
03109 TOKEN_VALUE(token) = Tok_Const_Boolean;
03110 }
03111 else {
03112 TOKEN_VALUE(token) = Tok_Const_Boz;
03113
03114 if (stmt_type != Data_Stmt) {
03115 PRINTMSG (TOKEN_LINE(token), 771, Ansi, TOKEN_COLUMN(token));
03116 }
03117 }
03118
03119 strcpy (TOKEN_KIND_STR(token), TOKEN_STR(token));
03120 TOKEN_KIND_LEN(token) = TOKEN_LEN(token);
03121
03122 delim = LA_CH_VALUE;
03123
03124 NEXT_LA_CH;
03125 tok_len = 0;
03126
03127
03128 while (LA_CH_VALUE != delim &&
03129 LA_CH_VALUE != EOS &&
03130 (LA_CH_VALUE == ZERO ||
03131 LA_CH_VALUE == BLANK ||
03132 LA_CH_VALUE == TAB)) {
03133
03134 if (LA_CH_VALUE == ZERO) {
03135 had_zero = TRUE;
03136 }
03137 NEXT_LA_CH;
03138 }
03139
03140 while (LA_CH_VALUE != delim && LA_CH_VALUE != EOS) {
03141 if (LA_CH_VALUE != BLANK && LA_CH_VALUE != TAB) {
03142 ADD_TO_CONST_BUF (LA_CH_VALUE, tok_len);
03143 }
03144 NEXT_LA_CH;
03145 }
03146
03147 if (tok_len == 0 && had_zero) {
03148 ADD_TO_CONST_BUF (ZERO, tok_len);
03149 }
03150
03151 const_buf[tok_len] = '\0';
03152 TOKEN_LEN(token) = tok_len;
03153
03154 if (LA_CH_VALUE == EOS) {
03155 PRINTMSG(TOKEN_LINE(token), 83, Error,TOKEN_COLUMN(token),delim);
03156 result = FALSE;
03157 }
03158 else {
03159 if (prefix == 'B') {
03160
03161 if (tok_len > MAX_BIN_CONST_LEN || tok_len == 0) {
03162
03163
03164
03165 PRINTMSG(TOKEN_LINE(token), 91, Error,
03166 TOKEN_COLUMN(token), tok_len, MAX_BIN_CONST_LEN);
03167 result = FALSE;
03168 }
03169
03170
03171 tok_len = 0;
03172
03173 while (IS_BIN_DIGIT(const_buf[tok_len])) {
03174 tok_len++;
03175 }
03176
03177 if (const_buf[tok_len] != EOS) {
03178 PRINTMSG (TOKEN_LINE(token), 422, Error,
03179 TOKEN_COLUMN(token), const_buf[tok_len]);
03180 result = FALSE;
03181 }
03182
03183 if (result) {
03184 convert_binary_literal(TRUE);
03185 }
03186 else {
03187 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
03188 }
03189 }
03190 else if (prefix == 'O') {
03191
03192
03193
03194 if (tok_len > MAX_OCT_CONST_LEN || tok_len == 0) {
03195
03196
03197
03198 PRINTMSG(TOKEN_LINE(token), 91, Error,
03199 TOKEN_COLUMN(token), tok_len, MAX_OCT_CONST_LEN);
03200 result = FALSE;
03201 }
03202 else if (tok_len == MAX_OCT_CONST_LEN) {
03203
03204 if (const_buf[0] < '0' || const_buf[0] > '1') {
03205
03206
03207 PRINTMSG(TOKEN_LINE(token), 92, Error,
03208 TOKEN_COLUMN(token));
03209 result = FALSE;
03210 }
03211 }
03212
03213
03214 tok_len = 0;
03215
03216 while (IS_OCT_DIGIT(const_buf[tok_len])) {
03217 tok_len++;
03218 }
03219
03220 if (const_buf[tok_len] != EOS) {
03221 PRINTMSG(TOKEN_LINE(token), 93, Error, TOKEN_COLUMN(token),
03222 const_buf[tok_len]);
03223 result = FALSE;
03224 }
03225
03226 if (result) {
03227 convert_octal_literal(TRUE);
03228 }
03229 else {
03230 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
03231 }
03232 }
03233 else if (prefix == 'Z') {
03234
03235
03236
03237 if (tok_len > MAX_HEX_CONST_LEN || tok_len == 0) {
03238 PRINTMSG(TOKEN_LINE(token), 91, Error,
03239 TOKEN_COLUMN(token), tok_len, MAX_HEX_CONST_LEN);
03240 result = FALSE;
03241 }
03242
03243
03244 tok_len = 0;
03245
03246 while (isxdigit(const_buf[tok_len])) {
03247 tok_len++;
03248 }
03249
03250 if (const_buf[tok_len] != EOS) {
03251 PRINTMSG (TOKEN_LINE(token), 423, Error,
03252 TOKEN_COLUMN(token), const_buf[tok_len]);
03253 result = FALSE;
03254 }
03255
03256 if (result) {
03257 convert_hex_literal(TRUE);
03258 }
03259 else {
03260 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
03261 }
03262 }
03263 else {
03264
03265 if (const_buf[0] == PLUS || const_buf[0] == MINUS) {
03266
03267
03268
03269 if (--tok_len > MAX_HEX_CONST_LEN || tok_len == 0) {
03270
03271 PRINTMSG(TOKEN_LINE(token), 91, Error,
03272 TOKEN_COLUMN(token), tok_len,
03273 MAX_HEX_CONST_LEN);
03274 result = FALSE;
03275 }
03276 tok_len = 1;
03277 }
03278 else {
03279
03280 if (tok_len > MAX_HEX_CONST_LEN || tok_len == 0) {
03281 PRINTMSG(TOKEN_LINE(token), 91, Error,
03282 TOKEN_COLUMN(token), tok_len,
03283 MAX_HEX_CONST_LEN);
03284 result = FALSE;
03285 }
03286 tok_len = 0;
03287 }
03288
03289
03290
03291 while (isxdigit(const_buf[tok_len])) {
03292 tok_len++;
03293 }
03294
03295 if (const_buf[tok_len] != EOS) {
03296 PRINTMSG (TOKEN_LINE(token), 423, Error,
03297 TOKEN_COLUMN(token), const_buf[tok_len]);
03298 result = FALSE;
03299 }
03300
03301 if (result) {
03302 convert_hex_literal(FALSE);
03303 }
03304 else {
03305 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
03306 }
03307 }
03308
03309 NEXT_LA_CH;
03310 }
03311 }
03312 else {
03313 TOKEN_VALUE(token) = Tok_Id;
03314 }
03315 }
03316 else if (TOKEN_STR(token)[tok_len-1] == USCORE) {
03317
03318 TOKEN_VALUE(token) = Tok_Const_Char;
03319
03320 #ifdef KEY
03321 tok_len -= 1;
03322 if (id_too_long(&tok_len)) {
03323 result = FALSE;
03324 }
03325 #else
03326 if (--tok_len > MAX_ID_LEN) {
03327 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
03328 result = FALSE;
03329 tok_len = MAX_ID_LEN;
03330 }
03331 #endif
03332 TOKEN_STR(token)[tok_len] = EOS;
03333
03334 strcpy (TOKEN_KIND_STR(token), TOKEN_STR(token));
03335 TOKEN_KIND_LEN(token) = TOKEN_LEN(token) - 1;
03336
03337 delim = LA_CH_VALUE;
03338 NEXT_LA_CH;
03339
03340 result = convert_const() && result;
03341
03342 TOKEN_CONST_TBL_IDX(token) = put_char_const_in_tbl ('\0', &tok_len);
03343
03344 TOKEN_LEN(token) = tok_len;
03345
03346 if (LA_CH_VALUE != delim) {
03347 PRINTMSG (TOKEN_LINE(token), 83, Error, TOKEN_COLUMN(token), delim);
03348 result = FALSE;
03349 }
03350 else {
03351 NEXT_LA_CH;
03352 }
03353 }
03354 else {
03355 TOKEN_VALUE(token) = Tok_Id;
03356
03357 #ifdef KEY
03358 id_too_long(&tok_len);
03359 #else
03360 if (tok_len > MAX_ID_LEN) {
03361 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
03362 tok_len = MAX_ID_LEN;
03363 }
03364 #endif
03365 }
03366 }
03367 else {
03368 TOKEN_VALUE(token) = Tok_Id;
03369
03370 #ifdef KEY
03371 id_too_long(&tok_len);
03372 #else
03373 if (tok_len > MAX_ID_LEN) {
03374 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
03375 tok_len = MAX_ID_LEN;
03376 }
03377 #endif
03378 }
03379
03380 TRACE (Func_Exit, "get_operand_letter", NULL);
03381
03382 return (result);
03383
03384 }
03385
03386
03387
03388
03389
03390
03391
03392
03393
03394
03395
03396
03397
03398
03399
03400
03401
03402
03403
03404
03405
03406
03407
03408 static boolean get_operand_quote (void)
03409
03410 {
03411 int char_len;
03412 char *chptr;
03413 char delim;
03414 boolean had_zero = FALSE;
03415 int i;
03416 boolean result = TRUE;
03417 int shift;
03418 int tok_len = 0;
03419
03420
03421 TRACE (Func_Entry, "get_operand_quote", NULL);
03422
03423 # ifdef _DEBUG
03424 if (LA_CH_VALUE != QUOTE && LA_CH_VALUE != DBL_QUOTE) {
03425 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
03426 "get_operand_quote", "quote or double quote");
03427 }
03428 # endif
03429
03430 delim = LA_CH_VALUE;
03431 NEXT_LA_CH;
03432 TOKEN_VALUE(token) = Tok_Const_Char;
03433
03434
03435
03436 TOKEN_CONST_TBL_IDX(token) = put_char_const_in_tbl ('H', &tok_len);
03437
03438 if (LA_CH_VALUE != delim) {
03439 PRINTMSG (TOKEN_LINE(token), 83, Error, TOKEN_COLUMN(token), delim);
03440 result = FALSE;
03441 }
03442 else {
03443 NEXT_LA_CH;
03444 }
03445
03446 TOKEN_LEN(token) = tok_len;
03447
03448
03449 if ((LA_CH_VALUE == 'H' || LA_CH_VALUE == 'L' || LA_CH_VALUE == 'R') &&
03450 !sig_blank) {
03451
03452 if (LA_CH_VALUE == 'L') {
03453 chptr = (char *)&CN_CONST(TOKEN_CONST_TBL_IDX(token));
03454
03455 while (tok_len % TARGET_CHARS_PER_WORD != 0) {
03456 chptr[tok_len] = '\0';
03457 tok_len++;
03458 }
03459 }
03460 else if (LA_CH_VALUE == 'R') {
03461 chptr = (char *)&CN_CONST(TOKEN_CONST_TBL_IDX(token));
03462 shift = (TARGET_CHARS_PER_WORD - (tok_len % TARGET_CHARS_PER_WORD)) %
03463 TARGET_CHARS_PER_WORD;
03464
03465 if (shift) {
03466 while (--tok_len >= 0) {
03467 chptr[tok_len + shift] = chptr[tok_len];
03468 }
03469
03470 tok_len = shift;
03471 while (--tok_len >= 0) {
03472 chptr[tok_len] = '\0';
03473 }
03474 }
03475 }
03476
03477 TOKEN_VALUE(token) = Tok_Const_Hollerith;
03478
03479
03480
03481 PRINTMSG(TOKEN_LINE(token), 96, Ansi, TOKEN_COLUMN(token));
03482
03483 if (TOKEN_LEN(token) > TARGET_CHARS_PER_WORD && LA_CH_VALUE == 'R') {
03484
03485
03486
03487
03488 PRINTMSG(TOKEN_LINE(token), 94, Error, TOKEN_COLUMN(token),
03489 TARGET_CHARS_PER_WORD);
03490 result = FALSE;
03491 }
03492
03493 TOKEN_KIND_STR(token)[0] = LA_CH_VALUE;
03494 TOKEN_KIND_STR(token)[1] = EOS;
03495 TOKEN_KIND_LEN(token) = 1;
03496
03497 # ifdef _TARGET_LITTLE_ENDIAN
03498 if (TOKEN_KIND_STR(token)[0] != 'R') {
03499 CN_HOLLERITH_ENDIAN(TOKEN_CONST_TBL_IDX(token)) = TRUE;
03500 }
03501 # endif
03502
03503 switch(TOKEN_KIND_STR(token)[0]) {
03504 case 'H':
03505 CN_HOLLERITH_TYPE(TOKEN_CONST_TBL_IDX(token)) = H_Hollerith;
03506 break;
03507
03508 case 'L':
03509 CN_HOLLERITH_TYPE(TOKEN_CONST_TBL_IDX(token)) = L_Hollerith;
03510 break;
03511
03512 case 'R':
03513 CN_HOLLERITH_TYPE(TOKEN_CONST_TBL_IDX(token)) = R_Hollerith;
03514 break;
03515
03516 }
03517
03518 NEXT_LA_CH;
03519 }
03520 else if (LA_CH_VALUE == 'X' && ! sig_blank) {
03521
03522 NEXT_LA_CH;
03523
03524
03525
03526 PRINTMSG (TOKEN_LINE(token), 90, Ansi, TOKEN_COLUMN(token));
03527 TOKEN_VALUE(token) = Tok_Const_Boolean;
03528
03529
03530
03531 chptr = (char *)&CN_CONST(TOKEN_CONST_TBL_IDX(token));
03532
03533 char_len = tok_len;
03534
03535 i = 0;
03536 while (i < char_len &&
03537 (chptr[i] == ZERO ||
03538 chptr[i] == BLANK ||
03539 chptr[i] == TAB)) {
03540
03541 if (chptr[i] == ZERO) {
03542 had_zero = TRUE;
03543 }
03544
03545 i++;
03546 }
03547
03548 tok_len = 0;
03549
03550 while (i < char_len) {
03551 if (chptr[i] != BLANK &&
03552 chptr[i] != TAB) {
03553 ADD_TO_CONST_BUF (chptr[i], tok_len);
03554 }
03555 i++;
03556 }
03557
03558 if (tok_len == 0 && had_zero) {
03559 ADD_TO_CONST_BUF (ZERO, tok_len);
03560 }
03561
03562 const_buf[tok_len] = '\0';
03563 TOKEN_LEN(token) = tok_len;
03564
03565 if (const_buf[0] == PLUS || const_buf[0] == MINUS) {
03566
03567
03568
03569 if (--tok_len > MAX_HEX_CONST_LEN || tok_len == 0) {
03570
03571 PRINTMSG(TOKEN_LINE(token), 91, Error,
03572 TOKEN_COLUMN(token), tok_len,
03573 MAX_HEX_CONST_LEN);
03574 result = FALSE;
03575 }
03576 tok_len = 1;
03577 }
03578 else {
03579
03580 if (tok_len > MAX_HEX_CONST_LEN || tok_len == 0) {
03581 PRINTMSG(TOKEN_LINE(token), 91, Error,
03582 TOKEN_COLUMN(token), tok_len,
03583 MAX_HEX_CONST_LEN);
03584 result = FALSE;
03585 }
03586 tok_len = 0;
03587 }
03588
03589
03590
03591 while (isxdigit(const_buf[tok_len])) {
03592 tok_len++;
03593 }
03594
03595 if (const_buf[tok_len] != EOS) {
03596 PRINTMSG (TOKEN_LINE(token), 423, Error,
03597 TOKEN_COLUMN(token), const_buf[tok_len]);
03598 result = FALSE;
03599 }
03600
03601 if (result) {
03602 convert_hex_literal(FALSE);
03603 }
03604 else {
03605 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
03606 }
03607 }
03608 else if (LA_CH_VALUE == 'O' && ! sig_blank) {
03609
03610 NEXT_LA_CH;
03611
03612
03613
03614 PRINTMSG (TOKEN_LINE(token), 90, Ansi, TOKEN_COLUMN(token));
03615 TOKEN_VALUE(token) = Tok_Const_Boolean;
03616
03617
03618
03619 chptr = (char *)&CN_CONST(TOKEN_CONST_TBL_IDX(token));
03620
03621 char_len = tok_len;
03622
03623 i = 0;
03624 while (i < char_len &&
03625 (chptr[i] == ZERO ||
03626 chptr[i] == BLANK ||
03627 chptr[i] == TAB)) {
03628
03629 if (chptr[i] == ZERO) {
03630 had_zero = TRUE;
03631 }
03632
03633 i++;
03634 }
03635
03636 tok_len = 0;
03637
03638 while (i < char_len) {
03639 if (chptr[i] != BLANK &&
03640 chptr[i] != TAB) {
03641 ADD_TO_CONST_BUF (chptr[i], tok_len);
03642 }
03643 i++;
03644 }
03645
03646 if (tok_len == 0 && had_zero) {
03647 ADD_TO_CONST_BUF (ZERO, tok_len);
03648 }
03649
03650 const_buf[tok_len] = '\0';
03651 TOKEN_LEN(token) = tok_len;
03652
03653 if (tok_len > MAX_OCT_CONST_LEN) {
03654 PRINTMSG(TOKEN_LINE(token), 91, Error, TOKEN_COLUMN(token),
03655 tok_len, MAX_OCT_CONST_LEN);
03656 }
03657 else if (tok_len == MAX_OCT_CONST_LEN) {
03658
03659 if (const_buf[0] < '0' || const_buf[0] > '1') {
03660
03661
03662 PRINTMSG (TOKEN_LINE(token), 92, Error, TOKEN_COLUMN(token));
03663 result = FALSE;
03664 }
03665 }
03666
03667 tok_len = 0;
03668
03669
03670
03671 while (IS_OCT_DIGIT(const_buf[tok_len])) {
03672 tok_len++;
03673 }
03674
03675 if (const_buf[tok_len] != EOS) {
03676 PRINTMSG (TOKEN_LINE(token), 93, Error,
03677 TOKEN_COLUMN(token), const_buf[tok_len]);
03678 result = FALSE;
03679 }
03680
03681 if (result) {
03682 convert_octal_literal(FALSE);
03683 }
03684 else {
03685 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
03686 }
03687 }
03688 else {
03689 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
03690 TYP_TYPE(TYP_WORK_IDX) = Character;
03691 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
03692 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
03693 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
03694 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, tok_len);
03695
03696 CN_TYPE_IDX(TOKEN_CONST_TBL_IDX(token)) = ntr_type_tbl();
03697 }
03698
03699 TRACE (Func_Exit, "get_operand_quote", NULL);
03700
03701 return (result);
03702
03703 }
03704
03705
03706
03707
03708
03709
03710
03711
03712
03713
03714
03715
03716
03717
03718
03719
03720
03721
03722
03723
03724
03725 static boolean get_operator (void)
03726
03727 {
03728 int buf_idx;
03729 char op_ch;
03730 boolean result = TRUE;
03731 int stmt_num;
03732
03733
03734 TRACE (Func_Entry, "get_operator", NULL);
03735
03736 # ifdef _DEBUG
03737 if (LA_CH_CLASS != Ch_Class_Symbol) {
03738 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
03739 "get_operator", "symbol");
03740 }
03741 # endif
03742
03743 op_ch = LA_CH_VALUE;
03744 buf_idx = LA_CH_BUF_IDX;
03745 stmt_num = LA_CH_STMT_NUM;
03746 TOKEN_STR(token)[0] = op_ch;
03747
03748 if (op_ch != PLUS &&
03749 op_ch != MINUS &&
03750 op_ch != STAR &&
03751 op_ch != SLASH &&
03752 op_ch != EQUAL &&
03753 op_ch != GT &&
03754 op_ch != LT &&
03755 op_ch != DOT &&
03756 op_ch != PERCENT) {
03757
03758 result = FALSE;
03759 TOKEN_VALUE(token) = Tok_Unknown;
03760 }
03761 else {
03762
03763 NEXT_LA_CH;
03764
03765 switch (op_ch) {
03766 case PLUS :
03767 TOKEN_VALUE(token) = Tok_Op_Add;
03768 TOKEN_LEN(token) = 1;
03769 break;
03770
03771 case MINUS :
03772 TOKEN_VALUE(token) = Tok_Op_Sub;
03773 TOKEN_LEN(token) = 1;
03774 break;
03775
03776 case STAR :
03777 if (LA_CH_VALUE == STAR && !sig_blank) {
03778 TOKEN_VALUE(token) = Tok_Op_Power;
03779 TOKEN_STR(token)[1] = STAR;
03780 TOKEN_LEN(token) = 2;
03781 NEXT_LA_CH;
03782 }
03783 else {
03784 TOKEN_VALUE(token) = Tok_Op_Mult;
03785 TOKEN_LEN(token) = 1;
03786 }
03787 break;
03788
03789 case SLASH :
03790 if (LA_CH_VALUE == EQUAL && !sig_blank) {
03791 TOKEN_VALUE(token) = Tok_Op_Ne;
03792 TOKEN_STR(token)[1] = EQUAL;
03793 TOKEN_LEN(token) = 2;
03794 NEXT_LA_CH;
03795 }
03796 else if (LA_CH_VALUE == SLASH && !sig_blank) {
03797 TOKEN_VALUE(token) = Tok_Op_Concat;
03798 TOKEN_STR(token)[1] = SLASH;
03799 TOKEN_LEN(token) = 2;
03800 NEXT_LA_CH;
03801 }
03802 else if (LA_CH_VALUE == RPAREN && !sig_blank) {
03803 result = FALSE;
03804 reset_lex(buf_idx,stmt_num);
03805 TOKEN_VALUE(token) = Tok_Unknown;
03806 }
03807 else {
03808 TOKEN_VALUE(token) = Tok_Op_Div;
03809 TOKEN_LEN(token) = 1;
03810 }
03811 break;
03812
03813 case EQUAL :
03814 if (LA_CH_VALUE == EQUAL && !sig_blank) {
03815 TOKEN_VALUE(token) = Tok_Op_Eq;
03816 TOKEN_STR(token)[1] = EQUAL;
03817 TOKEN_LEN(token) = 2;
03818 NEXT_LA_CH;
03819 }
03820 else if (LA_CH_VALUE == GT && !sig_blank) {
03821 TOKEN_VALUE(token) = Tok_Op_Ptr_Assign;
03822 TOKEN_STR(token)[1] = GT;
03823 TOKEN_LEN(token) = 2;
03824 NEXT_LA_CH;
03825 }
03826 else {
03827 TOKEN_VALUE(token) = Tok_Op_Assign;
03828 TOKEN_LEN(token) = 1;
03829 }
03830 break;
03831
03832 case GT :
03833 if (LA_CH_VALUE == EQUAL && !sig_blank) {
03834 TOKEN_VALUE(token) = Tok_Op_Ge;
03835 TOKEN_STR(token)[1] = EQUAL;
03836 TOKEN_LEN(token) = 2;
03837 NEXT_LA_CH;
03838 }
03839 else {
03840 TOKEN_VALUE(token) = Tok_Op_Gt;
03841 TOKEN_LEN(token) = 1;
03842 }
03843 break;
03844
03845 case LT :
03846 if (LA_CH_VALUE == EQUAL && !sig_blank) {
03847 TOKEN_VALUE(token) = Tok_Op_Le;
03848 TOKEN_STR(token)[1] = EQUAL;
03849 TOKEN_LEN(token) = 2;
03850 NEXT_LA_CH;
03851 }
03852 else if (LA_CH_VALUE == GT &&
03853 !sig_blank) {
03854
03855 TOKEN_VALUE(token) = Tok_Op_Lg;
03856 TOKEN_STR(token)[1] = GT;
03857 TOKEN_LEN(token) = 2;
03858 NEXT_LA_CH;
03859 }
03860 else {
03861 TOKEN_VALUE(token) = Tok_Op_Lt;
03862 TOKEN_LEN(token) = 1;
03863 }
03864 break;
03865
03866 case DOT :
03867
03868
03869
03870
03871 if (LA_CH_CLASS != Ch_Class_Letter ||
03872 sig_blank) {
03873 result = FALSE;
03874 reset_lex(buf_idx, stmt_num);
03875 }
03876 else {
03877 result = get_operator_dot ();
03878 }
03879 break;
03880
03881 case PERCENT :
03882 TOKEN_VALUE(token) = Tok_Op_Deref;
03883 TOKEN_LEN(token) = 1;
03884 break;
03885
03886 default :
03887 TOKEN_VALUE(token) = Tok_Unknown;
03888 result = FALSE;
03889 TOKEN_LEN(token) = 1;
03890 break;
03891 }
03892 }
03893
03894 TRACE (Func_Exit, "get_operator", NULL);
03895
03896 return (result);
03897
03898 }
03899
03900
03901
03902
03903
03904
03905
03906
03907
03908
03909
03910
03911
03912
03913
03914
03915
03916
03917
03918
03919
03920
03921
03922 static boolean get_operator_dot (void)
03923
03924 {
03925 int attr_idx;
03926 int beg_idx;
03927 int i;
03928 int letter_idx;
03929 int lim_idx;
03930 int name_idx;
03931 boolean result = TRUE;
03932 int tok_len = 0;
03933
03934
03935 TRACE (Func_Entry, "get_operator_dot", NULL);
03936
03937
03938
03939 while (LA_CH_CLASS == Ch_Class_Letter && !sig_blank) {
03940 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
03941 NEXT_LA_CH;
03942 }
03943
03944 #ifdef KEY
03945 if (defined_op_too_long(&tok_len))
03946 #else
03947 if (tok_len > MAX_ID_LEN)
03948 #endif
03949 {
03950 #ifdef KEY
03951 #else
03952
03953 PRINTMSG (LA_CH_LINE, 65, Error, LA_CH_COLUMN);
03954 tok_len = MAX_ID_LEN;
03955 #endif
03956 TOKEN_LEN(token) = tok_len;
03957
03958 TOKEN_VALUE(token) = Tok_Op_Defined;
03959
03960 if (LA_CH_VALUE == DOT && !sig_blank) {
03961 NEXT_LA_CH;
03962 }
03963 else {
03964 PRINTMSG (LA_CH_LINE, 66, Error, LA_CH_COLUMN);
03965 }
03966 }
03967 else if (LA_CH_VALUE == DOT && !sig_blank) {
03968
03969
03970 letter_idx = TOKEN_STR(token)[0] - 'A';
03971
03972 beg_idx = dot_op_idx[letter_idx];
03973 lim_idx = dot_op_idx[letter_idx+1];
03974
03975
03976 while (beg_idx < lim_idx) {
03977 if (dot_op_len[beg_idx] == tok_len) {
03978 if (strncmp(TOKEN_STR(token),
03979 dot_op[beg_idx].name,
03980 tok_len) == IDENTICAL) {
03981
03982 TOKEN_VALUE(token) = dot_op[beg_idx].value;
03983
03984 break;
03985 }
03986 }
03987 beg_idx++;
03988 }
03989
03990
03991 if (beg_idx == lim_idx) {
03992 TOKEN_VALUE(token) = Tok_Op_Defined;
03993 }
03994
03995 for (i = 0; i < tok_len; i++) {
03996 TOKEN_STR(token)[i] = tolower(TOKEN_STR(token)[i]);
03997 }
03998
03999 switch (TOKEN_VALUE(token)) {
04000 case Tok_Op_Neqv :
04001
04002 if (tok_len == 3 || tok_len == 1) {
04003
04004 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token),
04005 &name_idx);
04006
04007 if (attr_idx == NULL_IDX) {
04008 attr_idx = srch_host_sym_tbl(TOKEN_STR(token),
04009 TOKEN_LEN(token),
04010 &name_idx,
04011 TRUE);
04012 }
04013
04014 if (attr_idx != NULL_IDX) {
04015
04016 while (AT_ATTR_LINK(attr_idx) != NULL_IDX) {
04017 attr_idx = AT_ATTR_LINK(attr_idx);
04018 }
04019 }
04020
04021 if (attr_idx == NULL_IDX &&
04022 SH_STMT_TYPE(curr_stmt_sh_idx) == Interface_Stmt) {
04023 TOKEN_VALUE(token) = Tok_Op_Defined;
04024 }
04025
04026 else if (attr_idx != NULL_IDX &&
04027 AT_OBJ_CLASS(attr_idx) == Interface) {
04028 TOKEN_VALUE(token) = Tok_Op_Defined;
04029 }
04030 else {
04031 PRINTMSG(TOKEN_LINE(token), 317, Ansi, TOKEN_COLUMN(token),
04032 TOKEN_STR(token));
04033 }
04034 }
04035 break;
04036
04037 case Tok_Const_True :
04038 case Tok_Const_False :
04039
04040 if (tok_len == 1) {
04041
04042 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token),
04043 &name_idx);
04044
04045 if (attr_idx == NULL_IDX) {
04046 attr_idx = srch_host_sym_tbl(TOKEN_STR(token),
04047 TOKEN_LEN(token),
04048 &name_idx,
04049 TRUE);
04050 }
04051
04052 if (attr_idx != NULL_IDX) {
04053
04054 while (AT_ATTR_LINK(attr_idx) != NULL_IDX) {
04055 attr_idx = AT_ATTR_LINK(attr_idx);
04056 }
04057 }
04058
04059 if (attr_idx == NULL_IDX &&
04060 SH_STMT_TYPE(curr_stmt_sh_idx) == Interface_Stmt) {
04061 TOKEN_VALUE(token) = Tok_Op_Defined;
04062 }
04063 else if (attr_idx != NULL_IDX &&
04064 AT_OBJ_CLASS(attr_idx) == Interface) {
04065 TOKEN_VALUE(token) = Tok_Op_Defined;
04066 }
04067 }
04068
04069 break;
04070
04071 case Tok_Op_And :
04072 case Tok_Op_Not :
04073 case Tok_Op_Or :
04074
04075 if (tok_len == 1) {
04076
04077 attr_idx = srch_sym_tbl(TOKEN_STR(token), TOKEN_LEN(token),
04078 &name_idx);
04079
04080 if (attr_idx == NULL_IDX) {
04081 attr_idx = srch_host_sym_tbl(TOKEN_STR(token),
04082 TOKEN_LEN(token),
04083 &name_idx,
04084 TRUE);
04085 }
04086
04087 if (attr_idx != NULL_IDX) {
04088
04089 while (AT_ATTR_LINK(attr_idx) != NULL_IDX) {
04090 attr_idx = AT_ATTR_LINK(attr_idx);
04091 }
04092 }
04093
04094 if (attr_idx == NULL_IDX &&
04095 SH_STMT_TYPE(curr_stmt_sh_idx) == Interface_Stmt) {
04096 TOKEN_VALUE(token) = Tok_Op_Defined;
04097 }
04098 else if (attr_idx != NULL_IDX &&
04099 AT_OBJ_CLASS(attr_idx) == Interface) {
04100 TOKEN_VALUE(token) = Tok_Op_Defined;
04101 }
04102 else {
04103 PRINTMSG(TOKEN_LINE(token), 317, Ansi, TOKEN_COLUMN(token),
04104 TOKEN_STR(token));
04105 }
04106 }
04107
04108 break;
04109
04110 }
04111 NEXT_LA_CH;
04112 }
04113 else {
04114 PRINTMSG (LA_CH_LINE, 66, Error, LA_CH_COLUMN);
04115 result = FALSE;
04116 }
04117 TOKEN_LEN(token) = tok_len;
04118
04119 TRACE (Func_Exit, "get_operator_dot", NULL);
04120
04121 return (result);
04122
04123 }
04124
04125
04126
04127
04128
04129
04130
04131
04132
04133
04134
04135
04136
04137
04138
04139
04140
04141
04142
04143
04144
04145
04146
04147 static boolean get_program_str (void)
04148
04149 {
04150 int paren_lvl = 0;
04151 boolean result = TRUE;
04152
04153
04154 TRACE (Func_Entry, "get_program_str", NULL);
04155
04156 # ifdef _DEBUG
04157 if (LA_CH_VALUE != LPAREN) {
04158 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
04159 "get_program_str", "(");
04160 }
04161 # endif
04162
04163
04164
04165
04166 do {
04167 if (LA_CH_VALUE == LPAREN) {
04168 paren_lvl++;
04169 }
04170 else if (LA_CH_VALUE == RPAREN) {
04171 paren_lvl--;
04172 }
04173 NEXT_LA_CH;
04174 }
04175 while (paren_lvl > 0 && LA_CH_VALUE != EOS);
04176
04177 if (paren_lvl > 0) {
04178 PRINTMSG (TOKEN_LINE(token), 28, Error, TOKEN_COLUMN(token));
04179 result = FALSE;
04180 }
04181
04182 TRACE (Func_Exit, "get_program_str", NULL);
04183
04184 return (result);
04185
04186 }
04187
04188
04189
04190
04191
04192
04193
04194
04195
04196
04197
04198
04199
04200
04201
04202
04203
04204
04205
04206
04207
04208
04209
04210
04211 static boolean get_punctuator (void)
04212
04213 {
04214 char punct_ch;
04215 int tok_len = 0;
04216
04217 TRACE (Func_Entry, "get_punctuator", NULL);
04218
04219 punct_ch = LA_CH_VALUE;
04220 TOKEN_STR(token)[0] = punct_ch;
04221 tok_len = 1;
04222
04223 NEXT_LA_CH;
04224
04225 switch (punct_ch) {
04226 case COLON :
04227 if (LA_CH_VALUE == COLON && !sig_blank) {
04228 TOKEN_VALUE(token) = Tok_Punct_Colon_Colon;
04229 TOKEN_STR(token)[1] = COLON;
04230 tok_len = 2;
04231 NEXT_LA_CH;
04232 }
04233 else {
04234 TOKEN_VALUE(token) = Tok_Punct_Colon;
04235 }
04236 break;
04237
04238 case COMMA :
04239 TOKEN_VALUE(token) = Tok_Punct_Comma;
04240 break;
04241
04242 case DASH :
04243 TOKEN_VALUE(token) = Tok_Punct_Dash;
04244 break;
04245
04246 case EOS :
04247 TOKEN_VALUE(token) = Tok_EOS;
04248 break;
04249
04250 case EQUAL :
04251 if (LA_CH_VALUE == GT && !sig_blank) {
04252 TOKEN_VALUE(token) = Tok_Punct_Rename;
04253 TOKEN_STR(token)[1] = GT;
04254 tok_len = 2;
04255 NEXT_LA_CH;
04256 }
04257 else {
04258 TOKEN_VALUE(token) = Tok_Punct_Eq;
04259 }
04260 break;
04261
04262 case LPAREN :
04263 if (LA_CH_VALUE == SLASH && !sig_blank) {
04264 TOKEN_VALUE(token) = Tok_Punct_Lbrkt;
04265 TOKEN_STR(token)[1] = SLASH;
04266 tok_len = 2;
04267 NEXT_LA_CH;
04268 }
04269 else {
04270 TOKEN_VALUE(token) = Tok_Punct_Lparen;
04271 }
04272 break;
04273
04274 case RPAREN :
04275 TOKEN_VALUE(token) = Tok_Punct_Rparen;
04276 break;
04277
04278 case SLASH :
04279 if (LA_CH_VALUE == RPAREN && !sig_blank) {
04280 TOKEN_VALUE(token) = Tok_Punct_Rbrkt;
04281 TOKEN_STR(token)[1] = RPAREN;
04282 tok_len = 2;
04283 NEXT_LA_CH;
04284 }
04285 else {
04286 TOKEN_VALUE(token) = Tok_Punct_Slash;
04287 }
04288 break;
04289
04290 case STAR :
04291 TOKEN_VALUE(token) = Tok_Punct_Star;
04292 break;
04293
04294 default :
04295 TOKEN_VALUE(token) = Tok_Unknown;
04296 break;
04297 }
04298
04299 TOKEN_LEN(token) = tok_len;
04300
04301 TRACE (Func_Exit, "get_punctuator", NULL);
04302
04303 return (TRUE);
04304
04305 }
04306
04307
04308
04309
04310
04311
04312
04313
04314
04315
04316
04317
04318
04319
04320
04321
04322
04323
04324
04325
04326
04327
04328
04329
04330 char ch_after_paren_grp(void)
04331
04332 {
04333 char return_char;
04334
04335
04336 TRACE (Func_Entry, "ch_after_paren_grp", &LA_CH_VALUE);
04337
04338 return_char = scan_thru_close_paren(0,0,1);
04339
04340 TRACE (Func_Exit, "ch_after_paren_grp", &return_char);
04341
04342 return(return_char);
04343
04344 }
04345
04346
04347
04348
04349
04350
04351
04352
04353
04354
04355
04356
04357
04358
04359
04360
04361
04362 static boolean convert_const(void)
04363
04364 {
04365 int attr_idx;
04366 long bytes = 0;
04367 long_type constant[MAX_WORDS_FOR_NUMERIC];
04368 linear_type_type linear_type;
04369 id_str_type name;
04370 int name_idx;
04371 boolean result_ok = TRUE;
04372 int type_idx;
04373 type_desc_type type_kind = Default_Typed;
04374
04375
04376 TRACE (Func_Entry, "convert_const", NULL);
04377
04378 TOKEN_CONST_TBL_IDX(token) = NULL_IDX;
04379
04380 if (TOKEN_KIND_LEN(token) != 0) {
04381
04382 if (TOKEN_KIND_STR(token)[0] >= '0' && TOKEN_KIND_STR(token)[0] <= '9') {
04383 errno = 0;
04384 bytes = LEX_STRTOL(TOKEN_KIND_STR(token), (char **) NULL, 10);
04385
04386 if (errno != 0) {
04387 result_ok = FALSE;
04388 PRINTMSG(TOKEN_LINE(token), 621, Error,
04389 TOKEN_COLUMN(token),
04390 TOKEN_KIND_STR(token));
04391 }
04392 else {
04393 type_kind = Kind_Typed;
04394 }
04395 }
04396 else {
04397 CREATE_ID(name, TOKEN_KIND_STR(token), TOKEN_KIND_LEN(token));
04398 attr_idx = srch_sym_tbl(name.string,
04399 TOKEN_KIND_LEN(token),
04400 &name_idx);
04401
04402 if (attr_idx == NULL_IDX) {
04403 attr_idx = srch_host_sym_tbl(name.string,
04404 TOKEN_KIND_LEN(token),
04405 &name_idx,
04406 TRUE);
04407 }
04408
04409 if (attr_idx == NULL_IDX) {
04410 PRINTMSG(TOKEN_LINE(token), 129, Error, TOKEN_COLUMN(token));
04411 result_ok = FALSE;
04412 }
04413 else {
04414
04415 while (AT_ATTR_LINK(attr_idx) != NULL_IDX) {
04416 attr_idx = AT_ATTR_LINK(attr_idx);
04417 }
04418
04419 if (AT_NOT_VISIBLE(attr_idx)) {
04420 PRINTMSG(TOKEN_LINE(token), 486, Error,
04421 TOKEN_COLUMN(token),
04422 AT_OBJ_NAME_PTR(attr_idx),
04423 AT_OBJ_NAME_PTR(AT_MODULE_IDX((attr_idx))));
04424 result_ok = FALSE;
04425 }
04426 else if (AT_OBJ_CLASS(attr_idx) == Data_Obj &&
04427 ATD_CLASS(attr_idx) == Constant &&
04428 TYP_TYPE(ATD_TYPE_IDX(attr_idx)) == Integer &&
04429 ATD_ARRAY_IDX(attr_idx) == NULL_IDX) {
04430 bytes = (long)CN_INT_TO_C(ATD_CONST_IDX(attr_idx));
04431 type_kind = Kind_Typed;
04432 }
04433 else {
04434 PRINTMSG(TOKEN_LINE(token), 129, Error, TOKEN_COLUMN(token));
04435 result_ok = FALSE;
04436 }
04437 }
04438 }
04439 }
04440
04441 switch (TOKEN_VALUE(token)) {
04442 case Tok_Const_Int :
04443
04444 if (type_kind == Default_Typed) {
04445 type_idx = INTEGER_DEFAULT_TYPE;
04446 }
04447 else if (!validate_kind(Integer,
04448 TOKEN_LINE(token),
04449 TOKEN_COLUMN(token),
04450 &bytes,
04451 &linear_type)) {
04452
04453 type_idx = INTEGER_DEFAULT_TYPE;
04454 result_ok = FALSE;
04455 }
04456 else {
04457 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
04458 TYP_TYPE(TYP_WORK_IDX) = Integer;
04459 TYP_LINEAR(TYP_WORK_IDX) = linear_type;
04460 TYP_DCL_VALUE(TYP_WORK_IDX) = bytes;
04461 TYP_DESC(TYP_WORK_IDX) = Kind_Typed;
04462 type_idx = ntr_type_tbl();
04463 }
04464
04465 #ifdef KEY
04466 int new_type_idx;
04467 CONVERT_INT_CONST_AND_PROMOTE(type_idx, TOKEN_LEN(token), result_ok);
04468 #else
04469 CONVERT_INT_CONST(type_idx, TOKEN_LEN(token), result_ok);
04470 #endif
04471 break;
04472
04473 case Tok_Const_Real :
04474
04475 if (type_kind == Default_Typed) {
04476 type_idx = REAL_DEFAULT_TYPE;
04477 CONVERT_REAL_CONST(type_idx, TOKEN_LEN(token), result_ok);
04478 }
04479 else if (!validate_kind(Real,
04480 TOKEN_LINE(token),
04481 TOKEN_COLUMN(token),
04482 &bytes,
04483 &linear_type)) {
04484 type_idx = REAL_DEFAULT_TYPE;
04485 result_ok = FALSE;
04486 CONVERT_REAL_CONST(type_idx, TOKEN_LEN(token), result_ok);
04487 }
04488 else {
04489 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
04490 TYP_TYPE(TYP_WORK_IDX) = Real;
04491 TYP_LINEAR(TYP_WORK_IDX) = linear_type;
04492 TYP_DCL_VALUE(TYP_WORK_IDX) = bytes;
04493 TYP_DESC(TYP_WORK_IDX) = Kind_Typed;
04494 type_idx = ntr_type_tbl();
04495
04496 # ifdef _TARGET64
04497 if (linear_type > Real_8)
04498 # else
04499 if (linear_type > Real_4)
04500 # endif
04501 {
04502 CONVERT_DBL_CONST(type_idx, TOKEN_LEN(token), result_ok);
04503 }
04504 else {
04505 CONVERT_REAL_CONST(type_idx, TOKEN_LEN(token), result_ok);
04506 }
04507 }
04508 break;
04509
04510 case Tok_Const_True :
04511 case Tok_Const_False :
04512
04513 if (type_kind == Default_Typed) {
04514 type_idx = LOGICAL_DEFAULT_TYPE;
04515 }
04516 else if (!validate_kind(Logical,
04517 TOKEN_LINE(token),
04518 TOKEN_COLUMN(token),
04519 &bytes,
04520 &linear_type)) {
04521 type_idx = LOGICAL_DEFAULT_TYPE;
04522 result_ok = FALSE;
04523 }
04524 else {
04525 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
04526 TYP_TYPE(TYP_WORK_IDX) = Logical;
04527 TYP_LINEAR(TYP_WORK_IDX) = linear_type;
04528 TYP_DCL_VALUE(TYP_WORK_IDX) = bytes;
04529 TYP_DESC(TYP_WORK_IDX) = Kind_Typed;
04530 type_idx = ntr_type_tbl();
04531 }
04532
04533 TOKEN_CONST_TBL_IDX(token) = set_up_logical_constant(constant,
04534 type_idx,
04535 (TOKEN_VALUE(token) == Tok_Const_True ? TRUE_VALUE :
04536 FALSE_VALUE),
04537 TRUE);
04538 break;
04539
04540 case Tok_Const_Char :
04541
04542 if (type_kind != Default_Typed && !validate_kind(Character,
04543 TOKEN_LINE(token),
04544 TOKEN_COLUMN(token),
04545 &bytes,
04546 &linear_type)) {
04547 result_ok = FALSE;
04548 }
04549 break;
04550 }
04551
04552 TRACE (Func_Exit, "convert_const", NULL);
04553
04554 return(result_ok);
04555
04556 }
04557
04558
04559
04560
04561
04562
04563
04564
04565
04566
04567
04568
04569
04570
04571
04572
04573
04574 token_values_type get_dir_token_from_str(char *str)
04575
04576 {
04577 int beg_idx;
04578 int i;
04579 int letter_idx;
04580 int lim_idx;
04581 char upper_str[MAX_KWD_LEN + 1];
04582 int str_len = 0;
04583 token_values_type value = Tok_Unknown;
04584
04585
04586 TRACE (Func_Entry, "get_dir_token_from_str", NULL);
04587
04588 str_len = 0;
04589 i = 0;
04590
04591 while (str[i] != '\0') {
04592 if (str[i] == ' ' || str[i] == '\t') {
04593 i++;
04594 }
04595 else {
04596 if (ch_class[str[i]] != Ch_Class_Letter &&
04597 str[i] != USCORE) {
04598 goto EXIT;
04599 }
04600 else if (islower(str[i])) {
04601 upper_str[str_len] = TOUPPER(str[i]);
04602 }
04603 else {
04604 upper_str[str_len] = str[i];
04605 }
04606 str_len++;
04607 i++;
04608 }
04609 }
04610
04611 if (ch_class[upper_str[0]] != Ch_Class_Letter) {
04612 goto EXIT;
04613 }
04614
04615 letter_idx = upper_str[0] - 'A';
04616 beg_idx = kwd_dir_idx[letter_idx];
04617 lim_idx = kwd_dir_idx[letter_idx+1];
04618
04619 if (beg_idx != lim_idx) {
04620
04621 if (str_len >= kwd_dir_len[lim_idx-1]) {
04622
04623 while (beg_idx < lim_idx) {
04624
04625 if (kwd_dir_len[beg_idx] == str_len &&
04626 strncmp(upper_str,
04627 kwd_dir[beg_idx].name,
04628 kwd_dir_len[beg_idx]) == IDENTICAL) {
04629
04630 value = kwd_dir[beg_idx].value;
04631
04632 break;
04633 }
04634
04635 beg_idx++;
04636
04637 }
04638 }
04639 }
04640
04641 if (value == Tok_Unknown &&
04642 ((strncmp("ALL", upper_str, 3) == IDENTICAL) ||
04643 (strncmp("DIR", upper_str, 3) == IDENTICAL) ||
04644 (strncmp("MIC", upper_str, 3) == IDENTICAL) ||
04645 (strncmp("MIPSPRO", upper_str, 7) == IDENTICAL) ||
04646 (strncmp("OMP", upper_str, 3) == IDENTICAL) ||
04647 (strncmp("CONDITIONAL_OMP", upper_str, 15) == IDENTICAL) ||
04648 (strncmp("MPP", upper_str, 3) == IDENTICAL))) {
04649
04650
04651
04652 value = Tok_Id;
04653 }
04654 else if (value == Tok_Unknown) {
04655 letter_idx = upper_str[0] - 'A';
04656 beg_idx = kwd_mic_idx[letter_idx];
04657 lim_idx = kwd_mic_idx[letter_idx+1];
04658
04659 if (beg_idx != lim_idx) {
04660
04661 if (str_len >= kwd_mic_len[lim_idx-1]) {
04662
04663 while (beg_idx < lim_idx) {
04664
04665 if (kwd_mic_len[beg_idx] == str_len &&
04666 strncmp(upper_str,
04667 kwd_mic[beg_idx].name,
04668 kwd_mic_len[beg_idx]) == IDENTICAL) {
04669
04670 value = kwd_mic[beg_idx].value;
04671
04672 break;
04673 }
04674
04675 beg_idx++;
04676
04677 }
04678 }
04679 }
04680 }
04681
04682 if (value == Tok_Unknown) {
04683 letter_idx = upper_str[0] - 'A';
04684 beg_idx = kwd_open_mp_dir_idx[letter_idx];
04685 lim_idx = kwd_open_mp_dir_idx[letter_idx+1];
04686
04687 if (beg_idx != lim_idx) {
04688
04689 if (str_len >= kwd_open_mp_dir_len[lim_idx-1]) {
04690
04691 while (beg_idx < lim_idx) {
04692
04693 if (kwd_open_mp_dir_len[beg_idx] == str_len &&
04694 strncmp(upper_str,
04695 kwd_open_mp_dir[beg_idx].name,
04696 kwd_open_mp_dir_len[beg_idx]) == IDENTICAL) {
04697
04698 value = kwd_open_mp_dir[beg_idx].value;
04699
04700 break;
04701 }
04702
04703 beg_idx++;
04704
04705 }
04706 }
04707 }
04708 }
04709
04710 if (value == Tok_Unknown) {
04711 letter_idx = upper_str[0] - 'A';
04712 beg_idx = kwd_sgi_dir_idx[letter_idx];
04713 lim_idx = kwd_sgi_dir_idx[letter_idx+1];
04714
04715 if (beg_idx != lim_idx) {
04716
04717 if (str_len >= kwd_sgi_dir_len[lim_idx-1]) {
04718
04719 while (beg_idx < lim_idx) {
04720
04721 if (kwd_sgi_dir_len[beg_idx] == str_len &&
04722 strncmp(upper_str,
04723 kwd_sgi_dir[beg_idx].name,
04724 kwd_sgi_dir_len[beg_idx]) == IDENTICAL) {
04725
04726 value = kwd_sgi_dir[beg_idx].value;
04727
04728 break;
04729 }
04730
04731 beg_idx++;
04732
04733 }
04734 }
04735 }
04736 }
04737
04738 EXIT:
04739
04740 TRACE (Func_Exit, "get_dir_token_from_str", NULL);
04741
04742 return(value);
04743
04744 }
04745
04746 # ifdef _DEBUG
04747
04748
04749
04750
04751
04752
04753
04754
04755
04756
04757
04758
04759
04760
04761
04762
04763
04764
04765
04766
04767
04768 static boolean get_debug_directive (void)
04769
04770 {
04771 int beg_idx;
04772 la_type la_queue[MAX_KWD_LEN + 1];
04773 int letter_idx;
04774 int lim_idx;
04775 int tok_len = 0;
04776
04777
04778 TRACE (Func_Entry, "get_debug_directive", NULL);
04779
04780 # ifdef _DEBUG
04781 if (LA_CH_CLASS != Ch_Class_Letter) {
04782 PRINTMSG(TOKEN_LINE(token), 295, Internal, TOKEN_COLUMN(token),
04783 "get_debug_directive", "letter");
04784 }
04785 # endif
04786
04787 TOKEN_VALUE(token) = Tok_Id;
04788
04789
04790 letter_idx = LA_CH_VALUE - 'A';
04791
04792 beg_idx = kwd_dbg_idx[letter_idx];
04793 lim_idx = kwd_dbg_idx[letter_idx+1];
04794
04795 if (beg_idx != lim_idx) {
04796
04797 #ifdef _DEBUG
04798 if (kwd_dbg_len[beg_idx] > MAX_ID_LEN) {
04799 PRINTMSG(TOKEN_LINE(token), 384, Internal, TOKEN_COLUMN(token),
04800 beg_idx, kwd_dbg_len[beg_idx]);
04801 }
04802 # endif
04803
04804 while (LA_CH_CLASS == Ch_Class_Letter && tok_len < kwd_dbg_len[beg_idx]) {
04805 la_queue[tok_len] = la_ch;
04806 TOKEN_STR(token)[tok_len] = LA_CH_VALUE;
04807 tok_len++;
04808 NEXT_LA_CH;
04809 }
04810
04811 TOKEN_LEN(token) = tok_len;
04812
04813 if (tok_len >= kwd_dbg_len[lim_idx-1]) {
04814
04815
04816
04817 while (beg_idx < lim_idx) {
04818
04819 if (kwd_dbg_len[beg_idx] <= tok_len) {
04820
04821 if (strncmp(TOKEN_STR(token),
04822 kwd_dbg[beg_idx].name,
04823 kwd_dbg_len[beg_idx]) == IDENTICAL) {
04824
04825
04826
04827
04828 if (tok_len == kwd_dbg_len[beg_idx] &&
04829 (LA_CH_VALUE == USCORE ||
04830 LA_CH_VALUE == DOLLAR ||
04831 LA_CH_VALUE == AT_SIGN)) {
04832 }
04833 else {
04834 TOKEN_VALUE(token) = kwd_dbg[beg_idx].value;
04835
04836
04837
04838 if (tok_len > kwd_dbg_len[beg_idx]) {
04839 tok_len = kwd_dbg_len[beg_idx];
04840 la_ch = la_queue[tok_len];
04841 TOKEN_LEN(token) = tok_len;
04842
04843
04844 reset_src_input (LA_CH_BUF_IDX, LA_CH_STMT_NUM);
04845 }
04846 break;
04847 }
04848 }
04849 }
04850
04851 beg_idx++;
04852
04853 }
04854 }
04855 }
04856
04857 if (TOKEN_VALUE(token) == Tok_Id) {
04858
04859 while (VALID_LA_CH) {
04860 ADD_TO_TOKEN_STR (LA_CH_VALUE, tok_len);
04861 NEXT_LA_CH;
04862 }
04863
04864 #ifdef KEY
04865 id_too_long(&tok_len);
04866 #else
04867 if (tok_len > MAX_ID_LEN) {
04868 PRINTMSG (TOKEN_LINE(token), 67, Error, TOKEN_COLUMN(token));
04869 tok_len = MAX_ID_LEN;
04870 }
04871 #endif
04872 TOKEN_LEN(token) = tok_len;
04873 }
04874
04875 TRACE (Func_Exit, "get_debug_directive", NULL);
04876
04877 return (TRUE);
04878
04879 }
04880 # endif
04881
04882
04883
04884
04885
04886
04887
04888
04889
04890
04891
04892
04893
04894
04895
04896
04897
04898 static void convert_octal_literal(boolean is_boz)
04899
04900 {
04901 int i;
04902 int idx;
04903 int num_bits;
04904 int num_words;
04905 long_type result[MAX_WORDS_FOR_NUMERIC];
04906 int shift;
04907 int temp;
04908 int type_idx;
04909 int word;
04910
04911 TRACE (Func_Entry, "convert_octal_literal", NULL);
04912
04913
04914 num_bits = ((TOKEN_LEN(token) - 1) * 3);
04915 temp = const_buf[0] - '0';
04916
04917 num_bits +=
04918 ((temp & 4) != 0 ? 3 : ((temp & 2) != 0 ? 2 : ((temp & 1) != 0 ? 1 : 0)));
04919
04920 num_words = (num_bits + TARGET_BITS_PER_WORD - 1) / TARGET_BITS_PER_WORD;
04921
04922 if (num_words == 0) {
04923 num_words = 1;
04924 }
04925
04926
04927 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
04928 result[i] = 0;
04929 }
04930
04931 word = num_words - 1;
04932
04933 idx = TOKEN_LEN(token) - 1;
04934 shift = 0;
04935
04936 while (idx >= 0) {
04937
04938 if (shift > (TARGET_BITS_PER_WORD - 1)) {
04939 shift = 0;
04940 word--;
04941 }
04942
04943 temp = const_buf[idx] - '0';
04944 idx--;
04945
04946 result[word] |= ((temp & 1) << shift);
04947 shift++;
04948
04949 if (shift > (TARGET_BITS_PER_WORD - 1)) {
04950 shift = 0;
04951 word--;
04952 }
04953
04954 result[word] |= (((temp >> 1) & 1) << shift);
04955 shift++;
04956
04957 if (shift > (TARGET_BITS_PER_WORD - 1)) {
04958 shift = 0;
04959 word--;
04960 }
04961
04962 result[word] |= (((temp >> 2) & 1) << shift);
04963 shift++;
04964 }
04965
04966 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
04967 TYP_TYPE(TYP_WORK_IDX) = Typeless;
04968 TYP_LINEAR(TYP_WORK_IDX) = Short_Typeless_Const;
04969 TYP_BIT_LEN(TYP_WORK_IDX) = (num_words * TARGET_BITS_PER_WORD);
04970 type_idx = ntr_type_tbl();
04971
04972 if (is_boz) {
04973 TOKEN_CONST_TBL_IDX(token) = ntr_boz_const_tbl(type_idx,
04974 result);
04975 }
04976 else {
04977 TOKEN_CONST_TBL_IDX(token) = ntr_boolean_const_tbl(type_idx,
04978 result);
04979 }
04980
04981
04982 TRACE (Func_Exit, "convert_octal_literal", NULL);
04983
04984 return;
04985
04986 }
04987
04988
04989
04990
04991
04992
04993
04994
04995
04996
04997
04998
04999
05000
05001
05002
05003
05004 static void convert_hex_literal(boolean is_boz)
05005
05006 {
05007 int i;
05008 int idx;
05009 int base;
05010 int bits;
05011 char *char_ptr;
05012 long_type constant[MAX_WORDS_FOR_NUMERIC];
05013 int const_idx;
05014 int count;
05015 int digits_per_word;
05016 int num_digits;
05017 int num_words;
05018 boolean negate = FALSE;
05019 long_type result[MAX_WORDS_FOR_NUMERIC];
05020 char tmpstr[80];
05021 int type_idx;
05022 int word;
05023
05024
05025 TRACE (Func_Entry, "convert_hex_literal", NULL);
05026
05027 if (const_buf[0] == PLUS) {
05028 num_digits = TOKEN_LEN(token) - 1;
05029 char_ptr = &(const_buf[1]);
05030 }
05031 else if (const_buf[0] == MINUS) {
05032 num_digits = TOKEN_LEN(token) - 1;
05033 char_ptr = &(const_buf[1]);
05034 negate = TRUE;
05035 }
05036 else {
05037 num_digits = TOKEN_LEN(token);
05038 char_ptr = const_buf;
05039 }
05040
05041 digits_per_word = TARGET_BITS_PER_WORD / 4;
05042
05043 num_words = (num_digits + digits_per_word - 1) / digits_per_word;
05044
05045
05046 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
05047 result[i] = 0;
05048 }
05049
05050 word = num_words - 1;
05051 idx = num_digits - digits_per_word;
05052
05053 while (word >= 0) {
05054
05055 if (idx < 0) {
05056 count = digits_per_word + idx;
05057 idx = 0;
05058 }
05059 else {
05060 count = digits_per_word;
05061 }
05062
05063 strncpy(tmpstr, &(char_ptr[idx]), count);
05064 tmpstr[count] = '\0';
05065
05066 # ifdef _ARITH_INPUT_CONV
05067 base = 16;
05068
05069 i = AR_convert_str_to_int((AR_DATA *)constant,
05070 (const AR_TYPE *)&input_arith_type[CG_INTEGER_DEFAULT_TYPE],
05071 &bits,
05072 (const char *)tmpstr,
05073 (const int *)&base);
05074 SHIFT_ARITH_RESULT(constant, CG_INTEGER_DEFAULT_TYPE);
05075 result[word] = constant[0];
05076
05077 # else
05078 # if defined(_HOST32) && defined(_TARGET64)
05079
05080 result[word] = (long_type) strtoull(tmpstr, (char **) NULL, 16);
05081
05082 # else
05083
05084 result[word] = strtoul(tmpstr, (char **) NULL, 16);
05085
05086 # endif
05087 # endif
05088
05089 idx -= digits_per_word;
05090 word--;
05091 }
05092
05093 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
05094 TYP_TYPE(TYP_WORK_IDX) = Typeless;
05095 TYP_LINEAR(TYP_WORK_IDX) = Short_Typeless_Const;
05096 TYP_BIT_LEN(TYP_WORK_IDX) = (num_words * TARGET_BITS_PER_WORD);
05097 type_idx = ntr_type_tbl();
05098
05099 if (is_boz) {
05100 const_idx = ntr_boz_const_tbl(type_idx, result);
05101 }
05102 else {
05103 const_idx = ntr_boolean_const_tbl(type_idx, result);
05104 }
05105
05106
05107
05108
05109
05110 if (negate) {
05111 const_idx = cast_typeless_constant(const_idx,
05112 TYPELESS_DEFAULT_TYPE,
05113 TOKEN_LINE(token),
05114 TOKEN_COLUMN(token));
05115
05116 type_idx = INTEGER_DEFAULT_TYPE;
05117 if (folder_driver((char *)&CN_CONST(const_idx),
05118 INTEGER_DEFAULT_TYPE,
05119 NULL,
05120 NULL_IDX,
05121 constant,
05122 &type_idx,
05123 TOKEN_LINE(token),
05124 TOKEN_COLUMN(token),
05125 1,
05126 Uminus_Opr)) {
05127
05128 if (is_boz) {
05129 const_idx = ntr_boz_const_tbl(TYPELESS_DEFAULT_TYPE, constant);
05130 }
05131 else {
05132 const_idx = ntr_boolean_const_tbl(TYPELESS_DEFAULT_TYPE, constant);
05133 }
05134 }
05135 }
05136
05137 TOKEN_CONST_TBL_IDX(token) = const_idx;
05138
05139 TRACE (Func_Exit, "convert_hex_literal", NULL);
05140
05141 return;
05142
05143 }
05144
05145
05146
05147
05148
05149
05150
05151
05152
05153
05154
05155
05156
05157
05158
05159
05160
05161 static void convert_binary_literal(boolean is_boz)
05162
05163 {
05164 int i;
05165 int idx;
05166 int base;
05167 int bits;
05168 long_type constant[MAX_WORDS_FOR_NUMERIC];
05169 int count;
05170 int digits_per_word;
05171 int num_digits;
05172 int num_words;
05173 long_type result[MAX_WORDS_FOR_NUMERIC];
05174 char tmpstr[80];
05175 int type_idx;
05176 int word;
05177
05178
05179 TRACE (Func_Entry, "convert_binary_literal", NULL);
05180
05181 num_digits = TOKEN_LEN(token);
05182
05183 digits_per_word = TARGET_BITS_PER_WORD;
05184
05185 num_words = (num_digits + digits_per_word - 1) / digits_per_word;
05186
05187
05188 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
05189 result[i] = 0;
05190 }
05191
05192 word = num_words - 1;
05193 idx = num_digits - digits_per_word;
05194
05195 while (word >= 0) {
05196
05197 if (idx < 0) {
05198 count = digits_per_word + idx;
05199 idx = 0;
05200 }
05201 else {
05202 count = digits_per_word;
05203 }
05204
05205 strncpy(tmpstr, &(const_buf[idx]), count);
05206 tmpstr[count] = '\0';
05207
05208 # ifdef _ARITH_INPUT_CONV
05209 base = 2;
05210
05211 i = AR_convert_str_to_int((AR_DATA *)constant,
05212 (const AR_TYPE *)&input_arith_type[CG_INTEGER_DEFAULT_TYPE],
05213 &bits,
05214 (const char *)tmpstr,
05215 (const int *)&base);
05216 SHIFT_ARITH_RESULT(constant, CG_INTEGER_DEFAULT_TYPE);
05217 result[word] = constant[0];
05218
05219 # else
05220 # if defined(_HOST32) && defined(_TARGET64)
05221
05222 result[word] = (long_type) strtoull(tmpstr, (char **) NULL, 2);
05223
05224 # else
05225
05226 result[word] = strtoul(tmpstr, (char **) NULL, 2);
05227
05228 # endif
05229 # endif
05230
05231 idx -= digits_per_word;
05232 word--;
05233 }
05234
05235 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
05236 TYP_TYPE(TYP_WORK_IDX) = Typeless;
05237 TYP_LINEAR(TYP_WORK_IDX) = Short_Typeless_Const;
05238 TYP_BIT_LEN(TYP_WORK_IDX) = (num_words * TARGET_BITS_PER_WORD);
05239 type_idx = ntr_type_tbl();
05240
05241 if (is_boz) {
05242 TOKEN_CONST_TBL_IDX(token) = ntr_boz_const_tbl(type_idx,
05243 result);
05244 }
05245 else {
05246 TOKEN_CONST_TBL_IDX(token) = ntr_boolean_const_tbl(type_idx,
05247 result);
05248 }
05249
05250
05251 TRACE (Func_Exit, "convert_binary_literal", NULL);
05252
05253 return;
05254
05255 }
05256
05257
05258
05259
05260
05261
05262
05263
05264
05265
05266
05267
05268
05269
05270
05271
05272
05273
05274
05275
05276
05277
05278
05279
05280 int cvrt_str_to_cn(char *str,
05281 int type_idx)
05282
05283 {
05284 int cn_idx;
05285 int len;
05286 boolean ok = TRUE;
05287 token_type save_token;
05288
05289 TRACE (Func_Entry, "cvrt_str_to_cn", NULL);
05290
05291 save_token = token;
05292
05293 strcpy(const_buf, str);
05294 len = strlen(str);
05295
05296 switch (TYP_LINEAR(type_idx)) {
05297 case Integer_1 :
05298 case Integer_2 :
05299 case Integer_4 :
05300 case Integer_8 :
05301 CONVERT_INT_CONST(type_idx, len, ok);
05302 break;
05303
05304 case Real_4 :
05305 CONVERT_REAL_CONST(type_idx, len, ok);
05306 break;
05307
05308 case Real_8 :
05309 # ifdef _TARGET64
05310 CONVERT_REAL_CONST(type_idx, len, ok);
05311 # else
05312 CONVERT_DBL_CONST(type_idx, len, ok);
05313 # endif
05314 break;
05315
05316 case Real_16 :
05317 CONVERT_DBL_CONST(type_idx, len, ok);
05318 break;
05319
05320 default :
05321 PRINTMSG(stmt_start_line, 1190, Internal, 0);
05322 break;
05323 }
05324
05325 if (! ok) {
05326 PRINTMSG(stmt_start_line, 1190, Internal, 0);
05327 }
05328
05329 cn_idx = TOKEN_CONST_TBL_IDX(token);
05330
05331 token = save_token;
05332
05333 TRACE (Func_Exit, "cvrt_str_to_cn", NULL);
05334
05335 return(cn_idx);
05336
05337 }
05338
05339
05340
05341
05342
05343
05344
05345
05346
05347
05348
05349
05350
05351
05352
05353
05354
05355 void set_up_token_tables(void)
05356
05357 {
05358 int i;
05359 int len;
05360
05361 TRACE (Func_Entry, "set_up_token_tables", NULL);
05362
05363
05364
05365
05366
05367 len = 0;
05368
05369 while (dot_op[len].value != Tok_LAST) {
05370 len++;
05371 }
05372
05373 len++;
05374
05375 dot_op_len = malloc(sizeof(int) * len);
05376
05377 for (i = 0; i < len; i++) {
05378 dot_op_len[i] = strlen(dot_op[i].name);
05379 }
05380
05381 set_up_letter_idx_table(dot_op_idx, dot_op, len);
05382
05383
05384
05385
05386
05387 len = 0;
05388
05389 while (kwd[len].value != Tok_LAST) {
05390 len++;
05391 }
05392
05393 len++;
05394
05395 kwd_len = malloc(sizeof(int) * len);
05396
05397 for (i = 0; i < len; i++) {
05398 kwd_len[i] = strlen(kwd[i].name);
05399 }
05400
05401 set_up_letter_idx_table(kwd_idx, kwd, len);
05402
05403
05404
05405
05406
05407
05408
05409 len = 0;
05410
05411 while (kwd_dir[len].value != Tok_LAST) {
05412 len++;
05413 }
05414
05415 len++;
05416
05417 kwd_dir_len = malloc(sizeof(int) * len);
05418
05419 for (i = 0; i < len; i++) {
05420 kwd_dir_len[i] = strlen(kwd_dir[i].name);
05421 }
05422
05423 set_up_letter_idx_table(kwd_dir_idx, kwd_dir, len);
05424
05425
05426
05427
05428
05429 len = 0;
05430
05431 while (kwd_mic[len].value != Tok_LAST) {
05432 len++;
05433 }
05434
05435 len++;
05436
05437 kwd_mic_len = malloc(sizeof(int) * len);
05438
05439 for (i = 0; i < len; i++) {
05440 kwd_mic_len[i] = strlen(kwd_mic[i].name);
05441 }
05442
05443 set_up_letter_idx_table(kwd_mic_idx, kwd_mic, len);
05444
05445
05446
05447
05448
05449 len = 0;
05450
05451 while (kwd_sgi_dir[len].value != Tok_LAST) {
05452 len++;
05453 }
05454
05455 len++;
05456
05457 kwd_sgi_dir_len = malloc(sizeof(int) * len);
05458
05459 for (i = 0; i < len; i++) {
05460 kwd_sgi_dir_len[i] = strlen(kwd_sgi_dir[i].name);
05461 }
05462
05463 set_up_letter_idx_table(kwd_sgi_dir_idx, kwd_sgi_dir, len);
05464
05465
05466
05467
05468
05469 len = 0;
05470
05471 while (kwd_open_mp_dir[len].value != Tok_LAST) {
05472 len++;
05473 }
05474
05475 len++;
05476
05477 kwd_open_mp_dir_len = malloc(sizeof(int) * len);
05478
05479 for (i = 0; i < len; i++) {
05480 kwd_open_mp_dir_len[i] = strlen(kwd_open_mp_dir[i].name);
05481 }
05482
05483 set_up_letter_idx_table(kwd_open_mp_dir_idx, kwd_open_mp_dir, len);
05484
05485 # ifdef _DEBUG
05486
05487
05488
05489
05490 len = 0;
05491
05492 while (kwd_dbg[len].value != Tok_LAST) {
05493 len++;
05494 }
05495
05496 len++;
05497
05498 kwd_dbg_len = malloc(sizeof(int) * len);
05499
05500 for (i = 0; i < len; i++) {
05501 kwd_dbg_len[i] = strlen(kwd_dbg[i].name);
05502 }
05503
05504 set_up_letter_idx_table(kwd_dbg_idx, kwd_dbg, len);
05505
05506
05507 # endif
05508
05509 TRACE (Func_Exit, "set_up_token_tables", NULL);
05510
05511 return;
05512
05513 }
05514
05515
05516
05517
05518
05519
05520
05521
05522
05523
05524
05525
05526
05527
05528
05529
05530
05531 static void set_up_letter_idx_table(int *idx_tbl,
05532 kwd_type *kwd_tbl,
05533 int len)
05534
05535 {
05536
05537 int i;
05538 int idx;
05539 int k;
05540
05541 TRACE (Func_Entry, "set_up_letter_idx_table", NULL);
05542
05543 for (i = 0; i < 27; i++) {
05544 idx_tbl[i] = len - 1;
05545 }
05546
05547 idx = -1;
05548 for (i = 0; i < len; i++) {
05549 if (kwd_tbl[i].name[0] - 'A' != idx) {
05550 for (k = idx+1; k <= kwd_tbl[i].name[0] - 'A'; k++) {
05551 idx_tbl[k] = i;
05552 }
05553 idx = kwd_tbl[i].name[0] - 'A';
05554 }
05555 }
05556
05557 # if 0
05558 printf("\t\t\t\t%3d,%4d,%4d,%4d,%4d,%4d,%4d, /* A-G */\n",
05559 idx_tbl[0],idx_tbl[1],idx_tbl[2],idx_tbl[3],
05560 idx_tbl[4],idx_tbl[5],idx_tbl[6]);
05561 printf("\t\t\t\t%3d,%4d,%4d,%4d,%4d,%4d,%4d, /* H-N */\n",
05562 idx_tbl[7],idx_tbl[8],idx_tbl[9],idx_tbl[10],
05563 idx_tbl[11],idx_tbl[12],idx_tbl[13]);
05564 printf("\t\t\t\t%3d,%4d,%4d,%4d,%4d,%4d,%4d, /* O-U */\n",
05565 idx_tbl[14],idx_tbl[15],idx_tbl[16],idx_tbl[17],
05566 idx_tbl[18],idx_tbl[19],idx_tbl[20]);
05567 printf("\t\t\t\t%3d,%4d,%4d,%4d,%4d, /* V-Z */\n",
05568 idx_tbl[21],idx_tbl[22],idx_tbl[23],idx_tbl[24],
05569 idx_tbl[25]);
05570 printf("\t\t\t\t%3d }; /* end */\n",
05571 idx_tbl[26]);
05572 # endif
05573
05574
05575 TRACE (Func_Exit, "set_up_letter_idx_table", NULL);
05576
05577 return;
05578
05579 }