1 /* stb.c -- Implementation File (module.c template V1.0)
2 Copyright (C) 1995, 1996 Free Software Foundation, Inc.
3 Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
5 This file is part of GNU Fortran.
7 GNU Fortran is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Fortran is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Fortran; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
26 Parses the proper form for statements, builds up expression trees for
27 them, but does not actually implement them. Uses ffebad (primarily via
28 ffesta_ffebad_start) to indicate errors in form. In many cases, an invalid
29 statement form indicates another possible statement needs to be looked at
30 by ffest. In a few cases, a valid statement form might not completely
31 determine the nature of the statement, as in REALFUNCTIONA(B), which is
32 a valid form for either the first statement of a function named A taking
33 an argument named B or for the declaration of a real array named FUNCTIONA
34 with an adjustable size of B. A similar (though somewhat easier) choice
35 must be made for the statement-function-def vs. assignment forms, as in
36 the case of FOO(A) = A+2.0.
38 A given parser consists of one or more state handlers, the first of which
39 is the initial state, and the last of which (for any given input) returns
40 control to a final state handler (ffesta_zero or ffesta_two, explained
41 below). The functions handling the states for a given parser usually have
42 the same names, differing only in the final number, as in ffestb_foo_
43 (handles the initial state), ffestb_foo_1_, ffestb_foo_2_ (handle
44 subsequent states), although liberties sometimes are taken with the "foo"
45 part either when keywords are clarified into given statements or are
46 transferred into other possible areas. (For example, the type-name
47 states can hop over to _dummy_ functions when the FUNCTION or RECURSIVE
48 keywords are seen, though this kind of thing is kept to a minimum.) Only
49 the names without numbers are exported to the rest of ffest; the others
52 Each initial state is provided with the first token in ffesta_tokens[0],
53 which will be killed upon return to the final state (ffesta_zero or
54 ffelex_swallow_tokens passed through to ffesta_zero), so while it may
55 be changed to another token, a valid token must be left there to be
56 killed. Also, a "convenient" array of tokens are left in
57 ffesta_tokens[1..FFESTA_tokensMAX]. The initial state of this set of
58 elements is undefined, thus, if tokens are stored here, they must be
59 killed before returning to the final state. Any parser may also use
60 cross-state local variables by sticking a structure containing storage
61 for those variables in the local union ffestb_local_ (unless the union
62 goes on strike). Furthermore, parsers that handle more than one first or
63 second tokens (like _varlist_, which handles EXTERNAL, INTENT, INTRINSIC,
65 PUBLIC, or PRIVATE, and _endxyz_, which handles ENDBLOCK, ENDBLOCKDATA,
66 ENDDO, ENDIF, and so on) may expect arguments from ffest in the
67 ffest-wide union ffest_args_, the substructure specific to the parser.
69 A parser's responsibility is: to call either ffesta_confirmed or
70 ffest_ffebad_start before returning to the final state; to be the only
71 parser that can possibly call ffesta_confirmed for a given statement;
72 to call ffest_ffebad_start immediately upon recognizing a bad token
73 (specifically one that another statement parser might confirm upon);
74 to call ffestc functions only after calling ffesta_confirmed and only
75 when ffesta_is_inhibited returns FALSE; and to call ffesta_is_inhibited
76 only after calling ffesta_confirmed. Confirm as early as reasonably
77 possible, even when only one ffestc function is called for the statement
78 later on, because early confirmation can enhance the error-reporting
79 capabilities if a subsequent error is detected and this parser isn't
80 the first possibility for the statement.
82 To assist the parser, functions like ffesta_ffebad_1t and _1p_ have
83 been provided to make use of ffest_ffebad_start fairly easy.
103 /* Externals defined here. */
105 struct _ffestb_args_ ffestb_args;
107 /* Simple definitions and enumerations. */
109 #define FFESTB_KILL_EASY_ 1 /* 1 for only one _subr_kill_xyz_ fn. */
111 /* Internal typedefs. */
113 union ffestb_subrargs_u_
117 ffesttTokenList labels; /* Input arg, must not be NULL. */
118 ffelexHandler handler; /* Input arg, call me when done. */
119 bool ok; /* Output arg, TRUE if list ended in
125 ffesttDimList dims; /* Input arg, must not be NULL. */
126 ffelexHandler handler; /* Input arg, call me when done. */
127 mallocPool pool; /* Pool to allocate into. */
128 bool ok; /* Output arg, TRUE if list ended in
130 ffeexprContext ctx; /* DIMLIST or DIMLISTCOMMON. */
131 #ifdef FFECOM_dimensionsMAX
132 int ndims; /* For backends that really can't have
139 ffesttTokenList args; /* Input arg, must not be NULL. */
140 ffelexHandler handler; /* Input arg, call me when done. */
141 ffelexToken close_paren;/* Output arg if ok, CLOSE_PAREN token. */
142 bool is_subr; /* Input arg, TRUE if list in subr-def
144 bool ok; /* Output arg, TRUE if list ended in
146 bool names; /* Do ffelex_set_names(TRUE) before return. */
151 union ffestb_local_u_
166 bool vxtparam; /* If assignment might really be VXT
205 ffesttExprList exprs;
235 ffestpFormatType current; /* What we're currently working on. */
236 ffelexToken t; /* Token of what we're currently working on. */
237 ffesttFormatValue pre;
238 ffesttFormatValue post;
239 ffesttFormatValue dot;
240 ffesttFormatValue exp;
241 bool sign; /* _3_, pos/neg; elsewhere, signed/unsigned. */
242 bool complained; /* If run-time expr seen in nonexec context. */
259 ffesttCaseList cases;
265 ffesttExprList exprs;
273 ffesttExprList exprs;
280 ffestpDefinedOperator operator;
281 bool assignment; /* TRUE for INTERFACE ASSIGNMENT, FALSE for
283 bool slash; /* TRUE if OPEN_ARRAY, FALSE if OPEN_PAREN. */
308 ffeexprContext context;
316 ffeexprContext context;
324 ffeexprContext context;
332 ffeexprContext context;
340 ffeexprContext context;
341 bool may_be_iolength;
349 ffeexprContext context;
357 ffeexprContext context;
365 ffeexprContext context;
373 ffeexprContext context;
381 ffeexprContext context;
409 ffestrFirst first_kw;
415 ffebld kind; /* Kind type parameter, if any. */
416 ffelexToken kindt; /* Kind type first token, if any. */
417 ffebld len; /* Length type parameter, if any. */
418 ffelexToken lent; /* Length type parameter, if any. */
419 ffelexHandler handler;
420 ffelexToken recursive;
422 ffesttTokenList toklist;/* For ambiguity resolution. */
423 ffesttImpList imps; /* List of IMPLICIT letters. */
424 ffelexHandler imp_handler; /* Call if paren list wasn't letters. */
426 ffestrOther kw; /* INTENT(IN/OUT/INOUT). */
428 bool parameter; /* If PARAMETER attribute seen (governs =expr
430 bool coloncolon; /* If COLONCOLON seen (allows =expr). */
431 bool aster_after; /* "*" seen after, not before,
432 [RECURSIVE]FUNCTIONxyz. */
433 bool empty; /* Ambig function dummy arg list empty so
435 bool imp_started; /* Started IMPLICIT statement already. */
436 bool imp_seen_comma; /* TRUE if next COMMA within parens means not
445 }; /* Merge with the one in ffestb later. */
447 /* Private include files. */
450 /* Internal structure definitions. */
453 /* Static objects accessed by functions in this module. */
455 static union ffestb_subrargs_u_ ffestb_subrargs_;
456 static union ffestb_local_u_ ffestb_local_;
458 /* Static functions (internal). */
460 static void ffestb_subr_ambig_to_ents_ (void);
461 static ffelexHandler ffestb_subr_ambig_nope_ (ffelexToken t);
462 static ffelexHandler ffestb_subr_dimlist_ (ffelexToken ft, ffebld expr,
464 static ffelexHandler ffestb_subr_dimlist_1_ (ffelexToken ft, ffebld expr,
466 static ffelexHandler ffestb_subr_dimlist_2_ (ffelexToken ft, ffebld expr,
468 static ffelexHandler ffestb_subr_name_list_ (ffelexToken t);
469 static ffelexHandler ffestb_subr_name_list_1_ (ffelexToken t);
470 static void ffestb_subr_R1001_append_p_ (void);
471 static ffelexHandler ffestb_decl_kindparam_ (ffelexToken t);
472 static ffelexHandler ffestb_decl_kindparam_1_ (ffelexToken t);
473 static ffelexHandler ffestb_decl_kindparam_2_ (ffelexToken ft, ffebld expr,
475 static ffelexHandler ffestb_decl_starkind_ (ffelexToken t);
476 static ffelexHandler ffestb_decl_starlen_ (ffelexToken t);
477 static ffelexHandler ffestb_decl_starlen_1_ (ffelexToken ft, ffebld expr,
479 static ffelexHandler ffestb_decl_typeparams_ (ffelexToken t);
480 static ffelexHandler ffestb_decl_typeparams_1_ (ffelexToken t);
481 static ffelexHandler ffestb_decl_typeparams_2_ (ffelexToken ft, ffebld expr,
483 static ffelexHandler ffestb_decl_typeparams_3_ (ffelexToken ft, ffebld expr,
486 static ffelexHandler ffestb_decl_typetype1_ (ffelexToken t);
487 static ffelexHandler ffestb_decl_typetype2_ (ffelexToken t);
489 static ffelexHandler ffestb_subr_label_list_ (ffelexToken t);
490 static ffelexHandler ffestb_subr_label_list_1_ (ffelexToken t);
491 static ffelexHandler ffestb_do1_ (ffelexToken t);
492 static ffelexHandler ffestb_do2_ (ffelexToken t);
493 static ffelexHandler ffestb_do3_ (ffelexToken t);
494 static ffelexHandler ffestb_do4_ (ffelexToken ft, ffebld expr,
496 static ffelexHandler ffestb_do5_ (ffelexToken t);
497 static ffelexHandler ffestb_do6_ (ffelexToken ft, ffebld expr,
499 static ffelexHandler ffestb_do7_ (ffelexToken ft, ffebld expr,
501 static ffelexHandler ffestb_do8_ (ffelexToken ft, ffebld expr,
503 static ffelexHandler ffestb_do9_ (ffelexToken ft, ffebld expr,
505 static ffelexHandler ffestb_else1_ (ffelexToken t);
506 static ffelexHandler ffestb_else2_ (ffelexToken ft, ffebld expr,
508 static ffelexHandler ffestb_else3_ (ffelexToken t);
509 static ffelexHandler ffestb_else4_ (ffelexToken t);
510 static ffelexHandler ffestb_else5_ (ffelexToken t);
511 static ffelexHandler ffestb_end1_ (ffelexToken t);
512 static ffelexHandler ffestb_end2_ (ffelexToken t);
513 static ffelexHandler ffestb_end3_ (ffelexToken t);
514 static ffelexHandler ffestb_goto1_ (ffelexToken t);
515 static ffelexHandler ffestb_goto2_ (ffelexToken t);
516 static ffelexHandler ffestb_goto3_ (ffelexToken t);
517 static ffelexHandler ffestb_goto4_ (ffelexToken ft, ffebld expr,
519 static ffelexHandler ffestb_goto5_ (ffelexToken ft, ffebld expr,
521 static ffelexHandler ffestb_goto6_ (ffelexToken t);
522 static ffelexHandler ffestb_goto7_ (ffelexToken t);
523 static ffelexHandler ffestb_halt1_ (ffelexToken ft, ffebld expr,
525 static ffelexHandler ffestb_if1_ (ffelexToken ft, ffebld expr,
527 static ffelexHandler ffestb_if2_ (ffelexToken t);
528 static ffelexHandler ffestb_if3_ (ffelexToken t);
529 static ffelexHandler ffestb_let1_ (ffelexToken ft, ffebld expr,
531 static ffelexHandler ffestb_let2_ (ffelexToken ft, ffebld expr,
534 static ffelexHandler ffestb_type1_ (ffelexToken t);
535 static ffelexHandler ffestb_type2_ (ffelexToken t);
536 static ffelexHandler ffestb_type3_ (ffelexToken t);
537 static ffelexHandler ffestb_type4_ (ffelexToken t);
540 static ffelexHandler ffestb_varlist1_ (ffelexToken t);
541 static ffelexHandler ffestb_varlist2_ (ffelexToken t);
542 static ffelexHandler ffestb_varlist3_ (ffelexToken t);
543 static ffelexHandler ffestb_varlist4_ (ffelexToken t);
545 static ffelexHandler ffestb_varlist5_ (ffelexToken t);
546 static ffelexHandler ffestb_varlist6_ (ffelexToken t);
548 static ffelexHandler ffestb_where1_ (ffelexToken ft, ffebld expr,
550 static ffelexHandler ffestb_where2_ (ffelexToken t);
551 static ffelexHandler ffestb_where3_ (ffelexToken t);
553 static ffelexHandler ffestb_R5221_ (ffelexToken t);
554 static ffelexHandler ffestb_R5222_ (ffelexToken t);
555 static ffelexHandler ffestb_R5223_ (ffelexToken t);
556 static ffelexHandler ffestb_R5224_ (ffelexToken t);
557 static ffelexHandler ffestb_R5281_ (ffelexToken ft, ffebld expr,
559 static ffelexHandler ffestb_R5282_ (ffelexToken ft, ffebld expr,
561 static ffelexHandler ffestb_R5283_ (ffelexToken ft, ffebld expr,
563 static ffelexHandler ffestb_R5284_ (ffelexToken t);
564 static ffelexHandler ffestb_R5371_ (ffelexToken ft, ffebld expr,
566 static ffelexHandler ffestb_R5372_ (ffelexToken ft, ffebld expr,
568 static ffelexHandler ffestb_R5373_ (ffelexToken t);
569 static ffelexHandler ffestb_R5421_ (ffelexToken t);
570 static ffelexHandler ffestb_R5422_ (ffelexToken t);
571 static ffelexHandler ffestb_R5423_ (ffelexToken t);
572 static ffelexHandler ffestb_R5424_ (ffelexToken t);
573 static ffelexHandler ffestb_R5425_ (ffelexToken t);
574 static ffelexHandler ffestb_R5441_ (ffelexToken ft, ffebld expr,
576 static ffelexHandler ffestb_R5442_ (ffelexToken ft, ffebld expr,
578 static ffelexHandler ffestb_R5443_ (ffelexToken t);
579 static ffelexHandler ffestb_R5444_ (ffelexToken t);
580 static ffelexHandler ffestb_R8341_ (ffelexToken t);
581 static ffelexHandler ffestb_R8351_ (ffelexToken t);
582 static ffelexHandler ffestb_R8381_ (ffelexToken t);
583 static ffelexHandler ffestb_R8382_ (ffelexToken t);
584 static ffelexHandler ffestb_R8383_ (ffelexToken ft, ffebld expr,
586 static ffelexHandler ffestb_R8401_ (ffelexToken ft, ffebld expr,
588 static ffelexHandler ffestb_R8402_ (ffelexToken t);
589 static ffelexHandler ffestb_R8403_ (ffelexToken t);
590 static ffelexHandler ffestb_R8404_ (ffelexToken t);
591 static ffelexHandler ffestb_R8405_ (ffelexToken t);
592 static ffelexHandler ffestb_R8406_ (ffelexToken t);
593 static ffelexHandler ffestb_R8407_ (ffelexToken t);
594 static ffelexHandler ffestb_R11021_ (ffelexToken t);
595 static ffelexHandler ffestb_R1111_1_ (ffelexToken t);
596 static ffelexHandler ffestb_R1111_2_ (ffelexToken t);
597 static ffelexHandler ffestb_R12121_ (ffelexToken ft, ffebld expr,
599 static ffelexHandler ffestb_R12271_ (ffelexToken ft, ffebld expr,
601 static ffelexHandler ffestb_construct1_ (ffelexToken t);
602 static ffelexHandler ffestb_construct2_ (ffelexToken t);
604 static ffelexHandler ffestb_heap1_ (ffelexToken ft, ffebld expr,
606 static ffelexHandler ffestb_heap2_ (ffelexToken t);
607 static ffelexHandler ffestb_heap3_ (ffelexToken t);
608 static ffelexHandler ffestb_heap4_ (ffelexToken ft, ffebld expr,
610 static ffelexHandler ffestb_heap5_ (ffelexToken t);
613 static ffelexHandler ffestb_module1_ (ffelexToken t);
614 static ffelexHandler ffestb_module2_ (ffelexToken t);
615 static ffelexHandler ffestb_module3_ (ffelexToken t);
617 static ffelexHandler ffestb_R8091_ (ffelexToken t);
618 static ffelexHandler ffestb_R8092_ (ffelexToken ft, ffebld expr,
620 static ffelexHandler ffestb_R8093_ (ffelexToken t);
621 static ffelexHandler ffestb_R8101_ (ffelexToken t);
622 static ffelexHandler ffestb_R8102_ (ffelexToken t);
623 static ffelexHandler ffestb_R8103_ (ffelexToken ft, ffebld expr,
625 static ffelexHandler ffestb_R8104_ (ffelexToken ft, ffebld expr,
627 static ffelexHandler ffestb_R10011_ (ffelexToken t);
628 static ffelexHandler ffestb_R10012_ (ffelexToken t);
629 static ffelexHandler ffestb_R10013_ (ffelexToken t);
630 static ffelexHandler ffestb_R10014_ (ffelexToken t);
631 static ffelexHandler ffestb_R10015_ (ffelexToken t);
632 static ffelexHandler ffestb_R10016_ (ffelexToken t);
633 static ffelexHandler ffestb_R10017_ (ffelexToken t);
634 static ffelexHandler ffestb_R10018_ (ffelexToken t);
635 static ffelexHandler ffestb_R10019_ (ffelexToken t);
636 static ffelexHandler ffestb_R100110_ (ffelexToken t);
637 static ffelexHandler ffestb_R100111_ (ffelexToken t);
638 static ffelexHandler ffestb_R100112_ (ffelexToken t);
639 static ffelexHandler ffestb_R100113_ (ffelexToken t);
640 static ffelexHandler ffestb_R100114_ (ffelexToken t);
641 static ffelexHandler ffestb_R100115_ (ffelexToken ft, ffebld expr,
643 static ffelexHandler ffestb_R100116_ (ffelexToken ft, ffebld expr,
645 static ffelexHandler ffestb_R100117_ (ffelexToken ft, ffebld expr,
647 static ffelexHandler ffestb_R100118_ (ffelexToken ft, ffebld expr,
650 static ffelexHandler ffestb_R11071_ (ffelexToken t);
651 static ffelexHandler ffestb_R11072_ (ffelexToken t);
652 static ffelexHandler ffestb_R11073_ (ffelexToken t);
653 static ffelexHandler ffestb_R11074_ (ffelexToken t);
654 static ffelexHandler ffestb_R11075_ (ffelexToken t);
655 static ffelexHandler ffestb_R11076_ (ffelexToken t);
656 static ffelexHandler ffestb_R11077_ (ffelexToken t);
657 static ffelexHandler ffestb_R11078_ (ffelexToken t);
658 static ffelexHandler ffestb_R11079_ (ffelexToken t);
659 static ffelexHandler ffestb_R110710_ (ffelexToken t);
660 static ffelexHandler ffestb_R110711_ (ffelexToken t);
661 static ffelexHandler ffestb_R110712_ (ffelexToken t);
664 static ffelexHandler ffestb_R12021_ (ffelexToken t);
665 static ffelexHandler ffestb_R12022_ (ffelexToken t);
666 static ffelexHandler ffestb_R12023_ (ffelexToken t);
667 static ffelexHandler ffestb_R12024_ (ffelexToken t);
668 static ffelexHandler ffestb_R12025_ (ffelexToken t);
669 static ffelexHandler ffestb_R12026_ (ffelexToken t);
671 static ffelexHandler ffestb_S3P41_ (ffelexToken ft, ffebld expr,
673 static ffelexHandler ffestb_V0141_ (ffelexToken t);
674 static ffelexHandler ffestb_V0142_ (ffelexToken t);
675 static ffelexHandler ffestb_V0143_ (ffelexToken t);
676 static ffelexHandler ffestb_V0144_ (ffelexToken t);
678 static ffelexHandler ffestb_V0251_ (ffelexToken t);
679 static ffelexHandler ffestb_V0252_ (ffelexToken ft, ffebld expr,
681 static ffelexHandler ffestb_V0253_ (ffelexToken ft, ffebld expr,
683 static ffelexHandler ffestb_V0254_ (ffelexToken ft, ffebld expr,
685 static ffelexHandler ffestb_V0255_ (ffelexToken t);
686 static ffelexHandler ffestb_V0256_ (ffelexToken t);
687 static ffelexHandler ffestb_V0257_ (ffelexToken ft, ffebld expr,
689 static ffelexHandler ffestb_V0258_ (ffelexToken t);
691 #if FFESTB_KILL_EASY_
692 static void ffestb_subr_kill_easy_ (ffestpInquireIx max);
694 static void ffestb_subr_kill_accept_ (void);
695 static void ffestb_subr_kill_beru_ (void);
696 static void ffestb_subr_kill_close_ (void);
697 static void ffestb_subr_kill_delete_ (void);
698 static void ffestb_subr_kill_find_ (void); /* Not written yet. */
699 static void ffestb_subr_kill_inquire_ (void);
700 static void ffestb_subr_kill_open_ (void);
701 static void ffestb_subr_kill_print_ (void);
702 static void ffestb_subr_kill_read_ (void);
703 static void ffestb_subr_kill_rewrite_ (void);
704 static void ffestb_subr_kill_type_ (void);
705 static void ffestb_subr_kill_vxtcode_ (void); /* Not written yet. */
706 static void ffestb_subr_kill_write_ (void);
708 static ffelexHandler ffestb_beru1_ (ffelexToken ft, ffebld expr,
710 static ffelexHandler ffestb_beru2_ (ffelexToken t);
711 static ffelexHandler ffestb_beru3_ (ffelexToken t);
712 static ffelexHandler ffestb_beru4_ (ffelexToken ft, ffebld expr,
714 static ffelexHandler ffestb_beru5_ (ffelexToken t);
715 static ffelexHandler ffestb_beru6_ (ffelexToken t);
716 static ffelexHandler ffestb_beru7_ (ffelexToken ft, ffebld expr,
718 static ffelexHandler ffestb_beru8_ (ffelexToken t);
719 static ffelexHandler ffestb_beru9_ (ffelexToken t);
720 static ffelexHandler ffestb_beru10_ (ffelexToken t);
722 static ffelexHandler ffestb_vxtcode1_ (ffelexToken ft, ffebld expr,
724 static ffelexHandler ffestb_vxtcode2_ (ffelexToken ft, ffebld expr,
726 static ffelexHandler ffestb_vxtcode3_ (ffelexToken ft, ffebld expr,
728 static ffelexHandler ffestb_vxtcode4_ (ffelexToken t);
729 static ffelexHandler ffestb_vxtcode5_ (ffelexToken t);
730 static ffelexHandler ffestb_vxtcode6_ (ffelexToken ft, ffebld expr,
732 static ffelexHandler ffestb_vxtcode7_ (ffelexToken t);
733 static ffelexHandler ffestb_vxtcode8_ (ffelexToken t);
734 static ffelexHandler ffestb_vxtcode9_ (ffelexToken t);
735 static ffelexHandler ffestb_vxtcode10_ (ffelexToken ft, ffebld expr,
738 static ffelexHandler ffestb_R9041_ (ffelexToken t);
739 static ffelexHandler ffestb_R9042_ (ffelexToken t);
740 static ffelexHandler ffestb_R9043_ (ffelexToken ft, ffebld expr,
742 static ffelexHandler ffestb_R9044_ (ffelexToken t);
743 static ffelexHandler ffestb_R9045_ (ffelexToken t);
744 static ffelexHandler ffestb_R9046_ (ffelexToken ft, ffebld expr,
746 static ffelexHandler ffestb_R9047_ (ffelexToken t);
747 static ffelexHandler ffestb_R9048_ (ffelexToken t);
748 static ffelexHandler ffestb_R9049_ (ffelexToken t);
749 static ffelexHandler ffestb_R9071_ (ffelexToken t);
750 static ffelexHandler ffestb_R9072_ (ffelexToken t);
751 static ffelexHandler ffestb_R9073_ (ffelexToken ft, ffebld expr,
753 static ffelexHandler ffestb_R9074_ (ffelexToken t);
754 static ffelexHandler ffestb_R9075_ (ffelexToken t);
755 static ffelexHandler ffestb_R9076_ (ffelexToken ft, ffebld expr,
757 static ffelexHandler ffestb_R9077_ (ffelexToken t);
758 static ffelexHandler ffestb_R9078_ (ffelexToken t);
759 static ffelexHandler ffestb_R9079_ (ffelexToken t);
760 static ffelexHandler ffestb_R9091_ (ffelexToken ft, ffebld expr,
762 static ffelexHandler ffestb_R9092_ (ffelexToken t);
763 static ffelexHandler ffestb_R9093_ (ffelexToken t);
764 static ffelexHandler ffestb_R9094_ (ffelexToken ft, ffebld expr,
766 static ffelexHandler ffestb_R9095_ (ffelexToken t);
767 static ffelexHandler ffestb_R9096_ (ffelexToken t);
768 static ffelexHandler ffestb_R9097_ (ffelexToken ft, ffebld expr,
770 static ffelexHandler ffestb_R9098_ (ffelexToken t);
771 static ffelexHandler ffestb_R9099_ (ffelexToken t);
772 static ffelexHandler ffestb_R90910_ (ffelexToken ft, ffebld expr,
774 static ffelexHandler ffestb_R90911_ (ffelexToken t);
775 static ffelexHandler ffestb_R90912_ (ffelexToken t);
776 static ffelexHandler ffestb_R90913_ (ffelexToken t);
777 static ffelexHandler ffestb_R90914_ (ffelexToken ft, ffebld expr,
779 static ffelexHandler ffestb_R90915_ (ffelexToken ft, ffebld expr,
781 static ffelexHandler ffestb_R9101_ (ffelexToken t);
782 static ffelexHandler ffestb_R9102_ (ffelexToken t);
783 static ffelexHandler ffestb_R9103_ (ffelexToken ft, ffebld expr,
785 static ffelexHandler ffestb_R9104_ (ffelexToken t);
786 static ffelexHandler ffestb_R9105_ (ffelexToken t);
787 static ffelexHandler ffestb_R9106_ (ffelexToken ft, ffebld expr,
789 static ffelexHandler ffestb_R9107_ (ffelexToken t);
790 static ffelexHandler ffestb_R9108_ (ffelexToken t);
791 static ffelexHandler ffestb_R9109_ (ffelexToken ft, ffebld expr,
793 static ffelexHandler ffestb_R91010_ (ffelexToken t);
794 static ffelexHandler ffestb_R91011_ (ffelexToken t);
795 static ffelexHandler ffestb_R91012_ (ffelexToken t);
796 static ffelexHandler ffestb_R91013_ (ffelexToken ft, ffebld expr,
798 static ffelexHandler ffestb_R91014_ (ffelexToken ft, ffebld expr,
800 static ffelexHandler ffestb_R9111_ (ffelexToken ft, ffebld expr,
802 static ffelexHandler ffestb_R9112_ (ffelexToken ft, ffebld expr,
804 static ffelexHandler ffestb_R9231_ (ffelexToken t);
805 static ffelexHandler ffestb_R9232_ (ffelexToken t);
806 static ffelexHandler ffestb_R9233_ (ffelexToken ft, ffebld expr,
808 static ffelexHandler ffestb_R9234_ (ffelexToken t);
809 static ffelexHandler ffestb_R9235_ (ffelexToken t);
810 static ffelexHandler ffestb_R9236_ (ffelexToken ft, ffebld expr,
812 static ffelexHandler ffestb_R9237_ (ffelexToken t);
813 static ffelexHandler ffestb_R9238_ (ffelexToken t);
814 static ffelexHandler ffestb_R9239_ (ffelexToken t);
815 static ffelexHandler ffestb_R92310_ (ffelexToken t);
816 static ffelexHandler ffestb_R92311_ (ffelexToken ft, ffebld expr,
819 static ffelexHandler ffestb_V0181_ (ffelexToken t);
820 static ffelexHandler ffestb_V0182_ (ffelexToken t);
821 static ffelexHandler ffestb_V0183_ (ffelexToken ft, ffebld expr,
823 static ffelexHandler ffestb_V0184_ (ffelexToken t);
824 static ffelexHandler ffestb_V0185_ (ffelexToken t);
825 static ffelexHandler ffestb_V0186_ (ffelexToken ft, ffebld expr,
827 static ffelexHandler ffestb_V0187_ (ffelexToken t);
828 static ffelexHandler ffestb_V0188_ (ffelexToken t);
829 static ffelexHandler ffestb_V0189_ (ffelexToken ft, ffebld expr,
831 static ffelexHandler ffestb_V01810_ (ffelexToken t);
832 static ffelexHandler ffestb_V01811_ (ffelexToken t);
833 static ffelexHandler ffestb_V01812_ (ffelexToken t);
834 static ffelexHandler ffestb_V01813_ (ffelexToken ft, ffebld expr,
836 static ffelexHandler ffestb_V0191_ (ffelexToken ft, ffebld expr,
838 static ffelexHandler ffestb_V0192_ (ffelexToken ft, ffebld expr,
841 static ffelexHandler ffestb_V0201_ (ffelexToken ft, ffebld expr,
843 static ffelexHandler ffestb_V0202_ (ffelexToken ft, ffebld expr,
846 static ffelexHandler ffestb_V0211_ (ffelexToken t);
847 static ffelexHandler ffestb_V0212_ (ffelexToken t);
848 static ffelexHandler ffestb_V0213_ (ffelexToken ft, ffebld expr,
850 static ffelexHandler ffestb_V0214_ (ffelexToken t);
851 static ffelexHandler ffestb_V0215_ (ffelexToken t);
852 static ffelexHandler ffestb_V0216_ (ffelexToken ft, ffebld expr,
854 static ffelexHandler ffestb_V0217_ (ffelexToken t);
855 static ffelexHandler ffestb_V0218_ (ffelexToken t);
856 static ffelexHandler ffestb_V0219_ (ffelexToken t);
857 static ffelexHandler ffestb_V0261_ (ffelexToken t);
858 static ffelexHandler ffestb_V0262_ (ffelexToken t);
859 static ffelexHandler ffestb_V0263_ (ffelexToken ft, ffebld expr,
861 static ffelexHandler ffestb_V0264_ (ffelexToken t);
862 static ffelexHandler ffestb_V0265_ (ffelexToken t);
863 static ffelexHandler ffestb_V0266_ (ffelexToken ft, ffebld expr,
865 static ffelexHandler ffestb_V0267_ (ffelexToken t);
866 static ffelexHandler ffestb_V0268_ (ffelexToken t);
867 static ffelexHandler ffestb_V0269_ (ffelexToken t);
870 static ffelexHandler ffestb_dimlist1_ (ffelexToken t);
871 static ffelexHandler ffestb_dimlist2_ (ffelexToken t);
872 static ffelexHandler ffestb_dimlist3_ (ffelexToken t);
873 static ffelexHandler ffestb_dimlist4_ (ffelexToken t);
875 static ffelexHandler ffestb_dummy1_ (ffelexToken t);
876 static ffelexHandler ffestb_dummy2_ (ffelexToken t);
877 static ffelexHandler ffestb_R5241_ (ffelexToken t);
878 static ffelexHandler ffestb_R5242_ (ffelexToken t);
879 static ffelexHandler ffestb_R5243_ (ffelexToken t);
880 static ffelexHandler ffestb_R5244_ (ffelexToken t);
881 static ffelexHandler ffestb_R5471_ (ffelexToken t);
882 static ffelexHandler ffestb_R5472_ (ffelexToken t);
883 static ffelexHandler ffestb_R5473_ (ffelexToken t);
884 static ffelexHandler ffestb_R5474_ (ffelexToken t);
885 static ffelexHandler ffestb_R5475_ (ffelexToken t);
886 static ffelexHandler ffestb_R5476_ (ffelexToken t);
887 static ffelexHandler ffestb_R5477_ (ffelexToken t);
889 static ffelexHandler ffestb_R6241_ (ffelexToken ft, ffebld expr,
891 static ffelexHandler ffestb_R6242_ (ffelexToken t);
893 static ffelexHandler ffestb_R12291_ (ffelexToken t);
894 static ffelexHandler ffestb_R12292_ (ffelexToken ft, ffebld expr,
896 static ffelexHandler ffestb_decl_chartype1_ (ffelexToken t);
898 static ffelexHandler ffestb_decl_recursive1_ (ffelexToken t);
899 static ffelexHandler ffestb_decl_recursive2_ (ffelexToken t);
900 static ffelexHandler ffestb_decl_recursive3_ (ffelexToken t);
901 static ffelexHandler ffestb_decl_recursive4_ (ffelexToken t);
903 static ffelexHandler ffestb_decl_attrs_ (ffelexToken t);
904 static ffelexHandler ffestb_decl_attrs_1_ (ffelexToken t);
905 static ffelexHandler ffestb_decl_attrs_2_ (ffelexToken t);
907 static ffelexHandler ffestb_decl_attrs_3_ (ffelexToken t);
908 static ffelexHandler ffestb_decl_attrs_4_ (ffelexToken t);
909 static ffelexHandler ffestb_decl_attrs_5_ (ffelexToken t);
910 static ffelexHandler ffestb_decl_attrs_6_ (ffelexToken t);
912 static ffelexHandler ffestb_decl_attrs_7_ (ffelexToken t);
913 static ffelexHandler ffestb_decl_attrsp_ (ffelexToken t);
914 static ffelexHandler ffestb_decl_ents_ (ffelexToken t);
915 static ffelexHandler ffestb_decl_ents_1_ (ffelexToken t);
916 static ffelexHandler ffestb_decl_ents_2_ (ffelexToken t);
917 static ffelexHandler ffestb_decl_ents_3_ (ffelexToken t);
918 static ffelexHandler ffestb_decl_ents_4_ (ffelexToken t);
919 static ffelexHandler ffestb_decl_ents_5_ (ffelexToken t);
920 static ffelexHandler ffestb_decl_ents_6_ (ffelexToken ft, ffebld expr,
922 static ffelexHandler ffestb_decl_ents_7_ (ffelexToken t);
923 static ffelexHandler ffestb_decl_ents_8_ (ffelexToken ft, ffebld expr,
925 static ffelexHandler ffestb_decl_ents_9_ (ffelexToken ft, ffebld expr,
927 static ffelexHandler ffestb_decl_ents_10_ (ffelexToken ft, ffebld expr,
929 static ffelexHandler ffestb_decl_ents_11_ (ffelexToken t);
930 static ffelexHandler ffestb_decl_entsp_ (ffelexToken t);
931 static ffelexHandler ffestb_decl_entsp_1_ (ffelexToken t);
932 static ffelexHandler ffestb_decl_entsp_2_ (ffelexToken t);
933 static ffelexHandler ffestb_decl_entsp_3_ (ffelexToken t);
934 static ffelexHandler ffestb_decl_entsp_4_ (ffelexToken ft, ffebld expr,
936 static ffelexHandler ffestb_decl_entsp_5_ (ffelexToken t);
937 static ffelexHandler ffestb_decl_entsp_6_ (ffelexToken t);
938 static ffelexHandler ffestb_decl_entsp_7_ (ffelexToken t);
939 static ffelexHandler ffestb_decl_entsp_8_ (ffelexToken t);
941 static ffelexHandler ffestb_decl_func_ (ffelexToken t);
943 static ffelexHandler ffestb_decl_funcname_ (ffelexToken t);
944 static ffelexHandler ffestb_decl_funcname_1_ (ffelexToken t);
945 static ffelexHandler ffestb_decl_funcname_2_ (ffelexToken t);
946 static ffelexHandler ffestb_decl_funcname_3_ (ffelexToken ft, ffebld expr,
948 static ffelexHandler ffestb_decl_funcname_4_ (ffelexToken t);
949 static ffelexHandler ffestb_decl_funcname_5_ (ffelexToken t);
950 static ffelexHandler ffestb_decl_funcname_6_ (ffelexToken t);
951 static ffelexHandler ffestb_decl_funcname_7_ (ffelexToken t);
952 static ffelexHandler ffestb_decl_funcname_8_ (ffelexToken t);
953 static ffelexHandler ffestb_decl_funcname_9_ (ffelexToken t);
955 static ffelexHandler ffestb_V0031_ (ffelexToken t);
956 static ffelexHandler ffestb_V0032_ (ffelexToken t);
957 static ffelexHandler ffestb_V0033_ (ffelexToken t);
958 static ffelexHandler ffestb_V0034_ (ffelexToken t);
959 static ffelexHandler ffestb_V0035_ (ffelexToken t);
960 static ffelexHandler ffestb_V0036_ (ffelexToken t);
961 static ffelexHandler ffestb_V0161_ (ffelexToken t);
962 static ffelexHandler ffestb_V0162_ (ffelexToken t);
963 static ffelexHandler ffestb_V0163_ (ffelexToken t);
964 static ffelexHandler ffestb_V0164_ (ffelexToken t);
965 static ffelexHandler ffestb_V0165_ (ffelexToken t);
966 static ffelexHandler ffestb_V0166_ (ffelexToken t);
968 static ffelexHandler ffestb_V0271_ (ffelexToken t);
969 static ffelexHandler ffestb_V0272_ (ffelexToken ft, ffebld expr,
971 static ffelexHandler ffestb_V0273_ (ffelexToken t);
972 static ffelexHandler ffestb_decl_R5391_ (ffelexToken t);
973 static ffelexHandler ffestb_decl_R5392_ (ffelexToken t);
975 static ffelexHandler ffestb_decl_R5393_ (ffelexToken t);
977 static ffelexHandler ffestb_decl_R5394_ (ffelexToken t);
978 static ffelexHandler ffestb_decl_R5395_ (ffelexToken t);
979 static ffelexHandler ffestb_decl_R539letters_ (ffelexToken t);
980 static ffelexHandler ffestb_decl_R539letters_1_ (ffelexToken t);
981 static ffelexHandler ffestb_decl_R539letters_2_ (ffelexToken t);
982 static ffelexHandler ffestb_decl_R539letters_3_ (ffelexToken t);
983 static ffelexHandler ffestb_decl_R539letters_4_ (ffelexToken t);
984 static ffelexHandler ffestb_decl_R539letters_5_ (ffelexToken t);
985 static ffelexHandler ffestb_decl_R539maybe_ (ffelexToken t);
986 static ffelexHandler ffestb_decl_R539maybe_1_ (ffelexToken t);
987 static ffelexHandler ffestb_decl_R539maybe_2_ (ffelexToken t);
988 static ffelexHandler ffestb_decl_R539maybe_3_ (ffelexToken t);
989 static ffelexHandler ffestb_decl_R539maybe_4_ (ffelexToken t);
990 static ffelexHandler ffestb_decl_R539maybe_5_ (ffelexToken t);
992 /* Internal macros. */
994 #if FFESTB_KILL_EASY_
995 #define ffestb_subr_kill_accept_() \
996 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_acceptix)
997 #define ffestb_subr_kill_beru_() \
998 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_beruix)
999 #define ffestb_subr_kill_close_() \
1000 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_closeix)
1001 #define ffestb_subr_kill_delete_() \
1002 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_deleteix)
1003 #define ffestb_subr_kill_find_() \
1004 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_findix)
1005 #define ffestb_subr_kill_inquire_() \
1006 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_inquireix)
1007 #define ffestb_subr_kill_open_() \
1008 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_openix)
1009 #define ffestb_subr_kill_print_() \
1010 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_printix)
1011 #define ffestb_subr_kill_read_() \
1012 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_readix)
1013 #define ffestb_subr_kill_rewrite_() \
1014 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_rewriteix)
1015 #define ffestb_subr_kill_type_() \
1016 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_typeix)
1017 #define ffestb_subr_kill_vxtcode_() \
1018 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_vxtcodeix)
1019 #define ffestb_subr_kill_write_() \
1020 ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_writeix)
1023 /* ffestb_subr_ambig_nope_ -- Cleans up and aborts ambig w/o confirming
1025 ffestb_subr_ambig_nope_();
1027 Switch from ambiguity handling in _entsp_ functions to handling entities
1028 in _ents_ (perform housekeeping tasks). */
1030 static ffelexHandler
1031 ffestb_subr_ambig_nope_ (ffelexToken t)
1033 if (ffestb_local_.decl.recursive != NULL)
1034 ffelex_token_kill (ffestb_local_.decl.recursive);
1035 if (ffestb_local_.decl.kindt != NULL)
1036 ffelex_token_kill (ffestb_local_.decl.kindt);
1037 if (ffestb_local_.decl.lent != NULL)
1038 ffelex_token_kill (ffestb_local_.decl.lent);
1039 ffelex_token_kill (ffesta_tokens[1]);
1040 ffelex_token_kill (ffesta_tokens[2]);
1041 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
1042 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
1043 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1046 /* ffestb_subr_ambig_to_ents_ -- Switches from ambiguity to entity decl
1048 ffestb_subr_ambig_to_ents_();
1050 Switch from ambiguity handling in _entsp_ functions to handling entities
1051 in _ents_ (perform housekeeping tasks). */
1054 ffestb_subr_ambig_to_ents_ ()
1058 nt = ffelex_token_name_from_names (ffesta_tokens[1], 0, 0);
1059 ffelex_token_kill (ffesta_tokens[1]);
1060 ffelex_token_kill (ffesta_tokens[2]);
1061 ffesta_tokens[1] = nt;
1062 if (ffestb_local_.decl.recursive != NULL)
1063 ffelex_token_kill (ffestb_local_.decl.recursive);
1064 if (!ffestb_local_.decl.aster_after)
1066 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
1068 if (!ffesta_is_inhibited ())
1069 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
1070 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
1071 ffestb_local_.decl.len, ffestb_local_.decl.lent);
1072 if (ffestb_local_.decl.kindt != NULL)
1074 ffelex_token_kill (ffestb_local_.decl.kindt);
1075 ffestb_local_.decl.kind = NULL;
1076 ffestb_local_.decl.kindt = NULL;
1078 if (ffestb_local_.decl.lent != NULL)
1080 ffelex_token_kill (ffestb_local_.decl.lent);
1081 ffestb_local_.decl.len = NULL;
1082 ffestb_local_.decl.lent = NULL;
1087 if (!ffesta_is_inhibited ())
1088 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
1089 ffestb_local_.decl.kind, ffestb_local_.decl.kindt, NULL,
1091 if (ffestb_local_.decl.kindt != NULL)
1093 ffelex_token_kill (ffestb_local_.decl.kindt);
1094 ffestb_local_.decl.kind = NULL;
1095 ffestb_local_.decl.kindt = NULL;
1100 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
1102 if (!ffesta_is_inhibited ())
1103 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
1104 ffestb_local_.decl.kind, ffestb_local_.decl.kindt, NULL, NULL);
1105 if (ffestb_local_.decl.kindt != NULL)
1107 ffelex_token_kill (ffestb_local_.decl.kindt);
1108 ffestb_local_.decl.kind = NULL;
1109 ffestb_local_.decl.kindt = NULL;
1112 else if (!ffesta_is_inhibited ())
1113 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
1114 NULL, NULL, NULL, NULL);
1115 /* NAME/NAMES token already in ffesta_tokens[1]. */
1118 /* ffestb_subr_dimlist_ -- OPEN_PAREN expr
1120 (ffestb_subr_dimlist_) // to expression handler
1122 Deal with a dimension list.
1125 Detect too many dimensions if backend wants it. */
1127 static ffelexHandler
1128 ffestb_subr_dimlist_ (ffelexToken ft, ffebld expr, ffelexToken t)
1130 switch (ffelex_token_type (t))
1132 case FFELEX_typeCLOSE_PAREN:
1135 #ifdef FFECOM_dimensionsMAX
1136 if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX)
1138 ffesta_ffebad_1t (FFEBAD_TOO_MANY_DIMS, ft);
1139 ffestb_subrargs_.dim_list.ok = TRUE; /* Not a parse error, really. */
1140 return (ffelexHandler) ffestb_subrargs_.dim_list.handler;
1143 ffestt_dimlist_append (ffestb_subrargs_.dim_list.dims, NULL, expr,
1144 ffelex_token_use (t));
1145 ffestb_subrargs_.dim_list.ok = TRUE;
1146 return (ffelexHandler) ffestb_subrargs_.dim_list.handler;
1148 case FFELEX_typeCOMMA:
1149 if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
1151 #ifdef FFECOM_dimensionsMAX
1152 if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX)
1154 ffesta_ffebad_1t (FFEBAD_TOO_MANY_DIMS, ft);
1155 return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
1156 ffestb_subrargs_.dim_list.ctx,
1157 (ffeexprCallback) ffestb_subr_dimlist_2_);
1160 ffestt_dimlist_append (ffestb_subrargs_.dim_list.dims, NULL, expr,
1161 ffelex_token_use (t));
1162 return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
1163 ffestb_subrargs_.dim_list.ctx,
1164 (ffeexprCallback) ffestb_subr_dimlist_);
1166 case FFELEX_typeCOLON:
1167 if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
1169 #ifdef FFECOM_dimensionsMAX
1170 if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX)
1172 ffesta_ffebad_1t (FFEBAD_TOO_MANY_DIMS, ft);
1173 return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
1174 ffestb_subrargs_.dim_list.ctx,
1175 (ffeexprCallback) ffestb_subr_dimlist_2_);
1178 ffestt_dimlist_append (ffestb_subrargs_.dim_list.dims, expr, NULL,
1179 ffelex_token_use (t)); /* NULL second expr for
1180 now, just plug in. */
1181 return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
1182 ffestb_subrargs_.dim_list.ctx,
1183 (ffeexprCallback) ffestb_subr_dimlist_1_);
1189 ffestb_subrargs_.dim_list.ok = FALSE;
1190 return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t);
1193 /* ffestb_subr_dimlist_1_ -- OPEN_PAREN expr COLON expr
1195 (ffestb_subr_dimlist_1_) // to expression handler
1197 Get the upper bound. */
1199 static ffelexHandler
1200 ffestb_subr_dimlist_1_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
1202 switch (ffelex_token_type (t))
1204 case FFELEX_typeCLOSE_PAREN:
1205 ffestb_subrargs_.dim_list.dims->previous->upper = expr;
1206 ffestb_subrargs_.dim_list.ok = TRUE;
1207 return (ffelexHandler) ffestb_subrargs_.dim_list.handler;
1209 case FFELEX_typeCOMMA:
1210 if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
1212 ffestb_subrargs_.dim_list.dims->previous->upper = expr;
1213 return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
1214 ffestb_subrargs_.dim_list.ctx, (ffeexprCallback) ffestb_subr_dimlist_);
1220 ffestb_subrargs_.dim_list.ok = FALSE;
1221 return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t);
1224 /* ffestb_subr_dimlist_2_ -- OPEN_PAREN too-many-dim-exprs
1226 (ffestb_subr_dimlist_2_) // to expression handler
1228 Get the upper bound. */
1230 static ffelexHandler
1231 ffestb_subr_dimlist_2_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
1233 switch (ffelex_token_type (t))
1235 case FFELEX_typeCLOSE_PAREN:
1236 ffestb_subrargs_.dim_list.ok = TRUE; /* Not a parse error, really. */
1237 return (ffelexHandler) ffestb_subrargs_.dim_list.handler;
1239 case FFELEX_typeCOMMA:
1240 case FFELEX_typeCOLON:
1241 if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
1243 return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
1244 ffestb_subrargs_.dim_list.ctx,
1245 (ffeexprCallback) ffestb_subr_dimlist_2_);
1251 ffestb_subrargs_.dim_list.ok = FALSE;
1252 return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t);
1255 /* ffestb_subr_name_list_ -- Collect a list of name args and close-paren
1257 return ffestb_subr_name_list_; // to lexer after seeing OPEN_PAREN
1259 This implements R1224 in the Fortran 90 spec. The arg list may be
1260 empty, or be a comma-separated list (an optional trailing comma currently
1261 results in a warning but no other effect) of arguments. For functions,
1262 however, "*" is invalid (we implement dummy-arg-name, rather than R1224
1263 dummy-arg, which itself is either dummy-arg-name or "*"). */
1265 static ffelexHandler
1266 ffestb_subr_name_list_ (ffelexToken t)
1268 switch (ffelex_token_type (t))
1270 case FFELEX_typeCLOSE_PAREN:
1271 if (ffestt_tokenlist_count (ffestb_subrargs_.name_list.args) != 0)
1272 { /* Trailing comma, warn. */
1273 ffebad_start (FFEBAD_TRAILING_COMMA);
1274 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
1277 ffestb_subrargs_.name_list.ok = TRUE;
1278 ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
1279 if (ffestb_subrargs_.name_list.names)
1280 ffelex_set_names (TRUE);
1281 return (ffelexHandler) ffestb_subrargs_.name_list.handler;
1283 case FFELEX_typeASTERISK:
1284 if (!ffestb_subrargs_.name_list.is_subr)
1287 case FFELEX_typeNAME:
1288 ffestt_tokenlist_append (ffestb_subrargs_.name_list.args,
1289 ffelex_token_use (t));
1290 return (ffelexHandler) ffestb_subr_name_list_1_;
1296 ffestb_subrargs_.name_list.ok = FALSE;
1297 ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
1298 if (ffestb_subrargs_.name_list.names)
1299 ffelex_set_names (TRUE);
1300 return (ffelexHandler) (*ffestb_subrargs_.name_list.handler) (t);
1303 /* ffestb_subr_name_list_1_ -- NAME or ASTERISK
1305 return ffestb_subr_name_list_1_; // to lexer
1307 The next token must be COMMA or CLOSE_PAREN, either way go to original
1308 state, but only after adding the appropriate name list item. */
1310 static ffelexHandler
1311 ffestb_subr_name_list_1_ (ffelexToken t)
1313 switch (ffelex_token_type (t))
1315 case FFELEX_typeCOMMA:
1316 return (ffelexHandler) ffestb_subr_name_list_;
1318 case FFELEX_typeCLOSE_PAREN:
1319 ffestb_subrargs_.name_list.ok = TRUE;
1320 ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
1321 if (ffestb_subrargs_.name_list.names)
1322 ffelex_set_names (TRUE);
1323 return (ffelexHandler) ffestb_subrargs_.name_list.handler;
1326 ffestb_subrargs_.name_list.ok = FALSE;
1327 ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
1328 if (ffestb_subrargs_.name_list.names)
1329 ffelex_set_names (TRUE);
1330 return (ffelexHandler) (*ffestb_subrargs_.name_list.handler) (t);
1335 ffestb_subr_R1001_append_p_ (void)
1339 if (!ffestb_local_.format.pre.present)
1341 ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_P_SPEC, ffestb_local_.format.t);
1342 ffelex_token_kill (ffestb_local_.format.t);
1346 f = ffestt_formatlist_append (ffestb_local_.format.f);
1347 f->type = FFESTP_formattypeP;
1348 f->t = ffestb_local_.format.t;
1349 f->u.R1010.val = ffestb_local_.format.pre;
1352 /* ffestb_decl_kindparam_ -- "type" OPEN_PAREN
1354 return ffestb_decl_kindparam_; // to lexer
1356 Handle "[KIND=]expr)". */
1358 static ffelexHandler
1359 ffestb_decl_kindparam_ (ffelexToken t)
1361 switch (ffelex_token_type (t))
1363 case FFELEX_typeNAME:
1364 ffesta_tokens[1] = ffelex_token_use (t);
1365 return (ffelexHandler) ffestb_decl_kindparam_1_;
1368 return (ffelexHandler) (*((ffelexHandler)
1369 ffeexpr_rhs (ffesta_output_pool,
1370 FFEEXPR_contextKINDTYPE,
1371 (ffeexprCallback) ffestb_decl_kindparam_2_)))
1376 /* ffestb_decl_kindparam_1_ -- "type" OPEN_PAREN NAME
1378 return ffestb_decl_kindparam_1_; // to lexer
1380 Handle "[KIND=]expr)". */
1382 static ffelexHandler
1383 ffestb_decl_kindparam_1_ (ffelexToken t)
1388 switch (ffelex_token_type (t))
1390 case FFELEX_typeEQUALS:
1391 ffesta_confirmed ();
1392 if (ffestr_other (ffesta_tokens[1]) != FFESTR_otherKIND)
1394 ffelex_token_kill (ffesta_tokens[1]);
1395 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
1396 FFEEXPR_contextKINDTYPE, (ffeexprCallback) ffestb_decl_kindparam_2_);
1399 nt = ffesta_tokens[1];
1400 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
1401 FFEEXPR_contextKINDTYPE, (ffeexprCallback) ffestb_decl_kindparam_2_)))
1403 ffelex_token_kill (nt);
1404 return (ffelexHandler) (*next) (t);
1407 if (ffestb_local_.decl.recursive != NULL)
1408 ffelex_token_kill (ffestb_local_.decl.recursive);
1409 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1410 ffestb_local_.decl.badname,
1412 ffelex_token_kill (ffesta_tokens[1]);
1413 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1416 /* ffestb_decl_kindparam_2_ -- "type" OPEN_PAREN ["KIND="] expr
1418 (ffestb_decl_kindparam_2_) // to expression handler
1420 Handle "[KIND=]expr)". */
1422 static ffelexHandler
1423 ffestb_decl_kindparam_2_ (ffelexToken ft, ffebld expr, ffelexToken t)
1425 switch (ffelex_token_type (t))
1427 case FFELEX_typeCLOSE_PAREN:
1428 ffestb_local_.decl.kind = expr;
1429 ffestb_local_.decl.kindt = ffelex_token_use (ft);
1430 ffestb_local_.decl.len = NULL;
1431 ffestb_local_.decl.lent = NULL;
1432 ffelex_set_names (TRUE);
1433 return (ffelexHandler) ffestb_local_.decl.handler;
1439 if (ffestb_local_.decl.recursive != NULL)
1440 ffelex_token_kill (ffestb_local_.decl.recursive);
1441 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1442 ffestb_local_.decl.badname,
1444 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1447 /* ffestb_decl_starkind_ -- "type" ASTERISK
1449 return ffestb_decl_starkind_; // to lexer
1453 static ffelexHandler
1454 ffestb_decl_starkind_ (ffelexToken t)
1456 switch (ffelex_token_type (t))
1458 case FFELEX_typeNUMBER:
1459 ffestb_local_.decl.kindt = ffelex_token_use (t);
1460 ffestb_local_.decl.kind = NULL;
1461 ffestb_local_.decl.len = NULL;
1462 ffestb_local_.decl.lent = NULL;
1463 ffelex_set_names (TRUE);
1464 return (ffelexHandler) ffestb_local_.decl.handler;
1470 if (ffestb_local_.decl.recursive != NULL)
1471 ffelex_token_kill (ffestb_local_.decl.recursive);
1472 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1473 ffestb_local_.decl.badname,
1475 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1478 /* ffestb_decl_starlen_ -- "CHARACTER" ASTERISK
1480 return ffestb_decl_starlen_; // to lexer
1484 static ffelexHandler
1485 ffestb_decl_starlen_ (ffelexToken t)
1487 switch (ffelex_token_type (t))
1489 case FFELEX_typeNUMBER:
1490 ffestb_local_.decl.kind = NULL;
1491 ffestb_local_.decl.kindt = NULL;
1492 ffestb_local_.decl.len = NULL;
1493 ffestb_local_.decl.lent = ffelex_token_use (t);
1494 ffelex_set_names (TRUE);
1495 return (ffelexHandler) ffestb_local_.decl.handler;
1497 case FFELEX_typeOPEN_PAREN:
1498 ffestb_local_.decl.kind = NULL;
1499 ffestb_local_.decl.kindt = NULL;
1500 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
1501 FFEEXPR_contextCHARACTERSIZE,
1502 (ffeexprCallback) ffestb_decl_starlen_1_);
1508 if (ffestb_local_.decl.recursive != NULL)
1509 ffelex_token_kill (ffestb_local_.decl.recursive);
1510 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1511 ffestb_local_.decl.badname,
1513 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1516 /* ffestb_decl_starlen_1_ -- "CHARACTER" ASTERISK OPEN_PAREN expr
1518 (ffestb_decl_starlen_1_) // to expression handler
1520 Handle CLOSE_PAREN. */
1522 static ffelexHandler
1523 ffestb_decl_starlen_1_ (ffelexToken ft, ffebld expr, ffelexToken t)
1525 switch (ffelex_token_type (t))
1527 case FFELEX_typeCLOSE_PAREN:
1530 ffestb_local_.decl.len = expr;
1531 ffestb_local_.decl.lent = ffelex_token_use (ft);
1532 ffelex_set_names (TRUE);
1533 return (ffelexHandler) ffestb_local_.decl.handler;
1539 if (ffestb_local_.decl.recursive != NULL)
1540 ffelex_token_kill (ffestb_local_.decl.recursive);
1541 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1542 ffestb_local_.decl.badname,
1544 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1547 /* ffestb_decl_typeparams_ -- "CHARACTER" OPEN_PAREN
1549 return ffestb_decl_typeparams_; // to lexer
1551 Handle "[KIND=]expr)". */
1553 static ffelexHandler
1554 ffestb_decl_typeparams_ (ffelexToken t)
1556 switch (ffelex_token_type (t))
1558 case FFELEX_typeNAME:
1559 ffesta_tokens[1] = ffelex_token_use (t);
1560 return (ffelexHandler) ffestb_decl_typeparams_1_;
1563 if (ffestb_local_.decl.lent == NULL)
1564 return (ffelexHandler) (*((ffelexHandler)
1565 ffeexpr_rhs (ffesta_output_pool,
1566 FFEEXPR_contextCHARACTERSIZE,
1567 (ffeexprCallback) ffestb_decl_typeparams_2_)))
1569 if (ffestb_local_.decl.kindt != NULL)
1571 return (ffelexHandler) (*((ffelexHandler)
1572 ffeexpr_rhs (ffesta_output_pool,
1573 FFEEXPR_contextKINDTYPE,
1574 (ffeexprCallback) ffestb_decl_typeparams_3_)))
1578 if (ffestb_local_.decl.recursive != NULL)
1579 ffelex_token_kill (ffestb_local_.decl.recursive);
1580 if (ffestb_local_.decl.kindt != NULL)
1581 ffelex_token_kill (ffestb_local_.decl.kindt);
1582 if (ffestb_local_.decl.lent != NULL)
1583 ffelex_token_kill (ffestb_local_.decl.lent);
1584 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1585 ffestb_local_.decl.badname,
1587 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1590 /* ffestb_decl_typeparams_1_ -- "CHARACTER" OPEN_PAREN NAME
1592 return ffestb_decl_typeparams_1_; // to lexer
1594 Handle "[KIND=]expr)". */
1596 static ffelexHandler
1597 ffestb_decl_typeparams_1_ (ffelexToken t)
1602 switch (ffelex_token_type (t))
1604 case FFELEX_typeEQUALS:
1605 ffesta_confirmed ();
1606 switch (ffestr_other (ffesta_tokens[1]))
1608 case FFESTR_otherLEN:
1609 if (ffestb_local_.decl.lent != NULL)
1611 ffelex_token_kill (ffesta_tokens[1]);
1612 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
1613 FFEEXPR_contextCHARACTERSIZE,
1614 (ffeexprCallback) ffestb_decl_typeparams_2_);
1616 case FFESTR_otherKIND:
1617 if (ffestb_local_.decl.kindt != NULL)
1619 ffelex_token_kill (ffesta_tokens[1]);
1620 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
1621 FFEEXPR_contextKINDTYPE,
1622 (ffeexprCallback) ffestb_decl_typeparams_3_);
1630 nt = ffesta_tokens[1];
1631 if (ffestb_local_.decl.lent == NULL)
1632 next = (ffelexHandler) (*((ffelexHandler)
1633 ffeexpr_rhs (ffesta_output_pool,
1634 FFEEXPR_contextCHARACTERSIZE,
1635 (ffeexprCallback) ffestb_decl_typeparams_2_)))
1637 else if (ffestb_local_.decl.kindt == NULL)
1638 next = (ffelexHandler) (*((ffelexHandler)
1639 ffeexpr_rhs (ffesta_output_pool,
1640 FFEEXPR_contextKINDTYPE,
1641 (ffeexprCallback) ffestb_decl_typeparams_3_)))
1645 ffesta_tokens[1] = nt;
1648 ffelex_token_kill (nt);
1649 return (ffelexHandler) (*next) (t);
1652 if (ffestb_local_.decl.recursive != NULL)
1653 ffelex_token_kill (ffestb_local_.decl.recursive);
1654 if (ffestb_local_.decl.kindt != NULL)
1655 ffelex_token_kill (ffestb_local_.decl.kindt);
1656 if (ffestb_local_.decl.lent != NULL)
1657 ffelex_token_kill (ffestb_local_.decl.lent);
1658 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1659 ffestb_local_.decl.badname,
1661 ffelex_token_kill (ffesta_tokens[1]);
1662 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1665 /* ffestb_decl_typeparams_2_ -- "CHARACTER" OPEN_PAREN ["LEN="] expr
1667 (ffestb_decl_typeparams_2_) // to expression handler
1669 Handle "[LEN=]expr)". */
1671 static ffelexHandler
1672 ffestb_decl_typeparams_2_ (ffelexToken ft, ffebld expr, ffelexToken t)
1674 switch (ffelex_token_type (t))
1676 case FFELEX_typeCLOSE_PAREN:
1677 ffestb_local_.decl.len = expr;
1678 ffestb_local_.decl.lent = ffelex_token_use (ft);
1679 ffelex_set_names (TRUE);
1680 return (ffelexHandler) ffestb_local_.decl.handler;
1682 case FFELEX_typeCOMMA:
1683 ffestb_local_.decl.len = expr;
1684 ffestb_local_.decl.lent = ffelex_token_use (ft);
1685 return (ffelexHandler) ffestb_decl_typeparams_;
1691 if (ffestb_local_.decl.recursive != NULL)
1692 ffelex_token_kill (ffestb_local_.decl.recursive);
1693 if (ffestb_local_.decl.kindt != NULL)
1694 ffelex_token_kill (ffestb_local_.decl.kindt);
1695 if (ffestb_local_.decl.lent != NULL)
1696 ffelex_token_kill (ffestb_local_.decl.lent);
1697 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1698 ffestb_local_.decl.badname,
1700 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1703 /* ffestb_decl_typeparams_3_ -- "CHARACTER" OPEN_PAREN ["KIND="] expr
1705 (ffestb_decl_typeparams_3_) // to expression handler
1707 Handle "[KIND=]expr)". */
1709 static ffelexHandler
1710 ffestb_decl_typeparams_3_ (ffelexToken ft, ffebld expr, ffelexToken t)
1712 switch (ffelex_token_type (t))
1714 case FFELEX_typeCLOSE_PAREN:
1715 ffestb_local_.decl.kind = expr;
1716 ffestb_local_.decl.kindt = ffelex_token_use (ft);
1717 ffelex_set_names (TRUE);
1718 return (ffelexHandler) ffestb_local_.decl.handler;
1720 case FFELEX_typeCOMMA:
1721 ffestb_local_.decl.kind = expr;
1722 ffestb_local_.decl.kindt = ffelex_token_use (ft);
1723 return (ffelexHandler) ffestb_decl_typeparams_;
1729 if (ffestb_local_.decl.recursive != NULL)
1730 ffelex_token_kill (ffestb_local_.decl.recursive);
1731 if (ffestb_local_.decl.kindt != NULL)
1732 ffelex_token_kill (ffestb_local_.decl.kindt);
1733 if (ffestb_local_.decl.lent != NULL)
1734 ffelex_token_kill (ffestb_local_.decl.lent);
1735 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1736 ffestb_local_.decl.badname,
1738 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1741 /* ffestb_decl_typetype1_ -- "TYPE" OPEN_PAREN
1743 return ffestb_decl_typetype1_; // to lexer
1748 static ffelexHandler
1749 ffestb_decl_typetype1_ (ffelexToken t)
1751 switch (ffelex_token_type (t))
1753 case FFELEX_typeNAME:
1754 ffestb_local_.decl.kindt = ffelex_token_use (t);
1755 return (ffelexHandler) ffestb_decl_typetype2_;
1761 if (ffestb_local_.decl.recursive != NULL)
1762 ffelex_token_kill (ffestb_local_.decl.recursive);
1763 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1764 ffestb_local_.decl.badname,
1766 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1769 /* ffestb_decl_typetype2_ -- "TYPE" OPEN_PAREN NAME
1771 return ffestb_decl_typetype2_; // to lexer
1773 Handle CLOSE_PAREN. */
1775 static ffelexHandler
1776 ffestb_decl_typetype2_ (ffelexToken t)
1778 switch (ffelex_token_type (t))
1780 case FFELEX_typeCLOSE_PAREN:
1781 ffestb_local_.decl.type = FFESTP_typeTYPE;
1782 ffestb_local_.decl.kind = NULL;
1783 ffestb_local_.decl.len = NULL;
1784 ffestb_local_.decl.lent = NULL;
1785 ffelex_set_names (TRUE);
1786 return (ffelexHandler) ffestb_local_.decl.handler;
1792 if (ffestb_local_.decl.recursive != NULL)
1793 ffelex_token_kill (ffestb_local_.decl.recursive);
1794 ffelex_token_kill (ffestb_local_.decl.kindt);
1795 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
1796 ffestb_local_.decl.badname,
1798 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
1802 /* ffestb_subr_label_list_ -- Collect a tokenlist of labels and close-paren
1804 return ffestb_subr_label_list_; // to lexer after seeing OPEN_PAREN
1806 First token must be a NUMBER. Must be followed by zero or more COMMA
1807 NUMBER pairs. Must then be followed by a CLOSE_PAREN. If all ok, put
1808 the NUMBER tokens in a token list and return via the handler for the
1809 token after CLOSE_PAREN. Else return via
1810 same handler, but with the ok return value set FALSE. */
1812 static ffelexHandler
1813 ffestb_subr_label_list_ (ffelexToken t)
1815 if (ffelex_token_type (t) == FFELEX_typeNUMBER)
1817 ffestt_tokenlist_append (ffestb_subrargs_.label_list.labels,
1818 ffelex_token_use (t));
1819 return (ffelexHandler) ffestb_subr_label_list_1_;
1822 ffestb_subrargs_.label_list.ok = FALSE;
1823 return (ffelexHandler) (*ffestb_subrargs_.label_list.handler) (t);
1826 /* ffestb_subr_label_list_1_ -- NUMBER
1828 return ffestb_subr_label_list_1_; // to lexer after seeing NUMBER
1830 The next token must be COMMA, in which case go back to
1831 ffestb_subr_label_list_, or CLOSE_PAREN, in which case set ok to TRUE
1832 and go to the handler. */
1834 static ffelexHandler
1835 ffestb_subr_label_list_1_ (ffelexToken t)
1837 switch (ffelex_token_type (t))
1839 case FFELEX_typeCOMMA:
1840 return (ffelexHandler) ffestb_subr_label_list_;
1842 case FFELEX_typeCLOSE_PAREN:
1843 ffestb_subrargs_.label_list.ok = TRUE;
1844 return (ffelexHandler) ffestb_subrargs_.label_list.handler;
1847 ffestb_subrargs_.label_list.ok = FALSE;
1848 return (ffelexHandler) (*ffestb_subrargs_.label_list.handler) (t);
1852 /* ffestb_do -- Parse the DO statement
1854 return ffestb_do; // to lexer
1856 Make sure the statement has a valid form for the DO statement. If it
1857 does, implement the statement. */
1860 ffestb_do (ffelexToken t)
1868 switch (ffelex_token_type (ffesta_tokens[0]))
1870 case FFELEX_typeNAME:
1871 if (ffesta_first_kw != FFESTR_firstDO)
1872 goto bad_0; /* :::::::::::::::::::: */
1873 switch (ffelex_token_type (t))
1875 case FFELEX_typeNUMBER:
1876 ffesta_confirmed ();
1877 ffesta_tokens[1] = ffelex_token_use (t);
1878 return (ffelexHandler) ffestb_do1_;
1880 case FFELEX_typeCOMMA:
1881 ffesta_confirmed ();
1882 ffesta_tokens[1] = NULL;
1883 return (ffelexHandler) ffestb_do2_;
1885 case FFELEX_typeNAME:
1886 ffesta_confirmed ();
1887 ffesta_tokens[1] = NULL;
1888 ffesta_tokens[2] = ffelex_token_use (t);
1889 return (ffelexHandler) ffestb_do3_;
1891 case FFELEX_typeEOS:
1892 case FFELEX_typeSEMICOLON:
1893 ffesta_confirmed ();
1894 ffesta_tokens[1] = NULL;
1895 return (ffelexHandler) ffestb_do1_ (t);
1897 case FFELEX_typeCOLONCOLON:
1898 ffesta_confirmed (); /* Error, but clearly intended. */
1899 goto bad_1; /* :::::::::::::::::::: */
1902 goto bad_1; /* :::::::::::::::::::: */
1905 case FFELEX_typeNAMES:
1906 if (ffesta_first_kw != FFESTR_firstDO)
1907 goto bad_0; /* :::::::::::::::::::: */
1908 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDO);
1909 switch (ffelex_token_type (t))
1911 case FFELEX_typeCOLONCOLON:
1912 ffesta_confirmed (); /* Error, but clearly intended. */
1913 goto bad_1; /* :::::::::::::::::::: */
1916 goto bad_1; /* :::::::::::::::::::: */
1918 case FFELEX_typeOPEN_PAREN: /* Must be "DO" label "WHILE". */
1920 goto bad_i; /* :::::::::::::::::::: */
1921 ffesta_tokens[1] = ffelex_token_number_from_names (ffesta_tokens[0],
1923 p += ffelex_token_length (ffesta_tokens[1]);
1924 i += ffelex_token_length (ffesta_tokens[1]);
1925 if (((*p) != 'W') && ((*p) != 'w'))
1926 goto bad_i1; /* :::::::::::::::::::: */
1927 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
1928 kw = ffestr_second (nt);
1929 ffelex_token_kill (nt);
1930 if (kw != FFESTR_secondWHILE)
1931 goto bad_i1; /* :::::::::::::::::::: */
1932 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
1933 FFEEXPR_contextDOWHILE, (ffeexprCallback) ffestb_do4_);
1935 case FFELEX_typeCOMMA:
1936 ffesta_confirmed ();
1939 ffesta_tokens[1] = NULL;
1940 return (ffelexHandler) ffestb_do2_;
1943 goto bad_i; /* :::::::::::::::::::: */
1944 ffesta_tokens[1] = ffelex_token_number_from_names (ffesta_tokens[0],
1946 p += ffelex_token_length (ffesta_tokens[1]);
1947 i += ffelex_token_length (ffesta_tokens[1]);
1949 goto bad_i1; /* :::::::::::::::::::: */
1950 return (ffelexHandler) ffestb_do2_;
1952 case FFELEX_typeEQUALS:
1956 = ffelex_token_number_from_names (ffesta_tokens[0], i);
1957 p += ffelex_token_length (ffesta_tokens[1]);
1958 i += ffelex_token_length (ffesta_tokens[1]);
1961 ffesta_tokens[1] = NULL;
1962 if (!ffesrc_is_name_init (*p))
1963 goto bad_i1; /* :::::::::::::::::::: */
1964 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
1965 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_lhs
1966 (ffesta_output_pool, FFEEXPR_contextDO,
1967 (ffeexprCallback) ffestb_do6_)))
1969 ffelex_token_kill (nt); /* Will get it back in _6_... */
1970 return (ffelexHandler) (*next) (t);
1972 case FFELEX_typeEOS:
1973 case FFELEX_typeSEMICOLON:
1974 ffesta_confirmed ();
1978 = ffelex_token_number_from_names (ffesta_tokens[0], i);
1979 p += ffelex_token_length (ffesta_tokens[1]);
1980 i += ffelex_token_length (ffesta_tokens[1]);
1983 ffesta_tokens[1] = NULL;
1985 goto bad_i1; /* :::::::::::::::::::: */
1986 return (ffelexHandler) ffestb_do1_ (t);
1990 goto bad_0; /* :::::::::::::::::::: */
1993 bad_0: /* :::::::::::::::::::: */
1994 if (ffesta_construct_name != NULL)
1996 ffelex_token_kill (ffesta_construct_name);
1997 ffesta_construct_name = NULL;
1999 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0]);
2000 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2002 bad_1: /* :::::::::::::::::::: */
2003 if (ffesta_construct_name != NULL)
2005 ffelex_token_kill (ffesta_construct_name);
2006 ffesta_construct_name = NULL;
2008 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2009 return (ffelexHandler) ffelex_swallow_tokens (t,
2010 (ffelexHandler) ffesta_zero); /* Invalid second token. */
2012 bad_i1: /* :::::::::::::::::::: */
2013 if (ffesta_tokens[1])
2014 ffelex_token_kill (ffesta_tokens[1]);
2016 bad_i: /* :::::::::::::::::::: */
2017 if (ffesta_construct_name != NULL)
2019 ffelex_token_kill (ffesta_construct_name);
2020 ffesta_construct_name = NULL;
2022 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0], i, t);
2023 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2026 /* ffestb_dowhile -- Parse the DOWHILE statement
2028 return ffestb_dowhile; // to lexer
2030 Make sure the statement has a valid form for the DOWHILE statement. If it
2031 does, implement the statement. */
2034 ffestb_dowhile (ffelexToken t)
2041 switch (ffelex_token_type (ffesta_tokens[0]))
2043 case FFELEX_typeNAMES:
2044 if (ffesta_first_kw != FFESTR_firstDOWHILE)
2045 goto bad_0; /* :::::::::::::::::::: */
2046 switch (ffelex_token_type (t))
2048 case FFELEX_typeEOS:
2049 case FFELEX_typeSEMICOLON:
2050 case FFELEX_typeCOMMA:
2051 case FFELEX_typeCOLONCOLON:
2052 ffesta_confirmed (); /* Error, but clearly intended. */
2053 goto bad_1; /* :::::::::::::::::::: */
2056 goto bad_1; /* :::::::::::::::::::: */
2058 case FFELEX_typeOPEN_PAREN:
2059 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDOWHILE);
2061 goto bad_i; /* :::::::::::::::::::: */
2062 ffesta_tokens[1] = NULL;
2063 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
2064 FFEEXPR_contextDOWHILE, (ffeexprCallback) ffestb_do4_);
2066 case FFELEX_typeEQUALS:/* Not really DOWHILE, but DOWHILExyz=.... */
2067 ffesta_tokens[1] = NULL;
2068 nt = ffelex_token_name_from_names (ffesta_tokens[0], FFESTR_firstlDO,
2070 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_lhs
2071 (ffesta_output_pool, FFEEXPR_contextDO,
2072 (ffeexprCallback) ffestb_do6_)))
2074 ffelex_token_kill (nt); /* Will get it back in _6_... */
2075 return (ffelexHandler) (*next) (t);
2079 goto bad_0; /* :::::::::::::::::::: */
2082 bad_0: /* :::::::::::::::::::: */
2083 if (ffesta_construct_name != NULL)
2085 ffelex_token_kill (ffesta_construct_name);
2086 ffesta_construct_name = NULL;
2088 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0]);
2089 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2091 bad_1: /* :::::::::::::::::::: */
2092 if (ffesta_construct_name != NULL)
2094 ffelex_token_kill (ffesta_construct_name);
2095 ffesta_construct_name = NULL;
2097 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2098 return (ffelexHandler) ffelex_swallow_tokens (t,
2099 (ffelexHandler) ffesta_zero); /* Invalid second token. */
2101 bad_i: /* :::::::::::::::::::: */
2102 if (ffesta_construct_name != NULL)
2104 ffelex_token_kill (ffesta_construct_name);
2105 ffesta_construct_name = NULL;
2107 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0], i, t);
2108 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2111 /* ffestb_do1_ -- "DO" [label]
2113 return ffestb_do1_; // to lexer
2115 Make sure the statement has a valid form for the DO statement. If it
2116 does, implement the statement. */
2118 static ffelexHandler
2119 ffestb_do1_ (ffelexToken t)
2121 switch (ffelex_token_type (t))
2123 case FFELEX_typeCOMMA:
2124 ffesta_confirmed ();
2125 return (ffelexHandler) ffestb_do2_;
2127 case FFELEX_typeEOS:
2128 case FFELEX_typeSEMICOLON:
2129 ffesta_confirmed ();
2130 if (!ffesta_is_inhibited ())
2132 if (ffesta_tokens[1] != NULL)
2133 ffestc_R819B (ffesta_construct_name, ffesta_tokens[1], NULL,
2136 ffestc_R820B (ffesta_construct_name, NULL, NULL);
2138 if (ffesta_tokens[1] != NULL)
2139 ffelex_token_kill (ffesta_tokens[1]);
2140 if (ffesta_construct_name != NULL)
2142 ffelex_token_kill (ffesta_construct_name);
2143 ffesta_construct_name = NULL;
2145 return (ffelexHandler) ffesta_zero (t);
2147 case FFELEX_typeNAME:
2148 return (ffelexHandler) ffestb_do2_ (t);
2154 if (ffesta_tokens[1] != NULL)
2155 ffelex_token_kill (ffesta_tokens[1]);
2156 if (ffesta_construct_name != NULL)
2158 ffelex_token_kill (ffesta_construct_name);
2159 ffesta_construct_name = NULL;
2161 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2162 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2165 /* ffestb_do2_ -- "DO" [label] [,]
2167 return ffestb_do2_; // to lexer
2169 Make sure the statement has a valid form for the DO statement. If it
2170 does, implement the statement. */
2172 static ffelexHandler
2173 ffestb_do2_ (ffelexToken t)
2175 switch (ffelex_token_type (t))
2177 case FFELEX_typeNAME:
2178 ffesta_tokens[2] = ffelex_token_use (t);
2179 return (ffelexHandler) ffestb_do3_;
2185 if (ffesta_tokens[1] != NULL)
2186 ffelex_token_kill (ffesta_tokens[1]);
2187 if (ffesta_construct_name != NULL)
2189 ffelex_token_kill (ffesta_construct_name);
2190 ffesta_construct_name = NULL;
2192 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2193 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2196 /* ffestb_do3_ -- "DO" [label] [,] NAME
2198 return ffestb_do3_; // to lexer
2200 Make sure the statement has a valid form for the DO statement. If it
2201 does, implement the statement. */
2203 static ffelexHandler
2204 ffestb_do3_ (ffelexToken t)
2208 switch (ffelex_token_type (t))
2210 case FFELEX_typeEQUALS:
2211 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
2212 FFEEXPR_contextDO, (ffeexprCallback) ffestb_do6_)))
2214 ffelex_token_kill (ffesta_tokens[2]); /* Will get it back in _6_... */
2215 return (ffelexHandler) (*next) (t);
2217 case FFELEX_typeOPEN_PAREN:
2218 if (ffestr_second (ffesta_tokens[2]) != FFESTR_secondWHILE)
2220 if (ffesta_tokens[1] != NULL)
2221 ffelex_token_kill (ffesta_tokens[1]);
2222 if (ffesta_construct_name != NULL)
2224 ffelex_token_kill (ffesta_construct_name);
2225 ffesta_construct_name = NULL;
2227 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[2]);
2228 ffelex_token_kill (ffesta_tokens[2]);
2229 return (ffelexHandler) ffelex_swallow_tokens (t,
2230 (ffelexHandler) ffesta_zero); /* Invalid token. */
2232 ffelex_token_kill (ffesta_tokens[2]);
2233 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
2234 FFEEXPR_contextDOWHILE, (ffeexprCallback) ffestb_do4_);
2240 ffelex_token_kill (ffesta_tokens[2]);
2241 if (ffesta_tokens[1] != NULL)
2242 ffelex_token_kill (ffesta_tokens[1]);
2243 if (ffesta_construct_name != NULL)
2245 ffelex_token_kill (ffesta_construct_name);
2246 ffesta_construct_name = NULL;
2248 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2249 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2252 /* ffestb_do4_ -- "DO" [label] [,] "WHILE" OPEN_PAREN expr
2254 (ffestb_do4_) // to expression handler
2256 Make sure the statement has a valid form for the DO statement. If it
2257 does, implement the statement. */
2259 static ffelexHandler
2260 ffestb_do4_ (ffelexToken ft, ffebld expr, ffelexToken t)
2262 switch (ffelex_token_type (t))
2264 case FFELEX_typeCLOSE_PAREN:
2267 ffesta_tokens[2] = ffelex_token_use (ft);
2268 ffestb_local_.dowhile.expr = expr;
2269 return (ffelexHandler) ffestb_do5_;
2275 if (ffesta_tokens[1] != NULL)
2276 ffelex_token_kill (ffesta_tokens[1]);
2277 if (ffesta_construct_name != NULL)
2279 ffelex_token_kill (ffesta_construct_name);
2280 ffesta_construct_name = NULL;
2282 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2283 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2286 /* ffestb_do5_ -- "DO" [label] [,] "WHILE" OPEN_PAREN expr CLOSE_PAREN
2288 return ffestb_do5_; // to lexer
2290 Make sure the statement has a valid form for the DO statement. If it
2291 does, implement the statement. */
2293 static ffelexHandler
2294 ffestb_do5_ (ffelexToken t)
2296 switch (ffelex_token_type (t))
2298 case FFELEX_typeEOS:
2299 case FFELEX_typeSEMICOLON:
2300 ffesta_confirmed ();
2301 if (!ffesta_is_inhibited ())
2303 if (ffesta_tokens[1] != NULL)
2304 ffestc_R819B (ffesta_construct_name, ffesta_tokens[1],
2305 ffestb_local_.dowhile.expr, ffesta_tokens[2]);
2307 ffestc_R820B (ffesta_construct_name, ffestb_local_.dowhile.expr,
2310 ffelex_token_kill (ffesta_tokens[2]);
2311 if (ffesta_tokens[1] != NULL)
2312 ffelex_token_kill (ffesta_tokens[1]);
2313 if (ffesta_construct_name != NULL)
2315 ffelex_token_kill (ffesta_construct_name);
2316 ffesta_construct_name = NULL;
2318 return (ffelexHandler) ffesta_zero (t);
2324 ffelex_token_kill (ffesta_tokens[2]);
2325 if (ffesta_tokens[1] != NULL)
2326 ffelex_token_kill (ffesta_tokens[1]);
2327 if (ffesta_construct_name != NULL)
2329 ffelex_token_kill (ffesta_construct_name);
2330 ffesta_construct_name = NULL;
2332 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2333 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2336 /* ffestb_do6_ -- "DO" [label] [,] var-expr
2338 (ffestb_do6_) // to expression handler
2340 Make sure the statement has a valid form for the DO statement. If it
2341 does, implement the statement. */
2343 static ffelexHandler
2344 ffestb_do6_ (ffelexToken ft, ffebld expr, ffelexToken t)
2346 /* _3_ already ensured that this would be an EQUALS token. If not, it is a
2349 assert (ffelex_token_type (t) == FFELEX_typeEQUALS);
2351 ffesta_tokens[2] = ffelex_token_use (ft);
2352 ffestb_local_.do_stmt.var = expr;
2353 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
2354 FFEEXPR_contextDO, (ffeexprCallback) ffestb_do7_);
2357 /* ffestb_do7_ -- "DO" [label] [,] var-expr EQUALS expr
2359 (ffestb_do7_) // to expression handler
2361 Make sure the statement has a valid form for the DO statement. If it
2362 does, implement the statement. */
2364 static ffelexHandler
2365 ffestb_do7_ (ffelexToken ft, ffebld expr, ffelexToken t)
2367 switch (ffelex_token_type (t))
2369 case FFELEX_typeCOMMA:
2370 ffesta_confirmed ();
2373 ffesta_tokens[3] = ffelex_token_use (ft);
2374 ffestb_local_.do_stmt.start = expr;
2375 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
2376 FFEEXPR_contextDO, (ffeexprCallback) ffestb_do8_);
2382 ffelex_token_kill (ffesta_tokens[2]);
2383 if (ffesta_tokens[1] != NULL)
2384 ffelex_token_kill (ffesta_tokens[1]);
2385 if (ffesta_construct_name != NULL)
2387 ffelex_token_kill (ffesta_construct_name);
2388 ffesta_construct_name = NULL;
2390 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2391 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2394 /* ffestb_do8_ -- "DO" [label] [,] var-expr EQUALS expr COMMA expr
2396 (ffestb_do8_) // to expression handler
2398 Make sure the statement has a valid form for the DO statement. If it
2399 does, implement the statement. */
2401 static ffelexHandler
2402 ffestb_do8_ (ffelexToken ft, ffebld expr, ffelexToken t)
2404 switch (ffelex_token_type (t))
2406 case FFELEX_typeCOMMA:
2409 ffesta_tokens[4] = ffelex_token_use (ft);
2410 ffestb_local_.do_stmt.end = expr;
2411 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
2412 FFEEXPR_contextDO, (ffeexprCallback) ffestb_do9_);
2414 case FFELEX_typeEOS:
2415 case FFELEX_typeSEMICOLON:
2418 ffesta_tokens[4] = ffelex_token_use (ft);
2419 ffestb_local_.do_stmt.end = expr;
2420 return (ffelexHandler) ffestb_do9_ (NULL, NULL, t);
2426 ffelex_token_kill (ffesta_tokens[3]);
2427 ffelex_token_kill (ffesta_tokens[2]);
2428 if (ffesta_tokens[1] != NULL)
2429 ffelex_token_kill (ffesta_tokens[1]);
2430 if (ffesta_construct_name != NULL)
2432 ffelex_token_kill (ffesta_construct_name);
2433 ffesta_construct_name = NULL;
2435 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2436 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2439 /* ffestb_do9_ -- "DO" [label] [,] var-expr EQUALS expr COMMA expr
2442 (ffestb_do9_) // to expression handler
2444 Make sure the statement has a valid form for the DO statement. If it
2445 does, implement the statement. */
2447 static ffelexHandler
2448 ffestb_do9_ (ffelexToken ft, ffebld expr, ffelexToken t)
2450 switch (ffelex_token_type (t))
2452 case FFELEX_typeEOS:
2453 case FFELEX_typeSEMICOLON:
2454 if ((expr == NULL) && (ft != NULL))
2456 if (!ffesta_is_inhibited ())
2458 if (ffesta_tokens[1] != NULL)
2459 ffestc_R819A (ffesta_construct_name, ffesta_tokens[1],
2460 ffestb_local_.do_stmt.var, ffesta_tokens[2],
2461 ffestb_local_.do_stmt.start, ffesta_tokens[3],
2462 ffestb_local_.do_stmt.end, ffesta_tokens[4], expr, ft);
2464 ffestc_R820A (ffesta_construct_name, ffestb_local_.do_stmt.var,
2465 ffesta_tokens[2], ffestb_local_.do_stmt.start,
2466 ffesta_tokens[3], ffestb_local_.do_stmt.end,
2467 ffesta_tokens[4], expr, ft);
2469 ffelex_token_kill (ffesta_tokens[4]);
2470 ffelex_token_kill (ffesta_tokens[3]);
2471 ffelex_token_kill (ffesta_tokens[2]);
2472 if (ffesta_tokens[1] != NULL)
2473 ffelex_token_kill (ffesta_tokens[1]);
2474 if (ffesta_construct_name != NULL)
2476 ffelex_token_kill (ffesta_construct_name);
2477 ffesta_construct_name = NULL;
2480 return (ffelexHandler) ffesta_zero (t);
2486 ffelex_token_kill (ffesta_tokens[4]);
2487 ffelex_token_kill (ffesta_tokens[3]);
2488 ffelex_token_kill (ffesta_tokens[2]);
2489 if (ffesta_tokens[1] != NULL)
2490 ffelex_token_kill (ffesta_tokens[1]);
2491 if (ffesta_construct_name != NULL)
2493 ffelex_token_kill (ffesta_construct_name);
2494 ffesta_construct_name = NULL;
2496 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
2497 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2500 /* ffestb_else -- Parse the ELSE statement
2502 return ffestb_else; // to lexer
2504 Make sure the statement has a valid form for the ELSE statement. If it
2505 does, implement the statement. */
2508 ffestb_else (ffelexToken t)
2513 switch (ffelex_token_type (ffesta_tokens[0]))
2515 case FFELEX_typeNAME:
2516 if (ffesta_first_kw != FFESTR_firstELSE)
2517 goto bad_0; /* :::::::::::::::::::: */
2518 switch (ffelex_token_type (t))
2520 case FFELEX_typeEOS:
2521 case FFELEX_typeSEMICOLON:
2522 ffesta_confirmed ();
2523 ffesta_tokens[1] = NULL;
2524 ffestb_args.elsexyz.second = FFESTR_secondNone;
2525 return (ffelexHandler) ffestb_else1_ (t);
2527 case FFELEX_typeCOMMA:
2528 case FFELEX_typeCOLONCOLON:
2529 ffesta_confirmed (); /* Error, but clearly intended. */
2530 goto bad_1; /* :::::::::::::::::::: */
2533 goto bad_1; /* :::::::::::::::::::: */
2535 case FFELEX_typeNAME:
2539 ffesta_confirmed ();
2540 ffestb_args.elsexyz.second = ffesta_second_kw;
2541 ffesta_tokens[1] = ffelex_token_use (t);
2542 return (ffelexHandler) ffestb_else1_;
2544 case FFELEX_typeNAMES:
2545 if (ffesta_first_kw != FFESTR_firstELSE)
2546 goto bad_0; /* :::::::::::::::::::: */
2547 switch (ffelex_token_type (t))
2549 case FFELEX_typeCOMMA:
2550 case FFELEX_typeCOLONCOLON:
2551 ffesta_confirmed (); /* Error, but clearly intended. */
2552 goto bad_1; /* :::::::::::::::::::: */
2555 goto bad_1; /* :::::::::::::::::::: */
2557 case FFELEX_typeEOS:
2558 case FFELEX_typeSEMICOLON:
2561 ffesta_confirmed ();
2562 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlELSE)
2564 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlELSE);
2565 if (!ffesrc_is_name_init (*p))
2566 goto bad_i; /* :::::::::::::::::::: */
2568 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
2571 ffesta_tokens[1] = NULL;
2572 ffestb_args.elsexyz.second = FFESTR_secondNone;
2573 return (ffelexHandler) ffestb_else1_ (t);
2576 goto bad_0; /* :::::::::::::::::::: */
2579 bad_0: /* :::::::::::::::::::: */
2580 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", ffesta_tokens[0]);
2581 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2583 bad_1: /* :::::::::::::::::::: */
2584 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", t);
2585 return (ffelexHandler) ffelex_swallow_tokens (t,
2586 (ffelexHandler) ffesta_zero); /* Invalid second token. */
2588 bad_i: /* :::::::::::::::::::: */
2589 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ELSE", ffesta_tokens[0], i, t);
2590 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2593 /* ffestb_elsexyz -- Parse an ELSEIF/ELSEWHERE statement
2595 return ffestb_elsexyz; // to lexer
2597 Expects len and second to be set in ffestb_args.elsexyz to the length
2598 of the ELSExyz keyword involved and the corresponding ffestrSecond value. */
2601 ffestb_elsexyz (ffelexToken t)
2606 switch (ffelex_token_type (ffesta_tokens[0]))
2608 case FFELEX_typeNAME:
2609 switch (ffelex_token_type (t))
2611 case FFELEX_typeEOS:
2612 case FFELEX_typeSEMICOLON:
2613 if (ffesta_first_kw == FFESTR_firstELSEIF)
2614 goto bad_0; /* :::::::::::::::::::: */
2615 ffesta_confirmed ();
2616 ffesta_tokens[1] = NULL;
2617 return (ffelexHandler) ffestb_else1_ (t);
2619 case FFELEX_typeNAME:
2620 ffesta_confirmed ();
2621 goto bad_1; /* :::::::::::::::::::: */
2623 case FFELEX_typeOPEN_PAREN:
2624 if (ffesta_first_kw != FFESTR_firstELSEIF)
2625 goto bad_0; /* :::::::::::::::::::: */
2626 ffesta_tokens[1] = NULL;
2627 return (ffelexHandler) ffestb_else1_ (t);
2629 case FFELEX_typeCOMMA:
2630 case FFELEX_typeCOLONCOLON:
2631 ffesta_confirmed (); /* Error, but clearly intended. */
2632 goto bad_1; /* :::::::::::::::::::: */
2635 goto bad_1; /* :::::::::::::::::::: */
2638 case FFELEX_typeNAMES:
2639 switch (ffelex_token_type (t))
2641 case FFELEX_typeCOMMA:
2642 case FFELEX_typeCOLONCOLON:
2643 ffesta_confirmed (); /* Error, but clearly intended. */
2644 goto bad_1; /* :::::::::::::::::::: */
2647 goto bad_1; /* :::::::::::::::::::: */
2649 case FFELEX_typeOPEN_PAREN:
2650 if (ffesta_first_kw != FFESTR_firstELSEIF)
2651 goto bad_1; /* :::::::::::::::::::: */
2652 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlELSEIF)
2654 i = FFESTR_firstlELSEIF;
2655 goto bad_i; /* :::::::::::::::::::: */
2657 ffesta_tokens[1] = NULL;
2658 return (ffelexHandler) ffestb_else1_ (t);
2660 case FFELEX_typeEOS:
2661 case FFELEX_typeSEMICOLON:
2664 ffesta_confirmed ();
2665 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlELSE);
2667 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
2669 if ((ffestb_args.elsexyz.second == FFESTR_secondWHERE)
2670 && (ffelex_token_length (ffesta_tokens[1]) != FFESTR_secondlWHERE))
2671 ffestb_args.elsexyz.second = FFESTR_secondNone;
2673 return (ffelexHandler) ffestb_else1_ (t);
2676 goto bad_0; /* :::::::::::::::::::: */
2679 bad_0: /* :::::::::::::::::::: */
2680 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", ffesta_tokens[0]);
2681 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2683 bad_1: /* :::::::::::::::::::: */
2684 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", t);
2685 return (ffelexHandler) ffelex_swallow_tokens (t,
2686 (ffelexHandler) ffesta_zero); /* Invalid second token. */
2688 bad_i: /* :::::::::::::::::::: */
2689 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ELSE IF", ffesta_tokens[0], i, t);
2690 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2693 /* ffestb_else1_ -- "ELSE" (NAME)
2695 return ffestb_else1_; // to lexer
2697 If EOS/SEMICOLON, implement the appropriate statement (keep in mind that
2698 "ELSE WHERE" is ambiguous at the syntactic level). If OPEN_PAREN, start
2699 expression analysis with callback at _2_. */
2701 static ffelexHandler
2702 ffestb_else1_ (ffelexToken t)
2704 switch (ffelex_token_type (t))
2706 case FFELEX_typeOPEN_PAREN:
2707 if (ffestb_args.elsexyz.second == FFESTR_secondIF)
2709 if (ffesta_tokens[1] != NULL)
2710 ffelex_token_kill (ffesta_tokens[1]);
2711 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
2712 FFEEXPR_contextIF, (ffeexprCallback) ffestb_else2_);
2716 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", t);
2717 if (ffesta_tokens[1] != NULL)
2718 ffelex_token_kill (ffesta_tokens[1]);
2719 return (ffelexHandler) ffelex_swallow_tokens (t,
2720 (ffelexHandler) ffesta_zero);
2722 case FFELEX_typeEOS:
2723 case FFELEX_typeSEMICOLON:
2724 ffesta_confirmed ();
2729 switch (ffestb_args.elsexyz.second)
2732 case FFESTR_secondWHERE:
2733 if (!ffesta_is_inhibited ())
2734 if ((ffesta_first_kw == FFESTR_firstELSEWHERE)
2735 && (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME))
2738 ffestc_elsewhere (ffesta_tokens[1]); /* R744 or R805. */
2743 if (!ffesta_is_inhibited ())
2744 ffestc_R805 (ffesta_tokens[1]);
2748 if (ffesta_tokens[1] != NULL)
2749 ffelex_token_kill (ffesta_tokens[1]);
2750 return (ffelexHandler) ffesta_zero (t);
2753 /* ffestb_else2_ -- "ELSE" "IF" OPEN_PAREN expr
2755 (ffestb_else2_) // to expression handler
2757 Make sure the next token is CLOSE_PAREN. */
2759 static ffelexHandler
2760 ffestb_else2_ (ffelexToken ft, ffebld expr, ffelexToken t)
2762 ffestb_local_.else_stmt.expr = expr;
2764 switch (ffelex_token_type (t))
2766 case FFELEX_typeCLOSE_PAREN:
2769 ffesta_tokens[1] = ffelex_token_use (ft);
2770 ffelex_set_names (TRUE);
2771 return (ffelexHandler) ffestb_else3_;
2777 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t);
2778 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2781 /* ffestb_else3_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN
2783 return ffestb_else3_; // to lexer
2785 Make sure the next token is "THEN". */
2787 static ffelexHandler
2788 ffestb_else3_ (ffelexToken t)
2793 ffelex_set_names (FALSE);
2795 switch (ffelex_token_type (t))
2797 case FFELEX_typeNAME:
2798 ffesta_confirmed ();
2799 if (ffestr_first (t) == FFESTR_firstTHEN)
2800 return (ffelexHandler) ffestb_else4_;
2803 case FFELEX_typeNAMES:
2804 ffesta_confirmed ();
2805 if (ffestr_first (t) != FFESTR_firstTHEN)
2807 if (ffelex_token_length (t) == FFESTR_firstlTHEN)
2808 return (ffelexHandler) ffestb_else4_;
2809 p = ffelex_token_text (t) + (i = FFESTR_firstlTHEN);
2810 if (!ffesrc_is_name_init (*p))
2811 goto bad_i; /* :::::::::::::::::::: */
2812 ffesta_tokens[2] = ffelex_token_name_from_names (t, i, 0);
2813 return (ffelexHandler) ffestb_else5_;
2819 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t);
2820 ffelex_token_kill (ffesta_tokens[1]);
2821 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2823 bad_i: /* :::::::::::::::::::: */
2824 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t, i, NULL);
2825 ffelex_token_kill (ffesta_tokens[1]);
2826 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2829 /* ffestb_else4_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN "THEN"
2831 return ffestb_else4_; // to lexer
2833 Handle a NAME or EOS/SEMICOLON, then go to state _5_. */
2835 static ffelexHandler
2836 ffestb_else4_ (ffelexToken t)
2838 ffelex_set_names (FALSE);
2840 switch (ffelex_token_type (t))
2842 case FFELEX_typeEOS:
2843 case FFELEX_typeSEMICOLON:
2844 ffesta_tokens[2] = NULL;
2845 return (ffelexHandler) ffestb_else5_ (t);
2847 case FFELEX_typeNAME:
2848 ffesta_tokens[2] = ffelex_token_use (t);
2849 return (ffelexHandler) ffestb_else5_;
2855 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t);
2856 ffelex_token_kill (ffesta_tokens[1]);
2857 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2860 /* ffestb_else5_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN "THEN"
2862 return ffestb_else5_; // to lexer
2864 Make sure the next token is EOS or SEMICOLON; implement R804. */
2866 static ffelexHandler
2867 ffestb_else5_ (ffelexToken t)
2869 switch (ffelex_token_type (t))
2871 case FFELEX_typeEOS:
2872 case FFELEX_typeSEMICOLON:
2873 if (!ffesta_is_inhibited ())
2874 ffestc_R804 (ffestb_local_.else_stmt.expr, ffesta_tokens[1],
2876 ffelex_token_kill (ffesta_tokens[1]);
2877 if (ffesta_tokens[2] != NULL)
2878 ffelex_token_kill (ffesta_tokens[2]);
2879 return (ffelexHandler) ffesta_zero (t);
2885 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t);
2886 ffelex_token_kill (ffesta_tokens[1]);
2887 if (ffesta_tokens[2] != NULL)
2888 ffelex_token_kill (ffesta_tokens[2]);
2889 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2892 /* ffestb_end -- Parse the END statement
2894 return ffestb_end; // to lexer
2896 Make sure the statement has a valid form for the END statement. If it
2897 does, implement the statement. */
2900 ffestb_end (ffelexToken t)
2904 switch (ffelex_token_type (ffesta_tokens[0]))
2906 case FFELEX_typeNAME:
2907 if (ffesta_first_kw != FFESTR_firstEND)
2908 goto bad_0; /* :::::::::::::::::::: */
2909 switch (ffelex_token_type (t))
2911 case FFELEX_typeEOS:
2912 case FFELEX_typeSEMICOLON:
2913 ffesta_tokens[1] = NULL;
2914 ffestb_args.endxyz.second = FFESTR_secondNone;
2915 return (ffelexHandler) ffestb_end3_ (t);
2917 case FFELEX_typeCOMMA:
2918 case FFELEX_typeCOLONCOLON:
2919 ffesta_confirmed (); /* Error, but clearly intended. */
2920 goto bad_1; /* :::::::::::::::::::: */
2923 goto bad_1; /* :::::::::::::::::::: */
2925 case FFELEX_typeNAME:
2929 ffesta_confirmed ();
2930 ffestb_args.endxyz.second = ffesta_second_kw;
2931 switch (ffesta_second_kw)
2933 case FFESTR_secondFILE:
2934 ffestb_args.beru.badname = "ENDFILE";
2935 return (ffelexHandler) ffestb_beru;
2937 case FFESTR_secondBLOCK:
2938 return (ffelexHandler) ffestb_end1_;
2941 case FFESTR_secondINTERFACE:
2944 case FFESTR_secondMAP:
2945 case FFESTR_secondSTRUCTURE:
2946 case FFESTR_secondUNION:
2949 case FFESTR_secondWHERE:
2950 ffesta_tokens[1] = NULL;
2951 return (ffelexHandler) ffestb_end3_;
2954 case FFESTR_secondNone:
2955 goto bad_1; /* :::::::::::::::::::: */
2958 return (ffelexHandler) ffestb_end2_;
2961 case FFELEX_typeNAMES:
2962 if (ffesta_first_kw != FFESTR_firstEND)
2963 goto bad_0; /* :::::::::::::::::::: */
2964 switch (ffelex_token_type (t))
2966 case FFELEX_typeCOMMA:
2967 case FFELEX_typeCOLONCOLON:
2968 ffesta_confirmed (); /* Error, but clearly intended. */
2969 goto bad_1; /* :::::::::::::::::::: */
2972 goto bad_1; /* :::::::::::::::::::: */
2974 case FFELEX_typeEOS:
2975 case FFELEX_typeSEMICOLON:
2978 ffesta_confirmed ();
2979 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlEND)
2981 i = FFESTR_firstlEND;
2982 goto bad_i; /* :::::::::::::::::::: */
2984 ffesta_tokens[1] = NULL;
2985 ffestb_args.endxyz.second = FFESTR_secondNone;
2986 return (ffelexHandler) ffestb_end3_ (t);
2989 goto bad_0; /* :::::::::::::::::::: */
2992 bad_0: /* :::::::::::::::::::: */
2993 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0]);
2994 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
2996 bad_1: /* :::::::::::::::::::: */
2997 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
2998 return (ffelexHandler) ffelex_swallow_tokens (t,
2999 (ffelexHandler) ffesta_zero); /* Invalid second token. */
3001 bad_i: /* :::::::::::::::::::: */
3002 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0], i, t);
3003 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3006 /* ffestb_endxyz -- Parse an ENDxyz statement
3008 return ffestb_endxyz; // to lexer
3010 Expects len and second to be set in ffestb_args.endxyz to the length
3011 of the ENDxyz keyword involved and the corresponding ffestrSecond value. */
3014 ffestb_endxyz (ffelexToken t)
3019 switch (ffelex_token_type (ffesta_tokens[0]))
3021 case FFELEX_typeNAME:
3022 switch (ffelex_token_type (t))
3024 case FFELEX_typeEOS:
3025 case FFELEX_typeSEMICOLON:
3026 ffesta_confirmed ();
3027 ffesta_tokens[1] = NULL;
3028 return (ffelexHandler) ffestb_end3_ (t);
3030 case FFELEX_typeNAME:
3031 ffesta_confirmed ();
3032 switch (ffestb_args.endxyz.second)
3035 case FFESTR_secondINTERFACE:
3038 case FFESTR_secondMAP:
3039 case FFESTR_secondSTRUCTURE:
3040 case FFESTR_secondUNION:
3043 case FFESTR_secondWHERE:
3044 goto bad_1; /* :::::::::::::::::::: */
3047 case FFESTR_secondBLOCK:
3048 if (ffesta_second_kw != FFESTR_secondDATA)
3049 goto bad_1; /* :::::::::::::::::::: */
3050 return (ffelexHandler) ffestb_end2_;
3053 return (ffelexHandler) ffestb_end2_ (t);
3056 case FFELEX_typeCOMMA:
3057 case FFELEX_typeCOLONCOLON:
3058 ffesta_confirmed (); /* Error, but clearly intended. */
3059 goto bad_1; /* :::::::::::::::::::: */
3062 goto bad_1; /* :::::::::::::::::::: */
3065 case FFELEX_typeNAMES:
3066 switch (ffelex_token_type (t))
3068 case FFELEX_typeCOMMA:
3069 case FFELEX_typeCOLONCOLON:
3070 ffesta_confirmed (); /* Error, but clearly intended. */
3071 goto bad_1; /* :::::::::::::::::::: */
3074 goto bad_1; /* :::::::::::::::::::: */
3076 case FFELEX_typeEOS:
3077 case FFELEX_typeSEMICOLON:
3080 ffesta_confirmed ();
3081 if (ffestb_args.endxyz.second == FFESTR_secondBLOCK)
3083 i = FFESTR_firstlEND;
3084 goto bad_i; /* :::::::::::::::::::: */
3086 if (ffelex_token_length (ffesta_tokens[0]) != ffestb_args.endxyz.len)
3088 p = ffelex_token_text (ffesta_tokens[0])
3089 + (i = ffestb_args.endxyz.len);
3090 switch (ffestb_args.endxyz.second)
3093 case FFESTR_secondINTERFACE:
3096 case FFESTR_secondMAP:
3097 case FFESTR_secondSTRUCTURE:
3098 case FFESTR_secondUNION:
3101 case FFESTR_secondWHERE:
3102 goto bad_i; /* :::::::::::::::::::: */
3108 if (!ffesrc_is_name_init (*p))
3109 goto bad_i; /* :::::::::::::::::::: */
3111 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
3112 return (ffelexHandler) ffestb_end3_ (t);
3114 ffesta_tokens[1] = NULL;
3115 return (ffelexHandler) ffestb_end3_ (t);
3118 goto bad_0; /* :::::::::::::::::::: */
3121 bad_0: /* :::::::::::::::::::: */
3122 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0]);
3123 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3125 bad_1: /* :::::::::::::::::::: */
3126 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
3127 return (ffelexHandler) ffelex_swallow_tokens (t,
3128 (ffelexHandler) ffesta_zero); /* Invalid second token. */
3130 bad_i: /* :::::::::::::::::::: */
3131 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0], i, t);
3132 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3135 /* ffestb_end1_ -- "END" "BLOCK"
3137 return ffestb_end1_; // to lexer
3139 Make sure the next token is "DATA". */
3141 static ffelexHandler
3142 ffestb_end1_ (ffelexToken t)
3144 if ((ffelex_token_type (t) == FFELEX_typeNAME)
3145 && (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t), "DATA",
3149 return (ffelexHandler) ffestb_end2_;
3152 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
3153 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3156 /* ffestb_end2_ -- "END" <unit-kind>
3158 return ffestb_end2_; // to lexer
3160 Make sure the next token is a NAME or EOS. */
3162 static ffelexHandler
3163 ffestb_end2_ (ffelexToken t)
3165 switch (ffelex_token_type (t))
3167 case FFELEX_typeNAME:
3168 ffesta_tokens[1] = ffelex_token_use (t);
3169 return (ffelexHandler) ffestb_end3_;
3171 case FFELEX_typeEOS:
3172 case FFELEX_typeSEMICOLON:
3173 ffesta_tokens[1] = NULL;
3174 return (ffelexHandler) ffestb_end3_ (t);
3177 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
3178 return (ffelexHandler) ffelex_swallow_tokens (t,
3179 (ffelexHandler) ffesta_zero);
3183 /* ffestb_end3_ -- "END" <unit-kind> (NAME)
3185 return ffestb_end3_; // to lexer
3187 Make sure the next token is an EOS, then implement the statement. */
3189 static ffelexHandler
3190 ffestb_end3_ (ffelexToken t)
3192 switch (ffelex_token_type (t))
3195 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
3196 if (ffesta_tokens[1] != NULL)
3197 ffelex_token_kill (ffesta_tokens[1]);
3198 return (ffelexHandler) ffelex_swallow_tokens (t,
3199 (ffelexHandler) ffesta_zero);
3201 case FFELEX_typeEOS:
3202 case FFELEX_typeSEMICOLON:
3203 ffesta_confirmed ();
3204 if (ffestb_args.endxyz.second == FFESTR_secondNone)
3206 if (!ffesta_is_inhibited ())
3208 return (ffelexHandler) ffesta_zero (t);
3213 switch (ffestb_args.endxyz.second)
3216 case FFESTR_secondTYPE:
3217 if (!ffesta_is_inhibited ())
3218 ffestc_R425 (ffesta_tokens[1]);
3223 case FFESTR_secondWHERE:
3224 if (!ffesta_is_inhibited ())
3229 case FFESTR_secondIF:
3230 if (!ffesta_is_inhibited ())
3231 ffestc_R806 (ffesta_tokens[1]);
3234 case FFESTR_secondSELECT:
3235 if (!ffesta_is_inhibited ())
3236 ffestc_R811 (ffesta_tokens[1]);
3239 case FFESTR_secondDO:
3240 if (!ffesta_is_inhibited ())
3241 ffestc_R825 (ffesta_tokens[1]);
3244 case FFESTR_secondPROGRAM:
3245 if (!ffesta_is_inhibited ())
3246 ffestc_R1103 (ffesta_tokens[1]);
3250 case FFESTR_secondMODULE:
3251 if (!ffesta_is_inhibited ())
3252 ffestc_R1106 (ffesta_tokens[1]);
3255 case FFESTR_secondBLOCK:
3256 case FFESTR_secondBLOCKDATA:
3257 if (!ffesta_is_inhibited ())
3258 ffestc_R1112 (ffesta_tokens[1]);
3262 case FFESTR_secondINTERFACE:
3263 if (!ffesta_is_inhibited ())
3268 case FFESTR_secondFUNCTION:
3269 if (!ffesta_is_inhibited ())
3270 ffestc_R1221 (ffesta_tokens[1]);
3273 case FFESTR_secondSUBROUTINE:
3274 if (!ffesta_is_inhibited ())
3275 ffestc_R1225 (ffesta_tokens[1]);
3279 case FFESTR_secondSTRUCTURE:
3280 if (!ffesta_is_inhibited ())
3286 case FFESTR_secondUNION:
3287 if (!ffesta_is_inhibited ())
3293 case FFESTR_secondMAP:
3294 if (!ffesta_is_inhibited ())
3300 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0]);
3301 if (ffesta_tokens[1] != NULL)
3302 ffelex_token_kill (ffesta_tokens[1]);
3303 return (ffelexHandler) ffelex_swallow_tokens (t,
3304 (ffelexHandler) ffesta_zero);
3307 if (ffesta_tokens[1] != NULL)
3308 ffelex_token_kill (ffesta_tokens[1]);
3309 return (ffelexHandler) ffesta_zero (t);
3312 /* ffestb_goto -- Parse the GOTO statement
3314 return ffestb_goto; // to lexer
3316 Make sure the statement has a valid form for the GOTO statement. If it
3317 does, implement the statement. */
3320 ffestb_goto (ffelexToken t)
3327 switch (ffelex_token_type (ffesta_tokens[0]))
3329 case FFELEX_typeNAME:
3330 switch (ffesta_first_kw)
3332 case FFESTR_firstGO:
3333 if ((ffelex_token_type (t) != FFELEX_typeNAME)
3334 || (ffesta_second_kw != FFESTR_secondTO))
3335 goto bad_1; /* :::::::::::::::::::: */
3336 ffesta_confirmed ();
3337 return (ffelexHandler) ffestb_goto1_;
3339 case FFESTR_firstGOTO:
3340 return (ffelexHandler) ffestb_goto1_ (t);
3343 goto bad_0; /* :::::::::::::::::::: */
3346 case FFELEX_typeNAMES:
3347 if (ffesta_first_kw != FFESTR_firstGOTO)
3348 goto bad_0; /* :::::::::::::::::::: */
3349 switch (ffelex_token_type (t))
3351 case FFELEX_typeCOLONCOLON:
3352 ffesta_confirmed (); /* Error, but clearly intended. */
3353 goto bad_1; /* :::::::::::::::::::: */
3356 goto bad_1; /* :::::::::::::::::::: */
3358 case FFELEX_typeOPEN_PAREN:
3359 case FFELEX_typePERCENT: /* Since GOTO I%J is apparently valid
3361 case FFELEX_typeCOMMA:
3364 case FFELEX_typeEOS:
3365 case FFELEX_typeSEMICOLON:
3366 ffesta_confirmed ();
3369 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlGOTO)
3371 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlGOTO);
3374 nt = ffelex_token_number_from_names (ffesta_tokens[0], i);
3375 p += ffelex_token_length (nt);
3376 i += ffelex_token_length (nt);
3379 ffelex_token_kill (nt);
3380 goto bad_i; /* :::::::::::::::::::: */
3383 else if (ffesrc_is_name_init (*p))
3385 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
3388 goto bad_i; /* :::::::::::::::::::: */
3389 next = (ffelexHandler) ffestb_goto1_ (nt);
3390 ffelex_token_kill (nt);
3391 return (ffelexHandler) (*next) (t);
3393 return (ffelexHandler) ffestb_goto1_ (t);
3396 goto bad_0; /* :::::::::::::::::::: */
3399 bad_0: /* :::::::::::::::::::: */
3400 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", ffesta_tokens[0]);
3401 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3403 bad_1: /* :::::::::::::::::::: */
3404 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", t);
3405 return (ffelexHandler) ffelex_swallow_tokens (t,
3406 (ffelexHandler) ffesta_zero); /* Invalid second token. */
3408 bad_i: /* :::::::::::::::::::: */
3409 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "GO TO", ffesta_tokens[0], i, t);
3410 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3413 /* ffestb_goto1_ -- "GOTO" or "GO" "TO"
3415 return ffestb_goto1_; // to lexer
3417 Make sure the statement has a valid form for the GOTO statement. If it
3418 does, implement the statement. */
3420 static ffelexHandler
3421 ffestb_goto1_ (ffelexToken t)
3423 switch (ffelex_token_type (t))
3425 case FFELEX_typeNUMBER:
3426 if (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME)
3427 ffesta_confirmed ();
3428 ffesta_tokens[1] = ffelex_token_use (t);
3429 return (ffelexHandler) ffestb_goto2_;
3431 case FFELEX_typeOPEN_PAREN:
3432 ffesta_tokens[1] = ffelex_token_use (t);
3433 ffestb_subrargs_.label_list.labels = ffestt_tokenlist_create ();
3434 ffestb_subrargs_.label_list.handler = (ffelexHandler) ffestb_goto3_;
3435 return (ffelexHandler) ffestb_subr_label_list_;
3437 case FFELEX_typeNAME:
3438 if (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME)
3439 ffesta_confirmed ();
3440 return (ffelexHandler) (*((ffelexHandler)
3441 ffeexpr_lhs (ffesta_output_pool,
3442 FFEEXPR_contextAGOTO,
3443 (ffeexprCallback) ffestb_goto4_)))
3446 case FFELEX_typeEOS:
3447 case FFELEX_typeSEMICOLON:
3448 case FFELEX_typeCOMMA:
3449 case FFELEX_typeCOLONCOLON:
3450 ffesta_confirmed (); /* Error, but clearly intended. */
3457 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", t);
3458 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3461 /* ffestb_goto2_ -- "GO/TO" NUMBER
3463 return ffestb_goto2_; // to lexer
3465 Make sure the statement has a valid form for the GOTO statement. If it
3466 does, implement the statement. */
3468 static ffelexHandler
3469 ffestb_goto2_ (ffelexToken t)
3471 switch (ffelex_token_type (t))
3473 case FFELEX_typeEOS:
3474 case FFELEX_typeSEMICOLON:
3475 ffesta_confirmed ();
3476 if (!ffesta_is_inhibited ())
3477 ffestc_R836 (ffesta_tokens[1]);
3478 ffelex_token_kill (ffesta_tokens[1]);
3479 return (ffelexHandler) ffesta_zero (t);
3485 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", t);
3486 ffelex_token_kill (ffesta_tokens[1]);
3487 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3490 /* ffestb_goto3_ -- "GO/TO" OPEN_PAREN label-list CLOSE_PAREN
3492 return ffestb_goto3_; // to lexer
3494 Make sure the statement has a valid form for the GOTO statement. If it
3495 does, implement the statement. */
3497 static ffelexHandler
3498 ffestb_goto3_ (ffelexToken t)
3500 if (!ffestb_subrargs_.label_list.ok)
3501 goto bad; /* :::::::::::::::::::: */
3503 switch (ffelex_token_type (t))
3505 case FFELEX_typeCOMMA:
3506 ffesta_confirmed ();
3507 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextCGOTO,
3508 (ffeexprCallback) ffestb_goto5_);
3510 case FFELEX_typeEQUALS:
3511 case FFELEX_typePOINTS:
3512 case FFELEX_typeEOS:
3513 case FFELEX_typeSEMICOLON:
3517 ffesta_confirmed ();
3519 case FFELEX_typeOPEN_PAREN: /* Could still be assignment!! */
3520 return (ffelexHandler) (*((ffelexHandler)
3521 ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextCGOTO,
3522 (ffeexprCallback) ffestb_goto5_)))
3526 bad: /* :::::::::::::::::::: */
3527 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "computed-GOTO", t);
3528 ffelex_token_kill (ffesta_tokens[1]);
3529 ffestt_tokenlist_kill (ffestb_subrargs_.label_list.labels);
3530 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3533 /* ffestb_goto4_ -- "GO/TO" expr
3535 (ffestb_goto4_) // to expression handler
3537 Make sure the statement has a valid form for the GOTO statement. If it
3538 does, implement the statement. */
3540 static ffelexHandler
3541 ffestb_goto4_ (ffelexToken ft, ffebld expr, ffelexToken t)
3543 switch (ffelex_token_type (t))
3545 case FFELEX_typeCOMMA:
3546 ffesta_confirmed ();
3549 ffesta_tokens[1] = ffelex_token_use (ft);
3550 ffestb_local_.go_to.expr = expr;
3551 return (ffelexHandler) ffestb_goto6_;
3553 case FFELEX_typeOPEN_PAREN:
3556 ffesta_tokens[1] = ffelex_token_use (ft);
3557 ffestb_local_.go_to.expr = expr;
3558 return (ffelexHandler) ffestb_goto6_ (t);
3560 case FFELEX_typeEOS:
3561 case FFELEX_typeSEMICOLON:
3562 ffesta_confirmed ();
3565 if (!ffesta_is_inhibited ())
3566 ffestc_R839 (expr, ft, NULL);
3567 return (ffelexHandler) ffesta_zero (t);
3573 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assigned-GOTO", t);
3574 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3577 /* ffestb_goto5_ -- "GO/TO" OPEN_PAREN label-list CLOSE_PAREN (COMMA) expr
3579 (ffestb_goto5_) // to expression handler
3581 Make sure the statement has a valid form for the GOTO statement. If it
3582 does, implement the statement. */
3584 static ffelexHandler
3585 ffestb_goto5_ (ffelexToken ft, ffebld expr, ffelexToken t)
3587 switch (ffelex_token_type (t))
3589 case FFELEX_typeEOS:
3590 case FFELEX_typeSEMICOLON:
3593 ffesta_confirmed ();
3594 if (!ffesta_is_inhibited ())
3595 ffestc_R837 (ffestb_subrargs_.label_list.labels, expr, ft);
3596 ffelex_token_kill (ffesta_tokens[1]);
3597 ffestt_tokenlist_kill (ffestb_subrargs_.label_list.labels);
3598 return (ffelexHandler) ffesta_zero (t);
3604 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "computed-GOTO", t);
3605 ffelex_token_kill (ffesta_tokens[1]);
3606 ffestt_tokenlist_kill (ffestb_subrargs_.label_list.labels);
3607 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3610 /* ffestb_goto6_ -- "GO/TO" expr (COMMA)
3612 return ffestb_goto6_; // to lexer
3614 Make sure the statement has a valid form for the GOTO statement. If it
3615 does, implement the statement. */
3617 static ffelexHandler
3618 ffestb_goto6_ (ffelexToken t)
3620 switch (ffelex_token_type (t))
3622 case FFELEX_typeOPEN_PAREN:
3623 ffesta_tokens[2] = ffelex_token_use (t);
3624 ffestb_subrargs_.label_list.labels = ffestt_tokenlist_create ();
3625 ffestb_subrargs_.label_list.handler = (ffelexHandler) ffestb_goto7_;
3626 return (ffelexHandler) ffestb_subr_label_list_;
3632 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assigned-GOTO", t);
3633 ffelex_token_kill (ffesta_tokens[1]);
3634 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3637 /* ffestb_goto7_ -- "GO/TO" expr (COMMA) OPEN_PAREN label-list CLOSE_PAREN
3639 return ffestb_goto7_; // to lexer
3641 Make sure the statement has a valid form for the GOTO statement. If it
3642 does, implement the statement. */
3644 static ffelexHandler
3645 ffestb_goto7_ (ffelexToken t)
3647 if (!ffestb_subrargs_.label_list.ok)
3648 goto bad; /* :::::::::::::::::::: */
3650 switch (ffelex_token_type (t))
3652 case FFELEX_typeEOS:
3653 case FFELEX_typeSEMICOLON:
3654 ffesta_confirmed ();
3655 if (!ffesta_is_inhibited ())
3656 ffestc_R839 (ffestb_local_.go_to.expr, ffesta_tokens[1],
3657 ffestb_subrargs_.label_list.labels);
3658 ffelex_token_kill (ffesta_tokens[1]);
3659 ffelex_token_kill (ffesta_tokens[2]);
3660 ffestt_tokenlist_kill (ffestb_subrargs_.label_list.labels);
3661 return (ffelexHandler) ffesta_zero (t);
3667 bad: /* :::::::::::::::::::: */
3668 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assigned-GOTO", t);
3669 ffelex_token_kill (ffesta_tokens[1]);
3670 ffelex_token_kill (ffesta_tokens[2]);
3671 ffestt_tokenlist_kill (ffestb_subrargs_.label_list.labels);
3672 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3675 /* ffestb_halt -- Parse the STOP/PAUSE statement
3677 return ffestb_halt; // to lexer
3679 Make sure the statement has a valid form for the STOP/PAUSE statement. If
3680 it does, implement the statement. */
3683 ffestb_halt (ffelexToken t)
3687 switch (ffelex_token_type (ffesta_tokens[0]))
3689 case FFELEX_typeNAME:
3690 switch (ffelex_token_type (t))
3692 case FFELEX_typeCOMMA:
3693 case FFELEX_typeCOLONCOLON:
3694 ffesta_confirmed (); /* Error, but clearly intended. */
3695 goto bad_1; /* :::::::::::::::::::: */
3698 goto bad_1; /* :::::::::::::::::::: */
3700 case FFELEX_typeEOS:
3701 case FFELEX_typeSEMICOLON:
3702 case FFELEX_typeNAME:
3703 case FFELEX_typeNUMBER:
3704 case FFELEX_typeAPOSTROPHE:
3705 case FFELEX_typeQUOTE:
3706 ffesta_confirmed ();
3710 return (ffelexHandler) (*((ffelexHandler)
3711 ffeexpr_rhs (ffesta_output_pool,
3712 FFEEXPR_contextSTOP,
3713 (ffeexprCallback) ffestb_halt1_)))
3716 case FFELEX_typeNAMES:
3717 switch (ffelex_token_type (t))
3720 goto bad_1; /* :::::::::::::::::::: */
3722 case FFELEX_typeEOS:
3723 case FFELEX_typeSEMICOLON:
3724 case FFELEX_typeNAME:
3725 case FFELEX_typeNUMBER:
3726 case FFELEX_typeAPOSTROPHE:
3727 case FFELEX_typeQUOTE:
3728 ffesta_confirmed ();
3731 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
3732 FFEEXPR_contextSTOP,
3733 (ffeexprCallback) ffestb_halt1_);
3734 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
3735 ffestb_args.halt.len);
3737 return (ffelexHandler) ffelex_swallow_tokens (t,
3738 (ffelexHandler) ffesta_zero);
3739 return (ffelexHandler) (*next) (t);
3742 goto bad_0; /* :::::::::::::::::::: */
3745 bad_0: /* :::::::::::::::::::: */
3746 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
3747 (ffesta_first_kw == FFESTR_firstSTOP)
3750 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3752 bad_1: /* :::::::::::::::::::: */
3753 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
3754 (ffesta_first_kw == FFESTR_firstSTOP)
3757 return (ffelexHandler) ffelex_swallow_tokens (t,
3758 (ffelexHandler) ffesta_zero); /* Invalid second token. */
3761 /* ffestb_halt1_ -- "STOP/PAUSE" expr
3763 (ffestb_halt1_) // to expression handler
3765 Make sure the next token is an EOS or SEMICOLON. */
3767 static ffelexHandler
3768 ffestb_halt1_ (ffelexToken ft, ffebld expr, ffelexToken t)
3770 switch (ffelex_token_type (t))
3772 case FFELEX_typeEOS:
3773 case FFELEX_typeSEMICOLON:
3774 ffesta_confirmed ();
3775 if (!ffesta_is_inhibited ())
3776 if (ffesta_first_kw == FFESTR_firstSTOP)
3777 ffestc_R842 (expr, ft);
3779 ffestc_R843 (expr, ft);
3780 return (ffelexHandler) ffesta_zero (t);
3783 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
3784 (ffesta_first_kw == FFESTR_firstSTOP)
3790 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3793 /* ffestb_if -- Parse an IF statement
3795 return ffestb_if; // to lexer
3797 Make sure the statement has a valid form for an IF statement.
3798 If it does, implement the statement. */
3801 ffestb_if (ffelexToken t)
3803 switch (ffelex_token_type (ffesta_tokens[0]))
3805 case FFELEX_typeNAME:
3806 if (ffesta_first_kw != FFESTR_firstIF)
3807 goto bad_0; /* :::::::::::::::::::: */
3810 case FFELEX_typeNAMES:
3811 if (ffesta_first_kw != FFESTR_firstIF)
3812 goto bad_0; /* :::::::::::::::::::: */
3813 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlIF)
3814 goto bad_0; /* :::::::::::::::::::: */
3818 goto bad_0; /* :::::::::::::::::::: */
3821 switch (ffelex_token_type (t))
3823 case FFELEX_typeOPEN_PAREN:
3826 case FFELEX_typeEOS:
3827 case FFELEX_typeSEMICOLON:
3828 case FFELEX_typeCOMMA:
3829 case FFELEX_typeCOLONCOLON:
3830 ffesta_confirmed (); /* Error, but clearly intended. */
3831 goto bad_1; /* :::::::::::::::::::: */
3834 goto bad_1; /* :::::::::::::::::::: */
3837 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextIF,
3838 (ffeexprCallback) ffestb_if1_);
3840 bad_0: /* :::::::::::::::::::: */
3841 if (ffesta_construct_name != NULL)
3843 ffelex_token_kill (ffesta_construct_name);
3844 ffesta_construct_name = NULL;
3846 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", ffesta_tokens[0]);
3847 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3849 bad_1: /* :::::::::::::::::::: */
3850 if (ffesta_construct_name != NULL)
3852 ffelex_token_kill (ffesta_construct_name);
3853 ffesta_construct_name = NULL;
3855 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t);
3856 return (ffelexHandler) ffelex_swallow_tokens (t,
3857 (ffelexHandler) ffesta_zero); /* Invalid second token. */
3860 /* ffestb_if1_ -- "IF" OPEN_PAREN expr
3862 (ffestb_if1_) // to expression handler
3864 Make sure the next token is CLOSE_PAREN. */
3866 static ffelexHandler
3867 ffestb_if1_ (ffelexToken ft, ffebld expr, ffelexToken t)
3869 ffestb_local_.if_stmt.expr = expr;
3871 switch (ffelex_token_type (t))
3873 case FFELEX_typeCLOSE_PAREN:
3876 ffesta_tokens[1] = ffelex_token_use (ft);
3877 ffelex_set_names (TRUE);
3878 return (ffelexHandler) ffestb_if2_;
3884 if (ffesta_construct_name != NULL)
3886 ffelex_token_kill (ffesta_construct_name);
3887 ffesta_construct_name = NULL;
3889 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t);
3890 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3893 /* ffestb_if2_ -- "IF" OPEN_PAREN expr CLOSE_PAREN
3895 return ffestb_if2_; // to lexer
3897 Make sure the next token is NAME. */
3899 static ffelexHandler
3900 ffestb_if2_ (ffelexToken t)
3902 ffelex_set_names (FALSE);
3904 switch (ffelex_token_type (t))
3906 case FFELEX_typeNAME:
3907 case FFELEX_typeNAMES:
3908 ffesta_confirmed ();
3909 ffesta_tokens[2] = ffelex_token_use (t);
3910 return (ffelexHandler) ffestb_if3_;
3916 ffelex_token_kill (ffesta_tokens[1]);
3917 if ((ffesta_construct_name == NULL)
3918 || (ffelex_token_type (t) != FFELEX_typeNUMBER))
3919 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t);
3921 ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT",
3922 ffesta_construct_name, t);
3923 if (ffesta_construct_name != NULL)
3925 ffelex_token_kill (ffesta_construct_name);
3926 ffesta_construct_name = NULL;
3928 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3931 /* ffestb_if3_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NAME
3933 return ffestb_if3_; // to lexer
3935 If the next token is EOS or SEMICOLON and the preceding NAME was "THEN",
3936 implement R803. Else, implement R807 and send the preceding NAME followed
3937 by the current token. */
3939 static ffelexHandler
3940 ffestb_if3_ (ffelexToken t)
3944 switch (ffelex_token_type (t))
3946 case FFELEX_typeEOS:
3947 case FFELEX_typeSEMICOLON:
3948 if (ffestr_first (ffesta_tokens[2]) == FFESTR_firstTHEN)
3950 if (!ffesta_is_inhibited ())
3951 ffestc_R803 (ffesta_construct_name, ffestb_local_.if_stmt.expr,
3953 ffelex_token_kill (ffesta_tokens[1]);
3954 ffelex_token_kill (ffesta_tokens[2]);
3955 if (ffesta_construct_name != NULL)
3957 ffelex_token_kill (ffesta_construct_name);
3958 ffesta_construct_name = NULL;
3960 return (ffelexHandler) ffesta_zero (t);
3968 if (ffesta_construct_name != NULL)
3970 if (!ffesta_is_inhibited ())
3971 ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT",
3972 ffesta_construct_name, ffesta_tokens[2]);
3973 ffelex_token_kill (ffesta_construct_name);
3974 ffesta_construct_name = NULL;
3975 ffelex_token_kill (ffesta_tokens[1]);
3976 ffelex_token_kill (ffesta_tokens[2]);
3977 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3980 if (!ffesta_is_inhibited ())
3981 ffestc_R807 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]);
3982 ffelex_token_kill (ffesta_tokens[1]);
3984 ffelexToken my_2 = ffesta_tokens[2];
3986 next = (ffelexHandler) ffesta_two (my_2, t);
3987 ffelex_token_kill (my_2);
3989 return (ffelexHandler) next;
3992 /* ffestb_where -- Parse a WHERE statement
3994 return ffestb_where; // to lexer
3996 Make sure the statement has a valid form for a WHERE statement.
3997 If it does, implement the statement. */
4001 ffestb_where (ffelexToken t)
4003 switch (ffelex_token_type (ffesta_tokens[0]))
4005 case FFELEX_typeNAME:
4006 if (ffesta_first_kw != FFESTR_firstWHERE)
4007 goto bad_0; /* :::::::::::::::::::: */
4010 case FFELEX_typeNAMES:
4011 if (ffesta_first_kw != FFESTR_firstWHERE)
4012 goto bad_0; /* :::::::::::::::::::: */
4013 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlWHERE)
4014 goto bad_0; /* :::::::::::::::::::: */
4018 goto bad_0; /* :::::::::::::::::::: */
4021 switch (ffelex_token_type (t))
4023 case FFELEX_typeOPEN_PAREN:
4026 case FFELEX_typeEOS:
4027 case FFELEX_typeSEMICOLON:
4028 case FFELEX_typeCOMMA:
4029 case FFELEX_typeCOLONCOLON:
4030 ffesta_confirmed (); /* Error, but clearly intended. */
4031 goto bad_1; /* :::::::::::::::::::: */
4034 goto bad_1; /* :::::::::::::::::::: */
4037 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextWHERE,
4038 (ffeexprCallback) ffestb_where1_);
4040 bad_0: /* :::::::::::::::::::: */
4041 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", ffesta_tokens[0]);
4042 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4044 bad_1: /* :::::::::::::::::::: */
4045 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t);
4046 return (ffelexHandler) ffelex_swallow_tokens (t,
4047 (ffelexHandler) ffesta_zero); /* Invalid second token. */
4051 /* ffestb_where1_ -- "WHERE" OPEN_PAREN expr
4053 (ffestb_where1_) // to expression handler
4055 Make sure the next token is CLOSE_PAREN. */
4058 static ffelexHandler
4059 ffestb_where1_ (ffelexToken ft, ffebld expr, ffelexToken t)
4061 ffestb_local_.if_stmt.expr = expr;
4063 switch (ffelex_token_type (t))
4065 case FFELEX_typeCLOSE_PAREN:
4068 ffesta_tokens[1] = ffelex_token_use (ft);
4069 ffelex_set_names (TRUE);
4070 return (ffelexHandler) ffestb_where2_;
4076 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t);
4077 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4081 /* ffestb_where2_ -- "WHERE" OPEN_PAREN expr CLOSE_PAREN
4083 return ffestb_where2_; // to lexer
4085 Make sure the next token is NAME. */
4088 static ffelexHandler
4089 ffestb_where2_ (ffelexToken t)
4091 ffelex_set_names (FALSE);
4093 switch (ffelex_token_type (t))
4095 case FFELEX_typeNAME:
4096 case FFELEX_typeNAMES:
4097 ffesta_confirmed ();
4098 ffesta_tokens[2] = ffelex_token_use (t);
4099 return (ffelexHandler) ffestb_where3_;
4101 case FFELEX_typeEOS:
4102 case FFELEX_typeSEMICOLON:
4103 ffesta_confirmed ();
4104 if (!ffesta_is_inhibited ())
4105 ffestc_R742 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]);
4106 ffelex_token_kill (ffesta_tokens[1]);
4107 return (ffelexHandler) ffesta_zero (t);
4113 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t);
4114 ffelex_token_kill (ffesta_tokens[1]);
4115 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4119 /* ffestb_where3_ -- "WHERE" OPEN_PAREN expr CLOSE_PAREN NAME
4121 return ffestb_where3_; // to lexer
4126 static ffelexHandler
4127 ffestb_where3_ (ffelexToken t)
4130 ffelexToken my_2 = ffesta_tokens[2];
4132 if (!ffesta_is_inhibited ())
4133 ffestc_R740 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]);
4134 ffelex_token_kill (ffesta_tokens[1]);
4135 next = (ffelexHandler) ffesta_two (my_2, t);
4136 ffelex_token_kill (my_2);
4137 return (ffelexHandler) next;
4141 /* ffestb_let -- Parse an assignment statement
4143 return ffestb_let; // to lexer
4145 Make sure the statement has a valid form for an assignment statement. If
4146 it does, implement the statement. */
4149 ffestb_let (ffelexToken t)
4152 bool vxtparam; /* TRUE if it might really be a VXT PARAMETER
4156 switch (ffelex_token_type (ffesta_tokens[0]))
4158 case FFELEX_typeNAME:
4162 case FFELEX_typeNAMES:
4167 goto bad_0; /* :::::::::::::::::::: */
4170 switch (ffelex_token_type (t))
4172 case FFELEX_typeOPEN_PAREN:
4173 case FFELEX_typePERCENT:
4174 case FFELEX_typePOINTS:
4175 ffestb_local_.let.vxtparam = FALSE;
4178 case FFELEX_typeEQUALS:
4179 if (!vxtparam || (ffesta_first_kw != FFESTR_firstPARAMETER))
4181 ffestb_local_.let.vxtparam = FALSE;
4184 p = ffelex_token_text (ffesta_tokens[0]) + FFESTR_firstlPARAMETER;
4185 ffestb_local_.let.vxtparam = ffesrc_is_name_init (*p);
4189 goto bad_1; /* :::::::::::::::::::: */
4192 next = (ffelexHandler) (*((ffelexHandler)
4193 ffeexpr_lhs (ffesta_output_pool,
4195 (ffeexprCallback) ffestb_let1_)))
4197 return (ffelexHandler) (*next) (t);
4199 bad_0: /* :::::::::::::::::::: */
4200 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", ffesta_tokens[0]);
4201 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4203 bad_1: /* :::::::::::::::::::: */
4204 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", t);
4205 return (ffelexHandler) ffelex_swallow_tokens (t,
4206 (ffelexHandler) ffesta_zero); /* Invalid second token. */
4209 /* ffestb_let1_ -- expr
4211 (ffestb_let1_) // to expression handler
4213 Make sure the next token is EQUALS or POINTS. */
4215 static ffelexHandler
4216 ffestb_let1_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
4218 ffestb_local_.let.dest = expr;
4220 switch (ffelex_token_type (t))
4223 case FFELEX_typePOINTS:
4225 case FFELEX_typeEQUALS:
4228 ffesta_tokens[1] = ffelex_token_use (t);
4229 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
4230 FFEEXPR_contextLET, (ffeexprCallback) ffestb_let2_);
4236 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", t);
4237 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4240 /* ffestb_let2_ -- expr EQUALS/POINTS expr
4242 (ffestb_end2_) // to expression handler
4244 Make sure the next token is EOS or SEMICOLON; implement the statement. */
4246 static ffelexHandler
4247 ffestb_let2_ (ffelexToken ft, ffebld expr, ffelexToken t)
4249 switch (ffelex_token_type (t))
4251 case FFELEX_typeEOS:
4252 case FFELEX_typeSEMICOLON:
4255 if (ffestb_local_.let.vxtparam && !ffestc_is_let_not_V027 ())
4257 ffesta_confirmed ();
4258 if (!ffesta_is_inhibited ())
4260 if (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeEQUALS)
4262 ffestc_let (ffestb_local_.let.dest, expr, ft);
4265 ffestc_R738 (ffestb_local_.let.dest, expr, ft);
4267 ffelex_token_kill (ffesta_tokens[1]);
4268 return (ffelexHandler) ffesta_zero (t);
4274 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
4275 (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeEQUALS)
4276 ? "assignment" : "pointer-assignment",
4278 ffelex_token_kill (ffesta_tokens[1]);
4279 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4282 /* ffestb_type -- Parse the TYPE statement
4284 return ffestb_type; // to lexer
4286 Make sure the statement has a valid form for the TYPE statement. If
4287 it does, implement the statement. */
4291 ffestb_type (ffelexToken t)
4296 switch (ffelex_token_type (ffesta_tokens[0]))
4298 case FFELEX_typeNAME:
4299 if (ffesta_first_kw != FFESTR_firstTYPE)
4300 goto bad_0; /* :::::::::::::::::::: */
4301 switch (ffelex_token_type (t))
4303 case FFELEX_typeEOS:
4304 case FFELEX_typeSEMICOLON:
4305 case FFELEX_typeCOLONCOLON:
4306 ffesta_confirmed (); /* Error, but clearly intended. */
4307 goto bad_1; /* :::::::::::::::::::: */
4310 goto bad_1; /* :::::::::::::::::::: */
4312 case FFELEX_typeCOMMA:
4313 ffesta_confirmed ();
4314 return (ffelexHandler) ffestb_type1_;
4316 case FFELEX_typeNAME: /* No confirm here, because ambig w/V020 VXT
4318 ffesta_tokens[1] = NULL;
4319 ffesta_tokens[2] = ffelex_token_use (t);
4320 return (ffelexHandler) ffestb_type4_;
4323 case FFELEX_typeNAMES:
4324 if (ffesta_first_kw != FFESTR_firstTYPE)
4325 goto bad_0; /* :::::::::::::::::::: */
4326 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlTYPE);
4327 switch (ffelex_token_type (t))
4330 goto bad_1; /* :::::::::::::::::::: */
4332 case FFELEX_typeCOMMA:
4334 goto bad_i; /* :::::::::::::::::::: */
4335 ffesta_confirmed ();
4336 ffelex_set_names (TRUE);
4337 return (ffelexHandler) ffestb_type1_;
4339 case FFELEX_typeEOS:
4340 case FFELEX_typeSEMICOLON:
4343 if (!ffesrc_is_name_init (*p))
4344 goto bad_i; /* :::::::::::::::::::: */
4345 ffesta_tokens[1] = NULL;
4347 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
4348 return (ffelexHandler) ffestb_type4_ (t);
4351 goto bad_0; /* :::::::::::::::::::: */
4354 bad_0: /* :::::::::::::::::::: */
4355 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", ffesta_tokens[0]);
4356 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4358 bad_1: /* :::::::::::::::::::: */
4359 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4360 return (ffelexHandler) ffelex_swallow_tokens (t,
4361 (ffelexHandler) ffesta_zero); /* Invalid second token. */
4363 bad_i: /* :::::::::::::::::::: */
4364 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "TYPE", ffesta_tokens[0], i, t);
4365 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4368 /* ffestb_type1_ -- "TYPE" COMMA
4370 return ffestb_type1_; // to lexer
4372 Make sure the next token is a NAME. */
4374 static ffelexHandler
4375 ffestb_type1_ (ffelexToken t)
4380 ffelex_set_names (FALSE);
4382 switch (ffelex_token_type (t))
4384 case FFELEX_typeNAME:
4385 ffesta_tokens[1] = ffelex_token_use (t);
4386 ffestb_local_.type.kw = ffestr_other (t);
4387 switch (ffestb_local_.varlist.kw)
4389 case FFESTR_otherPUBLIC:
4390 case FFESTR_otherPRIVATE:
4391 return (ffelexHandler) ffestb_type2_;
4394 ffelex_token_kill (ffesta_tokens[1]);
4399 case FFELEX_typeNAMES:
4400 ffesta_tokens[1] = ffelex_token_use (t);
4401 ffestb_local_.type.kw = ffestr_other (t);
4402 switch (ffestb_local_.varlist.kw)
4404 case FFESTR_otherPUBLIC:
4405 p = ffelex_token_text (t) + (i = FFESTR_otherlPUBLIC);
4407 return (ffelexHandler) ffestb_type2_;
4408 if (!ffesrc_is_name_init (*p))
4409 goto bad_i1; /* :::::::::::::::::::: */
4410 ffesta_tokens[2] = ffelex_token_name_from_names (t, i, 0);
4411 return (ffelexHandler) ffestb_type4_;
4413 case FFESTR_otherPRIVATE:
4414 p = ffelex_token_text (t) + (i = FFESTR_otherlPRIVATE);
4416 return (ffelexHandler) ffestb_type2_;
4417 if (!ffesrc_is_name_init (*p))
4418 goto bad_i1; /* :::::::::::::::::::: */
4419 ffesta_tokens[2] = ffelex_token_name_from_names (t, i, 0);
4420 return (ffelexHandler) ffestb_type4_;
4423 ffelex_token_kill (ffesta_tokens[1]);
4432 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4433 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4435 bad_i1: /* :::::::::::::::::::: */
4436 ffelex_token_kill (ffesta_tokens[1]);
4437 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "TYPE", t, i, NULL);
4438 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4441 /* ffestb_type2_ -- "TYPE" COMMA NAME
4443 return ffestb_type2_; // to lexer
4445 Handle COLONCOLON or NAME. */
4447 static ffelexHandler
4448 ffestb_type2_ (ffelexToken t)
4450 switch (ffelex_token_type (t))
4452 case FFELEX_typeCOLONCOLON:
4453 return (ffelexHandler) ffestb_type3_;
4455 case FFELEX_typeNAME:
4456 return (ffelexHandler) ffestb_type3_ (t);
4462 if (ffesta_tokens[1] != NULL)
4463 ffelex_token_kill (ffesta_tokens[1]);
4464 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4465 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4468 /* ffestb_type3_ -- "TYPE" [COMMA NAME [COLONCOLON]]
4470 return ffestb_type3_; // to lexer
4472 Make sure the next token is a NAME. */
4474 static ffelexHandler
4475 ffestb_type3_ (ffelexToken t)
4477 switch (ffelex_token_type (t))
4479 case FFELEX_typeNAME:
4480 ffesta_tokens[2] = ffelex_token_use (t);
4481 return (ffelexHandler) ffestb_type4_;
4484 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4488 if (ffesta_tokens[1] != NULL)
4489 ffelex_token_kill (ffesta_tokens[1]);
4490 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4493 /* ffestb_type4_ -- "TYPE" [COMMA NAME [COLONCOLON]] NAME
4495 return ffestb_type4_; // to lexer
4497 Make sure the next token is an EOS or SEMICOLON. */
4499 static ffelexHandler
4500 ffestb_type4_ (ffelexToken t)
4502 switch (ffelex_token_type (t))
4504 case FFELEX_typeEOS:
4505 case FFELEX_typeSEMICOLON:
4506 ffesta_confirmed ();
4507 if (!ffesta_is_inhibited ())
4508 ffestc_R424 (ffesta_tokens[1], ffestb_local_.type.kw,
4510 if (ffesta_tokens[1] != NULL)
4511 ffelex_token_kill (ffesta_tokens[1]);
4512 ffelex_token_kill (ffesta_tokens[2]);
4513 return (ffelexHandler) ffesta_zero (t);
4516 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4520 if (ffesta_tokens[1] != NULL)
4521 ffelex_token_kill (ffesta_tokens[1]);
4522 ffelex_token_kill (ffesta_tokens[2]);
4523 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4527 /* ffestb_varlist -- Parse EXTERNAL/INTENT/INTRINSIC/OPTIONAL/PUBLIC/PRIVATE
4530 return ffestb_varlist; // to lexer
4532 Make sure the statement has a valid form. If it
4533 does, implement the statement. */
4536 ffestb_varlist (ffelexToken t)
4543 switch (ffelex_token_type (ffesta_tokens[0]))
4545 case FFELEX_typeNAME:
4546 switch (ffelex_token_type (t))
4548 case FFELEX_typeEOS:
4549 case FFELEX_typeSEMICOLON:
4550 ffesta_confirmed ();
4551 switch (ffesta_first_kw)
4554 case FFESTR_firstPUBLIC:
4555 if (!ffesta_is_inhibited ())
4557 return (ffelexHandler) ffesta_zero (t);
4559 case FFESTR_firstPRIVATE:
4560 if (!ffesta_is_inhibited ())
4561 ffestc_private (); /* Either R523A or R521B. */
4562 return (ffelexHandler) ffesta_zero (t);
4566 goto bad_1; /* :::::::::::::::::::: */
4569 case FFELEX_typeCOMMA:
4570 ffesta_confirmed (); /* Error, but clearly intended. */
4571 goto bad_1; /* :::::::::::::::::::: */
4573 case FFELEX_typeCOLONCOLON:
4574 ffesta_confirmed ();
4575 switch (ffesta_first_kw)
4578 case FFESTR_firstOPTIONAL:
4579 if (!ffesta_is_inhibited ())
4580 ffestc_R520_start ();
4583 case FFESTR_firstPUBLIC:
4584 if (!ffesta_is_inhibited ())
4585 ffestc_R521Astart ();
4588 case FFESTR_firstPRIVATE:
4589 if (!ffesta_is_inhibited ())
4590 ffestc_R521Bstart ();
4595 ffesta_confirmed (); /* Error, but clearly intended. */
4596 goto bad_1; /* :::::::::::::::::::: */
4598 return (ffelexHandler) ffestb_varlist5_;
4601 goto bad_1; /* :::::::::::::::::::: */
4603 case FFELEX_typeOPEN_PAREN:
4604 switch (ffesta_first_kw)
4607 case FFESTR_firstINTENT:
4608 return (ffelexHandler) ffestb_varlist1_;
4612 goto bad_1; /* :::::::::::::::::::: */
4615 case FFELEX_typeNAME:
4616 ffesta_confirmed ();
4617 switch (ffesta_first_kw)
4619 case FFESTR_firstEXTERNAL:
4620 if (!ffesta_is_inhibited ())
4621 ffestc_R1207_start ();
4625 case FFESTR_firstINTENT:
4626 goto bad_1; /* :::::::::::::::::::: */
4629 case FFESTR_firstINTRINSIC:
4630 if (!ffesta_is_inhibited ())
4631 ffestc_R1208_start ();
4635 case FFESTR_firstOPTIONAL:
4636 if (!ffesta_is_inhibited ())
4637 ffestc_R520_start ();
4642 case FFESTR_firstPUBLIC:
4643 if (!ffesta_is_inhibited ())
4644 ffestc_R521Astart ();
4647 case FFESTR_firstPRIVATE:
4648 if (!ffesta_is_inhibited ())
4649 ffestc_R521Bstart ();
4656 return (ffelexHandler) ffestb_varlist5_ (t);
4659 case FFELEX_typeNAMES:
4660 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.varlist.len);
4661 switch (ffelex_token_type (t))
4663 case FFELEX_typeEOS:
4664 case FFELEX_typeSEMICOLON:
4665 ffesta_confirmed ();
4666 switch (ffesta_first_kw)
4669 case FFESTR_firstINTENT:
4670 goto bad_1; /* :::::::::::::::::::: */
4678 switch (ffesta_first_kw)
4681 case FFESTR_firstPUBLIC:
4682 if (!ffesta_is_inhibited ())
4684 return (ffelexHandler) ffesta_zero (t);
4686 case FFESTR_firstPRIVATE:
4687 if (!ffesta_is_inhibited ())
4688 ffestc_private (); /* Either R423A or R521B. */
4689 return (ffelexHandler) ffesta_zero (t);
4693 goto bad_1; /* :::::::::::::::::::: */
4696 case FFELEX_typeCOMMA:
4697 ffesta_confirmed (); /* Error, but clearly intended. */
4698 switch (ffesta_first_kw)
4701 case FFESTR_firstINTENT:
4702 goto bad_1; /* :::::::::::::::::::: */
4710 goto bad_1; /* :::::::::::::::::::: */
4712 case FFELEX_typeCOLONCOLON:
4713 ffesta_confirmed ();
4714 switch (ffesta_first_kw)
4717 case FFESTR_firstOPTIONAL:
4718 if (!ffesta_is_inhibited ())
4719 ffestc_R520_start ();
4724 case FFESTR_firstPUBLIC:
4725 if (!ffesta_is_inhibited ())
4726 ffestc_R521Astart ();
4729 case FFESTR_firstPRIVATE:
4730 if (!ffesta_is_inhibited ())
4731 ffestc_R521Bstart ();
4736 goto bad_1; /* :::::::::::::::::::: */
4738 return (ffelexHandler) ffestb_varlist5_;
4740 case FFELEX_typeOPEN_PAREN:
4741 switch (ffesta_first_kw)
4744 case FFESTR_firstINTENT:
4746 goto bad_1; /* :::::::::::::::::::: */
4747 return (ffelexHandler) ffestb_varlist1_;
4751 goto bad_1; /* :::::::::::::::::::: */
4754 case FFELEX_typeNAME:
4755 ffesta_confirmed ();
4756 switch (ffesta_first_kw)
4758 case FFESTR_firstEXTERNAL:
4759 if (!ffesta_is_inhibited ())
4760 ffestc_R1207_start ();
4764 case FFESTR_firstINTENT:
4765 goto bad_1; /* :::::::::::::::::::: */
4768 case FFESTR_firstINTRINSIC:
4769 if (!ffesta_is_inhibited ())
4770 ffestc_R1208_start ();
4774 case FFESTR_firstOPTIONAL:
4775 if (!ffesta_is_inhibited ())
4776 ffestc_R520_start ();
4781 case FFESTR_firstPUBLIC:
4782 if (!ffesta_is_inhibited ())
4783 ffestc_R521Astart ();
4786 case FFESTR_firstPRIVATE:
4787 if (!ffesta_is_inhibited ())
4788 ffestc_R521Bstart ();
4795 return (ffelexHandler) ffestb_varlist5_ (t);
4798 goto bad_1; /* :::::::::::::::::::: */
4801 /* Here, we have at least one char after the first keyword and t is
4802 COMMA or EOS/SEMICOLON. Also we know that this form is valid for
4803 only the statements reaching here (specifically, INTENT won't reach
4806 if (!ffesrc_is_name_init (*p))
4807 goto bad_i; /* :::::::::::::::::::: */
4808 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
4809 if (!ffesta_is_inhibited ())
4811 switch (ffesta_first_kw)
4813 case FFESTR_firstEXTERNAL:
4814 ffestc_R1207_start ();
4817 case FFESTR_firstINTRINSIC:
4818 ffestc_R1208_start ();
4822 case FFESTR_firstOPTIONAL:
4823 ffestc_R520_start ();
4828 case FFESTR_firstPUBLIC:
4829 ffestc_R521Astart ();
4832 case FFESTR_firstPRIVATE:
4833 ffestc_R521Bstart ();
4841 next = (ffelexHandler) ffestb_varlist5_ (nt);
4842 ffelex_token_kill (nt);
4843 return (ffelexHandler) (*next) (t);
4846 goto bad_0; /* :::::::::::::::::::: */
4849 bad_0: /* :::::::::::::::::::: */
4850 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, ffesta_tokens[0]);
4851 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4853 bad_1: /* :::::::::::::::::::: */
4854 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4855 return (ffelexHandler) ffelex_swallow_tokens (t,
4856 (ffelexHandler) ffesta_zero); /* Invalid second token. */
4858 bad_i: /* :::::::::::::::::::: */
4859 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, ffesta_tokens[0], i, t);
4860 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4863 /* ffestb_varlist1_ -- "INTENT" OPEN_PAREN
4865 return ffestb_varlist1_; // to lexer
4870 static ffelexHandler
4871 ffestb_varlist1_ (ffelexToken t)
4873 switch (ffelex_token_type (t))
4875 case FFELEX_typeNAME:
4876 ffesta_tokens[1] = ffelex_token_use (t);
4877 ffestb_local_.varlist.kw = ffestr_other (t);
4878 switch (ffestb_local_.varlist.kw)
4880 case FFESTR_otherIN:
4881 return (ffelexHandler) ffestb_varlist2_;
4883 case FFESTR_otherINOUT:
4884 return (ffelexHandler) ffestb_varlist3_;
4886 case FFESTR_otherOUT:
4887 return (ffelexHandler) ffestb_varlist3_;
4890 ffelex_token_kill (ffesta_tokens[1]);
4899 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4900 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4903 /* ffestb_varlist2_ -- "INTENT" OPEN_PAREN "IN"
4905 return ffestb_varlist2_; // to lexer
4909 static ffelexHandler
4910 ffestb_varlist2_ (ffelexToken t)
4912 switch (ffelex_token_type (t))
4914 case FFELEX_typeNAME:
4915 switch (ffestr_other (t))
4917 case FFESTR_otherOUT:
4918 ffestb_local_.varlist.kw = FFESTR_otherINOUT;
4919 return (ffelexHandler) ffestb_varlist3_;
4926 case FFELEX_typeCLOSE_PAREN:
4927 return (ffelexHandler) ffestb_varlist4_;
4933 ffelex_token_kill (ffesta_tokens[1]);
4934 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4935 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4938 /* ffestb_varlist3_ -- "INTENT" OPEN_PAREN NAME ["OUT"]
4940 return ffestb_varlist3_; // to lexer
4942 Handle CLOSE_PAREN. */
4944 static ffelexHandler
4945 ffestb_varlist3_ (ffelexToken t)
4947 switch (ffelex_token_type (t))
4949 case FFELEX_typeCLOSE_PAREN:
4950 return (ffelexHandler) ffestb_varlist4_;
4956 ffelex_token_kill (ffesta_tokens[1]);
4957 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4958 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4961 /* ffestb_varlist4_ -- "INTENT" OPEN_PAREN NAME ["OUT"] CLOSE_PAREN
4963 return ffestb_varlist4_; // to lexer
4965 Handle COLONCOLON or NAME. */
4967 static ffelexHandler
4968 ffestb_varlist4_ (ffelexToken t)
4970 switch (ffelex_token_type (t))
4972 case FFELEX_typeCOLONCOLON:
4973 ffesta_confirmed ();
4974 if (!ffesta_is_inhibited ())
4975 ffestc_R519_start (ffesta_tokens[1], ffestb_local_.varlist.kw);
4976 ffelex_token_kill (ffesta_tokens[1]);
4977 return (ffelexHandler) ffestb_varlist5_;
4979 case FFELEX_typeNAME:
4980 ffesta_confirmed ();
4981 if (!ffesta_is_inhibited ())
4982 ffestc_R519_start (ffesta_tokens[1], ffestb_local_.varlist.kw);
4983 ffelex_token_kill (ffesta_tokens[1]);
4984 return (ffelexHandler) ffestb_varlist5_ (t);
4990 ffelex_token_kill (ffesta_tokens[1]);
4991 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4992 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4996 /* ffestb_varlist5_ -- Handles the list of variable names
4998 return ffestb_varlist5_; // to lexer
5002 static ffelexHandler
5003 ffestb_varlist5_ (ffelexToken t)
5005 switch (ffelex_token_type (t))
5007 case FFELEX_typeNAME:
5008 ffesta_tokens[1] = ffelex_token_use (t);
5009 return (ffelexHandler) ffestb_varlist6_;
5012 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
5016 if (!ffesta_is_inhibited ())
5018 switch (ffesta_first_kw)
5020 case FFESTR_firstEXTERNAL:
5021 ffestc_R1207_finish ();
5025 case FFESTR_firstINTENT:
5026 ffestc_R519_finish ();
5030 case FFESTR_firstINTRINSIC:
5031 ffestc_R1208_finish ();
5035 case FFESTR_firstOPTIONAL:
5036 ffestc_R520_finish ();
5041 case FFESTR_firstPUBLIC:
5042 ffestc_R521Afinish ();
5045 case FFESTR_firstPRIVATE:
5046 ffestc_R521Bfinish ();
5054 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5057 /* ffestb_varlist6_ -- (whatever) NAME
5059 return ffestb_varlist6_; // to lexer
5061 Handle COMMA or EOS/SEMICOLON. */
5063 static ffelexHandler
5064 ffestb_varlist6_ (ffelexToken t)
5066 switch (ffelex_token_type (t))
5068 case FFELEX_typeCOMMA:
5069 if (!ffesta_is_inhibited ())
5071 switch (ffesta_first_kw)
5073 case FFESTR_firstEXTERNAL:
5074 ffestc_R1207_item (ffesta_tokens[1]);
5078 case FFESTR_firstINTENT:
5079 ffestc_R519_item (ffesta_tokens[1]);
5083 case FFESTR_firstINTRINSIC:
5084 ffestc_R1208_item (ffesta_tokens[1]);
5088 case FFESTR_firstOPTIONAL:
5089 ffestc_R520_item (ffesta_tokens[1]);
5094 case FFESTR_firstPUBLIC:
5095 ffestc_R521Aitem (ffesta_tokens[1]);
5098 case FFESTR_firstPRIVATE:
5099 ffestc_R521Bitem (ffesta_tokens[1]);
5107 ffelex_token_kill (ffesta_tokens[1]);
5108 return (ffelexHandler) ffestb_varlist5_;
5110 case FFELEX_typeEOS:
5111 case FFELEX_typeSEMICOLON:
5112 if (!ffesta_is_inhibited ())
5114 switch (ffesta_first_kw)
5116 case FFESTR_firstEXTERNAL:
5117 ffestc_R1207_item (ffesta_tokens[1]);
5118 ffestc_R1207_finish ();
5122 case FFESTR_firstINTENT:
5123 ffestc_R519_item (ffesta_tokens[1]);
5124 ffestc_R519_finish ();
5128 case FFESTR_firstINTRINSIC:
5129 ffestc_R1208_item (ffesta_tokens[1]);
5130 ffestc_R1208_finish ();
5134 case FFESTR_firstOPTIONAL:
5135 ffestc_R520_item (ffesta_tokens[1]);
5136 ffestc_R520_finish ();
5141 case FFESTR_firstPUBLIC:
5142 ffestc_R521Aitem (ffesta_tokens[1]);
5143 ffestc_R521Afinish ();
5146 case FFESTR_firstPRIVATE:
5147 ffestc_R521Bitem (ffesta_tokens[1]);
5148 ffestc_R521Bfinish ();
5156 ffelex_token_kill (ffesta_tokens[1]);
5157 return (ffelexHandler) ffesta_zero (t);
5160 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
5164 if (!ffesta_is_inhibited ())
5166 switch (ffesta_first_kw)
5168 case FFESTR_firstEXTERNAL:
5169 ffestc_R1207_finish ();
5173 case FFESTR_firstINTENT:
5174 ffestc_R519_finish ();
5178 case FFESTR_firstINTRINSIC:
5179 ffestc_R1208_finish ();
5183 case FFESTR_firstOPTIONAL:
5184 ffestc_R520_finish ();
5189 case FFESTR_firstPUBLIC:
5190 ffestc_R521Afinish ();
5193 case FFESTR_firstPRIVATE:
5194 ffestc_R521Bfinish ();
5202 ffelex_token_kill (ffesta_tokens[1]);
5203 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5206 /* ffestb_R423B -- Parse the SEQUENCE statement
5208 return ffestb_R423B; // to lexer
5210 Make sure the statement has a valid form for the SEQUENCE statement. If
5211 it does, implement the statement. */
5215 ffestb_R423B (ffelexToken t)
5220 switch (ffelex_token_type (ffesta_tokens[0]))
5222 case FFELEX_typeNAME:
5223 if (ffesta_first_kw != FFESTR_firstSEQUENCE)
5224 goto bad_0; /* :::::::::::::::::::: */
5227 case FFELEX_typeNAMES:
5228 if (ffesta_first_kw != FFESTR_firstSEQUENCE)
5229 goto bad_0; /* :::::::::::::::::::: */
5230 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlSEQUENCE)
5232 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSEQUENCE);
5233 goto bad_i; /* :::::::::::::::::::: */
5238 goto bad_0; /* :::::::::::::::::::: */
5241 switch (ffelex_token_type (t))
5243 case FFELEX_typeEOS:
5244 case FFELEX_typeSEMICOLON:
5245 ffesta_confirmed ();
5246 if (!ffesta_is_inhibited ())
5248 return (ffelexHandler) ffesta_zero (t);
5250 case FFELEX_typeCOMMA:
5251 case FFELEX_typeCOLONCOLON:
5252 ffesta_confirmed (); /* Error, but clearly intended. */
5253 goto bad_1; /* :::::::::::::::::::: */
5256 goto bad_1; /* :::::::::::::::::::: */
5259 bad_0: /* :::::::::::::::::::: */
5260 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", ffesta_tokens[0]);
5261 return (ffelexHandler) ffelex_swallow_tokens (t,
5262 (ffelexHandler) ffesta_zero); /* Invalid first token. */
5264 bad_1: /* :::::::::::::::::::: */
5265 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", t);
5266 return (ffelexHandler) ffelex_swallow_tokens (t,
5267 (ffelexHandler) ffesta_zero); /* Invalid second token. */
5269 bad_i: /* :::::::::::::::::::: */
5270 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", ffesta_tokens[0], i, t);
5271 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5275 /* ffestb_R522 -- Parse the SAVE statement
5277 return ffestb_R522; // to lexer
5279 Make sure the statement has a valid form for the SAVE statement. If it
5280 does, implement the statement. */
5283 ffestb_R522 (ffelexToken t)
5290 switch (ffelex_token_type (ffesta_tokens[0]))
5292 case FFELEX_typeNAME:
5293 if (ffesta_first_kw != FFESTR_firstSAVE)
5294 goto bad_0; /* :::::::::::::::::::: */
5295 switch (ffelex_token_type (t))
5297 case FFELEX_typeCOMMA:
5298 ffesta_confirmed (); /* Error, but clearly intended. */
5299 goto bad_1; /* :::::::::::::::::::: */
5302 goto bad_1; /* :::::::::::::::::::: */
5304 case FFELEX_typeEOS:
5305 case FFELEX_typeSEMICOLON:
5306 ffesta_confirmed ();
5307 if (!ffesta_is_inhibited ())
5309 return (ffelexHandler) ffesta_zero (t);
5311 case FFELEX_typeNAME:
5312 case FFELEX_typeSLASH:
5313 ffesta_confirmed ();
5314 if (!ffesta_is_inhibited ())
5315 ffestc_R522start ();
5316 return (ffelexHandler) ffestb_R5221_ (t);
5318 case FFELEX_typeCOLONCOLON:
5319 ffesta_confirmed ();
5320 if (!ffesta_is_inhibited ())
5321 ffestc_R522start ();
5322 return (ffelexHandler) ffestb_R5221_;
5325 case FFELEX_typeNAMES:
5326 if (ffesta_first_kw != FFESTR_firstSAVE)
5327 goto bad_0; /* :::::::::::::::::::: */
5328 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSAVE);
5329 switch (ffelex_token_type (t))
5332 goto bad_1; /* :::::::::::::::::::: */
5334 case FFELEX_typeCOMMA:
5335 ffesta_confirmed ();
5338 case FFELEX_typeEOS:
5339 case FFELEX_typeSEMICOLON:
5340 ffesta_confirmed ();
5343 if (!ffesta_is_inhibited ())
5345 return (ffelexHandler) ffesta_zero (t);
5347 case FFELEX_typeSLASH:
5348 ffesta_confirmed ();
5350 goto bad_i; /* :::::::::::::::::::: */
5351 if (!ffesta_is_inhibited ())
5352 ffestc_R522start ();
5353 return (ffelexHandler) ffestb_R5221_ (t);
5355 case FFELEX_typeCOLONCOLON:
5356 ffesta_confirmed ();
5358 goto bad_i; /* :::::::::::::::::::: */
5359 if (!ffesta_is_inhibited ())
5360 ffestc_R522start ();
5361 return (ffelexHandler) ffestb_R5221_;
5364 /* Here, we have at least one char after "SAVE" and t is COMMA or
5367 if (!ffesrc_is_name_init (*p))
5368 goto bad_i; /* :::::::::::::::::::: */
5369 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
5370 if (!ffesta_is_inhibited ())
5371 ffestc_R522start ();
5372 next = (ffelexHandler) ffestb_R5221_ (nt);
5373 ffelex_token_kill (nt);
5374 return (ffelexHandler) (*next) (t);
5377 goto bad_0; /* :::::::::::::::::::: */
5380 bad_0: /* :::::::::::::::::::: */
5381 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", ffesta_tokens[0]);
5382 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5384 bad_1: /* :::::::::::::::::::: */
5385 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5386 return (ffelexHandler) ffelex_swallow_tokens (t,
5387 (ffelexHandler) ffesta_zero); /* Invalid second token. */
5389 bad_i: /* :::::::::::::::::::: */
5390 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SAVE", ffesta_tokens[0], i, t);
5391 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5394 /* ffestb_R5221_ -- "SAVE" [COLONCOLON]
5396 return ffestb_R5221_; // to lexer
5398 Handle NAME or SLASH. */
5400 static ffelexHandler
5401 ffestb_R5221_ (ffelexToken t)
5403 switch (ffelex_token_type (t))
5405 case FFELEX_typeNAME:
5406 ffestb_local_.R522.is_cblock = FALSE;
5407 ffesta_tokens[1] = ffelex_token_use (t);
5408 return (ffelexHandler) ffestb_R5224_;
5410 case FFELEX_typeSLASH:
5411 ffestb_local_.R522.is_cblock = TRUE;
5412 return (ffelexHandler) ffestb_R5222_;
5415 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5419 if (!ffesta_is_inhibited ())
5420 ffestc_R522finish ();
5421 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5424 /* ffestb_R5222_ -- "SAVE" [COLONCOLON] SLASH
5426 return ffestb_R5222_; // to lexer
5430 static ffelexHandler
5431 ffestb_R5222_ (ffelexToken t)
5433 switch (ffelex_token_type (t))
5435 case FFELEX_typeNAME:
5436 ffesta_tokens[1] = ffelex_token_use (t);
5437 return (ffelexHandler) ffestb_R5223_;
5440 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5444 if (!ffesta_is_inhibited ())
5445 ffestc_R522finish ();
5446 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5449 /* ffestb_R5223_ -- "SAVE" [COLONCOLON] SLASH NAME
5451 return ffestb_R5223_; // to lexer
5455 static ffelexHandler
5456 ffestb_R5223_ (ffelexToken t)
5458 switch (ffelex_token_type (t))
5460 case FFELEX_typeSLASH:
5461 return (ffelexHandler) ffestb_R5224_;
5464 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5468 if (!ffesta_is_inhibited ())
5469 ffestc_R522finish ();
5470 ffelex_token_kill (ffesta_tokens[1]);
5471 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5474 /* ffestb_R5224_ -- "SAVE" [COLONCOLON] R523
5476 return ffestb_R5224_; // to lexer
5478 Handle COMMA or EOS/SEMICOLON. */
5480 static ffelexHandler
5481 ffestb_R5224_ (ffelexToken t)
5483 switch (ffelex_token_type (t))
5485 case FFELEX_typeCOMMA:
5486 if (!ffesta_is_inhibited ())
5488 if (ffestb_local_.R522.is_cblock)
5489 ffestc_R522item_cblock (ffesta_tokens[1]);
5491 ffestc_R522item_object (ffesta_tokens[1]);
5493 ffelex_token_kill (ffesta_tokens[1]);
5494 return (ffelexHandler) ffestb_R5221_;
5496 case FFELEX_typeEOS:
5497 case FFELEX_typeSEMICOLON:
5498 if (!ffesta_is_inhibited ())
5500 if (ffestb_local_.R522.is_cblock)
5501 ffestc_R522item_cblock (ffesta_tokens[1]);
5503 ffestc_R522item_object (ffesta_tokens[1]);
5504 ffestc_R522finish ();
5506 ffelex_token_kill (ffesta_tokens[1]);
5507 return (ffelexHandler) ffesta_zero (t);
5510 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5514 if (!ffesta_is_inhibited ())
5515 ffestc_R522finish ();
5516 ffelex_token_kill (ffesta_tokens[1]);
5517 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5520 /* ffestb_R528 -- Parse the DATA statement
5522 return ffestb_R528; // to lexer
5524 Make sure the statement has a valid form for the DATA statement. If it
5525 does, implement the statement. */
5528 ffestb_R528 (ffelexToken t)
5535 switch (ffelex_token_type (ffesta_tokens[0]))
5537 case FFELEX_typeNAME:
5538 if (ffesta_first_kw != FFESTR_firstDATA)
5539 goto bad_0; /* :::::::::::::::::::: */
5540 switch (ffelex_token_type (t))
5542 case FFELEX_typeCOMMA:
5543 case FFELEX_typeEOS:
5544 case FFELEX_typeSEMICOLON:
5545 case FFELEX_typeSLASH:
5546 case FFELEX_typeCOLONCOLON:
5547 ffesta_confirmed (); /* Error, but clearly intended. */
5548 goto bad_1; /* :::::::::::::::::::: */
5551 goto bad_1; /* :::::::::::::::::::: */
5553 case FFELEX_typeNAME:
5554 ffesta_confirmed ();
5557 case FFELEX_typeOPEN_PAREN:
5560 ffestb_local_.data.started = FALSE;
5561 return (ffelexHandler) (*((ffelexHandler)
5562 ffeexpr_lhs (ffesta_output_pool,
5563 FFEEXPR_contextDATA,
5564 (ffeexprCallback) ffestb_R5281_)))
5567 case FFELEX_typeNAMES:
5568 if (ffesta_first_kw != FFESTR_firstDATA)
5569 goto bad_0; /* :::::::::::::::::::: */
5570 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDATA);
5571 switch (ffelex_token_type (t))
5573 case FFELEX_typeEOS:
5574 case FFELEX_typeSEMICOLON:
5575 case FFELEX_typeCOLONCOLON:
5576 ffesta_confirmed (); /* Error, but clearly intended. */
5577 goto bad_1; /* :::::::::::::::::::: */
5580 goto bad_1; /* :::::::::::::::::::: */
5582 case FFELEX_typeOPEN_PAREN:
5585 ffestb_local_.data.started = FALSE;
5586 return (ffelexHandler) (*((ffelexHandler)
5587 ffeexpr_lhs (ffesta_output_pool,
5588 FFEEXPR_contextDATA,
5595 case FFELEX_typeCOMMA:
5596 case FFELEX_typeSLASH:
5597 ffesta_confirmed ();
5600 if (!ffesrc_is_name_init (*p))
5601 goto bad_i; /* :::::::::::::::::::: */
5602 ffestb_local_.data.started = FALSE;
5603 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
5604 next = (ffelexHandler) (*((ffelexHandler)
5605 ffeexpr_lhs (ffesta_output_pool,
5606 FFEEXPR_contextDATA,
5607 (ffeexprCallback) ffestb_R5281_)))
5609 ffelex_token_kill (nt);
5610 return (ffelexHandler) (*next) (t);
5613 goto bad_0; /* :::::::::::::::::::: */
5616 bad_0: /* :::::::::::::::::::: */
5617 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", ffesta_tokens[0]);
5618 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5620 bad_1: /* :::::::::::::::::::: */
5621 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5622 return (ffelexHandler) ffelex_swallow_tokens (t,
5623 (ffelexHandler) ffesta_zero); /* Invalid second token. */
5625 bad_i: /* :::::::::::::::::::: */
5626 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DATA", ffesta_tokens[0], i, t);
5627 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5630 /* ffestb_R5281_ -- "DATA" expr-list
5632 (ffestb_R5281_) // to expression handler
5634 Handle COMMA or SLASH. */
5636 static ffelexHandler
5637 ffestb_R5281_ (ffelexToken ft, ffebld expr, ffelexToken t)
5639 switch (ffelex_token_type (t))
5641 case FFELEX_typeCOMMA:
5642 ffesta_confirmed ();
5645 if (!ffesta_is_inhibited ())
5647 if (!ffestb_local_.data.started)
5649 ffestc_R528_start ();
5650 ffestb_local_.data.started = TRUE;
5652 ffestc_R528_item_object (expr, ft);
5654 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
5655 FFEEXPR_contextDATA,
5656 (ffeexprCallback) ffestb_R5281_);
5658 case FFELEX_typeSLASH:
5659 ffesta_confirmed ();
5662 if (!ffesta_is_inhibited ())
5664 if (!ffestb_local_.data.started)
5666 ffestc_R528_start ();
5667 ffestb_local_.data.started = TRUE;
5669 ffestc_R528_item_object (expr, ft);
5670 ffestc_R528_item_startvals ();
5672 return (ffelexHandler) ffeexpr_rhs
5673 (ffesta_output_pool, FFEEXPR_contextDATA,
5674 (ffeexprCallback) ffestb_R5282_);
5677 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5681 if (ffestb_local_.data.started && !ffesta_is_inhibited ())
5682 ffestc_R528_finish ();
5683 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5686 /* ffestb_R5282_ -- "DATA" expr-list SLASH expr-list
5688 (ffestb_R5282_) // to expression handler
5690 Handle ASTERISK, COMMA, or SLASH. */
5692 static ffelexHandler
5693 ffestb_R5282_ (ffelexToken ft, ffebld expr, ffelexToken t)
5695 switch (ffelex_token_type (t))
5697 case FFELEX_typeCOMMA:
5700 if (!ffesta_is_inhibited ())
5701 ffestc_R528_item_value (NULL, NULL, expr, ft);
5702 return (ffelexHandler) ffeexpr_rhs
5703 (ffesta_output_pool, FFEEXPR_contextDATA,
5704 (ffeexprCallback) ffestb_R5282_);
5706 case FFELEX_typeASTERISK:
5709 ffestb_local_.data.expr = expr;
5710 ffesta_tokens[1] = ffelex_token_use (ft);
5711 return (ffelexHandler) ffeexpr_rhs
5712 (ffesta_output_pool, FFEEXPR_contextDATA,
5713 (ffeexprCallback) ffestb_R5283_);
5715 case FFELEX_typeSLASH:
5718 if (!ffesta_is_inhibited ())
5720 ffestc_R528_item_value (NULL, NULL, expr, ft);
5721 ffestc_R528_item_endvals (t);
5723 return (ffelexHandler) ffestb_R5284_;
5726 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5730 if (!ffesta_is_inhibited ())
5732 ffestc_R528_item_endvals (t);
5733 ffestc_R528_finish ();
5735 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5738 /* ffestb_R5283_ -- "DATA" expr-list SLASH expr ASTERISK expr
5740 (ffestb_R5283_) // to expression handler
5742 Handle COMMA or SLASH. */
5744 static ffelexHandler
5745 ffestb_R5283_ (ffelexToken ft, ffebld expr, ffelexToken t)
5747 switch (ffelex_token_type (t))
5749 case FFELEX_typeCOMMA:
5752 if (!ffesta_is_inhibited ())
5753 ffestc_R528_item_value (ffestb_local_.data.expr, ffesta_tokens[1],
5755 ffelex_token_kill (ffesta_tokens[1]);
5756 return (ffelexHandler) ffeexpr_rhs
5757 (ffesta_output_pool, FFEEXPR_contextDATA,
5758 (ffeexprCallback) ffestb_R5282_);
5760 case FFELEX_typeSLASH:
5763 if (!ffesta_is_inhibited ())
5765 ffestc_R528_item_value (ffestb_local_.data.expr, ffesta_tokens[1],
5767 ffestc_R528_item_endvals (t);
5769 ffelex_token_kill (ffesta_tokens[1]);
5770 return (ffelexHandler) ffestb_R5284_;
5773 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5777 if (!ffesta_is_inhibited ())
5779 ffestc_R528_item_endvals (t);
5780 ffestc_R528_finish ();
5782 ffelex_token_kill (ffesta_tokens[1]);
5783 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5786 /* ffestb_R5284_ -- "DATA" expr-list SLASH expr-list SLASH
5788 return ffestb_R5284_; // to lexer
5790 Handle [COMMA] NAME or EOS/SEMICOLON. */
5792 static ffelexHandler
5793 ffestb_R5284_ (ffelexToken t)
5795 switch (ffelex_token_type (t))
5797 case FFELEX_typeCOMMA:
5798 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
5799 FFEEXPR_contextDATA,
5800 (ffeexprCallback) ffestb_R5281_);
5802 case FFELEX_typeNAME:
5803 case FFELEX_typeOPEN_PAREN:
5804 return (ffelexHandler) (*((ffelexHandler)
5805 ffeexpr_lhs (ffesta_output_pool,
5806 FFEEXPR_contextDATA,
5807 (ffeexprCallback) ffestb_R5281_)))
5810 case FFELEX_typeEOS:
5811 case FFELEX_typeSEMICOLON:
5812 if (!ffesta_is_inhibited ())
5813 ffestc_R528_finish ();
5814 return (ffelexHandler) ffesta_zero (t);
5817 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5821 if (!ffesta_is_inhibited ())
5822 ffestc_R528_finish ();
5823 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5826 /* ffestb_R537 -- Parse a PARAMETER statement
5828 return ffestb_R537; // to lexer
5830 Make sure the statement has a valid form for an PARAMETER statement.
5831 If it does, implement the statement. */
5834 ffestb_R537 (ffelexToken t)
5836 switch (ffelex_token_type (ffesta_tokens[0]))
5838 case FFELEX_typeNAME:
5839 if (ffesta_first_kw != FFESTR_firstPARAMETER)
5840 goto bad_0; /* :::::::::::::::::::: */
5843 case FFELEX_typeNAMES:
5844 if (ffesta_first_kw != FFESTR_firstPARAMETER)
5845 goto bad_0; /* :::::::::::::::::::: */
5846 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlPARAMETER)
5847 goto bad_0; /* :::::::::::::::::::: */
5851 goto bad_0; /* :::::::::::::::::::: */
5854 switch (ffelex_token_type (t))
5856 case FFELEX_typeOPEN_PAREN:
5859 case FFELEX_typeEOS:
5860 case FFELEX_typeSEMICOLON:
5861 case FFELEX_typeCOMMA:
5862 case FFELEX_typeCOLONCOLON:
5863 ffesta_confirmed (); /* Error, but clearly intended. */
5864 goto bad_1; /* :::::::::::::::::::: */
5867 goto bad_1; /* :::::::::::::::::::: */
5870 ffestb_local_.parameter.started = FALSE;
5871 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
5872 FFEEXPR_contextPARAMETER,
5873 (ffeexprCallback) ffestb_R5371_);
5875 bad_0: /* :::::::::::::::::::: */
5876 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0]);
5877 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5879 bad_1: /* :::::::::::::::::::: */
5880 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
5881 return (ffelexHandler) ffelex_swallow_tokens (t,
5882 (ffelexHandler) ffesta_zero); /* Invalid second token. */
5885 /* ffestb_R5371_ -- "PARAMETER" OPEN_PAREN expr
5887 (ffestb_R5371_) // to expression handler
5889 Make sure the next token is EQUALS. */
5891 static ffelexHandler
5892 ffestb_R5371_ (ffelexToken ft, ffebld expr, ffelexToken t)
5894 ffestb_local_.parameter.expr = expr;
5896 switch (ffelex_token_type (t))
5898 case FFELEX_typeEQUALS:
5899 ffesta_confirmed ();
5902 ffesta_tokens[1] = ffelex_token_use (ft);
5903 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
5904 FFEEXPR_contextPARAMETER, (ffeexprCallback) ffestb_R5372_);
5910 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
5911 if (ffestb_local_.parameter.started)
5912 ffestc_R537_finish ();
5913 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5916 /* ffestb_R5372_ -- "PARAMETER" OPEN_PAREN expr EQUALS expr
5918 (ffestb_R5372_) // to expression handler
5920 Make sure the next token is COMMA or CLOSE_PAREN. */
5922 static ffelexHandler
5923 ffestb_R5372_ (ffelexToken ft, ffebld expr, ffelexToken t)
5925 switch (ffelex_token_type (t))
5927 case FFELEX_typeCOMMA:
5930 if (!ffesta_is_inhibited ())
5932 if (!ffestb_local_.parameter.started)
5934 ffestc_R537_start ();
5935 ffestb_local_.parameter.started = TRUE;
5937 ffestc_R537_item (ffestb_local_.parameter.expr, ffesta_tokens[1],
5940 ffelex_token_kill (ffesta_tokens[1]);
5941 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
5942 FFEEXPR_contextPARAMETER,
5943 (ffeexprCallback) ffestb_R5371_);
5945 case FFELEX_typeCLOSE_PAREN:
5948 if (!ffesta_is_inhibited ())
5950 if (!ffestb_local_.parameter.started)
5952 ffestc_R537_start ();
5953 ffestb_local_.parameter.started = TRUE;
5955 ffestc_R537_item (ffestb_local_.parameter.expr, ffesta_tokens[1],
5957 ffestc_R537_finish ();
5959 ffelex_token_kill (ffesta_tokens[1]);
5960 return (ffelexHandler) ffestb_R5373_;
5966 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
5967 if (ffestb_local_.parameter.started)
5968 ffestc_R537_finish ();
5969 ffelex_token_kill (ffesta_tokens[1]);
5970 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5973 /* ffestb_R5373_ -- "PARAMETER" OPEN_PAREN expr EQUALS expr CLOSE_PAREN
5975 return ffestb_R5373_; // to lexer
5977 Make sure the next token is EOS or SEMICOLON, or generate an error. All
5978 cleanup has already been done, by the way. */
5980 static ffelexHandler
5981 ffestb_R5373_ (ffelexToken t)
5983 switch (ffelex_token_type (t))
5985 case FFELEX_typeEOS:
5986 case FFELEX_typeSEMICOLON:
5987 return (ffelexHandler) ffesta_zero (t);
5993 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
5994 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5997 /* ffestb_R542 -- Parse the NAMELIST statement
5999 return ffestb_R542; // to lexer
6001 Make sure the statement has a valid form for the NAMELIST statement. If it
6002 does, implement the statement. */
6005 ffestb_R542 (ffelexToken t)
6010 switch (ffelex_token_type (ffesta_tokens[0]))
6012 case FFELEX_typeNAME:
6013 if (ffesta_first_kw != FFESTR_firstNAMELIST)
6014 goto bad_0; /* :::::::::::::::::::: */
6017 case FFELEX_typeNAMES:
6018 if (ffesta_first_kw != FFESTR_firstNAMELIST)
6019 goto bad_0; /* :::::::::::::::::::: */
6020 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlNAMELIST);
6022 goto bad_i; /* :::::::::::::::::::: */
6026 goto bad_0; /* :::::::::::::::::::: */
6029 switch (ffelex_token_type (t))
6031 case FFELEX_typeCOMMA:
6032 case FFELEX_typeEOS:
6033 case FFELEX_typeSEMICOLON:
6034 case FFELEX_typeCOLONCOLON:
6035 ffesta_confirmed (); /* Error, but clearly intended. */
6036 goto bad_1; /* :::::::::::::::::::: */
6039 goto bad_1; /* :::::::::::::::::::: */
6041 case FFELEX_typeSLASH:
6045 ffesta_confirmed ();
6046 if (!ffesta_is_inhibited ())
6047 ffestc_R542_start ();
6048 return (ffelexHandler) ffestb_R5421_;
6050 bad_0: /* :::::::::::::::::::: */
6051 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", ffesta_tokens[0]);
6052 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6054 bad_1: /* :::::::::::::::::::: */
6055 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6056 return (ffelexHandler) ffelex_swallow_tokens (t,
6057 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6059 bad_i: /* :::::::::::::::::::: */
6060 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "NAMELIST", ffesta_tokens[0], i, t);
6061 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6064 /* ffestb_R5421_ -- "NAMELIST" SLASH
6066 return ffestb_R5421_; // to lexer
6070 static ffelexHandler
6071 ffestb_R5421_ (ffelexToken t)
6073 switch (ffelex_token_type (t))
6075 case FFELEX_typeNAME:
6076 if (!ffesta_is_inhibited ())
6077 ffestc_R542_item_nlist (t);
6078 return (ffelexHandler) ffestb_R5422_;
6081 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6085 if (!ffesta_is_inhibited ())
6086 ffestc_R542_finish ();
6087 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6090 /* ffestb_R5422_ -- "NAMELIST" SLASH NAME
6092 return ffestb_R5422_; // to lexer
6096 static ffelexHandler
6097 ffestb_R5422_ (ffelexToken t)
6099 switch (ffelex_token_type (t))
6101 case FFELEX_typeSLASH:
6102 return (ffelexHandler) ffestb_R5423_;
6105 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6109 if (!ffesta_is_inhibited ())
6110 ffestc_R542_finish ();
6111 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6114 /* ffestb_R5423_ -- "NAMELIST" SLASH NAME SLASH
6116 return ffestb_R5423_; // to lexer
6120 static ffelexHandler
6121 ffestb_R5423_ (ffelexToken t)
6123 switch (ffelex_token_type (t))
6125 case FFELEX_typeNAME:
6126 if (!ffesta_is_inhibited ())
6127 ffestc_R542_item_nitem (t);
6128 return (ffelexHandler) ffestb_R5424_;
6131 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6135 if (!ffesta_is_inhibited ())
6136 ffestc_R542_finish ();
6137 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6140 /* ffestb_R5424_ -- "NAMELIST" SLASH NAME SLASH NAME
6142 return ffestb_R5424_; // to lexer
6144 Handle COMMA, EOS/SEMICOLON, or SLASH. */
6146 static ffelexHandler
6147 ffestb_R5424_ (ffelexToken t)
6149 switch (ffelex_token_type (t))
6151 case FFELEX_typeCOMMA:
6152 return (ffelexHandler) ffestb_R5425_;
6154 case FFELEX_typeEOS:
6155 case FFELEX_typeSEMICOLON:
6156 if (!ffesta_is_inhibited ())
6157 ffestc_R542_finish ();
6158 return (ffelexHandler) ffesta_zero (t);
6160 case FFELEX_typeSLASH:
6161 return (ffelexHandler) ffestb_R5421_;
6164 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6168 if (!ffesta_is_inhibited ())
6169 ffestc_R542_finish ();
6170 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6173 /* ffestb_R5425_ -- "NAMELIST" SLASH NAME SLASH NAME COMMA
6175 return ffestb_R5425_; // to lexer
6177 Handle NAME or SLASH. */
6179 static ffelexHandler
6180 ffestb_R5425_ (ffelexToken t)
6182 switch (ffelex_token_type (t))
6184 case FFELEX_typeNAME:
6185 if (!ffesta_is_inhibited ())
6186 ffestc_R542_item_nitem (t);
6187 return (ffelexHandler) ffestb_R5424_;
6189 case FFELEX_typeSLASH:
6190 return (ffelexHandler) ffestb_R5421_;
6193 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6197 if (!ffesta_is_inhibited ())
6198 ffestc_R542_finish ();
6199 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6202 /* ffestb_R544 -- Parse an EQUIVALENCE statement
6204 return ffestb_R544; // to lexer
6206 Make sure the statement has a valid form for an EQUIVALENCE statement.
6207 If it does, implement the statement. */
6210 ffestb_R544 (ffelexToken t)
6212 switch (ffelex_token_type (ffesta_tokens[0]))
6214 case FFELEX_typeNAME:
6215 if (ffesta_first_kw != FFESTR_firstEQUIVALENCE)
6216 goto bad_0; /* :::::::::::::::::::: */
6219 case FFELEX_typeNAMES:
6220 if (ffesta_first_kw != FFESTR_firstEQUIVALENCE)
6221 goto bad_0; /* :::::::::::::::::::: */
6222 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlEQUIVALENCE)
6223 goto bad_0; /* :::::::::::::::::::: */
6227 goto bad_0; /* :::::::::::::::::::: */
6230 switch (ffelex_token_type (t))
6232 case FFELEX_typeOPEN_PAREN:
6235 case FFELEX_typeEOS:
6236 case FFELEX_typeSEMICOLON:
6237 case FFELEX_typeCOMMA:
6238 case FFELEX_typeCOLONCOLON:
6239 ffesta_confirmed (); /* Error, but clearly intended. */
6240 goto bad_1; /* :::::::::::::::::::: */
6243 goto bad_1; /* :::::::::::::::::::: */
6246 ffestb_local_.equivalence.started = FALSE;
6247 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
6248 FFEEXPR_contextEQUIVALENCE,
6249 (ffeexprCallback) ffestb_R5441_);
6251 bad_0: /* :::::::::::::::::::: */
6252 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", ffesta_tokens[0]);
6253 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6255 bad_1: /* :::::::::::::::::::: */
6256 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6257 return (ffelexHandler) ffelex_swallow_tokens (t,
6258 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6261 /* ffestb_R5441_ -- "EQUIVALENCE" OPEN_PAREN expr
6263 (ffestb_R5441_) // to expression handler
6265 Make sure the next token is COMMA. */
6267 static ffelexHandler
6268 ffestb_R5441_ (ffelexToken ft, ffebld expr, ffelexToken t)
6270 switch (ffelex_token_type (t))
6272 case FFELEX_typeCOMMA:
6275 ffestb_local_.equivalence.exprs = ffestt_exprlist_create ();
6276 ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr,
6277 ffelex_token_use (ft));
6278 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
6279 FFEEXPR_contextEQUIVALENCE,
6280 (ffeexprCallback) ffestb_R5442_);
6286 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6287 if (ffestb_local_.equivalence.started)
6288 ffestc_R544_finish ();
6289 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6292 /* ffestb_R5442_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr
6294 (ffestb_R5442_) // to expression handler
6296 Make sure the next token is COMMA or CLOSE_PAREN. For COMMA, we just
6297 append the expression to our list and continue; for CLOSE_PAREN, we
6298 append the expression and move to _3_. */
6300 static ffelexHandler
6301 ffestb_R5442_ (ffelexToken ft, ffebld expr, ffelexToken t)
6303 switch (ffelex_token_type (t))
6305 case FFELEX_typeCOMMA:
6308 ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr,
6309 ffelex_token_use (ft));
6310 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
6311 FFEEXPR_contextEQUIVALENCE,
6312 (ffeexprCallback) ffestb_R5442_);
6314 case FFELEX_typeCLOSE_PAREN:
6317 ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr,
6318 ffelex_token_use (ft));
6319 return (ffelexHandler) ffestb_R5443_;
6325 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6326 if (ffestb_local_.equivalence.started)
6327 ffestc_R544_finish ();
6328 ffestt_exprlist_kill (ffestb_local_.equivalence.exprs);
6329 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6332 /* ffestb_R5443_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr CLOSE_PAREN
6334 return ffestb_R5443_; // to lexer
6336 Make sure the next token is COMMA or EOS/SEMICOLON. */
6338 static ffelexHandler
6339 ffestb_R5443_ (ffelexToken t)
6341 switch (ffelex_token_type (t))
6343 case FFELEX_typeCOMMA:
6344 ffesta_confirmed ();
6345 if (!ffesta_is_inhibited ())
6347 if (!ffestb_local_.equivalence.started)
6349 ffestc_R544_start ();
6350 ffestb_local_.equivalence.started = TRUE;
6352 ffestc_R544_item (ffestb_local_.equivalence.exprs);
6354 ffestt_exprlist_kill (ffestb_local_.equivalence.exprs);
6355 return (ffelexHandler) ffestb_R5444_;
6357 case FFELEX_typeEOS:
6358 case FFELEX_typeSEMICOLON:
6359 ffesta_confirmed ();
6360 if (!ffesta_is_inhibited ())
6362 if (!ffestb_local_.equivalence.started)
6364 ffestc_R544_start ();
6365 ffestb_local_.equivalence.started = TRUE;
6367 ffestc_R544_item (ffestb_local_.equivalence.exprs);
6368 ffestc_R544_finish ();
6370 ffestt_exprlist_kill (ffestb_local_.equivalence.exprs);
6371 return (ffelexHandler) ffesta_zero (t);
6377 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6378 if (ffestb_local_.equivalence.started)
6379 ffestc_R544_finish ();
6380 ffestt_exprlist_kill (ffestb_local_.equivalence.exprs);
6381 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6384 /* ffestb_R5444_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr CLOSE_PAREN COMMA
6386 return ffestb_R5444_; // to lexer
6388 Make sure the next token is OPEN_PAREN, or generate an error. */
6390 static ffelexHandler
6391 ffestb_R5444_ (ffelexToken t)
6393 switch (ffelex_token_type (t))
6395 case FFELEX_typeOPEN_PAREN:
6396 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
6397 FFEEXPR_contextEQUIVALENCE,
6398 (ffeexprCallback) ffestb_R5441_);
6404 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6405 if (ffestb_local_.equivalence.started)
6406 ffestc_R544_finish ();
6407 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6410 /* ffestb_R834 -- Parse the CYCLE statement
6412 return ffestb_R834; // to lexer
6414 Make sure the statement has a valid form for the CYCLE statement. If
6415 it does, implement the statement. */
6418 ffestb_R834 (ffelexToken t)
6423 switch (ffelex_token_type (ffesta_tokens[0]))
6425 case FFELEX_typeNAME:
6426 if (ffesta_first_kw != FFESTR_firstCYCLE)
6427 goto bad_0; /* :::::::::::::::::::: */
6428 switch (ffelex_token_type (t))
6430 case FFELEX_typeCOMMA:
6431 case FFELEX_typeCOLONCOLON:
6432 ffesta_confirmed (); /* Error, but clearly intended. */
6433 goto bad_1; /* :::::::::::::::::::: */
6436 goto bad_1; /* :::::::::::::::::::: */
6438 case FFELEX_typeNAME:
6439 ffesta_confirmed ();
6440 ffesta_tokens[1] = ffelex_token_use (t);
6441 return (ffelexHandler) ffestb_R8341_;
6443 case FFELEX_typeEOS:
6444 case FFELEX_typeSEMICOLON:
6445 ffesta_confirmed ();
6446 ffesta_tokens[1] = NULL;
6447 return (ffelexHandler) ffestb_R8341_ (t);
6450 case FFELEX_typeNAMES:
6451 if (ffesta_first_kw != FFESTR_firstCYCLE)
6452 goto bad_0; /* :::::::::::::::::::: */
6453 switch (ffelex_token_type (t))
6456 goto bad_1; /* :::::::::::::::::::: */
6458 case FFELEX_typeEOS:
6459 case FFELEX_typeSEMICOLON:
6462 ffesta_confirmed ();
6463 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCYCLE);
6466 ffesta_tokens[1] = NULL;
6470 if (!ffesrc_is_name_init (*p))
6471 goto bad_i; /* :::::::::::::::::::: */
6473 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
6475 return (ffelexHandler) ffestb_R8341_ (t);
6478 goto bad_0; /* :::::::::::::::::::: */
6481 bad_0: /* :::::::::::::::::::: */
6482 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", ffesta_tokens[0]);
6483 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6485 bad_1: /* :::::::::::::::::::: */
6486 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", t);
6487 return (ffelexHandler) ffelex_swallow_tokens (t,
6488 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6490 bad_i: /* :::::::::::::::::::: */
6491 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CYCLE", ffesta_tokens[0], i, t);
6492 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6495 /* ffestb_R8341_ -- "CYCLE" [NAME]
6497 return ffestb_R8341_; // to lexer
6499 Make sure the next token is an EOS or SEMICOLON. */
6501 static ffelexHandler
6502 ffestb_R8341_ (ffelexToken t)
6504 switch (ffelex_token_type (t))
6506 case FFELEX_typeEOS:
6507 case FFELEX_typeSEMICOLON:
6508 ffesta_confirmed ();
6509 if (!ffesta_is_inhibited ())
6510 ffestc_R834 (ffesta_tokens[1]);
6511 if (ffesta_tokens[1] != NULL)
6512 ffelex_token_kill (ffesta_tokens[1]);
6513 return (ffelexHandler) ffesta_zero (t);
6516 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", t);
6520 if (ffesta_tokens[1] != NULL)
6521 ffelex_token_kill (ffesta_tokens[1]);
6522 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6525 /* ffestb_R835 -- Parse the EXIT statement
6527 return ffestb_R835; // to lexer
6529 Make sure the statement has a valid form for the EXIT statement. If
6530 it does, implement the statement. */
6533 ffestb_R835 (ffelexToken t)
6538 switch (ffelex_token_type (ffesta_tokens[0]))
6540 case FFELEX_typeNAME:
6541 if (ffesta_first_kw != FFESTR_firstEXIT)
6542 goto bad_0; /* :::::::::::::::::::: */
6543 switch (ffelex_token_type (t))
6545 case FFELEX_typeCOMMA:
6546 case FFELEX_typeCOLONCOLON:
6547 ffesta_confirmed (); /* Error, but clearly intended. */
6548 goto bad_1; /* :::::::::::::::::::: */
6551 goto bad_1; /* :::::::::::::::::::: */
6553 case FFELEX_typeNAME:
6554 ffesta_confirmed ();
6555 ffesta_tokens[1] = ffelex_token_use (t);
6556 return (ffelexHandler) ffestb_R8351_;
6558 case FFELEX_typeEOS:
6559 case FFELEX_typeSEMICOLON:
6560 ffesta_confirmed ();
6561 ffesta_tokens[1] = NULL;
6562 return (ffelexHandler) ffestb_R8351_ (t);
6565 case FFELEX_typeNAMES:
6566 if (ffesta_first_kw != FFESTR_firstEXIT)
6567 goto bad_0; /* :::::::::::::::::::: */
6568 switch (ffelex_token_type (t))
6571 goto bad_1; /* :::::::::::::::::::: */
6573 case FFELEX_typeEOS:
6574 case FFELEX_typeSEMICOLON:
6577 ffesta_confirmed ();
6578 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlEXIT);
6581 ffesta_tokens[1] = NULL;
6585 if (!ffesrc_is_name_init (*p))
6586 goto bad_i; /* :::::::::::::::::::: */
6588 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
6590 return (ffelexHandler) ffestb_R8351_ (t);
6593 goto bad_0; /* :::::::::::::::::::: */
6596 bad_0: /* :::::::::::::::::::: */
6597 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", ffesta_tokens[0]);
6598 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6600 bad_1: /* :::::::::::::::::::: */
6601 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", t);
6602 return (ffelexHandler) ffelex_swallow_tokens (t,
6603 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6605 bad_i: /* :::::::::::::::::::: */
6606 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "EXIT", ffesta_tokens[0], i, t);
6607 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6610 /* ffestb_R8351_ -- "EXIT" [NAME]
6612 return ffestb_R8351_; // to lexer
6614 Make sure the next token is an EOS or SEMICOLON. */
6616 static ffelexHandler
6617 ffestb_R8351_ (ffelexToken t)
6619 switch (ffelex_token_type (t))
6621 case FFELEX_typeEOS:
6622 case FFELEX_typeSEMICOLON:
6623 ffesta_confirmed ();
6624 if (!ffesta_is_inhibited ())
6625 ffestc_R835 (ffesta_tokens[1]);
6626 if (ffesta_tokens[1] != NULL)
6627 ffelex_token_kill (ffesta_tokens[1]);
6628 return (ffelexHandler) ffesta_zero (t);
6631 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", t);
6635 if (ffesta_tokens[1] != NULL)
6636 ffelex_token_kill (ffesta_tokens[1]);
6637 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6640 /* ffestb_R838 -- Parse the ASSIGN statement
6642 return ffestb_R838; // to lexer
6644 Make sure the statement has a valid form for the ASSIGN statement. If it
6645 does, implement the statement. */
6648 ffestb_R838 (ffelexToken t)
6653 ffelexToken et; /* First token in target. */
6655 switch (ffelex_token_type (ffesta_tokens[0]))
6657 case FFELEX_typeNAME:
6658 if (ffesta_first_kw != FFESTR_firstASSIGN)
6659 goto bad_0; /* :::::::::::::::::::: */
6660 switch (ffelex_token_type (t))
6662 case FFELEX_typeEOS:
6663 case FFELEX_typeSEMICOLON:
6664 case FFELEX_typeCOMMA:
6665 case FFELEX_typeCOLONCOLON:
6666 ffesta_confirmed (); /* Error, but clearly intended. */
6667 goto bad_1; /* :::::::::::::::::::: */
6670 goto bad_1; /* :::::::::::::::::::: */
6672 case FFELEX_typeNUMBER:
6675 ffesta_tokens[1] = ffelex_token_use (t);
6676 ffesta_confirmed ();
6677 return (ffelexHandler) ffestb_R8381_;
6679 case FFELEX_typeNAMES:
6680 if (ffesta_first_kw != FFESTR_firstASSIGN)
6681 goto bad_0; /* :::::::::::::::::::: */
6683 switch (ffelex_token_type (t))
6685 case FFELEX_typeEOS:
6686 case FFELEX_typeSEMICOLON:
6687 ffesta_confirmed ();
6689 case FFELEX_typePERCENT:
6690 case FFELEX_typeOPEN_PAREN:
6691 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlASSIGN);
6693 goto bad_i; /* :::::::::::::::::::: */
6695 = ffelex_token_number_from_names (ffesta_tokens[0], i);
6696 p += ffelex_token_length (ffesta_tokens[1]); /* Skip to "TO". */
6697 i += ffelex_token_length (ffesta_tokens[1]);
6698 if (!ffesrc_char_match_init (*p, 'T', 't') /* "TO". */
6699 || (++i, !ffesrc_char_match_noninit (*++p, 'O', 'o')))
6701 bad_i_1: /* :::::::::::::::::::: */
6702 ffelex_token_kill (ffesta_tokens[1]);
6703 goto bad_i; /* :::::::::::::::::::: */
6706 if (!ffesrc_is_name_init (*p))
6707 goto bad_i_1; /* :::::::::::::::::::: */
6708 et = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
6709 next = (ffelexHandler)
6711 ffeexpr_lhs (ffesta_output_pool,
6712 FFEEXPR_contextASSIGN,
6716 ffelex_token_kill (et);
6717 return (ffelexHandler) (*next) (t);
6719 case FFELEX_typeCOMMA:
6720 case FFELEX_typeCOLONCOLON:
6721 ffesta_confirmed (); /* Error, but clearly intended. */
6722 goto bad_1; /* :::::::::::::::::::: */
6725 goto bad_1; /* :::::::::::::::::::: */
6729 goto bad_0; /* :::::::::::::::::::: */
6732 bad_0: /* :::::::::::::::::::: */
6733 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", ffesta_tokens[0]);
6734 return (ffelexHandler) ffelex_swallow_tokens (t,
6735 (ffelexHandler) ffesta_zero); /* Invalid first token. */
6737 bad_1: /* :::::::::::::::::::: */
6738 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t);
6739 return (ffelexHandler) ffelex_swallow_tokens (t,
6740 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6742 bad_i: /* :::::::::::::::::::: */
6743 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ASSIGN", ffesta_tokens[0], i, t);
6744 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6747 /* ffestb_R8381_ -- "ASSIGN" NUMBER
6749 return ffestb_R8381_; // to lexer
6751 Make sure the next token is "TO". */
6753 static ffelexHandler
6754 ffestb_R8381_ (ffelexToken t)
6756 if ((ffelex_token_type (t) == FFELEX_typeNAME)
6757 && (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t), "TO", "to",
6760 return (ffelexHandler) ffestb_R8382_;
6763 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t);
6764 if (ffelex_token_type (t) == FFELEX_typeNAME)
6765 return (ffelexHandler) ffestb_R8382_ (t); /* Maybe user forgot "TO". */
6767 ffelex_token_kill (ffesta_tokens[1]);
6768 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6771 /* ffestb_R8382_ -- "ASSIGN" NUMBER ("TO")
6773 return ffestb_R8382_; // to lexer
6775 Make sure the next token is a name, then pass it along to the expression
6776 evaluator as an LHS expression. The callback function is _3_. */
6778 static ffelexHandler
6779 ffestb_R8382_ (ffelexToken t)
6781 if (ffelex_token_type (t) == FFELEX_typeNAME)
6783 return (ffelexHandler)
6785 ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextASSIGN,
6786 (ffeexprCallback) ffestb_R8383_)))
6790 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t);
6791 ffelex_token_kill (ffesta_tokens[1]);
6792 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6795 /* ffestb_R8383_ -- "ASSIGN" NUMBER ("TO") expression
6797 (ffestb_R8383_) // to expression handler
6799 Make sure the next token is an EOS or SEMICOLON. */
6801 static ffelexHandler
6802 ffestb_R8383_ (ffelexToken ft, ffebld expr, ffelexToken t)
6804 switch (ffelex_token_type (t))
6806 case FFELEX_typeEOS:
6807 case FFELEX_typeSEMICOLON:
6808 ffesta_confirmed ();
6811 if (!ffesta_is_inhibited ())
6812 ffestc_R838 (ffesta_tokens[1], expr, ft);
6813 ffelex_token_kill (ffesta_tokens[1]);
6814 return (ffelexHandler) ffesta_zero (t);
6817 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t);
6821 ffelex_token_kill (ffesta_tokens[1]);
6822 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6825 /* ffestb_R840 -- Parse an arithmetic-IF statement
6827 return ffestb_R840; // to lexer
6829 Make sure the statement has a valid form for an arithmetic-IF statement.
6830 If it does, implement the statement. */
6833 ffestb_R840 (ffelexToken t)
6835 switch (ffelex_token_type (ffesta_tokens[0]))
6837 case FFELEX_typeNAME:
6838 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlIF)
6839 goto bad_0; /* :::::::::::::::::::: */
6840 if (ffesta_first_kw != FFESTR_firstIF)
6841 goto bad_0; /* :::::::::::::::::::: */
6844 case FFELEX_typeNAMES:
6845 if (ffesta_first_kw != FFESTR_firstIF)
6846 goto bad_0; /* :::::::::::::::::::: */
6850 goto bad_0; /* :::::::::::::::::::: */
6853 switch (ffelex_token_type (t))
6855 case FFELEX_typeOPEN_PAREN:
6859 goto bad_1; /* :::::::::::::::::::: */
6862 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextARITHIF,
6863 (ffeexprCallback) ffestb_R8401_);
6865 bad_0: /* :::::::::::::::::::: */
6866 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", ffesta_tokens[0]);
6867 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6869 bad_1: /* :::::::::::::::::::: */
6870 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6871 return (ffelexHandler) ffelex_swallow_tokens (t,
6872 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6875 /* ffestb_R8401_ -- "IF" OPEN_PAREN expr
6877 (ffestb_R8401_) // to expression handler
6879 Make sure the next token is CLOSE_PAREN. */
6881 static ffelexHandler
6882 ffestb_R8401_ (ffelexToken ft, ffebld expr, ffelexToken t)
6884 ffestb_local_.if_stmt.expr = expr;
6886 switch (ffelex_token_type (t))
6888 case FFELEX_typeCLOSE_PAREN:
6891 ffesta_tokens[1] = ffelex_token_use (ft);
6892 ffelex_set_names (TRUE); /* In case it's a logical IF instead. */
6893 return (ffelexHandler) ffestb_R8402_;
6899 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6900 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6903 /* ffestb_R8402_ -- "IF" OPEN_PAREN expr CLOSE_PAREN
6905 return ffestb_R8402_; // to lexer
6907 Make sure the next token is NUMBER. */
6909 static ffelexHandler
6910 ffestb_R8402_ (ffelexToken t)
6912 ffelex_set_names (FALSE);
6914 switch (ffelex_token_type (t))
6916 case FFELEX_typeNUMBER:
6917 ffesta_confirmed ();
6918 ffesta_tokens[2] = ffelex_token_use (t);
6919 return (ffelexHandler) ffestb_R8403_;
6925 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6926 ffelex_token_kill (ffesta_tokens[1]);
6927 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6930 /* ffestb_R8403_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER
6932 return ffestb_R8403_; // to lexer
6934 Make sure the next token is COMMA. */
6936 static ffelexHandler
6937 ffestb_R8403_ (ffelexToken t)
6939 switch (ffelex_token_type (t))
6941 case FFELEX_typeCOMMA:
6942 return (ffelexHandler) ffestb_R8404_;
6948 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6949 ffelex_token_kill (ffesta_tokens[1]);
6950 ffelex_token_kill (ffesta_tokens[2]);
6951 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6954 /* ffestb_R8404_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA
6956 return ffestb_R8404_; // to lexer
6958 Make sure the next token is NUMBER. */
6960 static ffelexHandler
6961 ffestb_R8404_ (ffelexToken t)
6963 switch (ffelex_token_type (t))
6965 case FFELEX_typeNUMBER:
6966 ffesta_tokens[3] = ffelex_token_use (t);
6967 return (ffelexHandler) ffestb_R8405_;
6973 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6974 ffelex_token_kill (ffesta_tokens[1]);
6975 ffelex_token_kill (ffesta_tokens[2]);
6976 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6979 /* ffestb_R8405_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER
6981 return ffestb_R8405_; // to lexer
6983 Make sure the next token is COMMA. */
6985 static ffelexHandler
6986 ffestb_R8405_ (ffelexToken t)
6988 switch (ffelex_token_type (t))
6990 case FFELEX_typeCOMMA:
6991 return (ffelexHandler) ffestb_R8406_;
6997 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6998 ffelex_token_kill (ffesta_tokens[1]);
6999 ffelex_token_kill (ffesta_tokens[2]);
7000 ffelex_token_kill (ffesta_tokens[3]);
7001 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7004 /* ffestb_R8406_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER COMMA
7006 return ffestb_R8406_; // to lexer
7008 Make sure the next token is NUMBER. */
7010 static ffelexHandler
7011 ffestb_R8406_ (ffelexToken t)
7013 switch (ffelex_token_type (t))
7015 case FFELEX_typeNUMBER:
7016 ffesta_tokens[4] = ffelex_token_use (t);
7017 return (ffelexHandler) ffestb_R8407_;
7023 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
7024 ffelex_token_kill (ffesta_tokens[1]);
7025 ffelex_token_kill (ffesta_tokens[2]);
7026 ffelex_token_kill (ffesta_tokens[3]);
7027 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7030 /* ffestb_R8407_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER COMMA
7033 return ffestb_R8407_; // to lexer
7035 Make sure the next token is EOS or SEMICOLON. */
7037 static ffelexHandler
7038 ffestb_R8407_ (ffelexToken t)
7040 switch (ffelex_token_type (t))
7042 case FFELEX_typeEOS:
7043 case FFELEX_typeSEMICOLON:
7044 if (!ffesta_is_inhibited ())
7045 ffestc_R840 (ffestb_local_.if_stmt.expr, ffesta_tokens[1],
7046 ffesta_tokens[2], ffesta_tokens[3], ffesta_tokens[4]);
7047 ffelex_token_kill (ffesta_tokens[1]);
7048 ffelex_token_kill (ffesta_tokens[2]);
7049 ffelex_token_kill (ffesta_tokens[3]);
7050 ffelex_token_kill (ffesta_tokens[4]);
7051 return (ffelexHandler) ffesta_zero (t);
7057 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
7058 ffelex_token_kill (ffesta_tokens[1]);
7059 ffelex_token_kill (ffesta_tokens[2]);
7060 ffelex_token_kill (ffesta_tokens[3]);
7061 ffelex_token_kill (ffesta_tokens[4]);
7062 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7065 /* ffestb_R841 -- Parse the CONTINUE statement
7067 return ffestb_R841; // to lexer
7069 Make sure the statement has a valid form for the CONTINUE statement. If
7070 it does, implement the statement. */
7073 ffestb_R841 (ffelexToken t)
7078 switch (ffelex_token_type (ffesta_tokens[0]))
7080 case FFELEX_typeNAME:
7081 if (ffesta_first_kw != FFESTR_firstCONTINUE)
7082 goto bad_0; /* :::::::::::::::::::: */
7085 case FFELEX_typeNAMES:
7086 if (ffesta_first_kw != FFESTR_firstCONTINUE)
7087 goto bad_0; /* :::::::::::::::::::: */
7088 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCONTINUE)
7090 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCONTINUE);
7091 goto bad_i; /* :::::::::::::::::::: */
7096 goto bad_0; /* :::::::::::::::::::: */
7099 switch (ffelex_token_type (t))
7101 case FFELEX_typeEOS:
7102 case FFELEX_typeSEMICOLON:
7103 ffesta_confirmed ();
7104 if (!ffesta_is_inhibited ())
7106 return (ffelexHandler) ffesta_zero (t);
7108 case FFELEX_typeCOMMA:
7109 case FFELEX_typeCOLONCOLON:
7110 ffesta_confirmed (); /* Error, but clearly intended. */
7111 goto bad_1; /* :::::::::::::::::::: */
7114 goto bad_1; /* :::::::::::::::::::: */
7117 bad_0: /* :::::::::::::::::::: */
7118 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTINUE", ffesta_tokens[0]);
7119 return (ffelexHandler) ffelex_swallow_tokens (t,
7120 (ffelexHandler) ffesta_zero); /* Invalid first token. */
7122 bad_1: /* :::::::::::::::::::: */
7123 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTINUE", t);
7124 return (ffelexHandler) ffelex_swallow_tokens (t,
7125 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7127 bad_i: /* :::::::::::::::::::: */
7128 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CONTINUE", ffesta_tokens[0], i, t);
7129 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7132 /* ffestb_R1102 -- Parse the PROGRAM statement
7134 return ffestb_R1102; // to lexer
7136 Make sure the statement has a valid form for the PROGRAM statement. If it
7137 does, implement the statement. */
7140 ffestb_R1102 (ffelexToken t)
7145 switch (ffelex_token_type (ffesta_tokens[0]))
7147 case FFELEX_typeNAME:
7148 if (ffesta_first_kw != FFESTR_firstPROGRAM)
7149 goto bad_0; /* :::::::::::::::::::: */
7150 switch (ffelex_token_type (t))
7152 case FFELEX_typeEOS:
7153 case FFELEX_typeSEMICOLON:
7154 case FFELEX_typeCOMMA:
7155 case FFELEX_typeCOLONCOLON:
7156 ffesta_confirmed (); /* Error, but clearly intended. */
7157 goto bad_1; /* :::::::::::::::::::: */
7160 goto bad_1; /* :::::::::::::::::::: */
7162 case FFELEX_typeNAME:
7166 ffesta_confirmed ();
7167 ffesta_tokens[1] = ffelex_token_use (t);
7168 return (ffelexHandler) ffestb_R11021_;
7170 case FFELEX_typeNAMES:
7171 if (ffesta_first_kw != FFESTR_firstPROGRAM)
7172 goto bad_0; /* :::::::::::::::::::: */
7173 switch (ffelex_token_type (t))
7175 case FFELEX_typeCOMMA:
7176 case FFELEX_typeCOLONCOLON:
7177 ffesta_confirmed (); /* Error, but clearly intended. */
7178 goto bad_1; /* :::::::::::::::::::: */
7181 goto bad_1; /* :::::::::::::::::::: */
7183 case FFELEX_typeEOS:
7184 case FFELEX_typeSEMICOLON:
7187 ffesta_confirmed ();
7188 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlPROGRAM);
7189 if (!ffesrc_is_name_init (*p))
7190 goto bad_i; /* :::::::::::::::::::: */
7192 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
7193 return (ffelexHandler) ffestb_R11021_ (t);
7196 goto bad_0; /* :::::::::::::::::::: */
7199 bad_0: /* :::::::::::::::::::: */
7200 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", ffesta_tokens[0]);
7201 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7203 bad_1: /* :::::::::::::::::::: */
7204 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", t);
7205 return (ffelexHandler) ffelex_swallow_tokens (t,
7206 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7208 bad_i: /* :::::::::::::::::::: */
7209 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "PROGRAM", ffesta_tokens[0], i, t);
7210 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7213 /* ffestb_R11021_ -- "PROGRAM" NAME
7215 return ffestb_R11021_; // to lexer
7217 Make sure the next token is an EOS or SEMICOLON. */
7219 static ffelexHandler
7220 ffestb_R11021_ (ffelexToken t)
7222 switch (ffelex_token_type (t))
7224 case FFELEX_typeEOS:
7225 case FFELEX_typeSEMICOLON:
7226 ffesta_confirmed ();
7227 if (!ffesta_is_inhibited ())
7228 ffestc_R1102 (ffesta_tokens[1]);
7229 ffelex_token_kill (ffesta_tokens[1]);
7230 return (ffelexHandler) ffesta_zero (t);
7233 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", t);
7237 ffelex_token_kill (ffesta_tokens[1]);
7238 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7241 /* ffestb_block -- Parse the BLOCK DATA statement
7243 return ffestb_block; // to lexer
7245 Make sure the statement has a valid form for the BLOCK DATA statement. If
7246 it does, implement the statement. */
7249 ffestb_block (ffelexToken t)
7251 switch (ffelex_token_type (ffesta_tokens[0]))
7253 case FFELEX_typeNAME:
7254 if (ffesta_first_kw != FFESTR_firstBLOCK)
7255 goto bad_0; /* :::::::::::::::::::: */
7256 switch (ffelex_token_type (t))
7259 goto bad_1; /* :::::::::::::::::::: */
7261 case FFELEX_typeNAME:
7262 if (ffesta_second_kw != FFESTR_secondDATA)
7263 goto bad_1; /* :::::::::::::::::::: */
7267 ffesta_confirmed ();
7268 return (ffelexHandler) ffestb_R1111_1_;
7271 goto bad_0; /* :::::::::::::::::::: */
7274 bad_0: /* :::::::::::::::::::: */
7275 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0]);
7276 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7278 bad_1: /* :::::::::::::::::::: */
7279 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t);
7280 return (ffelexHandler) ffelex_swallow_tokens (t,
7281 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7284 /* ffestb_blockdata -- Parse the BLOCKDATA statement
7286 return ffestb_blockdata; // to lexer
7288 Make sure the statement has a valid form for the BLOCKDATA statement. If
7289 it does, implement the statement. */
7292 ffestb_blockdata (ffelexToken t)
7297 switch (ffelex_token_type (ffesta_tokens[0]))
7299 case FFELEX_typeNAME:
7300 if (ffesta_first_kw != FFESTR_firstBLOCKDATA)
7301 goto bad_0; /* :::::::::::::::::::: */
7302 switch (ffelex_token_type (t))
7304 case FFELEX_typeCOMMA:
7305 case FFELEX_typeCOLONCOLON:
7306 ffesta_confirmed (); /* Error, but clearly intended. */
7307 goto bad_1; /* :::::::::::::::::::: */
7310 goto bad_1; /* :::::::::::::::::::: */
7312 case FFELEX_typeNAME:
7313 ffesta_confirmed ();
7314 ffesta_tokens[1] = ffelex_token_use (t);
7315 return (ffelexHandler) ffestb_R1111_2_;
7317 case FFELEX_typeEOS:
7318 case FFELEX_typeSEMICOLON:
7319 ffesta_confirmed ();
7320 ffesta_tokens[1] = NULL;
7321 return (ffelexHandler) ffestb_R1111_2_ (t);
7324 case FFELEX_typeNAMES:
7325 if (ffesta_first_kw != FFESTR_firstBLOCKDATA)
7326 goto bad_0; /* :::::::::::::::::::: */
7327 switch (ffelex_token_type (t))
7330 goto bad_1; /* :::::::::::::::::::: */
7332 case FFELEX_typeEOS:
7333 case FFELEX_typeSEMICOLON:
7336 ffesta_confirmed ();
7337 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlBLOCKDATA);
7340 ffesta_tokens[1] = NULL;
7344 if (!ffesrc_is_name_init (*p))
7345 goto bad_i; /* :::::::::::::::::::: */
7347 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
7349 return (ffelexHandler) ffestb_R1111_2_ (t);
7352 goto bad_0; /* :::::::::::::::::::: */
7355 bad_0: /* :::::::::::::::::::: */
7356 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0]);
7357 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7359 bad_1: /* :::::::::::::::::::: */
7360 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t);
7361 return (ffelexHandler) ffelex_swallow_tokens (t,
7362 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7364 bad_i: /* :::::::::::::::::::: */
7365 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0], i, t);
7366 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7369 /* ffestb_R1111_1_ -- "BLOCK" "DATA"
7371 return ffestb_R1111_1_; // to lexer
7373 Make sure the next token is a NAME, EOS, or SEMICOLON token. */
7375 static ffelexHandler
7376 ffestb_R1111_1_ (ffelexToken t)
7378 switch (ffelex_token_type (t))
7380 case FFELEX_typeNAME:
7381 ffesta_tokens[1] = ffelex_token_use (t);
7382 return (ffelexHandler) ffestb_R1111_2_;
7384 case FFELEX_typeEOS:
7385 case FFELEX_typeSEMICOLON:
7386 ffesta_tokens[1] = NULL;
7387 return (ffelexHandler) ffestb_R1111_2_ (t);
7390 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t);
7394 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7397 /* ffestb_R1111_2_ -- "BLOCK/DATA" NAME
7399 return ffestb_R1111_2_; // to lexer
7401 Make sure the next token is an EOS or SEMICOLON. */
7403 static ffelexHandler
7404 ffestb_R1111_2_ (ffelexToken t)
7406 switch (ffelex_token_type (t))
7408 case FFELEX_typeEOS:
7409 case FFELEX_typeSEMICOLON:
7410 ffesta_confirmed ();
7411 if (!ffesta_is_inhibited ())
7412 ffestc_R1111 (ffesta_tokens[1]);
7413 if (ffesta_tokens[1] != NULL)
7414 ffelex_token_kill (ffesta_tokens[1]);
7415 return (ffelexHandler) ffesta_zero (t);
7418 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t);
7422 if (ffesta_tokens[1] != NULL)
7423 ffelex_token_kill (ffesta_tokens[1]);
7424 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7427 /* ffestb_R1212 -- Parse the CALL statement
7429 return ffestb_R1212; // to lexer
7431 Make sure the statement has a valid form for the CALL statement. If it
7432 does, implement the statement. */
7435 ffestb_R1212 (ffelexToken t)
7442 switch (ffelex_token_type (ffesta_tokens[0]))
7444 case FFELEX_typeNAME:
7445 if (ffesta_first_kw != FFESTR_firstCALL)
7446 goto bad_0; /* :::::::::::::::::::: */
7447 switch (ffelex_token_type (t))
7449 case FFELEX_typeEOS:
7450 case FFELEX_typeSEMICOLON:
7451 case FFELEX_typeCOMMA:
7452 case FFELEX_typeCOLONCOLON:
7453 ffesta_confirmed (); /* Error, but clearly intended. */
7454 goto bad_1; /* :::::::::::::::::::: */
7457 goto bad_1; /* :::::::::::::::::::: */
7459 case FFELEX_typeNAME:
7462 ffesta_confirmed ();
7463 return (ffelexHandler)
7465 ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextSUBROUTINEREF,
7466 (ffeexprCallback) ffestb_R12121_)))
7469 case FFELEX_typeNAMES:
7470 if (ffesta_first_kw != FFESTR_firstCALL)
7471 goto bad_0; /* :::::::::::::::::::: */
7472 switch (ffelex_token_type (t))
7474 case FFELEX_typeCOLONCOLON:
7475 case FFELEX_typeCOMMA:
7476 ffesta_confirmed (); /* Error, but clearly intended. */
7477 goto bad_1; /* :::::::::::::::::::: */
7480 goto bad_1; /* :::::::::::::::::::: */
7482 case FFELEX_typeOPEN_PAREN:
7485 case FFELEX_typeEOS:
7486 case FFELEX_typeSEMICOLON:
7487 ffesta_confirmed ();
7490 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCALL);
7491 if (!ffesrc_is_name_init (*p))
7492 goto bad_i; /* :::::::::::::::::::: */
7493 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
7494 next = (ffelexHandler)
7496 ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextSUBROUTINEREF,
7497 (ffeexprCallback) ffestb_R12121_)))
7499 ffelex_token_kill (nt);
7500 return (ffelexHandler) (*next) (t);
7503 goto bad_0; /* :::::::::::::::::::: */
7506 bad_0: /* :::::::::::::::::::: */
7507 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", ffesta_tokens[0]);
7508 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7510 bad_1: /* :::::::::::::::::::: */
7511 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", t);
7512 return (ffelexHandler) ffelex_swallow_tokens (t,
7513 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7515 bad_i: /* :::::::::::::::::::: */
7516 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CALL", ffesta_tokens[0], i, t);
7517 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7520 /* ffestb_R12121_ -- "CALL" expr
7522 (ffestb_R12121_) // to expression handler
7524 Make sure the statement has a valid form for the CALL statement. If it
7525 does, implement the statement. */
7527 static ffelexHandler
7528 ffestb_R12121_ (ffelexToken ft, ffebld expr, ffelexToken t)
7530 switch (ffelex_token_type (t))
7532 case FFELEX_typeEOS:
7533 case FFELEX_typeSEMICOLON:
7534 ffesta_confirmed ();
7537 if (!ffesta_is_inhibited ())
7538 ffestc_R1212 (expr, ft);
7539 return (ffelexHandler) ffesta_zero (t);
7545 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", t);
7546 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7549 /* ffestb_R1227 -- Parse the RETURN statement
7551 return ffestb_R1227; // to lexer
7553 Make sure the statement has a valid form for the RETURN statement. If it
7554 does, implement the statement. */
7557 ffestb_R1227 (ffelexToken t)
7561 switch (ffelex_token_type (ffesta_tokens[0]))
7563 case FFELEX_typeNAME:
7564 if (ffesta_first_kw != FFESTR_firstRETURN)
7565 goto bad_0; /* :::::::::::::::::::: */
7566 switch (ffelex_token_type (t))
7568 case FFELEX_typeCOMMA:
7569 case FFELEX_typeCOLONCOLON:
7570 ffesta_confirmed (); /* Error, but clearly intended. */
7571 goto bad_1; /* :::::::::::::::::::: */
7573 case FFELEX_typeEQUALS:
7574 case FFELEX_typePOINTS:
7575 case FFELEX_typeCOLON:
7576 goto bad_1; /* :::::::::::::::::::: */
7578 case FFELEX_typeEOS:
7579 case FFELEX_typeSEMICOLON:
7580 case FFELEX_typeNAME:
7581 case FFELEX_typeNUMBER:
7582 ffesta_confirmed ();
7589 return (ffelexHandler) (*((ffelexHandler)
7590 ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextRETURN,
7591 (ffeexprCallback) ffestb_R12271_)))
7594 case FFELEX_typeNAMES:
7595 if (ffesta_first_kw != FFESTR_firstRETURN)
7596 goto bad_0; /* :::::::::::::::::::: */
7597 switch (ffelex_token_type (t))
7599 case FFELEX_typeCOMMA:
7600 case FFELEX_typeCOLONCOLON:
7601 ffesta_confirmed (); /* Error, but clearly intended. */
7602 goto bad_1; /* :::::::::::::::::::: */
7604 case FFELEX_typeEQUALS:
7605 case FFELEX_typePOINTS:
7606 case FFELEX_typeCOLON:
7607 goto bad_1; /* :::::::::::::::::::: */
7609 case FFELEX_typeEOS:
7610 case FFELEX_typeSEMICOLON:
7611 ffesta_confirmed ();
7617 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
7618 FFEEXPR_contextRETURN, (ffeexprCallback) ffestb_R12271_);
7619 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
7620 FFESTR_firstlRETURN);
7622 return (ffelexHandler) ffelex_swallow_tokens (t,
7623 (ffelexHandler) ffesta_zero);
7624 return (ffelexHandler) (*next) (t);
7627 goto bad_0; /* :::::::::::::::::::: */
7630 bad_0: /* :::::::::::::::::::: */
7631 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", ffesta_tokens[0]);
7632 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7634 bad_1: /* :::::::::::::::::::: */
7635 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", t);
7636 return (ffelexHandler) ffelex_swallow_tokens (t,
7637 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7640 /* ffestb_R12271_ -- "RETURN" expr
7642 (ffestb_R12271_) // to expression handler
7644 Make sure the next token is an EOS or SEMICOLON. */
7646 static ffelexHandler
7647 ffestb_R12271_ (ffelexToken ft, ffebld expr, ffelexToken t)
7649 switch (ffelex_token_type (t))
7651 case FFELEX_typeEOS:
7652 case FFELEX_typeSEMICOLON:
7653 ffesta_confirmed ();
7654 if (!ffesta_is_inhibited ())
7655 ffestc_R1227 (expr, ft);
7656 return (ffelexHandler) ffesta_zero (t);
7659 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", t);
7663 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7666 /* ffestb_R1228 -- Parse the CONTAINS statement
7668 return ffestb_R1228; // to lexer
7670 Make sure the statement has a valid form for the CONTAINS statement. If
7671 it does, implement the statement. */
7675 ffestb_R1228 (ffelexToken t)
7680 switch (ffelex_token_type (ffesta_tokens[0]))
7682 case FFELEX_typeNAME:
7683 if (ffesta_first_kw != FFESTR_firstCONTAINS)
7684 goto bad_0; /* :::::::::::::::::::: */
7687 case FFELEX_typeNAMES:
7688 if (ffesta_first_kw != FFESTR_firstCONTAINS)
7689 goto bad_0; /* :::::::::::::::::::: */
7690 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCONTAINS)
7692 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCONTAINS);
7693 goto bad_i; /* :::::::::::::::::::: */
7698 goto bad_0; /* :::::::::::::::::::: */
7701 switch (ffelex_token_type (t))
7703 case FFELEX_typeEOS:
7704 case FFELEX_typeSEMICOLON:
7705 ffesta_confirmed ();
7706 if (!ffesta_is_inhibited ())
7708 return (ffelexHandler) ffesta_zero (t);
7710 case FFELEX_typeCOMMA:
7711 case FFELEX_typeCOLONCOLON:
7712 ffesta_confirmed (); /* Error, but clearly intended. */
7713 goto bad_1; /* :::::::::::::::::::: */
7716 goto bad_1; /* :::::::::::::::::::: */
7719 bad_0: /* :::::::::::::::::::: */
7720 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTAINS", ffesta_tokens[0]);
7721 return (ffelexHandler) ffelex_swallow_tokens (t,
7722 (ffelexHandler) ffesta_zero); /* Invalid first token. */
7724 bad_1: /* :::::::::::::::::::: */
7725 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTAINS", t);
7726 return (ffelexHandler) ffelex_swallow_tokens (t,
7727 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7729 bad_i: /* :::::::::::::::::::: */
7730 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CONTAINS", ffesta_tokens[0], i, t);
7731 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7735 /* ffestb_V009 -- Parse the UNION statement
7737 return ffestb_V009; // to lexer
7739 Make sure the statement has a valid form for the UNION statement. If
7740 it does, implement the statement. */
7744 ffestb_V009 (ffelexToken t)
7749 switch (ffelex_token_type (ffesta_tokens[0]))
7751 case FFELEX_typeNAME:
7752 if (ffesta_first_kw != FFESTR_firstUNION)
7753 goto bad_0; /* :::::::::::::::::::: */
7756 case FFELEX_typeNAMES:
7757 if (ffesta_first_kw != FFESTR_firstUNION)
7758 goto bad_0; /* :::::::::::::::::::: */
7759 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlUNION)
7761 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlUNION);
7762 goto bad_i; /* :::::::::::::::::::: */
7767 goto bad_0; /* :::::::::::::::::::: */
7770 switch (ffelex_token_type (t))
7772 case FFELEX_typeEOS:
7773 case FFELEX_typeSEMICOLON:
7774 ffesta_confirmed ();
7775 if (!ffesta_is_inhibited ())
7777 return (ffelexHandler) ffesta_zero (t);
7779 case FFELEX_typeCOMMA:
7780 case FFELEX_typeCOLONCOLON:
7781 ffesta_confirmed (); /* Error, but clearly intended. */
7782 goto bad_1; /* :::::::::::::::::::: */
7785 goto bad_1; /* :::::::::::::::::::: */
7788 bad_0: /* :::::::::::::::::::: */
7789 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "UNION", ffesta_tokens[0]);
7790 return (ffelexHandler) ffelex_swallow_tokens (t,
7791 (ffelexHandler) ffesta_zero); /* Invalid first token. */
7793 bad_1: /* :::::::::::::::::::: */
7794 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "UNION", t);
7795 return (ffelexHandler) ffelex_swallow_tokens (t,
7796 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7798 bad_i: /* :::::::::::::::::::: */
7799 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "UNION", ffesta_tokens[0], i, t);
7800 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7804 /* ffestb_construct -- Parse a construct name
7806 return ffestb_construct; // to lexer
7808 Make sure the statement can have a construct name (if-then-stmt, do-stmt,
7809 select-case-stmt). */
7812 ffestb_construct (ffelexToken t UNUSED)
7814 /* This handler gets invoked only when token 0 is NAME/NAMES and token 1 is
7817 ffesta_confirmed ();
7818 ffelex_set_names (TRUE);
7819 return (ffelexHandler) ffestb_construct1_;
7822 /* ffestb_construct1_ -- NAME COLON
7824 return ffestb_construct1_; // to lexer
7826 Make sure we've got a NAME that is DO, DOWHILE, IF, SELECT, or SELECTCASE. */
7828 static ffelexHandler
7829 ffestb_construct1_ (ffelexToken t)
7831 ffelex_set_names (FALSE);
7833 switch (ffelex_token_type (t))
7835 case FFELEX_typeNAME:
7836 ffesta_first_kw = ffestr_first (t);
7837 switch (ffesta_first_kw)
7839 case FFESTR_firstIF:
7840 ffestb_local_.construct.next = (ffelexHandler) ffestb_if;
7843 case FFESTR_firstDO:
7844 ffestb_local_.construct.next = (ffelexHandler) ffestb_do;
7847 case FFESTR_firstDOWHILE:
7848 ffestb_local_.construct.next = (ffelexHandler) ffestb_dowhile;
7851 case FFESTR_firstSELECT:
7852 case FFESTR_firstSELECTCASE:
7853 ffestb_local_.construct.next = (ffelexHandler) ffestb_R809;
7857 goto bad; /* :::::::::::::::::::: */
7859 ffesta_construct_name = ffesta_tokens[0];
7860 ffesta_tokens[0] = ffelex_token_use (t);
7861 return (ffelexHandler) ffestb_construct2_;
7863 case FFELEX_typeNAMES:
7864 ffesta_first_kw = ffestr_first (t);
7865 switch (ffesta_first_kw)
7867 case FFESTR_firstIF:
7868 if (ffelex_token_length (t) != FFESTR_firstlIF)
7869 goto bad; /* :::::::::::::::::::: */
7870 ffestb_local_.construct.next = (ffelexHandler) ffestb_if;
7873 case FFESTR_firstDO:
7874 ffestb_local_.construct.next = (ffelexHandler) ffestb_do;
7877 case FFESTR_firstDOWHILE:
7878 if (ffelex_token_length (t) != FFESTR_firstlDOWHILE)
7879 goto bad; /* :::::::::::::::::::: */
7880 ffestb_local_.construct.next = (ffelexHandler) ffestb_dowhile;
7883 case FFESTR_firstSELECTCASE:
7884 if (ffelex_token_length (t) != FFESTR_firstlSELECTCASE)
7885 goto bad; /* :::::::::::::::::::: */
7886 ffestb_local_.construct.next = (ffelexHandler) ffestb_R809;
7890 goto bad; /* :::::::::::::::::::: */
7892 ffesta_construct_name = ffesta_tokens[0];
7893 ffesta_tokens[0] = ffelex_token_use (t);
7894 return (ffelexHandler) ffestb_construct2_;
7900 bad: /* :::::::::::::::::::: */
7901 ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT",
7902 ffesta_tokens[0], t);
7903 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7906 /* ffestb_construct2_ -- NAME COLON "DO/DOWHILE/IF/SELECT/SELECTCASE"
7908 return ffestb_construct2_; // to lexer
7910 This extra step is needed to set ffesta_second_kw if the second token
7911 (here) is a NAME, so DO and SELECT can continue to expect it. */
7913 static ffelexHandler
7914 ffestb_construct2_ (ffelexToken t)
7916 if (ffelex_token_type (t) == FFELEX_typeNAME)
7917 ffesta_second_kw = ffestr_second (t);
7918 return (ffelexHandler) (*ffestb_local_.construct.next) (t);
7921 /* ffestb_heap -- Parse an ALLOCATE/DEALLOCATE statement
7923 return ffestb_heap; // to lexer
7925 Make sure the statement has a valid form for an ALLOCATE/DEALLOCATE
7926 statement. If it does, implement the statement. */
7930 ffestb_heap (ffelexToken t)
7932 switch (ffelex_token_type (ffesta_tokens[0]))
7934 case FFELEX_typeNAME:
7937 case FFELEX_typeNAMES:
7938 if (ffelex_token_length (ffesta_tokens[0]) != ffestb_args.heap.len)
7939 goto bad_0; /* :::::::::::::::::::: */
7943 goto bad_0; /* :::::::::::::::::::: */
7946 switch (ffelex_token_type (t))
7948 case FFELEX_typeOPEN_PAREN:
7951 case FFELEX_typeEOS:
7952 case FFELEX_typeSEMICOLON:
7953 case FFELEX_typeCOMMA:
7954 case FFELEX_typeCOLONCOLON:
7955 ffesta_confirmed (); /* Error, but clearly intended. */
7956 goto bad_1; /* :::::::::::::::::::: */
7959 goto bad_1; /* :::::::::::::::::::: */
7962 ffestb_local_.heap.exprs = ffestt_exprlist_create ();
7963 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
7964 ffestb_args.heap.ctx,
7965 (ffeexprCallback) ffestb_heap1_);
7967 bad_0: /* :::::::::::::::::::: */
7968 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, ffesta_tokens[0]);
7969 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7971 bad_1: /* :::::::::::::::::::: */
7972 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
7973 return (ffelexHandler) ffelex_swallow_tokens (t,
7974 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7977 /* ffestb_heap1_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr
7979 (ffestb_heap1_) // to expression handler
7981 Make sure the next token is COMMA. */
7983 static ffelexHandler
7984 ffestb_heap1_ (ffelexToken ft, ffebld expr, ffelexToken t)
7986 switch (ffelex_token_type (t))
7988 case FFELEX_typeCOMMA:
7991 ffestt_exprlist_append (ffestb_local_.heap.exprs, expr,
7992 ffelex_token_use (t));
7993 return (ffelexHandler) ffestb_heap2_;
7995 case FFELEX_typeCLOSE_PAREN:
7998 ffestt_exprlist_append (ffestb_local_.heap.exprs, expr,
7999 ffelex_token_use (t));
8000 ffesta_tokens[1] = NULL;
8001 ffestb_local_.heap.expr = NULL;
8002 return (ffelexHandler) ffestb_heap5_;
8008 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8009 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8010 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8013 /* ffestb_heap2_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr COMMA
8015 return ffestb_heap2_; // to lexer
8017 Make sure the next token is NAME. */
8019 static ffelexHandler
8020 ffestb_heap2_ (ffelexToken t)
8022 switch (ffelex_token_type (t))
8024 case FFELEX_typeNAME:
8025 ffesta_tokens[1] = ffelex_token_use (t);
8026 return (ffelexHandler) ffestb_heap3_;
8032 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8033 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8034 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8037 /* ffestb_heap3_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr COMMA NAME
8039 return ffestb_heap3_; // to lexer
8041 If token is EQUALS, make sure NAME was "STAT" and handle STAT variable;
8042 else pass NAME and token to expression handler. */
8044 static ffelexHandler
8045 ffestb_heap3_ (ffelexToken t)
8049 switch (ffelex_token_type (t))
8051 case FFELEX_typeEQUALS:
8052 ffesta_confirmed ();
8053 if (ffestr_other (ffesta_tokens[1]) != FFESTR_otherSTAT)
8055 ffelex_token_kill (ffesta_tokens[1]);
8056 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
8057 FFEEXPR_contextHEAPSTAT,
8058 (ffeexprCallback) ffestb_heap4_);
8061 next = (ffelexHandler)
8062 (*((ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
8063 ffestb_args.heap.ctx,
8064 (ffeexprCallback) ffestb_heap1_)))
8066 ffelex_token_kill (ffesta_tokens[1]);
8067 return (ffelexHandler) (*next) (t);
8070 ffelex_token_kill (ffesta_tokens[1]);
8071 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8072 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8073 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8076 /* ffestb_heap4_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN ... COMMA "STAT" EQUALS
8079 (ffestb_heap4_) // to expression handler
8081 Make sure the next token is CLOSE_PAREN. */
8083 static ffelexHandler
8084 ffestb_heap4_ (ffelexToken ft, ffebld expr, ffelexToken t)
8086 switch (ffelex_token_type (t))
8088 case FFELEX_typeCLOSE_PAREN:
8091 ffesta_tokens[1] = ffelex_token_use (ft);
8092 ffestb_local_.heap.expr = expr;
8093 return (ffelexHandler) ffestb_heap5_;
8099 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8100 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8101 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8104 /* ffestb_heap5_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN ... CLOSE_PAREN
8106 return ffestb_heap5_; // to lexer
8108 Make sure the next token is EOS/SEMICOLON. */
8110 static ffelexHandler
8111 ffestb_heap5_ (ffelexToken t)
8113 switch (ffelex_token_type (t))
8115 case FFELEX_typeEOS:
8116 case FFELEX_typeSEMICOLON:
8117 ffesta_confirmed ();
8118 if (!ffesta_is_inhibited ())
8119 if (ffesta_first_kw == FFESTR_firstALLOCATE)
8120 ffestc_R620 (ffestb_local_.heap.exprs, ffestb_local_.heap.expr,
8123 ffestc_R625 (ffestb_local_.heap.exprs, ffestb_local_.heap.expr,
8125 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8126 if (ffesta_tokens[1] != NULL)
8127 ffelex_token_kill (ffesta_tokens[1]);
8128 return (ffelexHandler) ffesta_zero (t);
8134 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8135 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8136 if (ffesta_tokens[1] != NULL)
8137 ffelex_token_kill (ffesta_tokens[1]);
8138 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8142 /* ffestb_module -- Parse the MODULEPROCEDURE statement
8144 return ffestb_module; // to lexer
8146 Make sure the statement has a valid form for the MODULEPROCEDURE statement.
8147 If it does, implement the statement.
8150 Confirm NAME==MODULE followed by standard four invalid tokens, so we
8151 get decent message if somebody forgets that MODULE requires a name. */
8155 ffestb_module (ffelexToken t)
8160 ffelexToken mt; /* Name in MODULE PROCEDUREname, i.e.
8161 includes "PROCEDURE". */
8163 switch (ffelex_token_type (ffesta_tokens[0]))
8165 case FFELEX_typeNAME:
8166 if (ffesta_first_kw != FFESTR_firstMODULE)
8167 goto bad_0; /* :::::::::::::::::::: */
8168 switch (ffelex_token_type (t))
8170 case FFELEX_typeNAME:
8173 case FFELEX_typeCOLONCOLON:
8174 case FFELEX_typeCOMMA:
8175 case FFELEX_typeEOS:
8176 case FFELEX_typeSEMICOLON:
8177 ffesta_confirmed ();
8178 goto bad_1m; /* :::::::::::::::::::: */
8181 goto bad_1m; /* :::::::::::::::::::: */
8184 ffesta_confirmed ();
8185 if (ffesta_second_kw != FFESTR_secondPROCEDURE)
8187 ffesta_tokens[1] = ffelex_token_use (t);
8188 return (ffelexHandler) ffestb_module3_;
8190 ffestb_local_.moduleprocedure.started = FALSE;
8191 ffesta_tokens[1] = ffelex_token_use (t);
8192 return (ffelexHandler) ffestb_module1_;
8194 case FFELEX_typeNAMES:
8195 p = ffelex_token_text (ffesta_tokens[0])
8196 + (i = FFESTR_firstlMODULEPROCEDURE);
8197 if ((ffesta_first_kw == FFESTR_firstMODULE)
8198 || ((ffesta_first_kw == FFESTR_firstMODULEPROCEDURE)
8199 && !ffesrc_is_name_init (*p)))
8200 { /* Definitely not "MODULE PROCEDURE name". */
8201 switch (ffelex_token_type (t))
8203 case FFELEX_typeCOMMA:
8204 case FFELEX_typeCOLONCOLON:
8205 ffesta_confirmed (); /* Error, but clearly intended. */
8206 goto bad_1m; /* :::::::::::::::::::: */
8209 goto bad_1m; /* :::::::::::::::::::: */
8211 case FFELEX_typeEOS:
8212 case FFELEX_typeSEMICOLON:
8213 ffesta_confirmed ();
8216 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlMODULE);
8217 if (!ffesrc_is_name_init (*p))
8218 goto bad_im; /* :::::::::::::::::::: */
8219 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
8220 if (!ffesta_is_inhibited ())
8222 ffelex_token_kill (nt);
8223 return (ffelexHandler) ffesta_zero (t);
8226 /* Here we know that we're indeed looking at a MODULEPROCEDURE
8227 statement rather than MODULE and that the character following
8228 MODULEPROCEDURE in the NAMES token is a valid first character for a
8229 NAME. This means that unless the second token is COMMA, we have an
8230 ambiguous statement that can be read either as MODULE PROCEDURE name
8231 or MODULE PROCEDUREname, the former being an R1205, the latter an
8234 if (ffesta_first_kw != FFESTR_firstMODULEPROCEDURE)
8235 goto bad_0; /* :::::::::::::::::::: */
8236 switch (ffelex_token_type (t))
8238 case FFELEX_typeCOLONCOLON:
8239 ffesta_confirmed (); /* Error, but clearly intended. */
8240 goto bad_1; /* :::::::::::::::::::: */
8243 goto bad_1; /* :::::::::::::::::::: */
8245 case FFELEX_typeCOMMA: /* Aha, clearly not MODULE PROCEDUREname. */
8246 ffesta_confirmed ();
8247 ffestb_local_.moduleprocedure.started = FALSE;
8249 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
8250 return (ffelexHandler) ffestb_module2_ (t);
8252 case FFELEX_typeEOS: /* MODULE PROCEDURE name or MODULE
8254 case FFELEX_typeSEMICOLON:
8255 ffesta_confirmed ();
8258 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
8259 mt = ffelex_token_name_from_names (ffesta_tokens[0], FFESTR_firstlMODULE,
8261 if (!ffesta_is_inhibited ())
8262 ffestc_module (mt, nt); /* Implement ambiguous statement. */
8263 ffelex_token_kill (nt);
8264 ffelex_token_kill (mt);
8265 return (ffelexHandler) ffesta_zero (t);
8268 goto bad_0; /* :::::::::::::::::::: */
8271 bad_0: /* :::::::::::::::::::: */
8272 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", ffesta_tokens[0]);
8273 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8275 bad_1: /* :::::::::::::::::::: */
8276 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t);
8277 return (ffelexHandler) ffelex_swallow_tokens (t,
8278 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8280 bad_1m: /* :::::::::::::::::::: */
8281 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE", t);
8282 return (ffelexHandler) ffelex_swallow_tokens (t,
8283 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8285 bad_im: /* :::::::::::::::::::: */
8286 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "MODULE", ffesta_tokens[0], i, t);
8287 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8290 /* ffestb_module1_ -- "MODULEPROCEDURE" or "MODULE" "PROCEDURE"
8292 return ffestb_module1_; // to lexer
8294 Make sure the statement has a valid form for the MODULEPROCEDURE statement. If it
8295 does, implement the statement. */
8297 static ffelexHandler
8298 ffestb_module1_ (ffelexToken t)
8300 switch (ffelex_token_type (t))
8302 case FFELEX_typeNAME:
8303 if (!ffestb_local_.moduleprocedure.started
8304 && (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME))
8306 ffesta_confirmed ();
8307 ffelex_token_kill (ffesta_tokens[1]);
8309 ffesta_tokens[1] = ffelex_token_use (t);
8310 return (ffelexHandler) ffestb_module2_;
8312 case FFELEX_typeEOS:
8313 case FFELEX_typeSEMICOLON:
8314 if (ffestb_local_.moduleprocedure.started)
8315 break; /* Error if we've already seen NAME COMMA. */
8316 ffesta_confirmed ();
8317 if (!ffesta_is_inhibited ())
8318 ffestc_R1105 (ffesta_tokens[1]);
8319 ffelex_token_kill (ffesta_tokens[1]);
8320 return (ffelexHandler) ffesta_zero (t);
8322 case FFELEX_typeCOMMA:
8323 case FFELEX_typeCOLONCOLON:
8324 ffesta_confirmed (); /* Error, but clearly intended. */
8331 if (ffestb_local_.moduleprocedure.started && !ffesta_is_inhibited ())
8332 ffestc_R1205_finish ();
8333 else if (!ffestb_local_.moduleprocedure.started)
8334 ffelex_token_kill (ffesta_tokens[1]);
8335 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t);
8336 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8339 /* ffestb_module2_ -- "MODULE/PROCEDURE" NAME
8341 return ffestb_module2_; // to lexer
8343 Make sure the statement has a valid form for the MODULEPROCEDURE statement. If it
8344 does, implement the statement. */
8346 static ffelexHandler
8347 ffestb_module2_ (ffelexToken t)
8349 switch (ffelex_token_type (t))
8351 case FFELEX_typeEOS:
8352 case FFELEX_typeSEMICOLON:
8353 if (!ffestb_local_.moduleprocedure.started)
8355 ffesta_confirmed ();
8356 if (!ffesta_is_inhibited ())
8357 ffestc_R1205_start ();
8359 if (!ffesta_is_inhibited ())
8361 ffestc_R1205_item (ffesta_tokens[1]);
8362 ffestc_R1205_finish ();
8364 ffelex_token_kill (ffesta_tokens[1]);
8365 return (ffelexHandler) ffesta_zero (t);
8367 case FFELEX_typeCOMMA:
8368 if (!ffestb_local_.moduleprocedure.started)
8370 ffestb_local_.moduleprocedure.started = TRUE;
8371 ffesta_confirmed ();
8372 if (!ffesta_is_inhibited ())
8373 ffestc_R1205_start ();
8375 if (!ffesta_is_inhibited ())
8376 ffestc_R1205_item (ffesta_tokens[1]);
8377 ffelex_token_kill (ffesta_tokens[1]);
8378 return (ffelexHandler) ffestb_module1_;
8384 if (ffestb_local_.moduleprocedure.started && !ffesta_is_inhibited ())
8385 ffestc_R1205_finish ();
8386 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t);
8387 ffelex_token_kill (ffesta_tokens[1]);
8388 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8391 /* ffestb_module3_ -- "MODULE" NAME
8393 return ffestb_module3_; // to lexer
8395 Make sure the statement has a valid form for the MODULE statement. If it
8396 does, implement the statement. */
8398 static ffelexHandler
8399 ffestb_module3_ (ffelexToken t)
8401 switch (ffelex_token_type (t))
8403 case FFELEX_typeEOS:
8404 case FFELEX_typeSEMICOLON:
8405 if (!ffesta_is_inhibited ())
8406 ffestc_R1105 (ffesta_tokens[1]);
8407 ffelex_token_kill (ffesta_tokens[1]);
8408 return (ffelexHandler) ffesta_zero (t);
8414 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE", t);
8415 ffelex_token_kill (ffesta_tokens[1]);
8416 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8420 /* ffestb_R809 -- Parse the SELECTCASE statement
8422 return ffestb_R809; // to lexer
8424 Make sure the statement has a valid form for the SELECTCASE statement.
8425 If it does, implement the statement. */
8428 ffestb_R809 (ffelexToken t)
8433 switch (ffelex_token_type (ffesta_tokens[0]))
8435 case FFELEX_typeNAME:
8436 switch (ffesta_first_kw)
8438 case FFESTR_firstSELECT:
8439 if ((ffelex_token_type (t) != FFELEX_typeNAME)
8440 || (ffesta_second_kw != FFESTR_secondCASE))
8441 goto bad_1; /* :::::::::::::::::::: */
8442 ffesta_confirmed ();
8443 return (ffelexHandler) ffestb_R8091_;
8445 case FFESTR_firstSELECTCASE:
8446 return (ffelexHandler) ffestb_R8091_ (t);
8449 goto bad_0; /* :::::::::::::::::::: */
8452 case FFELEX_typeNAMES:
8453 if (ffesta_first_kw != FFESTR_firstSELECTCASE)
8454 goto bad_0; /* :::::::::::::::::::: */
8455 switch (ffelex_token_type (t))
8457 case FFELEX_typeCOMMA:
8458 case FFELEX_typeEOS:
8459 case FFELEX_typeSEMICOLON:
8460 case FFELEX_typeCOLONCOLON:
8461 ffesta_confirmed (); /* Error, but clearly intended. */
8462 goto bad_1; /* :::::::::::::::::::: */
8465 goto bad_1; /* :::::::::::::::::::: */
8467 case FFELEX_typeOPEN_PAREN:
8470 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSELECTCASE);
8472 goto bad_i; /* :::::::::::::::::::: */
8473 return (ffelexHandler) ffestb_R8091_ (t);
8476 goto bad_0; /* :::::::::::::::::::: */
8479 bad_0: /* :::::::::::::::::::: */
8480 if (ffesta_construct_name != NULL)
8482 ffelex_token_kill (ffesta_construct_name);
8483 ffesta_construct_name = NULL;
8485 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", ffesta_tokens[0]);
8486 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8488 bad_1: /* :::::::::::::::::::: */
8489 if (ffesta_construct_name != NULL)
8491 ffelex_token_kill (ffesta_construct_name);
8492 ffesta_construct_name = NULL;
8494 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t);
8495 return (ffelexHandler) ffelex_swallow_tokens (t,
8496 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8498 bad_i: /* :::::::::::::::::::: */
8499 if (ffesta_construct_name != NULL)
8501 ffelex_token_kill (ffesta_construct_name);
8502 ffesta_construct_name = NULL;
8504 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", ffesta_tokens[0], i, t);
8505 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8508 /* ffestb_R8091_ -- "SELECTCASE" or "SELECT" "CASE"
8510 return ffestb_R8091_; // to lexer
8512 Make sure the statement has a valid form for the SELECTCASE statement. If it
8513 does, implement the statement. */
8515 static ffelexHandler
8516 ffestb_R8091_ (ffelexToken t)
8518 switch (ffelex_token_type (t))
8520 case FFELEX_typeOPEN_PAREN:
8521 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8522 FFEEXPR_contextSELECTCASE, (ffeexprCallback) ffestb_R8092_);
8524 case FFELEX_typeEOS:
8525 case FFELEX_typeSEMICOLON:
8526 case FFELEX_typeCOMMA:
8527 case FFELEX_typeCOLONCOLON:
8528 ffesta_confirmed (); /* Error, but clearly intended. */
8535 if (ffesta_construct_name != NULL)
8537 ffelex_token_kill (ffesta_construct_name);
8538 ffesta_construct_name = NULL;
8540 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t);
8541 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8544 /* ffestb_R8092_ -- "SELECT/CASE" OPEN_PAREN expr
8546 (ffestb_R8092_) // to expression handler
8548 Make sure the statement has a valid form for the SELECTCASE statement. If it
8549 does, implement the statement. */
8551 static ffelexHandler
8552 ffestb_R8092_ (ffelexToken ft, ffebld expr, ffelexToken t)
8554 switch (ffelex_token_type (t))
8556 case FFELEX_typeCLOSE_PAREN:
8559 ffesta_tokens[1] = ffelex_token_use (ft);
8560 ffestb_local_.selectcase.expr = expr;
8561 return (ffelexHandler) ffestb_R8093_;
8567 if (ffesta_construct_name != NULL)
8569 ffelex_token_kill (ffesta_construct_name);
8570 ffesta_construct_name = NULL;
8572 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t);
8573 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8576 /* ffestb_R8093_ -- "SELECT/CASE" OPEN_PAREN expr CLOSE_PAREN
8578 return ffestb_R8093_; // to lexer
8580 Make sure the statement has a valid form for the SELECTCASE statement. If it
8581 does, implement the statement. */
8583 static ffelexHandler
8584 ffestb_R8093_ (ffelexToken t)
8586 switch (ffelex_token_type (t))
8588 case FFELEX_typeEOS:
8589 case FFELEX_typeSEMICOLON:
8590 ffesta_confirmed ();
8591 if (!ffesta_is_inhibited ())
8592 ffestc_R809 (ffesta_construct_name, ffestb_local_.selectcase.expr,
8594 ffelex_token_kill (ffesta_tokens[1]);
8595 if (ffesta_construct_name != NULL)
8597 ffelex_token_kill (ffesta_construct_name);
8598 ffesta_construct_name = NULL;
8600 return ffesta_zero (t);
8602 case FFELEX_typeCOMMA:
8603 case FFELEX_typeCOLONCOLON:
8604 ffesta_confirmed (); /* Error, but clearly intended. */
8611 ffelex_token_kill (ffesta_tokens[1]);
8612 if (ffesta_construct_name != NULL)
8614 ffelex_token_kill (ffesta_construct_name);
8615 ffesta_construct_name = NULL;
8617 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t);
8618 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8621 /* ffestb_R810 -- Parse the CASE statement
8623 return ffestb_R810; // to lexer
8625 Make sure the statement has a valid form for the CASE statement.
8626 If it does, implement the statement. */
8629 ffestb_R810 (ffelexToken t)
8634 switch (ffelex_token_type (ffesta_tokens[0]))
8636 case FFELEX_typeNAME:
8637 if (ffesta_first_kw != FFESTR_firstCASE)
8638 goto bad_0; /* :::::::::::::::::::: */
8639 switch (ffelex_token_type (t))
8641 case FFELEX_typeCOMMA:
8642 case FFELEX_typeEOS:
8643 case FFELEX_typeSEMICOLON:
8644 case FFELEX_typeCOLONCOLON:
8645 ffesta_confirmed (); /* Error, but clearly intended. */
8646 goto bad_1; /* :::::::::::::::::::: */
8649 goto bad_1; /* :::::::::::::::::::: */
8651 case FFELEX_typeNAME:
8652 ffesta_confirmed ();
8653 if (ffesta_second_kw != FFESTR_secondDEFAULT)
8654 goto bad_1; /* :::::::::::::::::::: */
8655 ffestb_local_.case_stmt.cases = NULL;
8656 return (ffelexHandler) ffestb_R8101_;
8658 case FFELEX_typeOPEN_PAREN:
8659 ffestb_local_.case_stmt.cases = ffestt_caselist_create ();
8660 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8661 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_);
8664 case FFELEX_typeNAMES:
8665 switch (ffesta_first_kw)
8667 case FFESTR_firstCASEDEFAULT:
8668 switch (ffelex_token_type (t))
8670 case FFELEX_typeCOMMA:
8671 case FFELEX_typeCOLONCOLON:
8672 ffesta_confirmed (); /* Error, but clearly intended. */
8673 goto bad_1; /* :::::::::::::::::::: */
8676 goto bad_1; /* :::::::::::::::::::: */
8678 case FFELEX_typeEOS:
8679 case FFELEX_typeSEMICOLON:
8680 ffesta_confirmed ();
8683 ffestb_local_.case_stmt.cases = NULL;
8684 p = ffelex_token_text (ffesta_tokens[0])
8685 + (i = FFESTR_firstlCASEDEFAULT);
8687 return (ffelexHandler) ffestb_R8101_ (t);
8688 if (!ffesrc_is_name_init (*p))
8689 goto bad_i; /* :::::::::::::::::::: */
8690 ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i,
8692 return (ffelexHandler) ffestb_R8102_ (t);
8694 case FFESTR_firstCASE:
8698 goto bad_0; /* :::::::::::::::::::: */
8701 switch (ffelex_token_type (t))
8703 case FFELEX_typeCOMMA:
8704 case FFELEX_typeEOS:
8705 case FFELEX_typeSEMICOLON:
8706 case FFELEX_typeCOLONCOLON:
8707 ffesta_confirmed (); /* Error, but clearly intended. */
8708 goto bad_1; /* :::::::::::::::::::: */
8711 goto bad_1; /* :::::::::::::::::::: */
8713 case FFELEX_typeOPEN_PAREN:
8716 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCASE);
8718 goto bad_i; /* :::::::::::::::::::: */
8719 ffestb_local_.case_stmt.cases = ffestt_caselist_create ();
8720 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8721 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_);
8724 goto bad_0; /* :::::::::::::::::::: */
8727 bad_0: /* :::::::::::::::::::: */
8728 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", ffesta_tokens[0]);
8729 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8731 bad_1: /* :::::::::::::::::::: */
8732 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8733 return (ffelexHandler) ffelex_swallow_tokens (t,
8734 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8736 bad_i: /* :::::::::::::::::::: */
8737 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CASE", ffesta_tokens[0], i, t);
8738 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8741 /* ffestb_R8101_ -- "CASE" case-selector
8743 return ffestb_R8101_; // to lexer
8745 Make sure the statement has a valid form for the CASE statement. If it
8746 does, implement the statement. */
8748 static ffelexHandler
8749 ffestb_R8101_ (ffelexToken t)
8751 switch (ffelex_token_type (t))
8753 case FFELEX_typeNAME:
8754 ffesta_tokens[1] = ffelex_token_use (t);
8755 return (ffelexHandler) ffestb_R8102_;
8757 case FFELEX_typeEOS:
8758 case FFELEX_typeSEMICOLON:
8759 ffesta_tokens[1] = NULL;
8760 return (ffelexHandler) ffestb_R8102_ (t);
8762 case FFELEX_typeCOMMA:
8763 case FFELEX_typeCOLONCOLON:
8764 ffesta_confirmed (); /* Error, but clearly intended. */
8771 if (ffestb_local_.case_stmt.cases != NULL)
8772 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8773 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8774 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8777 /* ffestb_R8102_ -- "CASE" case-selector [NAME]
8779 return ffestb_R8102_; // to lexer
8781 Make sure the statement has a valid form for the CASE statement. If it
8782 does, implement the statement. */
8784 static ffelexHandler
8785 ffestb_R8102_ (ffelexToken t)
8787 switch (ffelex_token_type (t))
8789 case FFELEX_typeEOS:
8790 case FFELEX_typeSEMICOLON:
8791 ffesta_confirmed ();
8792 if (!ffesta_is_inhibited ())
8793 ffestc_R810 (ffestb_local_.case_stmt.cases, ffesta_tokens[1]);
8794 if (ffestb_local_.case_stmt.cases != NULL)
8795 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8796 if (ffesta_tokens[1] != NULL)
8797 ffelex_token_kill (ffesta_tokens[1]);
8798 return (ffelexHandler) ffesta_zero (t);
8800 case FFELEX_typeCOMMA:
8801 case FFELEX_typeCOLONCOLON:
8802 ffesta_confirmed (); /* Error, but clearly intended. */
8809 if (ffestb_local_.case_stmt.cases != NULL)
8810 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8811 if (ffesta_tokens[1] != NULL)
8812 ffelex_token_kill (ffesta_tokens[1]);
8813 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8814 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8817 /* ffestb_R8103_ -- "CASE" OPEN_PAREN expr
8819 (ffestb_R8103_) // to expression handler
8821 Make sure the statement has a valid form for the CASE statement. If it
8822 does, implement the statement. */
8824 static ffelexHandler
8825 ffestb_R8103_ (ffelexToken ft, ffebld expr, ffelexToken t)
8827 switch (ffelex_token_type (t))
8829 case FFELEX_typeCLOSE_PAREN:
8830 ffestt_caselist_append (ffestb_local_.case_stmt.cases, FALSE, expr, NULL,
8831 ffelex_token_use (ft));
8832 return (ffelexHandler) ffestb_R8101_;
8834 case FFELEX_typeCOMMA:
8835 ffestt_caselist_append (ffestb_local_.case_stmt.cases, FALSE, expr, NULL,
8836 ffelex_token_use (ft));
8837 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8838 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_);
8840 case FFELEX_typeCOLON:
8841 ffestt_caselist_append (ffestb_local_.case_stmt.cases, TRUE, expr, NULL,
8842 ffelex_token_use (ft)); /* NULL second expr for
8843 now, just plug in. */
8844 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8845 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8104_);
8851 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8852 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8853 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8856 /* ffestb_R8104_ -- "CASE" OPEN_PAREN expr COLON expr
8858 (ffestb_R8104_) // to expression handler
8860 Make sure the statement has a valid form for the CASE statement. If it
8861 does, implement the statement. */
8863 static ffelexHandler
8864 ffestb_R8104_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
8866 switch (ffelex_token_type (t))
8868 case FFELEX_typeCLOSE_PAREN:
8869 ffestb_local_.case_stmt.cases->previous->expr2 = expr;
8870 return (ffelexHandler) ffestb_R8101_;
8872 case FFELEX_typeCOMMA:
8873 ffestb_local_.case_stmt.cases->previous->expr2 = expr;
8874 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8875 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_);
8881 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8882 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8883 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8886 /* ffestb_R1001 -- Parse a FORMAT statement
8888 return ffestb_R1001; // to lexer
8890 Make sure the statement has a valid form for an FORMAT statement.
8891 If it does, implement the statement. */
8894 ffestb_R1001 (ffelexToken t)
8898 switch (ffelex_token_type (ffesta_tokens[0]))
8900 case FFELEX_typeNAME:
8901 if (ffesta_first_kw != FFESTR_firstFORMAT)
8902 goto bad_0; /* :::::::::::::::::::: */
8905 case FFELEX_typeNAMES:
8906 if (ffesta_first_kw != FFESTR_firstFORMAT)
8907 goto bad_0; /* :::::::::::::::::::: */
8908 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlFORMAT)
8909 goto bad_0; /* :::::::::::::::::::: */
8913 goto bad_0; /* :::::::::::::::::::: */
8916 switch (ffelex_token_type (t))
8918 case FFELEX_typeOPEN_PAREN:
8919 ffestb_local_.format.complained = FALSE;
8920 ffestb_local_.format.f = NULL; /* No parent yet. */
8921 ffestb_local_.format.f = ffestt_formatlist_create (NULL,
8922 ffelex_token_use (t));
8923 ffelex_set_names_pure (TRUE); /* Have even free-form lexer give us
8925 return (ffelexHandler) ffestb_R10011_;
8927 case FFELEX_typeOPEN_ARRAY:/* "(/". */
8928 ffesta_confirmed ();
8929 ffestb_local_.format.complained = FALSE;
8930 ffestb_local_.format.f = ffestt_formatlist_create (NULL,
8931 ffelex_token_use (t));
8932 f = ffestt_formatlist_append (ffestb_local_.format.f);
8933 f->type = FFESTP_formattypeSLASH;
8934 f->t = ffelex_token_use (t);
8935 f->u.R1010.val.present = FALSE;
8936 f->u.R1010.val.rtexpr = FALSE;
8937 f->u.R1010.val.t = NULL;
8938 f->u.R1010.val.u.unsigned_val = 1;
8939 ffelex_set_names_pure (TRUE); /* Have even free-form lexer give us
8941 return (ffelexHandler) ffestb_R100112_;
8943 case FFELEX_typeEOS:
8944 case FFELEX_typeSEMICOLON:
8945 case FFELEX_typeCOMMA:
8946 case FFELEX_typeCOLONCOLON:
8947 ffesta_confirmed (); /* Error, but clearly intended. */
8948 goto bad_1; /* :::::::::::::::::::: */
8951 goto bad_1; /* :::::::::::::::::::: */
8954 bad_0: /* :::::::::::::::::::: */
8955 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", ffesta_tokens[0]);
8956 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8958 bad_1: /* :::::::::::::::::::: */
8959 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
8960 return (ffelexHandler) ffelex_swallow_tokens (t,
8961 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8964 /* ffestb_R10011_ -- "FORMAT" OPEN_PAREN expr
8966 return ffestb_R10011_; // to lexer
8968 For CLOSE_PAREN, wrap up the format list and if it is the top-level one,
8969 exit. For anything else, pass it to _2_. */
8971 static ffelexHandler
8972 ffestb_R10011_ (ffelexToken t)
8976 switch (ffelex_token_type (t))
8978 case FFELEX_typeCLOSE_PAREN:
8982 return (ffelexHandler) ffestb_R10012_ (t);
8985 /* If we have a format we're working on, continue working on it. */
8987 f = ffestb_local_.format.f->u.root.parent;
8991 ffestb_local_.format.f = f->next;
8992 return (ffelexHandler) ffestb_R100111_;
8995 return (ffelexHandler) ffestb_R100114_;
8998 /* ffestb_R10012_ -- "FORMAT" OPEN_PAREN [format-item-list]
9000 return ffestb_R10012_; // to lexer
9002 The initial state for a format-item. Here, just handle the initial
9003 number, sign for number, or run-time expression. Also handle spurious
9004 comma, close-paren (indicating spurious comma), close-array (like
9005 close-paren but preceded by slash), and quoted strings. */
9007 static ffelexHandler
9008 ffestb_R10012_ (ffelexToken t)
9010 unsigned long unsigned_val;
9013 switch (ffelex_token_type (t))
9015 case FFELEX_typeOPEN_ANGLE:
9016 ffesta_confirmed ();
9017 ffestb_local_.format.pre.t = ffelex_token_use (t);
9018 ffelex_set_names_pure (FALSE);
9019 if (!ffesta_seen_first_exec && !ffestb_local_.format.complained)
9021 ffestb_local_.format.complained = TRUE;
9022 ffebad_start (FFEBAD_FORMAT_EXPR_SPEC);
9023 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9026 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
9027 FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100115_);
9029 case FFELEX_typeNUMBER:
9030 ffestb_local_.format.sign = FALSE; /* No sign present. */
9031 ffestb_local_.format.pre.present = TRUE;
9032 ffestb_local_.format.pre.rtexpr = FALSE;
9033 ffestb_local_.format.pre.t = ffelex_token_use (t);
9034 ffestb_local_.format.pre.u.unsigned_val = unsigned_val
9035 = strtoul (ffelex_token_text (t), NULL, 10);
9036 ffelex_set_expecting_hollerith (unsigned_val, '\0',
9037 ffelex_token_where_line (t),
9038 ffelex_token_where_column (t));
9039 return (ffelexHandler) ffestb_R10014_;
9041 case FFELEX_typePLUS:
9042 ffestb_local_.format.sign = TRUE; /* Positive. */
9043 ffestb_local_.format.pre.t = ffelex_token_use (t);
9044 return (ffelexHandler) ffestb_R10013_;
9046 case FFELEX_typeMINUS:
9047 ffestb_local_.format.sign = FALSE; /* Negative. */
9048 ffestb_local_.format.pre.t = ffelex_token_use (t);
9049 return (ffelexHandler) ffestb_R10013_;
9051 case FFELEX_typeCOLON:
9052 case FFELEX_typeCOLONCOLON:/* "::". */
9053 case FFELEX_typeSLASH:
9054 case FFELEX_typeCONCAT: /* "//". */
9055 case FFELEX_typeNAMES:
9056 case FFELEX_typeDOLLAR:
9057 case FFELEX_typeOPEN_PAREN:
9058 case FFELEX_typeOPEN_ARRAY:/* "(/". */
9059 ffestb_local_.format.sign = FALSE; /* No sign present. */
9060 ffestb_local_.format.pre.present = FALSE;
9061 ffestb_local_.format.pre.rtexpr = FALSE;
9062 ffestb_local_.format.pre.t = NULL;
9063 ffestb_local_.format.pre.u.unsigned_val = 1;
9064 return (ffelexHandler) ffestb_R10014_ (t);
9066 case FFELEX_typeCOMMA:
9067 ffebad_start (FFEBAD_FORMAT_EXTRA_COMMA);
9068 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9070 return (ffelexHandler) ffestb_R10012_;
9072 case FFELEX_typeCLOSE_PAREN:
9073 ffebad_start (FFEBAD_FORMAT_EXTRA_COMMA);
9074 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9076 f = ffestb_local_.format.f->u.root.parent;
9078 return (ffelexHandler) ffestb_R100114_;
9079 ffestb_local_.format.f = f->next;
9080 return (ffelexHandler) ffestb_R100111_;
9082 case FFELEX_typeCLOSE_ARRAY: /* "/)". */
9083 f = ffestt_formatlist_append (ffestb_local_.format.f);
9084 f->type = FFESTP_formattypeSLASH;
9085 f->t = ffelex_token_use (t);
9086 f->u.R1010.val.present = FALSE;
9087 f->u.R1010.val.rtexpr = FALSE;
9088 f->u.R1010.val.t = NULL;
9089 f->u.R1010.val.u.unsigned_val = 1;
9090 f = ffestb_local_.format.f->u.root.parent;
9092 return (ffelexHandler) ffestb_R100114_;
9093 ffestb_local_.format.f = f->next;
9094 return (ffelexHandler) ffestb_R100111_;
9096 case FFELEX_typeEOS:
9097 case FFELEX_typeSEMICOLON:
9098 ffesta_confirmed ();
9099 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t);
9100 for (f = ffestb_local_.format.f;
9101 f->u.root.parent != NULL;
9102 f = f->u.root.parent->next)
9104 ffestb_local_.format.f = f;
9105 return (ffelexHandler) ffestb_R100114_ (t);
9107 case FFELEX_typeQUOTE:
9109 break; /* Error, probably something like FORMAT("17)
9111 ffelex_set_expecting_hollerith (-1, '\"',
9112 ffelex_token_where_line (t),
9113 ffelex_token_where_column (t)); /* Don't have to unset
9115 return (ffelexHandler) ffestb_R100113_;
9117 case FFELEX_typeAPOSTROPHE:
9118 #if 0 /* No apparent need for this, and not killed
9120 ffesta_tokens[1] = ffelex_token_use (t);
9122 ffelex_set_expecting_hollerith (-1, '\'',
9123 ffelex_token_where_line (t),
9124 ffelex_token_where_column (t)); /* Don't have to unset
9126 return (ffelexHandler) ffestb_R100113_;
9132 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
9133 ffestt_formatlist_kill (ffestb_local_.format.f);
9134 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
9137 /* ffestb_R10013_ -- "FORMAT" OPEN_PAREN [format-item-list] PLUS/MINUS
9139 return ffestb_R10013_; // to lexer
9141 Expect a NUMBER or complain about and then ignore the PLUS/MINUS. */
9143 static ffelexHandler
9144 ffestb_R10013_ (ffelexToken t)
9146 unsigned long unsigned_val;
9148 switch (ffelex_token_type (t))
9150 case FFELEX_typeNUMBER:
9151 ffestb_local_.format.pre.present = TRUE;
9152 ffestb_local_.format.pre.rtexpr = FALSE;
9153 unsigned_val = strtoul (ffelex_token_text (t), NULL, 10);
9154 ffestb_local_.format.pre.u.signed_val = ffestb_local_.format.sign
9155 ? unsigned_val : -unsigned_val;
9156 ffestb_local_.format.sign = TRUE; /* Sign present. */
9157 return (ffelexHandler) ffestb_R10014_;
9160 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9161 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9162 ffelex_token_where_column (ffestb_local_.format.pre.t));
9164 ffelex_token_kill (ffestb_local_.format.pre.t);
9165 return (ffelexHandler) ffestb_R10012_ (t);
9169 /* ffestb_R10014_ -- "FORMAT" OPEN_PAREN [format-item-list] [[+/-] NUMBER]
9171 return ffestb_R10014_; // to lexer
9173 Here is where we expect to see the actual NAMES, COLON, SLASH, OPEN_PAREN,
9174 OPEN_ARRAY, COLONCOLON, CONCAT, DOLLAR, or HOLLERITH that identifies what
9175 kind of format-item we're dealing with. But if we see a NUMBER instead, it
9176 means free-form spaces number like "5 6 X", so scale the current number
9177 accordingly and reenter this state. (I really wouldn't be surprised if
9178 they change this spacing rule in the F90 spec so that you can't embed
9179 spaces within numbers or within keywords like BN in a free-source-form
9182 static ffelexHandler
9183 ffestb_R10014_ (ffelexToken t)
9190 ffelex_set_expecting_hollerith (0, '\0',
9191 ffewhere_line_unknown (),
9192 ffewhere_column_unknown ());
9194 switch (ffelex_token_type (t))
9196 case FFELEX_typeHOLLERITH:
9197 f = ffestt_formatlist_append (ffestb_local_.format.f);
9198 f->type = FFESTP_formattypeR1016;
9199 f->t = ffelex_token_use (t);
9200 ffelex_token_kill (ffestb_local_.format.pre.t); /* It WAS present! */
9201 return (ffelexHandler) ffestb_R100111_;
9203 case FFELEX_typeNUMBER:
9204 assert (ffestb_local_.format.pre.present);
9205 ffesta_confirmed ();
9206 if (ffestb_local_.format.pre.rtexpr)
9208 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
9209 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9211 return (ffelexHandler) ffestb_R10014_;
9213 if (ffestb_local_.format.sign)
9215 for (i = 0; i < ffelex_token_length (t); ++i)
9216 ffestb_local_.format.pre.u.signed_val *= 10;
9217 ffestb_local_.format.pre.u.signed_val += strtoul (ffelex_token_text (t),
9222 for (i = 0; i < ffelex_token_length (t); ++i)
9223 ffestb_local_.format.pre.u.unsigned_val *= 10;
9224 ffestb_local_.format.pre.u.unsigned_val += strtoul (ffelex_token_text (t),
9226 ffelex_set_expecting_hollerith (ffestb_local_.format.pre.u.unsigned_val,
9228 ffelex_token_where_line (t),
9229 ffelex_token_where_column (t));
9231 return (ffelexHandler) ffestb_R10014_;
9233 case FFELEX_typeCOLONCOLON: /* "::". */
9234 if (ffestb_local_.format.pre.present)
9236 ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_COLON_SPEC,
9237 ffestb_local_.format.pre.t);
9238 ffelex_token_kill (ffestb_local_.format.pre.t);
9239 ffestb_local_.format.pre.present = FALSE;
9243 f = ffestt_formatlist_append (ffestb_local_.format.f);
9244 f->type = FFESTP_formattypeCOLON;
9245 f->t = ffelex_token_use (t);
9246 f->u.R1010.val.present = FALSE;
9247 f->u.R1010.val.rtexpr = FALSE;
9248 f->u.R1010.val.t = NULL;
9249 f->u.R1010.val.u.unsigned_val = 1;
9251 f = ffestt_formatlist_append (ffestb_local_.format.f);
9252 f->type = FFESTP_formattypeCOLON;
9253 f->t = ffelex_token_use (t);
9254 f->u.R1010.val.present = FALSE;
9255 f->u.R1010.val.rtexpr = FALSE;
9256 f->u.R1010.val.t = NULL;
9257 f->u.R1010.val.u.unsigned_val = 1;
9258 return (ffelexHandler) ffestb_R100112_;
9260 case FFELEX_typeCOLON:
9261 if (ffestb_local_.format.pre.present)
9263 ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_COLON_SPEC,
9264 ffestb_local_.format.pre.t);
9265 ffelex_token_kill (ffestb_local_.format.pre.t);
9266 return (ffelexHandler) ffestb_R100112_;
9268 f = ffestt_formatlist_append (ffestb_local_.format.f);
9269 f->type = FFESTP_formattypeCOLON;
9270 f->t = ffelex_token_use (t);
9271 f->u.R1010.val.present = FALSE;
9272 f->u.R1010.val.rtexpr = FALSE;
9273 f->u.R1010.val.t = NULL;
9274 f->u.R1010.val.u.unsigned_val = 1;
9275 return (ffelexHandler) ffestb_R100112_;
9277 case FFELEX_typeCONCAT: /* "//". */
9278 if (ffestb_local_.format.sign)
9280 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9281 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9282 ffelex_token_where_column (ffestb_local_.format.pre.t));
9284 ffestb_local_.format.pre.u.unsigned_val
9285 = (ffestb_local_.format.pre.u.signed_val < 0)
9286 ? -ffestb_local_.format.pre.u.signed_val
9287 : ffestb_local_.format.pre.u.signed_val;
9289 f = ffestt_formatlist_append (ffestb_local_.format.f);
9290 f->type = FFESTP_formattypeSLASH;
9291 f->t = ffelex_token_use (t);
9292 f->u.R1010.val = ffestb_local_.format.pre;
9293 ffestb_local_.format.pre.present = FALSE;
9294 ffestb_local_.format.pre.rtexpr = FALSE;
9295 ffestb_local_.format.pre.t = NULL;
9296 ffestb_local_.format.pre.u.unsigned_val = 1;
9297 f = ffestt_formatlist_append (ffestb_local_.format.f);
9298 f->type = FFESTP_formattypeSLASH;
9299 f->t = ffelex_token_use (t);
9300 f->u.R1010.val = ffestb_local_.format.pre;
9301 return (ffelexHandler) ffestb_R100112_;
9303 case FFELEX_typeSLASH:
9304 if (ffestb_local_.format.sign)
9306 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9307 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9308 ffelex_token_where_column (ffestb_local_.format.pre.t));
9310 ffestb_local_.format.pre.u.unsigned_val
9311 = (ffestb_local_.format.pre.u.signed_val < 0)
9312 ? -ffestb_local_.format.pre.u.signed_val
9313 : ffestb_local_.format.pre.u.signed_val;
9315 f = ffestt_formatlist_append (ffestb_local_.format.f);
9316 f->type = FFESTP_formattypeSLASH;
9317 f->t = ffelex_token_use (t);
9318 f->u.R1010.val = ffestb_local_.format.pre;
9319 return (ffelexHandler) ffestb_R100112_;
9321 case FFELEX_typeOPEN_PAREN:
9322 if (ffestb_local_.format.sign)
9324 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9325 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9326 ffelex_token_where_column (ffestb_local_.format.pre.t));
9328 ffestb_local_.format.pre.u.unsigned_val
9329 = (ffestb_local_.format.pre.u.signed_val < 0)
9330 ? -ffestb_local_.format.pre.u.signed_val
9331 : ffestb_local_.format.pre.u.signed_val;
9333 f = ffestt_formatlist_append (ffestb_local_.format.f);
9334 f->type = FFESTP_formattypeFORMAT;
9335 f->t = ffelex_token_use (t);
9336 f->u.R1003D.R1004 = ffestb_local_.format.pre;
9337 f->u.R1003D.format = ffestb_local_.format.f
9338 = ffestt_formatlist_create (f, ffelex_token_use (t));
9339 return (ffelexHandler) ffestb_R10011_;
9341 case FFELEX_typeOPEN_ARRAY:/* "(/". */
9342 if (ffestb_local_.format.sign)
9344 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9345 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9346 ffelex_token_where_column (ffestb_local_.format.pre.t));
9348 ffestb_local_.format.pre.u.unsigned_val
9349 = (ffestb_local_.format.pre.u.signed_val < 0)
9350 ? -ffestb_local_.format.pre.u.signed_val
9351 : ffestb_local_.format.pre.u.signed_val;
9353 f = ffestt_formatlist_append (ffestb_local_.format.f);
9354 f->type = FFESTP_formattypeFORMAT;
9355 f->t = ffelex_token_use (t);
9356 f->u.R1003D.R1004 = ffestb_local_.format.pre;
9357 f->u.R1003D.format = ffestb_local_.format.f
9358 = ffestt_formatlist_create (f, ffelex_token_use (t));
9359 f = ffestt_formatlist_append (ffestb_local_.format.f);
9360 f->type = FFESTP_formattypeSLASH;
9361 f->t = ffelex_token_use (t);
9362 f->u.R1010.val.present = FALSE;
9363 f->u.R1010.val.rtexpr = FALSE;
9364 f->u.R1010.val.t = NULL;
9365 f->u.R1010.val.u.unsigned_val = 1;
9366 return (ffelexHandler) ffestb_R100112_;
9368 case FFELEX_typeCLOSE_ARRAY: /* "/)". */
9369 f = ffestt_formatlist_append (ffestb_local_.format.f);
9370 f->type = FFESTP_formattypeSLASH;
9371 f->t = ffelex_token_use (t);
9372 f->u.R1010.val = ffestb_local_.format.pre;
9373 f = ffestb_local_.format.f->u.root.parent;
9375 return (ffelexHandler) ffestb_R100114_;
9376 ffestb_local_.format.f = f->next;
9377 return (ffelexHandler) ffestb_R100111_;
9379 case FFELEX_typeQUOTE:
9381 break; /* A totally bad character in a VXT FORMAT. */
9382 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
9383 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9384 ffelex_token_where_column (ffestb_local_.format.pre.t));
9386 ffelex_token_kill (ffestb_local_.format.pre.t);
9387 ffesta_confirmed ();
9388 #if 0 /* No apparent need for this, and not killed
9390 ffesta_tokens[1] = ffelex_token_use (t);
9392 ffelex_set_expecting_hollerith (-1, '\"',
9393 ffelex_token_where_line (t),
9394 ffelex_token_where_column (t)); /* Don't have to unset
9396 return (ffelexHandler) ffestb_R100113_;
9398 case FFELEX_typeAPOSTROPHE:
9399 ffesta_confirmed ();
9400 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
9401 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9402 ffelex_token_where_column (ffestb_local_.format.pre.t));
9404 ffelex_token_kill (ffestb_local_.format.pre.t);
9405 #if 0 /* No apparent need for this, and not killed
9407 ffesta_tokens[1] = ffelex_token_use (t);
9409 ffelex_set_expecting_hollerith (-1, '\'', ffelex_token_where_line (t),
9410 ffelex_token_where_column (t)); /* Don't have to unset
9412 return (ffelexHandler) ffestb_R100113_;
9414 case FFELEX_typeEOS:
9415 case FFELEX_typeSEMICOLON:
9416 ffesta_confirmed ();
9417 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t);
9418 for (f = ffestb_local_.format.f;
9419 f->u.root.parent != NULL;
9420 f = f->u.root.parent->next)
9422 ffestb_local_.format.f = f;
9423 ffelex_token_kill (ffestb_local_.format.pre.t);
9424 return (ffelexHandler) ffestb_R100114_ (t);
9426 case FFELEX_typeDOLLAR:
9427 ffestb_local_.format.t = ffelex_token_use (t);
9428 if (ffestb_local_.format.pre.present)
9429 ffesta_confirmed (); /* Number preceding this invalid elsewhere. */
9430 ffestb_local_.format.current = FFESTP_formattypeDOLLAR;
9431 return (ffelexHandler) ffestb_R10015_;
9433 case FFELEX_typeNAMES:
9434 kw = ffestr_format (t);
9435 ffestb_local_.format.t = ffelex_token_use (t);
9438 case FFESTR_formatI:
9439 if (ffestb_local_.format.pre.present)
9440 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9441 ffestb_local_.format.current = FFESTP_formattypeI;
9442 i = FFESTR_formatlI;
9445 case FFESTR_formatB:
9446 if (ffestb_local_.format.pre.present)
9447 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9448 ffestb_local_.format.current = FFESTP_formattypeB;
9449 i = FFESTR_formatlB;
9452 case FFESTR_formatO:
9453 if (ffestb_local_.format.pre.present)
9454 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9455 ffestb_local_.format.current = FFESTP_formattypeO;
9456 i = FFESTR_formatlO;
9459 case FFESTR_formatZ:
9460 if (ffestb_local_.format.pre.present)
9461 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9462 ffestb_local_.format.current = FFESTP_formattypeZ;
9463 i = FFESTR_formatlZ;
9466 case FFESTR_formatF:
9467 if (ffestb_local_.format.pre.present)
9468 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9469 ffestb_local_.format.current = FFESTP_formattypeF;
9470 i = FFESTR_formatlF;
9473 case FFESTR_formatE:
9474 ffestb_local_.format.current = FFESTP_formattypeE;
9475 i = FFESTR_formatlE;
9478 case FFESTR_formatEN:
9479 if (ffestb_local_.format.pre.present)
9480 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9481 ffestb_local_.format.current = FFESTP_formattypeEN;
9482 i = FFESTR_formatlEN;
9485 case FFESTR_formatG:
9486 if (ffestb_local_.format.pre.present)
9487 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9488 ffestb_local_.format.current = FFESTP_formattypeG;
9489 i = FFESTR_formatlG;
9492 case FFESTR_formatL:
9493 if (ffestb_local_.format.pre.present)
9494 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9495 ffestb_local_.format.current = FFESTP_formattypeL;
9496 i = FFESTR_formatlL;
9499 case FFESTR_formatA:
9500 if (ffestb_local_.format.pre.present)
9501 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9502 ffestb_local_.format.current = FFESTP_formattypeA;
9503 i = FFESTR_formatlA;
9506 case FFESTR_formatD:
9507 ffestb_local_.format.current = FFESTP_formattypeD;
9508 i = FFESTR_formatlD;
9511 case FFESTR_formatQ:
9512 ffestb_local_.format.current = FFESTP_formattypeQ;
9513 i = FFESTR_formatlQ;
9516 case FFESTR_formatDOLLAR:
9517 if (ffestb_local_.format.pre.present)
9518 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9519 ffestb_local_.format.current = FFESTP_formattypeDOLLAR;
9520 i = FFESTR_formatlDOLLAR;
9523 case FFESTR_formatP:
9524 if (ffestb_local_.format.pre.present)
9525 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9526 ffestb_local_.format.current = FFESTP_formattypeP;
9527 i = FFESTR_formatlP;
9530 case FFESTR_formatT:
9531 if (ffestb_local_.format.pre.present)
9532 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9533 ffestb_local_.format.current = FFESTP_formattypeT;
9534 i = FFESTR_formatlT;
9537 case FFESTR_formatTL:
9538 if (ffestb_local_.format.pre.present)
9539 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9540 ffestb_local_.format.current = FFESTP_formattypeTL;
9541 i = FFESTR_formatlTL;
9544 case FFESTR_formatTR:
9545 if (ffestb_local_.format.pre.present)
9546 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9547 ffestb_local_.format.current = FFESTP_formattypeTR;
9548 i = FFESTR_formatlTR;
9551 case FFESTR_formatX:
9552 if (ffestb_local_.format.pre.present)
9553 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9554 ffestb_local_.format.current = FFESTP_formattypeX;
9555 i = FFESTR_formatlX;
9558 case FFESTR_formatS:
9559 if (ffestb_local_.format.pre.present)
9560 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9561 ffestb_local_.format.current = FFESTP_formattypeS;
9562 i = FFESTR_formatlS;
9565 case FFESTR_formatSP:
9566 if (ffestb_local_.format.pre.present)
9567 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9568 ffestb_local_.format.current = FFESTP_formattypeSP;
9569 i = FFESTR_formatlSP;
9572 case FFESTR_formatSS:
9573 if (ffestb_local_.format.pre.present)
9574 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9575 ffestb_local_.format.current = FFESTP_formattypeSS;
9576 i = FFESTR_formatlSS;
9579 case FFESTR_formatBN:
9580 if (ffestb_local_.format.pre.present)
9581 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9582 ffestb_local_.format.current = FFESTP_formattypeBN;
9583 i = FFESTR_formatlBN;
9586 case FFESTR_formatBZ:
9587 if (ffestb_local_.format.pre.present)
9588 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9589 ffestb_local_.format.current = FFESTP_formattypeBZ;
9590 i = FFESTR_formatlBZ;
9593 case FFESTR_formatH: /* Error, either "H" or "<expr>H". */
9594 if (ffestb_local_.format.pre.present)
9595 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9596 ffestb_local_.format.current = FFESTP_formattypeH;
9597 i = FFESTR_formatlH;
9600 case FFESTR_formatPD:
9601 if (ffestb_local_.format.pre.present)
9602 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9603 ffestb_subr_R1001_append_p_ ();
9604 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9605 FFESTR_formatlP, 1);
9606 ffestb_local_.format.sign = FALSE;
9607 ffestb_local_.format.pre.present = FALSE;
9608 ffestb_local_.format.pre.rtexpr = FALSE;
9609 ffestb_local_.format.pre.t = NULL;
9610 ffestb_local_.format.pre.u.unsigned_val = 1;
9611 ffestb_local_.format.current = FFESTP_formattypeD;
9612 i = FFESTR_formatlPD;
9615 case FFESTR_formatPE:
9616 if (ffestb_local_.format.pre.present)
9617 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9618 ffestb_subr_R1001_append_p_ ();
9619 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9620 FFESTR_formatlP, 1);
9621 ffestb_local_.format.sign = FALSE;
9622 ffestb_local_.format.pre.present = FALSE;
9623 ffestb_local_.format.pre.rtexpr = FALSE;
9624 ffestb_local_.format.pre.t = NULL;
9625 ffestb_local_.format.pre.u.unsigned_val = 1;
9626 ffestb_local_.format.current = FFESTP_formattypeE;
9627 i = FFESTR_formatlPE;
9630 case FFESTR_formatPEN:
9631 if (ffestb_local_.format.pre.present)
9632 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9633 ffestb_subr_R1001_append_p_ ();
9634 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9635 FFESTR_formatlP, 1);
9636 ffestb_local_.format.sign = FALSE;
9637 ffestb_local_.format.pre.present = FALSE;
9638 ffestb_local_.format.pre.rtexpr = FALSE;
9639 ffestb_local_.format.pre.t = NULL;
9640 ffestb_local_.format.pre.u.unsigned_val = 1;
9641 ffestb_local_.format.current = FFESTP_formattypeEN;
9642 i = FFESTR_formatlPEN;
9645 case FFESTR_formatPF:
9646 if (ffestb_local_.format.pre.present)
9647 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9648 ffestb_subr_R1001_append_p_ ();
9649 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9650 FFESTR_formatlP, 1);
9651 ffestb_local_.format.sign = FALSE;
9652 ffestb_local_.format.pre.present = FALSE;
9653 ffestb_local_.format.pre.rtexpr = FALSE;
9654 ffestb_local_.format.pre.t = NULL;
9655 ffestb_local_.format.pre.u.unsigned_val = 1;
9656 ffestb_local_.format.current = FFESTP_formattypeF;
9657 i = FFESTR_formatlPF;
9660 case FFESTR_formatPG:
9661 if (ffestb_local_.format.pre.present)
9662 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9663 ffestb_subr_R1001_append_p_ ();
9664 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9665 FFESTR_formatlP, 1);
9666 ffestb_local_.format.sign = FALSE;
9667 ffestb_local_.format.pre.present = FALSE;
9668 ffestb_local_.format.pre.rtexpr = FALSE;
9669 ffestb_local_.format.pre.t = NULL;
9670 ffestb_local_.format.pre.u.unsigned_val = 1;
9671 ffestb_local_.format.current = FFESTP_formattypeG;
9672 i = FFESTR_formatlPG;
9676 if (ffestb_local_.format.pre.present)
9677 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9678 ffestb_local_.format.current = FFESTP_formattypeNone;
9679 p = strpbrk (ffelex_token_text (t), "0123456789");
9681 i = ffelex_token_length (t);
9683 i = p - ffelex_token_text (t);
9686 p = ffelex_token_text (t) + i;
9688 return (ffelexHandler) ffestb_R10015_;
9691 if (ffestb_local_.format.current == FFESTP_formattypeH)
9692 p = strpbrk (p, "0123456789");
9696 ffestb_local_.format.current = FFESTP_formattypeNone;
9699 return (ffelexHandler) ffestb_R10015_;
9700 i = p - ffelex_token_text (t); /* Collect digits. */
9702 ffestb_local_.format.post.present = TRUE;
9703 ffestb_local_.format.post.rtexpr = FALSE;
9704 ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i);
9705 ffestb_local_.format.post.u.unsigned_val
9706 = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10);
9707 p += ffelex_token_length (ffestb_local_.format.post.t);
9708 i += ffelex_token_length (ffestb_local_.format.post.t);
9710 return (ffelexHandler) ffestb_R10016_;
9711 if ((kw != FFESTR_formatP) || !ffelex_is_firstnamechar (*p))
9713 if (ffestb_local_.format.current != FFESTP_formattypeH)
9714 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL);
9715 return (ffelexHandler) ffestb_R10016_;
9718 /* Here we have [number]P[number][text]. Treat as
9719 [number]P,[number][text]. */
9721 ffestb_subr_R1001_append_p_ ();
9722 t = ffestb_local_.format.t = ffelex_token_names_from_names (t, i, 0);
9723 ffestb_local_.format.sign = FALSE;
9724 ffestb_local_.format.pre = ffestb_local_.format.post;
9725 kw = ffestr_format (t);
9727 { /* Only a few possibilities here. */
9728 case FFESTR_formatD:
9729 ffestb_local_.format.current = FFESTP_formattypeD;
9730 i = FFESTR_formatlD;
9733 case FFESTR_formatE:
9734 ffestb_local_.format.current = FFESTP_formattypeE;
9735 i = FFESTR_formatlE;
9738 case FFESTR_formatEN:
9739 ffestb_local_.format.current = FFESTP_formattypeEN;
9740 i = FFESTR_formatlEN;
9743 case FFESTR_formatF:
9744 ffestb_local_.format.current = FFESTP_formattypeF;
9745 i = FFESTR_formatlF;
9748 case FFESTR_formatG:
9749 ffestb_local_.format.current = FFESTP_formattypeG;
9750 i = FFESTR_formatlG;
9754 ffebad_start (FFEBAD_FORMAT_P_NOCOMMA);
9755 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9757 ffestb_local_.format.current = FFESTP_formattypeNone;
9758 p = strpbrk (ffelex_token_text (t), "0123456789");
9760 i = ffelex_token_length (t);
9762 i = p - ffelex_token_text (t);
9764 p = ffelex_token_text (t) + i;
9766 return (ffelexHandler) ffestb_R10015_;
9769 ffestb_local_.format.current = FFESTP_formattypeNone;
9770 p = strpbrk (p, "0123456789");
9772 return (ffelexHandler) ffestb_R10015_;
9773 i = p - ffelex_token_text (t); /* Collect digits anyway. */
9775 ffestb_local_.format.post.present = TRUE;
9776 ffestb_local_.format.post.rtexpr = FALSE;
9777 ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i);
9778 ffestb_local_.format.post.u.unsigned_val
9779 = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10);
9780 p += ffelex_token_length (ffestb_local_.format.post.t);
9781 i += ffelex_token_length (ffestb_local_.format.post.t);
9783 return (ffelexHandler) ffestb_R10016_;
9784 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL);
9785 return (ffelexHandler) ffestb_R10016_;
9791 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
9792 if (ffestb_local_.format.pre.present)
9793 ffelex_token_kill (ffestb_local_.format.pre.t);
9794 ffestt_formatlist_kill (ffestb_local_.format.f);
9795 return (ffelexHandler) ffelex_swallow_tokens (t,
9796 (ffelexHandler) ffesta_zero);
9799 /* ffestb_R10015_ -- [[+/-] NUMBER] NAMES
9801 return ffestb_R10015_; // to lexer
9803 Here we've gotten at least the initial mnemonic for the edit descriptor.
9804 We expect either a NUMBER, for the post-mnemonic value, a NAMES, for
9805 further clarification (in free-form only, sigh) of the mnemonic, or
9806 anything else. In all cases we go to _6_, with the difference that for
9807 NUMBER and NAMES we send the next token rather than the current token. */
9809 static ffelexHandler
9810 ffestb_R10015_ (ffelexToken t)
9812 bool split_pea; /* New NAMES requires splitting kP from new
9818 switch (ffelex_token_type (t))
9820 case FFELEX_typeOPEN_ANGLE:
9821 ffesta_confirmed ();
9822 ffestb_local_.format.post.t = ffelex_token_use (t);
9823 ffelex_set_names_pure (FALSE);
9824 if (!ffesta_seen_first_exec && !ffestb_local_.format.complained)
9826 ffestb_local_.format.complained = TRUE;
9827 ffebad_start (FFEBAD_FORMAT_EXPR_SPEC);
9828 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9831 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
9832 FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100116_);
9834 case FFELEX_typeNUMBER:
9835 ffestb_local_.format.post.present = TRUE;
9836 ffestb_local_.format.post.rtexpr = FALSE;
9837 ffestb_local_.format.post.t = ffelex_token_use (t);
9838 ffestb_local_.format.post.u.unsigned_val
9839 = strtoul (ffelex_token_text (t), NULL, 10);
9840 return (ffelexHandler) ffestb_R10016_;
9842 case FFELEX_typeNAMES:
9843 ffesta_confirmed (); /* NAMES " " NAMES invalid elsewhere in
9845 kw = ffestr_format (t);
9846 switch (ffestb_local_.format.current)
9848 case FFESTP_formattypeP:
9852 case FFESTP_formattypeH: /* An error, maintain this indicator. */
9853 kw = FFESTR_formatNone;
9864 case FFESTR_formatF:
9865 switch (ffestb_local_.format.current)
9867 case FFESTP_formattypeP:
9868 ffestb_local_.format.current = FFESTP_formattypeF;
9872 ffestb_local_.format.current = FFESTP_formattypeNone;
9875 i = FFESTR_formatlF;
9878 case FFESTR_formatE:
9879 switch (ffestb_local_.format.current)
9881 case FFESTP_formattypeP:
9882 ffestb_local_.format.current = FFESTP_formattypeE;
9886 ffestb_local_.format.current = FFESTP_formattypeNone;
9889 i = FFESTR_formatlE;
9892 case FFESTR_formatEN:
9893 switch (ffestb_local_.format.current)
9895 case FFESTP_formattypeP:
9896 ffestb_local_.format.current = FFESTP_formattypeEN;
9900 ffestb_local_.format.current = FFESTP_formattypeNone;
9903 i = FFESTR_formatlEN;
9906 case FFESTR_formatG:
9907 switch (ffestb_local_.format.current)
9909 case FFESTP_formattypeP:
9910 ffestb_local_.format.current = FFESTP_formattypeG;
9914 ffestb_local_.format.current = FFESTP_formattypeNone;
9917 i = FFESTR_formatlG;
9920 case FFESTR_formatL:
9921 switch (ffestb_local_.format.current)
9923 case FFESTP_formattypeT:
9924 ffestb_local_.format.current = FFESTP_formattypeTL;
9928 ffestb_local_.format.current = FFESTP_formattypeNone;
9931 i = FFESTR_formatlL;
9934 case FFESTR_formatD:
9935 switch (ffestb_local_.format.current)
9937 case FFESTP_formattypeP:
9938 ffestb_local_.format.current = FFESTP_formattypeD;
9942 ffestb_local_.format.current = FFESTP_formattypeNone;
9945 i = FFESTR_formatlD;
9948 case FFESTR_formatS:
9949 switch (ffestb_local_.format.current)
9951 case FFESTP_formattypeS:
9952 ffestb_local_.format.current = FFESTP_formattypeSS;
9956 ffestb_local_.format.current = FFESTP_formattypeNone;
9959 i = FFESTR_formatlS;
9962 case FFESTR_formatP:
9963 switch (ffestb_local_.format.current)
9965 case FFESTP_formattypeS:
9966 ffestb_local_.format.current = FFESTP_formattypeSP;
9970 ffestb_local_.format.current = FFESTP_formattypeNone;
9973 i = FFESTR_formatlP;
9976 case FFESTR_formatR:
9977 switch (ffestb_local_.format.current)
9979 case FFESTP_formattypeT:
9980 ffestb_local_.format.current = FFESTP_formattypeTR;
9984 ffestb_local_.format.current = FFESTP_formattypeNone;
9987 i = FFESTR_formatlR;
9990 case FFESTR_formatZ:
9991 switch (ffestb_local_.format.current)
9993 case FFESTP_formattypeB:
9994 ffestb_local_.format.current = FFESTP_formattypeBZ;
9998 ffestb_local_.format.current = FFESTP_formattypeNone;
10001 i = FFESTR_formatlZ;
10004 case FFESTR_formatN:
10005 switch (ffestb_local_.format.current)
10007 case FFESTP_formattypeE:
10008 ffestb_local_.format.current = FFESTP_formattypeEN;
10011 case FFESTP_formattypeB:
10012 ffestb_local_.format.current = FFESTP_formattypeBN;
10016 ffestb_local_.format.current = FFESTP_formattypeNone;
10019 i = FFESTR_formatlN;
10023 if (ffestb_local_.format.current != FFESTP_formattypeH)
10024 ffestb_local_.format.current = FFESTP_formattypeNone;
10025 split_pea = FALSE; /* Go ahead and let the P be in the party. */
10026 p = strpbrk (ffelex_token_text (t), "0123456789");
10028 i = ffelex_token_length (t);
10030 i = p - ffelex_token_text (t);
10035 ffestb_subr_R1001_append_p_ ();
10036 ffestb_local_.format.t = ffelex_token_use (t);
10037 ffestb_local_.format.sign = FALSE;
10038 ffestb_local_.format.pre.present = FALSE;
10039 ffestb_local_.format.pre.rtexpr = FALSE;
10040 ffestb_local_.format.pre.t = NULL;
10041 ffestb_local_.format.pre.u.unsigned_val = 1;
10044 p = ffelex_token_text (t) + i;
10046 return (ffelexHandler) ffestb_R10015_;
10049 ffestb_local_.format.current = FFESTP_formattypeNone;
10050 p = strpbrk (p, "0123456789");
10052 return (ffelexHandler) ffestb_R10015_;
10053 i = p - ffelex_token_text (t); /* Collect digits anyway. */
10055 ffestb_local_.format.post.present = TRUE;
10056 ffestb_local_.format.post.rtexpr = FALSE;
10057 ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i);
10058 ffestb_local_.format.post.u.unsigned_val
10059 = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10);
10060 p += ffelex_token_length (ffestb_local_.format.post.t);
10061 i += ffelex_token_length (ffestb_local_.format.post.t);
10063 return (ffelexHandler) ffestb_R10016_;
10064 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL);
10065 return (ffelexHandler) ffestb_R10016_;
10068 ffestb_local_.format.post.present = FALSE;
10069 ffestb_local_.format.post.rtexpr = FALSE;
10070 ffestb_local_.format.post.t = NULL;
10071 ffestb_local_.format.post.u.unsigned_val = 1;
10072 return (ffelexHandler) ffestb_R10016_ (t);
10076 /* ffestb_R10016_ -- [[+/-] NUMBER] NAMES NUMBER
10078 return ffestb_R10016_; // to lexer
10080 Expect a PERIOD here. Maybe find a NUMBER to append to the current
10081 number, in which case return to this state. Maybe find a NAMES to switch
10082 from a kP descriptor to a new descriptor (else the NAMES is spurious),
10083 in which case generator the P item and go to state _4_. Anything
10084 else, pass token on to state _8_. */
10086 static ffelexHandler
10087 ffestb_R10016_ (ffelexToken t)
10091 switch (ffelex_token_type (t))
10093 case FFELEX_typePERIOD:
10094 return (ffelexHandler) ffestb_R10017_;
10096 case FFELEX_typeNUMBER:
10097 assert (ffestb_local_.format.post.present);
10098 ffesta_confirmed ();
10099 if (ffestb_local_.format.post.rtexpr)
10101 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
10102 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10104 return (ffelexHandler) ffestb_R10016_;
10106 for (i = 0; i < ffelex_token_length (t); ++i)
10107 ffestb_local_.format.post.u.unsigned_val *= 10;
10108 ffestb_local_.format.post.u.unsigned_val += strtoul (ffelex_token_text (t),
10110 return (ffelexHandler) ffestb_R10016_;
10112 case FFELEX_typeNAMES:
10113 ffesta_confirmed (); /* NUMBER " " NAMES invalid elsewhere. */
10114 if (ffestb_local_.format.current != FFESTP_formattypeP)
10116 ffesta_ffebad_1t (FFEBAD_FORMAT_TEXT_IN_NUMBER, t);
10117 return (ffelexHandler) ffestb_R10016_;
10119 ffestb_subr_R1001_append_p_ ();
10120 ffestb_local_.format.sign = FALSE;
10121 ffestb_local_.format.pre = ffestb_local_.format.post;
10122 return (ffelexHandler) ffestb_R10014_ (t);
10125 ffestb_local_.format.dot.present = FALSE;
10126 ffestb_local_.format.dot.rtexpr = FALSE;
10127 ffestb_local_.format.dot.t = NULL;
10128 ffestb_local_.format.dot.u.unsigned_val = 1;
10129 return (ffelexHandler) ffestb_R10018_ (t);
10133 /* ffestb_R10017_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD
10135 return ffestb_R10017_; // to lexer
10137 Here we've gotten the period following the edit descriptor.
10138 We expect either a NUMBER, for the dot value, or something else, which
10139 probably means we're not even close to being in a real FORMAT statement. */
10141 static ffelexHandler
10142 ffestb_R10017_ (ffelexToken t)
10144 switch (ffelex_token_type (t))
10146 case FFELEX_typeOPEN_ANGLE:
10147 ffestb_local_.format.dot.t = ffelex_token_use (t);
10148 ffelex_set_names_pure (FALSE);
10149 if (!ffesta_seen_first_exec && !ffestb_local_.format.complained)
10151 ffestb_local_.format.complained = TRUE;
10152 ffebad_start (FFEBAD_FORMAT_EXPR_SPEC);
10153 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10156 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
10157 FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100117_);
10159 case FFELEX_typeNUMBER:
10160 ffestb_local_.format.dot.present = TRUE;
10161 ffestb_local_.format.dot.rtexpr = FALSE;
10162 ffestb_local_.format.dot.t = ffelex_token_use (t);
10163 ffestb_local_.format.dot.u.unsigned_val
10164 = strtoul (ffelex_token_text (t), NULL, 10);
10165 return (ffelexHandler) ffestb_R10018_;
10168 ffelex_token_kill (ffestb_local_.format.t);
10169 if (ffestb_local_.format.pre.present)
10170 ffelex_token_kill (ffestb_local_.format.pre.t);
10171 if (ffestb_local_.format.post.present)
10172 ffelex_token_kill (ffestb_local_.format.post.t);
10173 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_DOT, t);
10174 ffestt_formatlist_kill (ffestb_local_.format.f);
10175 return (ffelexHandler) ffelex_swallow_tokens (t,
10176 (ffelexHandler) ffesta_zero);
10180 /* ffestb_R10018_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD NUMBER
10182 return ffestb_R10018_; // to lexer
10184 Expect a NAMES here, which must begin with "E" to be valid. Maybe find a
10185 NUMBER to append to the current number, in which case return to this state.
10186 Anything else, pass token on to state _10_. */
10188 static ffelexHandler
10189 ffestb_R10018_ (ffelexToken t)
10194 switch (ffelex_token_type (t))
10196 case FFELEX_typeNUMBER:
10197 assert (ffestb_local_.format.dot.present);
10198 ffesta_confirmed ();
10199 if (ffestb_local_.format.dot.rtexpr)
10201 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
10202 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10204 return (ffelexHandler) ffestb_R10018_;
10206 for (i = 0; i < ffelex_token_length (t); ++i)
10207 ffestb_local_.format.dot.u.unsigned_val *= 10;
10208 ffestb_local_.format.dot.u.unsigned_val += strtoul (ffelex_token_text (t),
10210 return (ffelexHandler) ffestb_R10018_;
10212 case FFELEX_typeNAMES:
10213 if (!ffesrc_char_match_init (*(p = ffelex_token_text (t)), 'E', 'e'))
10215 ffesta_ffebad_1t (FFEBAD_FORMAT_TEXT_IN_NUMBER, t);
10216 return (ffelexHandler) ffestb_R10018_;
10219 return (ffelexHandler) ffestb_R10019_; /* Go get NUMBER. */
10223 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, 1, NULL);
10224 return (ffelexHandler) ffestb_R10018_;
10226 ffestb_local_.format.exp.present = TRUE;
10227 ffestb_local_.format.exp.rtexpr = FALSE;
10228 ffestb_local_.format.exp.t = ffelex_token_number_from_names (t, i);
10229 ffestb_local_.format.exp.u.unsigned_val
10230 = strtoul (ffelex_token_text (ffestb_local_.format.exp.t), NULL, 10);
10231 p += ffelex_token_length (ffestb_local_.format.exp.t);
10232 i += ffelex_token_length (ffestb_local_.format.exp.t);
10234 return (ffelexHandler) ffestb_R100110_;
10235 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL);
10236 return (ffelexHandler) ffestb_R100110_;
10239 ffestb_local_.format.exp.present = FALSE;
10240 ffestb_local_.format.exp.rtexpr = FALSE;
10241 ffestb_local_.format.exp.t = NULL;
10242 ffestb_local_.format.exp.u.unsigned_val = 1;
10243 return (ffelexHandler) ffestb_R100110_ (t);
10247 /* ffestb_R10019_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD NUMBER "E"
10249 return ffestb_R10019_; // to lexer
10251 Here we've gotten the "E" following the edit descriptor.
10252 We expect either a NUMBER, for the exponent value, or something else. */
10254 static ffelexHandler
10255 ffestb_R10019_ (ffelexToken t)
10257 switch (ffelex_token_type (t))
10259 case FFELEX_typeOPEN_ANGLE:
10260 ffestb_local_.format.exp.t = ffelex_token_use (t);
10261 ffelex_set_names_pure (FALSE);
10262 if (!ffesta_seen_first_exec && !ffestb_local_.format.complained)
10264 ffestb_local_.format.complained = TRUE;
10265 ffebad_start (FFEBAD_FORMAT_EXPR_SPEC);
10266 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10269 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
10270 FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100118_);
10272 case FFELEX_typeNUMBER:
10273 ffestb_local_.format.exp.present = TRUE;
10274 ffestb_local_.format.exp.rtexpr = FALSE;
10275 ffestb_local_.format.exp.t = ffelex_token_use (t);
10276 ffestb_local_.format.exp.u.unsigned_val
10277 = strtoul (ffelex_token_text (t), NULL, 10);
10278 return (ffelexHandler) ffestb_R100110_;
10281 ffelex_token_kill (ffestb_local_.format.t);
10282 if (ffestb_local_.format.pre.present)
10283 ffelex_token_kill (ffestb_local_.format.pre.t);
10284 if (ffestb_local_.format.post.present)
10285 ffelex_token_kill (ffestb_local_.format.post.t);
10286 if (ffestb_local_.format.dot.present)
10287 ffelex_token_kill (ffestb_local_.format.dot.t);
10288 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_EXP, t);
10289 ffestt_formatlist_kill (ffestb_local_.format.f);
10290 return (ffelexHandler) ffelex_swallow_tokens (t,
10291 (ffelexHandler) ffesta_zero);
10295 /* ffestb_R100110_ -- [[+/-] NUMBER] NAMES NUMBER [PERIOD NUMBER ["E" NUMBER]]
10297 return ffestb_R100110_; // to lexer
10299 Maybe find a NUMBER to append to the current number, in which case return
10300 to this state. Anything else, handle current descriptor, then pass token
10301 on to state _10_. */
10303 static ffelexHandler
10304 ffestb_R100110_ (ffelexToken t)
10319 ffesttFormatList f;
10321 switch (ffelex_token_type (t))
10323 case FFELEX_typeNUMBER:
10324 assert (ffestb_local_.format.exp.present);
10325 ffesta_confirmed ();
10326 if (ffestb_local_.format.exp.rtexpr)
10328 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
10329 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10331 return (ffelexHandler) ffestb_R100110_;
10333 for (i = 0; i < ffelex_token_length (t); ++i)
10334 ffestb_local_.format.exp.u.unsigned_val *= 10;
10335 ffestb_local_.format.exp.u.unsigned_val += strtoul (ffelex_token_text (t),
10337 return (ffelexHandler) ffestb_R100110_;
10340 if (ffestb_local_.format.sign
10341 && (ffestb_local_.format.current != FFESTP_formattypeP)
10342 && (ffestb_local_.format.current != FFESTP_formattypeH))
10344 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
10345 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
10346 ffelex_token_where_column (ffestb_local_.format.pre.t));
10348 ffestb_local_.format.pre.u.unsigned_val
10349 = (ffestb_local_.format.pre.u.signed_val < 0)
10350 ? -ffestb_local_.format.pre.u.signed_val
10351 : ffestb_local_.format.pre.u.signed_val;
10353 switch (ffestb_local_.format.current)
10355 case FFESTP_formattypeI:
10356 err = FFEBAD_FORMAT_BAD_I_SPEC;
10364 case FFESTP_formattypeB:
10365 err = FFEBAD_FORMAT_BAD_B_SPEC;
10373 case FFESTP_formattypeO:
10374 err = FFEBAD_FORMAT_BAD_O_SPEC;
10382 case FFESTP_formattypeZ:
10383 err = FFEBAD_FORMAT_BAD_Z_SPEC;
10391 case FFESTP_formattypeF:
10392 err = FFEBAD_FORMAT_BAD_F_SPEC;
10400 case FFESTP_formattypeE:
10401 err = FFEBAD_FORMAT_BAD_E_SPEC;
10409 case FFESTP_formattypeEN:
10410 err = FFEBAD_FORMAT_BAD_EN_SPEC;
10418 case FFESTP_formattypeG:
10419 err = FFEBAD_FORMAT_BAD_G_SPEC;
10427 case FFESTP_formattypeL:
10428 err = FFEBAD_FORMAT_BAD_L_SPEC;
10436 case FFESTP_formattypeA:
10437 err = FFEBAD_FORMAT_BAD_A_SPEC;
10445 case FFESTP_formattypeD:
10446 err = FFEBAD_FORMAT_BAD_D_SPEC;
10454 case FFESTP_formattypeQ:
10455 err = FFEBAD_FORMAT_BAD_Q_SPEC;
10463 case FFESTP_formattypeDOLLAR:
10464 err = FFEBAD_FORMAT_BAD_DOLLAR_SPEC;
10472 case FFESTP_formattypeP:
10473 err = FFEBAD_FORMAT_BAD_P_SPEC;
10481 case FFESTP_formattypeT:
10482 err = FFEBAD_FORMAT_BAD_T_SPEC;
10490 case FFESTP_formattypeTL:
10491 err = FFEBAD_FORMAT_BAD_TL_SPEC;
10499 case FFESTP_formattypeTR:
10500 err = FFEBAD_FORMAT_BAD_TR_SPEC;
10508 case FFESTP_formattypeX:
10509 err = FFEBAD_FORMAT_BAD_X_SPEC;
10517 case FFESTP_formattypeS:
10518 err = FFEBAD_FORMAT_BAD_S_SPEC;
10526 case FFESTP_formattypeSP:
10527 err = FFEBAD_FORMAT_BAD_SP_SPEC;
10535 case FFESTP_formattypeSS:
10536 err = FFEBAD_FORMAT_BAD_SS_SPEC;
10544 case FFESTP_formattypeBN:
10545 err = FFEBAD_FORMAT_BAD_BN_SPEC;
10553 case FFESTP_formattypeBZ:
10554 err = FFEBAD_FORMAT_BAD_BZ_SPEC;
10562 case FFESTP_formattypeH: /* Definitely an error, make sure of
10564 err = FFEBAD_FORMAT_BAD_H_SPEC;
10565 pre = ffestb_local_.format.pre.present ? disallowed : required;
10572 case FFESTP_formattypeNone:
10573 ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_SPEC,
10574 ffestb_local_.format.t);
10576 clean_up_to_11_: /* :::::::::::::::::::: */
10578 ffelex_token_kill (ffestb_local_.format.t);
10579 if (ffestb_local_.format.pre.present)
10580 ffelex_token_kill (ffestb_local_.format.pre.t);
10581 if (ffestb_local_.format.post.present)
10582 ffelex_token_kill (ffestb_local_.format.post.t);
10583 if (ffestb_local_.format.dot.present)
10584 ffelex_token_kill (ffestb_local_.format.dot.t);
10585 if (ffestb_local_.format.exp.present)
10586 ffelex_token_kill (ffestb_local_.format.exp.t);
10587 return (ffelexHandler) ffestb_R100111_ (t);
10591 err = FFEBAD_FORMAT_BAD_H_SPEC;
10599 if (((pre == disallowed) && ffestb_local_.format.pre.present)
10600 || ((pre == required) && !ffestb_local_.format.pre.present))
10602 ffesta_ffebad_1t (err, (pre == required)
10603 ? ffestb_local_.format.t : ffestb_local_.format.pre.t);
10604 goto clean_up_to_11_; /* :::::::::::::::::::: */
10606 if (((post == disallowed) && ffestb_local_.format.post.present)
10607 || ((post == required) && !ffestb_local_.format.post.present))
10609 ffesta_ffebad_1t (err, (post == required)
10610 ? ffestb_local_.format.t : ffestb_local_.format.post.t);
10611 goto clean_up_to_11_; /* :::::::::::::::::::: */
10613 if (((dot == disallowed) && ffestb_local_.format.dot.present)
10614 || ((dot == required) && !ffestb_local_.format.dot.present))
10616 ffesta_ffebad_1t (err, (dot == required)
10617 ? ffestb_local_.format.t : ffestb_local_.format.dot.t);
10618 goto clean_up_to_11_; /* :::::::::::::::::::: */
10620 if (((exp == disallowed) && ffestb_local_.format.exp.present)
10621 || ((exp == required) && !ffestb_local_.format.exp.present))
10623 ffesta_ffebad_1t (err, (exp == required)
10624 ? ffestb_local_.format.t : ffestb_local_.format.exp.t);
10625 goto clean_up_to_11_; /* :::::::::::::::::::: */
10627 f = ffestt_formatlist_append (ffestb_local_.format.f);
10628 f->type = ffestb_local_.format.current;
10629 f->t = ffestb_local_.format.t;
10632 f->u.R1005.R1004 = ffestb_local_.format.pre;
10633 f->u.R1005.R1006 = ffestb_local_.format.post;
10634 f->u.R1005.R1007_or_R1008 = ffestb_local_.format.dot;
10635 f->u.R1005.R1009 = ffestb_local_.format.exp;
10638 /* Must be R1010. */
10640 if (pre == disallowed)
10641 f->u.R1010.val = ffestb_local_.format.post;
10643 f->u.R1010.val = ffestb_local_.format.pre;
10645 return (ffelexHandler) ffestb_R100111_ (t);
10649 /* ffestb_R100111_ -- edit-descriptor
10651 return ffestb_R100111_; // to lexer
10653 Expect a COMMA, CLOSE_PAREN, CLOSE_ARRAY, COLON, COLONCOLON, SLASH, or
10654 CONCAT, or complain about missing comma. */
10656 static ffelexHandler
10657 ffestb_R100111_ (ffelexToken t)
10659 ffesttFormatList f;
10661 switch (ffelex_token_type (t))
10663 case FFELEX_typeCOMMA:
10664 return (ffelexHandler) ffestb_R10012_;
10666 case FFELEX_typeCOLON:
10667 case FFELEX_typeCOLONCOLON:
10668 case FFELEX_typeSLASH:
10669 case FFELEX_typeCONCAT:
10670 return (ffelexHandler) ffestb_R10012_ (t);
10672 case FFELEX_typeCLOSE_PAREN:
10673 f = ffestb_local_.format.f->u.root.parent;
10675 return (ffelexHandler) ffestb_R100114_;
10676 ffestb_local_.format.f = f->next;
10677 return (ffelexHandler) ffestb_R100111_;
10679 case FFELEX_typeCLOSE_ARRAY: /* "/)". */
10680 f = ffestt_formatlist_append (ffestb_local_.format.f);
10681 f->type = FFESTP_formattypeSLASH;
10682 f->t = ffelex_token_use (t);
10683 f->u.R1010.val.present = FALSE;
10684 f->u.R1010.val.rtexpr = FALSE;
10685 f->u.R1010.val.t = NULL;
10686 f->u.R1010.val.u.unsigned_val = 1;
10687 f = ffestb_local_.format.f->u.root.parent;
10689 return (ffelexHandler) ffestb_R100114_;
10690 ffestb_local_.format.f = f->next;
10691 return (ffelexHandler) ffestb_R100111_;
10693 case FFELEX_typeOPEN_ANGLE:
10694 case FFELEX_typeDOLLAR:
10695 case FFELEX_typeNUMBER:
10696 case FFELEX_typeOPEN_PAREN:
10697 case FFELEX_typeOPEN_ARRAY:
10698 case FFELEX_typeQUOTE:
10699 case FFELEX_typeAPOSTROPHE:
10700 case FFELEX_typeNAMES:
10701 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_COMMA, t);
10702 return (ffelexHandler) ffestb_R10012_ (t);
10704 case FFELEX_typeEOS:
10705 case FFELEX_typeSEMICOLON:
10706 ffesta_confirmed ();
10707 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t);
10708 for (f = ffestb_local_.format.f;
10709 f->u.root.parent != NULL;
10710 f = f->u.root.parent->next)
10712 ffestb_local_.format.f = f;
10713 return (ffelexHandler) ffestb_R100114_ (t);
10716 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10717 ffestt_formatlist_kill (ffestb_local_.format.f);
10718 return (ffelexHandler) ffelex_swallow_tokens (t,
10719 (ffelexHandler) ffesta_zero);
10723 /* ffestb_R100112_ -- COLON, COLONCOLON, SLASH, OPEN_ARRAY, or CONCAT
10725 return ffestb_R100112_; // to lexer
10727 Like _11_ except the COMMA is optional. */
10729 static ffelexHandler
10730 ffestb_R100112_ (ffelexToken t)
10732 ffesttFormatList f;
10734 switch (ffelex_token_type (t))
10736 case FFELEX_typeCOMMA:
10737 return (ffelexHandler) ffestb_R10012_;
10739 case FFELEX_typeCOLON:
10740 case FFELEX_typeCOLONCOLON:
10741 case FFELEX_typeSLASH:
10742 case FFELEX_typeCONCAT:
10743 case FFELEX_typeOPEN_ANGLE:
10744 case FFELEX_typeNAMES:
10745 case FFELEX_typeDOLLAR:
10746 case FFELEX_typeNUMBER:
10747 case FFELEX_typeOPEN_PAREN:
10748 case FFELEX_typeOPEN_ARRAY:
10749 case FFELEX_typeQUOTE:
10750 case FFELEX_typeAPOSTROPHE:
10751 case FFELEX_typePLUS:
10752 case FFELEX_typeMINUS:
10753 return (ffelexHandler) ffestb_R10012_ (t);
10755 case FFELEX_typeCLOSE_PAREN:
10756 f = ffestb_local_.format.f->u.root.parent;
10758 return (ffelexHandler) ffestb_R100114_;
10759 ffestb_local_.format.f = f->next;
10760 return (ffelexHandler) ffestb_R100111_;
10762 case FFELEX_typeCLOSE_ARRAY: /* "/)". */
10763 f = ffestt_formatlist_append (ffestb_local_.format.f);
10764 f->type = FFESTP_formattypeSLASH;
10765 f->t = ffelex_token_use (t);
10766 f->u.R1010.val.present = FALSE;
10767 f->u.R1010.val.rtexpr = FALSE;
10768 f->u.R1010.val.t = NULL;
10769 f->u.R1010.val.u.unsigned_val = 1;
10770 f = ffestb_local_.format.f->u.root.parent;
10772 return (ffelexHandler) ffestb_R100114_;
10773 ffestb_local_.format.f = f->next;
10774 return (ffelexHandler) ffestb_R100111_;
10776 case FFELEX_typeEOS:
10777 case FFELEX_typeSEMICOLON:
10778 ffesta_confirmed ();
10779 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t);
10780 for (f = ffestb_local_.format.f;
10781 f->u.root.parent != NULL;
10782 f = f->u.root.parent->next)
10784 ffestb_local_.format.f = f;
10785 return (ffelexHandler) ffestb_R100114_ (t);
10788 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10789 ffestt_formatlist_kill (ffestb_local_.format.f);
10790 return (ffelexHandler) ffelex_swallow_tokens (t,
10791 (ffelexHandler) ffesta_zero);
10795 /* ffestb_R100113_ -- Handle CHARACTER token.
10797 return ffestb_R100113_; // to lexer
10799 Append the format item to the list, go to _11_. */
10801 static ffelexHandler
10802 ffestb_R100113_ (ffelexToken t)
10804 ffesttFormatList f;
10806 assert (ffelex_token_type (t) == FFELEX_typeCHARACTER);
10808 if (ffe_is_pedantic_not_90 () && (ffelex_token_length (t) == 0))
10810 ffebad_start (FFEBAD_NULL_CHAR_CONST);
10811 ffebad_here (0, ffelex_token_where_line (t),
10812 ffelex_token_where_column (t));
10816 f = ffestt_formatlist_append (ffestb_local_.format.f);
10817 f->type = FFESTP_formattypeR1016;
10818 f->t = ffelex_token_use (t);
10819 return (ffelexHandler) ffestb_R100111_;
10822 /* ffestb_R100114_ -- "FORMAT" OPEN_PAREN format-item-list CLOSE_PAREN
10824 return ffestb_R100114_; // to lexer
10826 Handle EOS/SEMICOLON or something else. */
10828 static ffelexHandler
10829 ffestb_R100114_ (ffelexToken t)
10831 ffelex_set_names_pure (FALSE);
10833 switch (ffelex_token_type (t))
10835 case FFELEX_typeEOS:
10836 case FFELEX_typeSEMICOLON:
10837 ffesta_confirmed ();
10838 if (!ffesta_is_inhibited () && !ffestb_local_.format.complained)
10839 ffestc_R1001 (ffestb_local_.format.f);
10840 ffestt_formatlist_kill (ffestb_local_.format.f);
10841 return (ffelexHandler) ffesta_zero (t);
10844 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10845 ffestt_formatlist_kill (ffestb_local_.format.f);
10846 return (ffelexHandler) ffelex_swallow_tokens (t,
10847 (ffelexHandler) ffesta_zero);
10851 /* ffestb_R100115_ -- OPEN_ANGLE expr
10853 (ffestb_R100115_) // to expression handler
10855 Handle expression prior to the edit descriptor. */
10857 static ffelexHandler
10858 ffestb_R100115_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
10860 switch (ffelex_token_type (t))
10862 case FFELEX_typeCLOSE_ANGLE:
10863 ffestb_local_.format.pre.present = TRUE;
10864 ffestb_local_.format.pre.rtexpr = TRUE;
10865 ffestb_local_.format.pre.u.expr = expr;
10866 ffelex_set_names_pure (TRUE);
10867 return (ffelexHandler) ffestb_R10014_;
10870 ffelex_token_kill (ffestb_local_.format.pre.t);
10871 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10872 ffestt_formatlist_kill (ffestb_local_.format.f);
10873 return (ffelexHandler) ffelex_swallow_tokens (t,
10874 (ffelexHandler) ffesta_zero);
10878 /* ffestb_R100116_ -- "[n]X" OPEN_ANGLE expr
10880 (ffestb_R100116_) // to expression handler
10882 Handle expression after the edit descriptor. */
10884 static ffelexHandler
10885 ffestb_R100116_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
10887 switch (ffelex_token_type (t))
10889 case FFELEX_typeCLOSE_ANGLE:
10890 ffestb_local_.format.post.present = TRUE;
10891 ffestb_local_.format.post.rtexpr = TRUE;
10892 ffestb_local_.format.post.u.expr = expr;
10893 ffelex_set_names_pure (TRUE);
10894 return (ffelexHandler) ffestb_R10016_;
10897 ffelex_token_kill (ffestb_local_.format.t);
10898 ffelex_token_kill (ffestb_local_.format.post.t);
10899 if (ffestb_local_.format.pre.present)
10900 ffelex_token_kill (ffestb_local_.format.pre.t);
10901 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10902 ffestt_formatlist_kill (ffestb_local_.format.f);
10903 return (ffelexHandler) ffelex_swallow_tokens (t,
10904 (ffelexHandler) ffesta_zero);
10908 /* ffestb_R100117_ -- "[n]X[n]." OPEN_ANGLE expr
10910 (ffestb_R100117_) // to expression handler
10912 Handle expression after the PERIOD. */
10914 static ffelexHandler
10915 ffestb_R100117_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
10917 switch (ffelex_token_type (t))
10919 case FFELEX_typeCLOSE_ANGLE:
10920 ffestb_local_.format.dot.present = TRUE;
10921 ffestb_local_.format.dot.rtexpr = TRUE;
10922 ffestb_local_.format.dot.u.expr = expr;
10923 ffelex_set_names_pure (TRUE);
10924 return (ffelexHandler) ffestb_R10018_;
10927 ffelex_token_kill (ffestb_local_.format.t);
10928 ffelex_token_kill (ffestb_local_.format.dot.t);
10929 if (ffestb_local_.format.pre.present)
10930 ffelex_token_kill (ffestb_local_.format.pre.t);
10931 if (ffestb_local_.format.post.present)
10932 ffelex_token_kill (ffestb_local_.format.post.t);
10933 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10934 ffestt_formatlist_kill (ffestb_local_.format.f);
10935 return (ffelexHandler) ffelex_swallow_tokens (t,
10936 (ffelexHandler) ffesta_zero);
10940 /* ffestb_R100118_ -- "[n]X[n].[n]E" OPEN_ANGLE expr
10942 (ffestb_R100118_) // to expression handler
10944 Handle expression after the "E". */
10946 static ffelexHandler
10947 ffestb_R100118_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
10949 switch (ffelex_token_type (t))
10951 case FFELEX_typeCLOSE_ANGLE:
10952 ffestb_local_.format.exp.present = TRUE;
10953 ffestb_local_.format.exp.rtexpr = TRUE;
10954 ffestb_local_.format.exp.u.expr = expr;
10955 ffelex_set_names_pure (TRUE);
10956 return (ffelexHandler) ffestb_R100110_;
10959 ffelex_token_kill (ffestb_local_.format.t);
10960 ffelex_token_kill (ffestb_local_.format.exp.t);
10961 if (ffestb_local_.format.pre.present)
10962 ffelex_token_kill (ffestb_local_.format.pre.t);
10963 if (ffestb_local_.format.post.present)
10964 ffelex_token_kill (ffestb_local_.format.post.t);
10965 if (ffestb_local_.format.dot.present)
10966 ffelex_token_kill (ffestb_local_.format.dot.t);
10967 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10968 ffestt_formatlist_kill (ffestb_local_.format.f);
10969 return (ffelexHandler) ffelex_swallow_tokens (t,
10970 (ffelexHandler) ffesta_zero);
10974 /* ffestb_R1107 -- Parse the USE statement
10976 return ffestb_R1107; // to lexer
10978 Make sure the statement has a valid form for the USE statement.
10979 If it does, implement the statement. */
10983 ffestb_R1107 (ffelexToken t)
10988 switch (ffelex_token_type (ffesta_tokens[0]))
10990 case FFELEX_typeNAME:
10991 if (ffesta_first_kw != FFESTR_firstUSE)
10992 goto bad_0; /* :::::::::::::::::::: */
10993 switch (ffelex_token_type (t))
10995 case FFELEX_typeNAME:
10998 case FFELEX_typeEOS:
10999 case FFELEX_typeSEMICOLON:
11000 case FFELEX_typeCOMMA:
11001 case FFELEX_typeCOLONCOLON:
11002 ffesta_confirmed (); /* Error, but clearly intended. */
11003 goto bad_1; /* :::::::::::::::::::: */
11006 goto bad_0; /* :::::::::::::::::::: */
11008 ffesta_confirmed ();
11009 ffesta_tokens[1] = ffelex_token_use (t);
11010 return (ffelexHandler) ffestb_R11071_;
11012 case FFELEX_typeNAMES:
11013 if (ffesta_first_kw != FFESTR_firstUSE)
11014 goto bad_0; /* :::::::::::::::::::: */
11015 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlUSE);
11016 if (!ffesrc_is_name_init (*p))
11017 goto bad_i; /* :::::::::::::::::::: */
11018 switch (ffelex_token_type (t))
11020 case FFELEX_typeCOLONCOLON:
11021 ffesta_confirmed (); /* Error, but clearly intended. */
11022 goto bad_1; /* :::::::::::::::::::: */
11025 goto bad_1; /* :::::::::::::::::::: */
11027 case FFELEX_typeCOMMA:
11028 case FFELEX_typeEOS:
11029 case FFELEX_typeSEMICOLON:
11032 ffesta_confirmed ();
11034 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
11035 return (ffelexHandler) ffestb_R11071_ (t);
11038 goto bad_0; /* :::::::::::::::::::: */
11041 bad_0: /* :::::::::::::::::::: */
11042 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", ffesta_tokens[0]);
11043 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11045 bad_1: /* :::::::::::::::::::: */
11046 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11047 return (ffelexHandler) ffelex_swallow_tokens (t,
11048 (ffelexHandler) ffesta_zero); /* Invalid second token. */
11050 bad_i: /* :::::::::::::::::::: */
11051 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "USE", ffesta_tokens[0], i, t);
11052 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11055 /* ffestb_R11071_ -- "USE" NAME
11057 return ffestb_R11071_; // to lexer
11059 Make sure the statement has a valid form for the USE statement. If it
11060 does, implement the statement. */
11062 static ffelexHandler
11063 ffestb_R11071_ (ffelexToken t)
11065 switch (ffelex_token_type (t))
11067 case FFELEX_typeEOS:
11068 case FFELEX_typeSEMICOLON:
11069 if (!ffesta_is_inhibited ())
11071 ffestc_R1107_start (ffesta_tokens[1], FALSE);
11072 ffestc_R1107_finish ();
11074 ffelex_token_kill (ffesta_tokens[1]);
11075 return (ffelexHandler) ffesta_zero (t);
11077 case FFELEX_typeCOMMA:
11078 return (ffelexHandler) ffestb_R11072_;
11084 ffelex_token_kill (ffesta_tokens[1]);
11085 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11086 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11089 /* ffestb_R11072_ -- "USE" NAME COMMA
11091 return ffestb_R11072_; // to lexer
11093 Make sure the statement has a valid form for the USE statement. If it
11094 does, implement the statement. */
11096 static ffelexHandler
11097 ffestb_R11072_ (ffelexToken t)
11099 switch (ffelex_token_type (t))
11101 case FFELEX_typeNAME:
11102 ffesta_tokens[2] = ffelex_token_use (t);
11103 return (ffelexHandler) ffestb_R11073_;
11109 ffelex_token_kill (ffesta_tokens[1]);
11110 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11111 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11114 /* ffestb_R11073_ -- "USE" NAME COMMA NAME
11116 return ffestb_R11073_; // to lexer
11118 Make sure the statement has a valid form for the USE statement. If it
11119 does, implement the statement. */
11121 static ffelexHandler
11122 ffestb_R11073_ (ffelexToken t)
11124 switch (ffelex_token_type (t))
11126 case FFELEX_typeCOLON:
11127 if (ffestr_other (ffesta_tokens[2]) != FFESTR_otherONLY)
11129 if (!ffesta_is_inhibited ())
11130 ffestc_R1107_start (ffesta_tokens[1], TRUE);
11131 ffelex_token_kill (ffesta_tokens[1]);
11132 ffelex_token_kill (ffesta_tokens[2]);
11133 return (ffelexHandler) ffestb_R11074_;
11135 case FFELEX_typePOINTS:
11136 if (!ffesta_is_inhibited ())
11137 ffestc_R1107_start (ffesta_tokens[1], FALSE);
11138 ffelex_token_kill (ffesta_tokens[1]);
11139 ffesta_tokens[1] = ffesta_tokens[2];
11140 return (ffelexHandler) ffestb_R110711_;
11146 ffelex_token_kill (ffesta_tokens[1]);
11147 ffelex_token_kill (ffesta_tokens[2]);
11148 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11149 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11152 /* ffestb_R11074_ -- "USE" NAME COMMA "ONLY" COLON
11154 return ffestb_R11074_; // to lexer
11156 Make sure the statement has a valid form for the USE statement. If it
11157 does, implement the statement. */
11159 static ffelexHandler
11160 ffestb_R11074_ (ffelexToken t)
11162 switch (ffelex_token_type (t))
11164 case FFELEX_typeNAME:
11165 ffesta_tokens[1] = ffelex_token_use (t);
11166 return (ffelexHandler) ffestb_R11075_;
11168 case FFELEX_typeEOS:
11169 case FFELEX_typeSEMICOLON:
11170 if (!ffesta_is_inhibited ())
11171 ffestc_R1107_finish ();
11172 return (ffelexHandler) ffesta_zero (t);
11178 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11179 ffestc_R1107_finish ();
11180 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11183 /* ffestb_R11075_ -- "USE" NAME COMMA "ONLY" COLON NAME
11185 return ffestb_R11075_; // to lexer
11187 Make sure the statement has a valid form for the USE statement. If it
11188 does, implement the statement. */
11190 static ffelexHandler
11191 ffestb_R11075_ (ffelexToken t)
11193 switch (ffelex_token_type (t))
11195 case FFELEX_typeEOS:
11196 case FFELEX_typeSEMICOLON:
11197 if (!ffesta_is_inhibited ())
11199 ffestc_R1107_item (NULL, ffesta_tokens[1]);
11200 ffestc_R1107_finish ();
11202 ffelex_token_kill (ffesta_tokens[1]);
11203 return (ffelexHandler) ffesta_zero (t);
11205 case FFELEX_typeCOMMA:
11206 if (!ffesta_is_inhibited ())
11207 ffestc_R1107_item (NULL, ffesta_tokens[1]);
11208 ffelex_token_kill (ffesta_tokens[1]);
11209 return (ffelexHandler) ffestb_R11078_;
11211 case FFELEX_typePOINTS:
11212 return (ffelexHandler) ffestb_R11076_;
11218 ffelex_token_kill (ffesta_tokens[1]);
11219 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11220 ffestc_R1107_finish ();
11221 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11224 /* ffestb_R11076_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS
11226 return ffestb_R11076_; // to lexer
11228 Make sure the statement has a valid form for the USE statement. If it
11229 does, implement the statement. */
11231 static ffelexHandler
11232 ffestb_R11076_ (ffelexToken t)
11234 switch (ffelex_token_type (t))
11236 case FFELEX_typeNAME:
11237 if (!ffesta_is_inhibited ())
11238 ffestc_R1107_item (ffesta_tokens[1], t);
11239 ffelex_token_kill (ffesta_tokens[1]);
11240 return (ffelexHandler) ffestb_R11077_;
11246 ffelex_token_kill (ffesta_tokens[1]);
11247 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11248 ffestc_R1107_finish ();
11249 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11252 /* ffestb_R11077_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS NAME
11254 return ffestb_R11077_; // to lexer
11256 Make sure the statement has a valid form for the USE statement. If it
11257 does, implement the statement. */
11259 static ffelexHandler
11260 ffestb_R11077_ (ffelexToken t)
11262 switch (ffelex_token_type (t))
11264 case FFELEX_typeEOS:
11265 case FFELEX_typeSEMICOLON:
11266 if (!ffesta_is_inhibited ())
11267 ffestc_R1107_finish ();
11268 return (ffelexHandler) ffesta_zero (t);
11270 case FFELEX_typeCOMMA:
11271 return (ffelexHandler) ffestb_R11078_;
11277 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11278 ffestc_R1107_finish ();
11279 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11282 /* ffestb_R11078_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS NAME COMMA
11284 return ffestb_R11078_; // to lexer
11286 Make sure the statement has a valid form for the USE statement. If it
11287 does, implement the statement. */
11289 static ffelexHandler
11290 ffestb_R11078_ (ffelexToken t)
11292 switch (ffelex_token_type (t))
11294 case FFELEX_typeNAME:
11295 ffesta_tokens[1] = ffelex_token_use (t);
11296 return (ffelexHandler) ffestb_R11075_;
11302 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11303 ffestc_R1107_finish ();
11304 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11307 /* ffestb_R11079_ -- "USE" NAME COMMA
11309 return ffestb_R11079_; // to lexer
11311 Make sure the statement has a valid form for the USE statement. If it
11312 does, implement the statement. */
11314 static ffelexHandler
11315 ffestb_R11079_ (ffelexToken t)
11317 switch (ffelex_token_type (t))
11319 case FFELEX_typeNAME:
11320 ffesta_tokens[1] = ffelex_token_use (t);
11321 return (ffelexHandler) ffestb_R110710_;
11327 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11328 ffestc_R1107_finish ();
11329 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11332 /* ffestb_R110710_ -- "USE" NAME COMMA NAME
11334 return ffestb_R110710_; // to lexer
11336 Make sure the statement has a valid form for the USE statement. If it
11337 does, implement the statement. */
11339 static ffelexHandler
11340 ffestb_R110710_ (ffelexToken t)
11342 switch (ffelex_token_type (t))
11344 case FFELEX_typePOINTS:
11345 return (ffelexHandler) ffestb_R110711_;
11351 ffelex_token_kill (ffesta_tokens[1]);
11352 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11353 ffestc_R1107_finish ();
11354 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11357 /* ffestb_R110711_ -- "USE" NAME COMMA NAME POINTS
11359 return ffestb_R110711_; // to lexer
11361 Make sure the statement has a valid form for the USE statement. If it
11362 does, implement the statement. */
11364 static ffelexHandler
11365 ffestb_R110711_ (ffelexToken t)
11367 switch (ffelex_token_type (t))
11369 case FFELEX_typeNAME:
11370 if (!ffesta_is_inhibited ())
11371 ffestc_R1107_item (ffesta_tokens[1], t);
11372 ffelex_token_kill (ffesta_tokens[1]);
11373 return (ffelexHandler) ffestb_R110712_;
11379 ffelex_token_kill (ffesta_tokens[1]);
11380 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11381 ffestc_R1107_finish ();
11382 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11385 /* ffestb_R110712_ -- "USE" NAME COMMA NAME POINTS NAME
11387 return ffestb_R110712_; // to lexer
11389 Make sure the statement has a valid form for the USE statement. If it
11390 does, implement the statement. */
11392 static ffelexHandler
11393 ffestb_R110712_ (ffelexToken t)
11395 switch (ffelex_token_type (t))
11397 case FFELEX_typeEOS:
11398 case FFELEX_typeSEMICOLON:
11399 if (!ffesta_is_inhibited ())
11400 ffestc_R1107_finish ();
11401 return (ffelexHandler) ffesta_zero (t);
11403 case FFELEX_typeCOMMA:
11404 return (ffelexHandler) ffestb_R11079_;
11410 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11411 ffestc_R1107_finish ();
11412 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11416 /* ffestb_R1202 -- Parse the INTERFACE statement
11418 return ffestb_R1202; // to lexer
11420 Make sure the statement has a valid form for the INTERFACE statement.
11421 If it does, implement the statement.
11424 Allow INTERFACE by itself; missed this
11425 valid form when originally doing syntactic analysis code. */
11429 ffestb_R1202 (ffelexToken t)
11434 switch (ffelex_token_type (ffesta_tokens[0]))
11436 case FFELEX_typeNAME:
11437 if (ffesta_first_kw != FFESTR_firstINTERFACE)
11438 goto bad_0; /* :::::::::::::::::::: */
11439 switch (ffelex_token_type (t))
11441 case FFELEX_typeNAME:
11444 case FFELEX_typeEOS:
11445 case FFELEX_typeSEMICOLON:
11446 ffesta_confirmed ();
11447 if (!ffesta_is_inhibited ())
11448 ffestc_R1202 (FFESTP_definedoperatorNone, NULL);
11449 return (ffelexHandler) ffesta_zero (t);
11451 case FFELEX_typeCOMMA:
11452 case FFELEX_typeCOLONCOLON:
11453 ffesta_confirmed (); /* Error, but clearly intended. */
11454 goto bad_1; /* :::::::::::::::::::: */
11457 goto bad_1; /* :::::::::::::::::::: */
11460 ffesta_confirmed ();
11461 switch (ffesta_second_kw)
11463 case FFESTR_secondOPERATOR:
11464 ffestb_local_.interface.operator = FFESTP_definedoperatorOPERATOR;
11467 case FFESTR_secondASSIGNMENT:
11468 ffestb_local_.interface.operator = FFESTP_definedoperatorASSIGNMENT;
11472 ffestb_local_.interface.operator = FFESTP_definedoperatorNone;
11475 ffesta_tokens[1] = ffelex_token_use (t);
11476 return (ffelexHandler) ffestb_R12021_;
11478 case FFELEX_typeNAMES:
11479 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlINTERFACE);
11480 switch (ffesta_first_kw)
11482 case FFESTR_firstINTERFACEOPERATOR:
11483 if (*(ffelex_token_text (ffesta_tokens[0])
11484 + FFESTR_firstlINTERFACEOPERATOR) == '\0')
11485 ffestb_local_.interface.operator
11486 = FFESTP_definedoperatorOPERATOR;
11489 case FFESTR_firstINTERFACEASSGNMNT:
11490 if (*(ffelex_token_text (ffesta_tokens[0])
11491 + FFESTR_firstlINTERFACEASSGNMNT) == '\0')
11492 ffestb_local_.interface.operator
11493 = FFESTP_definedoperatorASSIGNMENT;
11496 case FFESTR_firstINTERFACE:
11497 ffestb_local_.interface.operator = FFESTP_definedoperatorNone;
11501 goto bad_0; /* :::::::::::::::::::: */
11503 switch (ffelex_token_type (t))
11505 case FFELEX_typeCOMMA:
11506 case FFELEX_typeCOLONCOLON:
11507 ffesta_confirmed (); /* Error, but clearly intended. */
11508 goto bad_1; /* :::::::::::::::::::: */
11511 goto bad_1; /* :::::::::::::::::::: */
11513 case FFELEX_typeOPEN_PAREN:
11514 case FFELEX_typeOPEN_ARRAY: /* Sigh. */
11517 case FFELEX_typeEOS:
11518 case FFELEX_typeSEMICOLON:
11519 ffesta_confirmed ();
11522 if (!ffesta_is_inhibited ())
11523 ffestc_R1202 (FFESTP_definedoperatorNone, NULL);
11524 return (ffelexHandler) ffesta_zero (t);
11528 if (!ffesrc_is_name_init (*p))
11529 goto bad_i; /* :::::::::::::::::::: */
11530 ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
11531 return (ffelexHandler) ffestb_R12021_ (t);
11534 goto bad_0; /* :::::::::::::::::::: */
11537 bad_0: /* :::::::::::::::::::: */
11538 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", ffesta_tokens[0]);
11539 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11541 bad_1: /* :::::::::::::::::::: */
11542 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11543 return (ffelexHandler) ffelex_swallow_tokens (t,
11544 (ffelexHandler) ffesta_zero); /* Invalid second token. */
11546 bad_i: /* :::::::::::::::::::: */
11547 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "INTERFACE", ffesta_tokens[0], i, t);
11548 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11551 /* ffestb_R12021_ -- "INTERFACE" NAME
11553 return ffestb_R12021_; // to lexer
11555 Make sure the statement has a valid form for the INTERFACE statement. If
11556 it does, implement the statement. */
11558 static ffelexHandler
11559 ffestb_R12021_ (ffelexToken t)
11561 ffestb_local_.interface.slash = TRUE; /* Slash follows open paren. */
11563 switch (ffelex_token_type (t))
11565 case FFELEX_typeEOS:
11566 case FFELEX_typeSEMICOLON:
11567 if (!ffesta_is_inhibited ())
11568 ffestc_R1202 (FFESTP_definedoperatorNone, ffesta_tokens[1]);
11569 ffelex_token_kill (ffesta_tokens[1]);
11570 return (ffelexHandler) ffesta_zero (t);
11572 case FFELEX_typeOPEN_PAREN:
11573 ffestb_local_.interface.slash = FALSE; /* Slash doesn't follow. */
11574 /* Fall through. */
11575 case FFELEX_typeOPEN_ARRAY:
11576 switch (ffestb_local_.interface.operator)
11578 case FFESTP_definedoperatorNone:
11581 case FFESTP_definedoperatorOPERATOR:
11582 ffestb_local_.interface.assignment = FALSE;
11583 return (ffelexHandler) ffestb_R12022_;
11585 case FFESTP_definedoperatorASSIGNMENT:
11586 ffestb_local_.interface.assignment = TRUE;
11587 return (ffelexHandler) ffestb_R12022_;
11594 case FFELEX_typeCOMMA:
11595 case FFELEX_typeCOLONCOLON:
11596 ffesta_confirmed (); /* Error, but clearly intended. */
11603 ffelex_token_kill (ffesta_tokens[1]);
11604 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11605 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11608 /* ffestb_R12022_ -- "INTERFACE" "OPERATOR/ASSIGNMENT" OPEN_PAREN
11610 return ffestb_R12022_; // to lexer
11612 Make sure the statement has a valid form for the INTERFACE statement. If
11613 it does, implement the statement. */
11615 static ffelexHandler
11616 ffestb_R12022_ (ffelexToken t)
11618 ffesta_tokens[2] = ffelex_token_use (t);
11620 switch (ffelex_token_type (t))
11622 case FFELEX_typePERIOD:
11623 if (ffestb_local_.interface.slash)
11625 return (ffelexHandler) ffestb_R12023_;
11627 case FFELEX_typePOWER:
11628 if (ffestb_local_.interface.slash)
11630 ffestb_local_.interface.operator = FFESTP_definedoperatorPOWER;
11631 return (ffelexHandler) ffestb_R12025_;
11633 case FFELEX_typeASTERISK:
11634 if (ffestb_local_.interface.slash)
11636 ffestb_local_.interface.operator = FFESTP_definedoperatorMULT;
11637 return (ffelexHandler) ffestb_R12025_;
11639 case FFELEX_typePLUS:
11640 if (ffestb_local_.interface.slash)
11642 ffestb_local_.interface.operator = FFESTP_definedoperatorADD;
11643 return (ffelexHandler) ffestb_R12025_;
11645 case FFELEX_typeCONCAT:
11646 if (ffestb_local_.interface.slash)
11648 ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT;
11649 return (ffelexHandler) ffestb_R12025_;
11651 case FFELEX_typeSLASH:
11652 if (ffestb_local_.interface.slash)
11654 ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT;
11655 return (ffelexHandler) ffestb_R12025_;
11657 ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE;
11658 return (ffelexHandler) ffestb_R12025_;
11660 case FFELEX_typeMINUS:
11661 if (ffestb_local_.interface.slash)
11663 ffestb_local_.interface.operator = FFESTP_definedoperatorSUBTRACT;
11664 return (ffelexHandler) ffestb_R12025_;
11666 case FFELEX_typeREL_EQ:
11667 if (ffestb_local_.interface.slash)
11669 ffestb_local_.interface.operator = FFESTP_definedoperatorEQ;
11670 return (ffelexHandler) ffestb_R12025_;
11672 case FFELEX_typeREL_NE:
11673 if (ffestb_local_.interface.slash)
11675 ffestb_local_.interface.operator = FFESTP_definedoperatorNE;
11676 return (ffelexHandler) ffestb_R12025_;
11678 case FFELEX_typeOPEN_ANGLE:
11679 if (ffestb_local_.interface.slash)
11681 ffestb_local_.interface.operator = FFESTP_definedoperatorLT;
11682 return (ffelexHandler) ffestb_R12025_;
11684 case FFELEX_typeREL_LE:
11685 if (ffestb_local_.interface.slash)
11687 ffestb_local_.interface.operator = FFESTP_definedoperatorLE;
11688 return (ffelexHandler) ffestb_R12025_;
11690 case FFELEX_typeCLOSE_ANGLE:
11691 if (ffestb_local_.interface.slash)
11693 ffestb_local_.interface.operator = FFESTP_definedoperatorGT;
11694 return (ffelexHandler) ffestb_R12025_;
11696 case FFELEX_typeREL_GE:
11697 if (ffestb_local_.interface.slash)
11699 ffestb_local_.interface.operator = FFESTP_definedoperatorGE;
11700 return (ffelexHandler) ffestb_R12025_;
11702 case FFELEX_typeEQUALS:
11703 if (ffestb_local_.interface.slash)
11705 ffestb_local_.interface.operator = FFESTP_definedoperatorNE;
11706 return (ffelexHandler) ffestb_R12025_;
11708 ffestb_local_.interface.operator = FFESTP_definedoperatorASSIGNMENT;
11709 return (ffelexHandler) ffestb_R12025_;
11711 case FFELEX_typeCLOSE_ARRAY:
11712 if (!ffestb_local_.interface.slash)
11714 ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE;
11715 return (ffelexHandler) ffestb_R12026_;
11717 ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT;
11718 return (ffelexHandler) ffestb_R12026_;
11720 case FFELEX_typeCLOSE_PAREN:
11721 if (!ffestb_local_.interface.slash)
11723 ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE;
11724 return (ffelexHandler) ffestb_R12026_;
11730 ffelex_token_kill (ffesta_tokens[1]);
11731 ffelex_token_kill (ffesta_tokens[2]);
11732 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11733 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11736 /* ffestb_R12023_ -- "INTERFACE" NAME OPEN_PAREN PERIOD
11738 return ffestb_R12023_; // to lexer
11740 Make sure the statement has a valid form for the INTERFACE statement. If
11741 it does, implement the statement. */
11743 static ffelexHandler
11744 ffestb_R12023_ (ffelexToken t)
11746 switch (ffelex_token_type (t))
11748 case FFELEX_typeNAME:
11749 ffelex_token_kill (ffesta_tokens[2]);
11750 ffesta_tokens[2] = ffelex_token_use (t);
11751 return (ffelexHandler) ffestb_R12024_;
11757 ffelex_token_kill (ffesta_tokens[1]);
11758 ffelex_token_kill (ffesta_tokens[2]);
11759 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11760 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11763 /* ffestb_R12024_ -- "INTERFACE" NAME OPEN_PAREN PERIOD NAME
11765 return ffestb_R12024_; // to lexer
11767 Make sure the statement has a valid form for the INTERFACE statement. If
11768 it does, implement the statement. */
11770 static ffelexHandler
11771 ffestb_R12024_ (ffelexToken t)
11773 switch (ffelex_token_type (t))
11775 case FFELEX_typePERIOD:
11776 return (ffelexHandler) ffestb_R12025_;
11782 ffelex_token_kill (ffesta_tokens[1]);
11783 ffelex_token_kill (ffesta_tokens[2]);
11784 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11785 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11788 /* ffestb_R12025_ -- "INTERFACE" NAME OPEN_PAREN operator
11790 return ffestb_R12025_; // to lexer
11792 Make sure the statement has a valid form for the INTERFACE statement. If
11793 it does, implement the statement. */
11795 static ffelexHandler
11796 ffestb_R12025_ (ffelexToken t)
11798 switch (ffelex_token_type (t))
11800 case FFELEX_typeCLOSE_PAREN:
11801 return (ffelexHandler) ffestb_R12026_;
11807 ffelex_token_kill (ffesta_tokens[1]);
11808 ffelex_token_kill (ffesta_tokens[2]);
11809 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11810 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11813 /* ffestb_R12026_ -- "INTERFACE" NAME OPEN_PAREN operator CLOSE_PAREN
11815 return ffestb_R12026_; // to lexer
11817 Make sure the statement has a valid form for the INTERFACE statement. If
11818 it does, implement the statement. */
11820 static ffelexHandler
11821 ffestb_R12026_ (ffelexToken t)
11825 switch (ffelex_token_type (t))
11827 case FFELEX_typeEOS:
11828 case FFELEX_typeSEMICOLON:
11829 ffesta_confirmed ();
11830 if (ffestb_local_.interface.assignment
11831 && (ffestb_local_.interface.operator
11832 != FFESTP_definedoperatorASSIGNMENT))
11834 ffebad_start (FFEBAD_INTERFACE_ASSIGNMENT);
11835 ffebad_here (0, ffelex_token_where_line (ffesta_tokens[1]),
11836 ffelex_token_where_column (ffesta_tokens[1]));
11837 ffebad_here (1, ffelex_token_where_line (ffesta_tokens[2]),
11838 ffelex_token_where_column (ffesta_tokens[2]));
11841 switch (ffelex_token_type (ffesta_tokens[2]))
11843 case FFELEX_typeNAME:
11844 switch (ffestr_other (ffesta_tokens[2]))
11846 case FFESTR_otherNOT:
11847 if (!ffesta_is_inhibited ())
11848 ffestc_R1202 (FFESTP_definedoperatorNOT, NULL);
11851 case FFESTR_otherAND:
11852 if (!ffesta_is_inhibited ())
11853 ffestc_R1202 (FFESTP_definedoperatorAND, NULL);
11856 case FFESTR_otherOR:
11857 if (!ffesta_is_inhibited ())
11858 ffestc_R1202 (FFESTP_definedoperatorOR, NULL);
11861 case FFESTR_otherEQV:
11862 if (!ffesta_is_inhibited ())
11863 ffestc_R1202 (FFESTP_definedoperatorEQV, NULL);
11866 case FFESTR_otherNEQV:
11867 if (!ffesta_is_inhibited ())
11868 ffestc_R1202 (FFESTP_definedoperatorNEQV, NULL);
11871 case FFESTR_otherEQ:
11872 if (!ffesta_is_inhibited ())
11873 ffestc_R1202 (FFESTP_definedoperatorEQ, NULL);
11876 case FFESTR_otherNE:
11877 if (!ffesta_is_inhibited ())
11878 ffestc_R1202 (FFESTP_definedoperatorNE, NULL);
11881 case FFESTR_otherLT:
11882 if (!ffesta_is_inhibited ())
11883 ffestc_R1202 (FFESTP_definedoperatorLT, NULL);
11886 case FFESTR_otherLE:
11887 if (!ffesta_is_inhibited ())
11888 ffestc_R1202 (FFESTP_definedoperatorLE, NULL);
11891 case FFESTR_otherGT:
11892 if (!ffesta_is_inhibited ())
11893 ffestc_R1202 (FFESTP_definedoperatorGT, NULL);
11896 case FFESTR_otherGE:
11897 if (!ffesta_is_inhibited ())
11898 ffestc_R1202 (FFESTP_definedoperatorGE, NULL);
11902 for (p = ffelex_token_text (ffesta_tokens[2]); *p != '\0'; ++p)
11906 ffelex_token_kill (ffesta_tokens[1]);
11907 ffelex_token_kill (ffesta_tokens[2]);
11908 ffesta_ffebad_1t (FFEBAD_INTERFACE_NONLETTER,
11910 return (ffelexHandler) ffelex_swallow_tokens (t,
11911 (ffelexHandler) ffesta_zero);
11914 if (!ffesta_is_inhibited ())
11915 ffestc_R1202 (FFESTP_definedoperatorOPERATOR,
11920 case FFELEX_typeEQUALS:
11921 if (!ffestb_local_.interface.assignment
11922 && (ffestb_local_.interface.operator
11923 == FFESTP_definedoperatorASSIGNMENT))
11925 ffebad_start (FFEBAD_INTERFACE_OPERATOR);
11926 ffebad_here (0, ffelex_token_where_line (ffesta_tokens[1]),
11927 ffelex_token_where_column (ffesta_tokens[1]));
11928 ffebad_here (1, ffelex_token_where_line (ffesta_tokens[2]),
11929 ffelex_token_where_column (ffesta_tokens[2]));
11932 if (!ffesta_is_inhibited ())
11933 ffestc_R1202 (ffestb_local_.interface.operator, NULL);
11937 if (!ffesta_is_inhibited ())
11938 ffestc_R1202 (ffestb_local_.interface.operator, NULL);
11940 ffelex_token_kill (ffesta_tokens[1]);
11941 ffelex_token_kill (ffesta_tokens[2]);
11942 return (ffelexHandler) ffesta_zero (t);
11948 ffelex_token_kill (ffesta_tokens[1]);
11949 ffelex_token_kill (ffesta_tokens[2]);
11950 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11951 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11955 /* ffestb_S3P4 -- Parse the INCLUDE line
11957 return ffestb_S3P4; // to lexer
11959 Make sure the statement has a valid form for the INCLUDE line. If it
11960 does, implement the statement. */
11963 ffestb_S3P4 (ffelexToken t)
11967 ffelexHandler next;
11971 switch (ffelex_token_type (ffesta_tokens[0]))
11973 case FFELEX_typeNAME:
11974 if (ffesta_first_kw != FFESTR_firstINCLUDE)
11975 goto bad_0; /* :::::::::::::::::::: */
11976 switch (ffelex_token_type (t))
11978 case FFELEX_typeNUMBER:
11979 case FFELEX_typeAPOSTROPHE:
11980 case FFELEX_typeQUOTE:
11984 goto bad_1; /* :::::::::::::::::::: */
11986 ffesta_confirmed ();
11987 return (ffelexHandler) (*((ffelexHandler)
11988 ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextINCLUDE,
11989 (ffeexprCallback) ffestb_S3P41_)))
11992 case FFELEX_typeNAMES:
11993 if (ffesta_first_kw != FFESTR_firstINCLUDE)
11994 goto bad_0; /* :::::::::::::::::::: */
11995 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlINCLUDE);
11996 switch (ffelex_token_type (t))
11999 goto bad_1; /* :::::::::::::::::::: */
12001 case FFELEX_typeAPOSTROPHE:
12002 case FFELEX_typeQUOTE:
12005 ffesta_confirmed ();
12007 return (ffelexHandler) (*((ffelexHandler)
12008 ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextINCLUDE,
12009 (ffeexprCallback) ffestb_S3P41_)))
12012 goto bad_i; /* :::::::::::::::::::: */
12013 nt = ffelex_token_number_from_names (ffesta_tokens[0], i);
12014 p += ffelex_token_length (nt);
12015 i += ffelex_token_length (nt);
12016 if ((*p != '_') || (++i, *++p != '\0'))
12018 ffelex_token_kill (nt);
12019 goto bad_i; /* :::::::::::::::::::: */
12021 ut = ffelex_token_uscore_from_names (ffesta_tokens[0], i - 1);
12022 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs
12023 (ffesta_output_pool, FFEEXPR_contextINCLUDE,
12024 (ffeexprCallback) ffestb_S3P41_)))
12026 ffelex_token_kill (nt);
12027 next = (ffelexHandler) (*next) (ut);
12028 ffelex_token_kill (ut);
12029 return (ffelexHandler) (*next) (t);
12032 goto bad_0; /* :::::::::::::::::::: */
12035 bad_0: /* :::::::::::::::::::: */
12036 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", ffesta_tokens[0]);
12037 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12039 bad_1: /* :::::::::::::::::::: */
12040 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", t);
12041 return (ffelexHandler) ffelex_swallow_tokens (t,
12042 (ffelexHandler) ffesta_zero); /* Invalid second token. */
12044 bad_i: /* :::::::::::::::::::: */
12045 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "INCLUDE", ffesta_tokens[0], i, t);
12046 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12049 /* ffestb_S3P41_ -- "INCLUDE" [NUMBER "_"] expr
12051 (ffestb_S3P41_) // to expression handler
12053 Make sure the next token is an EOS, but not a SEMICOLON. */
12055 static ffelexHandler
12056 ffestb_S3P41_ (ffelexToken ft, ffebld expr, ffelexToken t)
12058 switch (ffelex_token_type (t))
12060 case FFELEX_typeEOS:
12061 case FFELEX_typeSEMICOLON:
12064 if (!ffesta_is_inhibited ())
12066 if (ffe_is_pedantic ()
12067 && ((ffelex_token_type (t) == FFELEX_typeSEMICOLON)
12068 || ffesta_line_has_semicolons))
12070 ffebad_start_msg ("INCLUDE at %0 not the only statement on the source line", FFEBAD_severityWARNING);
12071 ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
12072 ffelex_token_where_column (ffesta_tokens[0]));
12075 ffestc_S3P4 (expr, ft);
12077 return (ffelexHandler) ffesta_zero (t);
12080 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", t);
12084 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12087 /* ffestb_V012 -- Parse the MAP statement
12089 return ffestb_V012; // to lexer
12091 Make sure the statement has a valid form for the MAP statement. If
12092 it does, implement the statement. */
12096 ffestb_V012 (ffelexToken t)
12101 switch (ffelex_token_type (ffesta_tokens[0]))
12103 case FFELEX_typeNAME:
12104 if (ffesta_first_kw != FFESTR_firstMAP)
12105 goto bad_0; /* :::::::::::::::::::: */
12108 case FFELEX_typeNAMES:
12109 if (ffesta_first_kw != FFESTR_firstMAP)
12110 goto bad_0; /* :::::::::::::::::::: */
12111 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlMAP)
12113 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlMAP);
12114 goto bad_i; /* :::::::::::::::::::: */
12119 goto bad_0; /* :::::::::::::::::::: */
12122 switch (ffelex_token_type (t))
12124 case FFELEX_typeEOS:
12125 case FFELEX_typeSEMICOLON:
12126 ffesta_confirmed ();
12127 if (!ffesta_is_inhibited ())
12129 return (ffelexHandler) ffesta_zero (t);
12131 case FFELEX_typeCOMMA:
12132 case FFELEX_typeCOLONCOLON:
12133 ffesta_confirmed (); /* Error, but clearly intended. */
12134 goto bad_1; /* :::::::::::::::::::: */
12137 goto bad_1; /* :::::::::::::::::::: */
12140 bad_0: /* :::::::::::::::::::: */
12141 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MAP", ffesta_tokens[0]);
12142 return (ffelexHandler) ffelex_swallow_tokens (t,
12143 (ffelexHandler) ffesta_zero); /* Invalid first token. */
12145 bad_1: /* :::::::::::::::::::: */
12146 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MAP", t);
12147 return (ffelexHandler) ffelex_swallow_tokens (t,
12148 (ffelexHandler) ffesta_zero); /* Invalid second token. */
12150 bad_i: /* :::::::::::::::::::: */
12151 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "MAP", ffesta_tokens[0], i, t);
12152 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12156 /* ffestb_V014 -- Parse the VOLATILE statement
12158 return ffestb_V014; // to lexer
12160 Make sure the statement has a valid form for the VOLATILE statement. If it
12161 does, implement the statement. */
12164 ffestb_V014 (ffelexToken t)
12169 ffelexHandler next;
12171 switch (ffelex_token_type (ffesta_tokens[0]))
12173 case FFELEX_typeNAME:
12174 if (ffesta_first_kw != FFESTR_firstVOLATILE)
12175 goto bad_0; /* :::::::::::::::::::: */
12176 switch (ffelex_token_type (t))
12178 case FFELEX_typeEOS:
12179 case FFELEX_typeSEMICOLON:
12180 case FFELEX_typeCOMMA:
12181 ffesta_confirmed (); /* Error, but clearly intended. */
12182 goto bad_1; /* :::::::::::::::::::: */
12185 goto bad_1; /* :::::::::::::::::::: */
12187 case FFELEX_typeNAME:
12188 case FFELEX_typeSLASH:
12189 ffesta_confirmed ();
12190 if (!ffesta_is_inhibited ())
12191 ffestc_V014_start ();
12192 return (ffelexHandler) ffestb_V0141_ (t);
12194 case FFELEX_typeCOLONCOLON:
12195 ffesta_confirmed ();
12196 if (!ffesta_is_inhibited ())
12197 ffestc_V014_start ();
12198 return (ffelexHandler) ffestb_V0141_;
12201 case FFELEX_typeNAMES:
12202 if (ffesta_first_kw != FFESTR_firstVOLATILE)
12203 goto bad_0; /* :::::::::::::::::::: */
12204 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlVOLATILE);
12205 switch (ffelex_token_type (t))
12208 goto bad_1; /* :::::::::::::::::::: */
12210 case FFELEX_typeCOMMA:
12211 case FFELEX_typeEOS:
12212 case FFELEX_typeSEMICOLON:
12213 ffesta_confirmed ();
12216 case FFELEX_typeSLASH:
12217 ffesta_confirmed ();
12219 goto bad_i; /* :::::::::::::::::::: */
12220 if (!ffesta_is_inhibited ())
12221 ffestc_V014_start ();
12222 return (ffelexHandler) ffestb_V0141_ (t);
12224 case FFELEX_typeCOLONCOLON:
12225 ffesta_confirmed ();
12227 goto bad_i; /* :::::::::::::::::::: */
12228 if (!ffesta_is_inhibited ())
12229 ffestc_V014_start ();
12230 return (ffelexHandler) ffestb_V0141_;
12233 /* Here, we have at least one char after "VOLATILE" and t is COMMA or
12236 if (!ffesrc_is_name_init (*p))
12237 goto bad_i; /* :::::::::::::::::::: */
12238 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
12239 if (!ffesta_is_inhibited ())
12240 ffestc_V014_start ();
12241 next = (ffelexHandler) ffestb_V0141_ (nt);
12242 ffelex_token_kill (nt);
12243 return (ffelexHandler) (*next) (t);
12246 goto bad_0; /* :::::::::::::::::::: */
12249 bad_0: /* :::::::::::::::::::: */
12250 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", ffesta_tokens[0]);
12251 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12253 bad_1: /* :::::::::::::::::::: */
12254 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12255 return (ffelexHandler) ffelex_swallow_tokens (t,
12256 (ffelexHandler) ffesta_zero); /* Invalid second token. */
12258 bad_i: /* :::::::::::::::::::: */
12259 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "VOLATILE", ffesta_tokens[0], i, t);
12260 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12263 /* ffestb_V0141_ -- "VOLATILE" [COLONCOLON]
12265 return ffestb_V0141_; // to lexer
12267 Handle NAME or SLASH. */
12269 static ffelexHandler
12270 ffestb_V0141_ (ffelexToken t)
12272 switch (ffelex_token_type (t))
12274 case FFELEX_typeNAME:
12275 ffestb_local_.V014.is_cblock = FALSE;
12276 ffesta_tokens[1] = ffelex_token_use (t);
12277 return (ffelexHandler) ffestb_V0144_;
12279 case FFELEX_typeSLASH:
12280 ffestb_local_.V014.is_cblock = TRUE;
12281 return (ffelexHandler) ffestb_V0142_;
12284 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12288 if (!ffesta_is_inhibited ())
12289 ffestc_V014_finish ();
12290 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12293 /* ffestb_V0142_ -- "VOLATILE" [COLONCOLON] SLASH
12295 return ffestb_V0142_; // to lexer
12299 static ffelexHandler
12300 ffestb_V0142_ (ffelexToken t)
12302 switch (ffelex_token_type (t))
12304 case FFELEX_typeNAME:
12305 ffesta_tokens[1] = ffelex_token_use (t);
12306 return (ffelexHandler) ffestb_V0143_;
12309 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12313 if (!ffesta_is_inhibited ())
12314 ffestc_V014_finish ();
12315 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12318 /* ffestb_V0143_ -- "VOLATILE" [COLONCOLON] SLASH NAME
12320 return ffestb_V0143_; // to lexer
12324 static ffelexHandler
12325 ffestb_V0143_ (ffelexToken t)
12327 switch (ffelex_token_type (t))
12329 case FFELEX_typeSLASH:
12330 return (ffelexHandler) ffestb_V0144_;
12333 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12337 if (!ffesta_is_inhibited ())
12338 ffestc_V014_finish ();
12339 ffelex_token_kill (ffesta_tokens[1]);
12340 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12343 /* ffestb_V0144_ -- "VOLATILE" [COLONCOLON] R523
12345 return ffestb_V0144_; // to lexer
12347 Handle COMMA or EOS/SEMICOLON. */
12349 static ffelexHandler
12350 ffestb_V0144_ (ffelexToken t)
12352 switch (ffelex_token_type (t))
12354 case FFELEX_typeCOMMA:
12355 if (!ffesta_is_inhibited ())
12357 if (ffestb_local_.V014.is_cblock)
12358 ffestc_V014_item_cblock (ffesta_tokens[1]);
12360 ffestc_V014_item_object (ffesta_tokens[1]);
12362 ffelex_token_kill (ffesta_tokens[1]);
12363 return (ffelexHandler) ffestb_V0141_;
12365 case FFELEX_typeEOS:
12366 case FFELEX_typeSEMICOLON:
12367 if (!ffesta_is_inhibited ())
12369 if (ffestb_local_.V014.is_cblock)
12370 ffestc_V014_item_cblock (ffesta_tokens[1]);
12372 ffestc_V014_item_object (ffesta_tokens[1]);
12373 ffestc_V014_finish ();
12375 ffelex_token_kill (ffesta_tokens[1]);
12376 return (ffelexHandler) ffesta_zero (t);
12379 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12383 if (!ffesta_is_inhibited ())
12384 ffestc_V014_finish ();
12385 ffelex_token_kill (ffesta_tokens[1]);
12386 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12389 /* ffestb_V025 -- Parse the DEFINEFILE statement
12391 return ffestb_V025; // to lexer
12393 Make sure the statement has a valid form for the DEFINEFILE statement.
12394 If it does, implement the statement. */
12398 ffestb_V025 (ffelexToken t)
12403 ffelexHandler next;
12405 ffestb_local_.V025.started = FALSE;
12406 switch (ffelex_token_type (ffesta_tokens[0]))
12408 case FFELEX_typeNAME:
12409 switch (ffesta_first_kw)
12411 case FFESTR_firstDEFINE:
12412 if ((ffelex_token_type (t) != FFELEX_typeNAME)
12413 || (ffesta_second_kw != FFESTR_secondFILE))
12414 goto bad_1; /* :::::::::::::::::::: */
12415 ffesta_confirmed ();
12416 return (ffelexHandler) ffestb_V0251_;
12418 case FFESTR_firstDEFINEFILE:
12419 return (ffelexHandler) ffestb_V0251_ (t);
12422 goto bad_0; /* :::::::::::::::::::: */
12425 case FFELEX_typeNAMES:
12426 if (ffesta_first_kw != FFESTR_firstDEFINEFILE)
12427 goto bad_0; /* :::::::::::::::::::: */
12428 switch (ffelex_token_type (t))
12430 case FFELEX_typeCOMMA:
12431 case FFELEX_typeEOS:
12432 case FFELEX_typeSEMICOLON:
12433 case FFELEX_typeCOLONCOLON:
12434 ffesta_confirmed (); /* Error, but clearly intended. */
12435 goto bad_1; /* :::::::::::::::::::: */
12438 goto bad_1; /* :::::::::::::::::::: */
12440 case FFELEX_typeOPEN_PAREN:
12443 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDEFINEFILE);
12445 nt = ffelex_token_number_from_names (ffesta_tokens[0], i);
12446 else if (ffesrc_is_name_init (*p))
12447 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
12449 goto bad_i; /* :::::::::::::::::::: */
12450 next = (ffelexHandler) ffestb_V0251_ (nt);
12451 ffelex_token_kill (nt);
12452 return (ffelexHandler) (*next) (t);
12455 goto bad_0; /* :::::::::::::::::::: */
12458 bad_0: /* :::::::::::::::::::: */
12459 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", ffesta_tokens[0]);
12460 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12462 bad_1: /* :::::::::::::::::::: */
12463 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12464 return (ffelexHandler) ffelex_swallow_tokens (t,
12465 (ffelexHandler) ffesta_zero); /* Invalid second token. */
12467 bad_i: /* :::::::::::::::::::: */
12468 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", ffesta_tokens[0], i, t);
12469 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12472 /* ffestb_V0251_ -- "DEFINEFILE" or "DEFINE" "FILE"
12474 return ffestb_V0251_; // to lexer
12476 Make sure the statement has a valid form for the DEFINEFILE statement. If it
12477 does, implement the statement. */
12479 static ffelexHandler
12480 ffestb_V0251_ (ffelexToken t)
12482 switch (ffelex_token_type (t))
12484 case FFELEX_typeNAME:
12485 case FFELEX_typeNUMBER:
12486 if (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME)
12487 ffesta_confirmed ();
12488 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
12489 FFEEXPR_contextFILEUNIT_DF, (ffeexprCallback) ffestb_V0252_)))
12492 case FFELEX_typeEOS:
12493 case FFELEX_typeSEMICOLON:
12494 case FFELEX_typeCOMMA:
12495 case FFELEX_typeCOLONCOLON:
12496 ffesta_confirmed (); /* Error, but clearly intended. */
12503 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12504 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12507 /* ffestb_V0252_ -- "DEFINEFILE" expr
12509 (ffestb_V0252_) // to expression handler
12511 Make sure the statement has a valid form for the DEFINEFILE statement. If
12512 it does, implement the statement. */
12514 static ffelexHandler
12515 ffestb_V0252_ (ffelexToken ft, ffebld expr, ffelexToken t)
12517 switch (ffelex_token_type (t))
12519 case FFELEX_typeOPEN_PAREN:
12520 ffestb_local_.V025.u = expr;
12521 ffesta_tokens[1] = ffelex_token_use (ft);
12522 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
12523 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0253_);
12529 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12530 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12533 /* ffestb_V0253_ -- "DEFINEFILE" expr OPEN_PAREN expr
12535 (ffestb_V0253_) // to expression handler
12537 Make sure the statement has a valid form for the DEFINEFILE statement. If
12538 it does, implement the statement. */
12540 static ffelexHandler
12541 ffestb_V0253_ (ffelexToken ft, ffebld expr, ffelexToken t)
12543 switch (ffelex_token_type (t))
12545 case FFELEX_typeCOMMA:
12546 ffestb_local_.V025.m = expr;
12547 ffesta_tokens[2] = ffelex_token_use (ft);
12548 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
12549 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0254_);
12555 ffelex_token_kill (ffesta_tokens[1]);
12556 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12557 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12560 /* ffestb_V0254_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr
12562 (ffestb_V0254_) // to expression handler
12564 Make sure the statement has a valid form for the DEFINEFILE statement. If
12565 it does, implement the statement. */
12567 static ffelexHandler
12568 ffestb_V0254_ (ffelexToken ft, ffebld expr, ffelexToken t)
12570 switch (ffelex_token_type (t))
12572 case FFELEX_typeCOMMA:
12573 ffestb_local_.V025.n = expr;
12574 ffesta_tokens[3] = ffelex_token_use (ft);
12575 return (ffelexHandler) ffestb_V0255_;
12581 ffelex_token_kill (ffesta_tokens[1]);
12582 ffelex_token_kill (ffesta_tokens[2]);
12583 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12584 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12587 /* ffestb_V0255_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA
12589 return ffestb_V0255_; // to lexer
12591 Make sure the statement has a valid form for the DEFINEFILE statement. If
12592 it does, implement the statement. */
12594 static ffelexHandler
12595 ffestb_V0255_ (ffelexToken t)
12599 switch (ffelex_token_type (t))
12601 case FFELEX_typeNAME:
12602 p = ffelex_token_text (t);
12603 if (!ffesrc_char_match_init (*p, 'U', 'u') || (*++p != '\0'))
12605 return (ffelexHandler) ffestb_V0256_;
12611 ffelex_token_kill (ffesta_tokens[1]);
12612 ffelex_token_kill (ffesta_tokens[2]);
12613 ffelex_token_kill (ffesta_tokens[3]);
12614 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12615 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12618 /* ffestb_V0256_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U"
12620 return ffestb_V0256_; // to lexer
12622 Make sure the statement has a valid form for the DEFINEFILE statement. If
12623 it does, implement the statement. */
12625 static ffelexHandler
12626 ffestb_V0256_ (ffelexToken t)
12628 switch (ffelex_token_type (t))
12630 case FFELEX_typeCOMMA:
12631 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
12632 FFEEXPR_contextFILEASSOC,
12633 (ffeexprCallback) ffestb_V0257_);
12639 ffelex_token_kill (ffesta_tokens[1]);
12640 ffelex_token_kill (ffesta_tokens[2]);
12641 ffelex_token_kill (ffesta_tokens[3]);
12642 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12643 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12646 /* ffestb_V0257_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U"
12649 (ffestb_V0257_) // to expression handler
12651 Make sure the statement has a valid form for the DEFINEFILE statement. If
12652 it does, implement the statement. */
12654 static ffelexHandler
12655 ffestb_V0257_ (ffelexToken ft, ffebld expr, ffelexToken t)
12657 switch (ffelex_token_type (t))
12659 case FFELEX_typeCLOSE_PAREN:
12660 ffestb_local_.V025.asv = expr;
12661 ffesta_tokens[4] = ffelex_token_use (ft);
12662 return (ffelexHandler) ffestb_V0258_;
12668 ffelex_token_kill (ffesta_tokens[1]);
12669 ffelex_token_kill (ffesta_tokens[2]);
12670 ffelex_token_kill (ffesta_tokens[3]);
12671 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12672 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12675 /* ffestb_V0258_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U"
12676 COMMA expr CLOSE_PAREN
12678 return ffestb_V0258_; // to lexer
12680 Make sure the statement has a valid form for the DEFINEFILE statement. If
12681 it does, implement the statement. */
12683 static ffelexHandler
12684 ffestb_V0258_ (ffelexToken t)
12686 switch (ffelex_token_type (t))
12688 case FFELEX_typeCOMMA:
12689 case FFELEX_typeEOS:
12690 case FFELEX_typeSEMICOLON:
12691 if (!ffestb_local_.V025.started)
12693 ffesta_confirmed ();
12694 if (!ffesta_is_inhibited ())
12695 ffestc_V025_start ();
12696 ffestb_local_.V025.started = TRUE;
12698 if (!ffesta_is_inhibited ())
12699 ffestc_V025_item (ffestb_local_.V025.u, ffesta_tokens[1],
12700 ffestb_local_.V025.m, ffesta_tokens[2],
12701 ffestb_local_.V025.n, ffesta_tokens[3],
12702 ffestb_local_.V025.asv, ffesta_tokens[4]);
12703 ffelex_token_kill (ffesta_tokens[1]);
12704 ffelex_token_kill (ffesta_tokens[2]);
12705 ffelex_token_kill (ffesta_tokens[3]);
12706 ffelex_token_kill (ffesta_tokens[4]);
12707 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
12708 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
12709 FFEEXPR_contextFILEUNIT_DF, (ffeexprCallback) ffestb_V0252_);
12710 if (!ffesta_is_inhibited ())
12711 ffestc_V025_finish ();
12712 return (ffelexHandler) ffesta_zero (t);
12718 ffelex_token_kill (ffesta_tokens[1]);
12719 ffelex_token_kill (ffesta_tokens[2]);
12720 ffelex_token_kill (ffesta_tokens[3]);
12721 ffelex_token_kill (ffesta_tokens[4]);
12722 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12723 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12727 /* ffestb_subr_kill_easy_ -- Kill I/O statement data structure
12729 ffestb_subr_kill_easy_();
12731 Kills all tokens in the I/O data structure. Assumes that they are
12732 overlaid with each other (union) in ffest_private.h and the typing
12733 and structure references assume (though not necessarily dangerous if
12734 FALSE) that INQUIRE has the most file elements. */
12736 #if FFESTB_KILL_EASY_
12738 ffestb_subr_kill_easy_ (ffestpInquireIx max)
12740 ffestpInquireIx ix;
12742 for (ix = 0; ix < max; ++ix)
12744 if (ffestp_file.inquire.inquire_spec[ix].kw_or_val_present)
12746 if (ffestp_file.inquire.inquire_spec[ix].kw_present)
12747 ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].kw);
12748 if (ffestp_file.inquire.inquire_spec[ix].value_present)
12749 ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].value);
12755 /* ffestb_subr_kill_accept_ -- Kill ACCEPT statement data structure
12757 ffestb_subr_kill_accept_();
12759 Kills all tokens in the ACCEPT data structure. */
12761 #if !FFESTB_KILL_EASY_
12763 ffestb_subr_kill_accept_ ()
12767 for (ix = 0; ix < FFESTP_acceptix; ++ix)
12769 if (ffestp_file.accept.accept_spec[ix].kw_or_val_present)
12771 if (ffestp_file.accept.accept_spec[ix].kw_present)
12772 ffelex_token_kill (ffestp_file.accept.accept_spec[ix].kw);
12773 if (ffestp_file.accept.accept_spec[ix].value_present)
12774 ffelex_token_kill (ffestp_file.accept.accept_spec[ix].value);
12780 /* ffestb_subr_kill_beru_ -- Kill BACKSPACE/ENDFILE/REWIND/UNLOCK statement
12783 ffestb_subr_kill_beru_();
12785 Kills all tokens in the BACKSPACE/ENDFILE/REWIND/UNLOCK data structure. */
12787 #if !FFESTB_KILL_EASY_
12789 ffestb_subr_kill_beru_ ()
12793 for (ix = 0; ix < FFESTP_beruix; ++ix)
12795 if (ffestp_file.beru.beru_spec[ix].kw_or_val_present)
12797 if (ffestp_file.beru.beru_spec[ix].kw_present)
12798 ffelex_token_kill (ffestp_file.beru.beru_spec[ix].kw);
12799 if (ffestp_file.beru.beru_spec[ix].value_present)
12800 ffelex_token_kill (ffestp_file.beru.beru_spec[ix].value);
12806 /* ffestb_subr_kill_close_ -- Kill CLOSE statement data structure
12808 ffestb_subr_kill_close_();
12810 Kills all tokens in the CLOSE data structure. */
12812 #if !FFESTB_KILL_EASY_
12814 ffestb_subr_kill_close_ ()
12818 for (ix = 0; ix < FFESTP_closeix; ++ix)
12820 if (ffestp_file.close.close_spec[ix].kw_or_val_present)
12822 if (ffestp_file.close.close_spec[ix].kw_present)
12823 ffelex_token_kill (ffestp_file.close.close_spec[ix].kw);
12824 if (ffestp_file.close.close_spec[ix].value_present)
12825 ffelex_token_kill (ffestp_file.close.close_spec[ix].value);
12831 /* ffestb_subr_kill_delete_ -- Kill DELETE statement data structure
12833 ffestb_subr_kill_delete_();
12835 Kills all tokens in the DELETE data structure. */
12837 #if !FFESTB_KILL_EASY_
12839 ffestb_subr_kill_delete_ ()
12843 for (ix = 0; ix < FFESTP_deleteix; ++ix)
12845 if (ffestp_file.delete.delete_spec[ix].kw_or_val_present)
12847 if (ffestp_file.delete.delete_spec[ix].kw_present)
12848 ffelex_token_kill (ffestp_file.delete.delete_spec[ix].kw);
12849 if (ffestp_file.delete.delete_spec[ix].value_present)
12850 ffelex_token_kill (ffestp_file.delete.delete_spec[ix].value);
12856 /* ffestb_subr_kill_inquire_ -- Kill INQUIRE statement data structure
12858 ffestb_subr_kill_inquire_();
12860 Kills all tokens in the INQUIRE data structure. */
12862 #if !FFESTB_KILL_EASY_
12864 ffestb_subr_kill_inquire_ ()
12866 ffestpInquireIx ix;
12868 for (ix = 0; ix < FFESTP_inquireix; ++ix)
12870 if (ffestp_file.inquire.inquire_spec[ix].kw_or_val_present)
12872 if (ffestp_file.inquire.inquire_spec[ix].kw_present)
12873 ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].kw);
12874 if (ffestp_file.inquire.inquire_spec[ix].value_present)
12875 ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].value);
12881 /* ffestb_subr_kill_open_ -- Kill OPEN statement data structure
12883 ffestb_subr_kill_open_();
12885 Kills all tokens in the OPEN data structure. */
12887 #if !FFESTB_KILL_EASY_
12889 ffestb_subr_kill_open_ ()
12893 for (ix = 0; ix < FFESTP_openix; ++ix)
12895 if (ffestp_file.open.open_spec[ix].kw_or_val_present)
12897 if (ffestp_file.open.open_spec[ix].kw_present)
12898 ffelex_token_kill (ffestp_file.open.open_spec[ix].kw);
12899 if (ffestp_file.open.open_spec[ix].value_present)
12900 ffelex_token_kill (ffestp_file.open.open_spec[ix].value);
12906 /* ffestb_subr_kill_print_ -- Kill PRINT statement data structure
12908 ffestb_subr_kill_print_();
12910 Kills all tokens in the PRINT data structure. */
12912 #if !FFESTB_KILL_EASY_
12914 ffestb_subr_kill_print_ ()
12918 for (ix = 0; ix < FFESTP_printix; ++ix)
12920 if (ffestp_file.print.print_spec[ix].kw_or_val_present)
12922 if (ffestp_file.print.print_spec[ix].kw_present)
12923 ffelex_token_kill (ffestp_file.print.print_spec[ix].kw);
12924 if (ffestp_file.print.print_spec[ix].value_present)
12925 ffelex_token_kill (ffestp_file.print.print_spec[ix].value);
12931 /* ffestb_subr_kill_read_ -- Kill READ statement data structure
12933 ffestb_subr_kill_read_();
12935 Kills all tokens in the READ data structure. */
12937 #if !FFESTB_KILL_EASY_
12939 ffestb_subr_kill_read_ ()
12943 for (ix = 0; ix < FFESTP_readix; ++ix)
12945 if (ffestp_file.read.read_spec[ix].kw_or_val_present)
12947 if (ffestp_file.read.read_spec[ix].kw_present)
12948 ffelex_token_kill (ffestp_file.read.read_spec[ix].kw);
12949 if (ffestp_file.read.read_spec[ix].value_present)
12950 ffelex_token_kill (ffestp_file.read.read_spec[ix].value);
12956 /* ffestb_subr_kill_rewrite_ -- Kill REWRITE statement data structure
12958 ffestb_subr_kill_rewrite_();
12960 Kills all tokens in the REWRITE data structure. */
12962 #if !FFESTB_KILL_EASY_
12964 ffestb_subr_kill_rewrite_ ()
12966 ffestpRewriteIx ix;
12968 for (ix = 0; ix < FFESTP_rewriteix; ++ix)
12970 if (ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present)
12972 if (ffestp_file.rewrite.rewrite_spec[ix].kw_present)
12973 ffelex_token_kill (ffestp_file.rewrite.rewrite_spec[ix].kw);
12974 if (ffestp_file.rewrite.rewrite_spec[ix].value_present)
12975 ffelex_token_kill (ffestp_file.rewrite.rewrite_spec[ix].value);
12981 /* ffestb_subr_kill_type_ -- Kill TYPE statement data structure
12983 ffestb_subr_kill_type_();
12985 Kills all tokens in the TYPE data structure. */
12987 #if !FFESTB_KILL_EASY_
12989 ffestb_subr_kill_type_ ()
12993 for (ix = 0; ix < FFESTP_typeix; ++ix)
12995 if (ffestp_file.type.type_spec[ix].kw_or_val_present)
12997 if (ffestp_file.type.type_spec[ix].kw_present)
12998 ffelex_token_kill (ffestp_file.type.type_spec[ix].kw);
12999 if (ffestp_file.type.type_spec[ix].value_present)
13000 ffelex_token_kill (ffestp_file.type.type_spec[ix].value);
13006 /* ffestb_subr_kill_write_ -- Kill WRITE statement data structure
13008 ffestb_subr_kill_write_();
13010 Kills all tokens in the WRITE data structure. */
13012 #if !FFESTB_KILL_EASY_
13014 ffestb_subr_kill_write_ ()
13018 for (ix = 0; ix < FFESTP_writeix; ++ix)
13020 if (ffestp_file.write.write_spec[ix].kw_or_val_present)
13022 if (ffestp_file.write.write_spec[ix].kw_present)
13023 ffelex_token_kill (ffestp_file.write.write_spec[ix].kw);
13024 if (ffestp_file.write.write_spec[ix].value_present)
13025 ffelex_token_kill (ffestp_file.write.write_spec[ix].value);
13031 /* ffestb_beru -- Parse the BACKSPACE/ENDFILE/REWIND/UNLOCK statement
13033 return ffestb_beru; // to lexer
13035 Make sure the statement has a valid form for the BACKSPACE/ENDFILE/REWIND/
13036 UNLOCK statement. If it does, implement the statement. */
13039 ffestb_beru (ffelexToken t)
13041 ffelexHandler next;
13044 switch (ffelex_token_type (ffesta_tokens[0]))
13046 case FFELEX_typeNAME:
13047 switch (ffelex_token_type (t))
13049 case FFELEX_typeCOMMA:
13050 case FFELEX_typeCOLONCOLON:
13051 case FFELEX_typeEOS:
13052 case FFELEX_typeSEMICOLON:
13053 ffesta_confirmed (); /* Error, but clearly intended. */
13054 goto bad_1; /* :::::::::::::::::::: */
13056 case FFELEX_typeEQUALS:
13057 case FFELEX_typePOINTS:
13058 case FFELEX_typeCOLON:
13059 goto bad_1; /* :::::::::::::::::::: */
13061 case FFELEX_typeNAME:
13062 case FFELEX_typeNUMBER:
13063 ffesta_confirmed ();
13066 case FFELEX_typeOPEN_PAREN:
13067 for (ix = 0; ix < FFESTP_beruix; ++ix)
13068 ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE;
13069 ffesta_tokens[1] = ffelex_token_use (t);
13070 return (ffelexHandler) ffestb_beru2_;
13076 for (ix = 0; ix < FFESTP_beruix; ++ix)
13077 ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE;
13078 return (ffelexHandler) (*((ffelexHandler)
13079 ffeexpr_rhs (ffesta_output_pool,
13080 FFEEXPR_contextFILENUM,
13081 (ffeexprCallback) ffestb_beru1_)))
13084 case FFELEX_typeNAMES:
13085 switch (ffelex_token_type (t))
13087 case FFELEX_typeCOMMA:
13088 case FFELEX_typeCOLONCOLON:
13089 ffesta_confirmed (); /* Error, but clearly intended. */
13090 goto bad_1; /* :::::::::::::::::::: */
13092 case FFELEX_typeEQUALS:
13093 case FFELEX_typePOINTS:
13094 case FFELEX_typeCOLON:
13095 goto bad_1; /* :::::::::::::::::::: */
13097 case FFELEX_typeEOS:
13098 case FFELEX_typeSEMICOLON:
13099 ffesta_confirmed ();
13102 case FFELEX_typeOPEN_PAREN:
13103 if (ffelex_token_length (ffesta_tokens[0])
13104 != ffestb_args.beru.len)
13107 for (ix = 0; ix < FFESTP_beruix; ++ix)
13108 ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE;
13109 ffesta_tokens[1] = ffelex_token_use (t);
13110 return (ffelexHandler) ffestb_beru2_;
13115 for (ix = 0; ix < FFESTP_beruix; ++ix)
13116 ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE;
13117 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13118 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_beru1_);
13119 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
13120 ffestb_args.beru.len);
13122 return (ffelexHandler) ffelex_swallow_tokens (t,
13123 (ffelexHandler) ffesta_zero);
13124 return (ffelexHandler) (*next) (t);
13127 goto bad_0; /* :::::::::::::::::::: */
13130 bad_0: /* :::::::::::::::::::: */
13131 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, ffesta_tokens[0]);
13132 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13134 bad_1: /* :::::::::::::::::::: */
13135 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13136 return (ffelexHandler) ffelex_swallow_tokens (t,
13137 (ffelexHandler) ffesta_zero); /* Invalid second token. */
13140 /* ffestb_beru1_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" expr
13142 (ffestb_beru1_) // to expression handler
13144 Make sure the next token is an EOS or SEMICOLON. */
13146 static ffelexHandler
13147 ffestb_beru1_ (ffelexToken ft, ffebld expr, ffelexToken t)
13149 switch (ffelex_token_type (t))
13151 case FFELEX_typeEOS:
13152 case FFELEX_typeSEMICOLON:
13155 ffesta_confirmed ();
13156 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_or_val_present
13158 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_present = FALSE;
13159 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_present = TRUE;
13160 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_is_label
13162 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value
13163 = ffelex_token_use (ft);
13164 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].u.expr = expr;
13165 if (!ffesta_is_inhibited ())
13167 switch (ffesta_first_kw)
13169 case FFESTR_firstBACKSPACE:
13173 case FFESTR_firstENDFILE:
13174 case FFESTR_firstEND:
13178 case FFESTR_firstREWIND:
13183 case FFESTR_firstUNLOCK:
13192 ffestb_subr_kill_beru_ ();
13193 return (ffelexHandler) ffesta_zero (t);
13199 ffestb_subr_kill_beru_ ();
13200 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13201 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13204 /* ffestb_beru2_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN
13206 return ffestb_beru2_; // to lexer
13208 Handle expr construct (not NAME=expr construct) here. */
13210 static ffelexHandler
13211 ffestb_beru2_ (ffelexToken t)
13214 ffelexHandler next;
13216 switch (ffelex_token_type (t))
13218 case FFELEX_typeNAME:
13219 ffesta_tokens[2] = ffelex_token_use (t);
13220 return (ffelexHandler) ffestb_beru3_;
13223 nt = ffesta_tokens[1];
13224 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13225 FFEEXPR_contextFILENUMAMBIG, (ffeexprCallback) ffestb_beru4_)))
13227 ffelex_token_kill (nt);
13228 return (ffelexHandler) (*next) (t);
13232 /* ffestb_beru3_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN NAME
13234 return ffestb_beru3_; // to lexer
13236 If EQUALS here, go to states that handle it. Else, send NAME and this
13237 token thru expression handler. */
13239 static ffelexHandler
13240 ffestb_beru3_ (ffelexToken t)
13242 ffelexHandler next;
13246 switch (ffelex_token_type (t))
13248 case FFELEX_typeEQUALS:
13249 ffelex_token_kill (ffesta_tokens[1]);
13250 nt = ffesta_tokens[2];
13251 next = (ffelexHandler) ffestb_beru5_ (nt);
13252 ffelex_token_kill (nt);
13253 return (ffelexHandler) (*next) (t);
13256 nt = ffesta_tokens[1];
13257 ot = ffesta_tokens[2];
13258 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13259 FFEEXPR_contextFILENUMAMBIG, (ffeexprCallback) ffestb_beru4_)))
13261 ffelex_token_kill (nt);
13262 next = (ffelexHandler) (*next) (ot);
13263 ffelex_token_kill (ot);
13264 return (ffelexHandler) (*next) (t);
13268 /* ffestb_beru4_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN expr [CLOSE_PAREN]
13270 (ffestb_beru4_) // to expression handler
13272 Handle COMMA or EOS/SEMICOLON here.
13275 Now using new mechanism whereby expr comes back as opITEM if the
13276 expr is considered part (or all) of an I/O control list (and should
13277 be stripped of its outer opITEM node) or not if it is considered
13278 a plain unit number that happens to have been enclosed in parens.
13280 No longer expecting close-paren here because of constructs like
13281 BACKSPACE (5)+2, so now expecting either COMMA because it was a
13282 construct like BACKSPACE (5+2,... or EOS/SEMICOLON because it is like
13283 the former construct. Ah, the vagaries of Fortran. */
13285 static ffelexHandler
13286 ffestb_beru4_ (ffelexToken ft, ffebld expr, ffelexToken t)
13290 switch (ffelex_token_type (t))
13292 case FFELEX_typeCOMMA:
13293 case FFELEX_typeEOS:
13294 case FFELEX_typeSEMICOLON:
13295 case FFELEX_typeCLOSE_PAREN:
13298 if (ffebld_op (expr) == FFEBLD_opITEM)
13301 expr = ffebld_head (expr);
13305 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_or_val_present
13307 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_present = FALSE;
13308 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_present = TRUE;
13309 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_is_label
13311 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value
13312 = ffelex_token_use (ft);
13313 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].u.expr = expr;
13315 return (ffelexHandler) ffestb_beru9_ (t);
13316 return (ffelexHandler) ffestb_beru10_ (t);
13322 ffestb_subr_kill_beru_ ();
13323 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13324 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13327 /* ffestb_beru5_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN [external-file-unit
13330 return ffestb_beru5_; // to lexer
13332 Handle expr construct (not NAME=expr construct) here. */
13334 static ffelexHandler
13335 ffestb_beru5_ (ffelexToken t)
13339 ffestb_local_.beru.label = FALSE;
13341 switch (ffelex_token_type (t))
13343 case FFELEX_typeNAME:
13344 kw = ffestr_genio (t);
13347 case FFESTR_genioERR:
13348 ffestb_local_.beru.ix = FFESTP_beruixERR;
13349 ffestb_local_.beru.label = TRUE;
13352 case FFESTR_genioIOSTAT:
13353 ffestb_local_.beru.ix = FFESTP_beruixIOSTAT;
13354 ffestb_local_.beru.left = TRUE;
13355 ffestb_local_.beru.context = FFEEXPR_contextFILEINT;
13358 case FFESTR_genioUNIT:
13359 ffestb_local_.beru.ix = FFESTP_beruixUNIT;
13360 ffestb_local_.beru.left = FALSE;
13361 ffestb_local_.beru.context = FFEEXPR_contextFILENUM;
13365 goto bad; /* :::::::::::::::::::: */
13367 if (ffestp_file.beru.beru_spec[ffestb_local_.beru.ix]
13368 .kw_or_val_present)
13369 break; /* Can't specify a keyword twice! */
13370 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix]
13371 .kw_or_val_present = TRUE;
13372 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix]
13373 .kw_present = TRUE;
13374 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix]
13375 .value_present = FALSE;
13376 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_is_label
13377 = ffestb_local_.beru.label;
13378 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].kw
13379 = ffelex_token_use (t);
13380 return (ffelexHandler) ffestb_beru6_;
13386 bad: /* :::::::::::::::::::: */
13387 ffestb_subr_kill_beru_ ();
13388 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13389 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13392 /* ffestb_beru6_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN [external-file-unit
13395 return ffestb_beru6_; // to lexer
13397 Make sure EQUALS here, send next token to expression handler. */
13399 static ffelexHandler
13400 ffestb_beru6_ (ffelexToken t)
13403 switch (ffelex_token_type (t))
13405 case FFELEX_typeEQUALS:
13406 ffesta_confirmed ();
13407 if (ffestb_local_.beru.label)
13408 return (ffelexHandler) ffestb_beru8_;
13409 if (ffestb_local_.beru.left)
13410 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
13411 ffestb_local_.beru.context,
13412 (ffeexprCallback) ffestb_beru7_);
13413 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13414 ffestb_local_.beru.context,
13415 (ffeexprCallback) ffestb_beru7_);
13421 ffestb_subr_kill_beru_ ();
13422 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13423 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13426 /* ffestb_beru7_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS expr
13428 (ffestb_beru7_) // to expression handler
13430 Handle COMMA or CLOSE_PAREN here. */
13432 static ffelexHandler
13433 ffestb_beru7_ (ffelexToken ft, ffebld expr, ffelexToken t)
13435 switch (ffelex_token_type (t))
13437 case FFELEX_typeCOMMA:
13438 case FFELEX_typeCLOSE_PAREN:
13441 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_present
13443 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value
13444 = ffelex_token_use (ft);
13445 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].u.expr = expr;
13446 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
13447 return (ffelexHandler) ffestb_beru5_;
13448 return (ffelexHandler) ffestb_beru10_;
13454 ffestb_subr_kill_beru_ ();
13455 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13456 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13459 /* ffestb_beru8_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS
13461 return ffestb_beru8_; // to lexer
13463 Handle NUMBER for label here. */
13465 static ffelexHandler
13466 ffestb_beru8_ (ffelexToken t)
13468 switch (ffelex_token_type (t))
13470 case FFELEX_typeNUMBER:
13471 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_present
13473 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value
13474 = ffelex_token_use (t);
13475 return (ffelexHandler) ffestb_beru9_;
13481 ffestb_subr_kill_beru_ ();
13482 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13483 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13486 /* ffestb_beru9_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS
13489 return ffestb_beru9_; // to lexer
13491 Handle COMMA or CLOSE_PAREN here. */
13493 static ffelexHandler
13494 ffestb_beru9_ (ffelexToken t)
13496 switch (ffelex_token_type (t))
13498 case FFELEX_typeCOMMA:
13499 return (ffelexHandler) ffestb_beru5_;
13501 case FFELEX_typeCLOSE_PAREN:
13502 return (ffelexHandler) ffestb_beru10_;
13508 ffestb_subr_kill_beru_ ();
13509 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13510 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13513 /* ffestb_beru10_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... CLOSE_PAREN
13515 return ffestb_beru10_; // to lexer
13517 Handle EOS or SEMICOLON here. */
13519 static ffelexHandler
13520 ffestb_beru10_ (ffelexToken t)
13522 switch (ffelex_token_type (t))
13524 case FFELEX_typeEOS:
13525 case FFELEX_typeSEMICOLON:
13526 ffesta_confirmed ();
13527 if (!ffesta_is_inhibited ())
13529 switch (ffesta_first_kw)
13531 case FFESTR_firstBACKSPACE:
13535 case FFESTR_firstENDFILE:
13536 case FFESTR_firstEND:
13540 case FFESTR_firstREWIND:
13545 case FFESTR_firstUNLOCK:
13554 ffestb_subr_kill_beru_ ();
13555 return (ffelexHandler) ffesta_zero (t);
13561 ffestb_subr_kill_beru_ ();
13562 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13563 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13566 /* ffestb_vxtcode -- Parse the VXT DECODE/ENCODE statement
13568 return ffestb_vxtcode; // to lexer
13570 Make sure the statement has a valid form for the VXT DECODE/ENCODE
13571 statement. If it does, implement the statement. */
13575 ffestb_vxtcode (ffelexToken t)
13577 ffestpVxtcodeIx ix;
13579 switch (ffelex_token_type (ffesta_tokens[0]))
13581 case FFELEX_typeNAME:
13582 switch (ffelex_token_type (t))
13584 case FFELEX_typeCOMMA:
13585 case FFELEX_typeCOLONCOLON:
13586 case FFELEX_typeEOS:
13587 case FFELEX_typeSEMICOLON:
13588 case FFELEX_typeNAME:
13589 case FFELEX_typeNUMBER:
13590 ffesta_confirmed (); /* Error, but clearly intended. */
13591 goto bad_1; /* :::::::::::::::::::: */
13594 goto bad_1; /* :::::::::::::::::::: */
13596 case FFELEX_typeOPEN_PAREN:
13597 for (ix = 0; ix < FFESTP_vxtcodeix; ++ix)
13598 ffestp_file.vxtcode.vxtcode_spec[ix].kw_or_val_present = FALSE;
13599 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13600 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_vxtcode1_);
13603 case FFELEX_typeNAMES:
13604 switch (ffelex_token_type (t))
13606 case FFELEX_typeEOS:
13607 case FFELEX_typeSEMICOLON:
13608 case FFELEX_typeCOMMA:
13609 case FFELEX_typeCOLONCOLON:
13610 ffesta_confirmed (); /* Error, but clearly intended. */
13611 goto bad_1; /* :::::::::::::::::::: */
13614 goto bad_1; /* :::::::::::::::::::: */
13616 case FFELEX_typeOPEN_PAREN:
13617 if (ffelex_token_length (ffesta_tokens[0])
13618 != ffestb_args.vxtcode.len)
13619 goto bad_0; /* :::::::::::::::::::: */
13621 for (ix = 0; ix < FFESTP_vxtcodeix; ++ix)
13622 ffestp_file.vxtcode.vxtcode_spec[ix].kw_or_val_present = FALSE;
13623 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13624 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_vxtcode1_);
13628 goto bad_0; /* :::::::::::::::::::: */
13631 bad_0: /* :::::::::::::::::::: */
13632 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, ffesta_tokens[0]);
13633 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13635 bad_1: /* :::::::::::::::::::: */
13636 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13637 return (ffelexHandler) ffelex_swallow_tokens (t,
13638 (ffelexHandler) ffesta_zero); /* Invalid second token. */
13641 /* ffestb_vxtcode1_ -- "VXTCODE" OPEN_PAREN expr
13643 (ffestb_vxtcode1_) // to expression handler
13645 Handle COMMA here. */
13647 static ffelexHandler
13648 ffestb_vxtcode1_ (ffelexToken ft, ffebld expr, ffelexToken t)
13650 switch (ffelex_token_type (t))
13652 case FFELEX_typeCOMMA:
13655 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].kw_or_val_present
13657 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].kw_present = FALSE;
13658 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value_present = TRUE;
13659 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value_is_label
13661 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value
13662 = ffelex_token_use (ft);
13663 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].u.expr = expr;
13664 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13665 FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_vxtcode2_);
13671 ffestb_subr_kill_vxtcode_ ();
13672 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13673 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13676 /* ffestb_vxtcode2_ -- "VXTCODE" OPEN_PAREN expr COMMA expr
13678 (ffestb_vxtcode2_) // to expression handler
13680 Handle COMMA here. */
13682 static ffelexHandler
13683 ffestb_vxtcode2_ (ffelexToken ft, ffebld expr, ffelexToken t)
13685 switch (ffelex_token_type (t))
13687 case FFELEX_typeCOMMA:
13688 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].kw_or_val_present
13690 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].kw_present = FALSE;
13691 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value_present = TRUE;
13692 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value_is_label
13694 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value
13695 = ffelex_token_use (ft);
13696 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].u.expr = expr;
13697 if (ffesta_first_kw == FFESTR_firstENCODE)
13698 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
13699 FFEEXPR_contextFILEVXTCODE,
13700 (ffeexprCallback) ffestb_vxtcode3_);
13701 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13702 FFEEXPR_contextFILEVXTCODE,
13703 (ffeexprCallback) ffestb_vxtcode3_);
13709 ffestb_subr_kill_vxtcode_ ();
13710 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13711 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13714 /* ffestb_vxtcode3_ -- "VXTCODE" OPEN_PAREN expr COMMA expr COMMA expr
13716 (ffestb_vxtcode3_) // to expression handler
13718 Handle COMMA or CLOSE_PAREN here. */
13720 static ffelexHandler
13721 ffestb_vxtcode3_ (ffelexToken ft, ffebld expr, ffelexToken t)
13723 switch (ffelex_token_type (t))
13725 case FFELEX_typeCOMMA:
13726 case FFELEX_typeCLOSE_PAREN:
13729 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].kw_or_val_present
13731 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].kw_present = FALSE;
13732 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value_present = TRUE;
13733 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value_is_label
13735 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value
13736 = ffelex_token_use (ft);
13737 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].u.expr = expr;
13738 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
13739 return (ffelexHandler) ffestb_vxtcode4_;
13740 return (ffelexHandler) ffestb_vxtcode9_;
13746 ffestb_subr_kill_vxtcode_ ();
13747 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13748 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13751 /* ffestb_vxtcode4_ -- "VXTCODE" OPEN_PAREN ...
13753 return ffestb_vxtcode4_; // to lexer
13755 Handle NAME=expr construct here. */
13757 static ffelexHandler
13758 ffestb_vxtcode4_ (ffelexToken t)
13762 ffestb_local_.vxtcode.label = FALSE;
13764 switch (ffelex_token_type (t))
13766 case FFELEX_typeNAME:
13767 kw = ffestr_genio (t);
13770 case FFESTR_genioERR:
13771 ffestb_local_.vxtcode.ix = FFESTP_vxtcodeixERR;
13772 ffestb_local_.vxtcode.label = TRUE;
13775 case FFESTR_genioIOSTAT:
13776 ffestb_local_.vxtcode.ix = FFESTP_vxtcodeixIOSTAT;
13777 ffestb_local_.vxtcode.left = TRUE;
13778 ffestb_local_.vxtcode.context = FFEEXPR_contextFILEINT;
13782 goto bad; /* :::::::::::::::::::: */
13784 if (ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix]
13785 .kw_or_val_present)
13786 break; /* Can't specify a keyword twice! */
13787 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix]
13788 .kw_or_val_present = TRUE;
13789 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix]
13790 .kw_present = TRUE;
13791 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix]
13792 .value_present = FALSE;
13793 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_is_label
13794 = ffestb_local_.vxtcode.label;
13795 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].kw
13796 = ffelex_token_use (t);
13797 return (ffelexHandler) ffestb_vxtcode5_;
13803 bad: /* :::::::::::::::::::: */
13804 ffestb_subr_kill_vxtcode_ ();
13805 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13806 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13809 /* ffestb_vxtcode5_ -- "VXTCODE" OPEN_PAREN [external-file-unit COMMA [format
13812 return ffestb_vxtcode5_; // to lexer
13814 Make sure EQUALS here, send next token to expression handler. */
13816 static ffelexHandler
13817 ffestb_vxtcode5_ (ffelexToken t)
13819 switch (ffelex_token_type (t))
13821 case FFELEX_typeEQUALS:
13822 ffesta_confirmed ();
13823 if (ffestb_local_.vxtcode.label)
13824 return (ffelexHandler) ffestb_vxtcode7_;
13825 if (ffestb_local_.vxtcode.left)
13826 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
13827 ffestb_local_.vxtcode.context,
13828 (ffeexprCallback) ffestb_vxtcode6_);
13829 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13830 ffestb_local_.vxtcode.context,
13831 (ffeexprCallback) ffestb_vxtcode6_);
13837 ffestb_subr_kill_vxtcode_ ();
13838 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13839 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13842 /* ffestb_vxtcode6_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS expr
13844 (ffestb_vxtcode6_) // to expression handler
13846 Handle COMMA or CLOSE_PAREN here. */
13848 static ffelexHandler
13849 ffestb_vxtcode6_ (ffelexToken ft, ffebld expr, ffelexToken t)
13851 switch (ffelex_token_type (t))
13853 case FFELEX_typeCOMMA:
13854 case FFELEX_typeCLOSE_PAREN:
13857 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_present
13859 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value
13860 = ffelex_token_use (ft);
13861 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].u.expr = expr;
13862 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
13863 return (ffelexHandler) ffestb_vxtcode4_;
13864 return (ffelexHandler) ffestb_vxtcode9_;
13870 ffestb_subr_kill_vxtcode_ ();
13871 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13872 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13875 /* ffestb_vxtcode7_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS
13877 return ffestb_vxtcode7_; // to lexer
13879 Handle NUMBER for label here. */
13881 static ffelexHandler
13882 ffestb_vxtcode7_ (ffelexToken t)
13884 switch (ffelex_token_type (t))
13886 case FFELEX_typeNUMBER:
13887 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_present
13889 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value
13890 = ffelex_token_use (t);
13891 return (ffelexHandler) ffestb_vxtcode8_;
13897 ffestb_subr_kill_vxtcode_ ();
13898 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13899 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13902 /* ffestb_vxtcode8_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS NUMBER
13904 return ffestb_vxtcode8_; // to lexer
13906 Handle COMMA or CLOSE_PAREN here. */
13908 static ffelexHandler
13909 ffestb_vxtcode8_ (ffelexToken t)
13911 switch (ffelex_token_type (t))
13913 case FFELEX_typeCOMMA:
13914 return (ffelexHandler) ffestb_vxtcode4_;
13916 case FFELEX_typeCLOSE_PAREN:
13917 return (ffelexHandler) ffestb_vxtcode9_;
13923 ffestb_subr_kill_vxtcode_ ();
13924 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13925 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13928 /* ffestb_vxtcode9_ -- "VXTCODE" OPEN_PAREN ... CLOSE_PAREN
13930 return ffestb_vxtcode9_; // to lexer
13932 Handle EOS or SEMICOLON here.
13935 Context for ENCODE/DECODE expressions is now IOLISTDF instead of IOLIST
13936 since they apply to internal files. */
13938 static ffelexHandler
13939 ffestb_vxtcode9_ (ffelexToken t)
13941 ffelexHandler next;
13943 switch (ffelex_token_type (t))
13945 case FFELEX_typeEOS:
13946 case FFELEX_typeSEMICOLON:
13947 ffesta_confirmed ();
13948 if (!ffesta_is_inhibited ())
13950 if (ffesta_first_kw == FFESTR_firstENCODE)
13952 ffestc_V023_start ();
13953 ffestc_V023_finish ();
13957 ffestc_V024_start ();
13958 ffestc_V024_finish ();
13961 ffestb_subr_kill_vxtcode_ ();
13962 return (ffelexHandler) ffesta_zero (t);
13964 case FFELEX_typeNAME:
13965 case FFELEX_typeOPEN_PAREN:
13966 case FFELEX_typeCOMMA:
13967 ffesta_confirmed ();
13968 if (!ffesta_is_inhibited ())
13969 if (ffesta_first_kw == FFESTR_firstENCODE)
13970 ffestc_V023_start ();
13972 ffestc_V024_start ();
13973 ffestb_subr_kill_vxtcode_ ();
13974 if (ffesta_first_kw == FFESTR_firstDECODE)
13975 next = (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
13976 FFEEXPR_contextIOLISTDF,
13977 (ffeexprCallback) ffestb_vxtcode10_);
13979 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13980 FFEEXPR_contextIOLISTDF,
13981 (ffeexprCallback) ffestb_vxtcode10_);
13983 /* EXTENSION: Allow an optional preceding COMMA here if not pedantic.
13984 (f2c provides this extension, as do other compilers, supposedly.) */
13986 if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA))
13989 return (ffelexHandler) (*next) (t);
13995 ffestb_subr_kill_vxtcode_ ();
13996 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13997 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14000 /* ffestb_vxtcode10_ -- "VXTCODE(...)" expr
14002 (ffestb_vxtcode10_) // to expression handler
14004 Handle COMMA or EOS/SEMICOLON here.
14007 Context for ENCODE/DECODE expressions is now IOLISTDF instead of IOLIST
14008 since they apply to internal files. */
14010 static ffelexHandler
14011 ffestb_vxtcode10_ (ffelexToken ft, ffebld expr, ffelexToken t)
14013 switch (ffelex_token_type (t))
14015 case FFELEX_typeCOMMA:
14018 if (!ffesta_is_inhibited ())
14019 if (ffesta_first_kw == FFESTR_firstENCODE)
14020 ffestc_V023_item (expr, ft);
14022 ffestc_V024_item (expr, ft);
14023 if (ffesta_first_kw == FFESTR_firstDECODE)
14024 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
14025 FFEEXPR_contextIOLISTDF,
14026 (ffeexprCallback) ffestb_vxtcode10_);
14027 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14028 FFEEXPR_contextIOLISTDF,
14029 (ffeexprCallback) ffestb_vxtcode10_);
14031 case FFELEX_typeEOS:
14032 case FFELEX_typeSEMICOLON:
14035 if (!ffesta_is_inhibited ())
14037 if (ffesta_first_kw == FFESTR_firstENCODE)
14039 ffestc_V023_item (expr, ft);
14040 ffestc_V023_finish ();
14044 ffestc_V024_item (expr, ft);
14045 ffestc_V024_finish ();
14048 return (ffelexHandler) ffesta_zero (t);
14054 if (!ffesta_is_inhibited ())
14055 if (ffesta_first_kw == FFESTR_firstENCODE)
14056 ffestc_V023_finish ();
14058 ffestc_V024_finish ();
14059 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
14060 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14064 /* ffestb_R904 -- Parse an OPEN statement
14066 return ffestb_R904; // to lexer
14068 Make sure the statement has a valid form for an OPEN statement.
14069 If it does, implement the statement. */
14072 ffestb_R904 (ffelexToken t)
14076 switch (ffelex_token_type (ffesta_tokens[0]))
14078 case FFELEX_typeNAME:
14079 if (ffesta_first_kw != FFESTR_firstOPEN)
14080 goto bad_0; /* :::::::::::::::::::: */
14083 case FFELEX_typeNAMES:
14084 if (ffesta_first_kw != FFESTR_firstOPEN)
14085 goto bad_0; /* :::::::::::::::::::: */
14086 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlOPEN)
14087 goto bad_0; /* :::::::::::::::::::: */
14091 goto bad_0; /* :::::::::::::::::::: */
14094 switch (ffelex_token_type (t))
14096 case FFELEX_typeOPEN_PAREN:
14099 case FFELEX_typeEOS:
14100 case FFELEX_typeSEMICOLON:
14101 case FFELEX_typeCOMMA:
14102 case FFELEX_typeCOLONCOLON:
14103 ffesta_confirmed (); /* Error, but clearly intended. */
14104 goto bad_1; /* :::::::::::::::::::: */
14107 goto bad_1; /* :::::::::::::::::::: */
14110 for (ix = 0; ix < FFESTP_openix; ++ix)
14111 ffestp_file.open.open_spec[ix].kw_or_val_present = FALSE;
14113 return (ffelexHandler) ffestb_R9041_;
14115 bad_0: /* :::::::::::::::::::: */
14116 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", ffesta_tokens[0]);
14117 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14119 bad_1: /* :::::::::::::::::::: */
14120 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14121 return (ffelexHandler) ffelex_swallow_tokens (t,
14122 (ffelexHandler) ffesta_zero); /* Invalid second token. */
14125 /* ffestb_R9041_ -- "OPEN" OPEN_PAREN
14127 return ffestb_R9041_; // to lexer
14129 Handle expr construct (not NAME=expr construct) here. */
14131 static ffelexHandler
14132 ffestb_R9041_ (ffelexToken t)
14134 switch (ffelex_token_type (t))
14136 case FFELEX_typeNAME:
14137 ffesta_tokens[1] = ffelex_token_use (t);
14138 return (ffelexHandler) ffestb_R9042_;
14141 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14142 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9043_)))
14147 /* ffestb_R9042_ -- "OPEN" OPEN_PAREN NAME
14149 return ffestb_R9042_; // to lexer
14151 If EQUALS here, go to states that handle it. Else, send NAME and this
14152 token thru expression handler. */
14154 static ffelexHandler
14155 ffestb_R9042_ (ffelexToken t)
14157 ffelexHandler next;
14160 switch (ffelex_token_type (t))
14162 case FFELEX_typeEQUALS:
14163 nt = ffesta_tokens[1];
14164 next = (ffelexHandler) ffestb_R9044_ (nt);
14165 ffelex_token_kill (nt);
14166 return (ffelexHandler) (*next) (t);
14169 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14170 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9043_)))
14171 (ffesta_tokens[1]);
14172 ffelex_token_kill (ffesta_tokens[1]);
14173 return (ffelexHandler) (*next) (t);
14177 /* ffestb_R9043_ -- "OPEN" OPEN_PAREN expr
14179 (ffestb_R9043_) // to expression handler
14181 Handle COMMA or CLOSE_PAREN here. */
14183 static ffelexHandler
14184 ffestb_R9043_ (ffelexToken ft, ffebld expr, ffelexToken t)
14186 switch (ffelex_token_type (t))
14188 case FFELEX_typeCOMMA:
14189 case FFELEX_typeCLOSE_PAREN:
14192 ffestp_file.open.open_spec[FFESTP_openixUNIT].kw_or_val_present
14194 ffestp_file.open.open_spec[FFESTP_openixUNIT].kw_present = FALSE;
14195 ffestp_file.open.open_spec[FFESTP_openixUNIT].value_present = TRUE;
14196 ffestp_file.open.open_spec[FFESTP_openixUNIT].value_is_label
14198 ffestp_file.open.open_spec[FFESTP_openixUNIT].value
14199 = ffelex_token_use (ft);
14200 ffestp_file.open.open_spec[FFESTP_openixUNIT].u.expr = expr;
14201 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
14202 return (ffelexHandler) ffestb_R9044_;
14203 return (ffelexHandler) ffestb_R9049_;
14209 ffestb_subr_kill_open_ ();
14210 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14211 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14214 /* ffestb_R9044_ -- "OPEN" OPEN_PAREN [external-file-unit COMMA]
14216 return ffestb_R9044_; // to lexer
14218 Handle expr construct (not NAME=expr construct) here. */
14220 static ffelexHandler
14221 ffestb_R9044_ (ffelexToken t)
14225 ffestb_local_.open.label = FALSE;
14227 switch (ffelex_token_type (t))
14229 case FFELEX_typeNAME:
14230 kw = ffestr_open (t);
14233 case FFESTR_openACCESS:
14234 ffestb_local_.open.ix = FFESTP_openixACCESS;
14235 ffestb_local_.open.left = FALSE;
14236 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14239 case FFESTR_openACTION:
14240 ffestb_local_.open.ix = FFESTP_openixACTION;
14241 ffestb_local_.open.left = FALSE;
14242 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14245 case FFESTR_openASSOCIATEVARIABLE:
14246 ffestb_local_.open.ix = FFESTP_openixASSOCIATEVARIABLE;
14247 ffestb_local_.open.left = TRUE;
14248 ffestb_local_.open.context = FFEEXPR_contextFILEASSOC;
14251 case FFESTR_openBLANK:
14252 ffestb_local_.open.ix = FFESTP_openixBLANK;
14253 ffestb_local_.open.left = FALSE;
14254 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14257 case FFESTR_openBLOCKSIZE:
14258 ffestb_local_.open.ix = FFESTP_openixBLOCKSIZE;
14259 ffestb_local_.open.left = FALSE;
14260 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14263 case FFESTR_openBUFFERCOUNT:
14264 ffestb_local_.open.ix = FFESTP_openixBUFFERCOUNT;
14265 ffestb_local_.open.left = FALSE;
14266 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14269 case FFESTR_openCARRIAGECONTROL:
14270 ffestb_local_.open.ix = FFESTP_openixCARRIAGECONTROL;
14271 ffestb_local_.open.left = FALSE;
14272 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14275 case FFESTR_openDEFAULTFILE:
14276 ffestb_local_.open.ix = FFESTP_openixDEFAULTFILE;
14277 ffestb_local_.open.left = FALSE;
14278 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14281 case FFESTR_openDELIM:
14282 ffestb_local_.open.ix = FFESTP_openixDELIM;
14283 ffestb_local_.open.left = FALSE;
14284 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14287 case FFESTR_openDISP:
14288 case FFESTR_openDISPOSE:
14289 ffestb_local_.open.ix = FFESTP_openixDISPOSE;
14290 ffestb_local_.open.left = FALSE;
14291 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14294 case FFESTR_openERR:
14295 ffestb_local_.open.ix = FFESTP_openixERR;
14296 ffestb_local_.open.label = TRUE;
14299 case FFESTR_openEXTENDSIZE:
14300 ffestb_local_.open.ix = FFESTP_openixEXTENDSIZE;
14301 ffestb_local_.open.left = FALSE;
14302 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14305 case FFESTR_openFILE:
14306 case FFESTR_openNAME:
14307 ffestb_local_.open.ix = FFESTP_openixFILE;
14308 ffestb_local_.open.left = FALSE;
14309 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14312 case FFESTR_openFORM:
14313 ffestb_local_.open.ix = FFESTP_openixFORM;
14314 ffestb_local_.open.left = FALSE;
14315 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14318 case FFESTR_openINITIALSIZE:
14319 ffestb_local_.open.ix = FFESTP_openixINITIALSIZE;
14320 ffestb_local_.open.left = FALSE;
14321 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14324 case FFESTR_openIOSTAT:
14325 ffestb_local_.open.ix = FFESTP_openixIOSTAT;
14326 ffestb_local_.open.left = TRUE;
14327 ffestb_local_.open.context = FFEEXPR_contextFILEINT;
14330 #if 0 /* Haven't added support for expression
14331 context yet (though easy). */
14332 case FFESTR_openKEY:
14333 ffestb_local_.open.ix = FFESTP_openixKEY;
14334 ffestb_local_.open.left = FALSE;
14335 ffestb_local_.open.context = FFEEXPR_contextFILEKEY;
14339 case FFESTR_openMAXREC:
14340 ffestb_local_.open.ix = FFESTP_openixMAXREC;
14341 ffestb_local_.open.left = FALSE;
14342 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14345 case FFESTR_openNOSPANBLOCKS:
14346 if (ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS]
14347 .kw_or_val_present)
14348 goto bad; /* :::::::::::::::::::: */
14349 ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS]
14350 .kw_or_val_present = TRUE;
14351 ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS]
14352 .kw_present = TRUE;
14353 ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS]
14354 .value_present = FALSE;
14355 ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS].kw
14356 = ffelex_token_use (t);
14357 return (ffelexHandler) ffestb_R9048_;
14359 case FFESTR_openORGANIZATION:
14360 ffestb_local_.open.ix = FFESTP_openixORGANIZATION;
14361 ffestb_local_.open.left = FALSE;
14362 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14365 case FFESTR_openPAD:
14366 ffestb_local_.open.ix = FFESTP_openixPAD;
14367 ffestb_local_.open.left = FALSE;
14368 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14371 case FFESTR_openPOSITION:
14372 ffestb_local_.open.ix = FFESTP_openixPOSITION;
14373 ffestb_local_.open.left = FALSE;
14374 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14377 case FFESTR_openREADONLY:
14378 if (ffestp_file.open.open_spec[FFESTP_openixREADONLY]
14379 .kw_or_val_present)
14380 goto bad; /* :::::::::::::::::::: */
14381 ffestp_file.open.open_spec[FFESTP_openixREADONLY]
14382 .kw_or_val_present = TRUE;
14383 ffestp_file.open.open_spec[FFESTP_openixREADONLY]
14384 .kw_present = TRUE;
14385 ffestp_file.open.open_spec[FFESTP_openixREADONLY]
14386 .value_present = FALSE;
14387 ffestp_file.open.open_spec[FFESTP_openixREADONLY].kw
14388 = ffelex_token_use (t);
14389 return (ffelexHandler) ffestb_R9048_;
14391 case FFESTR_openRECL:
14392 case FFESTR_openRECORDSIZE:
14393 ffestb_local_.open.ix = FFESTP_openixRECL;
14394 ffestb_local_.open.left = FALSE;
14395 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14398 case FFESTR_openRECORDTYPE:
14399 ffestb_local_.open.ix = FFESTP_openixRECORDTYPE;
14400 ffestb_local_.open.left = FALSE;
14401 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14404 case FFESTR_openSHARED:
14405 if (ffestp_file.open.open_spec[FFESTP_openixSHARED]
14406 .kw_or_val_present)
14407 goto bad; /* :::::::::::::::::::: */
14408 ffestp_file.open.open_spec[FFESTP_openixSHARED]
14409 .kw_or_val_present = TRUE;
14410 ffestp_file.open.open_spec[FFESTP_openixSHARED]
14411 .kw_present = TRUE;
14412 ffestp_file.open.open_spec[FFESTP_openixSHARED]
14413 .value_present = FALSE;
14414 ffestp_file.open.open_spec[FFESTP_openixSHARED].kw
14415 = ffelex_token_use (t);
14416 return (ffelexHandler) ffestb_R9048_;
14418 case FFESTR_openSTATUS:
14419 case FFESTR_openTYPE:
14420 ffestb_local_.open.ix = FFESTP_openixSTATUS;
14421 ffestb_local_.open.left = FALSE;
14422 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14425 case FFESTR_openUNIT:
14426 ffestb_local_.open.ix = FFESTP_openixUNIT;
14427 ffestb_local_.open.left = FALSE;
14428 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14431 case FFESTR_openUSEROPEN:
14432 ffestb_local_.open.ix = FFESTP_openixUSEROPEN;
14433 ffestb_local_.open.left = TRUE;
14434 ffestb_local_.open.context = FFEEXPR_contextFILEEXTFUNC;
14438 goto bad; /* :::::::::::::::::::: */
14440 if (ffestp_file.open.open_spec[ffestb_local_.open.ix]
14441 .kw_or_val_present)
14442 break; /* Can't specify a keyword twice! */
14443 ffestp_file.open.open_spec[ffestb_local_.open.ix]
14444 .kw_or_val_present = TRUE;
14445 ffestp_file.open.open_spec[ffestb_local_.open.ix]
14446 .kw_present = TRUE;
14447 ffestp_file.open.open_spec[ffestb_local_.open.ix]
14448 .value_present = FALSE;
14449 ffestp_file.open.open_spec[ffestb_local_.open.ix].value_is_label
14450 = ffestb_local_.open.label;
14451 ffestp_file.open.open_spec[ffestb_local_.open.ix].kw
14452 = ffelex_token_use (t);
14453 return (ffelexHandler) ffestb_R9045_;
14459 bad: /* :::::::::::::::::::: */
14460 ffestb_subr_kill_open_ ();
14461 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14462 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14465 /* ffestb_R9045_ -- "OPEN" OPEN_PAREN [external-file-unit COMMA] NAME
14467 return ffestb_R9045_; // to lexer
14469 Make sure EQUALS here, send next token to expression handler. */
14471 static ffelexHandler
14472 ffestb_R9045_ (ffelexToken t)
14474 switch (ffelex_token_type (t))
14476 case FFELEX_typeEQUALS:
14477 ffesta_confirmed ();
14478 if (ffestb_local_.open.label)
14479 return (ffelexHandler) ffestb_R9047_;
14480 if (ffestb_local_.open.left)
14481 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
14482 ffestb_local_.open.context,
14483 (ffeexprCallback) ffestb_R9046_);
14484 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14485 ffestb_local_.open.context,
14486 (ffeexprCallback) ffestb_R9046_);
14492 ffestb_subr_kill_open_ ();
14493 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14494 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14497 /* ffestb_R9046_ -- "OPEN" OPEN_PAREN ... NAME EQUALS expr
14499 (ffestb_R9046_) // to expression handler
14501 Handle COMMA or CLOSE_PAREN here. */
14503 static ffelexHandler
14504 ffestb_R9046_ (ffelexToken ft, ffebld expr, ffelexToken t)
14506 switch (ffelex_token_type (t))
14508 case FFELEX_typeCOMMA:
14509 case FFELEX_typeCLOSE_PAREN:
14512 ffestp_file.open.open_spec[ffestb_local_.open.ix].value_present
14514 ffestp_file.open.open_spec[ffestb_local_.open.ix].value
14515 = ffelex_token_use (ft);
14516 ffestp_file.open.open_spec[ffestb_local_.open.ix].u.expr = expr;
14517 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
14518 return (ffelexHandler) ffestb_R9044_;
14519 return (ffelexHandler) ffestb_R9049_;
14525 ffestb_subr_kill_open_ ();
14526 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14527 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14530 /* ffestb_R9047_ -- "OPEN" OPEN_PAREN ... NAME EQUALS
14532 return ffestb_R9047_; // to lexer
14534 Handle NUMBER for label here. */
14536 static ffelexHandler
14537 ffestb_R9047_ (ffelexToken t)
14539 switch (ffelex_token_type (t))
14541 case FFELEX_typeNUMBER:
14542 ffestp_file.open.open_spec[ffestb_local_.open.ix].value_present
14544 ffestp_file.open.open_spec[ffestb_local_.open.ix].value
14545 = ffelex_token_use (t);
14546 return (ffelexHandler) ffestb_R9048_;
14552 ffestb_subr_kill_open_ ();
14553 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14554 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14557 /* ffestb_R9048_ -- "OPEN" OPEN_PAREN ... NAME EQUALS NUMBER
14559 return ffestb_R9048_; // to lexer
14561 Handle COMMA or CLOSE_PAREN here. */
14563 static ffelexHandler
14564 ffestb_R9048_ (ffelexToken t)
14566 switch (ffelex_token_type (t))
14568 case FFELEX_typeCOMMA:
14569 return (ffelexHandler) ffestb_R9044_;
14571 case FFELEX_typeCLOSE_PAREN:
14572 return (ffelexHandler) ffestb_R9049_;
14578 ffestb_subr_kill_open_ ();
14579 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14580 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14583 /* ffestb_R9049_ -- "OPEN" OPEN_PAREN ... CLOSE_PAREN
14585 return ffestb_R9049_; // to lexer
14587 Handle EOS or SEMICOLON here. */
14589 static ffelexHandler
14590 ffestb_R9049_ (ffelexToken t)
14592 switch (ffelex_token_type (t))
14594 case FFELEX_typeEOS:
14595 case FFELEX_typeSEMICOLON:
14596 ffesta_confirmed ();
14597 if (!ffesta_is_inhibited ())
14599 ffestb_subr_kill_open_ ();
14600 return (ffelexHandler) ffesta_zero (t);
14606 ffestb_subr_kill_open_ ();
14607 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14608 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14611 /* ffestb_R907 -- Parse a CLOSE statement
14613 return ffestb_R907; // to lexer
14615 Make sure the statement has a valid form for a CLOSE statement.
14616 If it does, implement the statement. */
14619 ffestb_R907 (ffelexToken t)
14623 switch (ffelex_token_type (ffesta_tokens[0]))
14625 case FFELEX_typeNAME:
14626 if (ffesta_first_kw != FFESTR_firstCLOSE)
14627 goto bad_0; /* :::::::::::::::::::: */
14630 case FFELEX_typeNAMES:
14631 if (ffesta_first_kw != FFESTR_firstCLOSE)
14632 goto bad_0; /* :::::::::::::::::::: */
14633 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCLOSE)
14634 goto bad_0; /* :::::::::::::::::::: */
14638 goto bad_0; /* :::::::::::::::::::: */
14641 switch (ffelex_token_type (t))
14643 case FFELEX_typeOPEN_PAREN:
14646 case FFELEX_typeEOS:
14647 case FFELEX_typeSEMICOLON:
14648 case FFELEX_typeCOMMA:
14649 case FFELEX_typeCOLONCOLON:
14650 ffesta_confirmed (); /* Error, but clearly intended. */
14651 goto bad_1; /* :::::::::::::::::::: */
14654 goto bad_1; /* :::::::::::::::::::: */
14657 for (ix = 0; ix < FFESTP_closeix; ++ix)
14658 ffestp_file.close.close_spec[ix].kw_or_val_present = FALSE;
14660 return (ffelexHandler) ffestb_R9071_;
14662 bad_0: /* :::::::::::::::::::: */
14663 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", ffesta_tokens[0]);
14664 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14666 bad_1: /* :::::::::::::::::::: */
14667 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14668 return (ffelexHandler) ffelex_swallow_tokens (t,
14669 (ffelexHandler) ffesta_zero); /* Invalid second token. */
14672 /* ffestb_R9071_ -- "CLOSE" OPEN_PAREN
14674 return ffestb_R9071_; // to lexer
14676 Handle expr construct (not NAME=expr construct) here. */
14678 static ffelexHandler
14679 ffestb_R9071_ (ffelexToken t)
14681 switch (ffelex_token_type (t))
14683 case FFELEX_typeNAME:
14684 ffesta_tokens[1] = ffelex_token_use (t);
14685 return (ffelexHandler) ffestb_R9072_;
14688 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14689 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9073_)))
14694 /* ffestb_R9072_ -- "CLOSE" OPEN_PAREN NAME
14696 return ffestb_R9072_; // to lexer
14698 If EQUALS here, go to states that handle it. Else, send NAME and this
14699 token thru expression handler. */
14701 static ffelexHandler
14702 ffestb_R9072_ (ffelexToken t)
14704 ffelexHandler next;
14707 switch (ffelex_token_type (t))
14709 case FFELEX_typeEQUALS:
14710 nt = ffesta_tokens[1];
14711 next = (ffelexHandler) ffestb_R9074_ (nt);
14712 ffelex_token_kill (nt);
14713 return (ffelexHandler) (*next) (t);
14716 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14717 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9073_)))
14718 (ffesta_tokens[1]);
14719 ffelex_token_kill (ffesta_tokens[1]);
14720 return (ffelexHandler) (*next) (t);
14724 /* ffestb_R9073_ -- "CLOSE" OPEN_PAREN expr
14726 (ffestb_R9073_) // to expression handler
14728 Handle COMMA or CLOSE_PAREN here. */
14730 static ffelexHandler
14731 ffestb_R9073_ (ffelexToken ft, ffebld expr, ffelexToken t)
14733 switch (ffelex_token_type (t))
14735 case FFELEX_typeCOMMA:
14736 case FFELEX_typeCLOSE_PAREN:
14739 ffestp_file.close.close_spec[FFESTP_closeixUNIT].kw_or_val_present
14741 ffestp_file.close.close_spec[FFESTP_closeixUNIT].kw_present = FALSE;
14742 ffestp_file.close.close_spec[FFESTP_closeixUNIT].value_present = TRUE;
14743 ffestp_file.close.close_spec[FFESTP_closeixUNIT].value_is_label
14745 ffestp_file.close.close_spec[FFESTP_closeixUNIT].value
14746 = ffelex_token_use (ft);
14747 ffestp_file.close.close_spec[FFESTP_closeixUNIT].u.expr = expr;
14748 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
14749 return (ffelexHandler) ffestb_R9074_;
14750 return (ffelexHandler) ffestb_R9079_;
14756 ffestb_subr_kill_close_ ();
14757 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14758 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14761 /* ffestb_R9074_ -- "CLOSE" OPEN_PAREN [external-file-unit COMMA]
14763 return ffestb_R9074_; // to lexer
14765 Handle expr construct (not NAME=expr construct) here. */
14767 static ffelexHandler
14768 ffestb_R9074_ (ffelexToken t)
14772 ffestb_local_.close.label = FALSE;
14774 switch (ffelex_token_type (t))
14776 case FFELEX_typeNAME:
14777 kw = ffestr_genio (t);
14780 case FFESTR_genioERR:
14781 ffestb_local_.close.ix = FFESTP_closeixERR;
14782 ffestb_local_.close.label = TRUE;
14785 case FFESTR_genioIOSTAT:
14786 ffestb_local_.close.ix = FFESTP_closeixIOSTAT;
14787 ffestb_local_.close.left = TRUE;
14788 ffestb_local_.close.context = FFEEXPR_contextFILEINT;
14791 case FFESTR_genioSTATUS:
14792 case FFESTR_genioDISP:
14793 case FFESTR_genioDISPOSE:
14794 ffestb_local_.close.ix = FFESTP_closeixSTATUS;
14795 ffestb_local_.close.left = FALSE;
14796 ffestb_local_.close.context = FFEEXPR_contextFILEDFCHAR;
14799 case FFESTR_genioUNIT:
14800 ffestb_local_.close.ix = FFESTP_closeixUNIT;
14801 ffestb_local_.close.left = FALSE;
14802 ffestb_local_.close.context = FFEEXPR_contextFILENUM;
14806 goto bad; /* :::::::::::::::::::: */
14808 if (ffestp_file.close.close_spec[ffestb_local_.close.ix]
14809 .kw_or_val_present)
14810 break; /* Can't specify a keyword twice! */
14811 ffestp_file.close.close_spec[ffestb_local_.close.ix]
14812 .kw_or_val_present = TRUE;
14813 ffestp_file.close.close_spec[ffestb_local_.close.ix]
14814 .kw_present = TRUE;
14815 ffestp_file.close.close_spec[ffestb_local_.close.ix]
14816 .value_present = FALSE;
14817 ffestp_file.close.close_spec[ffestb_local_.close.ix].value_is_label
14818 = ffestb_local_.close.label;
14819 ffestp_file.close.close_spec[ffestb_local_.close.ix].kw
14820 = ffelex_token_use (t);
14821 return (ffelexHandler) ffestb_R9075_;
14827 bad: /* :::::::::::::::::::: */
14828 ffestb_subr_kill_close_ ();
14829 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14830 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14833 /* ffestb_R9075_ -- "CLOSE" OPEN_PAREN [external-file-unit COMMA] NAME
14835 return ffestb_R9075_; // to lexer
14837 Make sure EQUALS here, send next token to expression handler. */
14839 static ffelexHandler
14840 ffestb_R9075_ (ffelexToken t)
14842 switch (ffelex_token_type (t))
14844 case FFELEX_typeEQUALS:
14845 ffesta_confirmed ();
14846 if (ffestb_local_.close.label)
14847 return (ffelexHandler) ffestb_R9077_;
14848 if (ffestb_local_.close.left)
14849 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
14850 ffestb_local_.close.context,
14851 (ffeexprCallback) ffestb_R9076_);
14852 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14853 ffestb_local_.close.context,
14854 (ffeexprCallback) ffestb_R9076_);
14860 ffestb_subr_kill_close_ ();
14861 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14862 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14865 /* ffestb_R9076_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS expr
14867 (ffestb_R9076_) // to expression handler
14869 Handle COMMA or CLOSE_PAREN here. */
14871 static ffelexHandler
14872 ffestb_R9076_ (ffelexToken ft, ffebld expr, ffelexToken t)
14874 switch (ffelex_token_type (t))
14876 case FFELEX_typeCOMMA:
14877 case FFELEX_typeCLOSE_PAREN:
14880 ffestp_file.close.close_spec[ffestb_local_.close.ix].value_present
14882 ffestp_file.close.close_spec[ffestb_local_.close.ix].value
14883 = ffelex_token_use (ft);
14884 ffestp_file.close.close_spec[ffestb_local_.close.ix].u.expr = expr;
14885 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
14886 return (ffelexHandler) ffestb_R9074_;
14887 return (ffelexHandler) ffestb_R9079_;
14893 ffestb_subr_kill_close_ ();
14894 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14895 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14898 /* ffestb_R9077_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS
14900 return ffestb_R9077_; // to lexer
14902 Handle NUMBER for label here. */
14904 static ffelexHandler
14905 ffestb_R9077_ (ffelexToken t)
14907 switch (ffelex_token_type (t))
14909 case FFELEX_typeNUMBER:
14910 ffestp_file.close.close_spec[ffestb_local_.close.ix].value_present
14912 ffestp_file.close.close_spec[ffestb_local_.close.ix].value
14913 = ffelex_token_use (t);
14914 return (ffelexHandler) ffestb_R9078_;
14920 ffestb_subr_kill_close_ ();
14921 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14922 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14925 /* ffestb_R9078_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS NUMBER
14927 return ffestb_R9078_; // to lexer
14929 Handle COMMA or CLOSE_PAREN here. */
14931 static ffelexHandler
14932 ffestb_R9078_ (ffelexToken t)
14934 switch (ffelex_token_type (t))
14936 case FFELEX_typeCOMMA:
14937 return (ffelexHandler) ffestb_R9074_;
14939 case FFELEX_typeCLOSE_PAREN:
14940 return (ffelexHandler) ffestb_R9079_;
14946 ffestb_subr_kill_close_ ();
14947 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14948 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14951 /* ffestb_R9079_ -- "CLOSE" OPEN_PAREN ... CLOSE_PAREN
14953 return ffestb_R9079_; // to lexer
14955 Handle EOS or SEMICOLON here. */
14957 static ffelexHandler
14958 ffestb_R9079_ (ffelexToken t)
14960 switch (ffelex_token_type (t))
14962 case FFELEX_typeEOS:
14963 case FFELEX_typeSEMICOLON:
14964 ffesta_confirmed ();
14965 if (!ffesta_is_inhibited ())
14967 ffestb_subr_kill_close_ ();
14968 return (ffelexHandler) ffesta_zero (t);
14974 ffestb_subr_kill_close_ ();
14975 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14976 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14979 /* ffestb_R909 -- Parse the READ statement
14981 return ffestb_R909; // to lexer
14983 Make sure the statement has a valid form for the READ
14984 statement. If it does, implement the statement. */
14987 ffestb_R909 (ffelexToken t)
14989 ffelexHandler next;
14992 switch (ffelex_token_type (ffesta_tokens[0]))
14994 case FFELEX_typeNAME:
14995 if (ffesta_first_kw != FFESTR_firstREAD)
14996 goto bad_0; /* :::::::::::::::::::: */
14997 switch (ffelex_token_type (t))
14999 case FFELEX_typeCOMMA:
15000 case FFELEX_typeCOLONCOLON:
15001 case FFELEX_typeEOS:
15002 case FFELEX_typeSEMICOLON:
15003 ffesta_confirmed (); /* Error, but clearly intended. */
15004 goto bad_1; /* :::::::::::::::::::: */
15006 case FFELEX_typeEQUALS:
15007 case FFELEX_typePOINTS:
15008 case FFELEX_typeCOLON:
15009 goto bad_1; /* :::::::::::::::::::: */
15011 case FFELEX_typeNAME:
15012 case FFELEX_typeNUMBER:
15013 ffesta_confirmed ();
15016 case FFELEX_typeOPEN_PAREN:
15017 for (ix = 0; ix < FFESTP_readix; ++ix)
15018 ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE;
15019 ffesta_tokens[1] = ffelex_token_use (t);
15020 return (ffelexHandler) ffestb_R9092_;
15026 for (ix = 0; ix < FFESTP_readix; ++ix)
15027 ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE;
15028 return (ffelexHandler) (*((ffelexHandler)
15029 ffeexpr_rhs (ffesta_output_pool,
15030 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9091_)))
15033 case FFELEX_typeNAMES:
15034 if (ffesta_first_kw != FFESTR_firstREAD)
15035 goto bad_0; /* :::::::::::::::::::: */
15036 switch (ffelex_token_type (t))
15038 case FFELEX_typeEOS:
15039 case FFELEX_typeSEMICOLON:
15040 case FFELEX_typeCOMMA:
15041 ffesta_confirmed ();
15042 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREAD)
15044 goto bad_1; /* :::::::::::::::::::: */
15046 case FFELEX_typeCOLONCOLON:
15047 ffesta_confirmed (); /* Error, but clearly intended. */
15048 goto bad_1; /* :::::::::::::::::::: */
15050 case FFELEX_typeEQUALS:
15051 case FFELEX_typePOINTS:
15052 case FFELEX_typeCOLON:
15053 goto bad_1; /* :::::::::::::::::::: */
15055 case FFELEX_typeOPEN_PAREN:
15056 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREAD)
15059 for (ix = 0; ix < FFESTP_readix; ++ix)
15060 ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE;
15061 ffesta_tokens[1] = ffelex_token_use (t);
15062 return (ffelexHandler) ffestb_R9092_;
15067 for (ix = 0; ix < FFESTP_readix; ++ix)
15068 ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE;
15069 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15070 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9091_);
15071 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
15072 FFESTR_firstlREAD);
15074 return (ffelexHandler) ffelex_swallow_tokens (t,
15075 (ffelexHandler) ffesta_zero);
15076 return (ffelexHandler) (*next) (t);
15079 goto bad_0; /* :::::::::::::::::::: */
15082 bad_0: /* :::::::::::::::::::: */
15083 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", ffesta_tokens[0]);
15084 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15086 bad_1: /* :::::::::::::::::::: */
15087 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15088 return (ffelexHandler) ffelex_swallow_tokens (t,
15089 (ffelexHandler) ffesta_zero); /* Invalid second token. */
15092 /* ffestb_R9091_ -- "READ" expr
15094 (ffestb_R9091_) // to expression handler
15096 Make sure the next token is a COMMA or EOS/SEMICOLON. */
15098 static ffelexHandler
15099 ffestb_R9091_ (ffelexToken ft, ffebld expr, ffelexToken t)
15101 switch (ffelex_token_type (t))
15103 case FFELEX_typeEOS:
15104 case FFELEX_typeSEMICOLON:
15105 case FFELEX_typeCOMMA:
15106 ffesta_confirmed ();
15107 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present
15109 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE;
15110 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE;
15111 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label
15113 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value
15114 = ffelex_token_use (ft);
15115 ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr;
15116 if (!ffesta_is_inhibited ())
15117 ffestc_R909_start (TRUE);
15118 ffestb_subr_kill_read_ ();
15119 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15120 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
15121 ffestc_context_iolist (),
15122 (ffeexprCallback) ffestb_R90915_);
15123 if (!ffesta_is_inhibited ())
15124 ffestc_R909_finish ();
15125 return (ffelexHandler) ffesta_zero (t);
15131 ffestb_subr_kill_read_ ();
15132 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15133 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15136 /* ffestb_R9092_ -- "READ" OPEN_PAREN
15138 return ffestb_R9092_; // to lexer
15140 Handle expr construct (not NAME=expr construct) here. */
15142 static ffelexHandler
15143 ffestb_R9092_ (ffelexToken t)
15146 ffelexHandler next;
15148 switch (ffelex_token_type (t))
15150 case FFELEX_typeNAME:
15151 ffesta_tokens[2] = ffelex_token_use (t);
15152 return (ffelexHandler) ffestb_R9093_;
15155 nt = ffesta_tokens[1];
15156 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15157 FFEEXPR_contextFILEUNITAMBIG, (ffeexprCallback) ffestb_R9094_)))
15159 ffelex_token_kill (nt);
15160 return (ffelexHandler) (*next) (t);
15164 /* ffestb_R9093_ -- "READ" OPEN_PAREN NAME
15166 return ffestb_R9093_; // to lexer
15168 If EQUALS here, go to states that handle it. Else, send NAME and this
15169 token thru expression handler. */
15171 static ffelexHandler
15172 ffestb_R9093_ (ffelexToken t)
15174 ffelexHandler next;
15178 switch (ffelex_token_type (t))
15180 case FFELEX_typeEQUALS:
15181 ffelex_token_kill (ffesta_tokens[1]);
15182 nt = ffesta_tokens[2];
15183 next = (ffelexHandler) ffestb_R9098_ (nt);
15184 ffelex_token_kill (nt);
15185 return (ffelexHandler) (*next) (t);
15188 nt = ffesta_tokens[1];
15189 ot = ffesta_tokens[2];
15190 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15191 FFEEXPR_contextFILEUNITAMBIG, (ffeexprCallback) ffestb_R9094_)))
15193 ffelex_token_kill (nt);
15194 next = (ffelexHandler) (*next) (ot);
15195 ffelex_token_kill (ot);
15196 return (ffelexHandler) (*next) (t);
15200 /* ffestb_R9094_ -- "READ" OPEN_PAREN expr [CLOSE_PAREN]
15202 (ffestb_R9094_) // to expression handler
15204 Handle COMMA or EOS/SEMICOLON here.
15207 Use new ffeexpr mechanism whereby the expr is encased in an opITEM if
15208 ffeexpr decided it was an item in a control list (hence a unit
15209 specifier), or a format specifier otherwise. */
15211 static ffelexHandler
15212 ffestb_R9094_ (ffelexToken ft, ffebld expr, ffelexToken t)
15215 goto bad; /* :::::::::::::::::::: */
15217 if (ffebld_op (expr) != FFEBLD_opITEM)
15219 switch (ffelex_token_type (t))
15221 case FFELEX_typeCOMMA:
15222 case FFELEX_typeEOS:
15223 case FFELEX_typeSEMICOLON:
15224 ffesta_confirmed ();
15225 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present
15227 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE;
15228 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE;
15229 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label
15231 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value
15232 = ffelex_token_use (ft);
15233 ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr;
15234 if (!ffesta_is_inhibited ())
15235 ffestc_R909_start (TRUE);
15236 ffestb_subr_kill_read_ ();
15237 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15238 return (ffelexHandler)
15239 ffeexpr_lhs (ffesta_output_pool,
15240 ffestc_context_iolist (),
15241 (ffeexprCallback) ffestb_R90915_);
15242 if (!ffesta_is_inhibited ())
15243 ffestc_R909_finish ();
15244 return (ffelexHandler) ffesta_zero (t);
15247 goto bad; /* :::::::::::::::::::: */
15251 expr = ffebld_head (expr);
15254 goto bad; /* :::::::::::::::::::: */
15256 switch (ffelex_token_type (t))
15258 case FFELEX_typeCOMMA:
15259 case FFELEX_typeCLOSE_PAREN:
15260 ffestp_file.read.read_spec[FFESTP_readixUNIT].kw_or_val_present
15262 ffestp_file.read.read_spec[FFESTP_readixUNIT].kw_present = FALSE;
15263 ffestp_file.read.read_spec[FFESTP_readixUNIT].value_present = TRUE;
15264 ffestp_file.read.read_spec[FFESTP_readixUNIT].value_is_label
15266 ffestp_file.read.read_spec[FFESTP_readixUNIT].value
15267 = ffelex_token_use (ft);
15268 ffestp_file.read.read_spec[FFESTP_readixUNIT].u.expr = expr;
15269 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15270 return (ffelexHandler) ffestb_R9095_;
15271 return (ffelexHandler) ffestb_R90913_;
15277 bad: /* :::::::::::::::::::: */
15278 ffestb_subr_kill_read_ ();
15279 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15280 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15283 /* ffestb_R9095_ -- "READ" OPEN_PAREN expr COMMA
15285 return ffestb_R9095_; // to lexer
15287 Handle expr construct (not NAME=expr construct) here. */
15289 static ffelexHandler
15290 ffestb_R9095_ (ffelexToken t)
15292 switch (ffelex_token_type (t))
15294 case FFELEX_typeNAME:
15295 ffesta_tokens[1] = ffelex_token_use (t);
15296 return (ffelexHandler) ffestb_R9096_;
15299 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15300 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9097_)))
15305 /* ffestb_R9096_ -- "READ" OPEN_PAREN expr COMMA NAME
15307 return ffestb_R9096_; // to lexer
15309 If EQUALS here, go to states that handle it. Else, send NAME and this
15310 token thru expression handler. */
15312 static ffelexHandler
15313 ffestb_R9096_ (ffelexToken t)
15315 ffelexHandler next;
15318 switch (ffelex_token_type (t))
15320 case FFELEX_typeEQUALS:
15321 nt = ffesta_tokens[1];
15322 next = (ffelexHandler) ffestb_R9098_ (nt);
15323 ffelex_token_kill (nt);
15324 return (ffelexHandler) (*next) (t);
15327 nt = ffesta_tokens[1];
15328 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15329 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9097_)))
15331 ffelex_token_kill (nt);
15332 return (ffelexHandler) (*next) (t);
15336 /* ffestb_R9097_ -- "READ" OPEN_PAREN expr COMMA expr
15338 (ffestb_R9097_) // to expression handler
15340 Handle COMMA or CLOSE_PAREN here. */
15342 static ffelexHandler
15343 ffestb_R9097_ (ffelexToken ft, ffebld expr, ffelexToken t)
15345 switch (ffelex_token_type (t))
15347 case FFELEX_typeCOMMA:
15348 case FFELEX_typeCLOSE_PAREN:
15349 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present
15351 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE;
15352 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE;
15353 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label
15355 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value
15356 = ffelex_token_use (ft);
15357 ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr;
15358 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15359 return (ffelexHandler) ffestb_R9098_;
15360 return (ffelexHandler) ffestb_R90913_;
15366 ffestb_subr_kill_read_ ();
15367 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15368 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15371 /* ffestb_R9098_ -- "READ" OPEN_PAREN [external-file-unit COMMA [format
15374 return ffestb_R9098_; // to lexer
15376 Handle expr construct (not NAME=expr construct) here. */
15378 static ffelexHandler
15379 ffestb_R9098_ (ffelexToken t)
15383 ffestb_local_.read.label = FALSE;
15385 switch (ffelex_token_type (t))
15387 case FFELEX_typeNAME:
15388 kw = ffestr_genio (t);
15391 case FFESTR_genioADVANCE:
15392 ffestb_local_.read.ix = FFESTP_readixADVANCE;
15393 ffestb_local_.read.left = FALSE;
15394 ffestb_local_.read.context = FFEEXPR_contextFILEDFCHAR;
15397 case FFESTR_genioEOR:
15398 ffestb_local_.read.ix = FFESTP_readixEOR;
15399 ffestb_local_.read.label = TRUE;
15402 case FFESTR_genioERR:
15403 ffestb_local_.read.ix = FFESTP_readixERR;
15404 ffestb_local_.read.label = TRUE;
15407 case FFESTR_genioEND:
15408 ffestb_local_.read.ix = FFESTP_readixEND;
15409 ffestb_local_.read.label = TRUE;
15412 case FFESTR_genioFMT:
15413 ffestb_local_.read.ix = FFESTP_readixFORMAT;
15414 ffestb_local_.read.left = FALSE;
15415 ffestb_local_.read.context = FFEEXPR_contextFILEFORMAT;
15418 case FFESTR_genioIOSTAT:
15419 ffestb_local_.read.ix = FFESTP_readixIOSTAT;
15420 ffestb_local_.read.left = TRUE;
15421 ffestb_local_.read.context = FFEEXPR_contextFILEINT;
15424 case FFESTR_genioKEY:
15425 case FFESTR_genioKEYEQ:
15426 ffestb_local_.read.ix = FFESTP_readixKEYEQ;
15427 ffestb_local_.read.left = FALSE;
15428 ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR;
15431 case FFESTR_genioKEYGE:
15432 ffestb_local_.read.ix = FFESTP_readixKEYGE;
15433 ffestb_local_.read.left = FALSE;
15434 ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR;
15437 case FFESTR_genioKEYGT:
15438 ffestb_local_.read.ix = FFESTP_readixKEYGT;
15439 ffestb_local_.read.left = FALSE;
15440 ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR;
15443 case FFESTR_genioKEYID:
15444 ffestb_local_.read.ix = FFESTP_readixKEYID;
15445 ffestb_local_.read.left = FALSE;
15446 ffestb_local_.read.context = FFEEXPR_contextFILENUM;
15449 case FFESTR_genioNML:
15450 ffestb_local_.read.ix = FFESTP_readixFORMAT;
15451 ffestb_local_.read.left = TRUE;
15452 ffestb_local_.read.context = FFEEXPR_contextFILENAMELIST;
15455 case FFESTR_genioNULLS:
15456 ffestb_local_.read.ix = FFESTP_readixNULLS;
15457 ffestb_local_.read.left = TRUE;
15458 ffestb_local_.read.context = FFEEXPR_contextFILEINT;
15461 case FFESTR_genioREC:
15462 ffestb_local_.read.ix = FFESTP_readixREC;
15463 ffestb_local_.read.left = FALSE;
15464 ffestb_local_.read.context = FFEEXPR_contextFILENUM;
15467 case FFESTR_genioSIZE:
15468 ffestb_local_.read.ix = FFESTP_readixSIZE;
15469 ffestb_local_.read.left = TRUE;
15470 ffestb_local_.read.context = FFEEXPR_contextFILEINT;
15473 case FFESTR_genioUNIT:
15474 ffestb_local_.read.ix = FFESTP_readixUNIT;
15475 ffestb_local_.read.left = FALSE;
15476 ffestb_local_.read.context = FFEEXPR_contextFILEUNIT;
15480 goto bad; /* :::::::::::::::::::: */
15482 if (ffestp_file.read.read_spec[ffestb_local_.read.ix]
15483 .kw_or_val_present)
15484 break; /* Can't specify a keyword twice! */
15485 ffestp_file.read.read_spec[ffestb_local_.read.ix]
15486 .kw_or_val_present = TRUE;
15487 ffestp_file.read.read_spec[ffestb_local_.read.ix]
15488 .kw_present = TRUE;
15489 ffestp_file.read.read_spec[ffestb_local_.read.ix]
15490 .value_present = FALSE;
15491 ffestp_file.read.read_spec[ffestb_local_.read.ix].value_is_label
15492 = ffestb_local_.read.label;
15493 ffestp_file.read.read_spec[ffestb_local_.read.ix].kw
15494 = ffelex_token_use (t);
15495 return (ffelexHandler) ffestb_R9099_;
15501 bad: /* :::::::::::::::::::: */
15502 ffestb_subr_kill_read_ ();
15503 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15504 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15507 /* ffestb_R9099_ -- "READ" OPEN_PAREN [external-file-unit COMMA [format
15510 return ffestb_R9099_; // to lexer
15512 Make sure EQUALS here, send next token to expression handler. */
15514 static ffelexHandler
15515 ffestb_R9099_ (ffelexToken t)
15517 switch (ffelex_token_type (t))
15519 case FFELEX_typeEQUALS:
15520 ffesta_confirmed ();
15521 if (ffestb_local_.read.label)
15522 return (ffelexHandler) ffestb_R90911_;
15523 if (ffestb_local_.read.left)
15524 return (ffelexHandler)
15525 ffeexpr_lhs (ffesta_output_pool,
15526 ffestb_local_.read.context,
15527 (ffeexprCallback) ffestb_R90910_);
15528 return (ffelexHandler)
15529 ffeexpr_rhs (ffesta_output_pool,
15530 ffestb_local_.read.context,
15531 (ffeexprCallback) ffestb_R90910_);
15537 ffestb_subr_kill_read_ ();
15538 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15539 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15542 /* ffestb_R90910_ -- "READ" OPEN_PAREN ... NAME EQUALS expr
15544 (ffestb_R90910_) // to expression handler
15546 Handle COMMA or CLOSE_PAREN here. */
15548 static ffelexHandler
15549 ffestb_R90910_ (ffelexToken ft, ffebld expr, ffelexToken t)
15551 switch (ffelex_token_type (t))
15553 case FFELEX_typeCOMMA:
15554 case FFELEX_typeCLOSE_PAREN:
15556 if (ffestb_local_.read.context == FFEEXPR_contextFILEFORMAT)
15557 ffestp_file.read.read_spec[ffestb_local_.read.ix]
15558 .value_is_label = TRUE;
15561 ffestp_file.read.read_spec[ffestb_local_.read.ix].value_present
15563 ffestp_file.read.read_spec[ffestb_local_.read.ix].value
15564 = ffelex_token_use (ft);
15565 ffestp_file.read.read_spec[ffestb_local_.read.ix].u.expr = expr;
15566 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15567 return (ffelexHandler) ffestb_R9098_;
15568 return (ffelexHandler) ffestb_R90913_;
15574 ffestb_subr_kill_read_ ();
15575 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15576 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15579 /* ffestb_R90911_ -- "READ" OPEN_PAREN ... NAME EQUALS
15581 return ffestb_R90911_; // to lexer
15583 Handle NUMBER for label here. */
15585 static ffelexHandler
15586 ffestb_R90911_ (ffelexToken t)
15588 switch (ffelex_token_type (t))
15590 case FFELEX_typeNUMBER:
15591 ffestp_file.read.read_spec[ffestb_local_.read.ix].value_present
15593 ffestp_file.read.read_spec[ffestb_local_.read.ix].value
15594 = ffelex_token_use (t);
15595 return (ffelexHandler) ffestb_R90912_;
15601 ffestb_subr_kill_read_ ();
15602 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15603 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15606 /* ffestb_R90912_ -- "READ" OPEN_PAREN ... NAME EQUALS NUMBER
15608 return ffestb_R90912_; // to lexer
15610 Handle COMMA or CLOSE_PAREN here. */
15612 static ffelexHandler
15613 ffestb_R90912_ (ffelexToken t)
15615 switch (ffelex_token_type (t))
15617 case FFELEX_typeCOMMA:
15618 return (ffelexHandler) ffestb_R9098_;
15620 case FFELEX_typeCLOSE_PAREN:
15621 return (ffelexHandler) ffestb_R90913_;
15627 ffestb_subr_kill_read_ ();
15628 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15629 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15632 /* ffestb_R90913_ -- "READ" OPEN_PAREN ... CLOSE_PAREN
15634 return ffestb_R90913_; // to lexer
15636 Handle EOS or SEMICOLON here.
15639 Fix to allow implied-DO construct here (OPEN_PAREN) -- actually,
15640 don't presume knowledge of what an initial token in an lhs context
15641 is going to be, let ffeexpr_lhs handle that as much as possible. */
15643 static ffelexHandler
15644 ffestb_R90913_ (ffelexToken t)
15646 switch (ffelex_token_type (t))
15648 case FFELEX_typeEOS:
15649 case FFELEX_typeSEMICOLON:
15650 ffesta_confirmed ();
15651 if (!ffesta_is_inhibited ())
15653 ffestc_R909_start (FALSE);
15654 ffestc_R909_finish ();
15656 ffestb_subr_kill_read_ ();
15657 return (ffelexHandler) ffesta_zero (t);
15660 ffesta_confirmed ();
15661 /* Fall through. */
15662 case FFELEX_typeOPEN_PAREN: /* Could still be assignment!! */
15666 /* If token isn't NAME or OPEN_PAREN, ffeexpr_lhs will ultimately whine
15667 about it, so leave it up to that code. */
15669 /* EXTENSION: Allow an optional preceding COMMA here if not pedantic. (f2c
15670 provides this extension, as do other compilers, supposedly.) */
15672 if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA))
15673 return (ffelexHandler)
15674 ffeexpr_lhs (ffesta_output_pool,
15675 ffestc_context_iolist (),
15676 (ffeexprCallback) ffestb_R90914_);
15678 return (ffelexHandler) (*((ffelexHandler)
15679 ffeexpr_lhs (ffesta_output_pool,
15680 ffestc_context_iolist (),
15681 (ffeexprCallback) ffestb_R90914_)))
15685 /* ffestb_R90914_ -- "READ(...)" expr
15687 (ffestb_R90914_) // to expression handler
15689 Handle COMMA or EOS/SEMICOLON here. */
15691 static ffelexHandler
15692 ffestb_R90914_ (ffelexToken ft, ffebld expr, ffelexToken t)
15694 switch (ffelex_token_type (t))
15696 case FFELEX_typeCOMMA:
15700 ffesta_confirmed ();
15701 if (!ffesta_is_inhibited ())
15702 ffestc_R909_start (FALSE);
15703 ffestb_subr_kill_read_ ();
15705 if (!ffesta_is_inhibited ())
15706 ffestc_R909_item (expr, ft);
15707 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
15708 ffestc_context_iolist (),
15709 (ffeexprCallback) ffestb_R90915_);
15711 case FFELEX_typeEOS:
15712 case FFELEX_typeSEMICOLON:
15716 ffesta_confirmed ();
15717 if (!ffesta_is_inhibited ())
15718 ffestc_R909_start (FALSE);
15719 ffestb_subr_kill_read_ ();
15721 if (!ffesta_is_inhibited ())
15723 ffestc_R909_item (expr, ft);
15724 ffestc_R909_finish ();
15726 return (ffelexHandler) ffesta_zero (t);
15732 ffestb_subr_kill_read_ ();
15733 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15734 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15737 /* ffestb_R90915_ -- "READ(...)" expr COMMA expr
15739 (ffestb_R90915_) // to expression handler
15741 Handle COMMA or EOS/SEMICOLON here. */
15743 static ffelexHandler
15744 ffestb_R90915_ (ffelexToken ft, ffebld expr, ffelexToken t)
15746 switch (ffelex_token_type (t))
15748 case FFELEX_typeCOMMA:
15751 if (!ffesta_is_inhibited ())
15752 ffestc_R909_item (expr, ft);
15753 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
15754 ffestc_context_iolist (),
15755 (ffeexprCallback) ffestb_R90915_);
15757 case FFELEX_typeEOS:
15758 case FFELEX_typeSEMICOLON:
15761 if (!ffesta_is_inhibited ())
15763 ffestc_R909_item (expr, ft);
15764 ffestc_R909_finish ();
15766 return (ffelexHandler) ffesta_zero (t);
15772 if (!ffesta_is_inhibited ())
15773 ffestc_R909_finish ();
15774 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15775 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15778 /* ffestb_R910 -- Parse the WRITE statement
15780 return ffestb_R910; // to lexer
15782 Make sure the statement has a valid form for the WRITE
15783 statement. If it does, implement the statement. */
15786 ffestb_R910 (ffelexToken t)
15790 switch (ffelex_token_type (ffesta_tokens[0]))
15792 case FFELEX_typeNAME:
15793 if (ffesta_first_kw != FFESTR_firstWRITE)
15794 goto bad_0; /* :::::::::::::::::::: */
15795 switch (ffelex_token_type (t))
15797 case FFELEX_typeCOMMA:
15798 case FFELEX_typeCOLONCOLON:
15799 case FFELEX_typeEOS:
15800 case FFELEX_typeSEMICOLON:
15801 case FFELEX_typeNAME:
15802 case FFELEX_typeNUMBER:
15803 ffesta_confirmed (); /* Error, but clearly intended. */
15804 goto bad_1; /* :::::::::::::::::::: */
15807 goto bad_1; /* :::::::::::::::::::: */
15809 case FFELEX_typeOPEN_PAREN:
15810 for (ix = 0; ix < FFESTP_writeix; ++ix)
15811 ffestp_file.write.write_spec[ix].kw_or_val_present = FALSE;
15812 return (ffelexHandler) ffestb_R9101_;
15815 case FFELEX_typeNAMES:
15816 if (ffesta_first_kw != FFESTR_firstWRITE)
15817 goto bad_0; /* :::::::::::::::::::: */
15818 switch (ffelex_token_type (t))
15820 case FFELEX_typeEOS:
15821 case FFELEX_typeSEMICOLON:
15822 case FFELEX_typeCOMMA:
15823 case FFELEX_typeCOLONCOLON:
15824 ffesta_confirmed (); /* Error, but clearly intended. */
15825 goto bad_1; /* :::::::::::::::::::: */
15828 goto bad_1; /* :::::::::::::::::::: */
15830 case FFELEX_typeOPEN_PAREN:
15831 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlWRITE)
15832 goto bad_0; /* :::::::::::::::::::: */
15834 for (ix = 0; ix < FFESTP_writeix; ++ix)
15835 ffestp_file.write.write_spec[ix].kw_or_val_present = FALSE;
15836 return (ffelexHandler) ffestb_R9101_;
15840 goto bad_0; /* :::::::::::::::::::: */
15843 bad_0: /* :::::::::::::::::::: */
15844 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", ffesta_tokens[0]);
15845 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15847 bad_1: /* :::::::::::::::::::: */
15848 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
15849 return (ffelexHandler) ffelex_swallow_tokens (t,
15850 (ffelexHandler) ffesta_zero); /* Invalid second token. */
15853 /* ffestb_R9101_ -- "WRITE" OPEN_PAREN
15855 return ffestb_R9101_; // to lexer
15857 Handle expr construct (not NAME=expr construct) here. */
15859 static ffelexHandler
15860 ffestb_R9101_ (ffelexToken t)
15862 switch (ffelex_token_type (t))
15864 case FFELEX_typeNAME:
15865 ffesta_tokens[1] = ffelex_token_use (t);
15866 return (ffelexHandler) ffestb_R9102_;
15869 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15870 FFEEXPR_contextFILEUNIT, (ffeexprCallback) ffestb_R9103_)))
15875 /* ffestb_R9102_ -- "WRITE" OPEN_PAREN NAME
15877 return ffestb_R9102_; // to lexer
15879 If EQUALS here, go to states that handle it. Else, send NAME and this
15880 token thru expression handler. */
15882 static ffelexHandler
15883 ffestb_R9102_ (ffelexToken t)
15885 ffelexHandler next;
15888 switch (ffelex_token_type (t))
15890 case FFELEX_typeEQUALS:
15891 nt = ffesta_tokens[1];
15892 next = (ffelexHandler) ffestb_R9107_ (nt);
15893 ffelex_token_kill (nt);
15894 return (ffelexHandler) (*next) (t);
15897 nt = ffesta_tokens[1];
15898 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15899 FFEEXPR_contextFILEUNIT, (ffeexprCallback) ffestb_R9103_)))
15901 ffelex_token_kill (nt);
15902 return (ffelexHandler) (*next) (t);
15906 /* ffestb_R9103_ -- "WRITE" OPEN_PAREN expr [CLOSE_PAREN]
15908 (ffestb_R9103_) // to expression handler
15910 Handle COMMA or EOS/SEMICOLON here. */
15912 static ffelexHandler
15913 ffestb_R9103_ (ffelexToken ft, ffebld expr, ffelexToken t)
15915 switch (ffelex_token_type (t))
15917 case FFELEX_typeCOMMA:
15918 case FFELEX_typeCLOSE_PAREN:
15921 ffestp_file.write.write_spec[FFESTP_writeixUNIT].kw_or_val_present
15923 ffestp_file.write.write_spec[FFESTP_writeixUNIT].kw_present = FALSE;
15924 ffestp_file.write.write_spec[FFESTP_writeixUNIT].value_present = TRUE;
15925 ffestp_file.write.write_spec[FFESTP_writeixUNIT].value_is_label
15927 ffestp_file.write.write_spec[FFESTP_writeixUNIT].value
15928 = ffelex_token_use (ft);
15929 ffestp_file.write.write_spec[FFESTP_writeixUNIT].u.expr = expr;
15930 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15931 return (ffelexHandler) ffestb_R9104_;
15932 return (ffelexHandler) ffestb_R91012_;
15938 ffestb_subr_kill_write_ ();
15939 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
15940 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15943 /* ffestb_R9104_ -- "WRITE" OPEN_PAREN expr COMMA
15945 return ffestb_R9104_; // to lexer
15947 Handle expr construct (not NAME=expr construct) here. */
15949 static ffelexHandler
15950 ffestb_R9104_ (ffelexToken t)
15952 switch (ffelex_token_type (t))
15954 case FFELEX_typeNAME:
15955 ffesta_tokens[1] = ffelex_token_use (t);
15956 return (ffelexHandler) ffestb_R9105_;
15959 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15960 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9106_)))
15965 /* ffestb_R9105_ -- "WRITE" OPEN_PAREN expr COMMA NAME
15967 return ffestb_R9105_; // to lexer
15969 If EQUALS here, go to states that handle it. Else, send NAME and this
15970 token thru expression handler. */
15972 static ffelexHandler
15973 ffestb_R9105_ (ffelexToken t)
15975 ffelexHandler next;
15978 switch (ffelex_token_type (t))
15980 case FFELEX_typeEQUALS:
15981 nt = ffesta_tokens[1];
15982 next = (ffelexHandler) ffestb_R9107_ (nt);
15983 ffelex_token_kill (nt);
15984 return (ffelexHandler) (*next) (t);
15987 nt = ffesta_tokens[1];
15988 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15989 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9106_)))
15991 ffelex_token_kill (nt);
15992 return (ffelexHandler) (*next) (t);
15996 /* ffestb_R9106_ -- "WRITE" OPEN_PAREN expr COMMA expr
15998 (ffestb_R9106_) // to expression handler
16000 Handle COMMA or CLOSE_PAREN here. */
16002 static ffelexHandler
16003 ffestb_R9106_ (ffelexToken ft, ffebld expr, ffelexToken t)
16005 switch (ffelex_token_type (t))
16007 case FFELEX_typeCOMMA:
16008 case FFELEX_typeCLOSE_PAREN:
16009 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].kw_or_val_present
16011 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].kw_present = FALSE;
16012 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value_present = TRUE;
16013 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value_is_label
16015 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value
16016 = ffelex_token_use (ft);
16017 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].u.expr = expr;
16018 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
16019 return (ffelexHandler) ffestb_R9107_;
16020 return (ffelexHandler) ffestb_R91012_;
16026 ffestb_subr_kill_write_ ();
16027 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16028 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16031 /* ffestb_R9107_ -- "WRITE" OPEN_PAREN [external-file-unit COMMA [format
16034 return ffestb_R9107_; // to lexer
16036 Handle expr construct (not NAME=expr construct) here. */
16038 static ffelexHandler
16039 ffestb_R9107_ (ffelexToken t)
16043 ffestb_local_.write.label = FALSE;
16045 switch (ffelex_token_type (t))
16047 case FFELEX_typeNAME:
16048 kw = ffestr_genio (t);
16051 case FFESTR_genioADVANCE:
16052 ffestb_local_.write.ix = FFESTP_writeixADVANCE;
16053 ffestb_local_.write.left = FALSE;
16054 ffestb_local_.write.context = FFEEXPR_contextFILEDFCHAR;
16057 case FFESTR_genioEOR:
16058 ffestb_local_.write.ix = FFESTP_writeixEOR;
16059 ffestb_local_.write.label = TRUE;
16062 case FFESTR_genioERR:
16063 ffestb_local_.write.ix = FFESTP_writeixERR;
16064 ffestb_local_.write.label = TRUE;
16067 case FFESTR_genioFMT:
16068 ffestb_local_.write.ix = FFESTP_writeixFORMAT;
16069 ffestb_local_.write.left = FALSE;
16070 ffestb_local_.write.context = FFEEXPR_contextFILEFORMAT;
16073 case FFESTR_genioIOSTAT:
16074 ffestb_local_.write.ix = FFESTP_writeixIOSTAT;
16075 ffestb_local_.write.left = TRUE;
16076 ffestb_local_.write.context = FFEEXPR_contextFILEINT;
16079 case FFESTR_genioNML:
16080 ffestb_local_.write.ix = FFESTP_writeixFORMAT;
16081 ffestb_local_.write.left = TRUE;
16082 ffestb_local_.write.context = FFEEXPR_contextFILENAMELIST;
16085 case FFESTR_genioREC:
16086 ffestb_local_.write.ix = FFESTP_writeixREC;
16087 ffestb_local_.write.left = FALSE;
16088 ffestb_local_.write.context = FFEEXPR_contextFILENUM;
16091 case FFESTR_genioUNIT:
16092 ffestb_local_.write.ix = FFESTP_writeixUNIT;
16093 ffestb_local_.write.left = FALSE;
16094 ffestb_local_.write.context = FFEEXPR_contextFILEUNIT;
16098 goto bad; /* :::::::::::::::::::: */
16100 if (ffestp_file.write.write_spec[ffestb_local_.write.ix]
16101 .kw_or_val_present)
16102 break; /* Can't specify a keyword twice! */
16103 ffestp_file.write.write_spec[ffestb_local_.write.ix]
16104 .kw_or_val_present = TRUE;
16105 ffestp_file.write.write_spec[ffestb_local_.write.ix]
16106 .kw_present = TRUE;
16107 ffestp_file.write.write_spec[ffestb_local_.write.ix]
16108 .value_present = FALSE;
16109 ffestp_file.write.write_spec[ffestb_local_.write.ix].value_is_label
16110 = ffestb_local_.write.label;
16111 ffestp_file.write.write_spec[ffestb_local_.write.ix].kw
16112 = ffelex_token_use (t);
16113 return (ffelexHandler) ffestb_R9108_;
16119 bad: /* :::::::::::::::::::: */
16120 ffestb_subr_kill_write_ ();
16121 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16122 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16125 /* ffestb_R9108_ -- "WRITE" OPEN_PAREN [external-file-unit COMMA [format
16128 return ffestb_R9108_; // to lexer
16130 Make sure EQUALS here, send next token to expression handler. */
16132 static ffelexHandler
16133 ffestb_R9108_ (ffelexToken t)
16135 switch (ffelex_token_type (t))
16137 case FFELEX_typeEQUALS:
16138 ffesta_confirmed ();
16139 if (ffestb_local_.write.label)
16140 return (ffelexHandler) ffestb_R91010_;
16141 if (ffestb_local_.write.left)
16142 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
16143 ffestb_local_.write.context,
16144 (ffeexprCallback) ffestb_R9109_);
16145 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16146 ffestb_local_.write.context,
16147 (ffeexprCallback) ffestb_R9109_);
16153 ffestb_subr_kill_write_ ();
16154 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16155 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16158 /* ffestb_R9109_ -- "WRITE" OPEN_PAREN ... NAME EQUALS expr
16160 (ffestb_R9109_) // to expression handler
16162 Handle COMMA or CLOSE_PAREN here. */
16164 static ffelexHandler
16165 ffestb_R9109_ (ffelexToken ft, ffebld expr, ffelexToken t)
16167 switch (ffelex_token_type (t))
16169 case FFELEX_typeCOMMA:
16170 case FFELEX_typeCLOSE_PAREN:
16172 if (ffestb_local_.write.context == FFEEXPR_contextFILEFORMAT)
16173 ffestp_file.write.write_spec[ffestb_local_.write.ix]
16174 .value_is_label = TRUE;
16177 ffestp_file.write.write_spec[ffestb_local_.write.ix].value_present
16179 ffestp_file.write.write_spec[ffestb_local_.write.ix].value
16180 = ffelex_token_use (ft);
16181 ffestp_file.write.write_spec[ffestb_local_.write.ix].u.expr = expr;
16182 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
16183 return (ffelexHandler) ffestb_R9107_;
16184 return (ffelexHandler) ffestb_R91012_;
16190 ffestb_subr_kill_write_ ();
16191 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16192 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16195 /* ffestb_R91010_ -- "WRITE" OPEN_PAREN ... NAME EQUALS
16197 return ffestb_R91010_; // to lexer
16199 Handle NUMBER for label here. */
16201 static ffelexHandler
16202 ffestb_R91010_ (ffelexToken t)
16204 switch (ffelex_token_type (t))
16206 case FFELEX_typeNUMBER:
16207 ffestp_file.write.write_spec[ffestb_local_.write.ix].value_present
16209 ffestp_file.write.write_spec[ffestb_local_.write.ix].value
16210 = ffelex_token_use (t);
16211 return (ffelexHandler) ffestb_R91011_;
16217 ffestb_subr_kill_write_ ();
16218 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16219 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16222 /* ffestb_R91011_ -- "WRITE" OPEN_PAREN ... NAME EQUALS NUMBER
16224 return ffestb_R91011_; // to lexer
16226 Handle COMMA or CLOSE_PAREN here. */
16228 static ffelexHandler
16229 ffestb_R91011_ (ffelexToken t)
16231 switch (ffelex_token_type (t))
16233 case FFELEX_typeCOMMA:
16234 return (ffelexHandler) ffestb_R9107_;
16236 case FFELEX_typeCLOSE_PAREN:
16237 return (ffelexHandler) ffestb_R91012_;
16243 ffestb_subr_kill_write_ ();
16244 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16245 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16248 /* ffestb_R91012_ -- "WRITE" OPEN_PAREN ... CLOSE_PAREN
16250 return ffestb_R91012_; // to lexer
16252 Handle EOS or SEMICOLON here. */
16254 static ffelexHandler
16255 ffestb_R91012_ (ffelexToken t)
16257 switch (ffelex_token_type (t))
16259 case FFELEX_typeEOS:
16260 case FFELEX_typeSEMICOLON:
16261 ffesta_confirmed ();
16262 if (!ffesta_is_inhibited ())
16264 ffestc_R910_start ();
16265 ffestc_R910_finish ();
16267 ffestb_subr_kill_write_ ();
16268 return (ffelexHandler) ffesta_zero (t);
16271 ffesta_confirmed ();
16272 /* Fall through. */
16273 case FFELEX_typeOPEN_PAREN: /* Could still be assignment!! */
16275 /* EXTENSION: Allow an optional preceding COMMA here if not pedantic.
16276 (f2c provides this extension, as do other compilers, supposedly.) */
16278 if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA))
16279 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16280 ffestc_context_iolist (), (ffeexprCallback) ffestb_R91013_);
16282 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16283 ffestc_context_iolist (), (ffeexprCallback) ffestb_R91013_)))
16286 case FFELEX_typeEQUALS:
16287 case FFELEX_typePOINTS:
16291 ffestb_subr_kill_write_ ();
16292 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16293 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16296 /* ffestb_R91013_ -- "WRITE(...)" expr
16298 (ffestb_R91013_) // to expression handler
16300 Handle COMMA or EOS/SEMICOLON here. */
16302 static ffelexHandler
16303 ffestb_R91013_ (ffelexToken ft, ffebld expr, ffelexToken t)
16305 switch (ffelex_token_type (t))
16307 case FFELEX_typeCOMMA:
16311 ffesta_confirmed ();
16312 if (!ffesta_is_inhibited ())
16313 ffestc_R910_start ();
16314 ffestb_subr_kill_write_ ();
16316 if (!ffesta_is_inhibited ())
16317 ffestc_R910_item (expr, ft);
16318 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16319 ffestc_context_iolist (), (ffeexprCallback) ffestb_R91014_);
16321 case FFELEX_typeEOS:
16322 case FFELEX_typeSEMICOLON:
16326 ffesta_confirmed ();
16327 if (!ffesta_is_inhibited ())
16328 ffestc_R910_start ();
16329 ffestb_subr_kill_write_ ();
16331 if (!ffesta_is_inhibited ())
16333 ffestc_R910_item (expr, ft);
16334 ffestc_R910_finish ();
16336 return (ffelexHandler) ffesta_zero (t);
16342 ffestb_subr_kill_write_ ();
16343 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16344 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16347 /* ffestb_R91014_ -- "WRITE(...)" expr COMMA expr
16349 (ffestb_R91014_) // to expression handler
16351 Handle COMMA or EOS/SEMICOLON here. */
16353 static ffelexHandler
16354 ffestb_R91014_ (ffelexToken ft, ffebld expr, ffelexToken t)
16356 switch (ffelex_token_type (t))
16358 case FFELEX_typeCOMMA:
16361 if (!ffesta_is_inhibited ())
16362 ffestc_R910_item (expr, ft);
16363 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16364 ffestc_context_iolist (), (ffeexprCallback) ffestb_R91014_);
16366 case FFELEX_typeEOS:
16367 case FFELEX_typeSEMICOLON:
16370 if (!ffesta_is_inhibited ())
16372 ffestc_R910_item (expr, ft);
16373 ffestc_R910_finish ();
16375 return (ffelexHandler) ffesta_zero (t);
16381 if (!ffesta_is_inhibited ())
16382 ffestc_R910_finish ();
16383 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16384 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16387 /* ffestb_R911 -- Parse the PRINT statement
16389 return ffestb_R911; // to lexer
16391 Make sure the statement has a valid form for the PRINT
16392 statement. If it does, implement the statement. */
16395 ffestb_R911 (ffelexToken t)
16397 ffelexHandler next;
16400 switch (ffelex_token_type (ffesta_tokens[0]))
16402 case FFELEX_typeNAME:
16403 if (ffesta_first_kw != FFESTR_firstPRINT)
16404 goto bad_0; /* :::::::::::::::::::: */
16405 switch (ffelex_token_type (t))
16407 case FFELEX_typeCOMMA:
16408 case FFELEX_typeCOLONCOLON:
16409 case FFELEX_typeEOS:
16410 case FFELEX_typeSEMICOLON:
16411 ffesta_confirmed (); /* Error, but clearly intended. */
16412 goto bad_1; /* :::::::::::::::::::: */
16414 case FFELEX_typeEQUALS:
16415 case FFELEX_typePOINTS:
16416 case FFELEX_typeCOLON:
16417 goto bad_1; /* :::::::::::::::::::: */
16419 case FFELEX_typeNAME:
16420 case FFELEX_typeNUMBER:
16421 ffesta_confirmed ();
16428 for (ix = 0; ix < FFESTP_printix; ++ix)
16429 ffestp_file.print.print_spec[ix].kw_or_val_present = FALSE;
16430 return (ffelexHandler) (*((ffelexHandler)
16431 ffeexpr_rhs (ffesta_output_pool,
16432 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9111_)))
16435 case FFELEX_typeNAMES:
16436 if (ffesta_first_kw != FFESTR_firstPRINT)
16437 goto bad_0; /* :::::::::::::::::::: */
16438 switch (ffelex_token_type (t))
16440 case FFELEX_typeEOS:
16441 case FFELEX_typeSEMICOLON:
16442 case FFELEX_typeCOMMA:
16443 ffesta_confirmed ();
16444 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlPRINT)
16446 goto bad_1; /* :::::::::::::::::::: */
16448 case FFELEX_typeCOLONCOLON:
16449 ffesta_confirmed (); /* Error, but clearly intended. */
16450 goto bad_1; /* :::::::::::::::::::: */
16452 case FFELEX_typeEQUALS:
16453 case FFELEX_typePOINTS:
16454 case FFELEX_typeCOLON:
16455 goto bad_1; /* :::::::::::::::::::: */
16460 for (ix = 0; ix < FFESTP_printix; ++ix)
16461 ffestp_file.print.print_spec[ix].kw_or_val_present = FALSE;
16462 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16463 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9111_);
16464 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
16465 FFESTR_firstlPRINT);
16467 return (ffelexHandler) ffelex_swallow_tokens (t,
16468 (ffelexHandler) ffesta_zero);
16469 return (ffelexHandler) (*next) (t);
16472 goto bad_0; /* :::::::::::::::::::: */
16475 bad_0: /* :::::::::::::::::::: */
16476 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", ffesta_tokens[0]);
16477 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16479 bad_1: /* :::::::::::::::::::: */
16480 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t);
16481 return (ffelexHandler) ffelex_swallow_tokens (t,
16482 (ffelexHandler) ffesta_zero); /* Invalid second token. */
16485 /* ffestb_R9111_ -- "PRINT" expr
16487 (ffestb_R9111_) // to expression handler
16489 Make sure the next token is a COMMA or EOS/SEMICOLON. */
16491 static ffelexHandler
16492 ffestb_R9111_ (ffelexToken ft, ffebld expr, ffelexToken t)
16494 switch (ffelex_token_type (t))
16496 case FFELEX_typeEOS:
16497 case FFELEX_typeSEMICOLON:
16498 case FFELEX_typeCOMMA:
16499 ffesta_confirmed ();
16500 ffestp_file.print.print_spec[FFESTP_printixFORMAT].kw_or_val_present
16502 ffestp_file.print.print_spec[FFESTP_printixFORMAT].kw_present = FALSE;
16503 ffestp_file.print.print_spec[FFESTP_printixFORMAT].value_present = TRUE;
16504 ffestp_file.print.print_spec[FFESTP_printixFORMAT].value_is_label
16506 ffestp_file.print.print_spec[FFESTP_printixFORMAT].value
16507 = ffelex_token_use (ft);
16508 ffestp_file.print.print_spec[FFESTP_printixFORMAT].u.expr = expr;
16509 if (!ffesta_is_inhibited ())
16510 ffestc_R911_start ();
16511 ffestb_subr_kill_print_ ();
16512 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
16513 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16514 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R9112_);
16515 if (!ffesta_is_inhibited ())
16516 ffestc_R911_finish ();
16517 return (ffelexHandler) ffesta_zero (t);
16523 ffestb_subr_kill_print_ ();
16524 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t);
16525 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16528 /* ffestb_R9112_ -- "PRINT" expr COMMA expr
16530 (ffestb_R9112_) // to expression handler
16532 Handle COMMA or EOS/SEMICOLON here. */
16534 static ffelexHandler
16535 ffestb_R9112_ (ffelexToken ft, ffebld expr, ffelexToken t)
16537 switch (ffelex_token_type (t))
16539 case FFELEX_typeCOMMA:
16542 if (!ffesta_is_inhibited ())
16543 ffestc_R911_item (expr, ft);
16544 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16545 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R9112_);
16547 case FFELEX_typeEOS:
16548 case FFELEX_typeSEMICOLON:
16551 if (!ffesta_is_inhibited ())
16553 ffestc_R911_item (expr, ft);
16554 ffestc_R911_finish ();
16556 return (ffelexHandler) ffesta_zero (t);
16562 if (!ffesta_is_inhibited ())
16563 ffestc_R911_finish ();
16564 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t);
16565 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16568 /* ffestb_R923 -- Parse an INQUIRE statement
16570 return ffestb_R923; // to lexer
16572 Make sure the statement has a valid form for an INQUIRE statement.
16573 If it does, implement the statement. */
16576 ffestb_R923 (ffelexToken t)
16578 ffestpInquireIx ix;
16580 switch (ffelex_token_type (ffesta_tokens[0]))
16582 case FFELEX_typeNAME:
16583 if (ffesta_first_kw != FFESTR_firstINQUIRE)
16584 goto bad_0; /* :::::::::::::::::::: */
16587 case FFELEX_typeNAMES:
16588 if (ffesta_first_kw != FFESTR_firstINQUIRE)
16589 goto bad_0; /* :::::::::::::::::::: */
16590 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlINQUIRE)
16591 goto bad_0; /* :::::::::::::::::::: */
16595 goto bad_0; /* :::::::::::::::::::: */
16598 switch (ffelex_token_type (t))
16600 case FFELEX_typeOPEN_PAREN:
16603 case FFELEX_typeEOS:
16604 case FFELEX_typeSEMICOLON:
16605 case FFELEX_typeCOMMA:
16606 case FFELEX_typeCOLONCOLON:
16607 ffesta_confirmed (); /* Error, but clearly intended. */
16608 goto bad_1; /* :::::::::::::::::::: */
16611 goto bad_1; /* :::::::::::::::::::: */
16614 for (ix = 0; ix < FFESTP_inquireix; ++ix)
16615 ffestp_file.inquire.inquire_spec[ix].kw_or_val_present = FALSE;
16617 ffestb_local_.inquire.may_be_iolength = TRUE;
16618 return (ffelexHandler) ffestb_R9231_;
16620 bad_0: /* :::::::::::::::::::: */
16621 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", ffesta_tokens[0]);
16622 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16624 bad_1: /* :::::::::::::::::::: */
16625 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
16626 return (ffelexHandler) ffelex_swallow_tokens (t,
16627 (ffelexHandler) ffesta_zero); /* Invalid second token. */
16630 /* ffestb_R9231_ -- "INQUIRE" OPEN_PAREN
16632 return ffestb_R9231_; // to lexer
16634 Handle expr construct (not NAME=expr construct) here. */
16636 static ffelexHandler
16637 ffestb_R9231_ (ffelexToken t)
16639 switch (ffelex_token_type (t))
16641 case FFELEX_typeNAME:
16642 ffesta_tokens[1] = ffelex_token_use (t);
16643 return (ffelexHandler) ffestb_R9232_;
16646 ffestb_local_.inquire.may_be_iolength = FALSE;
16647 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16648 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9233_)))
16653 /* ffestb_R9232_ -- "INQUIRE" OPEN_PAREN NAME
16655 return ffestb_R9232_; // to lexer
16657 If EQUALS here, go to states that handle it. Else, send NAME and this
16658 token thru expression handler. */
16660 static ffelexHandler
16661 ffestb_R9232_ (ffelexToken t)
16663 ffelexHandler next;
16666 switch (ffelex_token_type (t))
16668 case FFELEX_typeEQUALS:
16669 nt = ffesta_tokens[1];
16670 next = (ffelexHandler) ffestb_R9234_ (nt);
16671 ffelex_token_kill (nt);
16672 return (ffelexHandler) (*next) (t);
16675 ffestb_local_.inquire.may_be_iolength = FALSE;
16676 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16677 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9233_)))
16678 (ffesta_tokens[1]);
16679 ffelex_token_kill (ffesta_tokens[1]);
16680 return (ffelexHandler) (*next) (t);
16684 /* ffestb_R9233_ -- "INQUIRE" OPEN_PAREN expr
16686 (ffestb_R9233_) // to expression handler
16688 Handle COMMA or CLOSE_PAREN here. */
16690 static ffelexHandler
16691 ffestb_R9233_ (ffelexToken ft, ffebld expr, ffelexToken t)
16693 switch (ffelex_token_type (t))
16695 case FFELEX_typeCOMMA:
16696 case FFELEX_typeCLOSE_PAREN:
16699 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].kw_or_val_present
16701 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].kw_present = FALSE;
16702 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value_present = TRUE;
16703 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value_is_label
16705 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value
16706 = ffelex_token_use (ft);
16707 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].u.expr = expr;
16708 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
16709 return (ffelexHandler) ffestb_R9234_;
16710 return (ffelexHandler) ffestb_R9239_;
16716 ffestb_subr_kill_inquire_ ();
16717 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
16718 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16721 /* ffestb_R9234_ -- "INQUIRE" OPEN_PAREN [external-file-unit COMMA]
16723 return ffestb_R9234_; // to lexer
16725 Handle expr construct (not NAME=expr construct) here. */
16727 static ffelexHandler
16728 ffestb_R9234_ (ffelexToken t)
16732 ffestb_local_.inquire.label = FALSE;
16734 switch (ffelex_token_type (t))
16736 case FFELEX_typeNAME:
16737 kw = ffestr_inquire (t);
16738 if (kw != FFESTR_inquireIOLENGTH)
16739 ffestb_local_.inquire.may_be_iolength = FALSE;
16742 case FFESTR_inquireACCESS:
16743 ffestb_local_.inquire.ix = FFESTP_inquireixACCESS;
16744 ffestb_local_.inquire.left = TRUE;
16745 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16748 case FFESTR_inquireACTION:
16749 ffestb_local_.inquire.ix = FFESTP_inquireixACTION;
16750 ffestb_local_.inquire.left = TRUE;
16751 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16754 case FFESTR_inquireBLANK:
16755 ffestb_local_.inquire.ix = FFESTP_inquireixBLANK;
16756 ffestb_local_.inquire.left = TRUE;
16757 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16760 case FFESTR_inquireCARRIAGECONTROL:
16761 ffestb_local_.inquire.ix = FFESTP_inquireixCARRIAGECONTROL;
16762 ffestb_local_.inquire.left = TRUE;
16763 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16766 case FFESTR_inquireDEFAULTFILE:
16767 ffestb_local_.inquire.ix = FFESTP_inquireixDEFAULTFILE;
16768 ffestb_local_.inquire.left = FALSE;
16769 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16772 case FFESTR_inquireDELIM:
16773 ffestb_local_.inquire.ix = FFESTP_inquireixDELIM;
16774 ffestb_local_.inquire.left = TRUE;
16775 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16778 case FFESTR_inquireDIRECT:
16779 ffestb_local_.inquire.ix = FFESTP_inquireixDIRECT;
16780 ffestb_local_.inquire.left = TRUE;
16781 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16784 case FFESTR_inquireERR:
16785 ffestb_local_.inquire.ix = FFESTP_inquireixERR;
16786 ffestb_local_.inquire.label = TRUE;
16789 case FFESTR_inquireEXIST:
16790 ffestb_local_.inquire.ix = FFESTP_inquireixEXIST;
16791 ffestb_local_.inquire.left = TRUE;
16792 ffestb_local_.inquire.context = FFEEXPR_contextFILELOG;
16795 case FFESTR_inquireFILE:
16796 ffestb_local_.inquire.ix = FFESTP_inquireixFILE;
16797 ffestb_local_.inquire.left = FALSE;
16798 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16801 case FFESTR_inquireFORM:
16802 ffestb_local_.inquire.ix = FFESTP_inquireixFORM;
16803 ffestb_local_.inquire.left = TRUE;
16804 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16807 case FFESTR_inquireFORMATTED:
16808 ffestb_local_.inquire.ix = FFESTP_inquireixFORMATTED;
16809 ffestb_local_.inquire.left = TRUE;
16810 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16813 case FFESTR_inquireIOLENGTH:
16814 if (!ffestb_local_.inquire.may_be_iolength)
16815 goto bad; /* :::::::::::::::::::: */
16816 ffestb_local_.inquire.ix = FFESTP_inquireixIOLENGTH;
16817 ffestb_local_.inquire.left = TRUE;
16818 ffestb_local_.inquire.context = FFEEXPR_contextFILEINT;
16821 case FFESTR_inquireIOSTAT:
16822 ffestb_local_.inquire.ix = FFESTP_inquireixIOSTAT;
16823 ffestb_local_.inquire.left = TRUE;
16824 ffestb_local_.inquire.context = FFEEXPR_contextFILEINT;
16827 case FFESTR_inquireKEYED:
16828 ffestb_local_.inquire.ix = FFESTP_inquireixKEYED;
16829 ffestb_local_.inquire.left = TRUE;
16830 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16833 case FFESTR_inquireNAME:
16834 ffestb_local_.inquire.ix = FFESTP_inquireixNAME;
16835 ffestb_local_.inquire.left = TRUE;
16836 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16839 case FFESTR_inquireNAMED:
16840 ffestb_local_.inquire.ix = FFESTP_inquireixNAMED;
16841 ffestb_local_.inquire.left = TRUE;
16842 ffestb_local_.inquire.context = FFEEXPR_contextFILELOG;
16845 case FFESTR_inquireNEXTREC:
16846 ffestb_local_.inquire.ix = FFESTP_inquireixNEXTREC;
16847 ffestb_local_.inquire.left = TRUE;
16848 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFINT;
16851 case FFESTR_inquireNUMBER:
16852 ffestb_local_.inquire.ix = FFESTP_inquireixNUMBER;
16853 ffestb_local_.inquire.left = TRUE;
16854 ffestb_local_.inquire.context = FFEEXPR_contextFILEINT;
16857 case FFESTR_inquireOPENED:
16858 ffestb_local_.inquire.ix = FFESTP_inquireixOPENED;
16859 ffestb_local_.inquire.left = TRUE;
16860 ffestb_local_.inquire.context = FFEEXPR_contextFILELOG;
16863 case FFESTR_inquireORGANIZATION:
16864 ffestb_local_.inquire.ix = FFESTP_inquireixORGANIZATION;
16865 ffestb_local_.inquire.left = TRUE;
16866 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16869 case FFESTR_inquirePAD:
16870 ffestb_local_.inquire.ix = FFESTP_inquireixPAD;
16871 ffestb_local_.inquire.left = TRUE;
16872 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16875 case FFESTR_inquirePOSITION:
16876 ffestb_local_.inquire.ix = FFESTP_inquireixPOSITION;
16877 ffestb_local_.inquire.left = TRUE;
16878 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16881 case FFESTR_inquireREAD:
16882 ffestb_local_.inquire.ix = FFESTP_inquireixREAD;
16883 ffestb_local_.inquire.left = TRUE;
16884 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16887 case FFESTR_inquireREADWRITE:
16888 ffestb_local_.inquire.ix = FFESTP_inquireixREADWRITE;
16889 ffestb_local_.inquire.left = TRUE;
16890 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16893 case FFESTR_inquireRECL:
16894 ffestb_local_.inquire.ix = FFESTP_inquireixRECL;
16895 ffestb_local_.inquire.left = TRUE;
16896 ffestb_local_.inquire.context = FFEEXPR_contextFILEINT;
16899 case FFESTR_inquireRECORDTYPE:
16900 ffestb_local_.inquire.ix = FFESTP_inquireixRECORDTYPE;
16901 ffestb_local_.inquire.left = TRUE;
16902 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16905 case FFESTR_inquireSEQUENTIAL:
16906 ffestb_local_.inquire.ix = FFESTP_inquireixSEQUENTIAL;
16907 ffestb_local_.inquire.left = TRUE;
16908 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16911 case FFESTR_inquireUNFORMATTED:
16912 ffestb_local_.inquire.ix = FFESTP_inquireixUNFORMATTED;
16913 ffestb_local_.inquire.left = TRUE;
16914 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16917 case FFESTR_inquireUNIT:
16918 ffestb_local_.inquire.ix = FFESTP_inquireixUNIT;
16919 ffestb_local_.inquire.left = FALSE;
16920 ffestb_local_.inquire.context = FFEEXPR_contextFILENUM;
16924 goto bad; /* :::::::::::::::::::: */
16926 if (ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix]
16927 .kw_or_val_present)
16928 break; /* Can't specify a keyword twice! */
16929 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix]
16930 .kw_or_val_present = TRUE;
16931 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix]
16932 .kw_present = TRUE;
16933 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix]
16934 .value_present = FALSE;
16935 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_is_label
16936 = ffestb_local_.inquire.label;
16937 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].kw
16938 = ffelex_token_use (t);
16939 return (ffelexHandler) ffestb_R9235_;
16945 bad: /* :::::::::::::::::::: */
16946 ffestb_subr_kill_inquire_ ();
16947 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
16948 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16951 /* ffestb_R9235_ -- "INQUIRE" OPEN_PAREN [external-file-unit COMMA] NAME
16953 return ffestb_R9235_; // to lexer
16955 Make sure EQUALS here, send next token to expression handler. */
16957 static ffelexHandler
16958 ffestb_R9235_ (ffelexToken t)
16960 switch (ffelex_token_type (t))
16962 case FFELEX_typeEQUALS:
16963 ffesta_confirmed ();
16964 if (ffestb_local_.inquire.label)
16965 return (ffelexHandler) ffestb_R9237_;
16966 if (ffestb_local_.inquire.left)
16967 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
16968 ffestb_local_.inquire.context,
16969 (ffeexprCallback) ffestb_R9236_);
16970 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16971 ffestb_local_.inquire.context,
16972 (ffeexprCallback) ffestb_R9236_);
16978 ffestb_subr_kill_inquire_ ();
16979 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
16980 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16983 /* ffestb_R9236_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS expr
16985 (ffestb_R9236_) // to expression handler
16987 Handle COMMA or CLOSE_PAREN here. */
16989 static ffelexHandler
16990 ffestb_R9236_ (ffelexToken ft, ffebld expr, ffelexToken t)
16992 switch (ffelex_token_type (t))
16994 case FFELEX_typeCOMMA:
16995 if (ffestb_local_.inquire.ix == FFESTP_inquireixIOLENGTH)
16996 break; /* IOLENGTH=expr must be followed by
16998 /* Fall through. */
16999 case FFELEX_typeCLOSE_PAREN:
17002 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_present
17004 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value
17005 = ffelex_token_use (ft);
17006 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].u.expr = expr;
17007 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17008 return (ffelexHandler) ffestb_R9234_;
17009 if (ffestb_local_.inquire.ix == FFESTP_inquireixIOLENGTH)
17010 return (ffelexHandler) ffestb_R92310_;
17011 return (ffelexHandler) ffestb_R9239_;
17017 ffestb_subr_kill_inquire_ ();
17018 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17019 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17022 /* ffestb_R9237_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS
17024 return ffestb_R9237_; // to lexer
17026 Handle NUMBER for label here. */
17028 static ffelexHandler
17029 ffestb_R9237_ (ffelexToken t)
17031 switch (ffelex_token_type (t))
17033 case FFELEX_typeNUMBER:
17034 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_present
17036 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value
17037 = ffelex_token_use (t);
17038 return (ffelexHandler) ffestb_R9238_;
17044 ffestb_subr_kill_inquire_ ();
17045 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17046 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17049 /* ffestb_R9238_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS NUMBER
17051 return ffestb_R9238_; // to lexer
17053 Handle COMMA or CLOSE_PAREN here. */
17055 static ffelexHandler
17056 ffestb_R9238_ (ffelexToken t)
17058 switch (ffelex_token_type (t))
17060 case FFELEX_typeCOMMA:
17061 return (ffelexHandler) ffestb_R9234_;
17063 case FFELEX_typeCLOSE_PAREN:
17064 return (ffelexHandler) ffestb_R9239_;
17070 ffestb_subr_kill_inquire_ ();
17071 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17072 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17075 /* ffestb_R9239_ -- "INQUIRE" OPEN_PAREN ... CLOSE_PAREN
17077 return ffestb_R9239_; // to lexer
17079 Handle EOS or SEMICOLON here. */
17081 static ffelexHandler
17082 ffestb_R9239_ (ffelexToken t)
17084 switch (ffelex_token_type (t))
17086 case FFELEX_typeEOS:
17087 case FFELEX_typeSEMICOLON:
17088 ffesta_confirmed ();
17089 if (!ffesta_is_inhibited ())
17091 ffestb_subr_kill_inquire_ ();
17092 return (ffelexHandler) ffesta_zero (t);
17098 ffestb_subr_kill_inquire_ ();
17099 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17100 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17103 /* ffestb_R92310_ -- "INQUIRE(IOLENGTH=expr)"
17105 return ffestb_R92310_; // to lexer
17107 Make sure EOS or SEMICOLON not here; begin R923B processing and expect
17110 static ffelexHandler
17111 ffestb_R92310_ (ffelexToken t)
17113 switch (ffelex_token_type (t))
17115 case FFELEX_typeEOS:
17116 case FFELEX_typeSEMICOLON:
17120 ffesta_confirmed ();
17121 if (!ffesta_is_inhibited ())
17122 ffestc_R923B_start ();
17123 ffestb_subr_kill_inquire_ ();
17124 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17125 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R92311_)))
17129 ffestb_subr_kill_inquire_ ();
17130 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17131 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17134 /* ffestb_R92311_ -- "INQUIRE(IOLENGTH=expr)" expr
17136 (ffestb_R92311_) // to expression handler
17138 Handle COMMA or EOS/SEMICOLON here. */
17140 static ffelexHandler
17141 ffestb_R92311_ (ffelexToken ft, ffebld expr, ffelexToken t)
17143 switch (ffelex_token_type (t))
17145 case FFELEX_typeCOMMA:
17148 if (!ffesta_is_inhibited ())
17149 ffestc_R923B_item (expr, ft);
17150 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17151 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R92311_);
17153 case FFELEX_typeEOS:
17154 case FFELEX_typeSEMICOLON:
17157 if (!ffesta_is_inhibited ())
17159 ffestc_R923B_item (expr, ft);
17160 ffestc_R923B_finish ();
17162 return (ffelexHandler) ffesta_zero (t);
17168 if (!ffesta_is_inhibited ())
17169 ffestc_R923B_finish ();
17170 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17171 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17174 /* ffestb_V018 -- Parse the REWRITE statement
17176 return ffestb_V018; // to lexer
17178 Make sure the statement has a valid form for the REWRITE
17179 statement. If it does, implement the statement. */
17183 ffestb_V018 (ffelexToken t)
17185 ffestpRewriteIx ix;
17187 switch (ffelex_token_type (ffesta_tokens[0]))
17189 case FFELEX_typeNAME:
17190 if (ffesta_first_kw != FFESTR_firstREWRITE)
17191 goto bad_0; /* :::::::::::::::::::: */
17192 switch (ffelex_token_type (t))
17194 case FFELEX_typeCOMMA:
17195 case FFELEX_typeCOLONCOLON:
17196 case FFELEX_typeEOS:
17197 case FFELEX_typeSEMICOLON:
17198 case FFELEX_typeNAME:
17199 case FFELEX_typeNUMBER:
17200 ffesta_confirmed (); /* Error, but clearly intended. */
17201 goto bad_1; /* :::::::::::::::::::: */
17204 goto bad_1; /* :::::::::::::::::::: */
17206 case FFELEX_typeOPEN_PAREN:
17207 for (ix = 0; ix < FFESTP_rewriteix; ++ix)
17208 ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present = FALSE;
17209 return (ffelexHandler) ffestb_V0181_;
17212 case FFELEX_typeNAMES:
17213 if (ffesta_first_kw != FFESTR_firstREWRITE)
17214 goto bad_0; /* :::::::::::::::::::: */
17215 switch (ffelex_token_type (t))
17217 case FFELEX_typeEOS:
17218 case FFELEX_typeSEMICOLON:
17219 case FFELEX_typeCOMMA:
17220 case FFELEX_typeCOLONCOLON:
17221 ffesta_confirmed (); /* Error, but clearly intended. */
17222 goto bad_1; /* :::::::::::::::::::: */
17225 goto bad_1; /* :::::::::::::::::::: */
17227 case FFELEX_typeOPEN_PAREN:
17228 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREWRITE)
17229 goto bad_0; /* :::::::::::::::::::: */
17231 for (ix = 0; ix < FFESTP_rewriteix; ++ix)
17232 ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present = FALSE;
17233 return (ffelexHandler) ffestb_V0181_;
17237 goto bad_0; /* :::::::::::::::::::: */
17240 bad_0: /* :::::::::::::::::::: */
17241 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", ffesta_tokens[0]);
17242 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17244 bad_1: /* :::::::::::::::::::: */
17245 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17246 return (ffelexHandler) ffelex_swallow_tokens (t,
17247 (ffelexHandler) ffesta_zero); /* Invalid second token. */
17250 /* ffestb_V0181_ -- "REWRITE" OPEN_PAREN
17252 return ffestb_V0181_; // to lexer
17254 Handle expr construct (not NAME=expr construct) here. */
17256 static ffelexHandler
17257 ffestb_V0181_ (ffelexToken t)
17259 switch (ffelex_token_type (t))
17261 case FFELEX_typeNAME:
17262 ffesta_tokens[1] = ffelex_token_use (t);
17263 return (ffelexHandler) ffestb_V0182_;
17266 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17267 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0183_)))
17272 /* ffestb_V0182_ -- "REWRITE" OPEN_PAREN NAME
17274 return ffestb_V0182_; // to lexer
17276 If EQUALS here, go to states that handle it. Else, send NAME and this
17277 token thru expression handler. */
17279 static ffelexHandler
17280 ffestb_V0182_ (ffelexToken t)
17282 ffelexHandler next;
17285 switch (ffelex_token_type (t))
17287 case FFELEX_typeEQUALS:
17288 nt = ffesta_tokens[1];
17289 next = (ffelexHandler) ffestb_V0187_ (nt);
17290 ffelex_token_kill (nt);
17291 return (ffelexHandler) (*next) (t);
17294 nt = ffesta_tokens[1];
17295 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17296 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0183_)))
17298 ffelex_token_kill (nt);
17299 return (ffelexHandler) (*next) (t);
17303 /* ffestb_V0183_ -- "REWRITE" OPEN_PAREN expr [CLOSE_PAREN]
17305 (ffestb_V0183_) // to expression handler
17307 Handle COMMA or EOS/SEMICOLON here. */
17309 static ffelexHandler
17310 ffestb_V0183_ (ffelexToken ft, ffebld expr, ffelexToken t)
17312 switch (ffelex_token_type (t))
17314 case FFELEX_typeCOMMA:
17315 case FFELEX_typeCLOSE_PAREN:
17318 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].kw_or_val_present
17320 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].kw_present = FALSE;
17321 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value_present = TRUE;
17322 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value_is_label
17324 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value
17325 = ffelex_token_use (ft);
17326 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].u.expr = expr;
17327 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17328 return (ffelexHandler) ffestb_V0184_;
17329 return (ffelexHandler) ffestb_V01812_;
17335 ffestb_subr_kill_rewrite_ ();
17336 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17337 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17340 /* ffestb_V0184_ -- "REWRITE" OPEN_PAREN expr COMMA
17342 return ffestb_V0184_; // to lexer
17344 Handle expr construct (not NAME=expr construct) here. */
17346 static ffelexHandler
17347 ffestb_V0184_ (ffelexToken t)
17349 switch (ffelex_token_type (t))
17351 case FFELEX_typeNAME:
17352 ffesta_tokens[1] = ffelex_token_use (t);
17353 return (ffelexHandler) ffestb_V0185_;
17356 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17357 FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_V0186_)))
17362 /* ffestb_V0185_ -- "REWRITE" OPEN_PAREN expr COMMA NAME
17364 return ffestb_V0185_; // to lexer
17366 If EQUALS here, go to states that handle it. Else, send NAME and this
17367 token thru expression handler. */
17369 static ffelexHandler
17370 ffestb_V0185_ (ffelexToken t)
17372 ffelexHandler next;
17375 switch (ffelex_token_type (t))
17377 case FFELEX_typeEQUALS:
17378 nt = ffesta_tokens[1];
17379 next = (ffelexHandler) ffestb_V0187_ (nt);
17380 ffelex_token_kill (nt);
17381 return (ffelexHandler) (*next) (t);
17384 nt = ffesta_tokens[1];
17385 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17386 FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_V0186_)))
17388 ffelex_token_kill (nt);
17389 return (ffelexHandler) (*next) (t);
17393 /* ffestb_V0186_ -- "REWRITE" OPEN_PAREN expr COMMA expr
17395 (ffestb_V0186_) // to expression handler
17397 Handle COMMA or CLOSE_PAREN here. */
17399 static ffelexHandler
17400 ffestb_V0186_ (ffelexToken ft, ffebld expr, ffelexToken t)
17402 switch (ffelex_token_type (t))
17404 case FFELEX_typeCOMMA:
17405 case FFELEX_typeCLOSE_PAREN:
17406 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].kw_or_val_present
17408 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].kw_present = FALSE;
17409 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value_present = TRUE;
17410 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value_is_label
17412 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value
17413 = ffelex_token_use (ft);
17414 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].u.expr = expr;
17415 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17416 return (ffelexHandler) ffestb_V0187_;
17417 return (ffelexHandler) ffestb_V01812_;
17423 ffestb_subr_kill_rewrite_ ();
17424 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17425 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17428 /* ffestb_V0187_ -- "REWRITE" OPEN_PAREN [external-file-unit COMMA [format
17431 return ffestb_V0187_; // to lexer
17433 Handle expr construct (not NAME=expr construct) here. */
17435 static ffelexHandler
17436 ffestb_V0187_ (ffelexToken t)
17440 ffestb_local_.rewrite.label = FALSE;
17442 switch (ffelex_token_type (t))
17444 case FFELEX_typeNAME:
17445 kw = ffestr_genio (t);
17448 case FFESTR_genioERR:
17449 ffestb_local_.rewrite.ix = FFESTP_rewriteixERR;
17450 ffestb_local_.rewrite.label = TRUE;
17453 case FFESTR_genioFMT:
17454 ffestb_local_.rewrite.ix = FFESTP_rewriteixFMT;
17455 ffestb_local_.rewrite.left = FALSE;
17456 ffestb_local_.rewrite.context = FFEEXPR_contextFILEFORMAT;
17459 case FFESTR_genioIOSTAT:
17460 ffestb_local_.rewrite.ix = FFESTP_rewriteixIOSTAT;
17461 ffestb_local_.rewrite.left = TRUE;
17462 ffestb_local_.rewrite.context = FFEEXPR_contextFILEINT;
17465 case FFESTR_genioUNIT:
17466 ffestb_local_.rewrite.ix = FFESTP_rewriteixUNIT;
17467 ffestb_local_.rewrite.left = FALSE;
17468 ffestb_local_.rewrite.context = FFEEXPR_contextFILENUM;
17472 goto bad; /* :::::::::::::::::::: */
17474 if (ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17475 .kw_or_val_present)
17476 break; /* Can't specify a keyword twice! */
17477 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17478 .kw_or_val_present = TRUE;
17479 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17480 .kw_present = TRUE;
17481 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17482 .value_present = FALSE;
17483 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_is_label
17484 = ffestb_local_.rewrite.label;
17485 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].kw
17486 = ffelex_token_use (t);
17487 return (ffelexHandler) ffestb_V0188_;
17493 bad: /* :::::::::::::::::::: */
17494 ffestb_subr_kill_rewrite_ ();
17495 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17496 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17499 /* ffestb_V0188_ -- "REWRITE" OPEN_PAREN [external-file-unit COMMA [format
17502 return ffestb_V0188_; // to lexer
17504 Make sure EQUALS here, send next token to expression handler. */
17506 static ffelexHandler
17507 ffestb_V0188_ (ffelexToken t)
17509 switch (ffelex_token_type (t))
17511 case FFELEX_typeEQUALS:
17512 ffesta_confirmed ();
17513 if (ffestb_local_.rewrite.label)
17514 return (ffelexHandler) ffestb_V01810_;
17515 if (ffestb_local_.rewrite.left)
17516 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
17517 ffestb_local_.rewrite.context,
17518 (ffeexprCallback) ffestb_V0189_);
17519 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17520 ffestb_local_.rewrite.context,
17521 (ffeexprCallback) ffestb_V0189_);
17527 ffestb_subr_kill_rewrite_ ();
17528 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17529 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17532 /* ffestb_V0189_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS expr
17534 (ffestb_V0189_) // to expression handler
17536 Handle COMMA or CLOSE_PAREN here. */
17538 static ffelexHandler
17539 ffestb_V0189_ (ffelexToken ft, ffebld expr, ffelexToken t)
17541 switch (ffelex_token_type (t))
17543 case FFELEX_typeCOMMA:
17544 case FFELEX_typeCLOSE_PAREN:
17546 if (ffestb_local_.rewrite.context == FFEEXPR_contextFILEFORMAT)
17547 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17548 .value_is_label = TRUE;
17551 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_present
17553 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value
17554 = ffelex_token_use (ft);
17555 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].u.expr = expr;
17556 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17557 return (ffelexHandler) ffestb_V0187_;
17558 return (ffelexHandler) ffestb_V01812_;
17564 ffestb_subr_kill_rewrite_ ();
17565 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17566 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17569 /* ffestb_V01810_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS
17571 return ffestb_V01810_; // to lexer
17573 Handle NUMBER for label here. */
17575 static ffelexHandler
17576 ffestb_V01810_ (ffelexToken t)
17578 switch (ffelex_token_type (t))
17580 case FFELEX_typeNUMBER:
17581 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_present
17583 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value
17584 = ffelex_token_use (t);
17585 return (ffelexHandler) ffestb_V01811_;
17591 ffestb_subr_kill_rewrite_ ();
17592 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17593 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17596 /* ffestb_V01811_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS NUMBER
17598 return ffestb_V01811_; // to lexer
17600 Handle COMMA or CLOSE_PAREN here. */
17602 static ffelexHandler
17603 ffestb_V01811_ (ffelexToken t)
17605 switch (ffelex_token_type (t))
17607 case FFELEX_typeCOMMA:
17608 return (ffelexHandler) ffestb_V0187_;
17610 case FFELEX_typeCLOSE_PAREN:
17611 return (ffelexHandler) ffestb_V01812_;
17617 ffestb_subr_kill_rewrite_ ();
17618 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17619 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17622 /* ffestb_V01812_ -- "REWRITE" OPEN_PAREN ... CLOSE_PAREN
17624 return ffestb_V01812_; // to lexer
17626 Handle EOS or SEMICOLON here. */
17628 static ffelexHandler
17629 ffestb_V01812_ (ffelexToken t)
17631 switch (ffelex_token_type (t))
17633 case FFELEX_typeEOS:
17634 case FFELEX_typeSEMICOLON:
17635 ffesta_confirmed ();
17636 if (!ffesta_is_inhibited ())
17638 ffestc_V018_start ();
17639 ffestc_V018_finish ();
17641 ffestb_subr_kill_rewrite_ ();
17642 return (ffelexHandler) ffesta_zero (t);
17644 case FFELEX_typeNAME:
17645 case FFELEX_typeOPEN_PAREN:
17646 case FFELEX_typeCOMMA:
17647 ffesta_confirmed ();
17648 if (!ffesta_is_inhibited ())
17649 ffestc_V018_start ();
17650 ffestb_subr_kill_rewrite_ ();
17652 /* EXTENSION: Allow an optional preceding COMMA here if not pedantic.
17653 (f2c provides this extension, as do other compilers, supposedly.) */
17655 if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA))
17656 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17657 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_);
17659 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17660 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_)))
17667 ffestb_subr_kill_rewrite_ ();
17668 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17669 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17672 /* ffestb_V01813_ -- "REWRITE(...)" expr
17674 (ffestb_V01813_) // to expression handler
17676 Handle COMMA or EOS/SEMICOLON here. */
17678 static ffelexHandler
17679 ffestb_V01813_ (ffelexToken ft, ffebld expr, ffelexToken t)
17681 switch (ffelex_token_type (t))
17683 case FFELEX_typeCOMMA:
17686 if (!ffesta_is_inhibited ())
17687 ffestc_V018_item (expr, ft);
17688 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17689 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_);
17691 case FFELEX_typeEOS:
17692 case FFELEX_typeSEMICOLON:
17695 if (!ffesta_is_inhibited ())
17697 ffestc_V018_item (expr, ft);
17698 ffestc_V018_finish ();
17700 return (ffelexHandler) ffesta_zero (t);
17706 if (!ffesta_is_inhibited ())
17707 ffestc_V018_finish ();
17708 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17709 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17712 /* ffestb_V019 -- Parse the ACCEPT statement
17714 return ffestb_V019; // to lexer
17716 Make sure the statement has a valid form for the ACCEPT
17717 statement. If it does, implement the statement. */
17720 ffestb_V019 (ffelexToken t)
17722 ffelexHandler next;
17725 switch (ffelex_token_type (ffesta_tokens[0]))
17727 case FFELEX_typeNAME:
17728 if (ffesta_first_kw != FFESTR_firstACCEPT)
17729 goto bad_0; /* :::::::::::::::::::: */
17730 switch (ffelex_token_type (t))
17732 case FFELEX_typeCOMMA:
17733 case FFELEX_typeCOLONCOLON:
17734 case FFELEX_typeEOS:
17735 case FFELEX_typeSEMICOLON:
17736 ffesta_confirmed (); /* Error, but clearly intended. */
17737 goto bad_1; /* :::::::::::::::::::: */
17739 case FFELEX_typeEQUALS:
17740 case FFELEX_typePOINTS:
17741 case FFELEX_typeCOLON:
17742 goto bad_1; /* :::::::::::::::::::: */
17744 case FFELEX_typeNAME:
17745 case FFELEX_typeNUMBER:
17746 ffesta_confirmed ();
17753 for (ix = 0; ix < FFESTP_acceptix; ++ix)
17754 ffestp_file.accept.accept_spec[ix].kw_or_val_present = FALSE;
17755 return (ffelexHandler) (*((ffelexHandler)
17756 ffeexpr_rhs (ffesta_output_pool,
17757 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0191_)))
17760 case FFELEX_typeNAMES:
17761 if (ffesta_first_kw != FFESTR_firstACCEPT)
17762 goto bad_0; /* :::::::::::::::::::: */
17763 switch (ffelex_token_type (t))
17765 case FFELEX_typeEOS:
17766 case FFELEX_typeSEMICOLON:
17767 case FFELEX_typeCOMMA:
17768 ffesta_confirmed ();
17769 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlACCEPT)
17771 goto bad_1; /* :::::::::::::::::::: */
17773 case FFELEX_typeCOLONCOLON:
17774 ffesta_confirmed (); /* Error, but clearly intended. */
17775 goto bad_1; /* :::::::::::::::::::: */
17777 case FFELEX_typeEQUALS:
17778 case FFELEX_typePOINTS:
17779 case FFELEX_typeCOLON:
17780 goto bad_1; /* :::::::::::::::::::: */
17785 for (ix = 0; ix < FFESTP_acceptix; ++ix)
17786 ffestp_file.accept.accept_spec[ix].kw_or_val_present = FALSE;
17787 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17788 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0191_);
17789 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
17790 FFESTR_firstlACCEPT);
17792 return (ffelexHandler) ffelex_swallow_tokens (t,
17793 (ffelexHandler) ffesta_zero);
17794 return (ffelexHandler) (*next) (t);
17797 goto bad_0; /* :::::::::::::::::::: */
17800 bad_0: /* :::::::::::::::::::: */
17801 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", ffesta_tokens[0]);
17802 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17804 bad_1: /* :::::::::::::::::::: */
17805 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t);
17806 return (ffelexHandler) ffelex_swallow_tokens (t,
17807 (ffelexHandler) ffesta_zero); /* Invalid second token. */
17810 /* ffestb_V0191_ -- "ACCEPT" expr
17812 (ffestb_V0191_) // to expression handler
17814 Make sure the next token is a COMMA or EOS/SEMICOLON. */
17816 static ffelexHandler
17817 ffestb_V0191_ (ffelexToken ft, ffebld expr, ffelexToken t)
17819 switch (ffelex_token_type (t))
17821 case FFELEX_typeEOS:
17822 case FFELEX_typeSEMICOLON:
17823 case FFELEX_typeCOMMA:
17824 ffesta_confirmed ();
17825 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].kw_or_val_present
17827 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].kw_present = FALSE;
17828 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value_present = TRUE;
17829 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value_is_label
17831 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value
17832 = ffelex_token_use (ft);
17833 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].u.expr = expr;
17834 if (!ffesta_is_inhibited ())
17835 ffestc_V019_start ();
17836 ffestb_subr_kill_accept_ ();
17837 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17838 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
17839 FFEEXPR_contextIOLIST,
17840 (ffeexprCallback) ffestb_V0192_);
17841 if (!ffesta_is_inhibited ())
17842 ffestc_V019_finish ();
17843 return (ffelexHandler) ffesta_zero (t);
17849 ffestb_subr_kill_accept_ ();
17850 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t);
17851 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17854 /* ffestb_V0192_ -- "ACCEPT" expr COMMA expr
17856 (ffestb_V0192_) // to expression handler
17858 Handle COMMA or EOS/SEMICOLON here. */
17860 static ffelexHandler
17861 ffestb_V0192_ (ffelexToken ft, ffebld expr, ffelexToken t)
17863 switch (ffelex_token_type (t))
17865 case FFELEX_typeCOMMA:
17868 if (!ffesta_is_inhibited ())
17869 ffestc_V019_item (expr, ft);
17870 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
17871 FFEEXPR_contextIOLIST,
17872 (ffeexprCallback) ffestb_V0192_);
17874 case FFELEX_typeEOS:
17875 case FFELEX_typeSEMICOLON:
17878 if (!ffesta_is_inhibited ())
17880 ffestc_V019_item (expr, ft);
17881 ffestc_V019_finish ();
17883 return (ffelexHandler) ffesta_zero (t);
17889 if (!ffesta_is_inhibited ())
17890 ffestc_V019_finish ();
17891 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t);
17892 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17896 /* ffestb_V020 -- Parse the TYPE statement
17898 return ffestb_V020; // to lexer
17900 Make sure the statement has a valid form for the TYPE
17901 statement. If it does, implement the statement. */
17904 ffestb_V020 (ffelexToken t)
17908 ffelexHandler next;
17911 switch (ffelex_token_type (ffesta_tokens[0]))
17913 case FFELEX_typeNAME:
17914 if (ffesta_first_kw != FFESTR_firstTYPE)
17915 goto bad_0; /* :::::::::::::::::::: */
17916 switch (ffelex_token_type (t))
17918 case FFELEX_typeCOLONCOLON:
17919 case FFELEX_typeEOS:
17920 case FFELEX_typeSEMICOLON:
17921 ffesta_confirmed (); /* Error, but clearly intended. */
17922 goto bad_1; /* :::::::::::::::::::: */
17924 case FFELEX_typeEQUALS:
17925 case FFELEX_typePOINTS:
17926 case FFELEX_typeCOLON:
17927 case FFELEX_typeCOMMA: /* Because "TYPE,PUBLIC::A" is ambiguous with
17929 goto bad_1; /* :::::::::::::::::::: */
17931 case FFELEX_typeNUMBER:
17932 ffesta_confirmed ();
17935 case FFELEX_typeNAME: /* Because TYPE A is ambiguous with '90. */
17940 for (ix = 0; ix < FFESTP_typeix; ++ix)
17941 ffestp_file.type.type_spec[ix].kw_or_val_present = FALSE;
17942 return (ffelexHandler) (*((ffelexHandler)
17943 ffeexpr_rhs (ffesta_output_pool,
17944 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0201_)))
17947 case FFELEX_typeNAMES:
17948 if (ffesta_first_kw != FFESTR_firstTYPE)
17949 goto bad_0; /* :::::::::::::::::::: */
17950 switch (ffelex_token_type (t))
17952 case FFELEX_typeEOS:
17953 case FFELEX_typeSEMICOLON:
17954 case FFELEX_typeCOMMA:
17955 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlTYPE)
17957 goto bad_1; /* :::::::::::::::::::: */
17959 case FFELEX_typeCOLONCOLON:
17960 ffesta_confirmed (); /* Error, but clearly intended. */
17961 goto bad_1; /* :::::::::::::::::::: */
17963 case FFELEX_typeOPEN_PAREN:
17964 if (ffelex_token_length (ffesta_tokens[0]) == FFESTR_firstlTYPE)
17965 break; /* Else might be assignment/stmtfuncdef. */
17966 goto bad_1; /* :::::::::::::::::::: */
17968 case FFELEX_typeEQUALS:
17969 case FFELEX_typePOINTS:
17970 case FFELEX_typeCOLON:
17971 goto bad_1; /* :::::::::::::::::::: */
17976 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlTYPE);
17978 ffesta_confirmed (); /* Else might be '90 TYPE statement. */
17979 for (ix = 0; ix < FFESTP_typeix; ++ix)
17980 ffestp_file.type.type_spec[ix].kw_or_val_present = FALSE;
17981 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17982 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0201_);
17983 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
17984 FFESTR_firstlTYPE);
17986 return (ffelexHandler) ffelex_swallow_tokens (t,
17987 (ffelexHandler) ffesta_zero);
17988 return (ffelexHandler) (*next) (t);
17991 goto bad_0; /* :::::::::::::::::::: */
17994 bad_0: /* :::::::::::::::::::: */
17995 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", ffesta_tokens[0]);
17996 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17998 bad_1: /* :::::::::::::::::::: */
17999 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t);
18000 return (ffelexHandler) ffelex_swallow_tokens (t,
18001 (ffelexHandler) ffesta_zero); /* Invalid second token. */
18004 /* ffestb_V0201_ -- "TYPE" expr
18006 (ffestb_V0201_) // to expression handler
18008 Make sure the next token is a COMMA or EOS/SEMICOLON. */
18010 static ffelexHandler
18011 ffestb_V0201_ (ffelexToken ft, ffebld expr, ffelexToken t)
18015 switch (ffelex_token_type (t))
18017 case FFELEX_typeEOS:
18018 case FFELEX_typeSEMICOLON:
18019 if (!ffe_is_vxt () && (expr != NULL)
18020 && (ffebld_op (expr) == FFEBLD_opSYMTER))
18023 /* Fall through. */
18024 case FFELEX_typeCOMMA:
18025 if (!ffe_is_vxt () && comma && (expr != NULL)
18026 && (ffebld_op (expr) == FFEBLD_opPAREN)
18027 && (ffebld_op (ffebld_left (expr)) == FFEBLD_opSYMTER))
18029 ffesta_confirmed ();
18030 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].kw_or_val_present
18032 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].kw_present = FALSE;
18033 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value_present = TRUE;
18034 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value_is_label
18036 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value
18037 = ffelex_token_use (ft);
18038 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].u.expr = expr;
18039 if (!ffesta_is_inhibited ())
18040 ffestc_V020_start ();
18041 ffestb_subr_kill_type_ ();
18042 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18043 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18044 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V0202_);
18045 if (!ffesta_is_inhibited ())
18046 ffestc_V020_finish ();
18047 return (ffelexHandler) ffesta_zero (t);
18053 ffestb_subr_kill_type_ ();
18054 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t);
18055 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18058 /* ffestb_V0202_ -- "TYPE" expr COMMA expr
18060 (ffestb_V0202_) // to expression handler
18062 Handle COMMA or EOS/SEMICOLON here. */
18064 static ffelexHandler
18065 ffestb_V0202_ (ffelexToken ft, ffebld expr, ffelexToken t)
18067 switch (ffelex_token_type (t))
18069 case FFELEX_typeCOMMA:
18072 if (!ffesta_is_inhibited ())
18073 ffestc_V020_item (expr, ft);
18074 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18075 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V0202_);
18077 case FFELEX_typeEOS:
18078 case FFELEX_typeSEMICOLON:
18081 if (!ffesta_is_inhibited ())
18083 ffestc_V020_item (expr, ft);
18084 ffestc_V020_finish ();
18086 return (ffelexHandler) ffesta_zero (t);
18092 if (!ffesta_is_inhibited ())
18093 ffestc_V020_finish ();
18094 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t);
18095 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18098 /* ffestb_V021 -- Parse a DELETE statement
18100 return ffestb_V021; // to lexer
18102 Make sure the statement has a valid form for a DELETE statement.
18103 If it does, implement the statement. */
18107 ffestb_V021 (ffelexToken t)
18111 switch (ffelex_token_type (ffesta_tokens[0]))
18113 case FFELEX_typeNAME:
18114 if (ffesta_first_kw != FFESTR_firstDELETE)
18115 goto bad_0; /* :::::::::::::::::::: */
18118 case FFELEX_typeNAMES:
18119 if (ffesta_first_kw != FFESTR_firstDELETE)
18120 goto bad_0; /* :::::::::::::::::::: */
18121 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlDELETE)
18122 goto bad_0; /* :::::::::::::::::::: */
18126 goto bad_0; /* :::::::::::::::::::: */
18129 switch (ffelex_token_type (t))
18131 case FFELEX_typeOPEN_PAREN:
18134 case FFELEX_typeEOS:
18135 case FFELEX_typeSEMICOLON:
18136 case FFELEX_typeCOMMA:
18137 case FFELEX_typeCOLONCOLON:
18138 ffesta_confirmed (); /* Error, but clearly intended. */
18139 goto bad_1; /* :::::::::::::::::::: */
18142 goto bad_1; /* :::::::::::::::::::: */
18145 for (ix = 0; ix < FFESTP_deleteix; ++ix)
18146 ffestp_file.delete.delete_spec[ix].kw_or_val_present = FALSE;
18148 return (ffelexHandler) ffestb_V0211_;
18150 bad_0: /* :::::::::::::::::::: */
18151 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", ffesta_tokens[0]);
18152 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18154 bad_1: /* :::::::::::::::::::: */
18155 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18156 return (ffelexHandler) ffelex_swallow_tokens (t,
18157 (ffelexHandler) ffesta_zero); /* Invalid second token. */
18160 /* ffestb_V0211_ -- "DELETE" OPEN_PAREN
18162 return ffestb_V0211_; // to lexer
18164 Handle expr construct (not NAME=expr construct) here. */
18166 static ffelexHandler
18167 ffestb_V0211_ (ffelexToken t)
18169 switch (ffelex_token_type (t))
18171 case FFELEX_typeNAME:
18172 ffesta_tokens[1] = ffelex_token_use (t);
18173 return (ffelexHandler) ffestb_V0212_;
18176 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18177 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0213_)))
18182 /* ffestb_V0212_ -- "DELETE" OPEN_PAREN NAME
18184 return ffestb_V0212_; // to lexer
18186 If EQUALS here, go to states that handle it. Else, send NAME and this
18187 token thru expression handler. */
18189 static ffelexHandler
18190 ffestb_V0212_ (ffelexToken t)
18192 ffelexHandler next;
18195 switch (ffelex_token_type (t))
18197 case FFELEX_typeEQUALS:
18198 nt = ffesta_tokens[1];
18199 next = (ffelexHandler) ffestb_V0214_ (nt);
18200 ffelex_token_kill (nt);
18201 return (ffelexHandler) (*next) (t);
18204 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18205 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0213_)))
18206 (ffesta_tokens[1]);
18207 ffelex_token_kill (ffesta_tokens[1]);
18208 return (ffelexHandler) (*next) (t);
18212 /* ffestb_V0213_ -- "DELETE" OPEN_PAREN expr
18214 (ffestb_V0213_) // to expression handler
18216 Handle COMMA or DELETE_PAREN here. */
18218 static ffelexHandler
18219 ffestb_V0213_ (ffelexToken ft, ffebld expr, ffelexToken t)
18221 switch (ffelex_token_type (t))
18223 case FFELEX_typeCOMMA:
18224 case FFELEX_typeCLOSE_PAREN:
18227 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].kw_or_val_present
18229 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].kw_present = FALSE;
18230 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value_present = TRUE;
18231 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value_is_label
18233 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value
18234 = ffelex_token_use (ft);
18235 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].u.expr = expr;
18236 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18237 return (ffelexHandler) ffestb_V0214_;
18238 return (ffelexHandler) ffestb_V0219_;
18244 ffestb_subr_kill_delete_ ();
18245 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18246 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18249 /* ffestb_V0214_ -- "DELETE" OPEN_PAREN [external-file-unit COMMA]
18251 return ffestb_V0214_; // to lexer
18253 Handle expr construct (not NAME=expr construct) here. */
18255 static ffelexHandler
18256 ffestb_V0214_ (ffelexToken t)
18260 ffestb_local_.delete.label = FALSE;
18262 switch (ffelex_token_type (t))
18264 case FFELEX_typeNAME:
18265 kw = ffestr_genio (t);
18268 case FFESTR_genioERR:
18269 ffestb_local_.delete.ix = FFESTP_deleteixERR;
18270 ffestb_local_.delete.label = TRUE;
18273 case FFESTR_genioIOSTAT:
18274 ffestb_local_.delete.ix = FFESTP_deleteixIOSTAT;
18275 ffestb_local_.delete.left = TRUE;
18276 ffestb_local_.delete.context = FFEEXPR_contextFILEINT;
18279 case FFESTR_genioREC:
18280 ffestb_local_.delete.ix = FFESTP_deleteixREC;
18281 ffestb_local_.delete.left = FALSE;
18282 ffestb_local_.delete.context = FFEEXPR_contextFILENUM;
18285 case FFESTR_genioUNIT:
18286 ffestb_local_.delete.ix = FFESTP_deleteixUNIT;
18287 ffestb_local_.delete.left = FALSE;
18288 ffestb_local_.delete.context = FFEEXPR_contextFILENUM;
18292 goto bad; /* :::::::::::::::::::: */
18294 if (ffestp_file.delete.delete_spec[ffestb_local_.delete.ix]
18295 .kw_or_val_present)
18296 break; /* Can't specify a keyword twice! */
18297 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix]
18298 .kw_or_val_present = TRUE;
18299 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix]
18300 .kw_present = TRUE;
18301 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix]
18302 .value_present = FALSE;
18303 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_is_label
18304 = ffestb_local_.delete.label;
18305 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].kw
18306 = ffelex_token_use (t);
18307 return (ffelexHandler) ffestb_V0215_;
18313 bad: /* :::::::::::::::::::: */
18314 ffestb_subr_kill_delete_ ();
18315 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18316 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18319 /* ffestb_V0215_ -- "DELETE" OPEN_PAREN [external-file-unit COMMA] NAME
18321 return ffestb_V0215_; // to lexer
18323 Make sure EQUALS here, send next token to expression handler. */
18325 static ffelexHandler
18326 ffestb_V0215_ (ffelexToken t)
18328 switch (ffelex_token_type (t))
18330 case FFELEX_typeEQUALS:
18331 ffesta_confirmed ();
18332 if (ffestb_local_.delete.label)
18333 return (ffelexHandler) ffestb_V0217_;
18334 if (ffestb_local_.delete.left)
18335 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
18336 ffestb_local_.delete.context,
18337 (ffeexprCallback) ffestb_V0216_);
18338 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18339 ffestb_local_.delete.context, (ffeexprCallback) ffestb_V0216_);
18345 ffestb_subr_kill_delete_ ();
18346 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18347 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18350 /* ffestb_V0216_ -- "DELETE" OPEN_PAREN ... NAME EQUALS expr
18352 (ffestb_V0216_) // to expression handler
18354 Handle COMMA or CLOSE_PAREN here. */
18356 static ffelexHandler
18357 ffestb_V0216_ (ffelexToken ft, ffebld expr, ffelexToken t)
18359 switch (ffelex_token_type (t))
18361 case FFELEX_typeCOMMA:
18362 case FFELEX_typeCLOSE_PAREN:
18365 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_present
18367 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value
18368 = ffelex_token_use (ft);
18369 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].u.expr = expr;
18370 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18371 return (ffelexHandler) ffestb_V0214_;
18372 return (ffelexHandler) ffestb_V0219_;
18378 ffestb_subr_kill_delete_ ();
18379 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18380 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18383 /* ffestb_V0217_ -- "DELETE" OPEN_PAREN ... NAME EQUALS
18385 return ffestb_V0217_; // to lexer
18387 Handle NUMBER for label here. */
18389 static ffelexHandler
18390 ffestb_V0217_ (ffelexToken t)
18392 switch (ffelex_token_type (t))
18394 case FFELEX_typeNUMBER:
18395 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_present
18397 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value
18398 = ffelex_token_use (t);
18399 return (ffelexHandler) ffestb_V0218_;
18405 ffestb_subr_kill_delete_ ();
18406 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18407 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18410 /* ffestb_V0218_ -- "DELETE" OPEN_PAREN ... NAME EQUALS NUMBER
18412 return ffestb_V0218_; // to lexer
18414 Handle COMMA or CLOSE_PAREN here. */
18416 static ffelexHandler
18417 ffestb_V0218_ (ffelexToken t)
18419 switch (ffelex_token_type (t))
18421 case FFELEX_typeCOMMA:
18422 return (ffelexHandler) ffestb_V0214_;
18424 case FFELEX_typeCLOSE_PAREN:
18425 return (ffelexHandler) ffestb_V0219_;
18431 ffestb_subr_kill_delete_ ();
18432 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18433 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18436 /* ffestb_V0219_ -- "DELETE" OPEN_PAREN ... CLOSE_PAREN
18438 return ffestb_V0219_; // to lexer
18440 Handle EOS or SEMICOLON here. */
18442 static ffelexHandler
18443 ffestb_V0219_ (ffelexToken t)
18445 switch (ffelex_token_type (t))
18447 case FFELEX_typeEOS:
18448 case FFELEX_typeSEMICOLON:
18449 ffesta_confirmed ();
18450 if (!ffesta_is_inhibited ())
18452 ffestb_subr_kill_delete_ ();
18453 return (ffelexHandler) ffesta_zero (t);
18459 ffestb_subr_kill_delete_ ();
18460 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18461 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18464 /* ffestb_V026 -- Parse a FIND statement
18466 return ffestb_V026; // to lexer
18468 Make sure the statement has a valid form for a FIND statement.
18469 If it does, implement the statement. */
18472 ffestb_V026 (ffelexToken t)
18476 switch (ffelex_token_type (ffesta_tokens[0]))
18478 case FFELEX_typeNAME:
18479 if (ffesta_first_kw != FFESTR_firstFIND)
18480 goto bad_0; /* :::::::::::::::::::: */
18483 case FFELEX_typeNAMES:
18484 if (ffesta_first_kw != FFESTR_firstFIND)
18485 goto bad_0; /* :::::::::::::::::::: */
18486 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlFIND)
18487 goto bad_0; /* :::::::::::::::::::: */
18491 goto bad_0; /* :::::::::::::::::::: */
18494 switch (ffelex_token_type (t))
18496 case FFELEX_typeOPEN_PAREN:
18499 case FFELEX_typeEOS:
18500 case FFELEX_typeSEMICOLON:
18501 case FFELEX_typeCOMMA:
18502 case FFELEX_typeCOLONCOLON:
18503 ffesta_confirmed (); /* Error, but clearly intended. */
18504 goto bad_1; /* :::::::::::::::::::: */
18507 goto bad_1; /* :::::::::::::::::::: */
18510 for (ix = 0; ix < FFESTP_findix; ++ix)
18511 ffestp_file.find.find_spec[ix].kw_or_val_present = FALSE;
18513 return (ffelexHandler) ffestb_V0261_;
18515 bad_0: /* :::::::::::::::::::: */
18516 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", ffesta_tokens[0]);
18517 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18519 bad_1: /* :::::::::::::::::::: */
18520 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18521 return (ffelexHandler) ffelex_swallow_tokens (t,
18522 (ffelexHandler) ffesta_zero); /* Invalid second token. */
18525 /* ffestb_V0261_ -- "FIND" OPEN_PAREN
18527 return ffestb_V0261_; // to lexer
18529 Handle expr construct (not NAME=expr construct) here. */
18531 static ffelexHandler
18532 ffestb_V0261_ (ffelexToken t)
18534 switch (ffelex_token_type (t))
18536 case FFELEX_typeNAME:
18537 ffesta_tokens[1] = ffelex_token_use (t);
18538 return (ffelexHandler) ffestb_V0262_;
18541 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18542 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0263_)))
18547 /* ffestb_V0262_ -- "FIND" OPEN_PAREN NAME
18549 return ffestb_V0262_; // to lexer
18551 If EQUALS here, go to states that handle it. Else, send NAME and this
18552 token thru expression handler. */
18554 static ffelexHandler
18555 ffestb_V0262_ (ffelexToken t)
18557 ffelexHandler next;
18560 switch (ffelex_token_type (t))
18562 case FFELEX_typeEQUALS:
18563 nt = ffesta_tokens[1];
18564 next = (ffelexHandler) ffestb_V0264_ (nt);
18565 ffelex_token_kill (nt);
18566 return (ffelexHandler) (*next) (t);
18569 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18570 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0263_)))
18571 (ffesta_tokens[1]);
18572 ffelex_token_kill (ffesta_tokens[1]);
18573 return (ffelexHandler) (*next) (t);
18577 /* ffestb_V0263_ -- "FIND" OPEN_PAREN expr
18579 (ffestb_V0263_) // to expression handler
18581 Handle COMMA or FIND_PAREN here. */
18583 static ffelexHandler
18584 ffestb_V0263_ (ffelexToken ft, ffebld expr, ffelexToken t)
18586 switch (ffelex_token_type (t))
18588 case FFELEX_typeCOMMA:
18589 case FFELEX_typeCLOSE_PAREN:
18592 ffestp_file.find.find_spec[FFESTP_findixUNIT].kw_or_val_present
18594 ffestp_file.find.find_spec[FFESTP_findixUNIT].kw_present = FALSE;
18595 ffestp_file.find.find_spec[FFESTP_findixUNIT].value_present = TRUE;
18596 ffestp_file.find.find_spec[FFESTP_findixUNIT].value_is_label
18598 ffestp_file.find.find_spec[FFESTP_findixUNIT].value
18599 = ffelex_token_use (ft);
18600 ffestp_file.find.find_spec[FFESTP_findixUNIT].u.expr = expr;
18601 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18602 return (ffelexHandler) ffestb_V0264_;
18603 return (ffelexHandler) ffestb_V0269_;
18609 ffestb_subr_kill_find_ ();
18610 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18611 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18614 /* ffestb_V0264_ -- "FIND" OPEN_PAREN [external-file-unit COMMA]
18616 return ffestb_V0264_; // to lexer
18618 Handle expr construct (not NAME=expr construct) here. */
18620 static ffelexHandler
18621 ffestb_V0264_ (ffelexToken t)
18625 ffestb_local_.find.label = FALSE;
18627 switch (ffelex_token_type (t))
18629 case FFELEX_typeNAME:
18630 kw = ffestr_genio (t);
18633 case FFESTR_genioERR:
18634 ffestb_local_.find.ix = FFESTP_findixERR;
18635 ffestb_local_.find.label = TRUE;
18638 case FFESTR_genioIOSTAT:
18639 ffestb_local_.find.ix = FFESTP_findixIOSTAT;
18640 ffestb_local_.find.left = TRUE;
18641 ffestb_local_.find.context = FFEEXPR_contextFILEINT;
18644 case FFESTR_genioREC:
18645 ffestb_local_.find.ix = FFESTP_findixREC;
18646 ffestb_local_.find.left = FALSE;
18647 ffestb_local_.find.context = FFEEXPR_contextFILENUM;
18650 case FFESTR_genioUNIT:
18651 ffestb_local_.find.ix = FFESTP_findixUNIT;
18652 ffestb_local_.find.left = FALSE;
18653 ffestb_local_.find.context = FFEEXPR_contextFILENUM;
18657 goto bad; /* :::::::::::::::::::: */
18659 if (ffestp_file.find.find_spec[ffestb_local_.find.ix]
18660 .kw_or_val_present)
18661 break; /* Can't specify a keyword twice! */
18662 ffestp_file.find.find_spec[ffestb_local_.find.ix]
18663 .kw_or_val_present = TRUE;
18664 ffestp_file.find.find_spec[ffestb_local_.find.ix]
18665 .kw_present = TRUE;
18666 ffestp_file.find.find_spec[ffestb_local_.find.ix]
18667 .value_present = FALSE;
18668 ffestp_file.find.find_spec[ffestb_local_.find.ix].value_is_label
18669 = ffestb_local_.find.label;
18670 ffestp_file.find.find_spec[ffestb_local_.find.ix].kw
18671 = ffelex_token_use (t);
18672 return (ffelexHandler) ffestb_V0265_;
18678 bad: /* :::::::::::::::::::: */
18679 ffestb_subr_kill_find_ ();
18680 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18681 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18684 /* ffestb_V0265_ -- "FIND" OPEN_PAREN [external-file-unit COMMA] NAME
18686 return ffestb_V0265_; // to lexer
18688 Make sure EQUALS here, send next token to expression handler. */
18690 static ffelexHandler
18691 ffestb_V0265_ (ffelexToken t)
18693 switch (ffelex_token_type (t))
18695 case FFELEX_typeEQUALS:
18696 ffesta_confirmed ();
18697 if (ffestb_local_.find.label)
18698 return (ffelexHandler) ffestb_V0267_;
18699 if (ffestb_local_.find.left)
18700 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
18701 ffestb_local_.find.context,
18702 (ffeexprCallback) ffestb_V0266_);
18703 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18704 ffestb_local_.find.context,
18705 (ffeexprCallback) ffestb_V0266_);
18711 ffestb_subr_kill_find_ ();
18712 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18713 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18716 /* ffestb_V0266_ -- "FIND" OPEN_PAREN ... NAME EQUALS expr
18718 (ffestb_V0266_) // to expression handler
18720 Handle COMMA or CLOSE_PAREN here. */
18722 static ffelexHandler
18723 ffestb_V0266_ (ffelexToken ft, ffebld expr, ffelexToken t)
18725 switch (ffelex_token_type (t))
18727 case FFELEX_typeCOMMA:
18728 case FFELEX_typeCLOSE_PAREN:
18731 ffestp_file.find.find_spec[ffestb_local_.find.ix].value_present
18733 ffestp_file.find.find_spec[ffestb_local_.find.ix].value
18734 = ffelex_token_use (ft);
18735 ffestp_file.find.find_spec[ffestb_local_.find.ix].u.expr = expr;
18736 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18737 return (ffelexHandler) ffestb_V0264_;
18738 return (ffelexHandler) ffestb_V0269_;
18744 ffestb_subr_kill_find_ ();
18745 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18746 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18749 /* ffestb_V0267_ -- "FIND" OPEN_PAREN ... NAME EQUALS
18751 return ffestb_V0267_; // to lexer
18753 Handle NUMBER for label here. */
18755 static ffelexHandler
18756 ffestb_V0267_ (ffelexToken t)
18758 switch (ffelex_token_type (t))
18760 case FFELEX_typeNUMBER:
18761 ffestp_file.find.find_spec[ffestb_local_.find.ix].value_present
18763 ffestp_file.find.find_spec[ffestb_local_.find.ix].value
18764 = ffelex_token_use (t);
18765 return (ffelexHandler) ffestb_V0268_;
18771 ffestb_subr_kill_find_ ();
18772 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18773 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18776 /* ffestb_V0268_ -- "FIND" OPEN_PAREN ... NAME EQUALS NUMBER
18778 return ffestb_V0268_; // to lexer
18780 Handle COMMA or CLOSE_PAREN here. */
18782 static ffelexHandler
18783 ffestb_V0268_ (ffelexToken t)
18785 switch (ffelex_token_type (t))
18787 case FFELEX_typeCOMMA:
18788 return (ffelexHandler) ffestb_V0264_;
18790 case FFELEX_typeCLOSE_PAREN:
18791 return (ffelexHandler) ffestb_V0269_;
18797 ffestb_subr_kill_find_ ();
18798 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18799 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18802 /* ffestb_V0269_ -- "FIND" OPEN_PAREN ... CLOSE_PAREN
18804 return ffestb_V0269_; // to lexer
18806 Handle EOS or SEMICOLON here. */
18808 static ffelexHandler
18809 ffestb_V0269_ (ffelexToken t)
18811 switch (ffelex_token_type (t))
18813 case FFELEX_typeEOS:
18814 case FFELEX_typeSEMICOLON:
18815 ffesta_confirmed ();
18816 if (!ffesta_is_inhibited ())
18818 ffestb_subr_kill_find_ ();
18819 return (ffelexHandler) ffesta_zero (t);
18825 ffestb_subr_kill_find_ ();
18826 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18827 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18831 /* ffestb_dimlist -- Parse the ALLOCATABLE/POINTER/TARGET statement
18833 return ffestb_dimlist; // to lexer
18835 Make sure the statement has a valid form for the ALLOCATABLE/POINTER/
18836 TARGET statement. If it does, implement the statement. */
18840 ffestb_dimlist (ffelexToken t)
18845 ffelexHandler next;
18847 switch (ffelex_token_type (ffesta_tokens[0]))
18849 case FFELEX_typeNAME:
18850 switch (ffelex_token_type (t))
18852 case FFELEX_typeCOMMA:
18853 case FFELEX_typeEOS:
18854 case FFELEX_typeSEMICOLON:
18855 ffesta_confirmed (); /* Error, but clearly intended. */
18856 goto bad_1; /* :::::::::::::::::::: */
18859 goto bad_1; /* :::::::::::::::::::: */
18861 case FFELEX_typeCOLONCOLON:
18862 ffesta_confirmed ();
18863 if (!ffesta_is_inhibited ())
18865 switch (ffesta_first_kw)
18867 case FFESTR_firstALLOCATABLE:
18868 ffestc_R525_start ();
18871 case FFESTR_firstPOINTER:
18872 ffestc_R526_start ();
18875 case FFESTR_firstTARGET:
18876 ffestc_R527_start ();
18883 ffestb_local_.dimlist.started = TRUE;
18884 return (ffelexHandler) ffestb_dimlist1_;
18886 case FFELEX_typeNAME:
18887 ffesta_confirmed ();
18888 if (!ffesta_is_inhibited ())
18890 switch (ffesta_first_kw)
18892 case FFESTR_firstALLOCATABLE:
18893 ffestc_R525_start ();
18896 case FFESTR_firstPOINTER:
18897 ffestc_R526_start ();
18900 case FFESTR_firstTARGET:
18901 ffestc_R527_start ();
18908 ffestb_local_.dimlist.started = TRUE;
18909 return (ffelexHandler) ffestb_dimlist1_ (t);
18912 case FFELEX_typeNAMES:
18913 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.dimlist.len);
18914 switch (ffelex_token_type (t))
18917 goto bad_1; /* :::::::::::::::::::: */
18919 case FFELEX_typeEOS:
18920 case FFELEX_typeSEMICOLON:
18921 case FFELEX_typeCOMMA:
18922 ffesta_confirmed ();
18923 if (!ffesrc_is_name_init (*p))
18924 goto bad_i; /* :::::::::::::::::::: */
18925 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
18926 if (!ffesta_is_inhibited ())
18928 switch (ffesta_first_kw)
18930 case FFESTR_firstALLOCATABLE:
18931 ffestc_R525_start ();
18934 case FFESTR_firstPOINTER:
18935 ffestc_R526_start ();
18938 case FFESTR_firstTARGET:
18939 ffestc_R527_start ();
18946 ffestb_local_.dimlist.started = TRUE;
18947 next = (ffelexHandler) ffestb_dimlist1_ (nt);
18948 ffelex_token_kill (nt);
18949 return (ffelexHandler) (*next) (t);
18951 case FFELEX_typeCOLONCOLON:
18952 ffesta_confirmed ();
18954 goto bad_i; /* :::::::::::::::::::: */
18955 if (!ffesta_is_inhibited ())
18957 switch (ffesta_first_kw)
18959 case FFESTR_firstALLOCATABLE:
18960 ffestc_R525_start ();
18963 case FFESTR_firstPOINTER:
18964 ffestc_R526_start ();
18967 case FFESTR_firstTARGET:
18968 ffestc_R527_start ();
18975 ffestb_local_.dimlist.started = TRUE;
18976 return (ffelexHandler) ffestb_dimlist1_;
18978 case FFELEX_typeOPEN_PAREN:
18979 if (!ffesrc_is_name_init (*p))
18980 goto bad_i; /* :::::::::::::::::::: */
18981 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
18982 ffestb_local_.dimlist.started = FALSE;
18983 next = (ffelexHandler) ffestb_dimlist1_ (nt);
18984 ffelex_token_kill (nt);
18985 return (ffelexHandler) (*next) (t);
18989 goto bad_0; /* :::::::::::::::::::: */
18992 bad_0: /* :::::::::::::::::::: */
18993 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, ffesta_tokens[0]);
18994 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18996 bad_1: /* :::::::::::::::::::: */
18997 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
18998 return (ffelexHandler) ffelex_swallow_tokens (t,
18999 (ffelexHandler) ffesta_zero); /* Invalid second token. */
19001 bad_i: /* :::::::::::::::::::: */
19002 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, ffesta_tokens[0], i, t);
19003 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19006 /* ffestb_dimlist1_ -- "ALLOCATABLE/POINTER/TARGET" [COLONCOLON]
19008 return ffestb_dimlist1_; // to lexer
19012 static ffelexHandler
19013 ffestb_dimlist1_ (ffelexToken t)
19015 switch (ffelex_token_type (t))
19017 case FFELEX_typeNAME:
19018 ffesta_tokens[1] = ffelex_token_use (t);
19019 return (ffelexHandler) ffestb_dimlist2_;
19022 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19026 if (!ffesta_is_inhibited ())
19028 switch (ffesta_first_kw)
19030 case FFESTR_firstALLOCATABLE:
19031 ffestc_R525_finish ();
19034 case FFESTR_firstPOINTER:
19035 ffestc_R526_finish ();
19038 case FFESTR_firstTARGET:
19039 ffestc_R527_finish ();
19046 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19049 /* ffestb_dimlist2_ -- "ALLOCATABLE/POINTER/TARGET" ... NAME
19051 return ffestb_dimlist2_; // to lexer
19053 Handle OPEN_PAREN. */
19055 static ffelexHandler
19056 ffestb_dimlist2_ (ffelexToken t)
19058 switch (ffelex_token_type (t))
19060 case FFELEX_typeOPEN_PAREN:
19061 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
19062 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_dimlist3_;
19063 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
19064 ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLIST;
19065 #ifdef FFECOM_dimensionsMAX
19066 ffestb_subrargs_.dim_list.ndims = 0;
19068 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
19069 FFEEXPR_contextDIMLIST, (ffeexprCallback) ffestb_subr_dimlist_);
19071 case FFELEX_typeCOMMA:
19072 ffesta_confirmed ();
19073 if (!ffesta_is_inhibited ())
19075 if (!ffestb_local_.dimlist.started)
19077 switch (ffesta_first_kw)
19079 case FFESTR_firstALLOCATABLE:
19080 ffestc_R525_start ();
19083 case FFESTR_firstPOINTER:
19084 ffestc_R526_start ();
19087 case FFESTR_firstTARGET:
19088 ffestc_R527_start ();
19094 ffestb_local_.dimlist.started = TRUE;
19096 switch (ffesta_first_kw)
19098 case FFESTR_firstALLOCATABLE:
19099 ffestc_R525_item (ffesta_tokens[1], NULL);
19102 case FFESTR_firstPOINTER:
19103 ffestc_R526_item (ffesta_tokens[1], NULL);
19106 case FFESTR_firstTARGET:
19107 ffestc_R527_item (ffesta_tokens[1], NULL);
19114 ffelex_token_kill (ffesta_tokens[1]);
19115 return (ffelexHandler) ffestb_dimlist4_;
19117 case FFELEX_typeEOS:
19118 case FFELEX_typeSEMICOLON:
19119 ffesta_confirmed ();
19120 if (!ffesta_is_inhibited ())
19122 if (!ffestb_local_.dimlist.started)
19124 switch (ffesta_first_kw)
19126 case FFESTR_firstALLOCATABLE:
19127 ffestc_R525_start ();
19130 case FFESTR_firstPOINTER:
19131 ffestc_R526_start ();
19134 case FFESTR_firstTARGET:
19135 ffestc_R527_start ();
19142 switch (ffesta_first_kw)
19144 case FFESTR_firstALLOCATABLE:
19145 ffestc_R525_item (ffesta_tokens[1], NULL);
19146 ffestc_R525_finish ();
19149 case FFESTR_firstPOINTER:
19150 ffestc_R526_item (ffesta_tokens[1], NULL);
19151 ffestc_R526_finish ();
19154 case FFESTR_firstTARGET:
19155 ffestc_R527_item (ffesta_tokens[1], NULL);
19156 ffestc_R527_finish ();
19163 ffelex_token_kill (ffesta_tokens[1]);
19164 return (ffelexHandler) ffesta_zero (t);
19167 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19171 if (!ffesta_is_inhibited ())
19173 switch (ffesta_first_kw)
19175 case FFESTR_firstALLOCATABLE:
19176 ffestc_R525_finish ();
19179 case FFESTR_firstPOINTER:
19180 ffestc_R526_finish ();
19183 case FFESTR_firstTARGET:
19184 ffestc_R527_finish ();
19191 ffelex_token_kill (ffesta_tokens[1]);
19192 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19195 /* ffestb_dimlist3_ -- "ALLOCATABLE/POINTER/TARGET" ... NAME OPEN_PAREN
19196 dimlist CLOSE_PAREN
19198 return ffestb_dimlist3_; // to lexer
19200 Handle COMMA or EOS/SEMICOLON. */
19202 static ffelexHandler
19203 ffestb_dimlist3_ (ffelexToken t)
19205 if (!ffestb_subrargs_.dim_list.ok)
19206 goto bad; /* :::::::::::::::::::: */
19208 switch (ffelex_token_type (t))
19210 case FFELEX_typeCOMMA:
19211 ffesta_confirmed ();
19212 if (!ffesta_is_inhibited ())
19214 if (!ffestb_local_.dimlist.started)
19216 switch (ffesta_first_kw)
19218 case FFESTR_firstALLOCATABLE:
19219 ffestc_R525_start ();
19222 case FFESTR_firstPOINTER:
19223 ffestc_R526_start ();
19226 case FFESTR_firstTARGET:
19227 ffestc_R527_start ();
19233 ffestb_local_.dimlist.started = TRUE;
19235 switch (ffesta_first_kw)
19237 case FFESTR_firstALLOCATABLE:
19238 ffestc_R525_item (ffesta_tokens[1],
19239 ffestb_subrargs_.dim_list.dims);
19242 case FFESTR_firstPOINTER:
19243 ffestc_R526_item (ffesta_tokens[1],
19244 ffestb_subrargs_.dim_list.dims);
19247 case FFESTR_firstTARGET:
19248 ffestc_R527_item (ffesta_tokens[1],
19249 ffestb_subrargs_.dim_list.dims);
19256 ffelex_token_kill (ffesta_tokens[1]);
19257 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19258 return (ffelexHandler) ffestb_dimlist4_;
19260 case FFELEX_typeEOS:
19261 case FFELEX_typeSEMICOLON:
19262 ffesta_confirmed ();
19263 if (!ffesta_is_inhibited ())
19265 if (!ffestb_local_.dimlist.started)
19267 switch (ffesta_first_kw)
19269 case FFESTR_firstALLOCATABLE:
19270 ffestc_R525_start ();
19273 case FFESTR_firstPOINTER:
19274 ffestc_R526_start ();
19277 case FFESTR_firstTARGET:
19278 ffestc_R527_start ();
19285 switch (ffesta_first_kw)
19287 case FFESTR_firstALLOCATABLE:
19288 ffestc_R525_item (ffesta_tokens[1],
19289 ffestb_subrargs_.dim_list.dims);
19290 ffestc_R525_finish ();
19293 case FFESTR_firstPOINTER:
19294 ffestc_R526_item (ffesta_tokens[1],
19295 ffestb_subrargs_.dim_list.dims);
19296 ffestc_R526_finish ();
19299 case FFESTR_firstTARGET:
19300 ffestc_R527_item (ffesta_tokens[1],
19301 ffestb_subrargs_.dim_list.dims);
19302 ffestc_R527_finish ();
19309 ffelex_token_kill (ffesta_tokens[1]);
19310 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19311 return (ffelexHandler) ffesta_zero (t);
19317 bad: /* :::::::::::::::::::: */
19318 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19319 if (ffestb_local_.dimlist.started && !ffesta_is_inhibited ())
19321 switch (ffesta_first_kw)
19323 case FFESTR_firstALLOCATABLE:
19324 ffestc_R525_finish ();
19327 case FFESTR_firstPOINTER:
19328 ffestc_R526_finish ();
19331 case FFESTR_firstTARGET:
19332 ffestc_R527_finish ();
19339 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19340 ffelex_token_kill (ffesta_tokens[1]);
19341 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19344 /* ffestb_dimlist4_ -- "ALLOCATABLE/POINTER/TARGET" ... COMMA
19346 return ffestb_dimlist4_; // to lexer
19348 Make sure we don't have EOS or SEMICOLON. */
19350 static ffelexHandler
19351 ffestb_dimlist4_ (ffelexToken t)
19353 switch (ffelex_token_type (t))
19355 case FFELEX_typeEOS:
19356 case FFELEX_typeSEMICOLON:
19357 if (!ffesta_is_inhibited ())
19359 switch (ffesta_first_kw)
19361 case FFESTR_firstALLOCATABLE:
19362 ffestc_R525_finish ();
19365 case FFESTR_firstPOINTER:
19366 ffestc_R526_finish ();
19369 case FFESTR_firstTARGET:
19370 ffestc_R527_finish ();
19377 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19378 return (ffelexHandler) ffesta_zero (t);
19381 return (ffelexHandler) ffestb_dimlist1_ (t);
19386 /* ffestb_dummy -- Parse an ENTRY/FUNCTION/SUBROUTINE statement
19388 return ffestb_dummy; // to lexer
19390 Make sure the statement has a valid form for an ENTRY/FUNCTION/SUBROUTINE
19391 statement. If it does, implement the statement. */
19394 ffestb_dummy (ffelexToken t)
19399 switch (ffelex_token_type (ffesta_tokens[0]))
19401 case FFELEX_typeNAME:
19402 switch (ffelex_token_type (t))
19404 case FFELEX_typeEOS:
19405 case FFELEX_typeSEMICOLON:
19406 case FFELEX_typeCOMMA:
19407 case FFELEX_typeCOLONCOLON:
19408 ffesta_confirmed (); /* Error, but clearly intended. */
19409 goto bad_1; /* :::::::::::::::::::: */
19412 goto bad_1; /* :::::::::::::::::::: */
19414 case FFELEX_typeNAME:
19418 ffesta_confirmed ();
19419 ffesta_tokens[1] = ffelex_token_use (t);
19420 ffestb_local_.decl.recursive = NULL;
19421 ffestb_local_.dummy.badname = ffestb_args.dummy.badname;
19422 ffestb_local_.dummy.is_subr = ffestb_args.dummy.is_subr;
19423 ffestb_local_.dummy.first_kw = ffesta_first_kw;
19424 return (ffelexHandler) ffestb_dummy1_;
19426 case FFELEX_typeNAMES:
19427 switch (ffelex_token_type (t))
19429 case FFELEX_typeCOMMA:
19430 case FFELEX_typeCOLONCOLON:
19431 ffesta_confirmed (); /* Error, but clearly intended. */
19432 goto bad_1; /* :::::::::::::::::::: */
19435 goto bad_1; /* :::::::::::::::::::: */
19437 case FFELEX_typeEOS:
19438 case FFELEX_typeSEMICOLON:
19439 ffesta_confirmed ();
19442 case FFELEX_typeOPEN_PAREN:
19445 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.dummy.len);
19446 if (!ffesrc_is_name_init (*p))
19447 goto bad_i; /* :::::::::::::::::::: */
19449 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
19450 ffestb_local_.decl.recursive = NULL;
19451 ffestb_local_.dummy.badname = ffestb_args.dummy.badname;
19452 ffestb_local_.dummy.is_subr = ffestb_args.dummy.is_subr;
19453 ffestb_local_.dummy.first_kw = ffesta_first_kw;
19454 return (ffelexHandler) ffestb_dummy1_ (t);
19457 goto bad_0; /* :::::::::::::::::::: */
19460 bad_0: /* :::::::::::::::::::: */
19461 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, ffesta_tokens[0]);
19462 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19464 bad_1: /* :::::::::::::::::::: */
19465 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, t);
19466 return (ffelexHandler) ffelex_swallow_tokens (t,
19467 (ffelexHandler) ffesta_zero); /* Invalid second token. */
19469 bad_i: /* :::::::::::::::::::: */
19470 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, ffesta_tokens[0], i, t);
19471 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19474 /* ffestb_dummy1_ -- "ENTRY/FUNCTION/SUBROUTINE" NAME
19476 return ffestb_dummy1_; // to lexer
19478 Make sure the next token is an EOS, SEMICOLON, or OPEN_PAREN. In the
19479 former case, just implement a null arg list, else get the arg list and
19482 static ffelexHandler
19483 ffestb_dummy1_ (ffelexToken t)
19485 switch (ffelex_token_type (t))
19487 case FFELEX_typeEOS:
19488 case FFELEX_typeSEMICOLON:
19489 if (ffestb_local_.dummy.first_kw == FFESTR_firstFUNCTION)
19491 ffesta_confirmed (); /* Later, not if typename w/o RECURSIVE. */
19492 break; /* Produce an error message, need that open
19495 ffesta_confirmed ();
19496 if (!ffesta_is_inhibited ())
19497 { /* Pretend as though we got a truly NULL
19499 ffestb_subrargs_.name_list.args = NULL;
19500 ffestb_subrargs_.name_list.ok = TRUE;
19501 ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
19502 return (ffelexHandler) ffestb_dummy2_ (t);
19504 if (ffestb_local_.decl.recursive != NULL)
19505 ffelex_token_kill (ffestb_local_.decl.recursive);
19506 ffelex_token_kill (ffesta_tokens[1]);
19507 return (ffelexHandler) ffesta_zero (t);
19509 case FFELEX_typeOPEN_PAREN:
19510 ffestb_subrargs_.name_list.args = ffestt_tokenlist_create ();
19511 ffestb_subrargs_.name_list.handler = (ffelexHandler) ffestb_dummy2_;
19512 ffestb_subrargs_.name_list.is_subr = ffestb_local_.dummy.is_subr;
19513 ffestb_subrargs_.name_list.names = FALSE;
19514 return (ffelexHandler) ffestb_subr_name_list_;
19520 if (ffestb_local_.decl.recursive != NULL)
19521 ffelex_token_kill (ffestb_local_.decl.recursive);
19522 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_local_.dummy.badname, t);
19523 ffelex_token_kill (ffesta_tokens[1]);
19524 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19527 /* ffestb_dummy2_ -- <dummy-keyword> NAME OPEN_PAREN arg-list CLOSE_PAREN
19529 return ffestb_dummy2_; // to lexer
19531 Make sure the statement has a valid form for a dummy-def statement. If it
19532 does, implement the statement. */
19534 static ffelexHandler
19535 ffestb_dummy2_ (ffelexToken t)
19537 if (!ffestb_subrargs_.name_list.ok)
19538 goto bad; /* :::::::::::::::::::: */
19540 switch (ffelex_token_type (t))
19542 case FFELEX_typeEOS:
19543 case FFELEX_typeSEMICOLON:
19544 ffesta_confirmed ();
19545 if (!ffesta_is_inhibited ())
19547 switch (ffestb_local_.dummy.first_kw)
19549 case FFESTR_firstFUNCTION:
19550 ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
19551 ffestb_subrargs_.name_list.close_paren, FFESTP_typeNone,
19552 NULL, NULL, NULL, NULL, ffestb_local_.decl.recursive, NULL);
19555 case FFESTR_firstSUBROUTINE:
19556 ffestc_R1223 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
19557 ffestb_subrargs_.name_list.close_paren,
19558 ffestb_local_.decl.recursive);
19561 case FFESTR_firstENTRY:
19562 ffestc_R1226 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
19563 ffestb_subrargs_.name_list.close_paren);
19570 ffelex_token_kill (ffesta_tokens[1]);
19571 if (ffestb_local_.decl.recursive != NULL)
19572 ffelex_token_kill (ffestb_local_.decl.recursive);
19573 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
19574 if (ffestb_subrargs_.name_list.args != NULL)
19575 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
19576 return (ffelexHandler) ffesta_zero (t);
19578 case FFELEX_typeNAME:
19579 ffesta_confirmed ();
19580 if ((ffestb_local_.dummy.first_kw != FFESTR_firstFUNCTION)
19581 || (ffestr_other (t) != FFESTR_otherRESULT))
19583 ffestb_local_.decl.type = FFESTP_typeNone;
19584 ffestb_local_.decl.kind = NULL;
19585 ffestb_local_.decl.kindt = NULL;
19586 ffestb_local_.decl.len = NULL;
19587 ffestb_local_.decl.lent = NULL;
19588 return (ffelexHandler) ffestb_decl_funcname_6_;
19594 bad: /* :::::::::::::::::::: */
19595 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_local_.dummy.badname, t);
19596 ffelex_token_kill (ffesta_tokens[1]);
19597 if (ffestb_local_.decl.recursive != NULL)
19598 ffelex_token_kill (ffestb_local_.decl.recursive);
19599 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
19600 if (ffestb_subrargs_.name_list.args != NULL)
19601 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
19602 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19605 /* ffestb_R524 -- Parse the DIMENSION statement
19607 return ffestb_R524; // to lexer
19609 Make sure the statement has a valid form for the DIMENSION statement. If
19610 it does, implement the statement. */
19613 ffestb_R524 (ffelexToken t)
19618 ffelexHandler next;
19620 switch (ffelex_token_type (ffesta_tokens[0]))
19622 case FFELEX_typeNAME:
19623 switch (ffelex_token_type (t))
19625 case FFELEX_typeCOMMA:
19626 case FFELEX_typeCOLONCOLON:
19627 case FFELEX_typeEOS:
19628 case FFELEX_typeSEMICOLON:
19629 ffesta_confirmed (); /* Error, but clearly intended. */
19630 goto bad_1; /* :::::::::::::::::::: */
19633 goto bad_1; /* :::::::::::::::::::: */
19635 case FFELEX_typeNAME:
19636 ffesta_confirmed ();
19637 if (!ffesta_is_inhibited ())
19638 ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL);
19639 ffestb_local_.dimension.started = TRUE;
19640 return (ffelexHandler) ffestb_R5241_ (t);
19643 case FFELEX_typeNAMES:
19644 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.R524.len);
19645 switch (ffelex_token_type (t))
19648 goto bad_1; /* :::::::::::::::::::: */
19650 case FFELEX_typeEOS:
19651 case FFELEX_typeSEMICOLON:
19652 case FFELEX_typeCOMMA:
19653 case FFELEX_typeCOLONCOLON:
19654 ffesta_confirmed ();
19655 goto bad_1; /* :::::::::::::::::::: */
19657 case FFELEX_typeOPEN_PAREN:
19661 /* Here, we have at least one char after "DIMENSION" and t is
19664 if (!ffesrc_is_name_init (*p))
19665 goto bad_i; /* :::::::::::::::::::: */
19666 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
19667 ffestb_local_.dimension.started = FALSE;
19668 next = (ffelexHandler) ffestb_R5241_ (nt);
19669 ffelex_token_kill (nt);
19670 return (ffelexHandler) (*next) (t);
19673 goto bad_0; /* :::::::::::::::::::: */
19676 bad_0: /* :::::::::::::::::::: */
19677 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, ffesta_tokens[0]);
19678 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19680 bad_1: /* :::::::::::::::::::: */
19681 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19682 return (ffelexHandler) ffelex_swallow_tokens (t,
19683 (ffelexHandler) ffesta_zero); /* Invalid second token. */
19685 bad_i: /* :::::::::::::::::::: */
19686 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, ffesta_tokens[0], i, t);
19687 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19690 /* ffestb_R5241_ -- "DIMENSION"
19692 return ffestb_R5241_; // to lexer
19696 static ffelexHandler
19697 ffestb_R5241_ (ffelexToken t)
19699 switch (ffelex_token_type (t))
19701 case FFELEX_typeNAME:
19702 ffesta_tokens[1] = ffelex_token_use (t);
19703 return (ffelexHandler) ffestb_R5242_;
19706 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19710 if (!ffesta_is_inhibited ())
19711 ffestc_R524_finish ();
19712 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19715 /* ffestb_R5242_ -- "DIMENSION" ... NAME
19717 return ffestb_R5242_; // to lexer
19719 Handle OPEN_PAREN. */
19721 static ffelexHandler
19722 ffestb_R5242_ (ffelexToken t)
19724 switch (ffelex_token_type (t))
19726 case FFELEX_typeOPEN_PAREN:
19727 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
19728 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_R5243_;
19729 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
19730 ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid
19731 ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON;
19732 #ifdef FFECOM_dimensionsMAX
19733 ffestb_subrargs_.dim_list.ndims = 0;
19735 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
19736 ffestb_subrargs_.dim_list.ctx,
19737 (ffeexprCallback) ffestb_subr_dimlist_);
19740 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19744 if (!ffesta_is_inhibited ())
19745 ffestc_R524_finish ();
19746 ffelex_token_kill (ffesta_tokens[1]);
19747 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19750 /* ffestb_R5243_ -- "DIMENSION" ... NAME OPEN_PAREN dimlist CLOSE_PAREN
19752 return ffestb_R5243_; // to lexer
19754 Handle COMMA or EOS/SEMICOLON. */
19756 static ffelexHandler
19757 ffestb_R5243_ (ffelexToken t)
19759 if (!ffestb_subrargs_.dim_list.ok)
19760 goto bad; /* :::::::::::::::::::: */
19762 switch (ffelex_token_type (t))
19764 case FFELEX_typeCOMMA:
19765 ffesta_confirmed ();
19766 if (!ffesta_is_inhibited ())
19768 if (!ffestb_local_.dimension.started)
19770 ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL);
19771 ffestb_local_.dimension.started = TRUE;
19773 ffestc_R524_item (ffesta_tokens[1],
19774 ffestb_subrargs_.dim_list.dims);
19776 ffelex_token_kill (ffesta_tokens[1]);
19777 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19778 return (ffelexHandler) ffestb_R5244_;
19780 case FFELEX_typeEOS:
19781 case FFELEX_typeSEMICOLON:
19782 ffesta_confirmed ();
19783 if (!ffesta_is_inhibited ())
19785 if (!ffestb_local_.dimension.started)
19787 ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL);
19788 ffestb_local_.dimension.started = TRUE;
19790 ffestc_R524_item (ffesta_tokens[1],
19791 ffestb_subrargs_.dim_list.dims);
19792 ffestc_R524_finish ();
19794 ffelex_token_kill (ffesta_tokens[1]);
19795 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19796 return (ffelexHandler) ffesta_zero (t);
19802 bad: /* :::::::::::::::::::: */
19803 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19804 if (ffestb_local_.dimension.started && !ffesta_is_inhibited ())
19805 ffestc_R524_finish ();
19806 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19807 ffelex_token_kill (ffesta_tokens[1]);
19808 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19811 /* ffestb_R5244_ -- "DIMENSION" ... COMMA
19813 return ffestb_R5244_; // to lexer
19815 Make sure we don't have EOS or SEMICOLON. */
19817 static ffelexHandler
19818 ffestb_R5244_ (ffelexToken t)
19820 switch (ffelex_token_type (t))
19822 case FFELEX_typeEOS:
19823 case FFELEX_typeSEMICOLON:
19824 if (!ffesta_is_inhibited ())
19825 ffestc_R524_finish ();
19826 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19827 return (ffelexHandler) ffesta_zero (t);
19830 return (ffelexHandler) ffestb_R5241_ (t);
19834 /* ffestb_R547 -- Parse the COMMON statement
19836 return ffestb_R547; // to lexer
19838 Make sure the statement has a valid form for the COMMON statement. If it
19839 does, implement the statement. */
19842 ffestb_R547 (ffelexToken t)
19847 ffelexHandler next;
19849 switch (ffelex_token_type (ffesta_tokens[0]))
19851 case FFELEX_typeNAME:
19852 if (ffesta_first_kw != FFESTR_firstCOMMON)
19853 goto bad_0; /* :::::::::::::::::::: */
19854 switch (ffelex_token_type (t))
19856 case FFELEX_typeCOMMA:
19857 case FFELEX_typeCOLONCOLON:
19858 case FFELEX_typeEOS:
19859 case FFELEX_typeSEMICOLON:
19860 ffesta_confirmed (); /* Error, but clearly intended. */
19861 goto bad_1; /* :::::::::::::::::::: */
19864 goto bad_1; /* :::::::::::::::::::: */
19866 case FFELEX_typeNAME:
19867 case FFELEX_typeSLASH:
19868 case FFELEX_typeCONCAT:
19869 ffesta_confirmed ();
19870 if (!ffesta_is_inhibited ())
19871 ffestc_R547_start ();
19872 ffestb_local_.common.started = TRUE;
19873 return (ffelexHandler) ffestb_R5471_ (t);
19876 case FFELEX_typeNAMES:
19877 if (ffesta_first_kw != FFESTR_firstCOMMON)
19878 goto bad_0; /* :::::::::::::::::::: */
19879 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCOMMON);
19880 switch (ffelex_token_type (t))
19883 goto bad_1; /* :::::::::::::::::::: */
19885 case FFELEX_typeEOS:
19886 case FFELEX_typeSEMICOLON:
19887 case FFELEX_typeCOMMA:
19888 case FFELEX_typeCOLONCOLON:
19889 ffesta_confirmed ();
19892 case FFELEX_typeSLASH:
19893 case FFELEX_typeCONCAT:
19894 ffesta_confirmed ();
19897 if (!ffesta_is_inhibited ())
19898 ffestc_R547_start ();
19899 ffestb_local_.common.started = TRUE;
19900 return (ffelexHandler) ffestb_R5471_ (t);
19902 case FFELEX_typeOPEN_PAREN:
19906 /* Here, we have at least one char after "COMMON" and t is COMMA,
19907 EOS/SEMICOLON, OPEN_PAREN, SLASH, or CONCAT. */
19909 if (!ffesrc_is_name_init (*p))
19910 goto bad_i; /* :::::::::::::::::::: */
19911 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
19912 if (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN)
19913 ffestb_local_.common.started = FALSE;
19916 if (!ffesta_is_inhibited ())
19917 ffestc_R547_start ();
19918 ffestb_local_.common.started = TRUE;
19920 next = (ffelexHandler) ffestb_R5471_ (nt);
19921 ffelex_token_kill (nt);
19922 return (ffelexHandler) (*next) (t);
19925 goto bad_0; /* :::::::::::::::::::: */
19928 bad_0: /* :::::::::::::::::::: */
19929 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", ffesta_tokens[0]);
19930 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19932 bad_1: /* :::::::::::::::::::: */
19933 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
19934 return (ffelexHandler) ffelex_swallow_tokens (t,
19935 (ffelexHandler) ffesta_zero); /* Invalid second token. */
19937 bad_i: /* :::::::::::::::::::: */
19938 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "COMMON", ffesta_tokens[0], i, t);
19939 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19942 /* ffestb_R5471_ -- "COMMON"
19944 return ffestb_R5471_; // to lexer
19946 Handle NAME, SLASH, or CONCAT. */
19948 static ffelexHandler
19949 ffestb_R5471_ (ffelexToken t)
19951 switch (ffelex_token_type (t))
19953 case FFELEX_typeNAME:
19954 return (ffelexHandler) ffestb_R5474_ (t);
19956 case FFELEX_typeSLASH:
19957 return (ffelexHandler) ffestb_R5472_;
19959 case FFELEX_typeCONCAT:
19960 if (!ffesta_is_inhibited ())
19961 ffestc_R547_item_cblock (NULL);
19962 return (ffelexHandler) ffestb_R5474_;
19965 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
19969 if (!ffesta_is_inhibited ())
19970 ffestc_R547_finish ();
19971 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19974 /* ffestb_R5472_ -- "COMMON" SLASH
19976 return ffestb_R5472_; // to lexer
19980 static ffelexHandler
19981 ffestb_R5472_ (ffelexToken t)
19983 switch (ffelex_token_type (t))
19985 case FFELEX_typeNAME:
19986 ffesta_tokens[1] = ffelex_token_use (t);
19987 return (ffelexHandler) ffestb_R5473_;
19989 case FFELEX_typeSLASH:
19990 if (!ffesta_is_inhibited ())
19991 ffestc_R547_item_cblock (NULL);
19992 return (ffelexHandler) ffestb_R5474_;
19995 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
19999 if (!ffesta_is_inhibited ())
20000 ffestc_R547_finish ();
20001 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20004 /* ffestb_R5473_ -- "COMMON" SLASH NAME
20006 return ffestb_R5473_; // to lexer
20010 static ffelexHandler
20011 ffestb_R5473_ (ffelexToken t)
20013 switch (ffelex_token_type (t))
20015 case FFELEX_typeSLASH:
20016 if (!ffesta_is_inhibited ())
20017 ffestc_R547_item_cblock (ffesta_tokens[1]);
20018 ffelex_token_kill (ffesta_tokens[1]);
20019 return (ffelexHandler) ffestb_R5474_;
20022 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20026 if (!ffesta_is_inhibited ())
20027 ffestc_R547_finish ();
20028 ffelex_token_kill (ffesta_tokens[1]);
20029 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20032 /* ffestb_R5474_ -- "COMMON" [SLASH NAME SLASH] or "COMMON" CONCAT
20034 return ffestb_R5474_; // to lexer
20038 static ffelexHandler
20039 ffestb_R5474_ (ffelexToken t)
20041 switch (ffelex_token_type (t))
20043 case FFELEX_typeNAME:
20044 ffesta_tokens[1] = ffelex_token_use (t);
20045 return (ffelexHandler) ffestb_R5475_;
20048 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20052 if (!ffesta_is_inhibited ())
20053 ffestc_R547_finish ();
20054 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20057 /* ffestb_R5475_ -- "COMMON" ... NAME
20059 return ffestb_R5475_; // to lexer
20061 Handle OPEN_PAREN. */
20063 static ffelexHandler
20064 ffestb_R5475_ (ffelexToken t)
20066 switch (ffelex_token_type (t))
20068 case FFELEX_typeOPEN_PAREN:
20069 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
20070 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_R5476_;
20071 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
20072 ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON;
20073 #ifdef FFECOM_dimensionsMAX
20074 ffestb_subrargs_.dim_list.ndims = 0;
20076 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
20077 FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_);
20079 case FFELEX_typeCOMMA:
20080 if (!ffesta_is_inhibited ())
20081 ffestc_R547_item_object (ffesta_tokens[1], NULL);
20082 ffelex_token_kill (ffesta_tokens[1]);
20083 return (ffelexHandler) ffestb_R5477_;
20085 case FFELEX_typeSLASH:
20086 case FFELEX_typeCONCAT:
20087 if (!ffesta_is_inhibited ())
20088 ffestc_R547_item_object (ffesta_tokens[1], NULL);
20089 ffelex_token_kill (ffesta_tokens[1]);
20090 return (ffelexHandler) ffestb_R5471_ (t);
20092 case FFELEX_typeEOS:
20093 case FFELEX_typeSEMICOLON:
20094 if (!ffesta_is_inhibited ())
20096 ffestc_R547_item_object (ffesta_tokens[1], NULL);
20097 ffestc_R547_finish ();
20099 ffelex_token_kill (ffesta_tokens[1]);
20100 return (ffelexHandler) ffesta_zero (t);
20103 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20107 if (!ffesta_is_inhibited ())
20108 ffestc_R547_finish ();
20109 ffelex_token_kill (ffesta_tokens[1]);
20110 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20113 /* ffestb_R5476_ -- "COMMON" ... NAME OPEN_PAREN dimlist CLOSE_PAREN
20115 return ffestb_R5476_; // to lexer
20117 Handle COMMA, SLASH, CONCAT, EOS/SEMICOLON. */
20119 static ffelexHandler
20120 ffestb_R5476_ (ffelexToken t)
20122 if (!ffestb_subrargs_.dim_list.ok)
20123 goto bad; /* :::::::::::::::::::: */
20125 switch (ffelex_token_type (t))
20127 case FFELEX_typeCOMMA:
20128 ffesta_confirmed ();
20129 if (!ffesta_is_inhibited ())
20131 if (!ffestb_local_.common.started)
20133 ffestc_R547_start ();
20134 ffestb_local_.common.started = TRUE;
20136 ffestc_R547_item_object (ffesta_tokens[1],
20137 ffestb_subrargs_.dim_list.dims);
20139 ffelex_token_kill (ffesta_tokens[1]);
20140 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
20141 return (ffelexHandler) ffestb_R5477_;
20143 case FFELEX_typeSLASH:
20144 case FFELEX_typeCONCAT:
20145 ffesta_confirmed ();
20146 if (!ffesta_is_inhibited ())
20148 if (!ffestb_local_.common.started)
20150 ffestc_R547_start ();
20151 ffestb_local_.common.started = TRUE;
20153 ffestc_R547_item_object (ffesta_tokens[1],
20154 ffestb_subrargs_.dim_list.dims);
20156 ffelex_token_kill (ffesta_tokens[1]);
20157 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
20158 return (ffelexHandler) ffestb_R5471_ (t);
20160 case FFELEX_typeEOS:
20161 case FFELEX_typeSEMICOLON:
20162 ffesta_confirmed ();
20163 if (!ffesta_is_inhibited ())
20165 if (!ffestb_local_.common.started)
20166 ffestc_R547_start ();
20167 ffestc_R547_item_object (ffesta_tokens[1],
20168 ffestb_subrargs_.dim_list.dims);
20169 ffestc_R547_finish ();
20171 ffelex_token_kill (ffesta_tokens[1]);
20172 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
20173 return (ffelexHandler) ffesta_zero (t);
20179 bad: /* :::::::::::::::::::: */
20180 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20181 if (ffestb_local_.common.started && !ffesta_is_inhibited ())
20182 ffestc_R547_finish ();
20183 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
20184 ffelex_token_kill (ffesta_tokens[1]);
20185 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20188 /* ffestb_R5477_ -- "COMMON" ... COMMA
20190 return ffestb_R5477_; // to lexer
20192 Make sure we don't have EOS or SEMICOLON. */
20194 static ffelexHandler
20195 ffestb_R5477_ (ffelexToken t)
20197 switch (ffelex_token_type (t))
20199 case FFELEX_typeEOS:
20200 case FFELEX_typeSEMICOLON:
20201 if (!ffesta_is_inhibited ())
20202 ffestc_R547_finish ();
20203 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20204 return (ffelexHandler) ffesta_zero (t);
20207 return (ffelexHandler) ffestb_R5471_ (t);
20211 /* ffestb_R624 -- Parse a NULLIFY statement
20213 return ffestb_R624; // to lexer
20215 Make sure the statement has a valid form for a NULLIFY
20216 statement. If it does, implement the statement.
20219 Rewrite to produce a list of expressions rather than just names; this
20220 eases semantic checking, putting it in expression handling where that
20221 kind of thing gets done anyway, and makes it easier to support more
20222 flexible extensions to Fortran 90 like NULLIFY(FOO%BAR). */
20226 ffestb_R624 (ffelexToken t)
20228 switch (ffelex_token_type (ffesta_tokens[0]))
20230 case FFELEX_typeNAME:
20231 if (ffesta_first_kw != FFESTR_firstNULLIFY)
20232 goto bad_0; /* :::::::::::::::::::: */
20235 case FFELEX_typeNAMES:
20236 if (ffesta_first_kw != FFESTR_firstNULLIFY)
20237 goto bad_0; /* :::::::::::::::::::: */
20238 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlNULLIFY)
20239 goto bad_0; /* :::::::::::::::::::: */
20243 goto bad_0; /* :::::::::::::::::::: */
20246 switch (ffelex_token_type (t))
20248 case FFELEX_typeOPEN_PAREN:
20251 case FFELEX_typeEOS:
20252 case FFELEX_typeSEMICOLON:
20253 case FFELEX_typeCOMMA:
20254 case FFELEX_typeCOLONCOLON:
20255 case FFELEX_typeNAME:
20256 ffesta_confirmed (); /* Error, but clearly intended. */
20257 goto bad_1; /* :::::::::::::::::::: */
20260 goto bad_1; /* :::::::::::::::::::: */
20263 ffestb_local_.R624.exprs = ffestt_exprlist_create ();
20264 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
20265 FFEEXPR_contextNULLIFY,
20266 (ffeexprCallback) ffestb_R6241_);
20268 bad_0: /* :::::::::::::::::::: */
20269 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", ffesta_tokens[0]);
20270 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20272 bad_1: /* :::::::::::::::::::: */
20273 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t);
20274 return (ffelexHandler) ffelex_swallow_tokens (t,
20275 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20278 /* ffestb_R6241_ -- "NULLIFY" OPEN_PAREN expr
20280 return ffestb_R6241_; // to lexer
20282 Make sure the statement has a valid form for a NULLIFY statement. If it
20283 does, implement the statement.
20286 Rewrite to produce a list of expressions rather than just names; this
20287 eases semantic checking, putting it in expression handling where that
20288 kind of thing gets done anyway, and makes it easier to support more
20289 flexible extensions to Fortran 90 like NULLIFY(FOO%BAR). */
20291 static ffelexHandler
20292 ffestb_R6241_ (ffelexToken ft, ffebld expr, ffelexToken t)
20294 switch (ffelex_token_type (t))
20296 case FFELEX_typeCLOSE_PAREN:
20299 ffestt_exprlist_append (ffestb_local_.R624.exprs, expr,
20300 ffelex_token_use (t));
20301 return (ffelexHandler) ffestb_R6242_;
20303 case FFELEX_typeCOMMA:
20306 ffestt_exprlist_append (ffestb_local_.R624.exprs, expr,
20307 ffelex_token_use (t));
20308 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
20309 FFEEXPR_contextNULLIFY,
20310 (ffeexprCallback) ffestb_R6241_);
20316 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t);
20317 ffestt_exprlist_kill (ffestb_local_.R624.exprs);
20318 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20321 /* ffestb_R6242_ -- "NULLIFY" OPEN_PAREN expr-list CLOSE_PAREN
20323 return ffestb_R6242_; // to lexer
20325 Make sure the statement has a valid form for a NULLIFY statement. If it
20326 does, implement the statement. */
20328 static ffelexHandler
20329 ffestb_R6242_ (ffelexToken t)
20331 switch (ffelex_token_type (t))
20333 case FFELEX_typeEOS:
20334 case FFELEX_typeSEMICOLON:
20335 ffesta_confirmed ();
20336 if (!ffesta_is_inhibited ())
20337 ffestc_R624 (ffestb_local_.R624.exprs);
20338 ffestt_exprlist_kill (ffestb_local_.R624.exprs);
20339 return (ffelexHandler) ffesta_zero (t);
20345 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t);
20346 ffestt_exprlist_kill (ffestb_local_.R624.exprs);
20347 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20351 /* ffestb_R1229 -- Parse a STMTFUNCTION statement
20353 return ffestb_R1229; // to lexer
20355 Make sure the statement has a valid form for a STMTFUNCTION
20356 statement. If it does, implement the statement. */
20359 ffestb_R1229 (ffelexToken t)
20361 switch (ffelex_token_type (ffesta_tokens[0]))
20363 case FFELEX_typeNAME:
20364 case FFELEX_typeNAMES:
20368 goto bad_0; /* :::::::::::::::::::: */
20371 switch (ffelex_token_type (t))
20373 case FFELEX_typeOPEN_PAREN:
20376 case FFELEX_typeEOS:
20377 case FFELEX_typeSEMICOLON:
20378 case FFELEX_typeCOMMA:
20379 case FFELEX_typeCOLONCOLON:
20380 case FFELEX_typeNAME:
20381 ffesta_confirmed (); /* Error, but clearly intended. */
20382 goto bad_1; /* :::::::::::::::::::: */
20385 goto bad_1; /* :::::::::::::::::::: */
20388 ffestb_subrargs_.name_list.args = ffestt_tokenlist_create ();
20389 ffestb_subrargs_.name_list.handler = (ffelexHandler) ffestb_R12291_;
20390 ffestb_subrargs_.name_list.is_subr = FALSE; /* No "*" items in list! */
20391 ffestb_subrargs_.name_list.names = TRUE; /* In case "IF(FOO)CALL
20393 return (ffelexHandler) ffestb_subr_name_list_;
20395 bad_0: /* :::::::::::::::::::: */
20396 bad_1: /* :::::::::::::::::::: */
20397 ffesta_ffebad_2t (FFEBAD_UNREC_STMT, ffesta_tokens[0], t);
20398 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20401 /* ffestb_R12291_ -- "STMTFUNCTION" OPEN_PAREN dummy-name-list CLOSE_PAREN
20403 return ffestb_R12291_; // to lexer
20405 Make sure the statement has a valid form for a STMTFUNCTION statement. If
20406 it does, implement the statement. */
20408 static ffelexHandler
20409 ffestb_R12291_ (ffelexToken t)
20411 ffelex_set_names (FALSE);
20413 if (!ffestb_subrargs_.name_list.ok)
20414 goto bad; /* :::::::::::::::::::: */
20416 switch (ffelex_token_type (t))
20418 case FFELEX_typeEQUALS:
20419 ffesta_confirmed ();
20420 if (!ffesta_is_inhibited ())
20421 ffestc_R1229_start (ffesta_tokens[0],
20422 ffestb_subrargs_.name_list.args,
20423 ffestb_subrargs_.name_list.close_paren);
20424 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
20425 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
20426 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
20427 FFEEXPR_contextSFUNCDEF, (ffeexprCallback) ffestb_R12292_);
20433 bad: /* :::::::::::::::::::: */
20434 ffesta_ffebad_2t (FFEBAD_UNREC_STMT, ffesta_tokens[0], t);
20435 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
20436 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
20437 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20440 /* ffestb_R12292_ -- "STMTFUNCTION" OPEN_PAREN dummy-name-list CLOSE_PAREN
20443 (ffestb_R12292_) // to expression handler
20445 Make sure the statement has a valid form for a STMTFUNCTION statement. If
20446 it does, implement the statement. */
20448 static ffelexHandler
20449 ffestb_R12292_ (ffelexToken ft, ffebld expr, ffelexToken t)
20452 goto bad; /* :::::::::::::::::::: */
20454 switch (ffelex_token_type (t))
20456 case FFELEX_typeEOS:
20457 case FFELEX_typeSEMICOLON:
20458 if (!ffesta_is_inhibited ())
20459 ffestc_R1229_finish (expr, ft);
20460 return (ffelexHandler) ffesta_zero (t);
20466 bad: /* :::::::::::::::::::: */
20467 ffestc_R1229_finish (NULL, NULL);
20468 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "statement-function-definition", t);
20469 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20472 /* ffestb_decl_chartype -- Parse the CHARACTER statement
20474 return ffestb_decl_chartype; // to lexer
20476 Make sure the statement has a valid form for the CHARACTER statement. If
20477 it does, implement the statement. */
20480 ffestb_decl_chartype (ffelexToken t)
20485 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
20486 ffestb_local_.decl.recursive = NULL;
20487 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
20488 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
20490 switch (ffelex_token_type (ffesta_tokens[0]))
20492 case FFELEX_typeNAME:
20493 if (ffesta_first_kw != FFESTR_firstCHRCTR)
20494 goto bad_0; /* :::::::::::::::::::: */
20495 switch (ffelex_token_type (t))
20497 case FFELEX_typeEOS:
20498 case FFELEX_typeSEMICOLON:
20499 ffesta_confirmed (); /* Error, but clearly intended. */
20500 goto bad_1; /* :::::::::::::::::::: */
20503 goto bad_1; /* :::::::::::::::::::: */
20505 case FFELEX_typeCOMMA:
20506 ffesta_confirmed ();
20507 if (!ffesta_is_inhibited ())
20508 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20509 NULL, NULL, NULL, NULL);
20510 return (ffelexHandler) ffestb_decl_attrs_;
20512 case FFELEX_typeCOLONCOLON:
20513 ffestb_local_.decl.coloncolon = TRUE;
20514 ffesta_confirmed ();
20515 if (!ffesta_is_inhibited ())
20516 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20517 NULL, NULL, NULL, NULL);
20518 return (ffelexHandler) ffestb_decl_ents_;
20520 case FFELEX_typeASTERISK:
20521 ffesta_confirmed ();
20522 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_chartype1_;
20523 ffestb_local_.decl.badname = "TYPEDECL";
20524 return (ffelexHandler) ffestb_decl_starlen_;
20526 case FFELEX_typeOPEN_PAREN:
20527 ffestb_local_.decl.kind = NULL;
20528 ffestb_local_.decl.kindt = NULL;
20529 ffestb_local_.decl.len = NULL;
20530 ffestb_local_.decl.lent = NULL;
20531 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20532 ffestb_local_.decl.badname = "_TYPEDECL";
20533 return (ffelexHandler) ffestb_decl_typeparams_;
20535 case FFELEX_typeNAME:
20536 ffesta_confirmed ();
20537 ffestb_local_.decl.kind = NULL;
20538 ffestb_local_.decl.kindt = NULL;
20539 ffestb_local_.decl.len = NULL;
20540 ffestb_local_.decl.lent = NULL;
20541 return (ffelexHandler) ffestb_decl_entsp_ (t);
20544 case FFELEX_typeNAMES:
20545 if (ffesta_first_kw != FFESTR_firstCHRCTR)
20546 goto bad_0; /* :::::::::::::::::::: */
20547 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCHRCTR);
20548 switch (ffelex_token_type (t))
20551 goto bad_1; /* :::::::::::::::::::: */
20553 case FFELEX_typeEOS:
20554 case FFELEX_typeSEMICOLON:
20555 ffesta_confirmed ();
20558 case FFELEX_typeCOMMA:
20559 ffesta_confirmed ();
20562 if (!ffesta_is_inhibited ())
20563 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20564 NULL, NULL, NULL, NULL);
20565 return (ffelexHandler) ffestb_decl_attrs_;
20567 case FFELEX_typeCOLONCOLON:
20568 ffestb_local_.decl.coloncolon = TRUE;
20569 ffesta_confirmed ();
20571 goto bad_i; /* :::::::::::::::::::: */
20572 if (!ffesta_is_inhibited ())
20573 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20574 NULL, NULL, NULL, NULL);
20575 return (ffelexHandler) ffestb_decl_ents_;
20577 case FFELEX_typeASTERISK:
20578 ffesta_confirmed ();
20581 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_chartype1_;
20582 ffestb_local_.decl.badname = "TYPEDECL";
20583 return (ffelexHandler) ffestb_decl_starlen_;
20585 case FFELEX_typeSLASH:
20586 ffesta_confirmed ();
20589 goto bad_1; /* :::::::::::::::::::: */
20591 case FFELEX_typeOPEN_PAREN:
20594 ffestb_local_.decl.kind = NULL;
20595 ffestb_local_.decl.kindt = NULL;
20596 ffestb_local_.decl.len = NULL;
20597 ffestb_local_.decl.lent = NULL;
20598 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20599 ffestb_local_.decl.badname = "TYPEDECL";
20600 return (ffelexHandler) ffestb_decl_typeparams_;
20602 if (!ffesrc_is_name_init (*p))
20603 goto bad_i; /* :::::::::::::::::::: */
20604 ffestb_local_.decl.kind = NULL;
20605 ffestb_local_.decl.kindt = NULL;
20606 ffestb_local_.decl.len = NULL;
20607 ffestb_local_.decl.lent = NULL;
20608 ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0);
20609 return (ffelexHandler) ffestb_decl_entsp_2_ (t);
20612 goto bad_0; /* :::::::::::::::::::: */
20615 bad_0: /* :::::::::::::::::::: */
20616 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
20617 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20619 bad_1: /* :::::::::::::::::::: */
20620 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
20621 return (ffelexHandler) ffelex_swallow_tokens (t,
20622 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20624 bad_i: /* :::::::::::::::::::: */
20625 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t);
20626 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20629 /* ffestb_decl_chartype1_ -- "CHARACTER" ASTERISK char-length
20631 return ffestb_decl_chartype1_; // to lexer
20633 Handle COMMA, COLONCOLON, or anything else. */
20635 static ffelexHandler
20636 ffestb_decl_chartype1_ (ffelexToken t)
20638 ffelex_set_names (FALSE);
20640 switch (ffelex_token_type (t))
20642 case FFELEX_typeCOLONCOLON:
20643 ffestb_local_.decl.coloncolon = TRUE;
20644 /* Fall through. */
20645 case FFELEX_typeCOMMA:
20646 ffesta_confirmed ();
20647 if (!ffesta_is_inhibited ())
20648 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20649 NULL, NULL, ffestb_local_.decl.len, ffestb_local_.decl.lent);
20650 if (ffestb_local_.decl.lent != NULL)
20651 ffelex_token_kill (ffestb_local_.decl.lent);
20652 return (ffelexHandler) ffestb_decl_ents_;
20655 return (ffelexHandler) ffestb_decl_entsp_ (t);
20659 /* ffestb_decl_dbltype -- Parse the DOUBLEPRECISION/DOUBLECOMPLEX statement
20661 return ffestb_decl_dbltype; // to lexer
20663 Make sure the statement has a valid form for the DOUBLEPRECISION/
20664 DOUBLECOMPLEX statement. If it does, implement the statement. */
20667 ffestb_decl_dbltype (ffelexToken t)
20672 ffestb_local_.decl.type = ffestb_args.decl.type;
20673 ffestb_local_.decl.recursive = NULL;
20674 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
20675 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
20677 switch (ffelex_token_type (ffesta_tokens[0]))
20679 case FFELEX_typeNAME:
20680 switch (ffelex_token_type (t))
20682 case FFELEX_typeEOS:
20683 case FFELEX_typeSEMICOLON:
20684 ffesta_confirmed (); /* Error, but clearly intended. */
20685 goto bad_1; /* :::::::::::::::::::: */
20688 goto bad_1; /* :::::::::::::::::::: */
20690 case FFELEX_typeCOMMA:
20691 ffesta_confirmed ();
20692 if (!ffesta_is_inhibited ())
20693 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20694 NULL, NULL, NULL, NULL);
20695 return (ffelexHandler) ffestb_decl_attrs_;
20697 case FFELEX_typeCOLONCOLON:
20698 ffestb_local_.decl.coloncolon = TRUE;
20699 ffesta_confirmed ();
20700 if (!ffesta_is_inhibited ())
20701 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20702 NULL, NULL, NULL, NULL);
20703 return (ffelexHandler) ffestb_decl_ents_;
20705 case FFELEX_typeNAME:
20706 ffesta_confirmed ();
20707 ffestb_local_.decl.kind = NULL;
20708 ffestb_local_.decl.kindt = NULL;
20709 ffestb_local_.decl.len = NULL;
20710 ffestb_local_.decl.lent = NULL;
20711 return (ffelexHandler) ffestb_decl_entsp_ (t);
20714 case FFELEX_typeNAMES:
20715 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.decl.len);
20716 switch (ffelex_token_type (t))
20719 goto bad_1; /* :::::::::::::::::::: */
20721 case FFELEX_typeEOS:
20722 case FFELEX_typeSEMICOLON:
20723 ffesta_confirmed ();
20726 case FFELEX_typeCOMMA:
20727 ffesta_confirmed ();
20730 if (!ffesta_is_inhibited ())
20731 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20732 NULL, NULL, NULL, NULL);
20733 return (ffelexHandler) ffestb_decl_attrs_;
20735 case FFELEX_typeCOLONCOLON:
20736 ffestb_local_.decl.coloncolon = TRUE;
20737 ffesta_confirmed ();
20739 goto bad_i; /* :::::::::::::::::::: */
20740 if (!ffesta_is_inhibited ())
20741 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20742 NULL, NULL, NULL, NULL);
20743 return (ffelexHandler) ffestb_decl_ents_;
20745 case FFELEX_typeSLASH:
20746 ffesta_confirmed ();
20749 goto bad_1; /* :::::::::::::::::::: */
20751 case FFELEX_typeOPEN_PAREN:
20754 goto bad_1; /* :::::::::::::::::::: */
20756 if (!ffesrc_is_name_init (*p))
20757 goto bad_i; /* :::::::::::::::::::: */
20758 ffestb_local_.decl.kind = NULL;
20759 ffestb_local_.decl.kindt = NULL;
20760 ffestb_local_.decl.len = NULL;
20761 ffestb_local_.decl.lent = NULL;
20762 ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0);
20763 return (ffelexHandler) ffestb_decl_entsp_2_ (t);
20766 goto bad_0; /* :::::::::::::::::::: */
20769 bad_0: /* :::::::::::::::::::: */
20770 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
20771 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20773 bad_1: /* :::::::::::::::::::: */
20774 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
20775 return (ffelexHandler) ffelex_swallow_tokens (t,
20776 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20778 bad_i: /* :::::::::::::::::::: */
20779 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t);
20780 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20783 /* ffestb_decl_double -- Parse the DOUBLE PRECISION/DOUBLE COMPLEX statement
20785 return ffestb_decl_double; // to lexer
20787 Make sure the statement has a valid form for the DOUBLE PRECISION/
20788 DOUBLE COMPLEX statement. If it does, implement the statement. */
20791 ffestb_decl_double (ffelexToken t)
20793 ffestb_local_.decl.recursive = NULL;
20794 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
20795 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
20797 switch (ffelex_token_type (ffesta_tokens[0]))
20799 case FFELEX_typeNAME:
20800 if (ffesta_first_kw != FFESTR_firstDBL)
20801 goto bad_0; /* :::::::::::::::::::: */
20802 switch (ffelex_token_type (t))
20804 case FFELEX_typeEOS:
20805 case FFELEX_typeSEMICOLON:
20806 case FFELEX_typeCOMMA:
20807 case FFELEX_typeCOLONCOLON:
20808 ffesta_confirmed (); /* Error, but clearly intended. */
20809 goto bad_1; /* :::::::::::::::::::: */
20812 goto bad_1; /* :::::::::::::::::::: */
20814 case FFELEX_typeNAME:
20815 ffesta_confirmed ();
20816 switch (ffestr_second (t))
20818 case FFESTR_secondCOMPLEX:
20819 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
20822 case FFESTR_secondPRECISION:
20823 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
20827 goto bad_1; /* :::::::::::::::::::: */
20829 ffestb_local_.decl.kind = NULL;
20830 ffestb_local_.decl.kindt = NULL;
20831 ffestb_local_.decl.len = NULL;
20832 ffestb_local_.decl.lent = NULL;
20833 return (ffelexHandler) ffestb_decl_attrsp_;
20837 goto bad_0; /* :::::::::::::::::::: */
20840 bad_0: /* :::::::::::::::::::: */
20841 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
20842 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20844 bad_1: /* :::::::::::::::::::: */
20845 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
20846 return (ffelexHandler) ffelex_swallow_tokens (t,
20847 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20850 /* ffestb_decl_gentype -- Parse the INTEGER/REAL/COMPLEX/LOGICAL statement
20852 return ffestb_decl_gentype; // to lexer
20854 Make sure the statement has a valid form for the INTEGER/REAL/COMPLEX/
20855 LOGICAL statement. If it does, implement the statement. */
20858 ffestb_decl_gentype (ffelexToken t)
20863 ffestb_local_.decl.type = ffestb_args.decl.type;
20864 ffestb_local_.decl.recursive = NULL;
20865 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
20866 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
20868 switch (ffelex_token_type (ffesta_tokens[0]))
20870 case FFELEX_typeNAME:
20871 switch (ffelex_token_type (t))
20873 case FFELEX_typeEOS:
20874 case FFELEX_typeSEMICOLON:
20875 ffesta_confirmed (); /* Error, but clearly intended. */
20876 goto bad_1; /* :::::::::::::::::::: */
20879 goto bad_1; /* :::::::::::::::::::: */
20881 case FFELEX_typeCOMMA:
20882 ffesta_confirmed ();
20883 if (!ffesta_is_inhibited ())
20884 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20885 NULL, NULL, NULL, NULL);
20886 return (ffelexHandler) ffestb_decl_attrs_;
20888 case FFELEX_typeCOLONCOLON:
20889 ffestb_local_.decl.coloncolon = TRUE;
20890 ffesta_confirmed ();
20891 if (!ffesta_is_inhibited ())
20892 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20893 NULL, NULL, NULL, NULL);
20894 return (ffelexHandler) ffestb_decl_ents_;
20896 case FFELEX_typeASTERISK:
20897 ffesta_confirmed ();
20898 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20899 ffestb_local_.decl.badname = "TYPEDECL";
20900 return (ffelexHandler) ffestb_decl_starkind_;
20902 case FFELEX_typeOPEN_PAREN:
20903 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20904 ffestb_local_.decl.badname = "TYPEDECL";
20905 return (ffelexHandler) ffestb_decl_kindparam_;
20907 case FFELEX_typeNAME:
20908 ffesta_confirmed ();
20909 ffestb_local_.decl.kind = NULL;
20910 ffestb_local_.decl.kindt = NULL;
20911 ffestb_local_.decl.len = NULL;
20912 ffestb_local_.decl.lent = NULL;
20913 return (ffelexHandler) ffestb_decl_entsp_ (t);
20916 case FFELEX_typeNAMES:
20917 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.decl.len);
20918 switch (ffelex_token_type (t))
20921 goto bad_1; /* :::::::::::::::::::: */
20923 case FFELEX_typeEOS:
20924 case FFELEX_typeSEMICOLON:
20925 ffesta_confirmed ();
20928 case FFELEX_typeCOMMA:
20929 ffesta_confirmed ();
20932 if (!ffesta_is_inhibited ())
20933 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20934 NULL, NULL, NULL, NULL);
20935 return (ffelexHandler) ffestb_decl_attrs_;
20937 case FFELEX_typeCOLONCOLON:
20938 ffestb_local_.decl.coloncolon = TRUE;
20939 ffesta_confirmed ();
20941 goto bad_i; /* :::::::::::::::::::: */
20942 if (!ffesta_is_inhibited ())
20943 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20944 NULL, NULL, NULL, NULL);
20945 return (ffelexHandler) ffestb_decl_ents_;
20947 case FFELEX_typeSLASH:
20948 ffesta_confirmed ();
20951 goto bad_1; /* :::::::::::::::::::: */
20953 case FFELEX_typeASTERISK:
20954 ffesta_confirmed ();
20957 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20958 ffestb_local_.decl.badname = "TYPEDECL";
20959 return (ffelexHandler) ffestb_decl_starkind_;
20961 case FFELEX_typeOPEN_PAREN:
20964 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20965 ffestb_local_.decl.badname = "TYPEDECL";
20966 return (ffelexHandler) ffestb_decl_kindparam_;
20968 if (!ffesrc_is_name_init (*p))
20969 goto bad_i; /* :::::::::::::::::::: */
20970 ffestb_local_.decl.kind = NULL;
20971 ffestb_local_.decl.kindt = NULL;
20972 ffestb_local_.decl.len = NULL;
20973 ffestb_local_.decl.lent = NULL;
20974 ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0);
20975 return (ffelexHandler) ffestb_decl_entsp_2_ (t);
20978 goto bad_0; /* :::::::::::::::::::: */
20981 bad_0: /* :::::::::::::::::::: */
20982 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
20983 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20985 bad_1: /* :::::::::::::::::::: */
20986 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
20987 return (ffelexHandler) ffelex_swallow_tokens (t,
20988 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20990 bad_i: /* :::::::::::::::::::: */
20991 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t);
20992 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20995 /* ffestb_decl_recursive -- Parse the RECURSIVE FUNCTION statement
20997 return ffestb_decl_recursive; // to lexer
20999 Make sure the statement has a valid form for the RECURSIVE FUNCTION
21000 statement. If it does, implement the statement. */
21004 ffestb_decl_recursive (ffelexToken t)
21010 ffelexHandler next;
21013 switch (ffelex_token_type (ffesta_tokens[0]))
21015 case FFELEX_typeNAME:
21016 if (ffesta_first_kw != FFESTR_firstRECURSIVE)
21017 goto bad_0; /* :::::::::::::::::::: */
21018 switch (ffelex_token_type (t))
21020 case FFELEX_typeEOS:
21021 case FFELEX_typeSEMICOLON:
21022 case FFELEX_typeCOMMA:
21023 case FFELEX_typeCOLONCOLON:
21024 ffesta_confirmed (); /* Error, but clearly intended. */
21025 goto bad_1; /* :::::::::::::::::::: */
21028 goto bad_1; /* :::::::::::::::::::: */
21030 case FFELEX_typeNAME:
21033 ffesta_confirmed ();
21034 ffestb_local_.decl.recursive = ffelex_token_use (ffesta_tokens[0]);
21035 switch (ffesta_second_kw)
21037 case FFESTR_secondINTEGER:
21038 ffestb_local_.decl.type = FFESTP_typeINTEGER;
21039 return (ffelexHandler) ffestb_decl_recursive1_;
21041 case FFESTR_secondBYTE:
21042 ffestb_local_.decl.type = FFESTP_typeBYTE;
21043 return (ffelexHandler) ffestb_decl_recursive1_;
21045 case FFESTR_secondWORD:
21046 ffestb_local_.decl.type = FFESTP_typeWORD;
21047 return (ffelexHandler) ffestb_decl_recursive1_;
21049 case FFESTR_secondREAL:
21050 ffestb_local_.decl.type = FFESTP_typeREAL;
21051 return (ffelexHandler) ffestb_decl_recursive1_;
21053 case FFESTR_secondCOMPLEX:
21054 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
21055 return (ffelexHandler) ffestb_decl_recursive1_;
21057 case FFESTR_secondLOGICAL:
21058 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
21059 return (ffelexHandler) ffestb_decl_recursive1_;
21061 case FFESTR_secondCHARACTER:
21062 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
21063 return (ffelexHandler) ffestb_decl_recursive1_;
21065 case FFESTR_secondDOUBLE:
21066 return (ffelexHandler) ffestb_decl_recursive2_;
21068 case FFESTR_secondDOUBLEPRECISION:
21069 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
21070 ffestb_local_.decl.kind = NULL;
21071 ffestb_local_.decl.kindt = NULL;
21072 ffestb_local_.decl.len = NULL;
21073 ffestb_local_.decl.lent = NULL;
21074 return (ffelexHandler) ffestb_decl_func_;
21076 case FFESTR_secondDOUBLECOMPLEX:
21077 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
21078 ffestb_local_.decl.kind = NULL;
21079 ffestb_local_.decl.kindt = NULL;
21080 ffestb_local_.decl.len = NULL;
21081 ffestb_local_.decl.lent = NULL;
21082 return (ffelexHandler) ffestb_decl_func_;
21084 case FFESTR_secondTYPE:
21085 ffestb_local_.decl.type = FFESTP_typeTYPE;
21086 return (ffelexHandler) ffestb_decl_recursive3_;
21088 case FFESTR_secondFUNCTION:
21089 ffestb_local_.dummy.first_kw = FFESTR_firstFUNCTION;
21090 ffestb_local_.dummy.badname = "FUNCTION";
21091 ffestb_local_.dummy.is_subr = FALSE;
21092 return (ffelexHandler) ffestb_decl_recursive4_;
21094 case FFESTR_secondSUBROUTINE:
21095 ffestb_local_.dummy.first_kw = FFESTR_firstSUBROUTINE;
21096 ffestb_local_.dummy.badname = "SUBROUTINE";
21097 ffestb_local_.dummy.is_subr = TRUE;
21098 return (ffelexHandler) ffestb_decl_recursive4_;
21101 ffelex_token_kill (ffestb_local_.decl.recursive);
21102 goto bad_1; /* :::::::::::::::::::: */
21105 case FFELEX_typeNAMES:
21106 if (ffesta_first_kw != FFESTR_firstRECURSIVE)
21107 goto bad_0; /* :::::::::::::::::::: */
21108 switch (ffelex_token_type (t))
21110 case FFELEX_typeCOMMA:
21111 case FFELEX_typeCOLONCOLON:
21112 case FFELEX_typeASTERISK:
21113 case FFELEX_typeSEMICOLON:
21114 case FFELEX_typeEOS:
21115 ffesta_confirmed ();
21121 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlRECURSIVE);
21122 if (!ffesrc_is_name_init (*p))
21123 goto bad_0; /* :::::::::::::::::::: */
21124 ffestb_local_.decl.recursive
21125 = ffelex_token_name_from_names (ffesta_tokens[0], 0,
21126 FFESTR_firstlRECURSIVE);
21127 nt = ffelex_token_names_from_names (ffesta_tokens[0],
21128 FFESTR_firstlRECURSIVE, 0);
21129 switch (ffestr_first (nt))
21131 case FFESTR_firstINTGR:
21132 p = ffelex_token_text (nt) + (i = FFESTR_firstlINTGR);
21133 ffestb_local_.decl.type = FFESTP_typeINTEGER;
21135 goto typefunc; /* :::::::::::::::::::: */
21137 case FFESTR_firstBYTE:
21138 p = ffelex_token_text (nt) + (i = FFESTR_firstlBYTE);
21139 ffestb_local_.decl.type = FFESTP_typeBYTE;
21141 goto typefunc; /* :::::::::::::::::::: */
21143 case FFESTR_firstWORD:
21144 p = ffelex_token_text (nt) + (i = FFESTR_firstlWORD);
21145 ffestb_local_.decl.type = FFESTP_typeWORD;
21147 goto typefunc; /* :::::::::::::::::::: */
21149 case FFESTR_firstREAL:
21150 p = ffelex_token_text (nt) + (i = FFESTR_firstlREAL);
21151 ffestb_local_.decl.type = FFESTP_typeREAL;
21153 goto typefunc; /* :::::::::::::::::::: */
21155 case FFESTR_firstCMPLX:
21156 p = ffelex_token_text (nt) + (i = FFESTR_firstlCMPLX);
21157 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
21159 goto typefunc; /* :::::::::::::::::::: */
21161 case FFESTR_firstLGCL:
21162 p = ffelex_token_text (nt) + (i = FFESTR_firstlLGCL);
21163 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
21165 goto typefunc; /* :::::::::::::::::::: */
21167 case FFESTR_firstCHRCTR:
21168 p = ffelex_token_text (nt) + (i = FFESTR_firstlCHRCTR);
21169 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
21171 goto typefunc; /* :::::::::::::::::::: */
21173 case FFESTR_firstDBLPRCSN:
21174 p = ffelex_token_text (nt) + (i = FFESTR_firstlDBLPRCSN);
21175 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
21177 goto typefunc; /* :::::::::::::::::::: */
21179 case FFESTR_firstDBLCMPLX:
21180 p = ffelex_token_text (nt) + (i = FFESTR_firstlDBLCMPLX);
21181 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
21183 goto typefunc; /* :::::::::::::::::::: */
21185 case FFESTR_firstTYPE:
21186 p = ffelex_token_text (nt) + (i = FFESTR_firstlTYPE);
21187 ffestb_local_.decl.type = FFESTP_typeTYPE;
21188 next = (ffelexHandler) ffestb_decl_recursive3_;
21191 case FFESTR_firstFUNCTION:
21192 p = ffelex_token_text (nt) + (i = FFESTR_firstlFUNCTION);
21193 ffestb_local_.dummy.first_kw = FFESTR_firstFUNCTION;
21194 ffestb_local_.dummy.badname = "FUNCTION";
21195 ffestb_local_.dummy.is_subr = FALSE;
21196 next = (ffelexHandler) ffestb_decl_recursive4_;
21199 case FFESTR_firstSUBROUTINE:
21200 p = ffelex_token_text (nt) + (i = FFESTR_firstlSUBROUTINE);
21201 ffestb_local_.dummy.first_kw = FFESTR_firstSUBROUTINE;
21202 ffestb_local_.dummy.badname = "SUBROUTINE";
21203 ffestb_local_.dummy.is_subr = TRUE;
21204 next = (ffelexHandler) ffestb_decl_recursive4_;
21208 ffelex_token_kill (ffestb_local_.decl.recursive);
21209 ffelex_token_kill (nt);
21210 goto bad_1; /* :::::::::::::::::::: */
21214 ffelex_token_kill (nt);
21215 return (ffelexHandler) (*next) (t);
21217 if (!ffesrc_is_name_init (*p))
21218 goto bad_i; /* :::::::::::::::::::: */
21219 ot = ffelex_token_name_from_names (nt, i, 0);
21220 ffelex_token_kill (nt);
21221 next = (ffelexHandler) (*next) (ot);
21222 ffelex_token_kill (ot);
21223 return (ffelexHandler) (*next) (t);
21226 goto bad_0; /* :::::::::::::::::::: */
21229 typefunc: /* :::::::::::::::::::: */
21232 ffelex_token_kill (nt);
21233 if (needfunc) /* DOUBLE PRECISION or DOUBLE COMPLEX? */
21235 ffelex_token_kill (ffestb_local_.decl.recursive);
21236 goto bad_1; /* :::::::::::::::::::: */
21238 return (ffelexHandler) ffestb_decl_recursive1_ (t);
21240 if (!ffesrc_is_name_init (*p))
21241 goto bad_i; /* :::::::::::::::::::: */
21242 ot = ffelex_token_names_from_names (nt, i, 0);
21243 ffelex_token_kill (nt);
21244 if (ffestr_first (ot) != FFESTR_firstFUNCTION)
21245 goto bad_o; /* :::::::::::::::::::: */
21246 p = ffelex_token_text (ot) + (i = FFESTR_firstlFUNCTION);
21247 if (!ffesrc_is_name_init (*p))
21248 goto bad_i; /* :::::::::::::::::::: */
21249 ffesta_tokens[1] = ffelex_token_name_from_names (ot, i, 0);
21250 ffelex_token_kill (ot);
21251 ffestb_local_.decl.kind = NULL;
21252 ffestb_local_.decl.kindt = NULL;
21253 ffestb_local_.decl.len = NULL;
21254 ffestb_local_.decl.lent = NULL;
21255 return (ffelexHandler) ffestb_decl_funcname_1_ (t);
21257 bad_0: /* :::::::::::::::::::: */
21258 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ffesta_tokens[0]);
21259 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21261 bad_1: /* :::::::::::::::::::: */
21262 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21263 return (ffelexHandler) ffelex_swallow_tokens (t,
21264 (ffelexHandler) ffesta_zero); /* Invalid second token. */
21266 bad_i: /* :::::::::::::::::::: */
21267 ffelex_token_kill (ffestb_local_.decl.recursive);
21268 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", nt, i, t);
21269 ffelex_token_kill (nt);
21270 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21272 bad_o: /* :::::::::::::::::::: */
21273 ffelex_token_kill (ffestb_local_.decl.recursive);
21274 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ot);
21275 ffelex_token_kill (ot);
21276 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21279 /* ffestb_decl_recursive1_ -- "RECURSIVE" generic-type
21281 return ffestb_decl_recursive1_; // to lexer
21283 Handle ASTERISK, OPEN_PAREN, or NAME. */
21285 static ffelexHandler
21286 ffestb_decl_recursive1_ (ffelexToken t)
21288 switch (ffelex_token_type (t))
21290 case FFELEX_typeASTERISK:
21291 ffesta_confirmed ();
21292 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_;
21293 ffestb_local_.decl.badname = "TYPEFUNC";
21294 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
21295 return (ffelexHandler) ffestb_decl_starlen_;
21296 return (ffelexHandler) ffestb_decl_starkind_;
21298 case FFELEX_typeOPEN_PAREN:
21299 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_;
21300 ffestb_local_.decl.badname = "TYPEFUNC";
21301 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
21303 ffestb_local_.decl.kind = NULL;
21304 ffestb_local_.decl.kindt = NULL;
21305 ffestb_local_.decl.len = NULL;
21306 ffestb_local_.decl.lent = NULL;
21307 return (ffelexHandler) ffestb_decl_typeparams_;
21309 return (ffelexHandler) ffestb_decl_kindparam_;
21311 case FFELEX_typeNAME:
21312 ffestb_local_.decl.kind = NULL;
21313 ffestb_local_.decl.kindt = NULL;
21314 ffestb_local_.decl.len = NULL;
21315 ffestb_local_.decl.lent = NULL;
21316 return (ffelexHandler) ffestb_decl_func_ (t);
21322 if (ffestb_local_.decl.recursive != NULL)
21323 ffelex_token_kill (ffestb_local_.decl.recursive);
21324 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21325 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21328 /* ffestb_decl_recursive2_ -- "RECURSIVE" "DOUBLE"
21330 return ffestb_decl_recursive2_; // to lexer
21334 static ffelexHandler
21335 ffestb_decl_recursive2_ (ffelexToken t)
21337 switch (ffelex_token_type (t))
21339 case FFELEX_typeNAME:
21340 switch (ffestr_second (t))
21342 case FFESTR_secondPRECISION:
21343 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
21346 case FFESTR_secondCOMPLEX:
21347 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
21351 goto bad; /* :::::::::::::::::::: */
21353 ffestb_local_.decl.kind = NULL;
21354 ffestb_local_.decl.kindt = NULL;
21355 ffestb_local_.decl.len = NULL;
21356 ffestb_local_.decl.lent = NULL;
21357 return (ffelexHandler) ffestb_decl_func_;
21363 bad: /* :::::::::::::::::::: */
21364 if (ffestb_local_.decl.recursive != NULL)
21365 ffelex_token_kill (ffestb_local_.decl.recursive);
21366 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21367 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21370 /* ffestb_decl_recursive3_ -- "RECURSIVE" "TYPE"
21372 return ffestb_decl_recursive3_; // to lexer
21374 Handle OPEN_PAREN. */
21376 static ffelexHandler
21377 ffestb_decl_recursive3_ (ffelexToken t)
21379 switch (ffelex_token_type (t))
21381 case FFELEX_typeOPEN_PAREN:
21382 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_;
21383 ffestb_local_.decl.badname = "TYPEFUNC";
21384 return (ffelexHandler) ffestb_decl_typetype1_;
21390 if (ffestb_local_.decl.recursive != NULL)
21391 ffelex_token_kill (ffestb_local_.decl.recursive);
21392 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21393 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21396 /* ffestb_decl_recursive4_ -- "RECURSIVE" "FUNCTION/SUBROUTINE"
21398 return ffestb_decl_recursive4_; // to lexer
21400 Handle OPEN_PAREN. */
21402 static ffelexHandler
21403 ffestb_decl_recursive4_ (ffelexToken t)
21405 switch (ffelex_token_type (t))
21407 case FFELEX_typeNAME:
21408 ffesta_tokens[1] = ffelex_token_use (t);
21409 return (ffelexHandler) ffestb_dummy1_;
21415 if (ffestb_local_.decl.recursive != NULL)
21416 ffelex_token_kill (ffestb_local_.decl.recursive);
21417 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21418 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21422 /* ffestb_decl_typetype -- Parse the R426/R501/R1219 TYPE statement
21424 return ffestb_decl_typetype; // to lexer
21426 Make sure the statement has a valid form for the TYPE statement. If it
21427 does, implement the statement. */
21431 ffestb_decl_typetype (ffelexToken t)
21433 switch (ffelex_token_type (ffesta_tokens[0]))
21435 case FFELEX_typeNAME:
21436 if (ffesta_first_kw != FFESTR_firstTYPE)
21437 goto bad_0; /* :::::::::::::::::::: */
21440 case FFELEX_typeNAMES:
21441 if (ffesta_first_kw != FFESTR_firstTYPE)
21442 goto bad_0; /* :::::::::::::::::::: */
21443 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlTYPE)
21444 goto bad_0; /* :::::::::::::::::::: */
21448 goto bad_0; /* :::::::::::::::::::: */
21451 switch (ffelex_token_type (t))
21453 case FFELEX_typeOPEN_PAREN:
21456 case FFELEX_typeEOS:
21457 case FFELEX_typeSEMICOLON:
21458 case FFELEX_typeCOLONCOLON:/* Not COMMA: R424 "TYPE,PUBLIC::A". */
21459 ffesta_confirmed (); /* Error, but clearly intended. */
21460 goto bad_1; /* :::::::::::::::::::: */
21463 goto bad_1; /* :::::::::::::::::::: */
21466 ffestb_local_.decl.recursive = NULL;
21467 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
21468 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
21470 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
21471 ffestb_local_.decl.badname = "type-declaration";
21472 return (ffelexHandler) ffestb_decl_typetype1_;
21474 bad_0: /* :::::::::::::::::::: */
21475 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
21476 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21478 bad_1: /* :::::::::::::::::::: */
21479 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21480 return (ffelexHandler) ffelex_swallow_tokens (t,
21481 (ffelexHandler) ffesta_zero); /* Invalid second token. */
21485 /* ffestb_decl_attrs_ -- "type" [type parameters] COMMA
21487 return ffestb_decl_attrs_; // to lexer
21489 Handle NAME of an attribute. */
21491 static ffelexHandler
21492 ffestb_decl_attrs_ (ffelexToken t)
21494 switch (ffelex_token_type (t))
21496 case FFELEX_typeNAME:
21497 switch (ffestr_first (t))
21500 case FFESTR_firstALLOCATABLE:
21501 if (!ffesta_is_inhibited ())
21502 ffestc_decl_attrib (FFESTP_attribALLOCATABLE, t,
21503 FFESTR_otherNone, NULL);
21504 return (ffelexHandler) ffestb_decl_attrs_7_;
21507 case FFESTR_firstDIMENSION:
21508 ffesta_tokens[1] = ffelex_token_use (t);
21509 return (ffelexHandler) ffestb_decl_attrs_1_;
21511 case FFESTR_firstEXTERNAL:
21512 if (!ffesta_is_inhibited ())
21513 ffestc_decl_attrib (FFESTP_attribEXTERNAL, t,
21514 FFESTR_otherNone, NULL);
21515 return (ffelexHandler) ffestb_decl_attrs_7_;
21518 case FFESTR_firstINTENT:
21519 ffesta_tokens[1] = ffelex_token_use (t);
21520 return (ffelexHandler) ffestb_decl_attrs_3_;
21523 case FFESTR_firstINTRINSIC:
21524 if (!ffesta_is_inhibited ())
21525 ffestc_decl_attrib (FFESTP_attribINTRINSIC, t,
21526 FFESTR_otherNone, NULL);
21527 return (ffelexHandler) ffestb_decl_attrs_7_;
21530 case FFESTR_firstOPTIONAL:
21531 if (!ffesta_is_inhibited ())
21532 ffestc_decl_attrib (FFESTP_attribOPTIONAL, t,
21533 FFESTR_otherNone, NULL);
21534 return (ffelexHandler) ffestb_decl_attrs_7_;
21537 case FFESTR_firstPARAMETER:
21538 ffestb_local_.decl.parameter = TRUE;
21539 if (!ffesta_is_inhibited ())
21540 ffestc_decl_attrib (FFESTP_attribPARAMETER, t,
21541 FFESTR_otherNone, NULL);
21542 return (ffelexHandler) ffestb_decl_attrs_7_;
21545 case FFESTR_firstPOINTER:
21546 if (!ffesta_is_inhibited ())
21547 ffestc_decl_attrib (FFESTP_attribPOINTER, t,
21548 FFESTR_otherNone, NULL);
21549 return (ffelexHandler) ffestb_decl_attrs_7_;
21553 case FFESTR_firstPRIVATE:
21554 if (!ffesta_is_inhibited ())
21555 ffestc_decl_attrib (FFESTP_attribPRIVATE, t,
21556 FFESTR_otherNone, NULL);
21557 return (ffelexHandler) ffestb_decl_attrs_7_;
21559 case FFESTR_firstPUBLIC:
21560 if (!ffesta_is_inhibited ())
21561 ffestc_decl_attrib (FFESTP_attribPUBLIC, t,
21562 FFESTR_otherNone, NULL);
21563 return (ffelexHandler) ffestb_decl_attrs_7_;
21566 case FFESTR_firstSAVE:
21567 if (!ffesta_is_inhibited ())
21568 ffestc_decl_attrib (FFESTP_attribSAVE, t,
21569 FFESTR_otherNone, NULL);
21570 return (ffelexHandler) ffestb_decl_attrs_7_;
21573 case FFESTR_firstTARGET:
21574 if (!ffesta_is_inhibited ())
21575 ffestc_decl_attrib (FFESTP_attribTARGET, t,
21576 FFESTR_otherNone, NULL);
21577 return (ffelexHandler) ffestb_decl_attrs_7_;
21581 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21582 return (ffelexHandler) ffestb_decl_attrs_7_;
21590 if (!ffesta_is_inhibited ())
21591 ffestc_decl_finish ();
21592 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21593 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21596 /* ffestb_decl_attrs_1_ -- "type" [type parameters] ",DIMENSION"
21598 return ffestb_decl_attrs_1_; // to lexer
21600 Handle OPEN_PAREN. */
21602 static ffelexHandler
21603 ffestb_decl_attrs_1_ (ffelexToken t)
21605 switch (ffelex_token_type (t))
21607 case FFELEX_typeOPEN_PAREN:
21608 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
21609 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_decl_attrs_2_;
21610 ffestb_subrargs_.dim_list.pool = ffesta_scratch_pool;
21611 ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid
21612 ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON;
21613 #ifdef FFECOM_dimensionsMAX
21614 ffestb_subrargs_.dim_list.ndims = 0;
21616 return (ffelexHandler) ffeexpr_rhs (ffesta_scratch_pool,
21617 ffestb_subrargs_.dim_list.ctx,
21618 (ffeexprCallback) ffestb_subr_dimlist_);
21620 case FFELEX_typeCOMMA:
21621 case FFELEX_typeCOLONCOLON:
21622 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, ffesta_tokens[1]);
21623 ffelex_token_kill (ffesta_tokens[1]);
21624 return (ffelexHandler) ffestb_decl_attrs_7_ (t);
21630 if (!ffesta_is_inhibited ())
21631 ffestc_decl_finish ();
21632 ffelex_token_kill (ffesta_tokens[1]);
21633 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21634 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21637 /* ffestb_decl_attrs_2_ -- "type" [type parameters] ",DIMENSION" OPEN_PAREN
21638 dimlist CLOSE_PAREN
21640 return ffestb_decl_attrs_2_; // to lexer
21642 Handle COMMA or COLONCOLON. */
21644 static ffelexHandler
21645 ffestb_decl_attrs_2_ (ffelexToken t)
21647 if (!ffestb_subrargs_.dim_list.ok)
21648 goto bad; /* :::::::::::::::::::: */
21650 switch (ffelex_token_type (t))
21652 case FFELEX_typeCOMMA:
21653 case FFELEX_typeCOLONCOLON:
21654 if (!ffesta_is_inhibited ())
21655 ffestc_decl_attrib (FFESTP_attribDIMENSION, ffesta_tokens[1],
21656 FFESTR_otherNone, ffestb_subrargs_.dim_list.dims);
21657 ffelex_token_kill (ffesta_tokens[1]);
21658 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
21659 return (ffelexHandler) ffestb_decl_attrs_7_ (t);
21665 bad: /* :::::::::::::::::::: */
21666 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21667 if (!ffesta_is_inhibited ())
21668 ffestc_decl_finish ();
21669 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
21670 ffelex_token_kill (ffesta_tokens[1]);
21671 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21674 /* ffestb_decl_attrs_3_ -- "type" [type parameters] ",INTENT"
21676 return ffestb_decl_attrs_3_; // to lexer
21678 Handle OPEN_PAREN. */
21681 static ffelexHandler
21682 ffestb_decl_attrs_3_ (ffelexToken t)
21684 switch (ffelex_token_type (t))
21686 case FFELEX_typeOPEN_PAREN:
21687 return (ffelexHandler) ffestb_decl_attrs_4_;
21689 case FFELEX_typeCOMMA:
21690 case FFELEX_typeCOLONCOLON:
21691 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, ffesta_tokens[1]);
21692 ffelex_token_kill (ffesta_tokens[1]);
21693 return (ffelexHandler) ffestb_decl_attrs_7_ (t);
21699 if (!ffesta_is_inhibited ())
21700 ffestc_decl_finish ();
21701 ffelex_token_kill (ffesta_tokens[1]);
21702 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21703 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21706 /* ffestb_decl_attrs_4_ -- "type" [type parameters] ",INTENT" OPEN_PAREN
21708 return ffestb_decl_attrs_4_; // to lexer
21712 static ffelexHandler
21713 ffestb_decl_attrs_4_ (ffelexToken t)
21715 switch (ffelex_token_type (t))
21717 case FFELEX_typeNAME:
21718 ffestb_local_.decl.kw = ffestr_other (t);
21719 switch (ffestb_local_.decl.kw)
21721 case FFESTR_otherIN:
21722 return (ffelexHandler) ffestb_decl_attrs_5_;
21724 case FFESTR_otherINOUT:
21725 return (ffelexHandler) ffestb_decl_attrs_6_;
21727 case FFESTR_otherOUT:
21728 return (ffelexHandler) ffestb_decl_attrs_6_;
21731 ffestb_local_.decl.kw = FFESTR_otherNone;
21732 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21733 return (ffelexHandler) ffestb_decl_attrs_5_;
21741 if (!ffesta_is_inhibited ())
21742 ffestc_decl_finish ();
21743 ffelex_token_kill (ffesta_tokens[1]);
21744 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21745 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21748 /* ffestb_decl_attrs_5_ -- "type" [type parameters] ",INTENT" OPEN_PAREN "IN"
21750 return ffestb_decl_attrs_5_; // to lexer
21752 Handle NAME or CLOSE_PAREN. */
21754 static ffelexHandler
21755 ffestb_decl_attrs_5_ (ffelexToken t)
21757 switch (ffelex_token_type (t))
21759 case FFELEX_typeNAME:
21760 switch (ffestr_other (t))
21762 case FFESTR_otherOUT:
21763 if (ffestb_local_.decl.kw != FFESTR_otherNone)
21764 ffestb_local_.decl.kw = FFESTR_otherINOUT;
21765 return (ffelexHandler) ffestb_decl_attrs_6_;
21768 if (ffestb_local_.decl.kw != FFESTR_otherNone)
21770 ffestb_local_.decl.kw = FFESTR_otherNone;
21771 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21773 return (ffelexHandler) ffestb_decl_attrs_5_;
21777 case FFELEX_typeCLOSE_PAREN:
21778 return (ffelexHandler) ffestb_decl_attrs_6_ (t);
21784 if (!ffesta_is_inhibited ())
21785 ffestc_decl_finish ();
21786 ffelex_token_kill (ffesta_tokens[1]);
21787 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21788 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21791 /* ffestb_decl_attrs_6_ -- "type" [type parameters] ",INTENT" OPEN_PAREN "IN"
21794 return ffestb_decl_attrs_6_; // to lexer
21796 Handle CLOSE_PAREN. */
21798 static ffelexHandler
21799 ffestb_decl_attrs_6_ (ffelexToken t)
21801 switch (ffelex_token_type (t))
21803 case FFELEX_typeCLOSE_PAREN:
21804 if ((ffestb_local_.decl.kw != FFESTR_otherNone)
21805 && !ffesta_is_inhibited ())
21806 ffestc_decl_attrib (FFESTP_attribINTENT, ffesta_tokens[1],
21807 ffestb_local_.decl.kw, NULL);
21808 ffelex_token_kill (ffesta_tokens[1]);
21809 return (ffelexHandler) ffestb_decl_attrs_7_;
21815 if (!ffesta_is_inhibited ())
21816 ffestc_decl_finish ();
21817 ffelex_token_kill (ffesta_tokens[1]);
21818 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21819 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21823 /* ffestb_decl_attrs_7_ -- "type" [type parameters] attribute
21825 return ffestb_decl_attrs_7_; // to lexer
21827 Handle COMMA (another attribute) or COLONCOLON (entities). */
21829 static ffelexHandler
21830 ffestb_decl_attrs_7_ (ffelexToken t)
21832 switch (ffelex_token_type (t))
21834 case FFELEX_typeCOMMA:
21835 return (ffelexHandler) ffestb_decl_attrs_;
21837 case FFELEX_typeCOLONCOLON:
21838 ffestb_local_.decl.coloncolon = TRUE;
21839 return (ffelexHandler) ffestb_decl_ents_;
21845 if (!ffesta_is_inhibited ())
21846 ffestc_decl_finish ();
21847 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21848 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21851 /* ffestb_decl_attrsp_ -- "type" [type parameters]
21853 return ffestb_decl_attrsp_; // to lexer
21855 Handle COMMA (meaning we have attributes), COLONCOLON (meaning we have
21856 no attributes but entities), or go to entsp to see about functions or
21859 static ffelexHandler
21860 ffestb_decl_attrsp_ (ffelexToken t)
21862 ffelex_set_names (FALSE);
21864 switch (ffelex_token_type (t))
21866 case FFELEX_typeCOMMA:
21867 ffesta_confirmed ();
21868 if (!ffesta_is_inhibited ())
21869 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
21870 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
21871 ffestb_local_.decl.len, ffestb_local_.decl.lent);
21872 if (ffestb_local_.decl.kindt != NULL)
21873 ffelex_token_kill (ffestb_local_.decl.kindt);
21874 if (ffestb_local_.decl.lent != NULL)
21875 ffelex_token_kill (ffestb_local_.decl.lent);
21876 return (ffelexHandler) ffestb_decl_attrs_;
21878 case FFELEX_typeCOLONCOLON:
21879 ffestb_local_.decl.coloncolon = TRUE;
21880 ffesta_confirmed ();
21881 if (!ffesta_is_inhibited ())
21882 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
21883 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
21884 ffestb_local_.decl.len, ffestb_local_.decl.lent);
21885 if (ffestb_local_.decl.kindt != NULL)
21886 ffelex_token_kill (ffestb_local_.decl.kindt);
21887 if (ffestb_local_.decl.lent != NULL)
21888 ffelex_token_kill (ffestb_local_.decl.lent);
21889 return (ffelexHandler) ffestb_decl_ents_;
21892 return (ffelexHandler) ffestb_decl_entsp_ (t);
21896 /* ffestb_decl_ents_ -- "type" [type parameters] [attributes "::"]
21898 return ffestb_decl_ents_; // to lexer
21900 Handle NAME of an entity. */
21902 static ffelexHandler
21903 ffestb_decl_ents_ (ffelexToken t)
21905 switch (ffelex_token_type (t))
21907 case FFELEX_typeNAME:
21908 ffesta_tokens[1] = ffelex_token_use (t);
21909 return (ffelexHandler) ffestb_decl_ents_1_;
21915 if (!ffesta_is_inhibited ())
21916 ffestc_decl_finish ();
21917 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21918 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21921 /* ffestb_decl_ents_1_ -- "type" [type parameters] [attributes "::"] NAME
21923 return ffestb_decl_ents_1_; // to lexer
21925 Handle ASTERISK, OPEN_PAREN, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */
21927 static ffelexHandler
21928 ffestb_decl_ents_1_ (ffelexToken t)
21930 switch (ffelex_token_type (t))
21932 case FFELEX_typeCOMMA:
21933 if (!ffesta_is_inhibited ())
21934 ffestc_decl_item (ffesta_tokens[1], NULL, NULL, NULL, NULL, NULL, NULL,
21936 ffelex_token_kill (ffesta_tokens[1]);
21937 return (ffelexHandler) ffestb_decl_ents_;
21939 case FFELEX_typeEOS:
21940 case FFELEX_typeSEMICOLON:
21941 if (!ffesta_is_inhibited ())
21943 ffestc_decl_item (ffesta_tokens[1], NULL, NULL, NULL, NULL, NULL, NULL,
21945 ffestc_decl_finish ();
21947 ffelex_token_kill (ffesta_tokens[1]);
21948 return (ffelexHandler) ffesta_zero (t);
21950 case FFELEX_typeASTERISK:
21951 ffestb_local_.decl.len = NULL;
21952 ffestb_local_.decl.lent = NULL;
21953 return (ffelexHandler) ffestb_decl_ents_2_;
21955 case FFELEX_typeOPEN_PAREN:
21956 ffestb_local_.decl.kind = NULL;
21957 ffestb_local_.decl.kindt = NULL;
21958 ffestb_local_.decl.len = NULL;
21959 ffestb_local_.decl.lent = NULL;
21960 return (ffelexHandler) ffestb_decl_ents_3_ (t);
21962 case FFELEX_typeEQUALS:
21963 case FFELEX_typeSLASH:
21964 ffestb_local_.decl.kind = NULL;
21965 ffestb_local_.decl.kindt = NULL;
21966 ffestb_subrargs_.dim_list.dims = NULL;
21967 ffestb_local_.decl.len = NULL;
21968 ffestb_local_.decl.lent = NULL;
21969 return (ffelexHandler) ffestb_decl_ents_7_ (t);
21975 if (!ffesta_is_inhibited ())
21976 ffestc_decl_finish ();
21977 ffelex_token_kill (ffesta_tokens[1]);
21978 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21979 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21982 /* ffestb_decl_ents_2_ -- "type" [type parameters] [attributes "::"] NAME
21985 return ffestb_decl_ents_2_; // to lexer
21987 Handle NUMBER or OPEN_PAREN. */
21989 static ffelexHandler
21990 ffestb_decl_ents_2_ (ffelexToken t)
21992 switch (ffelex_token_type (t))
21994 case FFELEX_typeNUMBER:
21995 if (ffestb_local_.decl.type != FFESTP_typeCHARACTER)
21997 ffestb_local_.decl.kind = NULL;
21998 ffestb_local_.decl.kindt = ffelex_token_use (t);
21999 return (ffelexHandler) ffestb_decl_ents_3_;
22001 /* Fall through. *//* (CHARACTER's *n is always a len spec. */
22002 case FFELEX_typeOPEN_PAREN:/* "*(" is after the (omitted)
22004 ffestb_local_.decl.kind = NULL;
22005 ffestb_local_.decl.kindt = NULL;
22006 ffestb_subrargs_.dim_list.dims = NULL;
22007 return (ffelexHandler) ffestb_decl_ents_5_ (t);
22013 if (!ffesta_is_inhibited ())
22014 ffestc_decl_finish ();
22015 ffelex_token_kill (ffesta_tokens[1]);
22016 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22017 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22020 /* ffestb_decl_ents_3_ -- "type" [type parameters] [attributes "::"] NAME
22023 return ffestb_decl_ents_3_; // to lexer
22025 Handle ASTERISK, OPEN_PAREN, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */
22027 static ffelexHandler
22028 ffestb_decl_ents_3_ (ffelexToken t)
22030 switch (ffelex_token_type (t))
22032 case FFELEX_typeCOMMA:
22033 if (!ffesta_is_inhibited ())
22034 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22035 ffestb_local_.decl.kindt, NULL, NULL, NULL, NULL, NULL, FALSE);
22036 ffelex_token_kill (ffesta_tokens[1]);
22037 if (ffestb_local_.decl.kindt != NULL)
22038 ffelex_token_kill (ffestb_local_.decl.kindt);
22039 return (ffelexHandler) ffestb_decl_ents_;
22041 case FFELEX_typeEOS:
22042 case FFELEX_typeSEMICOLON:
22043 if (!ffesta_is_inhibited ())
22045 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22046 ffestb_local_.decl.kindt, NULL, NULL, NULL, NULL, NULL, FALSE);
22047 ffestc_decl_finish ();
22049 ffelex_token_kill (ffesta_tokens[1]);
22050 if (ffestb_local_.decl.kindt != NULL)
22051 ffelex_token_kill (ffestb_local_.decl.kindt);
22052 return (ffelexHandler) ffesta_zero (t);
22054 case FFELEX_typeASTERISK:
22055 ffestb_subrargs_.dim_list.dims = NULL;
22056 return (ffelexHandler) ffestb_decl_ents_5_;
22058 case FFELEX_typeOPEN_PAREN:
22059 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
22060 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_decl_ents_4_;
22061 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
22062 ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid
22063 ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON;
22064 #ifdef FFECOM_dimensionsMAX
22065 ffestb_subrargs_.dim_list.ndims = 0;
22067 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
22068 ffestb_subrargs_.dim_list.ctx,
22069 (ffeexprCallback) ffestb_subr_dimlist_);
22071 case FFELEX_typeEQUALS:
22072 case FFELEX_typeSLASH:
22073 ffestb_local_.decl.kind = NULL;
22074 ffestb_local_.decl.kindt = NULL;
22075 ffestb_subrargs_.dim_list.dims = NULL;
22076 ffestb_local_.decl.len = NULL;
22077 ffestb_local_.decl.lent = NULL;
22078 return (ffelexHandler) ffestb_decl_ents_7_ (t);
22084 if (!ffesta_is_inhibited ())
22085 ffestc_decl_finish ();
22086 ffelex_token_kill (ffesta_tokens[1]);
22087 if (ffestb_local_.decl.kindt != NULL)
22088 ffelex_token_kill (ffestb_local_.decl.kindt);
22089 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22090 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22093 /* ffestb_decl_ents_4_ -- "type" [type parameters] [attributes "::"] NAME
22094 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22096 return ffestb_decl_ents_4_; // to lexer
22098 Handle ASTERISK, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */
22100 static ffelexHandler
22101 ffestb_decl_ents_4_ (ffelexToken t)
22105 if (!ffestb_subrargs_.dim_list.ok)
22106 goto bad; /* :::::::::::::::::::: */
22108 if (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeNAMES)
22110 switch (ffelex_token_type (t))
22112 case FFELEX_typeCOMMA:
22113 case FFELEX_typeEOS:
22114 case FFELEX_typeSEMICOLON:
22115 case FFELEX_typeASTERISK:
22116 case FFELEX_typeSLASH: /* But NOT FFELEX_typeEQUALS. */
22117 case FFELEX_typeCOLONCOLON: /* Actually an error. */
22118 break; /* Confirm and handle. */
22120 default: /* Perhaps EQUALS, as in
22121 INTEGERFUNCTIONX(A)=B. */
22122 goto bad; /* :::::::::::::::::::: */
22124 ffesta_confirmed ();
22125 if (!ffesta_is_inhibited ())
22127 nt = ffelex_token_name_from_names (ffesta_tokens[1], 0, 0);
22128 ffelex_token_kill (ffesta_tokens[1]);
22129 ffesta_tokens[1] = nt;
22130 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
22131 NULL, NULL, NULL, NULL);
22135 switch (ffelex_token_type (t))
22137 case FFELEX_typeCOMMA:
22138 if (!ffesta_is_inhibited ())
22139 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22140 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22141 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22143 ffelex_token_kill (ffesta_tokens[1]);
22144 if (ffestb_local_.decl.kindt != NULL)
22145 ffelex_token_kill (ffestb_local_.decl.kindt);
22146 if (ffestb_local_.decl.lent != NULL)
22147 ffelex_token_kill (ffestb_local_.decl.lent);
22148 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22149 return (ffelexHandler) ffestb_decl_ents_;
22151 case FFELEX_typeEOS:
22152 case FFELEX_typeSEMICOLON:
22153 if (!ffesta_is_inhibited ())
22155 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22156 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22157 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22159 ffestc_decl_finish ();
22161 ffelex_token_kill (ffesta_tokens[1]);
22162 if (ffestb_local_.decl.kindt != NULL)
22163 ffelex_token_kill (ffestb_local_.decl.kindt);
22164 if (ffestb_local_.decl.lent != NULL)
22165 ffelex_token_kill (ffestb_local_.decl.lent);
22166 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22167 return (ffelexHandler) ffesta_zero (t);
22169 case FFELEX_typeASTERISK:
22170 if (ffestb_local_.decl.lent != NULL)
22171 break; /* Can't specify "*length" twice. */
22172 return (ffelexHandler) ffestb_decl_ents_5_;
22174 case FFELEX_typeEQUALS:
22175 case FFELEX_typeSLASH:
22176 return (ffelexHandler) ffestb_decl_ents_7_ (t);
22182 bad: /* :::::::::::::::::::: */
22183 if ((ffelex_token_type (ffesta_tokens[1]) != FFELEX_typeNAMES)
22184 && !ffesta_is_inhibited ())
22185 ffestc_decl_finish ();
22186 ffelex_token_kill (ffesta_tokens[1]);
22187 if (ffestb_local_.decl.kindt != NULL)
22188 ffelex_token_kill (ffestb_local_.decl.kindt);
22189 if (ffestb_local_.decl.lent != NULL)
22190 ffelex_token_kill (ffestb_local_.decl.lent);
22191 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22192 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22193 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22196 /* ffestb_decl_ents_5_ -- "type" [type parameters] [attributes "::"] NAME
22197 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22200 return ffestb_decl_ents_5_; // to lexer
22202 Handle NUMBER or OPEN_PAREN. */
22204 static ffelexHandler
22205 ffestb_decl_ents_5_ (ffelexToken t)
22207 switch (ffelex_token_type (t))
22209 case FFELEX_typeNUMBER:
22210 ffestb_local_.decl.len = NULL;
22211 ffestb_local_.decl.lent = ffelex_token_use (t);
22212 return (ffelexHandler) ffestb_decl_ents_7_;
22214 case FFELEX_typeOPEN_PAREN:
22215 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
22216 FFEEXPR_contextCHARACTERSIZE, (ffeexprCallback) ffestb_decl_ents_6_);
22222 if (!ffesta_is_inhibited ())
22223 ffestc_decl_finish ();
22224 ffelex_token_kill (ffesta_tokens[1]);
22225 if (ffestb_local_.decl.kindt != NULL)
22226 ffelex_token_kill (ffestb_local_.decl.kindt);
22227 if (ffestb_subrargs_.dim_list.dims != NULL)
22228 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22229 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22230 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22233 /* ffestb_decl_ents_6_ -- "type" [type parameters] [attributes "::"] NAME
22234 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22235 ASTERISK OPEN_PAREN expr
22237 (ffestb_decl_ents_6_) // to expression handler
22239 Handle CLOSE_PAREN. */
22241 static ffelexHandler
22242 ffestb_decl_ents_6_ (ffelexToken ft, ffebld expr, ffelexToken t)
22244 switch (ffelex_token_type (t))
22246 case FFELEX_typeCLOSE_PAREN:
22249 ffestb_local_.decl.len = expr;
22250 ffestb_local_.decl.lent = ffelex_token_use (ft);
22251 return (ffelexHandler) ffestb_decl_ents_7_;
22257 if (!ffesta_is_inhibited ())
22258 ffestc_decl_finish ();
22259 ffelex_token_kill (ffesta_tokens[1]);
22260 if (ffestb_local_.decl.kindt != NULL)
22261 ffelex_token_kill (ffestb_local_.decl.kindt);
22262 if (ffestb_subrargs_.dim_list.dims != NULL)
22263 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22264 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22265 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22268 /* ffestb_decl_ents_7_ -- "type" [type parameters] [attributes "::"] NAME
22269 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22270 [ASTERISK charlength]
22272 return ffestb_decl_ents_7_; // to lexer
22274 Handle EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */
22276 static ffelexHandler
22277 ffestb_decl_ents_7_ (ffelexToken t)
22279 switch (ffelex_token_type (t))
22281 case FFELEX_typeCOMMA:
22282 if (!ffesta_is_inhibited ())
22283 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22284 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22285 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22287 ffelex_token_kill (ffesta_tokens[1]);
22288 if (ffestb_local_.decl.kindt != NULL)
22289 ffelex_token_kill (ffestb_local_.decl.kindt);
22290 if (ffestb_subrargs_.dim_list.dims != NULL)
22291 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22292 if (ffestb_local_.decl.lent != NULL)
22293 ffelex_token_kill (ffestb_local_.decl.lent);
22294 return (ffelexHandler) ffestb_decl_ents_;
22296 case FFELEX_typeEOS:
22297 case FFELEX_typeSEMICOLON:
22298 if (!ffesta_is_inhibited ())
22300 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22301 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22302 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22304 ffestc_decl_finish ();
22306 ffelex_token_kill (ffesta_tokens[1]);
22307 if (ffestb_local_.decl.kindt != NULL)
22308 ffelex_token_kill (ffestb_local_.decl.kindt);
22309 if (ffestb_subrargs_.dim_list.dims != NULL)
22310 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22311 if (ffestb_local_.decl.lent != NULL)
22312 ffelex_token_kill (ffestb_local_.decl.lent);
22313 return (ffelexHandler) ffesta_zero (t);
22315 case FFELEX_typeEQUALS:
22316 if (!ffestb_local_.decl.coloncolon)
22317 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_INIT, t);
22318 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
22319 ffestb_local_.decl.parameter ? FFEEXPR_contextPARAMETER
22320 : FFEEXPR_contextINITVAL, (ffeexprCallback) ffestb_decl_ents_8_);
22322 case FFELEX_typeSLASH:
22323 if (!ffesta_is_inhibited ())
22325 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22326 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22327 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22329 ffestc_decl_itemstartvals ();
22331 ffelex_token_kill (ffesta_tokens[1]);
22332 if (ffestb_local_.decl.kindt != NULL)
22333 ffelex_token_kill (ffestb_local_.decl.kindt);
22334 if (ffestb_subrargs_.dim_list.dims != NULL)
22335 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22336 if (ffestb_local_.decl.lent != NULL)
22337 ffelex_token_kill (ffestb_local_.decl.lent);
22338 return (ffelexHandler) ffeexpr_rhs
22339 (ffesta_output_pool, FFEEXPR_contextDATA,
22340 (ffeexprCallback) ffestb_decl_ents_9_);
22346 if (!ffesta_is_inhibited ())
22347 ffestc_decl_finish ();
22348 ffelex_token_kill (ffesta_tokens[1]);
22349 if (ffestb_local_.decl.kindt != NULL)
22350 ffelex_token_kill (ffestb_local_.decl.kindt);
22351 if (ffestb_subrargs_.dim_list.dims != NULL)
22352 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22353 if (ffestb_local_.decl.lent != NULL)
22354 ffelex_token_kill (ffestb_local_.decl.lent);
22355 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22356 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22359 /* ffestb_decl_ents_8_ -- "type" [type parameters] [attributes "::"] NAME
22360 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22361 [ASTERISK charlength] EQUALS expr
22363 (ffestb_decl_ents_8_) // to expression handler
22365 Handle COMMA or EOS/SEMICOLON. */
22367 static ffelexHandler
22368 ffestb_decl_ents_8_ (ffelexToken ft, ffebld expr, ffelexToken t)
22370 switch (ffelex_token_type (t))
22372 case FFELEX_typeCOMMA:
22375 if (!ffesta_is_inhibited ())
22376 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22377 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22378 ffestb_local_.decl.len, ffestb_local_.decl.lent, expr, ft,
22380 ffelex_token_kill (ffesta_tokens[1]);
22381 if (ffestb_local_.decl.kindt != NULL)
22382 ffelex_token_kill (ffestb_local_.decl.kindt);
22383 if (ffestb_subrargs_.dim_list.dims != NULL)
22384 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22385 if (ffestb_local_.decl.lent != NULL)
22386 ffelex_token_kill (ffestb_local_.decl.lent);
22387 return (ffelexHandler) ffestb_decl_ents_;
22389 case FFELEX_typeEOS:
22390 case FFELEX_typeSEMICOLON:
22391 if (!ffesta_is_inhibited ())
22393 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22394 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22395 ffestb_local_.decl.len, ffestb_local_.decl.lent, expr, ft,
22397 ffestc_decl_finish ();
22399 ffelex_token_kill (ffesta_tokens[1]);
22400 if (ffestb_local_.decl.kindt != NULL)
22401 ffelex_token_kill (ffestb_local_.decl.kindt);
22402 if (ffestb_subrargs_.dim_list.dims != NULL)
22403 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22404 if (ffestb_local_.decl.lent != NULL)
22405 ffelex_token_kill (ffestb_local_.decl.lent);
22406 return (ffelexHandler) ffesta_zero (t);
22412 if (!ffesta_is_inhibited ())
22413 ffestc_decl_finish ();
22414 ffelex_token_kill (ffesta_tokens[1]);
22415 if (ffestb_local_.decl.kindt != NULL)
22416 ffelex_token_kill (ffestb_local_.decl.kindt);
22417 if (ffestb_subrargs_.dim_list.dims != NULL)
22418 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22419 if (ffestb_local_.decl.lent != NULL)
22420 ffelex_token_kill (ffestb_local_.decl.lent);
22421 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22422 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22425 /* ffestb_decl_ents_9_ -- "type" ... SLASH expr
22427 (ffestb_decl_ents_9_) // to expression handler
22429 Handle ASTERISK, COMMA, or SLASH. */
22431 static ffelexHandler
22432 ffestb_decl_ents_9_ (ffelexToken ft, ffebld expr, ffelexToken t)
22434 switch (ffelex_token_type (t))
22436 case FFELEX_typeCOMMA:
22439 if (!ffesta_is_inhibited ())
22440 ffestc_decl_itemvalue (NULL, NULL, expr, ft);
22441 return (ffelexHandler) ffeexpr_rhs
22442 (ffesta_output_pool, FFEEXPR_contextDATA,
22443 (ffeexprCallback) ffestb_decl_ents_9_);
22445 case FFELEX_typeASTERISK:
22448 ffestb_local_.decl.expr = expr;
22449 ffesta_tokens[1] = ffelex_token_use (ft);
22450 return (ffelexHandler) ffeexpr_rhs
22451 (ffesta_output_pool, FFEEXPR_contextDATA,
22452 (ffeexprCallback) ffestb_decl_ents_10_);
22454 case FFELEX_typeSLASH:
22457 if (!ffesta_is_inhibited ())
22459 ffestc_decl_itemvalue (NULL, NULL, expr, ft);
22460 ffestc_decl_itemendvals (t);
22462 return (ffelexHandler) ffestb_decl_ents_11_;
22465 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22469 if (!ffesta_is_inhibited ())
22471 ffestc_decl_itemendvals (t);
22472 ffestc_decl_finish ();
22474 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22477 /* ffestb_decl_ents_10_ -- "type" ... SLASH expr ASTERISK expr
22479 (ffestb_decl_ents_10_) // to expression handler
22481 Handle COMMA or SLASH. */
22483 static ffelexHandler
22484 ffestb_decl_ents_10_ (ffelexToken ft, ffebld expr, ffelexToken t)
22486 switch (ffelex_token_type (t))
22488 case FFELEX_typeCOMMA:
22491 if (!ffesta_is_inhibited ())
22492 ffestc_decl_itemvalue (ffestb_local_.decl.expr, ffesta_tokens[1],
22494 ffelex_token_kill (ffesta_tokens[1]);
22495 return (ffelexHandler) ffeexpr_rhs
22496 (ffesta_output_pool, FFEEXPR_contextDATA,
22497 (ffeexprCallback) ffestb_decl_ents_9_);
22499 case FFELEX_typeSLASH:
22502 if (!ffesta_is_inhibited ())
22504 ffestc_decl_itemvalue (ffestb_local_.decl.expr, ffesta_tokens[1],
22506 ffestc_decl_itemendvals (t);
22508 ffelex_token_kill (ffesta_tokens[1]);
22509 return (ffelexHandler) ffestb_decl_ents_11_;
22512 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22516 if (!ffesta_is_inhibited ())
22518 ffestc_decl_itemendvals (t);
22519 ffestc_decl_finish ();
22521 ffelex_token_kill (ffesta_tokens[1]);
22522 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22525 /* ffestb_decl_ents_11_ -- "type" [type parameters] [attributes "::"] NAME
22526 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22527 [ASTERISK charlength] SLASH initvals SLASH
22529 return ffestb_decl_ents_11_; // to lexer
22531 Handle COMMA or EOS/SEMICOLON. */
22533 static ffelexHandler
22534 ffestb_decl_ents_11_ (ffelexToken t)
22536 switch (ffelex_token_type (t))
22538 case FFELEX_typeCOMMA:
22539 return (ffelexHandler) ffestb_decl_ents_;
22541 case FFELEX_typeEOS:
22542 case FFELEX_typeSEMICOLON:
22543 if (!ffesta_is_inhibited ())
22544 ffestc_decl_finish ();
22545 return (ffelexHandler) ffesta_zero (t);
22551 if (!ffesta_is_inhibited ())
22552 ffestc_decl_finish ();
22553 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22554 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22557 /* ffestb_decl_entsp_ -- "type" [type parameters]
22559 return ffestb_decl_entsp_; // to lexer
22561 Handle NAME or NAMES beginning either an entity (object) declaration or
22562 a function definition.. */
22564 static ffelexHandler
22565 ffestb_decl_entsp_ (ffelexToken t)
22567 switch (ffelex_token_type (t))
22569 case FFELEX_typeNAME:
22570 ffesta_confirmed ();
22571 ffesta_tokens[1] = ffelex_token_use (t);
22572 return (ffelexHandler) ffestb_decl_entsp_1_;
22574 case FFELEX_typeNAMES:
22575 ffesta_confirmed ();
22576 ffesta_tokens[1] = ffelex_token_use (t);
22577 return (ffelexHandler) ffestb_decl_entsp_2_;
22583 if (ffestb_local_.decl.kindt != NULL)
22584 ffelex_token_kill (ffestb_local_.decl.kindt);
22585 if (ffestb_local_.decl.lent != NULL)
22586 ffelex_token_kill (ffestb_local_.decl.lent);
22587 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22588 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22591 /* ffestb_decl_entsp_1_ -- "type" [type parameters] NAME
22593 return ffestb_decl_entsp_1_; // to lexer
22595 If we get another NAME token here, then the previous one must be
22596 "RECURSIVE" or "FUNCTION" and we handle it accordingly. Otherwise,
22597 we send the previous and current token through to _ents_. */
22599 static ffelexHandler
22600 ffestb_decl_entsp_1_ (ffelexToken t)
22602 switch (ffelex_token_type (t))
22604 case FFELEX_typeNAME:
22605 switch (ffestr_first (ffesta_tokens[1]))
22608 case FFESTR_firstRECURSIVE:
22609 if (ffestr_first (t) != FFESTR_firstFUNCTION)
22611 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
22614 ffestb_local_.decl.recursive = ffesta_tokens[1];
22615 return (ffelexHandler) ffestb_decl_funcname_;
22618 case FFESTR_firstFUNCTION:
22619 ffelex_token_kill (ffesta_tokens[1]);
22620 return (ffelexHandler) ffestb_decl_funcname_ (t);
22623 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ffesta_tokens[1]);
22629 if ((ffelex_token_type (ffesta_tokens[1]) != FFELEX_typeNAMES)
22630 && !ffesta_is_inhibited ())
22631 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
22632 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
22633 ffestb_local_.decl.len, ffestb_local_.decl.lent);
22634 if (ffestb_local_.decl.kindt != NULL)
22635 ffelex_token_kill (ffestb_local_.decl.kindt);
22636 if (ffestb_local_.decl.lent != NULL)
22637 ffelex_token_kill (ffestb_local_.decl.lent);
22638 /* NAME/NAMES token already in ffesta_tokens[1]. */
22639 return (ffelexHandler) ffestb_decl_ents_1_ (t);
22642 if (ffestb_local_.decl.kindt != NULL)
22643 ffelex_token_kill (ffestb_local_.decl.kindt);
22644 if (ffestb_local_.decl.lent != NULL)
22645 ffelex_token_kill (ffestb_local_.decl.lent);
22646 ffelex_token_kill (ffesta_tokens[1]);
22647 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22650 /* ffestb_decl_entsp_2_ -- "type" [type parameters] NAMES
22652 return ffestb_decl_entsp_2_; // to lexer
22654 If we get an ASTERISK or OPEN_PAREN here, then if the previous NAMES
22655 begins with "FUNCTION" or "RECURSIVEFUNCTION" and is followed by a
22656 first-name-char, we have a possible syntactically ambiguous situation.
22657 Otherwise, we have a straightforward situation just as if we went
22658 through _entsp_1_ instead of here. */
22660 static ffelexHandler
22661 ffestb_decl_entsp_2_ (ffelexToken t)
22668 switch (ffelex_token_type (t))
22670 case FFELEX_typeASTERISK:
22671 ffesta_confirmed ();
22672 switch (ffestb_local_.decl.type)
22674 case FFESTP_typeINTEGER:
22675 case FFESTP_typeREAL:
22676 case FFESTP_typeCOMPLEX:
22677 case FFESTP_typeLOGICAL:
22678 asterisk_ok = (ffestb_local_.decl.kindt == NULL);
22681 case FFESTP_typeCHARACTER:
22682 asterisk_ok = (ffestb_local_.decl.lent == NULL);
22685 case FFESTP_typeBYTE:
22686 case FFESTP_typeWORD:
22688 asterisk_ok = FALSE;
22691 switch (ffestr_first (ffesta_tokens[1]))
22694 case FFESTR_firstRECURSIVEFNCTN:
22696 break; /* For our own convenience, treat as non-FN
22698 p = ffelex_token_text (ffesta_tokens[1])
22699 + (i = FFESTR_firstlRECURSIVEFNCTN);
22700 if (!ffesrc_is_name_init (*p))
22702 ffestb_local_.decl.recursive
22703 = ffelex_token_name_from_names (ffesta_tokens[1], 0,
22704 FFESTR_firstlRECURSIVEFNCTN);
22705 ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1],
22706 FFESTR_firstlRECURSIVEFNCTN, 0);
22707 return (ffelexHandler) ffestb_decl_entsp_3_;
22710 case FFESTR_firstFUNCTION:
22712 break; /* For our own convenience, treat as non-FN
22714 p = ffelex_token_text (ffesta_tokens[1])
22715 + (i = FFESTR_firstlFUNCTION);
22716 if (!ffesrc_is_name_init (*p))
22718 ffestb_local_.decl.recursive = NULL;
22719 ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1],
22720 FFESTR_firstlFUNCTION, 0);
22721 return (ffelexHandler) ffestb_decl_entsp_3_;
22728 case FFELEX_typeOPEN_PAREN:
22729 ffestb_local_.decl.aster_after = FALSE;
22730 switch (ffestr_first (ffesta_tokens[1]))
22733 case FFESTR_firstRECURSIVEFNCTN:
22734 p = ffelex_token_text (ffesta_tokens[1])
22735 + (i = FFESTR_firstlRECURSIVEFNCTN);
22736 if (!ffesrc_is_name_init (*p))
22738 ffestb_local_.decl.recursive
22739 = ffelex_token_name_from_names (ffesta_tokens[1], 0,
22740 FFESTR_firstlRECURSIVEFNCTN);
22741 ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1],
22742 FFESTR_firstlRECURSIVEFNCTN, 0);
22743 return (ffelexHandler) ffestb_decl_entsp_5_ (t);
22746 case FFESTR_firstFUNCTION:
22747 p = ffelex_token_text (ffesta_tokens[1])
22748 + (i = FFESTR_firstlFUNCTION);
22749 if (!ffesrc_is_name_init (*p))
22751 ffestb_local_.decl.recursive = NULL;
22752 ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1],
22753 FFESTR_firstlFUNCTION, 0);
22754 return (ffelexHandler) ffestb_decl_entsp_5_ (t);
22759 if ((ffestb_local_.decl.kindt != NULL)
22760 || (ffestb_local_.decl.lent != NULL))
22761 break; /* Have kind/len type param, definitely not
22762 assignment stmt. */
22763 return (ffelexHandler) ffestb_decl_entsp_1_ (t);
22769 nt = ffelex_token_name_from_names (ffesta_tokens[1], 0, 0);
22770 ffelex_token_kill (ffesta_tokens[1]);
22771 ffesta_tokens[1] = nt; /* Change NAMES to NAME. */
22772 return (ffelexHandler) ffestb_decl_entsp_1_ (t);
22775 /* ffestb_decl_entsp_3_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22778 return ffestb_decl_entsp_3_; // to lexer
22780 Handle NUMBER or OPEN_PAREN. */
22782 static ffelexHandler
22783 ffestb_decl_entsp_3_ (ffelexToken t)
22785 ffestb_local_.decl.aster_after = TRUE;
22787 switch (ffelex_token_type (t))
22789 case FFELEX_typeNUMBER:
22790 switch (ffestb_local_.decl.type)
22792 case FFESTP_typeINTEGER:
22793 case FFESTP_typeREAL:
22794 case FFESTP_typeCOMPLEX:
22795 case FFESTP_typeLOGICAL:
22796 ffestb_local_.decl.kindt = ffelex_token_use (t);
22799 case FFESTP_typeCHARACTER:
22800 ffestb_local_.decl.lent = ffelex_token_use (t);
22803 case FFESTP_typeBYTE:
22804 case FFESTP_typeWORD:
22808 return (ffelexHandler) ffestb_decl_entsp_5_;
22810 case FFELEX_typeOPEN_PAREN:
22811 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
22812 FFEEXPR_contextCHARACTERSIZE,
22813 (ffeexprCallback) ffestb_decl_entsp_4_);
22819 if (ffestb_local_.decl.recursive != NULL)
22820 ffelex_token_kill (ffestb_local_.decl.recursive);
22821 if (ffestb_local_.decl.kindt != NULL)
22822 ffelex_token_kill (ffestb_local_.decl.kindt);
22823 if (ffestb_local_.decl.lent != NULL)
22824 ffelex_token_kill (ffestb_local_.decl.lent);
22825 ffelex_token_kill (ffesta_tokens[1]);
22826 ffelex_token_kill (ffesta_tokens[2]);
22827 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
22828 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22831 /* ffestb_decl_entsp_4_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22832 NAME ASTERISK OPEN_PAREN expr
22834 (ffestb_decl_entsp_4_) // to expression handler
22836 Allow only CLOSE_PAREN; and deal with character-length expression. */
22838 static ffelexHandler
22839 ffestb_decl_entsp_4_ (ffelexToken ft, ffebld expr, ffelexToken t)
22841 switch (ffelex_token_type (t))
22843 case FFELEX_typeCLOSE_PAREN:
22846 switch (ffestb_local_.decl.type)
22848 case FFESTP_typeCHARACTER:
22849 ffestb_local_.decl.len = expr;
22850 ffestb_local_.decl.lent = ffelex_token_use (ft);
22854 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
22857 return (ffelexHandler) ffestb_decl_entsp_5_;
22863 if (ffestb_local_.decl.recursive != NULL)
22864 ffelex_token_kill (ffestb_local_.decl.recursive);
22865 if (ffestb_local_.decl.kindt != NULL)
22866 ffelex_token_kill (ffestb_local_.decl.kindt);
22867 if (ffestb_local_.decl.lent != NULL)
22868 ffelex_token_kill (ffestb_local_.decl.lent);
22869 ffelex_token_kill (ffesta_tokens[1]);
22870 ffelex_token_kill (ffesta_tokens[2]);
22871 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
22872 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22875 /* ffestb_decl_entsp_5_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22876 NAME [type parameter]
22878 return ffestb_decl_entsp_5_; // to lexer
22880 Make sure the next token is an OPEN_PAREN. Get the arg list or dimension
22881 list. If it can't be an arg list, or if the CLOSE_PAREN is followed by
22882 something other than EOS/SEMICOLON or NAME, then treat as dimension list
22883 and handle statement as an R426/R501. If it can't be a dimension list, or
22884 if the CLOSE_PAREN is followed by NAME, treat as an arg list and handle
22885 statement as an R1219. If it can be either an arg list or a dimension
22886 list and if the CLOSE_PAREN is followed by EOS/SEMICOLON, ask FFESTC
22887 whether to treat the statement as an R426/R501 or an R1219 and act
22890 static ffelexHandler
22891 ffestb_decl_entsp_5_ (ffelexToken t)
22893 switch (ffelex_token_type (t))
22895 case FFELEX_typeOPEN_PAREN:
22896 if (ffestb_local_.decl.aster_after && (ffestb_local_.decl.len != NULL))
22897 { /* "CHARACTER[RECURSIVE]FUNCTIONxyz*(len-expr)
22898 (..." must be a function-stmt, since the
22899 (len-expr) cannot precede (array-spec) in
22900 an object declaration but can precede
22901 (name-list) in a function stmt. */
22902 ffelex_token_kill (ffesta_tokens[1]);
22903 ffesta_tokens[1] = ffesta_tokens[2];
22904 return (ffelexHandler) ffestb_decl_funcname_4_ (t);
22906 ffestb_local_.decl.toklist = ffestt_tokenlist_create ();
22907 ffestb_local_.decl.empty = TRUE;
22908 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
22909 return (ffelexHandler) ffestb_decl_entsp_6_;
22915 assert (ffestb_local_.decl.aster_after);
22916 ffesta_confirmed (); /* We've seen an ASTERISK, so even EQUALS
22918 ffestb_subr_ambig_to_ents_ ();
22919 ffestb_subrargs_.dim_list.dims = NULL;
22920 return (ffelexHandler) ffestb_decl_ents_7_ (t);
22923 /* ffestb_decl_entsp_6_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22924 NAME [type parameter] OPEN_PAREN
22926 return ffestb_decl_entsp_6_; // to lexer
22928 If CLOSE_PAREN, we definitely have an R1219 function-stmt, since
22929 the notation "name()" is invalid for a declaration. */
22931 static ffelexHandler
22932 ffestb_decl_entsp_6_ (ffelexToken t)
22934 ffelexHandler next;
22936 switch (ffelex_token_type (t))
22938 case FFELEX_typeCLOSE_PAREN:
22939 if (!ffestb_local_.decl.empty)
22940 { /* Trailing comma, just a warning for
22941 stmt func def, so allow ambiguity. */
22942 ffestt_tokenlist_append (ffestb_local_.decl.toklist,
22943 ffelex_token_use (t));
22944 return (ffelexHandler) ffestb_decl_entsp_8_;
22946 ffelex_token_kill (ffesta_tokens[1]);
22947 ffesta_tokens[1] = ffesta_tokens[2];
22948 next = (ffelexHandler) ffestt_tokenlist_handle
22949 (ffestb_local_.decl.toklist, (ffelexHandler) ffestb_decl_funcname_4_);
22950 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
22951 return (ffelexHandler) (*next) (t);
22953 case FFELEX_typeNAME:
22954 ffestb_local_.decl.empty = FALSE;
22955 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
22956 return (ffelexHandler) ffestb_decl_entsp_7_;
22958 case FFELEX_typeEQUALS:
22959 case FFELEX_typePOINTS:
22960 case FFELEX_typePERCENT:
22961 case FFELEX_typePERIOD:
22962 case FFELEX_typeOPEN_PAREN:
22963 if ((ffestb_local_.decl.kindt != NULL)
22964 || (ffestb_local_.decl.lent != NULL))
22965 break; /* type(params)name or type*val name, either
22967 return (ffelexHandler) ffestb_subr_ambig_nope_ (t);
22973 ffesta_confirmed ();
22974 ffestb_subr_ambig_to_ents_ ();
22975 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
22976 (ffelexHandler) ffestb_decl_ents_3_);
22977 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
22978 return (ffelexHandler) (*next) (t);
22981 /* ffestb_decl_entsp_7_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22982 NAME [type parameter] OPEN_PAREN NAME
22984 return ffestb_decl_entsp_7_; // to lexer
22986 Expect COMMA or CLOSE_PAREN to remain ambiguous, else not an R1219
22989 static ffelexHandler
22990 ffestb_decl_entsp_7_ (ffelexToken t)
22992 ffelexHandler next;
22994 switch (ffelex_token_type (t))
22996 case FFELEX_typeCLOSE_PAREN:
22997 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
22998 return (ffelexHandler) ffestb_decl_entsp_8_;
23000 case FFELEX_typeCOMMA:
23001 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
23002 return (ffelexHandler) ffestb_decl_entsp_6_;
23004 case FFELEX_typeEQUALS:
23005 case FFELEX_typePOINTS:
23006 case FFELEX_typePERCENT:
23007 case FFELEX_typePERIOD:
23008 case FFELEX_typeOPEN_PAREN:
23009 if ((ffestb_local_.decl.kindt != NULL)
23010 || (ffestb_local_.decl.lent != NULL))
23011 break; /* type(params)name or type*val name, either
23013 return (ffelexHandler) ffestb_subr_ambig_nope_ (t);
23019 ffesta_confirmed ();
23020 ffestb_subr_ambig_to_ents_ ();
23021 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
23022 (ffelexHandler) ffestb_decl_ents_3_);
23023 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
23024 return (ffelexHandler) (*next) (t);
23027 /* ffestb_decl_entsp_8_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23028 NAME [type parameter] OPEN_PAREN name-list
23031 return ffestb_decl_entsp_8_; // to lexer
23033 If EOS/SEMICOLON, situation remains ambiguous, ask FFESTC to resolve
23034 it. If NAME (must be "RESULT", but that is checked later on),
23035 definitely an R1219 function-stmt. Anything else, handle as entity decl. */
23037 static ffelexHandler
23038 ffestb_decl_entsp_8_ (ffelexToken t)
23040 ffelexHandler next;
23042 switch (ffelex_token_type (t))
23044 case FFELEX_typeEOS:
23045 case FFELEX_typeSEMICOLON:
23046 ffesta_confirmed ();
23047 if (ffestc_is_decl_not_R1219 ())
23049 /* Fall through. */
23050 case FFELEX_typeNAME:
23051 ffesta_confirmed ();
23052 ffelex_token_kill (ffesta_tokens[1]);
23053 ffesta_tokens[1] = ffesta_tokens[2];
23054 next = (ffelexHandler) ffestt_tokenlist_handle
23055 (ffestb_local_.decl.toklist, (ffelexHandler) ffestb_decl_funcname_4_);
23056 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
23057 return (ffelexHandler) (*next) (t);
23059 case FFELEX_typeEQUALS:
23060 case FFELEX_typePOINTS:
23061 case FFELEX_typePERCENT:
23062 case FFELEX_typePERIOD:
23063 case FFELEX_typeOPEN_PAREN:
23064 if ((ffestb_local_.decl.kindt != NULL)
23065 || (ffestb_local_.decl.lent != NULL))
23066 break; /* type(params)name or type*val name, either
23068 return (ffelexHandler) ffestb_subr_ambig_nope_ (t);
23074 ffesta_confirmed ();
23075 ffestb_subr_ambig_to_ents_ ();
23076 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
23077 (ffelexHandler) ffestb_decl_ents_3_);
23078 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
23079 return (ffelexHandler) (*next) (t);
23082 /* ffestb_decl_func_ -- ["type" [type parameters]] RECURSIVE
23084 return ffestb_decl_func_; // to lexer
23086 Handle "FUNCTION". */
23089 static ffelexHandler
23090 ffestb_decl_func_ (ffelexToken t)
23095 ffelex_set_names (FALSE);
23097 switch (ffelex_token_type (t))
23099 case FFELEX_typeNAME:
23100 if (ffestr_first (t) != FFESTR_firstFUNCTION)
23102 return (ffelexHandler) ffestb_decl_funcname_;
23104 case FFELEX_typeNAMES:
23105 ffesta_confirmed ();
23106 if (ffestr_first (t) != FFESTR_firstFUNCTION)
23108 p = ffelex_token_text (t) + (i = FFESTR_firstlFUNCTION);
23111 if (!ffesrc_is_name_init (*p))
23112 goto bad_i; /* :::::::::::::::::::: */
23113 ffesta_tokens[1] = ffelex_token_name_from_names (t, i, 0);
23114 return (ffelexHandler) ffestb_decl_funcname_1_;
23120 if (ffestb_local_.decl.recursive != NULL)
23121 ffelex_token_kill (ffestb_local_.decl.recursive);
23122 if (ffestb_local_.decl.kindt != NULL)
23123 ffelex_token_kill (ffestb_local_.decl.kindt);
23124 if (ffestb_local_.decl.lent != NULL)
23125 ffelex_token_kill (ffestb_local_.decl.lent);
23126 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23127 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23129 bad_i: /* :::::::::::::::::::: */
23130 if (ffestb_local_.decl.recursive != NULL)
23131 ffelex_token_kill (ffestb_local_.decl.recursive);
23132 if (ffestb_local_.decl.kindt != NULL)
23133 ffelex_token_kill (ffestb_local_.decl.kindt);
23134 if (ffestb_local_.decl.lent != NULL)
23135 ffelex_token_kill (ffestb_local_.decl.lent);
23136 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t, i, NULL);
23137 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23141 /* ffestb_decl_funcname_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23143 return ffestb_decl_funcname_; // to lexer
23145 Handle NAME of a function. */
23147 static ffelexHandler
23148 ffestb_decl_funcname_ (ffelexToken t)
23150 switch (ffelex_token_type (t))
23152 case FFELEX_typeNAME:
23153 ffesta_tokens[1] = ffelex_token_use (t);
23154 return (ffelexHandler) ffestb_decl_funcname_1_;
23160 if (ffestb_local_.decl.recursive != NULL)
23161 ffelex_token_kill (ffestb_local_.decl.recursive);
23162 if (ffestb_local_.decl.kindt != NULL)
23163 ffelex_token_kill (ffestb_local_.decl.kindt);
23164 if (ffestb_local_.decl.lent != NULL)
23165 ffelex_token_kill (ffestb_local_.decl.lent);
23166 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23167 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23170 /* ffestb_decl_funcname_1_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23173 return ffestb_decl_funcname_1_; // to lexer
23175 Handle ASTERISK or OPEN_PAREN. */
23177 static ffelexHandler
23178 ffestb_decl_funcname_1_ (ffelexToken t)
23180 switch (ffelex_token_type (t))
23182 case FFELEX_typeASTERISK:
23183 return (ffelexHandler) ffestb_decl_funcname_2_;
23185 case FFELEX_typeOPEN_PAREN:
23186 return (ffelexHandler) ffestb_decl_funcname_4_ (t);
23192 if (ffestb_local_.decl.recursive != NULL)
23193 ffelex_token_kill (ffestb_local_.decl.recursive);
23194 if (ffestb_local_.decl.kindt != NULL)
23195 ffelex_token_kill (ffestb_local_.decl.kindt);
23196 if (ffestb_local_.decl.lent != NULL)
23197 ffelex_token_kill (ffestb_local_.decl.lent);
23198 ffelex_token_kill (ffesta_tokens[1]);
23199 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23200 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23203 /* ffestb_decl_funcname_2_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23206 return ffestb_decl_funcname_2_; // to lexer
23208 Handle NUMBER or OPEN_PAREN. */
23210 static ffelexHandler
23211 ffestb_decl_funcname_2_ (ffelexToken t)
23213 switch (ffelex_token_type (t))
23215 case FFELEX_typeNUMBER:
23216 switch (ffestb_local_.decl.type)
23218 case FFESTP_typeINTEGER:
23219 case FFESTP_typeREAL:
23220 case FFESTP_typeCOMPLEX:
23221 case FFESTP_typeLOGICAL:
23222 if (ffestb_local_.decl.kindt == NULL)
23223 ffestb_local_.decl.kindt = ffelex_token_use (t);
23225 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23228 case FFESTP_typeCHARACTER:
23229 if (ffestb_local_.decl.lent == NULL)
23230 ffestb_local_.decl.lent = ffelex_token_use (t);
23232 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23235 case FFESTP_typeBYTE:
23236 case FFESTP_typeWORD:
23238 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23241 return (ffelexHandler) ffestb_decl_funcname_4_;
23243 case FFELEX_typeOPEN_PAREN:
23244 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
23245 FFEEXPR_contextCHARACTERSIZE,
23246 (ffeexprCallback) ffestb_decl_funcname_3_);
23252 if (ffestb_local_.decl.recursive != NULL)
23253 ffelex_token_kill (ffestb_local_.decl.recursive);
23254 if (ffestb_local_.decl.kindt != NULL)
23255 ffelex_token_kill (ffestb_local_.decl.kindt);
23256 if (ffestb_local_.decl.lent != NULL)
23257 ffelex_token_kill (ffestb_local_.decl.lent);
23258 ffelex_token_kill (ffesta_tokens[1]);
23259 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23260 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23263 /* ffestb_decl_funcname_3_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23264 NAME ASTERISK OPEN_PAREN expr
23266 (ffestb_decl_funcname_3_) // to expression handler
23268 Allow only CLOSE_PAREN; and deal with character-length expression. */
23270 static ffelexHandler
23271 ffestb_decl_funcname_3_ (ffelexToken ft, ffebld expr, ffelexToken t)
23273 switch (ffelex_token_type (t))
23275 case FFELEX_typeCLOSE_PAREN:
23278 switch (ffestb_local_.decl.type)
23280 case FFESTP_typeCHARACTER:
23281 if (ffestb_local_.decl.lent == NULL)
23283 ffestb_local_.decl.len = expr;
23284 ffestb_local_.decl.lent = ffelex_token_use (ft);
23287 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23291 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23294 return (ffelexHandler) ffestb_decl_funcname_4_;
23300 if (ffestb_local_.decl.recursive != NULL)
23301 ffelex_token_kill (ffestb_local_.decl.recursive);
23302 if (ffestb_local_.decl.kindt != NULL)
23303 ffelex_token_kill (ffestb_local_.decl.kindt);
23304 if (ffestb_local_.decl.lent != NULL)
23305 ffelex_token_kill (ffestb_local_.decl.lent);
23306 ffelex_token_kill (ffesta_tokens[1]);
23307 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23308 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23311 /* ffestb_decl_funcname_4_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23312 NAME [type parameter]
23314 return ffestb_decl_funcname_4_; // to lexer
23316 Make sure the next token is an OPEN_PAREN. Get the arg list and
23319 static ffelexHandler
23320 ffestb_decl_funcname_4_ (ffelexToken t)
23322 switch (ffelex_token_type (t))
23324 case FFELEX_typeOPEN_PAREN:
23325 ffestb_subrargs_.name_list.args = ffestt_tokenlist_create ();
23326 ffestb_subrargs_.name_list.handler
23327 = (ffelexHandler) ffestb_decl_funcname_5_;
23328 ffestb_subrargs_.name_list.is_subr = FALSE;
23329 ffestb_subrargs_.name_list.names = FALSE;
23330 return (ffelexHandler) ffestb_subr_name_list_;
23336 if (ffestb_local_.decl.recursive != NULL)
23337 ffelex_token_kill (ffestb_local_.decl.recursive);
23338 if (ffestb_local_.decl.kindt != NULL)
23339 ffelex_token_kill (ffestb_local_.decl.kindt);
23340 if (ffestb_local_.decl.lent != NULL)
23341 ffelex_token_kill (ffestb_local_.decl.lent);
23342 ffelex_token_kill (ffesta_tokens[1]);
23343 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23344 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23347 /* ffestb_decl_funcname_5_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23348 NAME [type parameter] OPEN_PAREN arg-list
23351 return ffestb_decl_funcname_5_; // to lexer
23353 Must have EOS/SEMICOLON or "RESULT" here. */
23355 static ffelexHandler
23356 ffestb_decl_funcname_5_ (ffelexToken t)
23358 if (!ffestb_subrargs_.name_list.ok)
23359 goto bad; /* :::::::::::::::::::: */
23361 switch (ffelex_token_type (t))
23363 case FFELEX_typeEOS:
23364 case FFELEX_typeSEMICOLON:
23365 ffesta_confirmed ();
23366 if (!ffesta_is_inhibited ())
23367 ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
23368 ffestb_subrargs_.name_list.close_paren, ffestb_local_.decl.type,
23369 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
23370 ffestb_local_.decl.len, ffestb_local_.decl.lent,
23371 ffestb_local_.decl.recursive, NULL);
23372 if (ffestb_local_.decl.recursive != NULL)
23373 ffelex_token_kill (ffestb_local_.decl.recursive);
23374 if (ffestb_local_.decl.kindt != NULL)
23375 ffelex_token_kill (ffestb_local_.decl.kindt);
23376 if (ffestb_local_.decl.lent != NULL)
23377 ffelex_token_kill (ffestb_local_.decl.lent);
23378 ffelex_token_kill (ffesta_tokens[1]);
23379 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23380 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23381 return (ffelexHandler) ffesta_zero (t);
23383 case FFELEX_typeNAME:
23384 if (ffestr_other (t) != FFESTR_otherRESULT)
23386 return (ffelexHandler) ffestb_decl_funcname_6_;
23392 bad: /* :::::::::::::::::::: */
23393 if (ffestb_local_.decl.recursive != NULL)
23394 ffelex_token_kill (ffestb_local_.decl.recursive);
23395 if (ffestb_local_.decl.kindt != NULL)
23396 ffelex_token_kill (ffestb_local_.decl.kindt);
23397 if (ffestb_local_.decl.lent != NULL)
23398 ffelex_token_kill (ffestb_local_.decl.lent);
23399 ffelex_token_kill (ffesta_tokens[1]);
23400 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23401 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23402 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23403 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23406 /* ffestb_decl_funcname_6_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23407 NAME [type parameter] OPEN_PAREN arglist
23408 CLOSE_PAREN "RESULT"
23410 return ffestb_decl_funcname_6_; // to lexer
23412 Make sure the next token is an OPEN_PAREN. */
23414 static ffelexHandler
23415 ffestb_decl_funcname_6_ (ffelexToken t)
23417 switch (ffelex_token_type (t))
23419 case FFELEX_typeOPEN_PAREN:
23420 return (ffelexHandler) ffestb_decl_funcname_7_;
23426 if (ffestb_local_.decl.recursive != NULL)
23427 ffelex_token_kill (ffestb_local_.decl.recursive);
23428 if (ffestb_local_.decl.kindt != NULL)
23429 ffelex_token_kill (ffestb_local_.decl.kindt);
23430 if (ffestb_local_.decl.lent != NULL)
23431 ffelex_token_kill (ffestb_local_.decl.lent);
23432 ffelex_token_kill (ffesta_tokens[1]);
23433 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23434 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23435 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23436 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23439 /* ffestb_decl_funcname_7_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23440 NAME [type parameter] OPEN_PAREN arglist
23441 CLOSE_PAREN "RESULT" OPEN_PAREN
23443 return ffestb_decl_funcname_7_; // to lexer
23445 Make sure the next token is a NAME. */
23447 static ffelexHandler
23448 ffestb_decl_funcname_7_ (ffelexToken t)
23450 switch (ffelex_token_type (t))
23452 case FFELEX_typeNAME:
23453 ffesta_tokens[2] = ffelex_token_use (t);
23454 return (ffelexHandler) ffestb_decl_funcname_8_;
23460 if (ffestb_local_.decl.recursive != NULL)
23461 ffelex_token_kill (ffestb_local_.decl.recursive);
23462 if (ffestb_local_.decl.kindt != NULL)
23463 ffelex_token_kill (ffestb_local_.decl.kindt);
23464 if (ffestb_local_.decl.lent != NULL)
23465 ffelex_token_kill (ffestb_local_.decl.lent);
23466 ffelex_token_kill (ffesta_tokens[1]);
23467 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23468 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23469 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23470 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23473 /* ffestb_decl_funcname_8_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23474 NAME [type parameter] OPEN_PAREN arglist
23475 CLOSE_PAREN "RESULT" OPEN_PAREN NAME
23477 return ffestb_decl_funcname_8_; // to lexer
23479 Make sure the next token is a CLOSE_PAREN. */
23481 static ffelexHandler
23482 ffestb_decl_funcname_8_ (ffelexToken t)
23484 switch (ffelex_token_type (t))
23486 case FFELEX_typeCLOSE_PAREN:
23487 return (ffelexHandler) ffestb_decl_funcname_9_;
23493 if (ffestb_local_.decl.recursive != NULL)
23494 ffelex_token_kill (ffestb_local_.decl.recursive);
23495 if (ffestb_local_.decl.kindt != NULL)
23496 ffelex_token_kill (ffestb_local_.decl.kindt);
23497 if (ffestb_local_.decl.lent != NULL)
23498 ffelex_token_kill (ffestb_local_.decl.lent);
23499 ffelex_token_kill (ffesta_tokens[1]);
23500 ffelex_token_kill (ffesta_tokens[2]);
23501 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23502 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23503 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23504 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23507 /* ffestb_decl_funcname_9_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23508 NAME [type parameter] OPEN_PAREN arg-list
23509 CLOSE_PAREN "RESULT" OPEN_PAREN NAME CLOSE_PAREN
23511 return ffestb_decl_funcname_9_; // to lexer
23513 Must have EOS/SEMICOLON here. */
23515 static ffelexHandler
23516 ffestb_decl_funcname_9_ (ffelexToken t)
23518 switch (ffelex_token_type (t))
23520 case FFELEX_typeEOS:
23521 case FFELEX_typeSEMICOLON:
23522 if (!ffesta_is_inhibited ())
23523 ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
23524 ffestb_subrargs_.name_list.close_paren, ffestb_local_.decl.type,
23525 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
23526 ffestb_local_.decl.len, ffestb_local_.decl.lent,
23527 ffestb_local_.decl.recursive, ffesta_tokens[2]);
23528 if (ffestb_local_.decl.recursive != NULL)
23529 ffelex_token_kill (ffestb_local_.decl.recursive);
23530 if (ffestb_local_.decl.kindt != NULL)
23531 ffelex_token_kill (ffestb_local_.decl.kindt);
23532 if (ffestb_local_.decl.lent != NULL)
23533 ffelex_token_kill (ffestb_local_.decl.lent);
23534 ffelex_token_kill (ffesta_tokens[1]);
23535 ffelex_token_kill (ffesta_tokens[2]);
23536 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23537 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23538 return (ffelexHandler) ffesta_zero (t);
23544 if (ffestb_local_.decl.recursive != NULL)
23545 ffelex_token_kill (ffestb_local_.decl.recursive);
23546 if (ffestb_local_.decl.kindt != NULL)
23547 ffelex_token_kill (ffestb_local_.decl.kindt);
23548 if (ffestb_local_.decl.lent != NULL)
23549 ffelex_token_kill (ffestb_local_.decl.lent);
23550 ffelex_token_kill (ffesta_tokens[1]);
23551 ffelex_token_kill (ffesta_tokens[2]);
23552 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23553 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23554 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23555 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23558 /* ffestb_V003 -- Parse the STRUCTURE statement
23560 return ffestb_V003; // to lexer
23562 Make sure the statement has a valid form for the STRUCTURE statement.
23563 If it does, implement the statement. */
23567 ffestb_V003 (ffelexToken t)
23572 ffelexHandler next;
23574 switch (ffelex_token_type (ffesta_tokens[0]))
23576 case FFELEX_typeNAME:
23577 if (ffesta_first_kw != FFESTR_firstSTRUCTURE)
23578 goto bad_0; /* :::::::::::::::::::: */
23579 switch (ffelex_token_type (t))
23581 case FFELEX_typeCOMMA:
23582 case FFELEX_typeCOLONCOLON:
23583 case FFELEX_typeEOS:
23584 case FFELEX_typeSEMICOLON:
23585 ffesta_confirmed (); /* Error, but clearly intended. */
23586 goto bad_1; /* :::::::::::::::::::: */
23589 goto bad_1; /* :::::::::::::::::::: */
23591 case FFELEX_typeNAME:
23592 ffesta_confirmed ();
23593 if (!ffesta_is_inhibited ())
23594 ffestc_V003_start (NULL);
23595 ffestb_local_.structure.started = TRUE;
23596 return (ffelexHandler) ffestb_V0034_ (t);
23598 case FFELEX_typeSLASH:
23599 ffesta_confirmed ();
23600 return (ffelexHandler) ffestb_V0031_;
23603 case FFELEX_typeNAMES:
23604 if (ffesta_first_kw != FFESTR_firstSTRUCTURE)
23605 goto bad_0; /* :::::::::::::::::::: */
23606 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSTRUCTURE);
23607 switch (ffelex_token_type (t))
23610 goto bad_1; /* :::::::::::::::::::: */
23612 case FFELEX_typeEOS:
23613 case FFELEX_typeSEMICOLON:
23614 case FFELEX_typeCOMMA:
23615 case FFELEX_typeCOLONCOLON:
23616 ffesta_confirmed ();
23619 case FFELEX_typeSLASH:
23620 ffesta_confirmed ();
23622 goto bad_1; /* :::::::::::::::::::: */
23623 return (ffelexHandler) ffestb_V0031_;
23625 case FFELEX_typeOPEN_PAREN:
23629 /* Here, we have at least one char after "STRUCTURE" and t is COMMA,
23630 EOS/SEMICOLON, or OPEN_PAREN. */
23632 if (!ffesrc_is_name_init (*p))
23633 goto bad_i; /* :::::::::::::::::::: */
23634 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
23635 if (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN)
23636 ffestb_local_.structure.started = FALSE;
23639 if (!ffesta_is_inhibited ())
23640 ffestc_V003_start (NULL);
23641 ffestb_local_.structure.started = TRUE;
23643 next = (ffelexHandler) ffestb_V0034_ (nt);
23644 ffelex_token_kill (nt);
23645 return (ffelexHandler) (*next) (t);
23648 goto bad_0; /* :::::::::::::::::::: */
23651 bad_0: /* :::::::::::::::::::: */
23652 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", ffesta_tokens[0]);
23653 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23655 bad_1: /* :::::::::::::::::::: */
23656 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23657 return (ffelexHandler) ffelex_swallow_tokens (t,
23658 (ffelexHandler) ffesta_zero); /* Invalid second token. */
23660 bad_i: /* :::::::::::::::::::: */
23661 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", ffesta_tokens[0], i, t);
23662 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23665 /* ffestb_V0031_ -- "STRUCTURE" SLASH
23667 return ffestb_V0031_; // to lexer
23671 static ffelexHandler
23672 ffestb_V0031_ (ffelexToken t)
23674 switch (ffelex_token_type (t))
23676 case FFELEX_typeNAME:
23677 ffesta_tokens[1] = ffelex_token_use (t);
23678 return (ffelexHandler) ffestb_V0032_;
23681 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23685 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23688 /* ffestb_V0032_ -- "STRUCTURE" SLASH NAME
23690 return ffestb_V0032_; // to lexer
23694 static ffelexHandler
23695 ffestb_V0032_ (ffelexToken t)
23697 switch (ffelex_token_type (t))
23699 case FFELEX_typeSLASH:
23700 if (!ffesta_is_inhibited ())
23701 ffestc_V003_start (ffesta_tokens[1]);
23702 ffestb_local_.structure.started = TRUE;
23703 ffelex_token_kill (ffesta_tokens[1]);
23704 return (ffelexHandler) ffestb_V0033_;
23707 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23711 ffelex_token_kill (ffesta_tokens[1]);
23712 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23715 /* ffestb_V0033_ -- "STRUCTURE" SLASH NAME SLASH
23717 return ffestb_V0033_; // to lexer
23719 Handle NAME or EOS/SEMICOLON. */
23721 static ffelexHandler
23722 ffestb_V0033_ (ffelexToken t)
23724 switch (ffelex_token_type (t))
23726 case FFELEX_typeNAME:
23727 return (ffelexHandler) ffestb_V0034_ (t);
23729 case FFELEX_typeEOS:
23730 case FFELEX_typeSEMICOLON:
23731 if (!ffesta_is_inhibited ())
23732 ffestc_V003_finish ();
23733 return (ffelexHandler) ffesta_zero (t);
23736 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23740 ffelex_token_kill (ffesta_tokens[1]);
23741 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23744 /* ffestb_V0034_ -- "STRUCTURE" [SLASH NAME SLASH]
23746 return ffestb_V0034_; // to lexer
23750 static ffelexHandler
23751 ffestb_V0034_ (ffelexToken t)
23753 switch (ffelex_token_type (t))
23755 case FFELEX_typeNAME:
23756 ffesta_tokens[1] = ffelex_token_use (t);
23757 return (ffelexHandler) ffestb_V0035_;
23760 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23764 if (!ffesta_is_inhibited ())
23765 ffestc_V003_finish ();
23766 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23769 /* ffestb_V0035_ -- "STRUCTURE" ... NAME
23771 return ffestb_V0035_; // to lexer
23773 Handle OPEN_PAREN. */
23775 static ffelexHandler
23776 ffestb_V0035_ (ffelexToken t)
23778 switch (ffelex_token_type (t))
23780 case FFELEX_typeOPEN_PAREN:
23781 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
23782 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_V0036_;
23783 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
23784 ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON;
23785 #ifdef FFECOM_dimensionsMAX
23786 ffestb_subrargs_.dim_list.ndims = 0;
23788 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
23789 FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_);
23791 case FFELEX_typeCOMMA:
23792 if (!ffesta_is_inhibited ())
23793 ffestc_V003_item (ffesta_tokens[1], NULL);
23794 ffelex_token_kill (ffesta_tokens[1]);
23795 return (ffelexHandler) ffestb_V0034_;
23797 case FFELEX_typeEOS:
23798 case FFELEX_typeSEMICOLON:
23799 if (!ffesta_is_inhibited ())
23801 ffestc_V003_item (ffesta_tokens[1], NULL);
23802 ffestc_V003_finish ();
23804 ffelex_token_kill (ffesta_tokens[1]);
23805 return (ffelexHandler) ffesta_zero (t);
23808 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23812 if (!ffesta_is_inhibited ())
23813 ffestc_V003_finish ();
23814 ffelex_token_kill (ffesta_tokens[1]);
23815 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23818 /* ffestb_V0036_ -- "STRUCTURE" ... NAME OPEN_PAREN dimlist CLOSE_PAREN
23820 return ffestb_V0036_; // to lexer
23822 Handle COMMA or EOS/SEMICOLON. */
23824 static ffelexHandler
23825 ffestb_V0036_ (ffelexToken t)
23827 if (!ffestb_subrargs_.dim_list.ok)
23828 goto bad; /* :::::::::::::::::::: */
23830 switch (ffelex_token_type (t))
23832 case FFELEX_typeCOMMA:
23833 ffesta_confirmed ();
23834 if (!ffesta_is_inhibited ())
23836 if (!ffestb_local_.structure.started)
23838 ffestc_V003_start (NULL);
23839 ffestb_local_.structure.started = TRUE;
23841 ffestc_V003_item (ffesta_tokens[1],
23842 ffestb_subrargs_.dim_list.dims);
23844 ffelex_token_kill (ffesta_tokens[1]);
23845 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
23846 return (ffelexHandler) ffestb_V0034_;
23848 case FFELEX_typeEOS:
23849 case FFELEX_typeSEMICOLON:
23850 ffesta_confirmed ();
23851 if (!ffesta_is_inhibited ())
23853 if (!ffestb_local_.structure.started)
23854 ffestc_V003_start (NULL);
23855 ffestc_V003_item (ffesta_tokens[1],
23856 ffestb_subrargs_.dim_list.dims);
23857 ffestc_V003_finish ();
23859 ffelex_token_kill (ffesta_tokens[1]);
23860 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
23861 return (ffelexHandler) ffesta_zero (t);
23867 bad: /* :::::::::::::::::::: */
23868 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23869 if (ffestb_local_.structure.started && !ffesta_is_inhibited ())
23870 ffestc_V003_finish ();
23871 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
23872 ffelex_token_kill (ffesta_tokens[1]);
23873 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23876 /* ffestb_V016 -- Parse the RECORD statement
23878 return ffestb_V016; // to lexer
23880 Make sure the statement has a valid form for the RECORD statement. If it
23881 does, implement the statement. */
23884 ffestb_V016 (ffelexToken t)
23889 switch (ffelex_token_type (ffesta_tokens[0]))
23891 case FFELEX_typeNAME:
23892 if (ffesta_first_kw != FFESTR_firstRECORD)
23893 goto bad_0; /* :::::::::::::::::::: */
23896 case FFELEX_typeNAMES:
23897 if (ffesta_first_kw != FFESTR_firstRECORD)
23898 goto bad_0; /* :::::::::::::::::::: */
23899 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlRECORD);
23901 goto bad_i; /* :::::::::::::::::::: */
23905 goto bad_0; /* :::::::::::::::::::: */
23908 switch (ffelex_token_type (t))
23910 case FFELEX_typeCOMMA:
23911 case FFELEX_typeEOS:
23912 case FFELEX_typeSEMICOLON:
23913 case FFELEX_typeCOLONCOLON:
23914 ffesta_confirmed (); /* Error, but clearly intended. */
23915 goto bad_1; /* :::::::::::::::::::: */
23918 goto bad_1; /* :::::::::::::::::::: */
23920 case FFELEX_typeSLASH:
23924 ffesta_confirmed ();
23925 if (!ffesta_is_inhibited ())
23926 ffestc_V016_start ();
23927 return (ffelexHandler) ffestb_V0161_;
23929 bad_0: /* :::::::::::::::::::: */
23930 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", ffesta_tokens[0]);
23931 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23933 bad_1: /* :::::::::::::::::::: */
23934 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
23935 return (ffelexHandler) ffelex_swallow_tokens (t,
23936 (ffelexHandler) ffesta_zero); /* Invalid second token. */
23938 bad_i: /* :::::::::::::::::::: */
23939 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "RECORD", ffesta_tokens[0], i, t);
23940 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23943 /* ffestb_V0161_ -- "RECORD" SLASH
23945 return ffestb_V0161_; // to lexer
23949 static ffelexHandler
23950 ffestb_V0161_ (ffelexToken t)
23952 switch (ffelex_token_type (t))
23954 case FFELEX_typeNAME:
23955 if (!ffesta_is_inhibited ())
23956 ffestc_V016_item_structure (t);
23957 return (ffelexHandler) ffestb_V0162_;
23960 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
23964 if (!ffesta_is_inhibited ())
23965 ffestc_V016_finish ();
23966 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23969 /* ffestb_V0162_ -- "RECORD" SLASH NAME
23971 return ffestb_V0162_; // to lexer
23975 static ffelexHandler
23976 ffestb_V0162_ (ffelexToken t)
23978 switch (ffelex_token_type (t))
23980 case FFELEX_typeSLASH:
23981 return (ffelexHandler) ffestb_V0163_;
23984 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
23988 if (!ffesta_is_inhibited ())
23989 ffestc_V016_finish ();
23990 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23993 /* ffestb_V0163_ -- "RECORD" SLASH NAME SLASH
23995 return ffestb_V0163_; // to lexer
23999 static ffelexHandler
24000 ffestb_V0163_ (ffelexToken t)
24002 switch (ffelex_token_type (t))
24004 case FFELEX_typeNAME:
24005 ffesta_tokens[1] = ffelex_token_use (t);
24006 return (ffelexHandler) ffestb_V0164_;
24009 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
24013 if (!ffesta_is_inhibited ())
24014 ffestc_V016_finish ();
24015 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24018 /* ffestb_V0164_ -- "RECORD" ... NAME
24020 return ffestb_V0164_; // to lexer
24022 Handle OPEN_PAREN. */
24024 static ffelexHandler
24025 ffestb_V0164_ (ffelexToken t)
24027 switch (ffelex_token_type (t))
24029 case FFELEX_typeOPEN_PAREN:
24030 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
24031 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_V0165_;
24032 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
24033 ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON;
24034 #ifdef FFECOM_dimensionsMAX
24035 ffestb_subrargs_.dim_list.ndims = 0;
24037 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
24038 FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_);
24040 case FFELEX_typeCOMMA:
24041 if (!ffesta_is_inhibited ())
24042 ffestc_V016_item_object (ffesta_tokens[1], NULL);
24043 ffelex_token_kill (ffesta_tokens[1]);
24044 return (ffelexHandler) ffestb_V0166_;
24046 case FFELEX_typeEOS:
24047 case FFELEX_typeSEMICOLON:
24048 if (!ffesta_is_inhibited ())
24050 ffestc_V016_item_object (ffesta_tokens[1], NULL);
24051 ffestc_V016_finish ();
24053 ffelex_token_kill (ffesta_tokens[1]);
24054 return (ffelexHandler) ffesta_zero (t);
24057 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
24061 if (!ffesta_is_inhibited ())
24062 ffestc_V016_finish ();
24063 ffelex_token_kill (ffesta_tokens[1]);
24064 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24067 /* ffestb_V0165_ -- "RECORD" ... NAME OPEN_PAREN dimlist CLOSE_PAREN
24069 return ffestb_V0165_; // to lexer
24071 Handle COMMA or EOS/SEMICOLON. */
24073 static ffelexHandler
24074 ffestb_V0165_ (ffelexToken t)
24076 if (!ffestb_subrargs_.dim_list.ok)
24077 goto bad; /* :::::::::::::::::::: */
24079 switch (ffelex_token_type (t))
24081 case FFELEX_typeCOMMA:
24082 if (!ffesta_is_inhibited ())
24083 ffestc_V016_item_object (ffesta_tokens[1],
24084 ffestb_subrargs_.dim_list.dims);
24085 ffelex_token_kill (ffesta_tokens[1]);
24086 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
24087 return (ffelexHandler) ffestb_V0166_;
24089 case FFELEX_typeEOS:
24090 case FFELEX_typeSEMICOLON:
24091 if (!ffesta_is_inhibited ())
24093 ffestc_V016_item_object (ffesta_tokens[1],
24094 ffestb_subrargs_.dim_list.dims);
24095 ffestc_V016_finish ();
24097 ffelex_token_kill (ffesta_tokens[1]);
24098 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
24099 return (ffelexHandler) ffesta_zero (t);
24105 bad: /* :::::::::::::::::::: */
24106 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
24107 if (ffestb_local_.structure.started && !ffesta_is_inhibited ())
24108 ffestc_V016_finish ();
24109 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
24110 ffelex_token_kill (ffesta_tokens[1]);
24111 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24114 /* ffestb_V0166_ -- "RECORD" SLASH NAME SLASH NAME [OPEN_PAREN dimlist
24117 return ffestb_V0166_; // to lexer
24119 Handle NAME or SLASH. */
24121 static ffelexHandler
24122 ffestb_V0166_ (ffelexToken t)
24124 switch (ffelex_token_type (t))
24126 case FFELEX_typeNAME:
24127 ffesta_tokens[1] = ffelex_token_use (t);
24128 return (ffelexHandler) ffestb_V0164_;
24130 case FFELEX_typeSLASH:
24131 return (ffelexHandler) ffestb_V0161_;
24134 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
24138 if (!ffesta_is_inhibited ())
24139 ffestc_V016_finish ();
24140 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24144 /* ffestb_V027 -- Parse the VXT PARAMETER statement
24146 return ffestb_V027; // to lexer
24148 Make sure the statement has a valid form for the VXT PARAMETER statement.
24149 If it does, implement the statement. */
24152 ffestb_V027 (ffelexToken t)
24157 switch (ffelex_token_type (ffesta_tokens[0]))
24159 case FFELEX_typeNAME:
24160 if (ffesta_first_kw != FFESTR_firstPARAMETER)
24161 goto bad_0; /* :::::::::::::::::::: */
24162 switch (ffelex_token_type (t))
24164 case FFELEX_typeNAME:
24168 goto bad_1; /* :::::::::::::::::::: */
24170 ffesta_confirmed ();
24171 ffestb_local_.vxtparam.started = TRUE;
24172 if (!ffesta_is_inhibited ())
24173 ffestc_V027_start ();
24174 ffesta_tokens[1] = ffelex_token_use (t);
24175 return (ffelexHandler) ffestb_V0271_;
24177 case FFELEX_typeNAMES:
24178 if (ffesta_first_kw != FFESTR_firstPARAMETER)
24179 goto bad_0; /* :::::::::::::::::::: */
24180 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlPARAMETER);
24181 switch (ffelex_token_type (t))
24183 case FFELEX_typeEQUALS:
24187 goto bad_1; /* :::::::::::::::::::: */
24189 if (!ffesrc_is_name_init (*p))
24190 goto bad_i; /* :::::::::::::::::::: */
24191 ffestb_local_.vxtparam.started = FALSE;
24192 ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i,
24194 return (ffelexHandler) ffestb_V0271_ (t);
24197 goto bad_0; /* :::::::::::::::::::: */
24200 bad_0: /* :::::::::::::::::::: */
24201 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0]);
24202 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24204 bad_1: /* :::::::::::::::::::: */
24205 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
24206 return (ffelexHandler) ffelex_swallow_tokens (t,
24207 (ffelexHandler) ffesta_zero); /* Invalid second token. */
24209 bad_i: /* :::::::::::::::::::: */
24210 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0], i, t);
24211 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24214 /* ffestb_V0271_ -- "PARAMETER" NAME
24216 return ffestb_V0271_; // to lexer
24220 static ffelexHandler
24221 ffestb_V0271_ (ffelexToken t)
24223 switch (ffelex_token_type (t))
24225 case FFELEX_typeEQUALS:
24226 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
24227 FFEEXPR_contextPARAMETER, (ffeexprCallback) ffestb_V0272_);
24230 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
24234 ffelex_token_kill (ffesta_tokens[1]);
24235 if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ())
24236 ffestc_V027_finish ();
24237 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24240 /* ffestb_V0272_ -- "PARAMETER" NAME EQUALS expr
24242 (ffestb_V0272_) // to expression handler
24244 Handle COMMA or EOS/SEMICOLON. */
24246 static ffelexHandler
24247 ffestb_V0272_ (ffelexToken ft, ffebld expr, ffelexToken t)
24249 switch (ffelex_token_type (t))
24251 case FFELEX_typeEOS:
24252 case FFELEX_typeSEMICOLON:
24253 if (!ffestb_local_.vxtparam.started)
24255 if (ffestc_is_let_not_V027 ())
24256 break; /* Not a valid VXTPARAMETER stmt. */
24257 ffesta_confirmed ();
24258 if (!ffesta_is_inhibited ())
24259 ffestc_V027_start ();
24260 ffestb_local_.vxtparam.started = TRUE;
24264 if (!ffesta_is_inhibited ())
24266 ffestc_V027_item (ffesta_tokens[1], expr, ft);
24267 ffestc_V027_finish ();
24269 ffelex_token_kill (ffesta_tokens[1]);
24270 return (ffelexHandler) ffesta_zero (t);
24272 case FFELEX_typeCOMMA:
24273 ffesta_confirmed ();
24274 if (!ffestb_local_.vxtparam.started)
24276 if (!ffesta_is_inhibited ())
24277 ffestc_V027_start ();
24278 ffestb_local_.vxtparam.started = TRUE;
24282 if (!ffesta_is_inhibited ())
24283 ffestc_V027_item (ffesta_tokens[1], expr, ft);
24284 ffelex_token_kill (ffesta_tokens[1]);
24285 return (ffelexHandler) ffestb_V0273_;
24291 ffelex_token_kill (ffesta_tokens[1]);
24292 if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ())
24293 ffestc_V027_finish ();
24294 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
24295 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24298 /* ffestb_V0273_ -- "PARAMETER" NAME EQUALS expr COMMA
24300 return ffestb_V0273_; // to lexer
24304 static ffelexHandler
24305 ffestb_V0273_ (ffelexToken t)
24307 switch (ffelex_token_type (t))
24309 case FFELEX_typeNAME:
24310 ffesta_tokens[1] = ffelex_token_use (t);
24311 return (ffelexHandler) ffestb_V0271_;
24314 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
24318 if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ())
24319 ffestc_V027_finish ();
24320 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24323 /* ffestb_decl_R539 -- Parse the IMPLICIT FUNCTION statement
24325 return ffestb_decl_R539; // to lexer
24327 Make sure the statement has a valid form for the IMPLICIT
24328 statement. If it does, implement the statement. */
24331 ffestb_decl_R539 (ffelexToken t)
24338 ffestb_local_.decl.recursive = NULL;
24340 switch (ffelex_token_type (ffesta_tokens[0]))
24342 case FFELEX_typeNAME:
24343 if (ffesta_first_kw != FFESTR_firstIMPLICIT)
24344 goto bad_0; /* :::::::::::::::::::: */
24345 switch (ffelex_token_type (t))
24347 case FFELEX_typeEOS:
24348 case FFELEX_typeSEMICOLON:
24349 case FFELEX_typeCOMMA:
24350 case FFELEX_typeCOLONCOLON:
24351 ffesta_confirmed (); /* Error, but clearly intended. */
24352 goto bad_1; /* :::::::::::::::::::: */
24355 goto bad_1; /* :::::::::::::::::::: */
24357 case FFELEX_typeNAME:
24360 ffesta_confirmed ();
24361 ffestb_local_.decl.imp_started = FALSE;
24362 switch (ffesta_second_kw)
24364 case FFESTR_secondINTEGER:
24365 ffestb_local_.decl.type = FFESTP_typeINTEGER;
24366 return (ffelexHandler) ffestb_decl_R5391_;
24368 case FFESTR_secondBYTE:
24369 ffestb_local_.decl.type = FFESTP_typeBYTE;
24370 return (ffelexHandler) ffestb_decl_R5391_;
24372 case FFESTR_secondWORD:
24373 ffestb_local_.decl.type = FFESTP_typeWORD;
24374 return (ffelexHandler) ffestb_decl_R5391_;
24376 case FFESTR_secondREAL:
24377 ffestb_local_.decl.type = FFESTP_typeREAL;
24378 return (ffelexHandler) ffestb_decl_R5391_;
24380 case FFESTR_secondCOMPLEX:
24381 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
24382 return (ffelexHandler) ffestb_decl_R5391_;
24384 case FFESTR_secondLOGICAL:
24385 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
24386 return (ffelexHandler) ffestb_decl_R5391_;
24388 case FFESTR_secondCHARACTER:
24389 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
24390 return (ffelexHandler) ffestb_decl_R5391_;
24392 case FFESTR_secondDOUBLE:
24393 return (ffelexHandler) ffestb_decl_R5392_;
24395 case FFESTR_secondDOUBLEPRECISION:
24396 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
24397 ffestb_local_.decl.kind = NULL;
24398 ffestb_local_.decl.kindt = NULL;
24399 ffestb_local_.decl.len = NULL;
24400 ffestb_local_.decl.lent = NULL;
24401 return (ffelexHandler) ffestb_decl_R539letters_;
24403 case FFESTR_secondDOUBLECOMPLEX:
24404 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
24405 ffestb_local_.decl.kind = NULL;
24406 ffestb_local_.decl.kindt = NULL;
24407 ffestb_local_.decl.len = NULL;
24408 ffestb_local_.decl.lent = NULL;
24409 return (ffelexHandler) ffestb_decl_R539letters_;
24411 case FFESTR_secondNONE:
24412 return (ffelexHandler) ffestb_decl_R5394_;
24415 case FFESTR_secondTYPE:
24416 ffestb_local_.decl.type = FFESTP_typeTYPE;
24417 return (ffelexHandler) ffestb_decl_R5393_;
24421 goto bad_1; /* :::::::::::::::::::: */
24424 case FFELEX_typeNAMES:
24425 if (ffesta_first_kw != FFESTR_firstIMPLICIT)
24426 goto bad_0; /* :::::::::::::::::::: */
24427 switch (ffelex_token_type (t))
24429 case FFELEX_typeCOMMA:
24430 case FFELEX_typeCOLONCOLON:
24431 case FFELEX_typeASTERISK:
24432 case FFELEX_typeSEMICOLON:
24433 case FFELEX_typeEOS:
24434 ffesta_confirmed ();
24437 case FFELEX_typeOPEN_PAREN:
24441 goto bad_1; /* :::::::::::::::::::: */
24443 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlIMPLICIT);
24444 if (!ffesrc_is_name_init (*p))
24445 goto bad_0; /* :::::::::::::::::::: */
24446 ffestb_local_.decl.imp_started = FALSE;
24447 nt = ffelex_token_name_from_names (ffesta_tokens[0],
24448 FFESTR_firstlIMPLICIT, 0);
24449 kw = ffestr_second (nt);
24450 ffelex_token_kill (nt);
24453 case FFESTR_secondINTEGER:
24454 ffestb_local_.decl.type = FFESTP_typeINTEGER;
24455 return (ffelexHandler) ffestb_decl_R5391_ (t);
24457 case FFESTR_secondBYTE:
24458 ffestb_local_.decl.type = FFESTP_typeBYTE;
24459 return (ffelexHandler) ffestb_decl_R5391_ (t);
24461 case FFESTR_secondWORD:
24462 ffestb_local_.decl.type = FFESTP_typeWORD;
24463 return (ffelexHandler) ffestb_decl_R5391_ (t);
24465 case FFESTR_secondREAL:
24466 ffestb_local_.decl.type = FFESTP_typeREAL;
24467 return (ffelexHandler) ffestb_decl_R5391_ (t);
24469 case FFESTR_secondCOMPLEX:
24470 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
24471 return (ffelexHandler) ffestb_decl_R5391_ (t);
24473 case FFESTR_secondLOGICAL:
24474 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
24475 return (ffelexHandler) ffestb_decl_R5391_ (t);
24477 case FFESTR_secondCHARACTER:
24478 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
24479 return (ffelexHandler) ffestb_decl_R5391_ (t);
24481 case FFESTR_secondDOUBLEPRECISION:
24482 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
24483 ffestb_local_.decl.kind = NULL;
24484 ffestb_local_.decl.kindt = NULL;
24485 ffestb_local_.decl.len = NULL;
24486 ffestb_local_.decl.lent = NULL;
24487 return (ffelexHandler) ffestb_decl_R539letters_ (t);
24489 case FFESTR_secondDOUBLECOMPLEX:
24490 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
24491 ffestb_local_.decl.kind = NULL;
24492 ffestb_local_.decl.kindt = NULL;
24493 ffestb_local_.decl.len = NULL;
24494 ffestb_local_.decl.lent = NULL;
24495 return (ffelexHandler) ffestb_decl_R539letters_ (t);
24497 case FFESTR_secondNONE:
24498 return (ffelexHandler) ffestb_decl_R5394_ (t);
24501 case FFESTR_secondTYPE:
24502 ffestb_local_.decl.type = FFESTP_typeTYPE;
24503 return (ffelexHandler) ffestb_decl_R5393_ (t);
24507 goto bad_1; /* :::::::::::::::::::: */
24511 goto bad_0; /* :::::::::::::::::::: */
24514 bad_0: /* :::::::::::::::::::: */
24515 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", ffesta_tokens[0]);
24516 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24518 bad_1: /* :::::::::::::::::::: */
24519 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24520 return (ffelexHandler) ffelex_swallow_tokens (t,
24521 (ffelexHandler) ffesta_zero); /* Invalid second token. */
24524 /* ffestb_decl_R5391_ -- "IMPLICIT" generic-type
24526 return ffestb_decl_R5391_; // to lexer
24528 Handle ASTERISK or OPEN_PAREN. */
24530 static ffelexHandler
24531 ffestb_decl_R5391_ (ffelexToken t)
24533 switch (ffelex_token_type (t))
24535 case FFELEX_typeASTERISK:
24536 ffesta_confirmed ();
24537 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_;
24538 ffestb_local_.decl.badname = "IMPLICIT";
24539 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
24540 return (ffelexHandler) ffestb_decl_starlen_;
24541 return (ffelexHandler) ffestb_decl_starkind_;
24543 case FFELEX_typeOPEN_PAREN:
24544 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_;
24545 ffestb_local_.decl.badname = "IMPLICIT";
24546 ffestb_local_.decl.kind = NULL;
24547 ffestb_local_.decl.kindt = NULL;
24548 ffestb_local_.decl.len = NULL;
24549 ffestb_local_.decl.lent = NULL;
24550 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
24551 ffestb_local_.decl.imp_handler
24552 = (ffelexHandler) ffestb_decl_typeparams_;
24554 ffestb_local_.decl.imp_handler
24555 = (ffelexHandler) ffestb_decl_kindparam_;
24556 return (ffelexHandler) ffestb_decl_R539maybe_ (t);
24562 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24563 ffestc_R539finish ();
24564 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24565 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24568 /* ffestb_decl_R5392_ -- "IMPLICIT" "DOUBLE"
24570 return ffestb_decl_R5392_; // to lexer
24574 static ffelexHandler
24575 ffestb_decl_R5392_ (ffelexToken t)
24577 switch (ffelex_token_type (t))
24579 case FFELEX_typeNAME:
24580 switch (ffestr_second (t))
24582 case FFESTR_secondPRECISION:
24583 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
24586 case FFESTR_secondCOMPLEX:
24587 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
24591 goto bad; /* :::::::::::::::::::: */
24593 ffestb_local_.decl.kind = NULL;
24594 ffestb_local_.decl.kindt = NULL;
24595 ffestb_local_.decl.len = NULL;
24596 ffestb_local_.decl.lent = NULL;
24597 return (ffelexHandler) ffestb_decl_R539letters_;
24603 bad: /* :::::::::::::::::::: */
24604 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24605 ffestc_R539finish ();
24606 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24607 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24610 /* ffestb_decl_R5393_ -- "IMPLICIT" "TYPE"
24612 return ffestb_decl_R5393_; // to lexer
24614 Handle OPEN_PAREN. */
24617 static ffelexHandler
24618 ffestb_decl_R5393_ (ffelexToken t)
24620 switch (ffelex_token_type (t))
24622 case FFELEX_typeOPEN_PAREN:
24623 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_;
24624 ffestb_local_.decl.badname = "IMPLICIT";
24625 return (ffelexHandler) ffestb_decl_typetype1_;
24631 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24632 ffestc_R539finish ();
24633 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24634 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24638 /* ffestb_decl_R5394_ -- "IMPLICIT" "NONE"
24640 return ffestb_decl_R5394_; // to lexer
24642 Handle EOS/SEMICOLON. */
24644 static ffelexHandler
24645 ffestb_decl_R5394_ (ffelexToken t)
24647 switch (ffelex_token_type (t))
24649 case FFELEX_typeEOS:
24650 case FFELEX_typeSEMICOLON:
24651 ffesta_confirmed ();
24652 if (!ffesta_is_inhibited ())
24653 ffestc_R539 (); /* IMPLICIT NONE. */
24654 return (ffelexHandler) ffesta_zero (t);
24660 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24661 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24664 /* ffestb_decl_R5395_ -- "IMPLICIT" implicit-spec-list COMMA
24666 return ffestb_decl_R5395_; // to lexer
24668 Handle NAME for next type-spec. */
24670 static ffelexHandler
24671 ffestb_decl_R5395_ (ffelexToken t)
24673 switch (ffelex_token_type (t))
24675 case FFELEX_typeNAME:
24676 switch (ffestr_second (t))
24678 case FFESTR_secondINTEGER:
24679 ffestb_local_.decl.type = FFESTP_typeINTEGER;
24680 return (ffelexHandler) ffestb_decl_R5391_;
24682 case FFESTR_secondBYTE:
24683 ffestb_local_.decl.type = FFESTP_typeBYTE;
24684 return (ffelexHandler) ffestb_decl_R5391_;
24686 case FFESTR_secondWORD:
24687 ffestb_local_.decl.type = FFESTP_typeWORD;
24688 return (ffelexHandler) ffestb_decl_R5391_;
24690 case FFESTR_secondREAL:
24691 ffestb_local_.decl.type = FFESTP_typeREAL;
24692 return (ffelexHandler) ffestb_decl_R5391_;
24694 case FFESTR_secondCOMPLEX:
24695 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
24696 return (ffelexHandler) ffestb_decl_R5391_;
24698 case FFESTR_secondLOGICAL:
24699 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
24700 return (ffelexHandler) ffestb_decl_R5391_;
24702 case FFESTR_secondCHARACTER:
24703 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
24704 return (ffelexHandler) ffestb_decl_R5391_;
24706 case FFESTR_secondDOUBLE:
24707 return (ffelexHandler) ffestb_decl_R5392_;
24709 case FFESTR_secondDOUBLEPRECISION:
24710 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
24711 ffestb_local_.decl.kind = NULL;
24712 ffestb_local_.decl.kindt = NULL;
24713 ffestb_local_.decl.len = NULL;
24714 ffestb_local_.decl.lent = NULL;
24715 return (ffelexHandler) ffestb_decl_R539letters_;
24717 case FFESTR_secondDOUBLECOMPLEX:
24718 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
24719 ffestb_local_.decl.kind = NULL;
24720 ffestb_local_.decl.kindt = NULL;
24721 ffestb_local_.decl.len = NULL;
24722 ffestb_local_.decl.lent = NULL;
24723 return (ffelexHandler) ffestb_decl_R539letters_;
24726 case FFESTR_secondTYPE:
24727 ffestb_local_.decl.type = FFESTP_typeTYPE;
24728 return (ffelexHandler) ffestb_decl_R5393_;
24740 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24741 ffestc_R539finish ();
24742 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24743 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24746 /* ffestb_decl_R539letters_ -- "IMPLICIT" type-spec
24748 return ffestb_decl_R539letters_; // to lexer
24750 Handle OPEN_PAREN. */
24752 static ffelexHandler
24753 ffestb_decl_R539letters_ (ffelexToken t)
24755 ffelex_set_names (FALSE);
24757 switch (ffelex_token_type (t))
24759 case FFELEX_typeOPEN_PAREN:
24760 ffestb_local_.decl.imps = ffestt_implist_create ();
24761 return (ffelexHandler) ffestb_decl_R539letters_1_;
24767 if (ffestb_local_.decl.kindt != NULL)
24768 ffelex_token_kill (ffestb_local_.decl.kindt);
24769 if (ffestb_local_.decl.lent != NULL)
24770 ffelex_token_kill (ffestb_local_.decl.lent);
24771 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24772 ffestc_R539finish ();
24773 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24774 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24777 /* ffestb_decl_R539letters_1_ -- "IMPLICIT" type-spec OPEN_PAREN
24779 return ffestb_decl_R539letters_1_; // to lexer
24783 static ffelexHandler
24784 ffestb_decl_R539letters_1_ (ffelexToken t)
24786 switch (ffelex_token_type (t))
24788 case FFELEX_typeNAME:
24789 if (ffelex_token_length (t) != 1)
24791 ffesta_tokens[1] = ffelex_token_use (t);
24792 return (ffelexHandler) ffestb_decl_R539letters_2_;
24798 ffestt_implist_kill (ffestb_local_.decl.imps);
24799 if (ffestb_local_.decl.kindt != NULL)
24800 ffelex_token_kill (ffestb_local_.decl.kindt);
24801 if (ffestb_local_.decl.lent != NULL)
24802 ffelex_token_kill (ffestb_local_.decl.lent);
24803 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24804 ffestc_R539finish ();
24805 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24806 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24809 /* ffestb_decl_R539letters_2_ -- "IMPLICIT" type-spec OPEN_PAREN NAME
24811 return ffestb_decl_R539letters_2_; // to lexer
24813 Handle COMMA or MINUS. */
24815 static ffelexHandler
24816 ffestb_decl_R539letters_2_ (ffelexToken t)
24818 switch (ffelex_token_type (t))
24820 case FFELEX_typeCOMMA:
24821 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL);
24822 return (ffelexHandler) ffestb_decl_R539letters_1_;
24824 case FFELEX_typeCLOSE_PAREN:
24825 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL);
24826 return (ffelexHandler) ffestb_decl_R539letters_5_;
24828 case FFELEX_typeMINUS:
24829 return (ffelexHandler) ffestb_decl_R539letters_3_;
24835 ffelex_token_kill (ffesta_tokens[1]);
24836 ffestt_implist_kill (ffestb_local_.decl.imps);
24837 if (ffestb_local_.decl.kindt != NULL)
24838 ffelex_token_kill (ffestb_local_.decl.kindt);
24839 if (ffestb_local_.decl.lent != NULL)
24840 ffelex_token_kill (ffestb_local_.decl.lent);
24841 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24842 ffestc_R539finish ();
24843 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24844 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24847 /* ffestb_decl_R539letters_3_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS
24849 return ffestb_decl_R539letters_3_; // to lexer
24853 static ffelexHandler
24854 ffestb_decl_R539letters_3_ (ffelexToken t)
24856 switch (ffelex_token_type (t))
24858 case FFELEX_typeNAME:
24859 if (ffelex_token_length (t) != 1)
24861 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1],
24862 ffelex_token_use (t));
24863 return (ffelexHandler) ffestb_decl_R539letters_4_;
24869 ffelex_token_kill (ffesta_tokens[1]);
24870 ffestt_implist_kill (ffestb_local_.decl.imps);
24871 if (ffestb_local_.decl.kindt != NULL)
24872 ffelex_token_kill (ffestb_local_.decl.kindt);
24873 if (ffestb_local_.decl.lent != NULL)
24874 ffelex_token_kill (ffestb_local_.decl.lent);
24875 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24876 ffestc_R539finish ();
24877 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24878 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24881 /* ffestb_decl_R539letters_4_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS
24884 return ffestb_decl_R539letters_4_; // to lexer
24886 Handle COMMA or CLOSE_PAREN. */
24888 static ffelexHandler
24889 ffestb_decl_R539letters_4_ (ffelexToken t)
24891 switch (ffelex_token_type (t))
24893 case FFELEX_typeCOMMA:
24894 return (ffelexHandler) ffestb_decl_R539letters_1_;
24896 case FFELEX_typeCLOSE_PAREN:
24897 return (ffelexHandler) ffestb_decl_R539letters_5_;
24903 ffestt_implist_kill (ffestb_local_.decl.imps);
24904 if (ffestb_local_.decl.kindt != NULL)
24905 ffelex_token_kill (ffestb_local_.decl.kindt);
24906 if (ffestb_local_.decl.lent != NULL)
24907 ffelex_token_kill (ffestb_local_.decl.lent);
24908 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24909 ffestc_R539finish ();
24910 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24911 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24914 /* ffestb_decl_R539letters_5_ -- "IMPLICIT" type-spec OPEN_PAREN
24915 letter-spec-list CLOSE_PAREN
24917 return ffestb_decl_R539letters_5_; // to lexer
24919 Handle COMMA or EOS/SEMICOLON. */
24921 static ffelexHandler
24922 ffestb_decl_R539letters_5_ (ffelexToken t)
24924 switch (ffelex_token_type (t))
24926 case FFELEX_typeCOMMA:
24927 case FFELEX_typeEOS:
24928 case FFELEX_typeSEMICOLON:
24929 if (!ffestb_local_.decl.imp_started)
24931 ffestb_local_.decl.imp_started = TRUE;
24932 ffesta_confirmed ();
24933 if (!ffesta_is_inhibited ())
24934 ffestc_R539start ();
24936 if (!ffesta_is_inhibited ())
24937 ffestc_R539item (ffestb_local_.decl.type, ffestb_local_.decl.kind,
24938 ffestb_local_.decl.kindt, ffestb_local_.decl.len,
24939 ffestb_local_.decl.lent, ffestb_local_.decl.imps);
24940 if (ffestb_local_.decl.kindt != NULL)
24941 ffelex_token_kill (ffestb_local_.decl.kindt);
24942 if (ffestb_local_.decl.lent != NULL)
24943 ffelex_token_kill (ffestb_local_.decl.lent);
24944 ffestt_implist_kill (ffestb_local_.decl.imps);
24945 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
24946 return (ffelexHandler) ffestb_decl_R5395_;
24947 if (!ffesta_is_inhibited ())
24948 ffestc_R539finish ();
24949 return (ffelexHandler) ffesta_zero (t);
24955 ffestt_implist_kill (ffestb_local_.decl.imps);
24956 if (ffestb_local_.decl.kindt != NULL)
24957 ffelex_token_kill (ffestb_local_.decl.kindt);
24958 if (ffestb_local_.decl.lent != NULL)
24959 ffelex_token_kill (ffestb_local_.decl.lent);
24960 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24961 ffestc_R539finish ();
24962 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24963 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24966 /* ffestb_decl_R539maybe_ -- "IMPLICIT" generic-type-spec
24968 return ffestb_decl_R539maybe_; // to lexer
24970 Handle OPEN_PAREN. */
24972 static ffelexHandler
24973 ffestb_decl_R539maybe_ (ffelexToken t)
24975 assert (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN);
24976 ffestb_local_.decl.imps = ffestt_implist_create ();
24977 ffestb_local_.decl.toklist = ffestt_tokenlist_create ();
24978 ffestb_local_.decl.imp_seen_comma
24979 = (ffestb_local_.decl.type != FFESTP_typeCHARACTER);
24980 return (ffelexHandler) ffestb_decl_R539maybe_1_;
24983 /* ffestb_decl_R539maybe_1_ -- "IMPLICIT" generic-type-spec OPEN_PAREN
24985 return ffestb_decl_R539maybe_1_; // to lexer
24989 static ffelexHandler
24990 ffestb_decl_R539maybe_1_ (ffelexToken t)
24992 ffelexHandler next;
24994 switch (ffelex_token_type (t))
24996 case FFELEX_typeNAME:
24997 if (ffelex_token_length (t) != 1)
24999 ffesta_tokens[1] = ffelex_token_use (t);
25000 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25001 return (ffelexHandler) ffestb_decl_R539maybe_2_;
25007 ffestt_implist_kill (ffestb_local_.decl.imps);
25008 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25009 (ffelexHandler) ffestb_local_.decl.imp_handler);
25010 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25011 return (ffelexHandler) (*next) (t);
25014 /* ffestb_decl_R539maybe_2_ -- "IMPLICIT" generic-type-spec OPEN_PAREN NAME
25016 return ffestb_decl_R539maybe_2_; // to lexer
25018 Handle COMMA or MINUS. */
25020 static ffelexHandler
25021 ffestb_decl_R539maybe_2_ (ffelexToken t)
25023 ffelexHandler next;
25025 switch (ffelex_token_type (t))
25027 case FFELEX_typeCOMMA:
25028 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL);
25029 if (ffestb_local_.decl.imp_seen_comma)
25031 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25032 return (ffelexHandler) ffestb_decl_R539letters_1_;
25034 ffestb_local_.decl.imp_seen_comma = TRUE;
25035 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25036 return (ffelexHandler) ffestb_decl_R539maybe_1_;
25038 case FFELEX_typeCLOSE_PAREN:
25039 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL);
25040 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25041 return (ffelexHandler) ffestb_decl_R539maybe_5_;
25043 case FFELEX_typeMINUS:
25044 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25045 return (ffelexHandler) ffestb_decl_R539maybe_3_;
25051 ffelex_token_kill (ffesta_tokens[1]);
25052 ffestt_implist_kill (ffestb_local_.decl.imps);
25053 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25054 (ffelexHandler) ffestb_local_.decl.imp_handler);
25055 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25056 return (ffelexHandler) (*next) (t);
25059 /* ffestb_decl_R539maybe_3_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS
25061 return ffestb_decl_R539maybe_3_; // to lexer
25065 static ffelexHandler
25066 ffestb_decl_R539maybe_3_ (ffelexToken t)
25068 ffelexHandler next;
25070 switch (ffelex_token_type (t))
25072 case FFELEX_typeNAME:
25073 if (ffelex_token_length (t) != 1)
25075 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1],
25076 ffelex_token_use (t));
25077 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25078 return (ffelexHandler) ffestb_decl_R539maybe_4_;
25084 ffelex_token_kill (ffesta_tokens[1]);
25085 ffestt_implist_kill (ffestb_local_.decl.imps);
25086 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25087 (ffelexHandler) ffestb_local_.decl.imp_handler);
25088 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25089 return (ffelexHandler) (*next) (t);
25092 /* ffestb_decl_R539maybe_4_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS
25095 return ffestb_decl_R539maybe_4_; // to lexer
25097 Handle COMMA or CLOSE_PAREN. */
25099 static ffelexHandler
25100 ffestb_decl_R539maybe_4_ (ffelexToken t)
25102 ffelexHandler next;
25104 switch (ffelex_token_type (t))
25106 case FFELEX_typeCOMMA:
25107 if (ffestb_local_.decl.imp_seen_comma)
25109 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25110 return (ffelexHandler) ffestb_decl_R539letters_1_;
25112 ffestb_local_.decl.imp_seen_comma = TRUE;
25113 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25114 return (ffelexHandler) ffestb_decl_R539maybe_1_;
25116 case FFELEX_typeCLOSE_PAREN:
25117 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25118 return (ffelexHandler) ffestb_decl_R539maybe_5_;
25124 ffestt_implist_kill (ffestb_local_.decl.imps);
25125 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25126 (ffelexHandler) ffestb_local_.decl.imp_handler);
25127 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25128 return (ffelexHandler) (*next) (t);
25131 /* ffestb_decl_R539maybe_5_ -- "IMPLICIT" type-spec OPEN_PAREN
25132 letter-spec-list CLOSE_PAREN
25134 return ffestb_decl_R539maybe_5_; // to lexer
25136 Handle COMMA or EOS/SEMICOLON. */
25138 static ffelexHandler
25139 ffestb_decl_R539maybe_5_ (ffelexToken t)
25141 ffelexHandler next;
25143 switch (ffelex_token_type (t))
25145 case FFELEX_typeCOMMA:
25146 case FFELEX_typeEOS:
25147 case FFELEX_typeSEMICOLON:
25148 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25149 if (!ffestb_local_.decl.imp_started)
25151 ffestb_local_.decl.imp_started = TRUE;
25152 ffesta_confirmed ();
25153 if (!ffesta_is_inhibited ())
25154 ffestc_R539start ();
25156 if (!ffesta_is_inhibited ())
25157 ffestc_R539item (ffestb_local_.decl.type, ffestb_local_.decl.kind,
25158 ffestb_local_.decl.kindt, ffestb_local_.decl.len,
25159 ffestb_local_.decl.lent, ffestb_local_.decl.imps);
25160 if (ffestb_local_.decl.kindt != NULL)
25161 ffelex_token_kill (ffestb_local_.decl.kindt);
25162 if (ffestb_local_.decl.lent != NULL)
25163 ffelex_token_kill (ffestb_local_.decl.lent);
25164 ffestt_implist_kill (ffestb_local_.decl.imps);
25165 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
25166 return (ffelexHandler) ffestb_decl_R5395_;
25167 if (!ffesta_is_inhibited ())
25168 ffestc_R539finish ();
25169 return (ffelexHandler) ffesta_zero (t);
25171 case FFELEX_typeOPEN_PAREN:
25172 ffesta_confirmed ();
25173 ffestt_implist_kill (ffestb_local_.decl.imps);
25174 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25175 (ffelexHandler) ffestb_local_.decl.imp_handler);
25176 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25177 return (ffelexHandler) (*next) (t);
25183 ffestt_implist_kill (ffestb_local_.decl.imps);
25184 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25185 if (ffestb_local_.decl.kindt != NULL)
25186 ffelex_token_kill (ffestb_local_.decl.kindt);
25187 if (ffestb_local_.decl.lent != NULL)
25188 ffelex_token_kill (ffestb_local_.decl.lent);
25189 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
25190 ffestc_R539finish ();
25191 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
25192 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);