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 #include "proj.h"
00036 #include "sta.h"
00037 #include "bad.h"
00038 #include "implic.h"
00039 #include "lex.h"
00040 #include "malloc.h"
00041 #include "stb.h"
00042 #include "stc.h"
00043 #include "std.h"
00044 #include "str.h"
00045 #include "storag.h"
00046 #include "symbol.h"
00047
00048
00049
00050 ffelexToken ffesta_tokens[FFESTA_tokensMAX];
00051 ffestrFirst ffesta_first_kw;
00052 ffestrSecond ffesta_second_kw;
00053 mallocPool ffesta_output_pool;
00054 mallocPool ffesta_scratch_pool;
00055 ffelexToken ffesta_construct_name;
00056 ffelexToken ffesta_label_token;
00057 bool ffesta_seen_first_exec;
00058 bool ffesta_is_entry_valid = FALSE;
00059 bool ffesta_line_has_semicolons = FALSE;
00060
00061
00062
00063 #define FFESTA_ABORT_ON_CONFIRM_ 1
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 #define FFESTA_maxPOSSIBLES_ 8
00082
00083
00084
00085 typedef struct _ffesta_possible_ *ffestaPossible_;
00086
00087
00088
00089
00090
00091
00092 struct _ffesta_possible_
00093 {
00094 ffestaPossible_ next;
00095 ffestaPossible_ previous;
00096 ffelexHandler handler;
00097 bool named;
00098 };
00099
00100 struct _ffesta_possible_root_
00101 {
00102 ffestaPossible_ first;
00103 ffestaPossible_ last;
00104 ffelexHandler nil;
00105 };
00106
00107
00108
00109 static bool ffesta_is_inhibited_ = FALSE;
00110 static ffelexToken ffesta_token_0_;
00111
00112 static ffestaPossible_ ffesta_possibles_[FFESTA_maxPOSSIBLES_];
00113 static int ffesta_num_possibles_ = 0;
00114 static struct _ffesta_possible_root_ ffesta_possible_nonexecs_;
00115 static struct _ffesta_possible_root_ ffesta_possible_execs_;
00116 static ffestaPossible_ ffesta_current_possible_;
00117 static ffelexHandler ffesta_current_handler_;
00118 static bool ffesta_confirmed_current_ = FALSE;
00119 static bool ffesta_confirmed_other_ = FALSE;
00120 static ffestaPossible_ ffesta_confirmed_possible_;
00121 static bool ffesta_current_shutdown_ = FALSE;
00122 #if !FFESTA_ABORT_ON_CONFIRM_
00123 static bool ffesta_is_two_into_statement_ = FALSE;
00124 static ffelexToken ffesta_twotokens_1_;
00125 static ffelexToken ffesta_twotokens_2_;
00126 #endif
00127 static ffestaPooldisp ffesta_outpooldisp_;
00128
00129 static bool ffesta_inhibit_confirmation_ = FALSE;
00130
00131
00132
00133 static void ffesta_add_possible_ (ffelexHandler fn, bool exec, bool named);
00134 static bool ffesta_inhibited_exec_transition_ (void);
00135 static void ffesta_reset_possibles_ (void);
00136 static ffelexHandler ffesta_save_ (ffelexToken t);
00137 static ffelexHandler ffesta_second_ (ffelexToken t);
00138 #if !FFESTA_ABORT_ON_CONFIRM_
00139 static ffelexHandler ffesta_send_two_ (ffelexToken t);
00140 #endif
00141
00142
00143
00144 #define ffesta_add_possible_exec_(fn) (ffesta_add_possible_ (fn, TRUE, TRUE))
00145 #define ffesta_add_possible_nonexec_(fn) (ffesta_add_possible_ (fn, FALSE, TRUE))
00146 #define ffesta_add_possible_unnamed_exec_(fn) (ffesta_add_possible_ (fn, TRUE, FALSE))
00147 #define ffesta_add_possible_unnamed_nonexec_(fn) (ffesta_add_possible_ (fn, FALSE, FALSE))
00148
00149
00150
00151 static void
00152 ffesta_add_possible_ (ffelexHandler fn, bool exec, bool named)
00153 {
00154 ffestaPossible_ p;
00155
00156 assert (ffesta_num_possibles_ < FFESTA_maxPOSSIBLES_);
00157
00158 p = ffesta_possibles_[ffesta_num_possibles_++];
00159
00160 if (exec)
00161 {
00162 p->next = (ffestaPossible_) &ffesta_possible_execs_.first;
00163 p->previous = ffesta_possible_execs_.last;
00164 }
00165 else
00166 {
00167 p->next = (ffestaPossible_) &ffesta_possible_nonexecs_.first;
00168 p->previous = ffesta_possible_nonexecs_.last;
00169 }
00170 p->next->previous = p;
00171 p->previous->next = p;
00172
00173 p->handler = fn;
00174 p->named = named;
00175 }
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 static bool
00186 ffesta_inhibited_exec_transition_ ()
00187 {
00188 bool result;
00189
00190 assert (ffebad_inhibit ());
00191 assert (ffesta_is_inhibited_);
00192
00193 ffebad_set_inhibit (FALSE);
00194 ffesta_is_inhibited_ = FALSE;
00195
00196 result = ffestc_exec_transition ();
00197
00198 ffebad_set_inhibit (TRUE);
00199 ffesta_is_inhibited_ = TRUE;
00200
00201 return result;
00202 }
00203
00204
00205
00206
00207
00208
00209
00210 static void
00211 ffesta_reset_possibles_ ()
00212 {
00213 ffesta_num_possibles_ = 0;
00214
00215 ffesta_possible_execs_.first = ffesta_possible_execs_.last
00216 = (ffestaPossible_) &ffesta_possible_execs_.first;
00217 ffesta_possible_nonexecs_.first = ffesta_possible_nonexecs_.last
00218 = (ffestaPossible_) &ffesta_possible_nonexecs_.first;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 static ffelexHandler
00234 ffesta_save_ (ffelexToken t)
00235 {
00236 static ffelexToken *saved_tokens = NULL;
00237 static unsigned int num_saved_tokens = 0;
00238 static unsigned int max_saved_tokens = 0;
00239 unsigned int toknum;
00240 ffelexToken eos;
00241
00242 ffelexToken t2;
00243
00244
00245
00246
00247 if (saved_tokens == NULL)
00248 {
00249 saved_tokens
00250 = (ffelexToken *) malloc_new_ksr (malloc_pool_image (),
00251 "FFEST Saved Tokens",
00252 (max_saved_tokens = 8) * sizeof (ffelexToken));
00253
00254 }
00255 else if (num_saved_tokens >= max_saved_tokens)
00256 {
00257 toknum = max_saved_tokens;
00258 max_saved_tokens <<= 1;
00259 assert (max_saved_tokens > toknum);
00260 saved_tokens
00261 = (ffelexToken *) malloc_resize_ksr (malloc_pool_image (),
00262 saved_tokens,
00263 max_saved_tokens * sizeof (ffelexToken),
00264 toknum * sizeof (ffelexToken));
00265 }
00266
00267 *(saved_tokens + num_saved_tokens++) = ffelex_token_use (t);
00268
00269
00270
00271 ffesta_current_handler_ = (ffelexHandler) (*ffesta_current_handler_) (t);
00272
00273
00274
00275
00276 if ((ffesta_current_shutdown_ || (FFESTA_ABORT_ON_CONFIRM_
00277 && ffesta_confirmed_current_))
00278 && !ffelex_expecting_character ())
00279 {
00280 switch (ffelex_token_type (t))
00281 {
00282 case FFELEX_typeEOS:
00283 case FFELEX_typeSEMICOLON:
00284 break;
00285
00286 default:
00287 eos = ffelex_token_new_eos (ffelex_token_where_line (t),
00288 ffelex_token_where_column (t));
00289 ffesta_inhibit_confirmation_ = ffesta_current_shutdown_;
00290 (*ffesta_current_handler_) (eos);
00291 ffesta_inhibit_confirmation_ = FALSE;
00292 ffelex_token_kill (eos);
00293 break;
00294 }
00295 }
00296 else
00297 {
00298
00299
00300
00301
00302 switch (ffelex_token_type (t))
00303 {
00304 case FFELEX_typeEOS:
00305 case FFELEX_typeSEMICOLON:
00306 break;
00307
00308 default:
00309 return (ffelexHandler) ffesta_save_;
00310 }
00311 }
00312
00313 next_handler:
00314
00315
00316
00317
00318
00319
00320
00321 if (ffesta_current_shutdown_)
00322 ffesta_current_shutdown_ = FALSE;
00323 else
00324 assert (ffesta_confirmed_current_);
00325
00326 if (ffesta_confirmed_current_)
00327 {
00328 ffesta_confirmed_current_ = FALSE;
00329 ffesta_confirmed_other_ = TRUE;
00330 }
00331
00332
00333
00334 ffesta_current_possible_ = ffesta_current_possible_->next;
00335 ffesta_current_handler_ = ffesta_current_possible_->handler;
00336 if (ffesta_current_handler_ == NULL)
00337 {
00338
00339 if (ffesta_current_possible_
00340 == (ffestaPossible_) &ffesta_possible_nonexecs_)
00341 {
00342 ffesta_current_possible_ = ffesta_possible_execs_.first;
00343 ffesta_current_handler_ = ffesta_current_possible_->handler;
00344 }
00345 if ((ffesta_current_handler_ == NULL)
00346 || (!ffesta_seen_first_exec
00347 && ((ffesta_confirmed_possible_ != NULL)
00348 || !ffesta_inhibited_exec_transition_ ())))
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365 {
00366
00367 ffebad_set_inhibit (FALSE);
00368 ffesta_is_inhibited_ = FALSE;
00369 ffesta_confirmed_other_ = FALSE;
00370 ffesta_tokens[0] = ffesta_token_0_;
00371 if (ffesta_confirmed_possible_ == NULL)
00372 {
00373
00374
00375 ffestaPossible_ possible = ffesta_possible_nonexecs_.first;
00376 ffestaPossible_ first = NULL;
00377 ffestaPossible_ first_named = NULL;
00378 ffestaPossible_ first_exec = NULL;
00379
00380 for (;;)
00381 {
00382 if (possible->handler == NULL)
00383 {
00384 if (possible == (ffestaPossible_) &ffesta_possible_nonexecs_)
00385 {
00386 possible = first_exec = ffesta_possible_execs_.first;
00387 continue;
00388 }
00389 else
00390 break;
00391 }
00392 if (first == NULL)
00393 first = possible;
00394 if (possible->named
00395 && (first_named == NULL))
00396 first_named = possible;
00397
00398 possible = possible->next;
00399 }
00400
00401 if (first_named != NULL)
00402 ffesta_current_possible_ = first_named;
00403 else if (ffesta_seen_first_exec
00404 && (first_exec != NULL))
00405 ffesta_current_possible_ = first_exec;
00406 else
00407 ffesta_current_possible_ = first;
00408
00409 ffesta_current_handler_ = ffesta_current_possible_->handler;
00410 assert (ffesta_current_handler_ != NULL);
00411 }
00412 else
00413 {
00414 ffesta_current_possible_ = ffesta_confirmed_possible_;
00415 ffesta_current_handler_ = ffesta_confirmed_possible_->handler;
00416 }
00417 ffesta_reset_possibles_ ();
00418 }
00419 else
00420 {
00421
00422 ffesta_tokens[0] = ffelex_token_use (ffesta_token_0_);
00423 ffesymbol_set_retractable (ffesta_scratch_pool);
00424 }
00425 }
00426 else
00427 {
00428 ffesta_tokens[0] = ffelex_token_use (ffesta_token_0_);
00429 ffesymbol_set_retractable (ffesta_scratch_pool);
00430 }
00431
00432
00433
00434
00435 for (toknum = 0; toknum < num_saved_tokens; ++toknum)
00436 {
00437 t = *(saved_tokens + toknum);
00438 switch (ffelex_token_type (t))
00439 {
00440 case FFELEX_typeCHARACTER:
00441 ffelex_set_expecting_hollerith (0, '\0',
00442 ffewhere_line_unknown (),
00443 ffewhere_column_unknown ());
00444 ffesta_current_handler_
00445 = (ffelexHandler) (*ffesta_current_handler_) (t);
00446 break;
00447
00448 case FFELEX_typeNAMES:
00449 if (ffelex_is_names_expected ())
00450 ffesta_current_handler_
00451 = (ffelexHandler) (*ffesta_current_handler_) (t);
00452 else
00453 {
00454 t2 = ffelex_token_name_from_names (t, 0, 0);
00455 ffesta_current_handler_
00456 = (ffelexHandler) (*ffesta_current_handler_) (t2);
00457 ffelex_token_kill (t2);
00458 }
00459 break;
00460
00461 default:
00462 ffesta_current_handler_
00463 = (ffelexHandler) (*ffesta_current_handler_) (t);
00464 break;
00465 }
00466
00467 if (!ffesta_is_inhibited_)
00468 ffelex_token_kill (t);
00469
00470
00471
00472 else if ((ffesta_current_shutdown_ || (FFESTA_ABORT_ON_CONFIRM_
00473 && ffesta_confirmed_current_))
00474 && !ffelex_expecting_character ())
00475 {
00476 switch (ffelex_token_type (t))
00477 {
00478 case FFELEX_typeEOS:
00479 case FFELEX_typeSEMICOLON:
00480 break;
00481
00482 default:
00483 eos = ffelex_token_new_eos (ffelex_token_where_line (t),
00484 ffelex_token_where_column (t));
00485 ffesta_inhibit_confirmation_ = ffesta_current_shutdown_;
00486 (*ffesta_current_handler_) (eos);
00487 ffesta_inhibit_confirmation_ = FALSE;
00488 ffelex_token_kill (eos);
00489 break;
00490 }
00491 goto next_handler;
00492 }
00493 }
00494
00495
00496
00497
00498
00499
00500 if (ffesta_is_inhibited_)
00501 {
00502 switch (ffelex_token_type (t))
00503 {
00504 case FFELEX_typeEOS:
00505 case FFELEX_typeSEMICOLON:
00506 goto next_handler;
00507
00508 default:
00509 #if FFESTA_ABORT_ON_CONFIRM_
00510 assert (!ffesta_confirmed_other_);
00511 #endif
00512 return (ffelexHandler) ffesta_save_;
00513 }
00514 }
00515
00516
00517
00518
00519 num_saved_tokens = 0;
00520 #if !FFESTA_ABORT_ON_CONFIRM_
00521 if (ffesta_is_two_into_statement_)
00522 {
00523
00524 ffelexHandler next;
00525
00526 ffesta_is_two_into_statement_ = FALSE;
00527 next = (ffelexHandler) ffesta_first (ffesta_twotokens_1_);
00528 ffelex_token_kill (ffesta_twotokens_1_);
00529 next = (ffelexHandler) (*next) (ffesta_twotokens_2_);
00530 ffelex_token_kill (ffesta_twotokens_2_);
00531 return (ffelexHandler) next;
00532 }
00533 #endif
00534
00535 assert (ffesta_current_handler_ != NULL);
00536 return (ffelexHandler) ffesta_current_handler_;
00537 }
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577 static ffelexHandler
00578 ffesta_second_ (ffelexToken t)
00579 {
00580 ffelexHandler next;
00581 ffesymbol s;
00582
00583 assert (ffelex_token_type (t) != FFELEX_typeNAMES);
00584
00585 if (ffelex_token_type (t) == FFELEX_typeNAME)
00586 ffesta_second_kw = ffestr_second (t);
00587
00588
00589
00590
00591
00592
00593 switch (ffesta_first_kw)
00594 {
00595 #if FFESTR_VXT
00596 case FFESTR_firstACCEPT:
00597 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_V019);
00598 break;
00599 #endif
00600
00601 #if FFESTR_F90
00602 case FFESTR_firstALLOCATABLE:
00603 ffestb_args.dimlist.len = FFESTR_firstlALLOCATABLE;
00604 ffestb_args.dimlist.badname = "ALLOCATABLE";
00605 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_dimlist);
00606 break;
00607 #endif
00608
00609 #if FFESTR_F90
00610 case FFESTR_firstALLOCATE:
00611 ffestb_args.heap.len = FFESTR_firstlALLOCATE;
00612 ffestb_args.heap.badname = "ALLOCATE";
00613 ffestb_args.heap.ctx = FFEEXPR_contextALLOCATE;
00614 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_heap);
00615 break;
00616 #endif
00617
00618 case FFESTR_firstASSIGN:
00619 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R838);
00620 break;
00621
00622 case FFESTR_firstBACKSPACE:
00623 ffestb_args.beru.len = FFESTR_firstlBACKSPACE;
00624 ffestb_args.beru.badname = "BACKSPACE";
00625 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_beru);
00626 break;
00627
00628 case FFESTR_firstBLOCK:
00629 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_block);
00630 break;
00631
00632 case FFESTR_firstBLOCKDATA:
00633 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_blockdata);
00634 break;
00635
00636 case FFESTR_firstBYTE:
00637 ffestb_args.decl.len = FFESTR_firstlBYTE;
00638 ffestb_args.decl.type = FFESTP_typeBYTE;
00639 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_gentype);
00640 break;
00641
00642 case FFESTR_firstCALL:
00643 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R1212);
00644 break;
00645
00646 case FFESTR_firstCASE:
00647 case FFESTR_firstCASEDEFAULT:
00648 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R810);
00649 break;
00650
00651 case FFESTR_firstCHRCTR:
00652 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_chartype);
00653 break;
00654
00655 case FFESTR_firstCLOSE:
00656 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R907);
00657 break;
00658
00659 case FFESTR_firstCOMMON:
00660 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R547);
00661 break;
00662
00663 case FFESTR_firstCMPLX:
00664 ffestb_args.decl.len = FFESTR_firstlCMPLX;
00665 ffestb_args.decl.type = FFESTP_typeCOMPLEX;
00666 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_gentype);
00667 break;
00668
00669 #if FFESTR_F90
00670 case FFESTR_firstCONTAINS:
00671 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R1228);
00672 break;
00673 #endif
00674
00675 case FFESTR_firstCONTINUE:
00676 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R841);
00677 break;
00678
00679 case FFESTR_firstCYCLE:
00680 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R834);
00681 break;
00682
00683 case FFESTR_firstDATA:
00684 if (ffe_is_pedantic_not_90 ())
00685 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R528);
00686 else
00687 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R528);
00688 break;
00689
00690 #if FFESTR_F90
00691 case FFESTR_firstDEALLOCATE:
00692 ffestb_args.heap.len = FFESTR_firstlDEALLOCATE;
00693 ffestb_args.heap.badname = "DEALLOCATE";
00694 ffestb_args.heap.ctx = FFEEXPR_contextDEALLOCATE;
00695 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_heap);
00696 break;
00697 #endif
00698
00699 #if FFESTR_VXT
00700 case FFESTR_firstDECODE:
00701 ffestb_args.vxtcode.len = FFESTR_firstlDECODE;
00702 ffestb_args.vxtcode.badname = "DECODE";
00703 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_vxtcode);
00704 break;
00705 #endif
00706
00707 #if FFESTR_VXT
00708 case FFESTR_firstDEFINEFILE:
00709 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_V025);
00710 break;
00711
00712 case FFESTR_firstDELETE:
00713 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_V021);
00714 break;
00715 #endif
00716 case FFESTR_firstDIMENSION:
00717 ffestb_args.R524.len = FFESTR_firstlDIMENSION;
00718 ffestb_args.R524.badname = "DIMENSION";
00719 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R524);
00720 break;
00721
00722 case FFESTR_firstDO:
00723 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_do);
00724 break;
00725
00726 case FFESTR_firstDBL:
00727 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_double);
00728 break;
00729
00730 case FFESTR_firstDBLCMPLX:
00731 ffestb_args.decl.len = FFESTR_firstlDBLCMPLX;
00732 ffestb_args.decl.type = FFESTP_typeDBLCMPLX;
00733 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_dbltype);
00734 break;
00735
00736 case FFESTR_firstDBLPRCSN:
00737 ffestb_args.decl.len = FFESTR_firstlDBLPRCSN;
00738 ffestb_args.decl.type = FFESTP_typeDBLPRCSN;
00739 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_dbltype);
00740 break;
00741
00742 case FFESTR_firstDOWHILE:
00743 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_dowhile);
00744 break;
00745
00746 case FFESTR_firstELSE:
00747 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_else);
00748 break;
00749
00750 case FFESTR_firstELSEIF:
00751 ffestb_args.elsexyz.second = FFESTR_secondIF;
00752 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_elsexyz);
00753 break;
00754
00755 #if FFESTR_F90
00756 case FFESTR_firstELSEWHERE:
00757 ffestb_args.elsexyz.second = FFESTR_secondWHERE;
00758 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_elsexyz);
00759 break;
00760 #endif
00761
00762 #if FFESTR_VXT
00763 case FFESTR_firstENCODE:
00764 ffestb_args.vxtcode.len = FFESTR_firstlENCODE;
00765 ffestb_args.vxtcode.badname = "ENCODE";
00766 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_vxtcode);
00767 break;
00768 #endif
00769
00770 case FFESTR_firstEND:
00771 if ((ffelex_token_type (ffesta_token_0_) == FFELEX_typeNAMES)
00772 || (ffelex_token_type (t) != FFELEX_typeNAME))
00773 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_end);
00774 else
00775 {
00776 switch (ffesta_second_kw)
00777 {
00778 case FFESTR_secondBLOCK:
00779 case FFESTR_secondBLOCKDATA:
00780 case FFESTR_secondDO:
00781 case FFESTR_secondFILE:
00782 case FFESTR_secondFUNCTION:
00783 case FFESTR_secondIF:
00784 #if FFESTR_F90
00785 case FFESTR_secondMODULE:
00786 #endif
00787 case FFESTR_secondPROGRAM:
00788 case FFESTR_secondSELECT:
00789 case FFESTR_secondSUBROUTINE:
00790 #if FFESTR_F90
00791 case FFESTR_secondWHERE:
00792 #endif
00793 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_end);
00794 break;
00795
00796 default:
00797 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_end);
00798 break;
00799 }
00800 }
00801 break;
00802
00803 case FFESTR_firstENDBLOCK:
00804 ffestb_args.endxyz.len = FFESTR_firstlENDBLOCK;
00805 ffestb_args.endxyz.second = FFESTR_secondBLOCK;
00806 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00807 break;
00808
00809 case FFESTR_firstENDBLOCKDATA:
00810 ffestb_args.endxyz.len = FFESTR_firstlENDBLOCKDATA;
00811 ffestb_args.endxyz.second = FFESTR_secondBLOCKDATA;
00812 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00813 break;
00814
00815 case FFESTR_firstENDDO:
00816 ffestb_args.endxyz.len = FFESTR_firstlENDDO;
00817 ffestb_args.endxyz.second = FFESTR_secondDO;
00818 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00819 break;
00820
00821 case FFESTR_firstENDFILE:
00822 ffestb_args.beru.len = FFESTR_firstlENDFILE;
00823 ffestb_args.beru.badname = "ENDFILE";
00824 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_beru);
00825 break;
00826
00827 case FFESTR_firstENDFUNCTION:
00828 ffestb_args.endxyz.len = FFESTR_firstlENDFUNCTION;
00829 ffestb_args.endxyz.second = FFESTR_secondFUNCTION;
00830 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00831 break;
00832
00833 case FFESTR_firstENDIF:
00834 ffestb_args.endxyz.len = FFESTR_firstlENDIF;
00835 ffestb_args.endxyz.second = FFESTR_secondIF;
00836 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00837 break;
00838
00839 #if FFESTR_F90
00840 case FFESTR_firstENDINTERFACE:
00841 ffestb_args.endxyz.len = FFESTR_firstlENDINTERFACE;
00842 ffestb_args.endxyz.second = FFESTR_secondINTERFACE;
00843 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_endxyz);
00844 break;
00845 #endif
00846
00847 #if FFESTR_VXT
00848 case FFESTR_firstENDMAP:
00849 ffestb_args.endxyz.len = FFESTR_firstlENDMAP;
00850 ffestb_args.endxyz.second = FFESTR_secondMAP;
00851 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_endxyz);
00852 break;
00853 #endif
00854
00855 #if FFESTR_F90
00856 case FFESTR_firstENDMODULE:
00857 ffestb_args.endxyz.len = FFESTR_firstlENDMODULE;
00858 ffestb_args.endxyz.second = FFESTR_secondMODULE;
00859 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00860 break;
00861 #endif
00862
00863 case FFESTR_firstENDPROGRAM:
00864 ffestb_args.endxyz.len = FFESTR_firstlENDPROGRAM;
00865 ffestb_args.endxyz.second = FFESTR_secondPROGRAM;
00866 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00867 break;
00868
00869 case FFESTR_firstENDSELECT:
00870 ffestb_args.endxyz.len = FFESTR_firstlENDSELECT;
00871 ffestb_args.endxyz.second = FFESTR_secondSELECT;
00872 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00873 break;
00874
00875 #if FFESTR_VXT
00876 case FFESTR_firstENDSTRUCTURE:
00877 ffestb_args.endxyz.len = FFESTR_firstlENDSTRUCTURE;
00878 ffestb_args.endxyz.second = FFESTR_secondSTRUCTURE;
00879 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_endxyz);
00880 break;
00881 #endif
00882
00883 case FFESTR_firstENDSUBROUTINE:
00884 ffestb_args.endxyz.len = FFESTR_firstlENDSUBROUTINE;
00885 ffestb_args.endxyz.second = FFESTR_secondSUBROUTINE;
00886 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00887 break;
00888
00889 #if FFESTR_F90
00890 case FFESTR_firstENDTYPE:
00891 ffestb_args.endxyz.len = FFESTR_firstlENDTYPE;
00892 ffestb_args.endxyz.second = FFESTR_secondTYPE;
00893 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_endxyz);
00894 break;
00895 #endif
00896
00897 #if FFESTR_VXT
00898 case FFESTR_firstENDUNION:
00899 ffestb_args.endxyz.len = FFESTR_firstlENDUNION;
00900 ffestb_args.endxyz.second = FFESTR_secondUNION;
00901 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_endxyz);
00902 break;
00903 #endif
00904
00905 #if FFESTR_F90
00906 case FFESTR_firstENDWHERE:
00907 ffestb_args.endxyz.len = FFESTR_firstlENDWHERE;
00908 ffestb_args.endxyz.second = FFESTR_secondWHERE;
00909 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_endxyz);
00910 break;
00911 #endif
00912
00913 case FFESTR_firstENTRY:
00914 ffestb_args.dummy.len = FFESTR_firstlENTRY;
00915 ffestb_args.dummy.badname = "ENTRY";
00916 ffestb_args.dummy.is_subr = ffestc_is_entry_in_subr ();
00917 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_dummy);
00918 break;
00919
00920 case FFESTR_firstEQUIVALENCE:
00921 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R544);
00922 break;
00923
00924 case FFESTR_firstEXIT:
00925 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R835);
00926 break;
00927
00928 case FFESTR_firstEXTERNAL:
00929 ffestb_args.varlist.len = FFESTR_firstlEXTERNAL;
00930 ffestb_args.varlist.badname = "EXTERNAL";
00931 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_varlist);
00932 break;
00933
00934 #if FFESTR_VXT
00935 case FFESTR_firstFIND:
00936 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_V026);
00937 break;
00938 #endif
00939
00940
00941
00942
00943
00944
00945
00946 case FFESTR_firstFORMAT:
00947 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R1001);
00948 break;
00949
00950 case FFESTR_firstFUNCTION:
00951 ffestb_args.dummy.len = FFESTR_firstlFUNCTION;
00952 ffestb_args.dummy.badname = "FUNCTION";
00953 ffestb_args.dummy.is_subr = FALSE;
00954 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_dummy);
00955 break;
00956
00957 case FFESTR_firstGOTO:
00958 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_goto);
00959 break;
00960
00961 case FFESTR_firstIF:
00962 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_if);
00963 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R840);
00964 break;
00965
00966 case FFESTR_firstIMPLICIT:
00967 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_R539);
00968 break;
00969
00970 case FFESTR_firstINCLUDE:
00971 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_S3P4);
00972 switch (ffelex_token_type (t))
00973 {
00974 case FFELEX_typeNUMBER:
00975 case FFELEX_typeNAME:
00976 case FFELEX_typeAPOSTROPHE:
00977 case FFELEX_typeQUOTE:
00978 break;
00979
00980 default:
00981 break;
00982 }
00983 break;
00984
00985 case FFESTR_firstINQUIRE:
00986 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R923);
00987 break;
00988
00989 case FFESTR_firstINTGR:
00990 ffestb_args.decl.len = FFESTR_firstlINTGR;
00991 ffestb_args.decl.type = FFESTP_typeINTEGER;
00992 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_gentype);
00993 break;
00994
00995 #if FFESTR_F90
00996 case FFESTR_firstINTENT:
00997 ffestb_args.varlist.len = FFESTR_firstlINTENT;
00998 ffestb_args.varlist.badname = "INTENT";
00999 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_varlist);
01000 break;
01001 #endif
01002
01003 #if FFESTR_F90
01004 case FFESTR_firstINTERFACE:
01005 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R1202);
01006 break;
01007 #endif
01008
01009 case FFESTR_firstINTRINSIC:
01010 ffestb_args.varlist.len = FFESTR_firstlINTRINSIC;
01011 ffestb_args.varlist.badname = "INTRINSIC";
01012 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_varlist);
01013 break;
01014
01015 case FFESTR_firstLGCL:
01016 ffestb_args.decl.len = FFESTR_firstlLGCL;
01017 ffestb_args.decl.type = FFESTP_typeLOGICAL;
01018 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_gentype);
01019 break;
01020
01021 #if FFESTR_VXT
01022 case FFESTR_firstMAP:
01023 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_V012);
01024 break;
01025 #endif
01026
01027 #if FFESTR_F90
01028 case FFESTR_firstMODULE:
01029 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_module);
01030 break;
01031 #endif
01032
01033 case FFESTR_firstNAMELIST:
01034 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R542);
01035 break;
01036
01037 #if FFESTR_F90
01038 case FFESTR_firstNULLIFY:
01039 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R624);
01040 break;
01041 #endif
01042
01043 case FFESTR_firstOPEN:
01044 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R904);
01045 break;
01046
01047 #if FFESTR_F90
01048 case FFESTR_firstOPTIONAL:
01049 ffestb_args.varlist.len = FFESTR_firstlOPTIONAL;
01050 ffestb_args.varlist.badname = "OPTIONAL";
01051 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_varlist);
01052 break;
01053 #endif
01054
01055 case FFESTR_firstPARAMETER:
01056 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R537);
01057 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_V027);
01058 break;
01059
01060 case FFESTR_firstPAUSE:
01061 ffestb_args.halt.len = FFESTR_firstlPAUSE;
01062 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_halt);
01063 break;
01064
01065 #if FFESTR_F90
01066 case FFESTR_firstPOINTER:
01067 ffestb_args.dimlist.len = FFESTR_firstlPOINTER;
01068 ffestb_args.dimlist.badname = "POINTER";
01069 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_dimlist);
01070 break;
01071 #endif
01072
01073 case FFESTR_firstPRINT:
01074 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R911);
01075 break;
01076
01077 #if HARD_F90
01078 case FFESTR_firstPRIVATE:
01079 ffestb_args.varlist.len = FFESTR_firstlPRIVATE;
01080 ffestb_args.varlist.badname = "ACCESS";
01081 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_varlist);
01082 break;
01083 #endif
01084
01085 case FFESTR_firstPROGRAM:
01086 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R1102);
01087 break;
01088
01089 #if HARD_F90
01090 case FFESTR_firstPUBLIC:
01091 ffestb_args.varlist.len = FFESTR_firstlPUBLIC;
01092 ffestb_args.varlist.badname = "ACCESS";
01093 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_varlist);
01094 break;
01095 #endif
01096
01097 case FFESTR_firstREAD:
01098 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R909);
01099 break;
01100
01101 case FFESTR_firstREAL:
01102 ffestb_args.decl.len = FFESTR_firstlREAL;
01103 ffestb_args.decl.type = FFESTP_typeREAL;
01104 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_gentype);
01105 break;
01106
01107 #if FFESTR_VXT
01108 case FFESTR_firstRECORD:
01109 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_V016);
01110 break;
01111 #endif
01112
01113 #if FFESTR_F90
01114 case FFESTR_firstRECURSIVE:
01115 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_recursive);
01116 break;
01117 #endif
01118
01119 case FFESTR_firstRETURN:
01120 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R1227);
01121 break;
01122
01123 case FFESTR_firstREWIND:
01124 ffestb_args.beru.len = FFESTR_firstlREWIND;
01125 ffestb_args.beru.badname = "REWIND";
01126 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_beru);
01127 break;
01128
01129 #if FFESTR_VXT
01130 case FFESTR_firstREWRITE:
01131 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_V018);
01132 break;
01133 #endif
01134
01135 case FFESTR_firstSAVE:
01136 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R522);
01137 break;
01138
01139 case FFESTR_firstSELECT:
01140 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R809);
01141 break;
01142
01143 case FFESTR_firstSELECTCASE:
01144 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R809);
01145 break;
01146
01147 #if HARD_F90
01148 case FFESTR_firstSEQUENCE:
01149 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R423B);
01150 break;
01151 #endif
01152
01153 case FFESTR_firstSTOP:
01154 ffestb_args.halt.len = FFESTR_firstlSTOP;
01155 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_halt);
01156 break;
01157
01158 #if FFESTR_VXT
01159 case FFESTR_firstSTRUCTURE:
01160 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_V003);
01161 break;
01162 #endif
01163
01164 case FFESTR_firstSUBROUTINE:
01165 ffestb_args.dummy.len = FFESTR_firstlSUBROUTINE;
01166 ffestb_args.dummy.badname = "SUBROUTINE";
01167 ffestb_args.dummy.is_subr = TRUE;
01168 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_dummy);
01169 break;
01170
01171 #if FFESTR_F90
01172 case FFESTR_firstTARGET:
01173 ffestb_args.dimlist.len = FFESTR_firstlTARGET;
01174 ffestb_args.dimlist.badname = "TARGET";
01175 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_dimlist);
01176 break;
01177 #endif
01178
01179 case FFESTR_firstTYPE:
01180 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_V020);
01181 break;
01182
01183 #if FFESTR_F90
01184 case FFESTR_firstTYPE:
01185 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_type);
01186 break;
01187 #endif
01188
01189 #if HARD_F90
01190 case FFESTR_firstTYPE:
01191 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_typetype);
01192 break;
01193 #endif
01194
01195 #if FFESTR_VXT
01196 case FFESTR_firstUNLOCK:
01197 ffestb_args.beru.len = FFESTR_firstlUNLOCK;
01198 ffestb_args.beru.badname = "UNLOCK";
01199 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_beru);
01200 break;
01201 #endif
01202
01203 #if FFESTR_VXT
01204 case FFESTR_firstUNION:
01205 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_V009);
01206 break;
01207 #endif
01208
01209 #if FFESTR_F90
01210 case FFESTR_firstUSE:
01211 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R1107);
01212 break;
01213 #endif
01214
01215 case FFESTR_firstVIRTUAL:
01216 ffestb_args.R524.len = FFESTR_firstlVIRTUAL;
01217 ffestb_args.R524.badname = "VIRTUAL";
01218 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_R524);
01219 break;
01220
01221 case FFESTR_firstVOLATILE:
01222 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_V014);
01223 break;
01224
01225 #if HARD_F90
01226 case FFESTR_firstWHERE:
01227 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_where);
01228 break;
01229 #endif
01230
01231 case FFESTR_firstWORD:
01232 ffestb_args.decl.len = FFESTR_firstlWORD;
01233 ffestb_args.decl.type = FFESTP_typeWORD;
01234 ffesta_add_possible_nonexec_ ((ffelexHandler) ffestb_decl_gentype);
01235 break;
01236
01237 case FFESTR_firstWRITE:
01238 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_R910);
01239 break;
01240
01241 default:
01242 break;
01243 }
01244
01245
01246
01247
01248
01249 switch (ffelex_token_type (t))
01250 {
01251 case FFELEX_typeOPEN_PAREN:
01252 s = ffesymbol_lookup_local (ffesta_token_0_);
01253 if (((s == NULL) || (ffesymbol_dims (s) == NULL))
01254 && !ffesta_seen_first_exec)
01255 {
01256 ffesta_add_possible_unnamed_nonexec_ ((ffelexHandler) ffestb_R1229);
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267 if (ffeimplic_peek_symbol_type (s,
01268 ffelex_token_text (ffesta_token_0_))
01269 == FFEINFO_basictypeCHARACTER)
01270 ffesta_add_possible_unnamed_exec_ ((ffelexHandler) ffestb_let);
01271 }
01272 else
01273
01274 ffesta_add_possible_unnamed_exec_ ((ffelexHandler) ffestb_let);
01275 break;
01276
01277 #if FFESTR_F90
01278 case FFELEX_typePERCENT:
01279 #endif
01280 case FFELEX_typeEQUALS:
01281 #if FFESTR_F90
01282 case FFELEX_typePOINTS:
01283 #endif
01284 ffesta_add_possible_unnamed_exec_ ((ffelexHandler) ffestb_let);
01285 break;
01286
01287 case FFELEX_typeCOLON:
01288 ffesta_add_possible_exec_ ((ffelexHandler) ffestb_construct);
01289 break;
01290
01291 default:
01292 ;
01293 }
01294
01295
01296
01297 switch (ffesta_num_possibles_)
01298 {
01299 case 0:
01300 no_stmts:
01301 ffesta_tokens[0] = ffesta_token_0_;
01302 ffesta_ffebad_2t (FFEBAD_UNREC_STMT, ffesta_token_0_, t);
01303 next = (ffelexHandler) ffelex_swallow_tokens (NULL,
01304 (ffelexHandler) ffesta_zero);
01305 break;
01306
01307 case 1:
01308 ffesta_tokens[0] = ffesta_token_0_;
01309 next = ffesta_possible_execs_.first->handler;
01310 if (next == NULL)
01311 {
01312 next = ffesta_possible_nonexecs_.first->handler;
01313 assert (next != NULL);
01314 }
01315 else if (ffesta_seen_first_exec)
01316 ;
01317 else if (!ffestc_exec_transition ())
01318
01319
01320 goto no_stmts;
01321 break;
01322
01323 default:
01324 ffesta_confirmed_possible_ = NULL;
01325 ffesta_current_possible_ = ffesta_possible_nonexecs_.first;
01326 ffesta_current_handler_ = ffesta_current_possible_->handler;
01327 if (ffesta_current_handler_ == NULL)
01328 {
01329 ffesta_current_possible_ = ffesta_possible_execs_.first;
01330 ffesta_current_handler_ = ffesta_current_possible_->handler;
01331 assert (ffesta_current_handler_ != NULL);
01332 if (!ffesta_seen_first_exec)
01333 {
01334 ffesta_tokens[0] = ffesta_token_0_;
01335 if (!ffestc_exec_transition ())
01336 goto no_stmts;
01337 }
01338 }
01339 ffesta_tokens[0] = ffelex_token_use (ffesta_token_0_);
01340 next = (ffelexHandler) ffesta_save_;
01341 ffebad_set_inhibit (TRUE);
01342 ffesta_is_inhibited_ = TRUE;
01343 break;
01344 }
01345
01346 ffesta_output_pool
01347 = malloc_pool_new ("Statement Output", ffe_pool_program_unit (), 1024);
01348 ffesta_scratch_pool
01349 = malloc_pool_new ("Statement Scratch", ffe_pool_program_unit (), 1024);
01350 ffesta_outpooldisp_ = FFESTA_pooldispDISCARD;
01351
01352 if (ffesta_is_inhibited_)
01353 ffesymbol_set_retractable (ffesta_scratch_pool);
01354
01355 ffelex_set_names (FALSE);
01356
01357
01358
01359 return (ffelexHandler) (*next) (t);
01360 }
01361
01362
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376 #if !FFESTA_ABORT_ON_CONFIRM_
01377 static ffelexHandler
01378 ffesta_send_two_ (ffelexToken t)
01379 {
01380 assert ("what am I doing here?" == NULL);
01381 return NULL;
01382 }
01383
01384 #endif
01385
01386
01387
01388
01389
01390
01391
01392
01393 void
01394 ffesta_confirmed ()
01395 {
01396 if (ffesta_inhibit_confirmation_)
01397 return;
01398 ffesta_confirmed_current_ = TRUE;
01399 assert (!ffesta_confirmed_other_
01400 || (ffesta_confirmed_possible_ == ffesta_current_possible_));
01401 ffesta_confirmed_possible_ = ffesta_current_possible_;
01402 }
01403
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417 void
01418 ffesta_eof ()
01419 {
01420 ffesta_tokens[0] = ffelex_token_new_eof ();
01421
01422 ffesta_output_pool
01423 = malloc_pool_new ("Statement Output", ffe_pool_program_unit (), 1024);
01424 ffesta_scratch_pool
01425 = malloc_pool_new ("Statement Scratch", ffe_pool_program_unit (), 1024);
01426 ffesta_outpooldisp_ = FFESTA_pooldispDISCARD;
01427
01428 ffestc_eof ();
01429
01430 if (ffesta_tokens[0] != NULL)
01431 ffelex_token_kill (ffesta_tokens[0]);
01432
01433 if (ffesta_output_pool != NULL)
01434 {
01435 if (ffesta_outpooldisp_ == FFESTA_pooldispDISCARD)
01436 malloc_pool_kill (ffesta_output_pool);
01437 ffesta_output_pool = NULL;
01438 }
01439
01440 if (ffesta_scratch_pool != NULL)
01441 {
01442 malloc_pool_kill (ffesta_scratch_pool);
01443 ffesta_scratch_pool = NULL;
01444 }
01445
01446 if (ffesta_label_token != NULL)
01447 {
01448 ffelex_token_kill (ffesta_label_token);
01449 ffesta_label_token = NULL;
01450 }
01451
01452 if (ffe_is_ffedebug ())
01453 {
01454 ffestorag_report ();
01455 }
01456 }
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466
01467 void
01468 ffesta_ffebad_here_current_stmt (ffebadIndex i)
01469 {
01470 assert (ffesta_tokens[0] != NULL);
01471 ffebad_here (i, ffelex_token_where_line (ffesta_tokens[0]),
01472 ffelex_token_where_column (ffesta_tokens[0]));
01473 }
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490 bool
01491 ffesta_ffebad_start (ffebad errnum)
01492 {
01493 if (!ffesta_is_inhibited_)
01494 {
01495 ffebad_start (errnum);
01496 return TRUE;
01497 }
01498
01499 if (!ffesta_confirmed_current_)
01500 ffesta_current_shutdown_ = TRUE;
01501
01502 return FALSE;
01503 }
01504
01505
01506
01507
01508
01509 ffelexHandler
01510 ffesta_first (ffelexToken t)
01511 {
01512 switch (ffelex_token_type (t))
01513 {
01514 case FFELEX_typeSEMICOLON:
01515 case FFELEX_typeEOS:
01516 ffesta_tokens[0] = ffelex_token_use (t);
01517 if (ffesta_label_token != NULL)
01518 {
01519 ffebad_start (FFEBAD_LABEL_WITHOUT_STMT);
01520 ffebad_here (0, ffelex_token_where_line (ffesta_label_token),
01521 ffelex_token_where_column (ffesta_label_token));
01522 ffebad_string (ffelex_token_text (ffesta_label_token));
01523 ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t));
01524 ffebad_finish ();
01525 }
01526 return (ffelexHandler) ffesta_zero (t);
01527
01528 case FFELEX_typeNAME:
01529 case FFELEX_typeNAMES:
01530 ffesta_token_0_ = ffelex_token_use (t);
01531 ffesta_first_kw = ffestr_first (t);
01532 return (ffelexHandler) ffesta_second_;
01533
01534 case FFELEX_typeNUMBER:
01535 if (ffesta_line_has_semicolons
01536 && !ffe_is_free_form ()
01537 && ffe_is_pedantic ())
01538 {
01539 ffebad_start (FFEBAD_LABEL_WRONG_PLACE);
01540 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
01541 ffebad_string (ffelex_token_text (t));
01542 ffebad_finish ();
01543 }
01544 if (ffesta_label_token == NULL)
01545 {
01546 ffesta_label_token = ffelex_token_use (t);
01547 return (ffelexHandler) ffesta_first;
01548 }
01549 else
01550 {
01551 ffebad_start (FFEBAD_EXTRA_LABEL_DEF);
01552 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
01553 ffebad_string (ffelex_token_text (t));
01554 ffebad_here (1, ffelex_token_where_line (ffesta_label_token),
01555 ffelex_token_where_column (ffesta_label_token));
01556 ffebad_string (ffelex_token_text (ffesta_label_token));
01557 ffebad_finish ();
01558
01559 return (ffelexHandler) ffesta_first;
01560 }
01561
01562 default:
01563 ffesta_tokens[0] = ffelex_token_use (t);
01564 ffebad_start (FFEBAD_STMT_BEGINS_BAD);
01565 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
01566 ffebad_finish ();
01567 return (ffelexHandler) ffelex_swallow_tokens (t,
01568 (ffelexHandler) ffesta_zero);
01569 }
01570 }
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584 void
01585 ffesta_init_0 ()
01586 {
01587 ffestaPossible_ ptr;
01588 int i;
01589
01590 ptr = (ffestaPossible_) malloc_new_kp (malloc_pool_image (),
01591 "FFEST possibles",
01592 FFESTA_maxPOSSIBLES_
01593 * sizeof (*ptr));
01594
01595 for (i = 0; i < FFESTA_maxPOSSIBLES_; ++i)
01596 ffesta_possibles_[i] = ptr++;
01597
01598 ffesta_possible_execs_.first = ffesta_possible_execs_.last
01599 = (ffestaPossible_) &ffesta_possible_execs_.first;
01600 ffesta_possible_nonexecs_.first = ffesta_possible_nonexecs_.last
01601 = (ffestaPossible_) &ffesta_possible_nonexecs_.first;
01602 ffesta_possible_execs_.nil = ffesta_possible_nonexecs_.nil = NULL;
01603 }
01604
01605
01606
01607
01608
01609 void
01610 ffesta_init_3 ()
01611 {
01612 ffesta_output_pool = NULL;
01613 ffesta_scratch_pool = NULL;
01614
01615
01616
01617 ffesta_construct_name = NULL;
01618 ffesta_label_token = NULL;
01619 ffesta_seen_first_exec = FALSE;
01620 }
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644
01645
01646 bool
01647 ffesta_is_inhibited ()
01648 {
01649 assert (ffesta_confirmed_current_ || ffesta_inhibit_confirmation_);
01650 return ffesta_is_inhibited_;
01651 }
01652
01653
01654
01655
01656
01657
01658
01659
01660
01661
01662
01663
01664
01665
01666
01667 void
01668 ffesta_ffebad_1p (ffebad errnum, ffelexToken names_token, ffeTokenLength index,
01669 ffelexToken next_token)
01670 {
01671 ffewhereLine line;
01672 ffewhereColumn col;
01673
01674 assert (index <= ffelex_token_length (names_token));
01675
01676 if (ffesta_ffebad_start (errnum))
01677 {
01678 if (index == ffelex_token_length (names_token))
01679 {
01680 assert (next_token != NULL);
01681 line = ffelex_token_where_line (next_token);
01682 col = ffelex_token_where_column (next_token);
01683 ffebad_here (0, line, col);
01684 }
01685 else
01686 {
01687 ffewhere_set_from_track (&line, &col,
01688 ffelex_token_where_line (names_token),
01689 ffelex_token_where_column (names_token),
01690 ffelex_token_wheretrack (names_token),
01691 index);
01692 ffebad_here (0, line, col);
01693 ffewhere_line_kill (line);
01694 ffewhere_column_kill (col);
01695 }
01696 ffebad_finish ();
01697 }
01698 }
01699
01700 void
01701 ffesta_ffebad_1sp (ffebad errnum, const char *s, ffelexToken names_token,
01702 ffeTokenLength index, ffelexToken next_token)
01703 {
01704 ffewhereLine line;
01705 ffewhereColumn col;
01706
01707 assert (index <= ffelex_token_length (names_token));
01708
01709 if (ffesta_ffebad_start (errnum))
01710 {
01711 ffebad_string (s);
01712 if (index == ffelex_token_length (names_token))
01713 {
01714 assert (next_token != NULL);
01715 line = ffelex_token_where_line (next_token);
01716 col = ffelex_token_where_column (next_token);
01717 ffebad_here (0, line, col);
01718 }
01719 else
01720 {
01721 ffewhere_set_from_track (&line, &col,
01722 ffelex_token_where_line (names_token),
01723 ffelex_token_where_column (names_token),
01724 ffelex_token_wheretrack (names_token),
01725 index);
01726 ffebad_here (0, line, col);
01727 ffewhere_line_kill (line);
01728 ffewhere_column_kill (col);
01729 }
01730 ffebad_finish ();
01731 }
01732 }
01733
01734 void
01735 ffesta_ffebad_1st (ffebad errnum, const char *s, ffelexToken t)
01736 {
01737 if (ffesta_ffebad_start (errnum))
01738 {
01739 ffebad_string (s);
01740 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
01741 ffebad_finish ();
01742 }
01743 }
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753 void
01754 ffesta_ffebad_1t (ffebad errnum, ffelexToken t)
01755 {
01756 if (ffesta_ffebad_start (errnum))
01757 {
01758 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
01759 ffebad_finish ();
01760 }
01761 }
01762
01763 void
01764 ffesta_ffebad_2st (ffebad errnum, const char *s, ffelexToken t1, ffelexToken t2)
01765 {
01766 if (ffesta_ffebad_start (errnum))
01767 {
01768 ffebad_string (s);
01769 ffebad_here (0, ffelex_token_where_line (t1), ffelex_token_where_column (t1));
01770 ffebad_here (1, ffelex_token_where_line (t2), ffelex_token_where_column (t2));
01771 ffebad_finish ();
01772 }
01773 }
01774
01775
01776
01777
01778
01779
01780
01781
01782
01783
01784 void
01785 ffesta_ffebad_2t (ffebad errnum, ffelexToken t1, ffelexToken t2)
01786 {
01787 if (ffesta_ffebad_start (errnum))
01788 {
01789 ffebad_here (0, ffelex_token_where_line (t1), ffelex_token_where_column (t1));
01790 ffebad_here (1, ffelex_token_where_line (t2), ffelex_token_where_column (t2));
01791 ffebad_finish ();
01792 }
01793 }
01794
01795 ffestaPooldisp
01796 ffesta_outpooldisp ()
01797 {
01798 return ffesta_outpooldisp_;
01799 }
01800
01801 void
01802 ffesta_set_outpooldisp (ffestaPooldisp d)
01803 {
01804 ffesta_outpooldisp_ = d;
01805 }
01806
01807
01808
01809
01810 void
01811 ffesta_shutdown ()
01812 {
01813 if (ffesta_is_inhibited_)
01814 ffesta_current_shutdown_ = TRUE;
01815 }
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833
01834
01835 ffelexHandler
01836 ffesta_two (ffelexToken first, ffelexToken second)
01837 {
01838 #if FFESTA_ABORT_ON_CONFIRM_
01839 ffelexHandler next;
01840 #endif
01841
01842 assert ((ffelex_token_type (first) == FFELEX_typeNAME)
01843 || (ffelex_token_type (first) == FFELEX_typeNAMES));
01844 assert (ffesta_tokens[0] != NULL);
01845
01846 if (ffesta_is_inhibited_)
01847 {
01848 ffesta_current_shutdown_ = TRUE;
01849
01850 return (ffelexHandler) ffelex_swallow_tokens (second,
01851 (ffelexHandler) ffesta_zero);
01852 }
01853
01854 ffestw_display_state ();
01855
01856 ffelex_token_kill (ffesta_tokens[0]);
01857
01858 if (ffesta_output_pool != NULL)
01859 {
01860 if (ffesta_outpooldisp_ == FFESTA_pooldispDISCARD)
01861 malloc_pool_kill (ffesta_output_pool);
01862 ffesta_output_pool = NULL;
01863 }
01864
01865 if (ffesta_scratch_pool != NULL)
01866 {
01867 malloc_pool_kill (ffesta_scratch_pool);
01868 ffesta_scratch_pool = NULL;
01869 }
01870
01871 ffesta_reset_possibles_ ();
01872 ffesta_confirmed_current_ = FALSE;
01873
01874
01875
01876
01877
01878
01879
01880
01881
01882
01883
01884
01885
01886
01887
01888
01889
01890
01891
01892
01893 #if FFESTA_ABORT_ON_CONFIRM_
01894
01895
01896 next = (ffelexHandler) ffesta_first (first);
01897 return (ffelexHandler) (*next) (second);
01898 #else
01899 ffesta_twotokens_1_ = ffelex_token_use (first);
01900 ffesta_twotokens_2_ = ffelex_token_use (second);
01901
01902 ffesta_is_two_into_statement_ = TRUE;
01903 return (ffelexHandler) ffesta_send_two_;
01904 #endif
01905 }
01906
01907
01908
01909
01910
01911
01912
01913
01914
01915
01916
01917
01918 ffelexHandler
01919 ffesta_zero (ffelexToken t)
01920 {
01921 assert ((ffelex_token_type (t) == FFELEX_typeEOS)
01922 || (ffelex_token_type (t) == FFELEX_typeSEMICOLON));
01923 assert (ffesta_tokens[0] != NULL);
01924
01925 if (ffesta_is_inhibited_)
01926 ffesymbol_retract (TRUE);
01927 else
01928 ffestw_display_state ();
01929
01930
01931
01932
01933
01934
01935
01936
01937
01938
01939
01940
01941 if (!ffesta_is_inhibited_
01942 && ffesta_seen_first_exec)
01943 {
01944 ffestc_any ();
01945 }
01946
01947 ffelex_token_kill (ffesta_tokens[0]);
01948
01949 if (ffesta_is_inhibited_)
01950 return (ffelexHandler) ffesta_zero;
01951
01952 if (ffesta_output_pool != NULL)
01953 {
01954 if (ffesta_outpooldisp_ == FFESTA_pooldispDISCARD)
01955 malloc_pool_kill (ffesta_output_pool);
01956 ffesta_output_pool = NULL;
01957 }
01958
01959 if (ffesta_scratch_pool != NULL)
01960 {
01961 malloc_pool_kill (ffesta_scratch_pool);
01962 ffesta_scratch_pool = NULL;
01963 }
01964
01965 ffesta_reset_possibles_ ();
01966 ffesta_confirmed_current_ = FALSE;
01967
01968 if (ffelex_token_type (t) == FFELEX_typeSEMICOLON)
01969 {
01970 ffesta_line_has_semicolons = TRUE;
01971 if (ffe_is_pedantic_not_90 ())
01972 {
01973 ffebad_start (FFEBAD_SEMICOLON);
01974 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
01975 ffebad_finish ();
01976 }
01977 }
01978 else
01979 ffesta_line_has_semicolons = FALSE;
01980
01981 if (ffesta_label_token != NULL)
01982 {
01983 ffelex_token_kill (ffesta_label_token);
01984 ffesta_label_token = NULL;
01985 }
01986
01987 if (ffe_is_ffedebug ())
01988 {
01989 ffestorag_report ();
01990 }
01991
01992 ffelex_set_names (TRUE);
01993 return (ffelexHandler) ffesta_first;
01994 }