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 ())
3777 if (ffesta_first_kw == FFESTR_firstSTOP)
3778 ffestc_R842 (expr, ft);
3780 ffestc_R843 (expr, ft);
3782 return (ffelexHandler) ffesta_zero (t);
3785 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
3786 (ffesta_first_kw == FFESTR_firstSTOP)
3792 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3795 /* ffestb_if -- Parse an IF statement
3797 return ffestb_if; // to lexer
3799 Make sure the statement has a valid form for an IF statement.
3800 If it does, implement the statement. */
3803 ffestb_if (ffelexToken t)
3805 switch (ffelex_token_type (ffesta_tokens[0]))
3807 case FFELEX_typeNAME:
3808 if (ffesta_first_kw != FFESTR_firstIF)
3809 goto bad_0; /* :::::::::::::::::::: */
3812 case FFELEX_typeNAMES:
3813 if (ffesta_first_kw != FFESTR_firstIF)
3814 goto bad_0; /* :::::::::::::::::::: */
3815 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlIF)
3816 goto bad_0; /* :::::::::::::::::::: */
3820 goto bad_0; /* :::::::::::::::::::: */
3823 switch (ffelex_token_type (t))
3825 case FFELEX_typeOPEN_PAREN:
3828 case FFELEX_typeEOS:
3829 case FFELEX_typeSEMICOLON:
3830 case FFELEX_typeCOMMA:
3831 case FFELEX_typeCOLONCOLON:
3832 ffesta_confirmed (); /* Error, but clearly intended. */
3833 goto bad_1; /* :::::::::::::::::::: */
3836 goto bad_1; /* :::::::::::::::::::: */
3839 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextIF,
3840 (ffeexprCallback) ffestb_if1_);
3842 bad_0: /* :::::::::::::::::::: */
3843 if (ffesta_construct_name != NULL)
3845 ffelex_token_kill (ffesta_construct_name);
3846 ffesta_construct_name = NULL;
3848 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", ffesta_tokens[0]);
3849 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3851 bad_1: /* :::::::::::::::::::: */
3852 if (ffesta_construct_name != NULL)
3854 ffelex_token_kill (ffesta_construct_name);
3855 ffesta_construct_name = NULL;
3857 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t);
3858 return (ffelexHandler) ffelex_swallow_tokens (t,
3859 (ffelexHandler) ffesta_zero); /* Invalid second token. */
3862 /* ffestb_if1_ -- "IF" OPEN_PAREN expr
3864 (ffestb_if1_) // to expression handler
3866 Make sure the next token is CLOSE_PAREN. */
3868 static ffelexHandler
3869 ffestb_if1_ (ffelexToken ft, ffebld expr, ffelexToken t)
3871 ffestb_local_.if_stmt.expr = expr;
3873 switch (ffelex_token_type (t))
3875 case FFELEX_typeCLOSE_PAREN:
3878 ffesta_tokens[1] = ffelex_token_use (ft);
3879 ffelex_set_names (TRUE);
3880 return (ffelexHandler) ffestb_if2_;
3886 if (ffesta_construct_name != NULL)
3888 ffelex_token_kill (ffesta_construct_name);
3889 ffesta_construct_name = NULL;
3891 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t);
3892 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3895 /* ffestb_if2_ -- "IF" OPEN_PAREN expr CLOSE_PAREN
3897 return ffestb_if2_; // to lexer
3899 Make sure the next token is NAME. */
3901 static ffelexHandler
3902 ffestb_if2_ (ffelexToken t)
3904 ffelex_set_names (FALSE);
3906 switch (ffelex_token_type (t))
3908 case FFELEX_typeNAME:
3909 case FFELEX_typeNAMES:
3910 ffesta_confirmed ();
3911 ffesta_tokens[2] = ffelex_token_use (t);
3912 return (ffelexHandler) ffestb_if3_;
3918 ffelex_token_kill (ffesta_tokens[1]);
3919 if ((ffesta_construct_name == NULL)
3920 || (ffelex_token_type (t) != FFELEX_typeNUMBER))
3921 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t);
3923 ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT",
3924 ffesta_construct_name, t);
3925 if (ffesta_construct_name != NULL)
3927 ffelex_token_kill (ffesta_construct_name);
3928 ffesta_construct_name = NULL;
3930 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3933 /* ffestb_if3_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NAME
3935 return ffestb_if3_; // to lexer
3937 If the next token is EOS or SEMICOLON and the preceding NAME was "THEN",
3938 implement R803. Else, implement R807 and send the preceding NAME followed
3939 by the current token. */
3941 static ffelexHandler
3942 ffestb_if3_ (ffelexToken t)
3946 switch (ffelex_token_type (t))
3948 case FFELEX_typeEOS:
3949 case FFELEX_typeSEMICOLON:
3950 if (ffestr_first (ffesta_tokens[2]) == FFESTR_firstTHEN)
3952 if (!ffesta_is_inhibited ())
3953 ffestc_R803 (ffesta_construct_name, ffestb_local_.if_stmt.expr,
3955 ffelex_token_kill (ffesta_tokens[1]);
3956 ffelex_token_kill (ffesta_tokens[2]);
3957 if (ffesta_construct_name != NULL)
3959 ffelex_token_kill (ffesta_construct_name);
3960 ffesta_construct_name = NULL;
3962 return (ffelexHandler) ffesta_zero (t);
3970 if (ffesta_construct_name != NULL)
3972 if (!ffesta_is_inhibited ())
3973 ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT",
3974 ffesta_construct_name, ffesta_tokens[2]);
3975 ffelex_token_kill (ffesta_construct_name);
3976 ffesta_construct_name = NULL;
3977 ffelex_token_kill (ffesta_tokens[1]);
3978 ffelex_token_kill (ffesta_tokens[2]);
3979 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
3982 if (!ffesta_is_inhibited ())
3983 ffestc_R807 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]);
3984 ffelex_token_kill (ffesta_tokens[1]);
3986 ffelexToken my_2 = ffesta_tokens[2];
3988 next = (ffelexHandler) ffesta_two (my_2, t);
3989 ffelex_token_kill (my_2);
3991 return (ffelexHandler) next;
3994 /* ffestb_where -- Parse a WHERE statement
3996 return ffestb_where; // to lexer
3998 Make sure the statement has a valid form for a WHERE statement.
3999 If it does, implement the statement. */
4003 ffestb_where (ffelexToken t)
4005 switch (ffelex_token_type (ffesta_tokens[0]))
4007 case FFELEX_typeNAME:
4008 if (ffesta_first_kw != FFESTR_firstWHERE)
4009 goto bad_0; /* :::::::::::::::::::: */
4012 case FFELEX_typeNAMES:
4013 if (ffesta_first_kw != FFESTR_firstWHERE)
4014 goto bad_0; /* :::::::::::::::::::: */
4015 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlWHERE)
4016 goto bad_0; /* :::::::::::::::::::: */
4020 goto bad_0; /* :::::::::::::::::::: */
4023 switch (ffelex_token_type (t))
4025 case FFELEX_typeOPEN_PAREN:
4028 case FFELEX_typeEOS:
4029 case FFELEX_typeSEMICOLON:
4030 case FFELEX_typeCOMMA:
4031 case FFELEX_typeCOLONCOLON:
4032 ffesta_confirmed (); /* Error, but clearly intended. */
4033 goto bad_1; /* :::::::::::::::::::: */
4036 goto bad_1; /* :::::::::::::::::::: */
4039 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextWHERE,
4040 (ffeexprCallback) ffestb_where1_);
4042 bad_0: /* :::::::::::::::::::: */
4043 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", ffesta_tokens[0]);
4044 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4046 bad_1: /* :::::::::::::::::::: */
4047 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t);
4048 return (ffelexHandler) ffelex_swallow_tokens (t,
4049 (ffelexHandler) ffesta_zero); /* Invalid second token. */
4053 /* ffestb_where1_ -- "WHERE" OPEN_PAREN expr
4055 (ffestb_where1_) // to expression handler
4057 Make sure the next token is CLOSE_PAREN. */
4060 static ffelexHandler
4061 ffestb_where1_ (ffelexToken ft, ffebld expr, ffelexToken t)
4063 ffestb_local_.if_stmt.expr = expr;
4065 switch (ffelex_token_type (t))
4067 case FFELEX_typeCLOSE_PAREN:
4070 ffesta_tokens[1] = ffelex_token_use (ft);
4071 ffelex_set_names (TRUE);
4072 return (ffelexHandler) ffestb_where2_;
4078 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t);
4079 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4083 /* ffestb_where2_ -- "WHERE" OPEN_PAREN expr CLOSE_PAREN
4085 return ffestb_where2_; // to lexer
4087 Make sure the next token is NAME. */
4090 static ffelexHandler
4091 ffestb_where2_ (ffelexToken t)
4093 ffelex_set_names (FALSE);
4095 switch (ffelex_token_type (t))
4097 case FFELEX_typeNAME:
4098 case FFELEX_typeNAMES:
4099 ffesta_confirmed ();
4100 ffesta_tokens[2] = ffelex_token_use (t);
4101 return (ffelexHandler) ffestb_where3_;
4103 case FFELEX_typeEOS:
4104 case FFELEX_typeSEMICOLON:
4105 ffesta_confirmed ();
4106 if (!ffesta_is_inhibited ())
4107 ffestc_R742 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]);
4108 ffelex_token_kill (ffesta_tokens[1]);
4109 return (ffelexHandler) ffesta_zero (t);
4115 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t);
4116 ffelex_token_kill (ffesta_tokens[1]);
4117 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4121 /* ffestb_where3_ -- "WHERE" OPEN_PAREN expr CLOSE_PAREN NAME
4123 return ffestb_where3_; // to lexer
4128 static ffelexHandler
4129 ffestb_where3_ (ffelexToken t)
4132 ffelexToken my_2 = ffesta_tokens[2];
4134 if (!ffesta_is_inhibited ())
4135 ffestc_R740 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]);
4136 ffelex_token_kill (ffesta_tokens[1]);
4137 next = (ffelexHandler) ffesta_two (my_2, t);
4138 ffelex_token_kill (my_2);
4139 return (ffelexHandler) next;
4143 /* ffestb_let -- Parse an assignment statement
4145 return ffestb_let; // to lexer
4147 Make sure the statement has a valid form for an assignment statement. If
4148 it does, implement the statement. */
4151 ffestb_let (ffelexToken t)
4154 bool vxtparam; /* TRUE if it might really be a VXT PARAMETER
4158 switch (ffelex_token_type (ffesta_tokens[0]))
4160 case FFELEX_typeNAME:
4164 case FFELEX_typeNAMES:
4169 goto bad_0; /* :::::::::::::::::::: */
4172 switch (ffelex_token_type (t))
4174 case FFELEX_typeOPEN_PAREN:
4175 case FFELEX_typePERCENT:
4176 case FFELEX_typePOINTS:
4177 ffestb_local_.let.vxtparam = FALSE;
4180 case FFELEX_typeEQUALS:
4181 if (!vxtparam || (ffesta_first_kw != FFESTR_firstPARAMETER))
4183 ffestb_local_.let.vxtparam = FALSE;
4186 p = ffelex_token_text (ffesta_tokens[0]) + FFESTR_firstlPARAMETER;
4187 ffestb_local_.let.vxtparam = ffesrc_is_name_init (*p);
4191 goto bad_1; /* :::::::::::::::::::: */
4194 next = (ffelexHandler) (*((ffelexHandler)
4195 ffeexpr_lhs (ffesta_output_pool,
4197 (ffeexprCallback) ffestb_let1_)))
4199 return (ffelexHandler) (*next) (t);
4201 bad_0: /* :::::::::::::::::::: */
4202 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", ffesta_tokens[0]);
4203 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4205 bad_1: /* :::::::::::::::::::: */
4206 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", t);
4207 return (ffelexHandler) ffelex_swallow_tokens (t,
4208 (ffelexHandler) ffesta_zero); /* Invalid second token. */
4211 /* ffestb_let1_ -- expr
4213 (ffestb_let1_) // to expression handler
4215 Make sure the next token is EQUALS or POINTS. */
4217 static ffelexHandler
4218 ffestb_let1_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
4220 ffestb_local_.let.dest = expr;
4222 switch (ffelex_token_type (t))
4225 case FFELEX_typePOINTS:
4227 case FFELEX_typeEQUALS:
4230 ffesta_tokens[1] = ffelex_token_use (t);
4231 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
4232 FFEEXPR_contextLET, (ffeexprCallback) ffestb_let2_);
4238 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", t);
4239 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4242 /* ffestb_let2_ -- expr EQUALS/POINTS expr
4244 (ffestb_end2_) // to expression handler
4246 Make sure the next token is EOS or SEMICOLON; implement the statement. */
4248 static ffelexHandler
4249 ffestb_let2_ (ffelexToken ft, ffebld expr, ffelexToken t)
4251 switch (ffelex_token_type (t))
4253 case FFELEX_typeEOS:
4254 case FFELEX_typeSEMICOLON:
4257 if (ffestb_local_.let.vxtparam && !ffestc_is_let_not_V027 ())
4259 ffesta_confirmed ();
4260 if (!ffesta_is_inhibited ())
4262 if (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeEQUALS)
4264 ffestc_let (ffestb_local_.let.dest, expr, ft);
4267 ffestc_R738 (ffestb_local_.let.dest, expr, ft);
4269 ffelex_token_kill (ffesta_tokens[1]);
4270 return (ffelexHandler) ffesta_zero (t);
4276 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
4277 (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeEQUALS)
4278 ? "assignment" : "pointer-assignment",
4280 ffelex_token_kill (ffesta_tokens[1]);
4281 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4284 /* ffestb_type -- Parse the TYPE statement
4286 return ffestb_type; // to lexer
4288 Make sure the statement has a valid form for the TYPE statement. If
4289 it does, implement the statement. */
4293 ffestb_type (ffelexToken t)
4298 switch (ffelex_token_type (ffesta_tokens[0]))
4300 case FFELEX_typeNAME:
4301 if (ffesta_first_kw != FFESTR_firstTYPE)
4302 goto bad_0; /* :::::::::::::::::::: */
4303 switch (ffelex_token_type (t))
4305 case FFELEX_typeEOS:
4306 case FFELEX_typeSEMICOLON:
4307 case FFELEX_typeCOLONCOLON:
4308 ffesta_confirmed (); /* Error, but clearly intended. */
4309 goto bad_1; /* :::::::::::::::::::: */
4312 goto bad_1; /* :::::::::::::::::::: */
4314 case FFELEX_typeCOMMA:
4315 ffesta_confirmed ();
4316 return (ffelexHandler) ffestb_type1_;
4318 case FFELEX_typeNAME: /* No confirm here, because ambig w/V020 VXT
4320 ffesta_tokens[1] = NULL;
4321 ffesta_tokens[2] = ffelex_token_use (t);
4322 return (ffelexHandler) ffestb_type4_;
4325 case FFELEX_typeNAMES:
4326 if (ffesta_first_kw != FFESTR_firstTYPE)
4327 goto bad_0; /* :::::::::::::::::::: */
4328 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlTYPE);
4329 switch (ffelex_token_type (t))
4332 goto bad_1; /* :::::::::::::::::::: */
4334 case FFELEX_typeCOMMA:
4336 goto bad_i; /* :::::::::::::::::::: */
4337 ffesta_confirmed ();
4338 ffelex_set_names (TRUE);
4339 return (ffelexHandler) ffestb_type1_;
4341 case FFELEX_typeEOS:
4342 case FFELEX_typeSEMICOLON:
4345 if (!ffesrc_is_name_init (*p))
4346 goto bad_i; /* :::::::::::::::::::: */
4347 ffesta_tokens[1] = NULL;
4349 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
4350 return (ffelexHandler) ffestb_type4_ (t);
4353 goto bad_0; /* :::::::::::::::::::: */
4356 bad_0: /* :::::::::::::::::::: */
4357 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", ffesta_tokens[0]);
4358 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4360 bad_1: /* :::::::::::::::::::: */
4361 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4362 return (ffelexHandler) ffelex_swallow_tokens (t,
4363 (ffelexHandler) ffesta_zero); /* Invalid second token. */
4365 bad_i: /* :::::::::::::::::::: */
4366 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "TYPE", ffesta_tokens[0], i, t);
4367 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4370 /* ffestb_type1_ -- "TYPE" COMMA
4372 return ffestb_type1_; // to lexer
4374 Make sure the next token is a NAME. */
4376 static ffelexHandler
4377 ffestb_type1_ (ffelexToken t)
4382 ffelex_set_names (FALSE);
4384 switch (ffelex_token_type (t))
4386 case FFELEX_typeNAME:
4387 ffesta_tokens[1] = ffelex_token_use (t);
4388 ffestb_local_.type.kw = ffestr_other (t);
4389 switch (ffestb_local_.varlist.kw)
4391 case FFESTR_otherPUBLIC:
4392 case FFESTR_otherPRIVATE:
4393 return (ffelexHandler) ffestb_type2_;
4396 ffelex_token_kill (ffesta_tokens[1]);
4401 case FFELEX_typeNAMES:
4402 ffesta_tokens[1] = ffelex_token_use (t);
4403 ffestb_local_.type.kw = ffestr_other (t);
4404 switch (ffestb_local_.varlist.kw)
4406 case FFESTR_otherPUBLIC:
4407 p = ffelex_token_text (t) + (i = FFESTR_otherlPUBLIC);
4409 return (ffelexHandler) ffestb_type2_;
4410 if (!ffesrc_is_name_init (*p))
4411 goto bad_i1; /* :::::::::::::::::::: */
4412 ffesta_tokens[2] = ffelex_token_name_from_names (t, i, 0);
4413 return (ffelexHandler) ffestb_type4_;
4415 case FFESTR_otherPRIVATE:
4416 p = ffelex_token_text (t) + (i = FFESTR_otherlPRIVATE);
4418 return (ffelexHandler) ffestb_type2_;
4419 if (!ffesrc_is_name_init (*p))
4420 goto bad_i1; /* :::::::::::::::::::: */
4421 ffesta_tokens[2] = ffelex_token_name_from_names (t, i, 0);
4422 return (ffelexHandler) ffestb_type4_;
4425 ffelex_token_kill (ffesta_tokens[1]);
4434 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4435 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4437 bad_i1: /* :::::::::::::::::::: */
4438 ffelex_token_kill (ffesta_tokens[1]);
4439 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "TYPE", t, i, NULL);
4440 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4443 /* ffestb_type2_ -- "TYPE" COMMA NAME
4445 return ffestb_type2_; // to lexer
4447 Handle COLONCOLON or NAME. */
4449 static ffelexHandler
4450 ffestb_type2_ (ffelexToken t)
4452 switch (ffelex_token_type (t))
4454 case FFELEX_typeCOLONCOLON:
4455 return (ffelexHandler) ffestb_type3_;
4457 case FFELEX_typeNAME:
4458 return (ffelexHandler) ffestb_type3_ (t);
4464 if (ffesta_tokens[1] != NULL)
4465 ffelex_token_kill (ffesta_tokens[1]);
4466 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4467 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4470 /* ffestb_type3_ -- "TYPE" [COMMA NAME [COLONCOLON]]
4472 return ffestb_type3_; // to lexer
4474 Make sure the next token is a NAME. */
4476 static ffelexHandler
4477 ffestb_type3_ (ffelexToken t)
4479 switch (ffelex_token_type (t))
4481 case FFELEX_typeNAME:
4482 ffesta_tokens[2] = ffelex_token_use (t);
4483 return (ffelexHandler) ffestb_type4_;
4486 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4490 if (ffesta_tokens[1] != NULL)
4491 ffelex_token_kill (ffesta_tokens[1]);
4492 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4495 /* ffestb_type4_ -- "TYPE" [COMMA NAME [COLONCOLON]] NAME
4497 return ffestb_type4_; // to lexer
4499 Make sure the next token is an EOS or SEMICOLON. */
4501 static ffelexHandler
4502 ffestb_type4_ (ffelexToken t)
4504 switch (ffelex_token_type (t))
4506 case FFELEX_typeEOS:
4507 case FFELEX_typeSEMICOLON:
4508 ffesta_confirmed ();
4509 if (!ffesta_is_inhibited ())
4510 ffestc_R424 (ffesta_tokens[1], ffestb_local_.type.kw,
4512 if (ffesta_tokens[1] != NULL)
4513 ffelex_token_kill (ffesta_tokens[1]);
4514 ffelex_token_kill (ffesta_tokens[2]);
4515 return (ffelexHandler) ffesta_zero (t);
4518 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t);
4522 if (ffesta_tokens[1] != NULL)
4523 ffelex_token_kill (ffesta_tokens[1]);
4524 ffelex_token_kill (ffesta_tokens[2]);
4525 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4529 /* ffestb_varlist -- Parse EXTERNAL/INTENT/INTRINSIC/OPTIONAL/PUBLIC/PRIVATE
4532 return ffestb_varlist; // to lexer
4534 Make sure the statement has a valid form. If it
4535 does, implement the statement. */
4538 ffestb_varlist (ffelexToken t)
4545 switch (ffelex_token_type (ffesta_tokens[0]))
4547 case FFELEX_typeNAME:
4548 switch (ffelex_token_type (t))
4550 case FFELEX_typeEOS:
4551 case FFELEX_typeSEMICOLON:
4552 ffesta_confirmed ();
4553 switch (ffesta_first_kw)
4556 case FFESTR_firstPUBLIC:
4557 if (!ffesta_is_inhibited ())
4559 return (ffelexHandler) ffesta_zero (t);
4561 case FFESTR_firstPRIVATE:
4562 if (!ffesta_is_inhibited ())
4563 ffestc_private (); /* Either R523A or R521B. */
4564 return (ffelexHandler) ffesta_zero (t);
4568 goto bad_1; /* :::::::::::::::::::: */
4571 case FFELEX_typeCOMMA:
4572 ffesta_confirmed (); /* Error, but clearly intended. */
4573 goto bad_1; /* :::::::::::::::::::: */
4575 case FFELEX_typeCOLONCOLON:
4576 ffesta_confirmed ();
4577 switch (ffesta_first_kw)
4580 case FFESTR_firstOPTIONAL:
4581 if (!ffesta_is_inhibited ())
4582 ffestc_R520_start ();
4585 case FFESTR_firstPUBLIC:
4586 if (!ffesta_is_inhibited ())
4587 ffestc_R521Astart ();
4590 case FFESTR_firstPRIVATE:
4591 if (!ffesta_is_inhibited ())
4592 ffestc_R521Bstart ();
4597 ffesta_confirmed (); /* Error, but clearly intended. */
4598 goto bad_1; /* :::::::::::::::::::: */
4600 return (ffelexHandler) ffestb_varlist5_;
4603 goto bad_1; /* :::::::::::::::::::: */
4605 case FFELEX_typeOPEN_PAREN:
4606 switch (ffesta_first_kw)
4609 case FFESTR_firstINTENT:
4610 return (ffelexHandler) ffestb_varlist1_;
4614 goto bad_1; /* :::::::::::::::::::: */
4617 case FFELEX_typeNAME:
4618 ffesta_confirmed ();
4619 switch (ffesta_first_kw)
4621 case FFESTR_firstEXTERNAL:
4622 if (!ffesta_is_inhibited ())
4623 ffestc_R1207_start ();
4627 case FFESTR_firstINTENT:
4628 goto bad_1; /* :::::::::::::::::::: */
4631 case FFESTR_firstINTRINSIC:
4632 if (!ffesta_is_inhibited ())
4633 ffestc_R1208_start ();
4637 case FFESTR_firstOPTIONAL:
4638 if (!ffesta_is_inhibited ())
4639 ffestc_R520_start ();
4644 case FFESTR_firstPUBLIC:
4645 if (!ffesta_is_inhibited ())
4646 ffestc_R521Astart ();
4649 case FFESTR_firstPRIVATE:
4650 if (!ffesta_is_inhibited ())
4651 ffestc_R521Bstart ();
4658 return (ffelexHandler) ffestb_varlist5_ (t);
4661 case FFELEX_typeNAMES:
4662 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.varlist.len);
4663 switch (ffelex_token_type (t))
4665 case FFELEX_typeEOS:
4666 case FFELEX_typeSEMICOLON:
4667 ffesta_confirmed ();
4668 switch (ffesta_first_kw)
4671 case FFESTR_firstINTENT:
4672 goto bad_1; /* :::::::::::::::::::: */
4680 switch (ffesta_first_kw)
4683 case FFESTR_firstPUBLIC:
4684 if (!ffesta_is_inhibited ())
4686 return (ffelexHandler) ffesta_zero (t);
4688 case FFESTR_firstPRIVATE:
4689 if (!ffesta_is_inhibited ())
4690 ffestc_private (); /* Either R423A or R521B. */
4691 return (ffelexHandler) ffesta_zero (t);
4695 goto bad_1; /* :::::::::::::::::::: */
4698 case FFELEX_typeCOMMA:
4699 ffesta_confirmed (); /* Error, but clearly intended. */
4700 switch (ffesta_first_kw)
4703 case FFESTR_firstINTENT:
4704 goto bad_1; /* :::::::::::::::::::: */
4712 goto bad_1; /* :::::::::::::::::::: */
4714 case FFELEX_typeCOLONCOLON:
4715 ffesta_confirmed ();
4716 switch (ffesta_first_kw)
4719 case FFESTR_firstOPTIONAL:
4720 if (!ffesta_is_inhibited ())
4721 ffestc_R520_start ();
4726 case FFESTR_firstPUBLIC:
4727 if (!ffesta_is_inhibited ())
4728 ffestc_R521Astart ();
4731 case FFESTR_firstPRIVATE:
4732 if (!ffesta_is_inhibited ())
4733 ffestc_R521Bstart ();
4738 goto bad_1; /* :::::::::::::::::::: */
4740 return (ffelexHandler) ffestb_varlist5_;
4742 case FFELEX_typeOPEN_PAREN:
4743 switch (ffesta_first_kw)
4746 case FFESTR_firstINTENT:
4748 goto bad_1; /* :::::::::::::::::::: */
4749 return (ffelexHandler) ffestb_varlist1_;
4753 goto bad_1; /* :::::::::::::::::::: */
4756 case FFELEX_typeNAME:
4757 ffesta_confirmed ();
4758 switch (ffesta_first_kw)
4760 case FFESTR_firstEXTERNAL:
4761 if (!ffesta_is_inhibited ())
4762 ffestc_R1207_start ();
4766 case FFESTR_firstINTENT:
4767 goto bad_1; /* :::::::::::::::::::: */
4770 case FFESTR_firstINTRINSIC:
4771 if (!ffesta_is_inhibited ())
4772 ffestc_R1208_start ();
4776 case FFESTR_firstOPTIONAL:
4777 if (!ffesta_is_inhibited ())
4778 ffestc_R520_start ();
4783 case FFESTR_firstPUBLIC:
4784 if (!ffesta_is_inhibited ())
4785 ffestc_R521Astart ();
4788 case FFESTR_firstPRIVATE:
4789 if (!ffesta_is_inhibited ())
4790 ffestc_R521Bstart ();
4797 return (ffelexHandler) ffestb_varlist5_ (t);
4800 goto bad_1; /* :::::::::::::::::::: */
4803 /* Here, we have at least one char after the first keyword and t is
4804 COMMA or EOS/SEMICOLON. Also we know that this form is valid for
4805 only the statements reaching here (specifically, INTENT won't reach
4808 if (!ffesrc_is_name_init (*p))
4809 goto bad_i; /* :::::::::::::::::::: */
4810 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
4811 if (!ffesta_is_inhibited ())
4813 switch (ffesta_first_kw)
4815 case FFESTR_firstEXTERNAL:
4816 ffestc_R1207_start ();
4819 case FFESTR_firstINTRINSIC:
4820 ffestc_R1208_start ();
4824 case FFESTR_firstOPTIONAL:
4825 ffestc_R520_start ();
4830 case FFESTR_firstPUBLIC:
4831 ffestc_R521Astart ();
4834 case FFESTR_firstPRIVATE:
4835 ffestc_R521Bstart ();
4843 next = (ffelexHandler) ffestb_varlist5_ (nt);
4844 ffelex_token_kill (nt);
4845 return (ffelexHandler) (*next) (t);
4848 goto bad_0; /* :::::::::::::::::::: */
4851 bad_0: /* :::::::::::::::::::: */
4852 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, ffesta_tokens[0]);
4853 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4855 bad_1: /* :::::::::::::::::::: */
4856 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4857 return (ffelexHandler) ffelex_swallow_tokens (t,
4858 (ffelexHandler) ffesta_zero); /* Invalid second token. */
4860 bad_i: /* :::::::::::::::::::: */
4861 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, ffesta_tokens[0], i, t);
4862 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4865 /* ffestb_varlist1_ -- "INTENT" OPEN_PAREN
4867 return ffestb_varlist1_; // to lexer
4872 static ffelexHandler
4873 ffestb_varlist1_ (ffelexToken t)
4875 switch (ffelex_token_type (t))
4877 case FFELEX_typeNAME:
4878 ffesta_tokens[1] = ffelex_token_use (t);
4879 ffestb_local_.varlist.kw = ffestr_other (t);
4880 switch (ffestb_local_.varlist.kw)
4882 case FFESTR_otherIN:
4883 return (ffelexHandler) ffestb_varlist2_;
4885 case FFESTR_otherINOUT:
4886 return (ffelexHandler) ffestb_varlist3_;
4888 case FFESTR_otherOUT:
4889 return (ffelexHandler) ffestb_varlist3_;
4892 ffelex_token_kill (ffesta_tokens[1]);
4901 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4902 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4905 /* ffestb_varlist2_ -- "INTENT" OPEN_PAREN "IN"
4907 return ffestb_varlist2_; // to lexer
4911 static ffelexHandler
4912 ffestb_varlist2_ (ffelexToken t)
4914 switch (ffelex_token_type (t))
4916 case FFELEX_typeNAME:
4917 switch (ffestr_other (t))
4919 case FFESTR_otherOUT:
4920 ffestb_local_.varlist.kw = FFESTR_otherINOUT;
4921 return (ffelexHandler) ffestb_varlist3_;
4928 case FFELEX_typeCLOSE_PAREN:
4929 return (ffelexHandler) ffestb_varlist4_;
4935 ffelex_token_kill (ffesta_tokens[1]);
4936 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4937 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4940 /* ffestb_varlist3_ -- "INTENT" OPEN_PAREN NAME ["OUT"]
4942 return ffestb_varlist3_; // to lexer
4944 Handle CLOSE_PAREN. */
4946 static ffelexHandler
4947 ffestb_varlist3_ (ffelexToken t)
4949 switch (ffelex_token_type (t))
4951 case FFELEX_typeCLOSE_PAREN:
4952 return (ffelexHandler) ffestb_varlist4_;
4958 ffelex_token_kill (ffesta_tokens[1]);
4959 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4960 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4963 /* ffestb_varlist4_ -- "INTENT" OPEN_PAREN NAME ["OUT"] CLOSE_PAREN
4965 return ffestb_varlist4_; // to lexer
4967 Handle COLONCOLON or NAME. */
4969 static ffelexHandler
4970 ffestb_varlist4_ (ffelexToken t)
4972 switch (ffelex_token_type (t))
4974 case FFELEX_typeCOLONCOLON:
4975 ffesta_confirmed ();
4976 if (!ffesta_is_inhibited ())
4977 ffestc_R519_start (ffesta_tokens[1], ffestb_local_.varlist.kw);
4978 ffelex_token_kill (ffesta_tokens[1]);
4979 return (ffelexHandler) ffestb_varlist5_;
4981 case FFELEX_typeNAME:
4982 ffesta_confirmed ();
4983 if (!ffesta_is_inhibited ())
4984 ffestc_R519_start (ffesta_tokens[1], ffestb_local_.varlist.kw);
4985 ffelex_token_kill (ffesta_tokens[1]);
4986 return (ffelexHandler) ffestb_varlist5_ (t);
4992 ffelex_token_kill (ffesta_tokens[1]);
4993 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
4994 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
4998 /* ffestb_varlist5_ -- Handles the list of variable names
5000 return ffestb_varlist5_; // to lexer
5004 static ffelexHandler
5005 ffestb_varlist5_ (ffelexToken t)
5007 switch (ffelex_token_type (t))
5009 case FFELEX_typeNAME:
5010 ffesta_tokens[1] = ffelex_token_use (t);
5011 return (ffelexHandler) ffestb_varlist6_;
5014 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
5018 if (!ffesta_is_inhibited ())
5020 switch (ffesta_first_kw)
5022 case FFESTR_firstEXTERNAL:
5023 ffestc_R1207_finish ();
5027 case FFESTR_firstINTENT:
5028 ffestc_R519_finish ();
5032 case FFESTR_firstINTRINSIC:
5033 ffestc_R1208_finish ();
5037 case FFESTR_firstOPTIONAL:
5038 ffestc_R520_finish ();
5043 case FFESTR_firstPUBLIC:
5044 ffestc_R521Afinish ();
5047 case FFESTR_firstPRIVATE:
5048 ffestc_R521Bfinish ();
5056 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5059 /* ffestb_varlist6_ -- (whatever) NAME
5061 return ffestb_varlist6_; // to lexer
5063 Handle COMMA or EOS/SEMICOLON. */
5065 static ffelexHandler
5066 ffestb_varlist6_ (ffelexToken t)
5068 switch (ffelex_token_type (t))
5070 case FFELEX_typeCOMMA:
5071 if (!ffesta_is_inhibited ())
5073 switch (ffesta_first_kw)
5075 case FFESTR_firstEXTERNAL:
5076 ffestc_R1207_item (ffesta_tokens[1]);
5080 case FFESTR_firstINTENT:
5081 ffestc_R519_item (ffesta_tokens[1]);
5085 case FFESTR_firstINTRINSIC:
5086 ffestc_R1208_item (ffesta_tokens[1]);
5090 case FFESTR_firstOPTIONAL:
5091 ffestc_R520_item (ffesta_tokens[1]);
5096 case FFESTR_firstPUBLIC:
5097 ffestc_R521Aitem (ffesta_tokens[1]);
5100 case FFESTR_firstPRIVATE:
5101 ffestc_R521Bitem (ffesta_tokens[1]);
5109 ffelex_token_kill (ffesta_tokens[1]);
5110 return (ffelexHandler) ffestb_varlist5_;
5112 case FFELEX_typeEOS:
5113 case FFELEX_typeSEMICOLON:
5114 if (!ffesta_is_inhibited ())
5116 switch (ffesta_first_kw)
5118 case FFESTR_firstEXTERNAL:
5119 ffestc_R1207_item (ffesta_tokens[1]);
5120 ffestc_R1207_finish ();
5124 case FFESTR_firstINTENT:
5125 ffestc_R519_item (ffesta_tokens[1]);
5126 ffestc_R519_finish ();
5130 case FFESTR_firstINTRINSIC:
5131 ffestc_R1208_item (ffesta_tokens[1]);
5132 ffestc_R1208_finish ();
5136 case FFESTR_firstOPTIONAL:
5137 ffestc_R520_item (ffesta_tokens[1]);
5138 ffestc_R520_finish ();
5143 case FFESTR_firstPUBLIC:
5144 ffestc_R521Aitem (ffesta_tokens[1]);
5145 ffestc_R521Afinish ();
5148 case FFESTR_firstPRIVATE:
5149 ffestc_R521Bitem (ffesta_tokens[1]);
5150 ffestc_R521Bfinish ();
5158 ffelex_token_kill (ffesta_tokens[1]);
5159 return (ffelexHandler) ffesta_zero (t);
5162 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t);
5166 if (!ffesta_is_inhibited ())
5168 switch (ffesta_first_kw)
5170 case FFESTR_firstEXTERNAL:
5171 ffestc_R1207_finish ();
5175 case FFESTR_firstINTENT:
5176 ffestc_R519_finish ();
5180 case FFESTR_firstINTRINSIC:
5181 ffestc_R1208_finish ();
5185 case FFESTR_firstOPTIONAL:
5186 ffestc_R520_finish ();
5191 case FFESTR_firstPUBLIC:
5192 ffestc_R521Afinish ();
5195 case FFESTR_firstPRIVATE:
5196 ffestc_R521Bfinish ();
5204 ffelex_token_kill (ffesta_tokens[1]);
5205 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5208 /* ffestb_R423B -- Parse the SEQUENCE statement
5210 return ffestb_R423B; // to lexer
5212 Make sure the statement has a valid form for the SEQUENCE statement. If
5213 it does, implement the statement. */
5217 ffestb_R423B (ffelexToken t)
5222 switch (ffelex_token_type (ffesta_tokens[0]))
5224 case FFELEX_typeNAME:
5225 if (ffesta_first_kw != FFESTR_firstSEQUENCE)
5226 goto bad_0; /* :::::::::::::::::::: */
5229 case FFELEX_typeNAMES:
5230 if (ffesta_first_kw != FFESTR_firstSEQUENCE)
5231 goto bad_0; /* :::::::::::::::::::: */
5232 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlSEQUENCE)
5234 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSEQUENCE);
5235 goto bad_i; /* :::::::::::::::::::: */
5240 goto bad_0; /* :::::::::::::::::::: */
5243 switch (ffelex_token_type (t))
5245 case FFELEX_typeEOS:
5246 case FFELEX_typeSEMICOLON:
5247 ffesta_confirmed ();
5248 if (!ffesta_is_inhibited ())
5250 return (ffelexHandler) ffesta_zero (t);
5252 case FFELEX_typeCOMMA:
5253 case FFELEX_typeCOLONCOLON:
5254 ffesta_confirmed (); /* Error, but clearly intended. */
5255 goto bad_1; /* :::::::::::::::::::: */
5258 goto bad_1; /* :::::::::::::::::::: */
5261 bad_0: /* :::::::::::::::::::: */
5262 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", ffesta_tokens[0]);
5263 return (ffelexHandler) ffelex_swallow_tokens (t,
5264 (ffelexHandler) ffesta_zero); /* Invalid first token. */
5266 bad_1: /* :::::::::::::::::::: */
5267 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", t);
5268 return (ffelexHandler) ffelex_swallow_tokens (t,
5269 (ffelexHandler) ffesta_zero); /* Invalid second token. */
5271 bad_i: /* :::::::::::::::::::: */
5272 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", ffesta_tokens[0], i, t);
5273 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5277 /* ffestb_R522 -- Parse the SAVE statement
5279 return ffestb_R522; // to lexer
5281 Make sure the statement has a valid form for the SAVE statement. If it
5282 does, implement the statement. */
5285 ffestb_R522 (ffelexToken t)
5292 switch (ffelex_token_type (ffesta_tokens[0]))
5294 case FFELEX_typeNAME:
5295 if (ffesta_first_kw != FFESTR_firstSAVE)
5296 goto bad_0; /* :::::::::::::::::::: */
5297 switch (ffelex_token_type (t))
5299 case FFELEX_typeCOMMA:
5300 ffesta_confirmed (); /* Error, but clearly intended. */
5301 goto bad_1; /* :::::::::::::::::::: */
5304 goto bad_1; /* :::::::::::::::::::: */
5306 case FFELEX_typeEOS:
5307 case FFELEX_typeSEMICOLON:
5308 ffesta_confirmed ();
5309 if (!ffesta_is_inhibited ())
5311 return (ffelexHandler) ffesta_zero (t);
5313 case FFELEX_typeNAME:
5314 case FFELEX_typeSLASH:
5315 ffesta_confirmed ();
5316 if (!ffesta_is_inhibited ())
5317 ffestc_R522start ();
5318 return (ffelexHandler) ffestb_R5221_ (t);
5320 case FFELEX_typeCOLONCOLON:
5321 ffesta_confirmed ();
5322 if (!ffesta_is_inhibited ())
5323 ffestc_R522start ();
5324 return (ffelexHandler) ffestb_R5221_;
5327 case FFELEX_typeNAMES:
5328 if (ffesta_first_kw != FFESTR_firstSAVE)
5329 goto bad_0; /* :::::::::::::::::::: */
5330 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSAVE);
5331 switch (ffelex_token_type (t))
5334 goto bad_1; /* :::::::::::::::::::: */
5336 case FFELEX_typeCOMMA:
5337 ffesta_confirmed ();
5340 case FFELEX_typeEOS:
5341 case FFELEX_typeSEMICOLON:
5342 ffesta_confirmed ();
5345 if (!ffesta_is_inhibited ())
5347 return (ffelexHandler) ffesta_zero (t);
5349 case FFELEX_typeSLASH:
5350 ffesta_confirmed ();
5352 goto bad_i; /* :::::::::::::::::::: */
5353 if (!ffesta_is_inhibited ())
5354 ffestc_R522start ();
5355 return (ffelexHandler) ffestb_R5221_ (t);
5357 case FFELEX_typeCOLONCOLON:
5358 ffesta_confirmed ();
5360 goto bad_i; /* :::::::::::::::::::: */
5361 if (!ffesta_is_inhibited ())
5362 ffestc_R522start ();
5363 return (ffelexHandler) ffestb_R5221_;
5366 /* Here, we have at least one char after "SAVE" and t is COMMA or
5369 if (!ffesrc_is_name_init (*p))
5370 goto bad_i; /* :::::::::::::::::::: */
5371 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
5372 if (!ffesta_is_inhibited ())
5373 ffestc_R522start ();
5374 next = (ffelexHandler) ffestb_R5221_ (nt);
5375 ffelex_token_kill (nt);
5376 return (ffelexHandler) (*next) (t);
5379 goto bad_0; /* :::::::::::::::::::: */
5382 bad_0: /* :::::::::::::::::::: */
5383 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", ffesta_tokens[0]);
5384 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5386 bad_1: /* :::::::::::::::::::: */
5387 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5388 return (ffelexHandler) ffelex_swallow_tokens (t,
5389 (ffelexHandler) ffesta_zero); /* Invalid second token. */
5391 bad_i: /* :::::::::::::::::::: */
5392 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SAVE", ffesta_tokens[0], i, t);
5393 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5396 /* ffestb_R5221_ -- "SAVE" [COLONCOLON]
5398 return ffestb_R5221_; // to lexer
5400 Handle NAME or SLASH. */
5402 static ffelexHandler
5403 ffestb_R5221_ (ffelexToken t)
5405 switch (ffelex_token_type (t))
5407 case FFELEX_typeNAME:
5408 ffestb_local_.R522.is_cblock = FALSE;
5409 ffesta_tokens[1] = ffelex_token_use (t);
5410 return (ffelexHandler) ffestb_R5224_;
5412 case FFELEX_typeSLASH:
5413 ffestb_local_.R522.is_cblock = TRUE;
5414 return (ffelexHandler) ffestb_R5222_;
5417 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5421 if (!ffesta_is_inhibited ())
5422 ffestc_R522finish ();
5423 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5426 /* ffestb_R5222_ -- "SAVE" [COLONCOLON] SLASH
5428 return ffestb_R5222_; // to lexer
5432 static ffelexHandler
5433 ffestb_R5222_ (ffelexToken t)
5435 switch (ffelex_token_type (t))
5437 case FFELEX_typeNAME:
5438 ffesta_tokens[1] = ffelex_token_use (t);
5439 return (ffelexHandler) ffestb_R5223_;
5442 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5446 if (!ffesta_is_inhibited ())
5447 ffestc_R522finish ();
5448 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5451 /* ffestb_R5223_ -- "SAVE" [COLONCOLON] SLASH NAME
5453 return ffestb_R5223_; // to lexer
5457 static ffelexHandler
5458 ffestb_R5223_ (ffelexToken t)
5460 switch (ffelex_token_type (t))
5462 case FFELEX_typeSLASH:
5463 return (ffelexHandler) ffestb_R5224_;
5466 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5470 if (!ffesta_is_inhibited ())
5471 ffestc_R522finish ();
5472 ffelex_token_kill (ffesta_tokens[1]);
5473 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5476 /* ffestb_R5224_ -- "SAVE" [COLONCOLON] R523
5478 return ffestb_R5224_; // to lexer
5480 Handle COMMA or EOS/SEMICOLON. */
5482 static ffelexHandler
5483 ffestb_R5224_ (ffelexToken t)
5485 switch (ffelex_token_type (t))
5487 case FFELEX_typeCOMMA:
5488 if (!ffesta_is_inhibited ())
5490 if (ffestb_local_.R522.is_cblock)
5491 ffestc_R522item_cblock (ffesta_tokens[1]);
5493 ffestc_R522item_object (ffesta_tokens[1]);
5495 ffelex_token_kill (ffesta_tokens[1]);
5496 return (ffelexHandler) ffestb_R5221_;
5498 case FFELEX_typeEOS:
5499 case FFELEX_typeSEMICOLON:
5500 if (!ffesta_is_inhibited ())
5502 if (ffestb_local_.R522.is_cblock)
5503 ffestc_R522item_cblock (ffesta_tokens[1]);
5505 ffestc_R522item_object (ffesta_tokens[1]);
5506 ffestc_R522finish ();
5508 ffelex_token_kill (ffesta_tokens[1]);
5509 return (ffelexHandler) ffesta_zero (t);
5512 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t);
5516 if (!ffesta_is_inhibited ())
5517 ffestc_R522finish ();
5518 ffelex_token_kill (ffesta_tokens[1]);
5519 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5522 /* ffestb_R528 -- Parse the DATA statement
5524 return ffestb_R528; // to lexer
5526 Make sure the statement has a valid form for the DATA statement. If it
5527 does, implement the statement. */
5530 ffestb_R528 (ffelexToken t)
5537 switch (ffelex_token_type (ffesta_tokens[0]))
5539 case FFELEX_typeNAME:
5540 if (ffesta_first_kw != FFESTR_firstDATA)
5541 goto bad_0; /* :::::::::::::::::::: */
5542 switch (ffelex_token_type (t))
5544 case FFELEX_typeCOMMA:
5545 case FFELEX_typeEOS:
5546 case FFELEX_typeSEMICOLON:
5547 case FFELEX_typeSLASH:
5548 case FFELEX_typeCOLONCOLON:
5549 ffesta_confirmed (); /* Error, but clearly intended. */
5550 goto bad_1; /* :::::::::::::::::::: */
5553 goto bad_1; /* :::::::::::::::::::: */
5555 case FFELEX_typeNAME:
5556 ffesta_confirmed ();
5559 case FFELEX_typeOPEN_PAREN:
5562 ffestb_local_.data.started = FALSE;
5563 return (ffelexHandler) (*((ffelexHandler)
5564 ffeexpr_lhs (ffesta_output_pool,
5565 FFEEXPR_contextDATA,
5566 (ffeexprCallback) ffestb_R5281_)))
5569 case FFELEX_typeNAMES:
5570 if (ffesta_first_kw != FFESTR_firstDATA)
5571 goto bad_0; /* :::::::::::::::::::: */
5572 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDATA);
5573 switch (ffelex_token_type (t))
5575 case FFELEX_typeEOS:
5576 case FFELEX_typeSEMICOLON:
5577 case FFELEX_typeCOLONCOLON:
5578 ffesta_confirmed (); /* Error, but clearly intended. */
5579 goto bad_1; /* :::::::::::::::::::: */
5582 goto bad_1; /* :::::::::::::::::::: */
5584 case FFELEX_typeOPEN_PAREN:
5587 ffestb_local_.data.started = FALSE;
5588 return (ffelexHandler) (*((ffelexHandler)
5589 ffeexpr_lhs (ffesta_output_pool,
5590 FFEEXPR_contextDATA,
5597 case FFELEX_typeCOMMA:
5598 case FFELEX_typeSLASH:
5599 ffesta_confirmed ();
5602 if (!ffesrc_is_name_init (*p))
5603 goto bad_i; /* :::::::::::::::::::: */
5604 ffestb_local_.data.started = FALSE;
5605 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
5606 next = (ffelexHandler) (*((ffelexHandler)
5607 ffeexpr_lhs (ffesta_output_pool,
5608 FFEEXPR_contextDATA,
5609 (ffeexprCallback) ffestb_R5281_)))
5611 ffelex_token_kill (nt);
5612 return (ffelexHandler) (*next) (t);
5615 goto bad_0; /* :::::::::::::::::::: */
5618 bad_0: /* :::::::::::::::::::: */
5619 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", ffesta_tokens[0]);
5620 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5622 bad_1: /* :::::::::::::::::::: */
5623 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5624 return (ffelexHandler) ffelex_swallow_tokens (t,
5625 (ffelexHandler) ffesta_zero); /* Invalid second token. */
5627 bad_i: /* :::::::::::::::::::: */
5628 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DATA", ffesta_tokens[0], i, t);
5629 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5632 /* ffestb_R5281_ -- "DATA" expr-list
5634 (ffestb_R5281_) // to expression handler
5636 Handle COMMA or SLASH. */
5638 static ffelexHandler
5639 ffestb_R5281_ (ffelexToken ft, ffebld expr, ffelexToken t)
5641 switch (ffelex_token_type (t))
5643 case FFELEX_typeCOMMA:
5644 ffesta_confirmed ();
5647 if (!ffesta_is_inhibited ())
5649 if (!ffestb_local_.data.started)
5651 ffestc_R528_start ();
5652 ffestb_local_.data.started = TRUE;
5654 ffestc_R528_item_object (expr, ft);
5656 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
5657 FFEEXPR_contextDATA,
5658 (ffeexprCallback) ffestb_R5281_);
5660 case FFELEX_typeSLASH:
5661 ffesta_confirmed ();
5664 if (!ffesta_is_inhibited ())
5666 if (!ffestb_local_.data.started)
5668 ffestc_R528_start ();
5669 ffestb_local_.data.started = TRUE;
5671 ffestc_R528_item_object (expr, ft);
5672 ffestc_R528_item_startvals ();
5674 return (ffelexHandler) ffeexpr_rhs
5675 (ffesta_output_pool, FFEEXPR_contextDATA,
5676 (ffeexprCallback) ffestb_R5282_);
5679 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5683 if (ffestb_local_.data.started && !ffesta_is_inhibited ())
5684 ffestc_R528_finish ();
5685 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5688 /* ffestb_R5282_ -- "DATA" expr-list SLASH expr-list
5690 (ffestb_R5282_) // to expression handler
5692 Handle ASTERISK, COMMA, or SLASH. */
5694 static ffelexHandler
5695 ffestb_R5282_ (ffelexToken ft, ffebld expr, ffelexToken t)
5697 switch (ffelex_token_type (t))
5699 case FFELEX_typeCOMMA:
5702 if (!ffesta_is_inhibited ())
5703 ffestc_R528_item_value (NULL, NULL, expr, ft);
5704 return (ffelexHandler) ffeexpr_rhs
5705 (ffesta_output_pool, FFEEXPR_contextDATA,
5706 (ffeexprCallback) ffestb_R5282_);
5708 case FFELEX_typeASTERISK:
5711 ffestb_local_.data.expr = expr;
5712 ffesta_tokens[1] = ffelex_token_use (ft);
5713 return (ffelexHandler) ffeexpr_rhs
5714 (ffesta_output_pool, FFEEXPR_contextDATA,
5715 (ffeexprCallback) ffestb_R5283_);
5717 case FFELEX_typeSLASH:
5720 if (!ffesta_is_inhibited ())
5722 ffestc_R528_item_value (NULL, NULL, expr, ft);
5723 ffestc_R528_item_endvals (t);
5725 return (ffelexHandler) ffestb_R5284_;
5728 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5732 if (!ffesta_is_inhibited ())
5734 ffestc_R528_item_endvals (t);
5735 ffestc_R528_finish ();
5737 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5740 /* ffestb_R5283_ -- "DATA" expr-list SLASH expr ASTERISK expr
5742 (ffestb_R5283_) // to expression handler
5744 Handle COMMA or SLASH. */
5746 static ffelexHandler
5747 ffestb_R5283_ (ffelexToken ft, ffebld expr, ffelexToken t)
5749 switch (ffelex_token_type (t))
5751 case FFELEX_typeCOMMA:
5754 if (!ffesta_is_inhibited ())
5755 ffestc_R528_item_value (ffestb_local_.data.expr, ffesta_tokens[1],
5757 ffelex_token_kill (ffesta_tokens[1]);
5758 return (ffelexHandler) ffeexpr_rhs
5759 (ffesta_output_pool, FFEEXPR_contextDATA,
5760 (ffeexprCallback) ffestb_R5282_);
5762 case FFELEX_typeSLASH:
5765 if (!ffesta_is_inhibited ())
5767 ffestc_R528_item_value (ffestb_local_.data.expr, ffesta_tokens[1],
5769 ffestc_R528_item_endvals (t);
5771 ffelex_token_kill (ffesta_tokens[1]);
5772 return (ffelexHandler) ffestb_R5284_;
5775 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5779 if (!ffesta_is_inhibited ())
5781 ffestc_R528_item_endvals (t);
5782 ffestc_R528_finish ();
5784 ffelex_token_kill (ffesta_tokens[1]);
5785 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5788 /* ffestb_R5284_ -- "DATA" expr-list SLASH expr-list SLASH
5790 return ffestb_R5284_; // to lexer
5792 Handle [COMMA] NAME or EOS/SEMICOLON. */
5794 static ffelexHandler
5795 ffestb_R5284_ (ffelexToken t)
5797 switch (ffelex_token_type (t))
5799 case FFELEX_typeCOMMA:
5800 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
5801 FFEEXPR_contextDATA,
5802 (ffeexprCallback) ffestb_R5281_);
5804 case FFELEX_typeNAME:
5805 case FFELEX_typeOPEN_PAREN:
5806 return (ffelexHandler) (*((ffelexHandler)
5807 ffeexpr_lhs (ffesta_output_pool,
5808 FFEEXPR_contextDATA,
5809 (ffeexprCallback) ffestb_R5281_)))
5812 case FFELEX_typeEOS:
5813 case FFELEX_typeSEMICOLON:
5814 if (!ffesta_is_inhibited ())
5815 ffestc_R528_finish ();
5816 return (ffelexHandler) ffesta_zero (t);
5819 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t);
5823 if (!ffesta_is_inhibited ())
5824 ffestc_R528_finish ();
5825 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5828 /* ffestb_R537 -- Parse a PARAMETER statement
5830 return ffestb_R537; // to lexer
5832 Make sure the statement has a valid form for an PARAMETER statement.
5833 If it does, implement the statement. */
5836 ffestb_R537 (ffelexToken t)
5838 switch (ffelex_token_type (ffesta_tokens[0]))
5840 case FFELEX_typeNAME:
5841 if (ffesta_first_kw != FFESTR_firstPARAMETER)
5842 goto bad_0; /* :::::::::::::::::::: */
5845 case FFELEX_typeNAMES:
5846 if (ffesta_first_kw != FFESTR_firstPARAMETER)
5847 goto bad_0; /* :::::::::::::::::::: */
5848 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlPARAMETER)
5849 goto bad_0; /* :::::::::::::::::::: */
5853 goto bad_0; /* :::::::::::::::::::: */
5856 switch (ffelex_token_type (t))
5858 case FFELEX_typeOPEN_PAREN:
5861 case FFELEX_typeEOS:
5862 case FFELEX_typeSEMICOLON:
5863 case FFELEX_typeCOMMA:
5864 case FFELEX_typeCOLONCOLON:
5865 ffesta_confirmed (); /* Error, but clearly intended. */
5866 goto bad_1; /* :::::::::::::::::::: */
5869 goto bad_1; /* :::::::::::::::::::: */
5872 ffestb_local_.parameter.started = FALSE;
5873 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
5874 FFEEXPR_contextPARAMETER,
5875 (ffeexprCallback) ffestb_R5371_);
5877 bad_0: /* :::::::::::::::::::: */
5878 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0]);
5879 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5881 bad_1: /* :::::::::::::::::::: */
5882 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
5883 return (ffelexHandler) ffelex_swallow_tokens (t,
5884 (ffelexHandler) ffesta_zero); /* Invalid second token. */
5887 /* ffestb_R5371_ -- "PARAMETER" OPEN_PAREN expr
5889 (ffestb_R5371_) // to expression handler
5891 Make sure the next token is EQUALS. */
5893 static ffelexHandler
5894 ffestb_R5371_ (ffelexToken ft, ffebld expr, ffelexToken t)
5896 ffestb_local_.parameter.expr = expr;
5898 switch (ffelex_token_type (t))
5900 case FFELEX_typeEQUALS:
5901 ffesta_confirmed ();
5904 ffesta_tokens[1] = ffelex_token_use (ft);
5905 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
5906 FFEEXPR_contextPARAMETER, (ffeexprCallback) ffestb_R5372_);
5912 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
5913 if (ffestb_local_.parameter.started)
5914 ffestc_R537_finish ();
5915 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5918 /* ffestb_R5372_ -- "PARAMETER" OPEN_PAREN expr EQUALS expr
5920 (ffestb_R5372_) // to expression handler
5922 Make sure the next token is COMMA or CLOSE_PAREN. */
5924 static ffelexHandler
5925 ffestb_R5372_ (ffelexToken ft, ffebld expr, ffelexToken t)
5927 switch (ffelex_token_type (t))
5929 case FFELEX_typeCOMMA:
5932 if (!ffesta_is_inhibited ())
5934 if (!ffestb_local_.parameter.started)
5936 ffestc_R537_start ();
5937 ffestb_local_.parameter.started = TRUE;
5939 ffestc_R537_item (ffestb_local_.parameter.expr, ffesta_tokens[1],
5942 ffelex_token_kill (ffesta_tokens[1]);
5943 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
5944 FFEEXPR_contextPARAMETER,
5945 (ffeexprCallback) ffestb_R5371_);
5947 case FFELEX_typeCLOSE_PAREN:
5950 if (!ffesta_is_inhibited ())
5952 if (!ffestb_local_.parameter.started)
5954 ffestc_R537_start ();
5955 ffestb_local_.parameter.started = TRUE;
5957 ffestc_R537_item (ffestb_local_.parameter.expr, ffesta_tokens[1],
5959 ffestc_R537_finish ();
5961 ffelex_token_kill (ffesta_tokens[1]);
5962 return (ffelexHandler) ffestb_R5373_;
5968 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
5969 if (ffestb_local_.parameter.started)
5970 ffestc_R537_finish ();
5971 ffelex_token_kill (ffesta_tokens[1]);
5972 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5975 /* ffestb_R5373_ -- "PARAMETER" OPEN_PAREN expr EQUALS expr CLOSE_PAREN
5977 return ffestb_R5373_; // to lexer
5979 Make sure the next token is EOS or SEMICOLON, or generate an error. All
5980 cleanup has already been done, by the way. */
5982 static ffelexHandler
5983 ffestb_R5373_ (ffelexToken t)
5985 switch (ffelex_token_type (t))
5987 case FFELEX_typeEOS:
5988 case FFELEX_typeSEMICOLON:
5989 return (ffelexHandler) ffesta_zero (t);
5995 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
5996 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
5999 /* ffestb_R542 -- Parse the NAMELIST statement
6001 return ffestb_R542; // to lexer
6003 Make sure the statement has a valid form for the NAMELIST statement. If it
6004 does, implement the statement. */
6007 ffestb_R542 (ffelexToken t)
6012 switch (ffelex_token_type (ffesta_tokens[0]))
6014 case FFELEX_typeNAME:
6015 if (ffesta_first_kw != FFESTR_firstNAMELIST)
6016 goto bad_0; /* :::::::::::::::::::: */
6019 case FFELEX_typeNAMES:
6020 if (ffesta_first_kw != FFESTR_firstNAMELIST)
6021 goto bad_0; /* :::::::::::::::::::: */
6022 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlNAMELIST);
6024 goto bad_i; /* :::::::::::::::::::: */
6028 goto bad_0; /* :::::::::::::::::::: */
6031 switch (ffelex_token_type (t))
6033 case FFELEX_typeCOMMA:
6034 case FFELEX_typeEOS:
6035 case FFELEX_typeSEMICOLON:
6036 case FFELEX_typeCOLONCOLON:
6037 ffesta_confirmed (); /* Error, but clearly intended. */
6038 goto bad_1; /* :::::::::::::::::::: */
6041 goto bad_1; /* :::::::::::::::::::: */
6043 case FFELEX_typeSLASH:
6047 ffesta_confirmed ();
6048 if (!ffesta_is_inhibited ())
6049 ffestc_R542_start ();
6050 return (ffelexHandler) ffestb_R5421_;
6052 bad_0: /* :::::::::::::::::::: */
6053 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", ffesta_tokens[0]);
6054 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6056 bad_1: /* :::::::::::::::::::: */
6057 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6058 return (ffelexHandler) ffelex_swallow_tokens (t,
6059 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6061 bad_i: /* :::::::::::::::::::: */
6062 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "NAMELIST", ffesta_tokens[0], i, t);
6063 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6066 /* ffestb_R5421_ -- "NAMELIST" SLASH
6068 return ffestb_R5421_; // to lexer
6072 static ffelexHandler
6073 ffestb_R5421_ (ffelexToken t)
6075 switch (ffelex_token_type (t))
6077 case FFELEX_typeNAME:
6078 if (!ffesta_is_inhibited ())
6079 ffestc_R542_item_nlist (t);
6080 return (ffelexHandler) ffestb_R5422_;
6083 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6087 if (!ffesta_is_inhibited ())
6088 ffestc_R542_finish ();
6089 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6092 /* ffestb_R5422_ -- "NAMELIST" SLASH NAME
6094 return ffestb_R5422_; // to lexer
6098 static ffelexHandler
6099 ffestb_R5422_ (ffelexToken t)
6101 switch (ffelex_token_type (t))
6103 case FFELEX_typeSLASH:
6104 return (ffelexHandler) ffestb_R5423_;
6107 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6111 if (!ffesta_is_inhibited ())
6112 ffestc_R542_finish ();
6113 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6116 /* ffestb_R5423_ -- "NAMELIST" SLASH NAME SLASH
6118 return ffestb_R5423_; // to lexer
6122 static ffelexHandler
6123 ffestb_R5423_ (ffelexToken t)
6125 switch (ffelex_token_type (t))
6127 case FFELEX_typeNAME:
6128 if (!ffesta_is_inhibited ())
6129 ffestc_R542_item_nitem (t);
6130 return (ffelexHandler) ffestb_R5424_;
6133 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6137 if (!ffesta_is_inhibited ())
6138 ffestc_R542_finish ();
6139 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6142 /* ffestb_R5424_ -- "NAMELIST" SLASH NAME SLASH NAME
6144 return ffestb_R5424_; // to lexer
6146 Handle COMMA, EOS/SEMICOLON, or SLASH. */
6148 static ffelexHandler
6149 ffestb_R5424_ (ffelexToken t)
6151 switch (ffelex_token_type (t))
6153 case FFELEX_typeCOMMA:
6154 return (ffelexHandler) ffestb_R5425_;
6156 case FFELEX_typeEOS:
6157 case FFELEX_typeSEMICOLON:
6158 if (!ffesta_is_inhibited ())
6159 ffestc_R542_finish ();
6160 return (ffelexHandler) ffesta_zero (t);
6162 case FFELEX_typeSLASH:
6163 return (ffelexHandler) ffestb_R5421_;
6166 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6170 if (!ffesta_is_inhibited ())
6171 ffestc_R542_finish ();
6172 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6175 /* ffestb_R5425_ -- "NAMELIST" SLASH NAME SLASH NAME COMMA
6177 return ffestb_R5425_; // to lexer
6179 Handle NAME or SLASH. */
6181 static ffelexHandler
6182 ffestb_R5425_ (ffelexToken t)
6184 switch (ffelex_token_type (t))
6186 case FFELEX_typeNAME:
6187 if (!ffesta_is_inhibited ())
6188 ffestc_R542_item_nitem (t);
6189 return (ffelexHandler) ffestb_R5424_;
6191 case FFELEX_typeSLASH:
6192 return (ffelexHandler) ffestb_R5421_;
6195 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t);
6199 if (!ffesta_is_inhibited ())
6200 ffestc_R542_finish ();
6201 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6204 /* ffestb_R544 -- Parse an EQUIVALENCE statement
6206 return ffestb_R544; // to lexer
6208 Make sure the statement has a valid form for an EQUIVALENCE statement.
6209 If it does, implement the statement. */
6212 ffestb_R544 (ffelexToken t)
6214 switch (ffelex_token_type (ffesta_tokens[0]))
6216 case FFELEX_typeNAME:
6217 if (ffesta_first_kw != FFESTR_firstEQUIVALENCE)
6218 goto bad_0; /* :::::::::::::::::::: */
6221 case FFELEX_typeNAMES:
6222 if (ffesta_first_kw != FFESTR_firstEQUIVALENCE)
6223 goto bad_0; /* :::::::::::::::::::: */
6224 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlEQUIVALENCE)
6225 goto bad_0; /* :::::::::::::::::::: */
6229 goto bad_0; /* :::::::::::::::::::: */
6232 switch (ffelex_token_type (t))
6234 case FFELEX_typeOPEN_PAREN:
6237 case FFELEX_typeEOS:
6238 case FFELEX_typeSEMICOLON:
6239 case FFELEX_typeCOMMA:
6240 case FFELEX_typeCOLONCOLON:
6241 ffesta_confirmed (); /* Error, but clearly intended. */
6242 goto bad_1; /* :::::::::::::::::::: */
6245 goto bad_1; /* :::::::::::::::::::: */
6248 ffestb_local_.equivalence.started = FALSE;
6249 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
6250 FFEEXPR_contextEQUIVALENCE,
6251 (ffeexprCallback) ffestb_R5441_);
6253 bad_0: /* :::::::::::::::::::: */
6254 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", ffesta_tokens[0]);
6255 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6257 bad_1: /* :::::::::::::::::::: */
6258 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6259 return (ffelexHandler) ffelex_swallow_tokens (t,
6260 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6263 /* ffestb_R5441_ -- "EQUIVALENCE" OPEN_PAREN expr
6265 (ffestb_R5441_) // to expression handler
6267 Make sure the next token is COMMA. */
6269 static ffelexHandler
6270 ffestb_R5441_ (ffelexToken ft, ffebld expr, ffelexToken t)
6272 switch (ffelex_token_type (t))
6274 case FFELEX_typeCOMMA:
6277 ffestb_local_.equivalence.exprs = ffestt_exprlist_create ();
6278 ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr,
6279 ffelex_token_use (ft));
6280 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
6281 FFEEXPR_contextEQUIVALENCE,
6282 (ffeexprCallback) ffestb_R5442_);
6288 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6289 if (ffestb_local_.equivalence.started)
6290 ffestc_R544_finish ();
6291 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6294 /* ffestb_R5442_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr
6296 (ffestb_R5442_) // to expression handler
6298 Make sure the next token is COMMA or CLOSE_PAREN. For COMMA, we just
6299 append the expression to our list and continue; for CLOSE_PAREN, we
6300 append the expression and move to _3_. */
6302 static ffelexHandler
6303 ffestb_R5442_ (ffelexToken ft, ffebld expr, ffelexToken t)
6305 switch (ffelex_token_type (t))
6307 case FFELEX_typeCOMMA:
6310 ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr,
6311 ffelex_token_use (ft));
6312 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
6313 FFEEXPR_contextEQUIVALENCE,
6314 (ffeexprCallback) ffestb_R5442_);
6316 case FFELEX_typeCLOSE_PAREN:
6319 ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr,
6320 ffelex_token_use (ft));
6321 return (ffelexHandler) ffestb_R5443_;
6327 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6328 if (ffestb_local_.equivalence.started)
6329 ffestc_R544_finish ();
6330 ffestt_exprlist_kill (ffestb_local_.equivalence.exprs);
6331 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6334 /* ffestb_R5443_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr CLOSE_PAREN
6336 return ffestb_R5443_; // to lexer
6338 Make sure the next token is COMMA or EOS/SEMICOLON. */
6340 static ffelexHandler
6341 ffestb_R5443_ (ffelexToken t)
6343 switch (ffelex_token_type (t))
6345 case FFELEX_typeCOMMA:
6346 ffesta_confirmed ();
6347 if (!ffesta_is_inhibited ())
6349 if (!ffestb_local_.equivalence.started)
6351 ffestc_R544_start ();
6352 ffestb_local_.equivalence.started = TRUE;
6354 ffestc_R544_item (ffestb_local_.equivalence.exprs);
6356 ffestt_exprlist_kill (ffestb_local_.equivalence.exprs);
6357 return (ffelexHandler) ffestb_R5444_;
6359 case FFELEX_typeEOS:
6360 case FFELEX_typeSEMICOLON:
6361 ffesta_confirmed ();
6362 if (!ffesta_is_inhibited ())
6364 if (!ffestb_local_.equivalence.started)
6366 ffestc_R544_start ();
6367 ffestb_local_.equivalence.started = TRUE;
6369 ffestc_R544_item (ffestb_local_.equivalence.exprs);
6370 ffestc_R544_finish ();
6372 ffestt_exprlist_kill (ffestb_local_.equivalence.exprs);
6373 return (ffelexHandler) ffesta_zero (t);
6379 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6380 if (ffestb_local_.equivalence.started)
6381 ffestc_R544_finish ();
6382 ffestt_exprlist_kill (ffestb_local_.equivalence.exprs);
6383 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6386 /* ffestb_R5444_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr CLOSE_PAREN COMMA
6388 return ffestb_R5444_; // to lexer
6390 Make sure the next token is OPEN_PAREN, or generate an error. */
6392 static ffelexHandler
6393 ffestb_R5444_ (ffelexToken t)
6395 switch (ffelex_token_type (t))
6397 case FFELEX_typeOPEN_PAREN:
6398 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
6399 FFEEXPR_contextEQUIVALENCE,
6400 (ffeexprCallback) ffestb_R5441_);
6406 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t);
6407 if (ffestb_local_.equivalence.started)
6408 ffestc_R544_finish ();
6409 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6412 /* ffestb_R834 -- Parse the CYCLE statement
6414 return ffestb_R834; // to lexer
6416 Make sure the statement has a valid form for the CYCLE statement. If
6417 it does, implement the statement. */
6420 ffestb_R834 (ffelexToken t)
6425 switch (ffelex_token_type (ffesta_tokens[0]))
6427 case FFELEX_typeNAME:
6428 if (ffesta_first_kw != FFESTR_firstCYCLE)
6429 goto bad_0; /* :::::::::::::::::::: */
6430 switch (ffelex_token_type (t))
6432 case FFELEX_typeCOMMA:
6433 case FFELEX_typeCOLONCOLON:
6434 ffesta_confirmed (); /* Error, but clearly intended. */
6435 goto bad_1; /* :::::::::::::::::::: */
6438 goto bad_1; /* :::::::::::::::::::: */
6440 case FFELEX_typeNAME:
6441 ffesta_confirmed ();
6442 ffesta_tokens[1] = ffelex_token_use (t);
6443 return (ffelexHandler) ffestb_R8341_;
6445 case FFELEX_typeEOS:
6446 case FFELEX_typeSEMICOLON:
6447 ffesta_confirmed ();
6448 ffesta_tokens[1] = NULL;
6449 return (ffelexHandler) ffestb_R8341_ (t);
6452 case FFELEX_typeNAMES:
6453 if (ffesta_first_kw != FFESTR_firstCYCLE)
6454 goto bad_0; /* :::::::::::::::::::: */
6455 switch (ffelex_token_type (t))
6458 goto bad_1; /* :::::::::::::::::::: */
6460 case FFELEX_typeEOS:
6461 case FFELEX_typeSEMICOLON:
6464 ffesta_confirmed ();
6465 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCYCLE);
6468 ffesta_tokens[1] = NULL;
6472 if (!ffesrc_is_name_init (*p))
6473 goto bad_i; /* :::::::::::::::::::: */
6475 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
6477 return (ffelexHandler) ffestb_R8341_ (t);
6480 goto bad_0; /* :::::::::::::::::::: */
6483 bad_0: /* :::::::::::::::::::: */
6484 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", ffesta_tokens[0]);
6485 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6487 bad_1: /* :::::::::::::::::::: */
6488 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", t);
6489 return (ffelexHandler) ffelex_swallow_tokens (t,
6490 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6492 bad_i: /* :::::::::::::::::::: */
6493 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CYCLE", ffesta_tokens[0], i, t);
6494 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6497 /* ffestb_R8341_ -- "CYCLE" [NAME]
6499 return ffestb_R8341_; // to lexer
6501 Make sure the next token is an EOS or SEMICOLON. */
6503 static ffelexHandler
6504 ffestb_R8341_ (ffelexToken t)
6506 switch (ffelex_token_type (t))
6508 case FFELEX_typeEOS:
6509 case FFELEX_typeSEMICOLON:
6510 ffesta_confirmed ();
6511 if (!ffesta_is_inhibited ())
6512 ffestc_R834 (ffesta_tokens[1]);
6513 if (ffesta_tokens[1] != NULL)
6514 ffelex_token_kill (ffesta_tokens[1]);
6515 return (ffelexHandler) ffesta_zero (t);
6518 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", t);
6522 if (ffesta_tokens[1] != NULL)
6523 ffelex_token_kill (ffesta_tokens[1]);
6524 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6527 /* ffestb_R835 -- Parse the EXIT statement
6529 return ffestb_R835; // to lexer
6531 Make sure the statement has a valid form for the EXIT statement. If
6532 it does, implement the statement. */
6535 ffestb_R835 (ffelexToken t)
6540 switch (ffelex_token_type (ffesta_tokens[0]))
6542 case FFELEX_typeNAME:
6543 if (ffesta_first_kw != FFESTR_firstEXIT)
6544 goto bad_0; /* :::::::::::::::::::: */
6545 switch (ffelex_token_type (t))
6547 case FFELEX_typeCOMMA:
6548 case FFELEX_typeCOLONCOLON:
6549 ffesta_confirmed (); /* Error, but clearly intended. */
6550 goto bad_1; /* :::::::::::::::::::: */
6553 goto bad_1; /* :::::::::::::::::::: */
6555 case FFELEX_typeNAME:
6556 ffesta_confirmed ();
6557 ffesta_tokens[1] = ffelex_token_use (t);
6558 return (ffelexHandler) ffestb_R8351_;
6560 case FFELEX_typeEOS:
6561 case FFELEX_typeSEMICOLON:
6562 ffesta_confirmed ();
6563 ffesta_tokens[1] = NULL;
6564 return (ffelexHandler) ffestb_R8351_ (t);
6567 case FFELEX_typeNAMES:
6568 if (ffesta_first_kw != FFESTR_firstEXIT)
6569 goto bad_0; /* :::::::::::::::::::: */
6570 switch (ffelex_token_type (t))
6573 goto bad_1; /* :::::::::::::::::::: */
6575 case FFELEX_typeEOS:
6576 case FFELEX_typeSEMICOLON:
6579 ffesta_confirmed ();
6580 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlEXIT);
6583 ffesta_tokens[1] = NULL;
6587 if (!ffesrc_is_name_init (*p))
6588 goto bad_i; /* :::::::::::::::::::: */
6590 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
6592 return (ffelexHandler) ffestb_R8351_ (t);
6595 goto bad_0; /* :::::::::::::::::::: */
6598 bad_0: /* :::::::::::::::::::: */
6599 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", ffesta_tokens[0]);
6600 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6602 bad_1: /* :::::::::::::::::::: */
6603 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", t);
6604 return (ffelexHandler) ffelex_swallow_tokens (t,
6605 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6607 bad_i: /* :::::::::::::::::::: */
6608 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "EXIT", ffesta_tokens[0], i, t);
6609 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6612 /* ffestb_R8351_ -- "EXIT" [NAME]
6614 return ffestb_R8351_; // to lexer
6616 Make sure the next token is an EOS or SEMICOLON. */
6618 static ffelexHandler
6619 ffestb_R8351_ (ffelexToken t)
6621 switch (ffelex_token_type (t))
6623 case FFELEX_typeEOS:
6624 case FFELEX_typeSEMICOLON:
6625 ffesta_confirmed ();
6626 if (!ffesta_is_inhibited ())
6627 ffestc_R835 (ffesta_tokens[1]);
6628 if (ffesta_tokens[1] != NULL)
6629 ffelex_token_kill (ffesta_tokens[1]);
6630 return (ffelexHandler) ffesta_zero (t);
6633 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", t);
6637 if (ffesta_tokens[1] != NULL)
6638 ffelex_token_kill (ffesta_tokens[1]);
6639 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6642 /* ffestb_R838 -- Parse the ASSIGN statement
6644 return ffestb_R838; // to lexer
6646 Make sure the statement has a valid form for the ASSIGN statement. If it
6647 does, implement the statement. */
6650 ffestb_R838 (ffelexToken t)
6655 ffelexToken et; /* First token in target. */
6657 switch (ffelex_token_type (ffesta_tokens[0]))
6659 case FFELEX_typeNAME:
6660 if (ffesta_first_kw != FFESTR_firstASSIGN)
6661 goto bad_0; /* :::::::::::::::::::: */
6662 switch (ffelex_token_type (t))
6664 case FFELEX_typeEOS:
6665 case FFELEX_typeSEMICOLON:
6666 case FFELEX_typeCOMMA:
6667 case FFELEX_typeCOLONCOLON:
6668 ffesta_confirmed (); /* Error, but clearly intended. */
6669 goto bad_1; /* :::::::::::::::::::: */
6672 goto bad_1; /* :::::::::::::::::::: */
6674 case FFELEX_typeNUMBER:
6677 ffesta_tokens[1] = ffelex_token_use (t);
6678 ffesta_confirmed ();
6679 return (ffelexHandler) ffestb_R8381_;
6681 case FFELEX_typeNAMES:
6682 if (ffesta_first_kw != FFESTR_firstASSIGN)
6683 goto bad_0; /* :::::::::::::::::::: */
6685 switch (ffelex_token_type (t))
6687 case FFELEX_typeEOS:
6688 case FFELEX_typeSEMICOLON:
6689 ffesta_confirmed ();
6691 case FFELEX_typePERCENT:
6692 case FFELEX_typeOPEN_PAREN:
6693 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlASSIGN);
6695 goto bad_i; /* :::::::::::::::::::: */
6697 = ffelex_token_number_from_names (ffesta_tokens[0], i);
6698 p += ffelex_token_length (ffesta_tokens[1]); /* Skip to "TO". */
6699 i += ffelex_token_length (ffesta_tokens[1]);
6700 if (!ffesrc_char_match_init (*p, 'T', 't') /* "TO". */
6701 || (++i, !ffesrc_char_match_noninit (*++p, 'O', 'o')))
6703 bad_i_1: /* :::::::::::::::::::: */
6704 ffelex_token_kill (ffesta_tokens[1]);
6705 goto bad_i; /* :::::::::::::::::::: */
6708 if (!ffesrc_is_name_init (*p))
6709 goto bad_i_1; /* :::::::::::::::::::: */
6710 et = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
6711 next = (ffelexHandler)
6713 ffeexpr_lhs (ffesta_output_pool,
6714 FFEEXPR_contextASSIGN,
6718 ffelex_token_kill (et);
6719 return (ffelexHandler) (*next) (t);
6721 case FFELEX_typeCOMMA:
6722 case FFELEX_typeCOLONCOLON:
6723 ffesta_confirmed (); /* Error, but clearly intended. */
6724 goto bad_1; /* :::::::::::::::::::: */
6727 goto bad_1; /* :::::::::::::::::::: */
6731 goto bad_0; /* :::::::::::::::::::: */
6734 bad_0: /* :::::::::::::::::::: */
6735 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", ffesta_tokens[0]);
6736 return (ffelexHandler) ffelex_swallow_tokens (t,
6737 (ffelexHandler) ffesta_zero); /* Invalid first token. */
6739 bad_1: /* :::::::::::::::::::: */
6740 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t);
6741 return (ffelexHandler) ffelex_swallow_tokens (t,
6742 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6744 bad_i: /* :::::::::::::::::::: */
6745 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ASSIGN", ffesta_tokens[0], i, t);
6746 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6749 /* ffestb_R8381_ -- "ASSIGN" NUMBER
6751 return ffestb_R8381_; // to lexer
6753 Make sure the next token is "TO". */
6755 static ffelexHandler
6756 ffestb_R8381_ (ffelexToken t)
6758 if ((ffelex_token_type (t) == FFELEX_typeNAME)
6759 && (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t), "TO", "to",
6762 return (ffelexHandler) ffestb_R8382_;
6765 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t);
6766 if (ffelex_token_type (t) == FFELEX_typeNAME)
6767 return (ffelexHandler) ffestb_R8382_ (t); /* Maybe user forgot "TO". */
6769 ffelex_token_kill (ffesta_tokens[1]);
6770 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6773 /* ffestb_R8382_ -- "ASSIGN" NUMBER ("TO")
6775 return ffestb_R8382_; // to lexer
6777 Make sure the next token is a name, then pass it along to the expression
6778 evaluator as an LHS expression. The callback function is _3_. */
6780 static ffelexHandler
6781 ffestb_R8382_ (ffelexToken t)
6783 if (ffelex_token_type (t) == FFELEX_typeNAME)
6785 return (ffelexHandler)
6787 ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextASSIGN,
6788 (ffeexprCallback) ffestb_R8383_)))
6792 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t);
6793 ffelex_token_kill (ffesta_tokens[1]);
6794 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6797 /* ffestb_R8383_ -- "ASSIGN" NUMBER ("TO") expression
6799 (ffestb_R8383_) // to expression handler
6801 Make sure the next token is an EOS or SEMICOLON. */
6803 static ffelexHandler
6804 ffestb_R8383_ (ffelexToken ft, ffebld expr, ffelexToken t)
6806 switch (ffelex_token_type (t))
6808 case FFELEX_typeEOS:
6809 case FFELEX_typeSEMICOLON:
6810 ffesta_confirmed ();
6813 if (!ffesta_is_inhibited ())
6814 ffestc_R838 (ffesta_tokens[1], expr, ft);
6815 ffelex_token_kill (ffesta_tokens[1]);
6816 return (ffelexHandler) ffesta_zero (t);
6819 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t);
6823 ffelex_token_kill (ffesta_tokens[1]);
6824 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6827 /* ffestb_R840 -- Parse an arithmetic-IF statement
6829 return ffestb_R840; // to lexer
6831 Make sure the statement has a valid form for an arithmetic-IF statement.
6832 If it does, implement the statement. */
6835 ffestb_R840 (ffelexToken t)
6837 switch (ffelex_token_type (ffesta_tokens[0]))
6839 case FFELEX_typeNAME:
6840 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlIF)
6841 goto bad_0; /* :::::::::::::::::::: */
6842 if (ffesta_first_kw != FFESTR_firstIF)
6843 goto bad_0; /* :::::::::::::::::::: */
6846 case FFELEX_typeNAMES:
6847 if (ffesta_first_kw != FFESTR_firstIF)
6848 goto bad_0; /* :::::::::::::::::::: */
6852 goto bad_0; /* :::::::::::::::::::: */
6855 switch (ffelex_token_type (t))
6857 case FFELEX_typeOPEN_PAREN:
6861 goto bad_1; /* :::::::::::::::::::: */
6864 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextARITHIF,
6865 (ffeexprCallback) ffestb_R8401_);
6867 bad_0: /* :::::::::::::::::::: */
6868 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", ffesta_tokens[0]);
6869 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6871 bad_1: /* :::::::::::::::::::: */
6872 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6873 return (ffelexHandler) ffelex_swallow_tokens (t,
6874 (ffelexHandler) ffesta_zero); /* Invalid second token. */
6877 /* ffestb_R8401_ -- "IF" OPEN_PAREN expr
6879 (ffestb_R8401_) // to expression handler
6881 Make sure the next token is CLOSE_PAREN. */
6883 static ffelexHandler
6884 ffestb_R8401_ (ffelexToken ft, ffebld expr, ffelexToken t)
6886 ffestb_local_.if_stmt.expr = expr;
6888 switch (ffelex_token_type (t))
6890 case FFELEX_typeCLOSE_PAREN:
6893 ffesta_tokens[1] = ffelex_token_use (ft);
6894 ffelex_set_names (TRUE); /* In case it's a logical IF instead. */
6895 return (ffelexHandler) ffestb_R8402_;
6901 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6902 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6905 /* ffestb_R8402_ -- "IF" OPEN_PAREN expr CLOSE_PAREN
6907 return ffestb_R8402_; // to lexer
6909 Make sure the next token is NUMBER. */
6911 static ffelexHandler
6912 ffestb_R8402_ (ffelexToken t)
6914 ffelex_set_names (FALSE);
6916 switch (ffelex_token_type (t))
6918 case FFELEX_typeNUMBER:
6919 ffesta_confirmed ();
6920 ffesta_tokens[2] = ffelex_token_use (t);
6921 return (ffelexHandler) ffestb_R8403_;
6927 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6928 ffelex_token_kill (ffesta_tokens[1]);
6929 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6932 /* ffestb_R8403_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER
6934 return ffestb_R8403_; // to lexer
6936 Make sure the next token is COMMA. */
6938 static ffelexHandler
6939 ffestb_R8403_ (ffelexToken t)
6941 switch (ffelex_token_type (t))
6943 case FFELEX_typeCOMMA:
6944 return (ffelexHandler) ffestb_R8404_;
6950 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6951 ffelex_token_kill (ffesta_tokens[1]);
6952 ffelex_token_kill (ffesta_tokens[2]);
6953 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6956 /* ffestb_R8404_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA
6958 return ffestb_R8404_; // to lexer
6960 Make sure the next token is NUMBER. */
6962 static ffelexHandler
6963 ffestb_R8404_ (ffelexToken t)
6965 switch (ffelex_token_type (t))
6967 case FFELEX_typeNUMBER:
6968 ffesta_tokens[3] = ffelex_token_use (t);
6969 return (ffelexHandler) ffestb_R8405_;
6975 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
6976 ffelex_token_kill (ffesta_tokens[1]);
6977 ffelex_token_kill (ffesta_tokens[2]);
6978 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
6981 /* ffestb_R8405_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER
6983 return ffestb_R8405_; // to lexer
6985 Make sure the next token is COMMA. */
6987 static ffelexHandler
6988 ffestb_R8405_ (ffelexToken t)
6990 switch (ffelex_token_type (t))
6992 case FFELEX_typeCOMMA:
6993 return (ffelexHandler) ffestb_R8406_;
6999 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
7000 ffelex_token_kill (ffesta_tokens[1]);
7001 ffelex_token_kill (ffesta_tokens[2]);
7002 ffelex_token_kill (ffesta_tokens[3]);
7003 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7006 /* ffestb_R8406_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER COMMA
7008 return ffestb_R8406_; // to lexer
7010 Make sure the next token is NUMBER. */
7012 static ffelexHandler
7013 ffestb_R8406_ (ffelexToken t)
7015 switch (ffelex_token_type (t))
7017 case FFELEX_typeNUMBER:
7018 ffesta_tokens[4] = ffelex_token_use (t);
7019 return (ffelexHandler) ffestb_R8407_;
7025 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
7026 ffelex_token_kill (ffesta_tokens[1]);
7027 ffelex_token_kill (ffesta_tokens[2]);
7028 ffelex_token_kill (ffesta_tokens[3]);
7029 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7032 /* ffestb_R8407_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER COMMA
7035 return ffestb_R8407_; // to lexer
7037 Make sure the next token is EOS or SEMICOLON. */
7039 static ffelexHandler
7040 ffestb_R8407_ (ffelexToken t)
7042 switch (ffelex_token_type (t))
7044 case FFELEX_typeEOS:
7045 case FFELEX_typeSEMICOLON:
7046 if (!ffesta_is_inhibited ())
7047 ffestc_R840 (ffestb_local_.if_stmt.expr, ffesta_tokens[1],
7048 ffesta_tokens[2], ffesta_tokens[3], ffesta_tokens[4]);
7049 ffelex_token_kill (ffesta_tokens[1]);
7050 ffelex_token_kill (ffesta_tokens[2]);
7051 ffelex_token_kill (ffesta_tokens[3]);
7052 ffelex_token_kill (ffesta_tokens[4]);
7053 return (ffelexHandler) ffesta_zero (t);
7059 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t);
7060 ffelex_token_kill (ffesta_tokens[1]);
7061 ffelex_token_kill (ffesta_tokens[2]);
7062 ffelex_token_kill (ffesta_tokens[3]);
7063 ffelex_token_kill (ffesta_tokens[4]);
7064 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7067 /* ffestb_R841 -- Parse the CONTINUE statement
7069 return ffestb_R841; // to lexer
7071 Make sure the statement has a valid form for the CONTINUE statement. If
7072 it does, implement the statement. */
7075 ffestb_R841 (ffelexToken t)
7080 switch (ffelex_token_type (ffesta_tokens[0]))
7082 case FFELEX_typeNAME:
7083 if (ffesta_first_kw != FFESTR_firstCONTINUE)
7084 goto bad_0; /* :::::::::::::::::::: */
7087 case FFELEX_typeNAMES:
7088 if (ffesta_first_kw != FFESTR_firstCONTINUE)
7089 goto bad_0; /* :::::::::::::::::::: */
7090 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCONTINUE)
7092 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCONTINUE);
7093 goto bad_i; /* :::::::::::::::::::: */
7098 goto bad_0; /* :::::::::::::::::::: */
7101 switch (ffelex_token_type (t))
7103 case FFELEX_typeEOS:
7104 case FFELEX_typeSEMICOLON:
7105 ffesta_confirmed ();
7106 if (!ffesta_is_inhibited ())
7108 return (ffelexHandler) ffesta_zero (t);
7110 case FFELEX_typeCOMMA:
7111 case FFELEX_typeCOLONCOLON:
7112 ffesta_confirmed (); /* Error, but clearly intended. */
7113 goto bad_1; /* :::::::::::::::::::: */
7116 goto bad_1; /* :::::::::::::::::::: */
7119 bad_0: /* :::::::::::::::::::: */
7120 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTINUE", ffesta_tokens[0]);
7121 return (ffelexHandler) ffelex_swallow_tokens (t,
7122 (ffelexHandler) ffesta_zero); /* Invalid first token. */
7124 bad_1: /* :::::::::::::::::::: */
7125 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTINUE", t);
7126 return (ffelexHandler) ffelex_swallow_tokens (t,
7127 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7129 bad_i: /* :::::::::::::::::::: */
7130 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CONTINUE", ffesta_tokens[0], i, t);
7131 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7134 /* ffestb_R1102 -- Parse the PROGRAM statement
7136 return ffestb_R1102; // to lexer
7138 Make sure the statement has a valid form for the PROGRAM statement. If it
7139 does, implement the statement. */
7142 ffestb_R1102 (ffelexToken t)
7147 switch (ffelex_token_type (ffesta_tokens[0]))
7149 case FFELEX_typeNAME:
7150 if (ffesta_first_kw != FFESTR_firstPROGRAM)
7151 goto bad_0; /* :::::::::::::::::::: */
7152 switch (ffelex_token_type (t))
7154 case FFELEX_typeEOS:
7155 case FFELEX_typeSEMICOLON:
7156 case FFELEX_typeCOMMA:
7157 case FFELEX_typeCOLONCOLON:
7158 ffesta_confirmed (); /* Error, but clearly intended. */
7159 goto bad_1; /* :::::::::::::::::::: */
7162 goto bad_1; /* :::::::::::::::::::: */
7164 case FFELEX_typeNAME:
7168 ffesta_confirmed ();
7169 ffesta_tokens[1] = ffelex_token_use (t);
7170 return (ffelexHandler) ffestb_R11021_;
7172 case FFELEX_typeNAMES:
7173 if (ffesta_first_kw != FFESTR_firstPROGRAM)
7174 goto bad_0; /* :::::::::::::::::::: */
7175 switch (ffelex_token_type (t))
7177 case FFELEX_typeCOMMA:
7178 case FFELEX_typeCOLONCOLON:
7179 ffesta_confirmed (); /* Error, but clearly intended. */
7180 goto bad_1; /* :::::::::::::::::::: */
7183 goto bad_1; /* :::::::::::::::::::: */
7185 case FFELEX_typeEOS:
7186 case FFELEX_typeSEMICOLON:
7189 ffesta_confirmed ();
7190 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlPROGRAM);
7191 if (!ffesrc_is_name_init (*p))
7192 goto bad_i; /* :::::::::::::::::::: */
7194 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
7195 return (ffelexHandler) ffestb_R11021_ (t);
7198 goto bad_0; /* :::::::::::::::::::: */
7201 bad_0: /* :::::::::::::::::::: */
7202 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", ffesta_tokens[0]);
7203 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7205 bad_1: /* :::::::::::::::::::: */
7206 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", t);
7207 return (ffelexHandler) ffelex_swallow_tokens (t,
7208 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7210 bad_i: /* :::::::::::::::::::: */
7211 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "PROGRAM", ffesta_tokens[0], i, t);
7212 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7215 /* ffestb_R11021_ -- "PROGRAM" NAME
7217 return ffestb_R11021_; // to lexer
7219 Make sure the next token is an EOS or SEMICOLON. */
7221 static ffelexHandler
7222 ffestb_R11021_ (ffelexToken t)
7224 switch (ffelex_token_type (t))
7226 case FFELEX_typeEOS:
7227 case FFELEX_typeSEMICOLON:
7228 ffesta_confirmed ();
7229 if (!ffesta_is_inhibited ())
7230 ffestc_R1102 (ffesta_tokens[1]);
7231 ffelex_token_kill (ffesta_tokens[1]);
7232 return (ffelexHandler) ffesta_zero (t);
7235 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", t);
7239 ffelex_token_kill (ffesta_tokens[1]);
7240 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7243 /* ffestb_block -- Parse the BLOCK DATA statement
7245 return ffestb_block; // to lexer
7247 Make sure the statement has a valid form for the BLOCK DATA statement. If
7248 it does, implement the statement. */
7251 ffestb_block (ffelexToken t)
7253 switch (ffelex_token_type (ffesta_tokens[0]))
7255 case FFELEX_typeNAME:
7256 if (ffesta_first_kw != FFESTR_firstBLOCK)
7257 goto bad_0; /* :::::::::::::::::::: */
7258 switch (ffelex_token_type (t))
7261 goto bad_1; /* :::::::::::::::::::: */
7263 case FFELEX_typeNAME:
7264 if (ffesta_second_kw != FFESTR_secondDATA)
7265 goto bad_1; /* :::::::::::::::::::: */
7269 ffesta_confirmed ();
7270 return (ffelexHandler) ffestb_R1111_1_;
7273 goto bad_0; /* :::::::::::::::::::: */
7276 bad_0: /* :::::::::::::::::::: */
7277 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0]);
7278 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7280 bad_1: /* :::::::::::::::::::: */
7281 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t);
7282 return (ffelexHandler) ffelex_swallow_tokens (t,
7283 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7286 /* ffestb_blockdata -- Parse the BLOCKDATA statement
7288 return ffestb_blockdata; // to lexer
7290 Make sure the statement has a valid form for the BLOCKDATA statement. If
7291 it does, implement the statement. */
7294 ffestb_blockdata (ffelexToken t)
7299 switch (ffelex_token_type (ffesta_tokens[0]))
7301 case FFELEX_typeNAME:
7302 if (ffesta_first_kw != FFESTR_firstBLOCKDATA)
7303 goto bad_0; /* :::::::::::::::::::: */
7304 switch (ffelex_token_type (t))
7306 case FFELEX_typeCOMMA:
7307 case FFELEX_typeCOLONCOLON:
7308 ffesta_confirmed (); /* Error, but clearly intended. */
7309 goto bad_1; /* :::::::::::::::::::: */
7312 goto bad_1; /* :::::::::::::::::::: */
7314 case FFELEX_typeNAME:
7315 ffesta_confirmed ();
7316 ffesta_tokens[1] = ffelex_token_use (t);
7317 return (ffelexHandler) ffestb_R1111_2_;
7319 case FFELEX_typeEOS:
7320 case FFELEX_typeSEMICOLON:
7321 ffesta_confirmed ();
7322 ffesta_tokens[1] = NULL;
7323 return (ffelexHandler) ffestb_R1111_2_ (t);
7326 case FFELEX_typeNAMES:
7327 if (ffesta_first_kw != FFESTR_firstBLOCKDATA)
7328 goto bad_0; /* :::::::::::::::::::: */
7329 switch (ffelex_token_type (t))
7332 goto bad_1; /* :::::::::::::::::::: */
7334 case FFELEX_typeEOS:
7335 case FFELEX_typeSEMICOLON:
7338 ffesta_confirmed ();
7339 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlBLOCKDATA);
7342 ffesta_tokens[1] = NULL;
7346 if (!ffesrc_is_name_init (*p))
7347 goto bad_i; /* :::::::::::::::::::: */
7349 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
7351 return (ffelexHandler) ffestb_R1111_2_ (t);
7354 goto bad_0; /* :::::::::::::::::::: */
7357 bad_0: /* :::::::::::::::::::: */
7358 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0]);
7359 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7361 bad_1: /* :::::::::::::::::::: */
7362 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t);
7363 return (ffelexHandler) ffelex_swallow_tokens (t,
7364 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7366 bad_i: /* :::::::::::::::::::: */
7367 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0], i, t);
7368 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7371 /* ffestb_R1111_1_ -- "BLOCK" "DATA"
7373 return ffestb_R1111_1_; // to lexer
7375 Make sure the next token is a NAME, EOS, or SEMICOLON token. */
7377 static ffelexHandler
7378 ffestb_R1111_1_ (ffelexToken t)
7380 switch (ffelex_token_type (t))
7382 case FFELEX_typeNAME:
7383 ffesta_tokens[1] = ffelex_token_use (t);
7384 return (ffelexHandler) ffestb_R1111_2_;
7386 case FFELEX_typeEOS:
7387 case FFELEX_typeSEMICOLON:
7388 ffesta_tokens[1] = NULL;
7389 return (ffelexHandler) ffestb_R1111_2_ (t);
7392 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t);
7396 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7399 /* ffestb_R1111_2_ -- "BLOCK/DATA" NAME
7401 return ffestb_R1111_2_; // to lexer
7403 Make sure the next token is an EOS or SEMICOLON. */
7405 static ffelexHandler
7406 ffestb_R1111_2_ (ffelexToken t)
7408 switch (ffelex_token_type (t))
7410 case FFELEX_typeEOS:
7411 case FFELEX_typeSEMICOLON:
7412 ffesta_confirmed ();
7413 if (!ffesta_is_inhibited ())
7414 ffestc_R1111 (ffesta_tokens[1]);
7415 if (ffesta_tokens[1] != NULL)
7416 ffelex_token_kill (ffesta_tokens[1]);
7417 return (ffelexHandler) ffesta_zero (t);
7420 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t);
7424 if (ffesta_tokens[1] != NULL)
7425 ffelex_token_kill (ffesta_tokens[1]);
7426 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7429 /* ffestb_R1212 -- Parse the CALL statement
7431 return ffestb_R1212; // to lexer
7433 Make sure the statement has a valid form for the CALL statement. If it
7434 does, implement the statement. */
7437 ffestb_R1212 (ffelexToken t)
7444 switch (ffelex_token_type (ffesta_tokens[0]))
7446 case FFELEX_typeNAME:
7447 if (ffesta_first_kw != FFESTR_firstCALL)
7448 goto bad_0; /* :::::::::::::::::::: */
7449 switch (ffelex_token_type (t))
7451 case FFELEX_typeEOS:
7452 case FFELEX_typeSEMICOLON:
7453 case FFELEX_typeCOMMA:
7454 case FFELEX_typeCOLONCOLON:
7455 ffesta_confirmed (); /* Error, but clearly intended. */
7456 goto bad_1; /* :::::::::::::::::::: */
7459 goto bad_1; /* :::::::::::::::::::: */
7461 case FFELEX_typeNAME:
7464 ffesta_confirmed ();
7465 return (ffelexHandler)
7467 ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextSUBROUTINEREF,
7468 (ffeexprCallback) ffestb_R12121_)))
7471 case FFELEX_typeNAMES:
7472 if (ffesta_first_kw != FFESTR_firstCALL)
7473 goto bad_0; /* :::::::::::::::::::: */
7474 switch (ffelex_token_type (t))
7476 case FFELEX_typeCOLONCOLON:
7477 case FFELEX_typeCOMMA:
7478 ffesta_confirmed (); /* Error, but clearly intended. */
7479 goto bad_1; /* :::::::::::::::::::: */
7482 goto bad_1; /* :::::::::::::::::::: */
7484 case FFELEX_typeOPEN_PAREN:
7487 case FFELEX_typeEOS:
7488 case FFELEX_typeSEMICOLON:
7489 ffesta_confirmed ();
7492 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCALL);
7493 if (!ffesrc_is_name_init (*p))
7494 goto bad_i; /* :::::::::::::::::::: */
7495 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
7496 next = (ffelexHandler)
7498 ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextSUBROUTINEREF,
7499 (ffeexprCallback) ffestb_R12121_)))
7501 ffelex_token_kill (nt);
7502 return (ffelexHandler) (*next) (t);
7505 goto bad_0; /* :::::::::::::::::::: */
7508 bad_0: /* :::::::::::::::::::: */
7509 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", ffesta_tokens[0]);
7510 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7512 bad_1: /* :::::::::::::::::::: */
7513 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", t);
7514 return (ffelexHandler) ffelex_swallow_tokens (t,
7515 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7517 bad_i: /* :::::::::::::::::::: */
7518 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CALL", ffesta_tokens[0], i, t);
7519 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7522 /* ffestb_R12121_ -- "CALL" expr
7524 (ffestb_R12121_) // to expression handler
7526 Make sure the statement has a valid form for the CALL statement. If it
7527 does, implement the statement. */
7529 static ffelexHandler
7530 ffestb_R12121_ (ffelexToken ft, ffebld expr, ffelexToken t)
7532 switch (ffelex_token_type (t))
7534 case FFELEX_typeEOS:
7535 case FFELEX_typeSEMICOLON:
7536 ffesta_confirmed ();
7539 if (!ffesta_is_inhibited ())
7540 ffestc_R1212 (expr, ft);
7541 return (ffelexHandler) ffesta_zero (t);
7547 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", t);
7548 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7551 /* ffestb_R1227 -- Parse the RETURN statement
7553 return ffestb_R1227; // to lexer
7555 Make sure the statement has a valid form for the RETURN statement. If it
7556 does, implement the statement. */
7559 ffestb_R1227 (ffelexToken t)
7563 switch (ffelex_token_type (ffesta_tokens[0]))
7565 case FFELEX_typeNAME:
7566 if (ffesta_first_kw != FFESTR_firstRETURN)
7567 goto bad_0; /* :::::::::::::::::::: */
7568 switch (ffelex_token_type (t))
7570 case FFELEX_typeCOMMA:
7571 case FFELEX_typeCOLONCOLON:
7572 ffesta_confirmed (); /* Error, but clearly intended. */
7573 goto bad_1; /* :::::::::::::::::::: */
7575 case FFELEX_typeEQUALS:
7576 case FFELEX_typePOINTS:
7577 case FFELEX_typeCOLON:
7578 goto bad_1; /* :::::::::::::::::::: */
7580 case FFELEX_typeEOS:
7581 case FFELEX_typeSEMICOLON:
7582 case FFELEX_typeNAME:
7583 case FFELEX_typeNUMBER:
7584 ffesta_confirmed ();
7591 return (ffelexHandler) (*((ffelexHandler)
7592 ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextRETURN,
7593 (ffeexprCallback) ffestb_R12271_)))
7596 case FFELEX_typeNAMES:
7597 if (ffesta_first_kw != FFESTR_firstRETURN)
7598 goto bad_0; /* :::::::::::::::::::: */
7599 switch (ffelex_token_type (t))
7601 case FFELEX_typeCOMMA:
7602 case FFELEX_typeCOLONCOLON:
7603 ffesta_confirmed (); /* Error, but clearly intended. */
7604 goto bad_1; /* :::::::::::::::::::: */
7606 case FFELEX_typeEQUALS:
7607 case FFELEX_typePOINTS:
7608 case FFELEX_typeCOLON:
7609 goto bad_1; /* :::::::::::::::::::: */
7611 case FFELEX_typeEOS:
7612 case FFELEX_typeSEMICOLON:
7613 ffesta_confirmed ();
7619 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
7620 FFEEXPR_contextRETURN, (ffeexprCallback) ffestb_R12271_);
7621 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
7622 FFESTR_firstlRETURN);
7624 return (ffelexHandler) ffelex_swallow_tokens (t,
7625 (ffelexHandler) ffesta_zero);
7626 return (ffelexHandler) (*next) (t);
7629 goto bad_0; /* :::::::::::::::::::: */
7632 bad_0: /* :::::::::::::::::::: */
7633 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", ffesta_tokens[0]);
7634 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7636 bad_1: /* :::::::::::::::::::: */
7637 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", t);
7638 return (ffelexHandler) ffelex_swallow_tokens (t,
7639 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7642 /* ffestb_R12271_ -- "RETURN" expr
7644 (ffestb_R12271_) // to expression handler
7646 Make sure the next token is an EOS or SEMICOLON. */
7648 static ffelexHandler
7649 ffestb_R12271_ (ffelexToken ft, ffebld expr, ffelexToken t)
7651 switch (ffelex_token_type (t))
7653 case FFELEX_typeEOS:
7654 case FFELEX_typeSEMICOLON:
7655 ffesta_confirmed ();
7656 if (!ffesta_is_inhibited ())
7657 ffestc_R1227 (expr, ft);
7658 return (ffelexHandler) ffesta_zero (t);
7661 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", t);
7665 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7668 /* ffestb_R1228 -- Parse the CONTAINS statement
7670 return ffestb_R1228; // to lexer
7672 Make sure the statement has a valid form for the CONTAINS statement. If
7673 it does, implement the statement. */
7677 ffestb_R1228 (ffelexToken t)
7682 switch (ffelex_token_type (ffesta_tokens[0]))
7684 case FFELEX_typeNAME:
7685 if (ffesta_first_kw != FFESTR_firstCONTAINS)
7686 goto bad_0; /* :::::::::::::::::::: */
7689 case FFELEX_typeNAMES:
7690 if (ffesta_first_kw != FFESTR_firstCONTAINS)
7691 goto bad_0; /* :::::::::::::::::::: */
7692 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCONTAINS)
7694 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCONTAINS);
7695 goto bad_i; /* :::::::::::::::::::: */
7700 goto bad_0; /* :::::::::::::::::::: */
7703 switch (ffelex_token_type (t))
7705 case FFELEX_typeEOS:
7706 case FFELEX_typeSEMICOLON:
7707 ffesta_confirmed ();
7708 if (!ffesta_is_inhibited ())
7710 return (ffelexHandler) ffesta_zero (t);
7712 case FFELEX_typeCOMMA:
7713 case FFELEX_typeCOLONCOLON:
7714 ffesta_confirmed (); /* Error, but clearly intended. */
7715 goto bad_1; /* :::::::::::::::::::: */
7718 goto bad_1; /* :::::::::::::::::::: */
7721 bad_0: /* :::::::::::::::::::: */
7722 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTAINS", ffesta_tokens[0]);
7723 return (ffelexHandler) ffelex_swallow_tokens (t,
7724 (ffelexHandler) ffesta_zero); /* Invalid first token. */
7726 bad_1: /* :::::::::::::::::::: */
7727 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTAINS", t);
7728 return (ffelexHandler) ffelex_swallow_tokens (t,
7729 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7731 bad_i: /* :::::::::::::::::::: */
7732 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CONTAINS", ffesta_tokens[0], i, t);
7733 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7737 /* ffestb_V009 -- Parse the UNION statement
7739 return ffestb_V009; // to lexer
7741 Make sure the statement has a valid form for the UNION statement. If
7742 it does, implement the statement. */
7746 ffestb_V009 (ffelexToken t)
7751 switch (ffelex_token_type (ffesta_tokens[0]))
7753 case FFELEX_typeNAME:
7754 if (ffesta_first_kw != FFESTR_firstUNION)
7755 goto bad_0; /* :::::::::::::::::::: */
7758 case FFELEX_typeNAMES:
7759 if (ffesta_first_kw != FFESTR_firstUNION)
7760 goto bad_0; /* :::::::::::::::::::: */
7761 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlUNION)
7763 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlUNION);
7764 goto bad_i; /* :::::::::::::::::::: */
7769 goto bad_0; /* :::::::::::::::::::: */
7772 switch (ffelex_token_type (t))
7774 case FFELEX_typeEOS:
7775 case FFELEX_typeSEMICOLON:
7776 ffesta_confirmed ();
7777 if (!ffesta_is_inhibited ())
7779 return (ffelexHandler) ffesta_zero (t);
7781 case FFELEX_typeCOMMA:
7782 case FFELEX_typeCOLONCOLON:
7783 ffesta_confirmed (); /* Error, but clearly intended. */
7784 goto bad_1; /* :::::::::::::::::::: */
7787 goto bad_1; /* :::::::::::::::::::: */
7790 bad_0: /* :::::::::::::::::::: */
7791 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "UNION", ffesta_tokens[0]);
7792 return (ffelexHandler) ffelex_swallow_tokens (t,
7793 (ffelexHandler) ffesta_zero); /* Invalid first token. */
7795 bad_1: /* :::::::::::::::::::: */
7796 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "UNION", t);
7797 return (ffelexHandler) ffelex_swallow_tokens (t,
7798 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7800 bad_i: /* :::::::::::::::::::: */
7801 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "UNION", ffesta_tokens[0], i, t);
7802 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7806 /* ffestb_construct -- Parse a construct name
7808 return ffestb_construct; // to lexer
7810 Make sure the statement can have a construct name (if-then-stmt, do-stmt,
7811 select-case-stmt). */
7814 ffestb_construct (ffelexToken t UNUSED)
7816 /* This handler gets invoked only when token 0 is NAME/NAMES and token 1 is
7819 ffesta_confirmed ();
7820 ffelex_set_names (TRUE);
7821 return (ffelexHandler) ffestb_construct1_;
7824 /* ffestb_construct1_ -- NAME COLON
7826 return ffestb_construct1_; // to lexer
7828 Make sure we've got a NAME that is DO, DOWHILE, IF, SELECT, or SELECTCASE. */
7830 static ffelexHandler
7831 ffestb_construct1_ (ffelexToken t)
7833 ffelex_set_names (FALSE);
7835 switch (ffelex_token_type (t))
7837 case FFELEX_typeNAME:
7838 ffesta_first_kw = ffestr_first (t);
7839 switch (ffesta_first_kw)
7841 case FFESTR_firstIF:
7842 ffestb_local_.construct.next = (ffelexHandler) ffestb_if;
7845 case FFESTR_firstDO:
7846 ffestb_local_.construct.next = (ffelexHandler) ffestb_do;
7849 case FFESTR_firstDOWHILE:
7850 ffestb_local_.construct.next = (ffelexHandler) ffestb_dowhile;
7853 case FFESTR_firstSELECT:
7854 case FFESTR_firstSELECTCASE:
7855 ffestb_local_.construct.next = (ffelexHandler) ffestb_R809;
7859 goto bad; /* :::::::::::::::::::: */
7861 ffesta_construct_name = ffesta_tokens[0];
7862 ffesta_tokens[0] = ffelex_token_use (t);
7863 return (ffelexHandler) ffestb_construct2_;
7865 case FFELEX_typeNAMES:
7866 ffesta_first_kw = ffestr_first (t);
7867 switch (ffesta_first_kw)
7869 case FFESTR_firstIF:
7870 if (ffelex_token_length (t) != FFESTR_firstlIF)
7871 goto bad; /* :::::::::::::::::::: */
7872 ffestb_local_.construct.next = (ffelexHandler) ffestb_if;
7875 case FFESTR_firstDO:
7876 ffestb_local_.construct.next = (ffelexHandler) ffestb_do;
7879 case FFESTR_firstDOWHILE:
7880 if (ffelex_token_length (t) != FFESTR_firstlDOWHILE)
7881 goto bad; /* :::::::::::::::::::: */
7882 ffestb_local_.construct.next = (ffelexHandler) ffestb_dowhile;
7885 case FFESTR_firstSELECTCASE:
7886 if (ffelex_token_length (t) != FFESTR_firstlSELECTCASE)
7887 goto bad; /* :::::::::::::::::::: */
7888 ffestb_local_.construct.next = (ffelexHandler) ffestb_R809;
7892 goto bad; /* :::::::::::::::::::: */
7894 ffesta_construct_name = ffesta_tokens[0];
7895 ffesta_tokens[0] = ffelex_token_use (t);
7896 return (ffelexHandler) ffestb_construct2_;
7902 bad: /* :::::::::::::::::::: */
7903 ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT",
7904 ffesta_tokens[0], t);
7905 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7908 /* ffestb_construct2_ -- NAME COLON "DO/DOWHILE/IF/SELECT/SELECTCASE"
7910 return ffestb_construct2_; // to lexer
7912 This extra step is needed to set ffesta_second_kw if the second token
7913 (here) is a NAME, so DO and SELECT can continue to expect it. */
7915 static ffelexHandler
7916 ffestb_construct2_ (ffelexToken t)
7918 if (ffelex_token_type (t) == FFELEX_typeNAME)
7919 ffesta_second_kw = ffestr_second (t);
7920 return (ffelexHandler) (*ffestb_local_.construct.next) (t);
7923 /* ffestb_heap -- Parse an ALLOCATE/DEALLOCATE statement
7925 return ffestb_heap; // to lexer
7927 Make sure the statement has a valid form for an ALLOCATE/DEALLOCATE
7928 statement. If it does, implement the statement. */
7932 ffestb_heap (ffelexToken t)
7934 switch (ffelex_token_type (ffesta_tokens[0]))
7936 case FFELEX_typeNAME:
7939 case FFELEX_typeNAMES:
7940 if (ffelex_token_length (ffesta_tokens[0]) != ffestb_args.heap.len)
7941 goto bad_0; /* :::::::::::::::::::: */
7945 goto bad_0; /* :::::::::::::::::::: */
7948 switch (ffelex_token_type (t))
7950 case FFELEX_typeOPEN_PAREN:
7953 case FFELEX_typeEOS:
7954 case FFELEX_typeSEMICOLON:
7955 case FFELEX_typeCOMMA:
7956 case FFELEX_typeCOLONCOLON:
7957 ffesta_confirmed (); /* Error, but clearly intended. */
7958 goto bad_1; /* :::::::::::::::::::: */
7961 goto bad_1; /* :::::::::::::::::::: */
7964 ffestb_local_.heap.exprs = ffestt_exprlist_create ();
7965 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
7966 ffestb_args.heap.ctx,
7967 (ffeexprCallback) ffestb_heap1_);
7969 bad_0: /* :::::::::::::::::::: */
7970 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, ffesta_tokens[0]);
7971 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
7973 bad_1: /* :::::::::::::::::::: */
7974 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
7975 return (ffelexHandler) ffelex_swallow_tokens (t,
7976 (ffelexHandler) ffesta_zero); /* Invalid second token. */
7979 /* ffestb_heap1_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr
7981 (ffestb_heap1_) // to expression handler
7983 Make sure the next token is COMMA. */
7985 static ffelexHandler
7986 ffestb_heap1_ (ffelexToken ft, ffebld expr, ffelexToken t)
7988 switch (ffelex_token_type (t))
7990 case FFELEX_typeCOMMA:
7993 ffestt_exprlist_append (ffestb_local_.heap.exprs, expr,
7994 ffelex_token_use (t));
7995 return (ffelexHandler) ffestb_heap2_;
7997 case FFELEX_typeCLOSE_PAREN:
8000 ffestt_exprlist_append (ffestb_local_.heap.exprs, expr,
8001 ffelex_token_use (t));
8002 ffesta_tokens[1] = NULL;
8003 ffestb_local_.heap.expr = NULL;
8004 return (ffelexHandler) ffestb_heap5_;
8010 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8011 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8012 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8015 /* ffestb_heap2_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr COMMA
8017 return ffestb_heap2_; // to lexer
8019 Make sure the next token is NAME. */
8021 static ffelexHandler
8022 ffestb_heap2_ (ffelexToken t)
8024 switch (ffelex_token_type (t))
8026 case FFELEX_typeNAME:
8027 ffesta_tokens[1] = ffelex_token_use (t);
8028 return (ffelexHandler) ffestb_heap3_;
8034 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8035 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8036 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8039 /* ffestb_heap3_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr COMMA NAME
8041 return ffestb_heap3_; // to lexer
8043 If token is EQUALS, make sure NAME was "STAT" and handle STAT variable;
8044 else pass NAME and token to expression handler. */
8046 static ffelexHandler
8047 ffestb_heap3_ (ffelexToken t)
8051 switch (ffelex_token_type (t))
8053 case FFELEX_typeEQUALS:
8054 ffesta_confirmed ();
8055 if (ffestr_other (ffesta_tokens[1]) != FFESTR_otherSTAT)
8057 ffelex_token_kill (ffesta_tokens[1]);
8058 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
8059 FFEEXPR_contextHEAPSTAT,
8060 (ffeexprCallback) ffestb_heap4_);
8063 next = (ffelexHandler)
8064 (*((ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
8065 ffestb_args.heap.ctx,
8066 (ffeexprCallback) ffestb_heap1_)))
8068 ffelex_token_kill (ffesta_tokens[1]);
8069 return (ffelexHandler) (*next) (t);
8072 ffelex_token_kill (ffesta_tokens[1]);
8073 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8074 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8075 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8078 /* ffestb_heap4_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN ... COMMA "STAT" EQUALS
8081 (ffestb_heap4_) // to expression handler
8083 Make sure the next token is CLOSE_PAREN. */
8085 static ffelexHandler
8086 ffestb_heap4_ (ffelexToken ft, ffebld expr, ffelexToken t)
8088 switch (ffelex_token_type (t))
8090 case FFELEX_typeCLOSE_PAREN:
8093 ffesta_tokens[1] = ffelex_token_use (ft);
8094 ffestb_local_.heap.expr = expr;
8095 return (ffelexHandler) ffestb_heap5_;
8101 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8102 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8103 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8106 /* ffestb_heap5_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN ... CLOSE_PAREN
8108 return ffestb_heap5_; // to lexer
8110 Make sure the next token is EOS/SEMICOLON. */
8112 static ffelexHandler
8113 ffestb_heap5_ (ffelexToken t)
8115 switch (ffelex_token_type (t))
8117 case FFELEX_typeEOS:
8118 case FFELEX_typeSEMICOLON:
8119 ffesta_confirmed ();
8120 if (!ffesta_is_inhibited ())
8121 if (ffesta_first_kw == FFESTR_firstALLOCATE)
8122 ffestc_R620 (ffestb_local_.heap.exprs, ffestb_local_.heap.expr,
8125 ffestc_R625 (ffestb_local_.heap.exprs, ffestb_local_.heap.expr,
8127 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8128 if (ffesta_tokens[1] != NULL)
8129 ffelex_token_kill (ffesta_tokens[1]);
8130 return (ffelexHandler) ffesta_zero (t);
8136 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t);
8137 ffestt_exprlist_kill (ffestb_local_.heap.exprs);
8138 if (ffesta_tokens[1] != NULL)
8139 ffelex_token_kill (ffesta_tokens[1]);
8140 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8144 /* ffestb_module -- Parse the MODULEPROCEDURE statement
8146 return ffestb_module; // to lexer
8148 Make sure the statement has a valid form for the MODULEPROCEDURE statement.
8149 If it does, implement the statement.
8152 Confirm NAME==MODULE followed by standard four invalid tokens, so we
8153 get decent message if somebody forgets that MODULE requires a name. */
8157 ffestb_module (ffelexToken t)
8162 ffelexToken mt; /* Name in MODULE PROCEDUREname, i.e.
8163 includes "PROCEDURE". */
8165 switch (ffelex_token_type (ffesta_tokens[0]))
8167 case FFELEX_typeNAME:
8168 if (ffesta_first_kw != FFESTR_firstMODULE)
8169 goto bad_0; /* :::::::::::::::::::: */
8170 switch (ffelex_token_type (t))
8172 case FFELEX_typeNAME:
8175 case FFELEX_typeCOLONCOLON:
8176 case FFELEX_typeCOMMA:
8177 case FFELEX_typeEOS:
8178 case FFELEX_typeSEMICOLON:
8179 ffesta_confirmed ();
8180 goto bad_1m; /* :::::::::::::::::::: */
8183 goto bad_1m; /* :::::::::::::::::::: */
8186 ffesta_confirmed ();
8187 if (ffesta_second_kw != FFESTR_secondPROCEDURE)
8189 ffesta_tokens[1] = ffelex_token_use (t);
8190 return (ffelexHandler) ffestb_module3_;
8192 ffestb_local_.moduleprocedure.started = FALSE;
8193 ffesta_tokens[1] = ffelex_token_use (t);
8194 return (ffelexHandler) ffestb_module1_;
8196 case FFELEX_typeNAMES:
8197 p = ffelex_token_text (ffesta_tokens[0])
8198 + (i = FFESTR_firstlMODULEPROCEDURE);
8199 if ((ffesta_first_kw == FFESTR_firstMODULE)
8200 || ((ffesta_first_kw == FFESTR_firstMODULEPROCEDURE)
8201 && !ffesrc_is_name_init (*p)))
8202 { /* Definitely not "MODULE PROCEDURE name". */
8203 switch (ffelex_token_type (t))
8205 case FFELEX_typeCOMMA:
8206 case FFELEX_typeCOLONCOLON:
8207 ffesta_confirmed (); /* Error, but clearly intended. */
8208 goto bad_1m; /* :::::::::::::::::::: */
8211 goto bad_1m; /* :::::::::::::::::::: */
8213 case FFELEX_typeEOS:
8214 case FFELEX_typeSEMICOLON:
8215 ffesta_confirmed ();
8218 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlMODULE);
8219 if (!ffesrc_is_name_init (*p))
8220 goto bad_im; /* :::::::::::::::::::: */
8221 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
8222 if (!ffesta_is_inhibited ())
8224 ffelex_token_kill (nt);
8225 return (ffelexHandler) ffesta_zero (t);
8228 /* Here we know that we're indeed looking at a MODULEPROCEDURE
8229 statement rather than MODULE and that the character following
8230 MODULEPROCEDURE in the NAMES token is a valid first character for a
8231 NAME. This means that unless the second token is COMMA, we have an
8232 ambiguous statement that can be read either as MODULE PROCEDURE name
8233 or MODULE PROCEDUREname, the former being an R1205, the latter an
8236 if (ffesta_first_kw != FFESTR_firstMODULEPROCEDURE)
8237 goto bad_0; /* :::::::::::::::::::: */
8238 switch (ffelex_token_type (t))
8240 case FFELEX_typeCOLONCOLON:
8241 ffesta_confirmed (); /* Error, but clearly intended. */
8242 goto bad_1; /* :::::::::::::::::::: */
8245 goto bad_1; /* :::::::::::::::::::: */
8247 case FFELEX_typeCOMMA: /* Aha, clearly not MODULE PROCEDUREname. */
8248 ffesta_confirmed ();
8249 ffestb_local_.moduleprocedure.started = FALSE;
8251 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
8252 return (ffelexHandler) ffestb_module2_ (t);
8254 case FFELEX_typeEOS: /* MODULE PROCEDURE name or MODULE
8256 case FFELEX_typeSEMICOLON:
8257 ffesta_confirmed ();
8260 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
8261 mt = ffelex_token_name_from_names (ffesta_tokens[0], FFESTR_firstlMODULE,
8263 if (!ffesta_is_inhibited ())
8264 ffestc_module (mt, nt); /* Implement ambiguous statement. */
8265 ffelex_token_kill (nt);
8266 ffelex_token_kill (mt);
8267 return (ffelexHandler) ffesta_zero (t);
8270 goto bad_0; /* :::::::::::::::::::: */
8273 bad_0: /* :::::::::::::::::::: */
8274 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", ffesta_tokens[0]);
8275 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8277 bad_1: /* :::::::::::::::::::: */
8278 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t);
8279 return (ffelexHandler) ffelex_swallow_tokens (t,
8280 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8282 bad_1m: /* :::::::::::::::::::: */
8283 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE", t);
8284 return (ffelexHandler) ffelex_swallow_tokens (t,
8285 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8287 bad_im: /* :::::::::::::::::::: */
8288 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "MODULE", ffesta_tokens[0], i, t);
8289 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8292 /* ffestb_module1_ -- "MODULEPROCEDURE" or "MODULE" "PROCEDURE"
8294 return ffestb_module1_; // to lexer
8296 Make sure the statement has a valid form for the MODULEPROCEDURE statement. If it
8297 does, implement the statement. */
8299 static ffelexHandler
8300 ffestb_module1_ (ffelexToken t)
8302 switch (ffelex_token_type (t))
8304 case FFELEX_typeNAME:
8305 if (!ffestb_local_.moduleprocedure.started
8306 && (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME))
8308 ffesta_confirmed ();
8309 ffelex_token_kill (ffesta_tokens[1]);
8311 ffesta_tokens[1] = ffelex_token_use (t);
8312 return (ffelexHandler) ffestb_module2_;
8314 case FFELEX_typeEOS:
8315 case FFELEX_typeSEMICOLON:
8316 if (ffestb_local_.moduleprocedure.started)
8317 break; /* Error if we've already seen NAME COMMA. */
8318 ffesta_confirmed ();
8319 if (!ffesta_is_inhibited ())
8320 ffestc_R1105 (ffesta_tokens[1]);
8321 ffelex_token_kill (ffesta_tokens[1]);
8322 return (ffelexHandler) ffesta_zero (t);
8324 case FFELEX_typeCOMMA:
8325 case FFELEX_typeCOLONCOLON:
8326 ffesta_confirmed (); /* Error, but clearly intended. */
8333 if (ffestb_local_.moduleprocedure.started && !ffesta_is_inhibited ())
8334 ffestc_R1205_finish ();
8335 else if (!ffestb_local_.moduleprocedure.started)
8336 ffelex_token_kill (ffesta_tokens[1]);
8337 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t);
8338 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8341 /* ffestb_module2_ -- "MODULE/PROCEDURE" NAME
8343 return ffestb_module2_; // to lexer
8345 Make sure the statement has a valid form for the MODULEPROCEDURE statement. If it
8346 does, implement the statement. */
8348 static ffelexHandler
8349 ffestb_module2_ (ffelexToken t)
8351 switch (ffelex_token_type (t))
8353 case FFELEX_typeEOS:
8354 case FFELEX_typeSEMICOLON:
8355 if (!ffestb_local_.moduleprocedure.started)
8357 ffesta_confirmed ();
8358 if (!ffesta_is_inhibited ())
8359 ffestc_R1205_start ();
8361 if (!ffesta_is_inhibited ())
8363 ffestc_R1205_item (ffesta_tokens[1]);
8364 ffestc_R1205_finish ();
8366 ffelex_token_kill (ffesta_tokens[1]);
8367 return (ffelexHandler) ffesta_zero (t);
8369 case FFELEX_typeCOMMA:
8370 if (!ffestb_local_.moduleprocedure.started)
8372 ffestb_local_.moduleprocedure.started = TRUE;
8373 ffesta_confirmed ();
8374 if (!ffesta_is_inhibited ())
8375 ffestc_R1205_start ();
8377 if (!ffesta_is_inhibited ())
8378 ffestc_R1205_item (ffesta_tokens[1]);
8379 ffelex_token_kill (ffesta_tokens[1]);
8380 return (ffelexHandler) ffestb_module1_;
8386 if (ffestb_local_.moduleprocedure.started && !ffesta_is_inhibited ())
8387 ffestc_R1205_finish ();
8388 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t);
8389 ffelex_token_kill (ffesta_tokens[1]);
8390 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8393 /* ffestb_module3_ -- "MODULE" NAME
8395 return ffestb_module3_; // to lexer
8397 Make sure the statement has a valid form for the MODULE statement. If it
8398 does, implement the statement. */
8400 static ffelexHandler
8401 ffestb_module3_ (ffelexToken t)
8403 switch (ffelex_token_type (t))
8405 case FFELEX_typeEOS:
8406 case FFELEX_typeSEMICOLON:
8407 if (!ffesta_is_inhibited ())
8408 ffestc_R1105 (ffesta_tokens[1]);
8409 ffelex_token_kill (ffesta_tokens[1]);
8410 return (ffelexHandler) ffesta_zero (t);
8416 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE", t);
8417 ffelex_token_kill (ffesta_tokens[1]);
8418 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8422 /* ffestb_R809 -- Parse the SELECTCASE statement
8424 return ffestb_R809; // to lexer
8426 Make sure the statement has a valid form for the SELECTCASE statement.
8427 If it does, implement the statement. */
8430 ffestb_R809 (ffelexToken t)
8435 switch (ffelex_token_type (ffesta_tokens[0]))
8437 case FFELEX_typeNAME:
8438 switch (ffesta_first_kw)
8440 case FFESTR_firstSELECT:
8441 if ((ffelex_token_type (t) != FFELEX_typeNAME)
8442 || (ffesta_second_kw != FFESTR_secondCASE))
8443 goto bad_1; /* :::::::::::::::::::: */
8444 ffesta_confirmed ();
8445 return (ffelexHandler) ffestb_R8091_;
8447 case FFESTR_firstSELECTCASE:
8448 return (ffelexHandler) ffestb_R8091_ (t);
8451 goto bad_0; /* :::::::::::::::::::: */
8454 case FFELEX_typeNAMES:
8455 if (ffesta_first_kw != FFESTR_firstSELECTCASE)
8456 goto bad_0; /* :::::::::::::::::::: */
8457 switch (ffelex_token_type (t))
8459 case FFELEX_typeCOMMA:
8460 case FFELEX_typeEOS:
8461 case FFELEX_typeSEMICOLON:
8462 case FFELEX_typeCOLONCOLON:
8463 ffesta_confirmed (); /* Error, but clearly intended. */
8464 goto bad_1; /* :::::::::::::::::::: */
8467 goto bad_1; /* :::::::::::::::::::: */
8469 case FFELEX_typeOPEN_PAREN:
8472 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSELECTCASE);
8474 goto bad_i; /* :::::::::::::::::::: */
8475 return (ffelexHandler) ffestb_R8091_ (t);
8478 goto bad_0; /* :::::::::::::::::::: */
8481 bad_0: /* :::::::::::::::::::: */
8482 if (ffesta_construct_name != NULL)
8484 ffelex_token_kill (ffesta_construct_name);
8485 ffesta_construct_name = NULL;
8487 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", ffesta_tokens[0]);
8488 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8490 bad_1: /* :::::::::::::::::::: */
8491 if (ffesta_construct_name != NULL)
8493 ffelex_token_kill (ffesta_construct_name);
8494 ffesta_construct_name = NULL;
8496 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t);
8497 return (ffelexHandler) ffelex_swallow_tokens (t,
8498 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8500 bad_i: /* :::::::::::::::::::: */
8501 if (ffesta_construct_name != NULL)
8503 ffelex_token_kill (ffesta_construct_name);
8504 ffesta_construct_name = NULL;
8506 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", ffesta_tokens[0], i, t);
8507 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8510 /* ffestb_R8091_ -- "SELECTCASE" or "SELECT" "CASE"
8512 return ffestb_R8091_; // to lexer
8514 Make sure the statement has a valid form for the SELECTCASE statement. If it
8515 does, implement the statement. */
8517 static ffelexHandler
8518 ffestb_R8091_ (ffelexToken t)
8520 switch (ffelex_token_type (t))
8522 case FFELEX_typeOPEN_PAREN:
8523 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8524 FFEEXPR_contextSELECTCASE, (ffeexprCallback) ffestb_R8092_);
8526 case FFELEX_typeEOS:
8527 case FFELEX_typeSEMICOLON:
8528 case FFELEX_typeCOMMA:
8529 case FFELEX_typeCOLONCOLON:
8530 ffesta_confirmed (); /* Error, but clearly intended. */
8537 if (ffesta_construct_name != NULL)
8539 ffelex_token_kill (ffesta_construct_name);
8540 ffesta_construct_name = NULL;
8542 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t);
8543 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8546 /* ffestb_R8092_ -- "SELECT/CASE" OPEN_PAREN expr
8548 (ffestb_R8092_) // to expression handler
8550 Make sure the statement has a valid form for the SELECTCASE statement. If it
8551 does, implement the statement. */
8553 static ffelexHandler
8554 ffestb_R8092_ (ffelexToken ft, ffebld expr, ffelexToken t)
8556 switch (ffelex_token_type (t))
8558 case FFELEX_typeCLOSE_PAREN:
8561 ffesta_tokens[1] = ffelex_token_use (ft);
8562 ffestb_local_.selectcase.expr = expr;
8563 return (ffelexHandler) ffestb_R8093_;
8569 if (ffesta_construct_name != NULL)
8571 ffelex_token_kill (ffesta_construct_name);
8572 ffesta_construct_name = NULL;
8574 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t);
8575 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8578 /* ffestb_R8093_ -- "SELECT/CASE" OPEN_PAREN expr CLOSE_PAREN
8580 return ffestb_R8093_; // to lexer
8582 Make sure the statement has a valid form for the SELECTCASE statement. If it
8583 does, implement the statement. */
8585 static ffelexHandler
8586 ffestb_R8093_ (ffelexToken t)
8588 switch (ffelex_token_type (t))
8590 case FFELEX_typeEOS:
8591 case FFELEX_typeSEMICOLON:
8592 ffesta_confirmed ();
8593 if (!ffesta_is_inhibited ())
8594 ffestc_R809 (ffesta_construct_name, ffestb_local_.selectcase.expr,
8596 ffelex_token_kill (ffesta_tokens[1]);
8597 if (ffesta_construct_name != NULL)
8599 ffelex_token_kill (ffesta_construct_name);
8600 ffesta_construct_name = NULL;
8602 return ffesta_zero (t);
8604 case FFELEX_typeCOMMA:
8605 case FFELEX_typeCOLONCOLON:
8606 ffesta_confirmed (); /* Error, but clearly intended. */
8613 ffelex_token_kill (ffesta_tokens[1]);
8614 if (ffesta_construct_name != NULL)
8616 ffelex_token_kill (ffesta_construct_name);
8617 ffesta_construct_name = NULL;
8619 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t);
8620 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8623 /* ffestb_R810 -- Parse the CASE statement
8625 return ffestb_R810; // to lexer
8627 Make sure the statement has a valid form for the CASE statement.
8628 If it does, implement the statement. */
8631 ffestb_R810 (ffelexToken t)
8636 switch (ffelex_token_type (ffesta_tokens[0]))
8638 case FFELEX_typeNAME:
8639 if (ffesta_first_kw != FFESTR_firstCASE)
8640 goto bad_0; /* :::::::::::::::::::: */
8641 switch (ffelex_token_type (t))
8643 case FFELEX_typeCOMMA:
8644 case FFELEX_typeEOS:
8645 case FFELEX_typeSEMICOLON:
8646 case FFELEX_typeCOLONCOLON:
8647 ffesta_confirmed (); /* Error, but clearly intended. */
8648 goto bad_1; /* :::::::::::::::::::: */
8651 goto bad_1; /* :::::::::::::::::::: */
8653 case FFELEX_typeNAME:
8654 ffesta_confirmed ();
8655 if (ffesta_second_kw != FFESTR_secondDEFAULT)
8656 goto bad_1; /* :::::::::::::::::::: */
8657 ffestb_local_.case_stmt.cases = NULL;
8658 return (ffelexHandler) ffestb_R8101_;
8660 case FFELEX_typeOPEN_PAREN:
8661 ffestb_local_.case_stmt.cases = ffestt_caselist_create ();
8662 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8663 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_);
8666 case FFELEX_typeNAMES:
8667 switch (ffesta_first_kw)
8669 case FFESTR_firstCASEDEFAULT:
8670 switch (ffelex_token_type (t))
8672 case FFELEX_typeCOMMA:
8673 case FFELEX_typeCOLONCOLON:
8674 ffesta_confirmed (); /* Error, but clearly intended. */
8675 goto bad_1; /* :::::::::::::::::::: */
8678 goto bad_1; /* :::::::::::::::::::: */
8680 case FFELEX_typeEOS:
8681 case FFELEX_typeSEMICOLON:
8682 ffesta_confirmed ();
8685 ffestb_local_.case_stmt.cases = NULL;
8686 p = ffelex_token_text (ffesta_tokens[0])
8687 + (i = FFESTR_firstlCASEDEFAULT);
8689 return (ffelexHandler) ffestb_R8101_ (t);
8690 if (!ffesrc_is_name_init (*p))
8691 goto bad_i; /* :::::::::::::::::::: */
8692 ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i,
8694 return (ffelexHandler) ffestb_R8102_ (t);
8696 case FFESTR_firstCASE:
8700 goto bad_0; /* :::::::::::::::::::: */
8703 switch (ffelex_token_type (t))
8705 case FFELEX_typeCOMMA:
8706 case FFELEX_typeEOS:
8707 case FFELEX_typeSEMICOLON:
8708 case FFELEX_typeCOLONCOLON:
8709 ffesta_confirmed (); /* Error, but clearly intended. */
8710 goto bad_1; /* :::::::::::::::::::: */
8713 goto bad_1; /* :::::::::::::::::::: */
8715 case FFELEX_typeOPEN_PAREN:
8718 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCASE);
8720 goto bad_i; /* :::::::::::::::::::: */
8721 ffestb_local_.case_stmt.cases = ffestt_caselist_create ();
8722 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8723 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_);
8726 goto bad_0; /* :::::::::::::::::::: */
8729 bad_0: /* :::::::::::::::::::: */
8730 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", ffesta_tokens[0]);
8731 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8733 bad_1: /* :::::::::::::::::::: */
8734 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8735 return (ffelexHandler) ffelex_swallow_tokens (t,
8736 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8738 bad_i: /* :::::::::::::::::::: */
8739 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CASE", ffesta_tokens[0], i, t);
8740 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8743 /* ffestb_R8101_ -- "CASE" case-selector
8745 return ffestb_R8101_; // to lexer
8747 Make sure the statement has a valid form for the CASE statement. If it
8748 does, implement the statement. */
8750 static ffelexHandler
8751 ffestb_R8101_ (ffelexToken t)
8753 switch (ffelex_token_type (t))
8755 case FFELEX_typeNAME:
8756 ffesta_tokens[1] = ffelex_token_use (t);
8757 return (ffelexHandler) ffestb_R8102_;
8759 case FFELEX_typeEOS:
8760 case FFELEX_typeSEMICOLON:
8761 ffesta_tokens[1] = NULL;
8762 return (ffelexHandler) ffestb_R8102_ (t);
8764 case FFELEX_typeCOMMA:
8765 case FFELEX_typeCOLONCOLON:
8766 ffesta_confirmed (); /* Error, but clearly intended. */
8773 if (ffestb_local_.case_stmt.cases != NULL)
8774 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8775 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8776 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8779 /* ffestb_R8102_ -- "CASE" case-selector [NAME]
8781 return ffestb_R8102_; // to lexer
8783 Make sure the statement has a valid form for the CASE statement. If it
8784 does, implement the statement. */
8786 static ffelexHandler
8787 ffestb_R8102_ (ffelexToken t)
8789 switch (ffelex_token_type (t))
8791 case FFELEX_typeEOS:
8792 case FFELEX_typeSEMICOLON:
8793 ffesta_confirmed ();
8794 if (!ffesta_is_inhibited ())
8795 ffestc_R810 (ffestb_local_.case_stmt.cases, ffesta_tokens[1]);
8796 if (ffestb_local_.case_stmt.cases != NULL)
8797 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8798 if (ffesta_tokens[1] != NULL)
8799 ffelex_token_kill (ffesta_tokens[1]);
8800 return (ffelexHandler) ffesta_zero (t);
8802 case FFELEX_typeCOMMA:
8803 case FFELEX_typeCOLONCOLON:
8804 ffesta_confirmed (); /* Error, but clearly intended. */
8811 if (ffestb_local_.case_stmt.cases != NULL)
8812 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8813 if (ffesta_tokens[1] != NULL)
8814 ffelex_token_kill (ffesta_tokens[1]);
8815 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8816 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8819 /* ffestb_R8103_ -- "CASE" OPEN_PAREN expr
8821 (ffestb_R8103_) // to expression handler
8823 Make sure the statement has a valid form for the CASE statement. If it
8824 does, implement the statement. */
8826 static ffelexHandler
8827 ffestb_R8103_ (ffelexToken ft, ffebld expr, ffelexToken t)
8829 switch (ffelex_token_type (t))
8831 case FFELEX_typeCLOSE_PAREN:
8832 ffestt_caselist_append (ffestb_local_.case_stmt.cases, FALSE, expr, NULL,
8833 ffelex_token_use (ft));
8834 return (ffelexHandler) ffestb_R8101_;
8836 case FFELEX_typeCOMMA:
8837 ffestt_caselist_append (ffestb_local_.case_stmt.cases, FALSE, expr, NULL,
8838 ffelex_token_use (ft));
8839 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8840 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_);
8842 case FFELEX_typeCOLON:
8843 ffestt_caselist_append (ffestb_local_.case_stmt.cases, TRUE, expr, NULL,
8844 ffelex_token_use (ft)); /* NULL second expr for
8845 now, just plug in. */
8846 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8847 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8104_);
8853 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8854 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8855 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8858 /* ffestb_R8104_ -- "CASE" OPEN_PAREN expr COLON expr
8860 (ffestb_R8104_) // to expression handler
8862 Make sure the statement has a valid form for the CASE statement. If it
8863 does, implement the statement. */
8865 static ffelexHandler
8866 ffestb_R8104_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
8868 switch (ffelex_token_type (t))
8870 case FFELEX_typeCLOSE_PAREN:
8871 ffestb_local_.case_stmt.cases->previous->expr2 = expr;
8872 return (ffelexHandler) ffestb_R8101_;
8874 case FFELEX_typeCOMMA:
8875 ffestb_local_.case_stmt.cases->previous->expr2 = expr;
8876 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
8877 FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_);
8883 ffestt_caselist_kill (ffestb_local_.case_stmt.cases);
8884 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t);
8885 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8888 /* ffestb_R1001 -- Parse a FORMAT statement
8890 return ffestb_R1001; // to lexer
8892 Make sure the statement has a valid form for an FORMAT statement.
8893 If it does, implement the statement. */
8896 ffestb_R1001 (ffelexToken t)
8900 switch (ffelex_token_type (ffesta_tokens[0]))
8902 case FFELEX_typeNAME:
8903 if (ffesta_first_kw != FFESTR_firstFORMAT)
8904 goto bad_0; /* :::::::::::::::::::: */
8907 case FFELEX_typeNAMES:
8908 if (ffesta_first_kw != FFESTR_firstFORMAT)
8909 goto bad_0; /* :::::::::::::::::::: */
8910 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlFORMAT)
8911 goto bad_0; /* :::::::::::::::::::: */
8915 goto bad_0; /* :::::::::::::::::::: */
8918 switch (ffelex_token_type (t))
8920 case FFELEX_typeOPEN_PAREN:
8921 ffestb_local_.format.complained = FALSE;
8922 ffestb_local_.format.f = NULL; /* No parent yet. */
8923 ffestb_local_.format.f = ffestt_formatlist_create (NULL,
8924 ffelex_token_use (t));
8925 ffelex_set_names_pure (TRUE); /* Have even free-form lexer give us
8927 return (ffelexHandler) ffestb_R10011_;
8929 case FFELEX_typeOPEN_ARRAY:/* "(/". */
8930 ffesta_confirmed ();
8931 ffestb_local_.format.complained = FALSE;
8932 ffestb_local_.format.f = ffestt_formatlist_create (NULL,
8933 ffelex_token_use (t));
8934 f = ffestt_formatlist_append (ffestb_local_.format.f);
8935 f->type = FFESTP_formattypeSLASH;
8936 f->t = ffelex_token_use (t);
8937 f->u.R1010.val.present = FALSE;
8938 f->u.R1010.val.rtexpr = FALSE;
8939 f->u.R1010.val.t = NULL;
8940 f->u.R1010.val.u.unsigned_val = 1;
8941 ffelex_set_names_pure (TRUE); /* Have even free-form lexer give us
8943 return (ffelexHandler) ffestb_R100112_;
8945 case FFELEX_typeEOS:
8946 case FFELEX_typeSEMICOLON:
8947 case FFELEX_typeCOMMA:
8948 case FFELEX_typeCOLONCOLON:
8949 ffesta_confirmed (); /* Error, but clearly intended. */
8950 goto bad_1; /* :::::::::::::::::::: */
8953 goto bad_1; /* :::::::::::::::::::: */
8956 bad_0: /* :::::::::::::::::::: */
8957 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", ffesta_tokens[0]);
8958 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
8960 bad_1: /* :::::::::::::::::::: */
8961 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
8962 return (ffelexHandler) ffelex_swallow_tokens (t,
8963 (ffelexHandler) ffesta_zero); /* Invalid second token. */
8966 /* ffestb_R10011_ -- "FORMAT" OPEN_PAREN expr
8968 return ffestb_R10011_; // to lexer
8970 For CLOSE_PAREN, wrap up the format list and if it is the top-level one,
8971 exit. For anything else, pass it to _2_. */
8973 static ffelexHandler
8974 ffestb_R10011_ (ffelexToken t)
8978 switch (ffelex_token_type (t))
8980 case FFELEX_typeCLOSE_PAREN:
8984 return (ffelexHandler) ffestb_R10012_ (t);
8987 /* If we have a format we're working on, continue working on it. */
8989 f = ffestb_local_.format.f->u.root.parent;
8993 ffestb_local_.format.f = f->next;
8994 return (ffelexHandler) ffestb_R100111_;
8997 return (ffelexHandler) ffestb_R100114_;
9000 /* ffestb_R10012_ -- "FORMAT" OPEN_PAREN [format-item-list]
9002 return ffestb_R10012_; // to lexer
9004 The initial state for a format-item. Here, just handle the initial
9005 number, sign for number, or run-time expression. Also handle spurious
9006 comma, close-paren (indicating spurious comma), close-array (like
9007 close-paren but preceded by slash), and quoted strings. */
9009 static ffelexHandler
9010 ffestb_R10012_ (ffelexToken t)
9012 unsigned long unsigned_val;
9015 switch (ffelex_token_type (t))
9017 case FFELEX_typeOPEN_ANGLE:
9018 ffesta_confirmed ();
9019 ffestb_local_.format.pre.t = ffelex_token_use (t);
9020 ffelex_set_names_pure (FALSE);
9021 if (!ffesta_seen_first_exec && !ffestb_local_.format.complained)
9023 ffestb_local_.format.complained = TRUE;
9024 ffebad_start (FFEBAD_FORMAT_EXPR_SPEC);
9025 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9028 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
9029 FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100115_);
9031 case FFELEX_typeNUMBER:
9032 ffestb_local_.format.sign = FALSE; /* No sign present. */
9033 ffestb_local_.format.pre.present = TRUE;
9034 ffestb_local_.format.pre.rtexpr = FALSE;
9035 ffestb_local_.format.pre.t = ffelex_token_use (t);
9036 ffestb_local_.format.pre.u.unsigned_val = unsigned_val
9037 = strtoul (ffelex_token_text (t), NULL, 10);
9038 ffelex_set_expecting_hollerith (unsigned_val, '\0',
9039 ffelex_token_where_line (t),
9040 ffelex_token_where_column (t));
9041 return (ffelexHandler) ffestb_R10014_;
9043 case FFELEX_typePLUS:
9044 ffestb_local_.format.sign = TRUE; /* Positive. */
9045 ffestb_local_.format.pre.t = ffelex_token_use (t);
9046 return (ffelexHandler) ffestb_R10013_;
9048 case FFELEX_typeMINUS:
9049 ffestb_local_.format.sign = FALSE; /* Negative. */
9050 ffestb_local_.format.pre.t = ffelex_token_use (t);
9051 return (ffelexHandler) ffestb_R10013_;
9053 case FFELEX_typeCOLON:
9054 case FFELEX_typeCOLONCOLON:/* "::". */
9055 case FFELEX_typeSLASH:
9056 case FFELEX_typeCONCAT: /* "//". */
9057 case FFELEX_typeNAMES:
9058 case FFELEX_typeDOLLAR:
9059 case FFELEX_typeOPEN_PAREN:
9060 case FFELEX_typeOPEN_ARRAY:/* "(/". */
9061 ffestb_local_.format.sign = FALSE; /* No sign present. */
9062 ffestb_local_.format.pre.present = FALSE;
9063 ffestb_local_.format.pre.rtexpr = FALSE;
9064 ffestb_local_.format.pre.t = NULL;
9065 ffestb_local_.format.pre.u.unsigned_val = 1;
9066 return (ffelexHandler) ffestb_R10014_ (t);
9068 case FFELEX_typeCOMMA:
9069 ffebad_start (FFEBAD_FORMAT_EXTRA_COMMA);
9070 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9072 return (ffelexHandler) ffestb_R10012_;
9074 case FFELEX_typeCLOSE_PAREN:
9075 ffebad_start (FFEBAD_FORMAT_EXTRA_COMMA);
9076 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9078 f = ffestb_local_.format.f->u.root.parent;
9080 return (ffelexHandler) ffestb_R100114_;
9081 ffestb_local_.format.f = f->next;
9082 return (ffelexHandler) ffestb_R100111_;
9084 case FFELEX_typeCLOSE_ARRAY: /* "/)". */
9085 f = ffestt_formatlist_append (ffestb_local_.format.f);
9086 f->type = FFESTP_formattypeSLASH;
9087 f->t = ffelex_token_use (t);
9088 f->u.R1010.val.present = FALSE;
9089 f->u.R1010.val.rtexpr = FALSE;
9090 f->u.R1010.val.t = NULL;
9091 f->u.R1010.val.u.unsigned_val = 1;
9092 f = ffestb_local_.format.f->u.root.parent;
9094 return (ffelexHandler) ffestb_R100114_;
9095 ffestb_local_.format.f = f->next;
9096 return (ffelexHandler) ffestb_R100111_;
9098 case FFELEX_typeEOS:
9099 case FFELEX_typeSEMICOLON:
9100 ffesta_confirmed ();
9101 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t);
9102 for (f = ffestb_local_.format.f;
9103 f->u.root.parent != NULL;
9104 f = f->u.root.parent->next)
9106 ffestb_local_.format.f = f;
9107 return (ffelexHandler) ffestb_R100114_ (t);
9109 case FFELEX_typeQUOTE:
9111 break; /* Error, probably something like FORMAT("17)
9113 ffelex_set_expecting_hollerith (-1, '\"',
9114 ffelex_token_where_line (t),
9115 ffelex_token_where_column (t)); /* Don't have to unset
9117 return (ffelexHandler) ffestb_R100113_;
9119 case FFELEX_typeAPOSTROPHE:
9120 #if 0 /* No apparent need for this, and not killed
9122 ffesta_tokens[1] = ffelex_token_use (t);
9124 ffelex_set_expecting_hollerith (-1, '\'',
9125 ffelex_token_where_line (t),
9126 ffelex_token_where_column (t)); /* Don't have to unset
9128 return (ffelexHandler) ffestb_R100113_;
9134 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
9135 ffestt_formatlist_kill (ffestb_local_.format.f);
9136 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
9139 /* ffestb_R10013_ -- "FORMAT" OPEN_PAREN [format-item-list] PLUS/MINUS
9141 return ffestb_R10013_; // to lexer
9143 Expect a NUMBER or complain about and then ignore the PLUS/MINUS. */
9145 static ffelexHandler
9146 ffestb_R10013_ (ffelexToken t)
9148 unsigned long unsigned_val;
9150 switch (ffelex_token_type (t))
9152 case FFELEX_typeNUMBER:
9153 ffestb_local_.format.pre.present = TRUE;
9154 ffestb_local_.format.pre.rtexpr = FALSE;
9155 unsigned_val = strtoul (ffelex_token_text (t), NULL, 10);
9156 ffestb_local_.format.pre.u.signed_val = ffestb_local_.format.sign
9157 ? unsigned_val : -unsigned_val;
9158 ffestb_local_.format.sign = TRUE; /* Sign present. */
9159 return (ffelexHandler) ffestb_R10014_;
9162 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9163 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9164 ffelex_token_where_column (ffestb_local_.format.pre.t));
9166 ffelex_token_kill (ffestb_local_.format.pre.t);
9167 return (ffelexHandler) ffestb_R10012_ (t);
9171 /* ffestb_R10014_ -- "FORMAT" OPEN_PAREN [format-item-list] [[+/-] NUMBER]
9173 return ffestb_R10014_; // to lexer
9175 Here is where we expect to see the actual NAMES, COLON, SLASH, OPEN_PAREN,
9176 OPEN_ARRAY, COLONCOLON, CONCAT, DOLLAR, or HOLLERITH that identifies what
9177 kind of format-item we're dealing with. But if we see a NUMBER instead, it
9178 means free-form spaces number like "5 6 X", so scale the current number
9179 accordingly and reenter this state. (I really wouldn't be surprised if
9180 they change this spacing rule in the F90 spec so that you can't embed
9181 spaces within numbers or within keywords like BN in a free-source-form
9184 static ffelexHandler
9185 ffestb_R10014_ (ffelexToken t)
9192 ffelex_set_expecting_hollerith (0, '\0',
9193 ffewhere_line_unknown (),
9194 ffewhere_column_unknown ());
9196 switch (ffelex_token_type (t))
9198 case FFELEX_typeHOLLERITH:
9199 f = ffestt_formatlist_append (ffestb_local_.format.f);
9200 f->type = FFESTP_formattypeR1016;
9201 f->t = ffelex_token_use (t);
9202 ffelex_token_kill (ffestb_local_.format.pre.t); /* It WAS present! */
9203 return (ffelexHandler) ffestb_R100111_;
9205 case FFELEX_typeNUMBER:
9206 assert (ffestb_local_.format.pre.present);
9207 ffesta_confirmed ();
9208 if (ffestb_local_.format.pre.rtexpr)
9210 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
9211 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9213 return (ffelexHandler) ffestb_R10014_;
9215 if (ffestb_local_.format.sign)
9217 for (i = ffelex_token_length (t) + 1; i > 0; --i)
9218 ffestb_local_.format.pre.u.signed_val *= 10;
9219 ffestb_local_.format.pre.u.signed_val += strtoul (ffelex_token_text (t),
9224 for (i = ffelex_token_length (t) + 1; i > 0; --i)
9225 ffestb_local_.format.pre.u.unsigned_val *= 10;
9226 ffestb_local_.format.pre.u.unsigned_val += strtoul (ffelex_token_text (t),
9228 ffelex_set_expecting_hollerith (ffestb_local_.format.pre.u.unsigned_val,
9230 ffelex_token_where_line (t),
9231 ffelex_token_where_column (t));
9233 return (ffelexHandler) ffestb_R10014_;
9235 case FFELEX_typeCOLONCOLON: /* "::". */
9236 if (ffestb_local_.format.pre.present)
9238 ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_COLON_SPEC,
9239 ffestb_local_.format.pre.t);
9240 ffelex_token_kill (ffestb_local_.format.pre.t);
9241 ffestb_local_.format.pre.present = FALSE;
9245 f = ffestt_formatlist_append (ffestb_local_.format.f);
9246 f->type = FFESTP_formattypeCOLON;
9247 f->t = ffelex_token_use (t);
9248 f->u.R1010.val.present = FALSE;
9249 f->u.R1010.val.rtexpr = FALSE;
9250 f->u.R1010.val.t = NULL;
9251 f->u.R1010.val.u.unsigned_val = 1;
9253 f = ffestt_formatlist_append (ffestb_local_.format.f);
9254 f->type = FFESTP_formattypeCOLON;
9255 f->t = ffelex_token_use (t);
9256 f->u.R1010.val.present = FALSE;
9257 f->u.R1010.val.rtexpr = FALSE;
9258 f->u.R1010.val.t = NULL;
9259 f->u.R1010.val.u.unsigned_val = 1;
9260 return (ffelexHandler) ffestb_R100112_;
9262 case FFELEX_typeCOLON:
9263 if (ffestb_local_.format.pre.present)
9265 ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_COLON_SPEC,
9266 ffestb_local_.format.pre.t);
9267 ffelex_token_kill (ffestb_local_.format.pre.t);
9268 return (ffelexHandler) ffestb_R100112_;
9270 f = ffestt_formatlist_append (ffestb_local_.format.f);
9271 f->type = FFESTP_formattypeCOLON;
9272 f->t = ffelex_token_use (t);
9273 f->u.R1010.val.present = FALSE;
9274 f->u.R1010.val.rtexpr = FALSE;
9275 f->u.R1010.val.t = NULL;
9276 f->u.R1010.val.u.unsigned_val = 1;
9277 return (ffelexHandler) ffestb_R100112_;
9279 case FFELEX_typeCONCAT: /* "//". */
9280 if (ffestb_local_.format.sign)
9282 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9283 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9284 ffelex_token_where_column (ffestb_local_.format.pre.t));
9286 ffestb_local_.format.pre.u.unsigned_val
9287 = (ffestb_local_.format.pre.u.signed_val < 0)
9288 ? -ffestb_local_.format.pre.u.signed_val
9289 : ffestb_local_.format.pre.u.signed_val;
9291 f = ffestt_formatlist_append (ffestb_local_.format.f);
9292 f->type = FFESTP_formattypeSLASH;
9293 f->t = ffelex_token_use (t);
9294 f->u.R1010.val = ffestb_local_.format.pre;
9295 ffestb_local_.format.pre.present = FALSE;
9296 ffestb_local_.format.pre.rtexpr = FALSE;
9297 ffestb_local_.format.pre.t = NULL;
9298 ffestb_local_.format.pre.u.unsigned_val = 1;
9299 f = ffestt_formatlist_append (ffestb_local_.format.f);
9300 f->type = FFESTP_formattypeSLASH;
9301 f->t = ffelex_token_use (t);
9302 f->u.R1010.val = ffestb_local_.format.pre;
9303 return (ffelexHandler) ffestb_R100112_;
9305 case FFELEX_typeSLASH:
9306 if (ffestb_local_.format.sign)
9308 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9309 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9310 ffelex_token_where_column (ffestb_local_.format.pre.t));
9312 ffestb_local_.format.pre.u.unsigned_val
9313 = (ffestb_local_.format.pre.u.signed_val < 0)
9314 ? -ffestb_local_.format.pre.u.signed_val
9315 : ffestb_local_.format.pre.u.signed_val;
9317 f = ffestt_formatlist_append (ffestb_local_.format.f);
9318 f->type = FFESTP_formattypeSLASH;
9319 f->t = ffelex_token_use (t);
9320 f->u.R1010.val = ffestb_local_.format.pre;
9321 return (ffelexHandler) ffestb_R100112_;
9323 case FFELEX_typeOPEN_PAREN:
9324 if (ffestb_local_.format.sign)
9326 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9327 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9328 ffelex_token_where_column (ffestb_local_.format.pre.t));
9330 ffestb_local_.format.pre.u.unsigned_val
9331 = (ffestb_local_.format.pre.u.signed_val < 0)
9332 ? -ffestb_local_.format.pre.u.signed_val
9333 : ffestb_local_.format.pre.u.signed_val;
9335 f = ffestt_formatlist_append (ffestb_local_.format.f);
9336 f->type = FFESTP_formattypeFORMAT;
9337 f->t = ffelex_token_use (t);
9338 f->u.R1003D.R1004 = ffestb_local_.format.pre;
9339 f->u.R1003D.format = ffestb_local_.format.f
9340 = ffestt_formatlist_create (f, ffelex_token_use (t));
9341 return (ffelexHandler) ffestb_R10011_;
9343 case FFELEX_typeOPEN_ARRAY:/* "(/". */
9344 if (ffestb_local_.format.sign)
9346 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
9347 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9348 ffelex_token_where_column (ffestb_local_.format.pre.t));
9350 ffestb_local_.format.pre.u.unsigned_val
9351 = (ffestb_local_.format.pre.u.signed_val < 0)
9352 ? -ffestb_local_.format.pre.u.signed_val
9353 : ffestb_local_.format.pre.u.signed_val;
9355 f = ffestt_formatlist_append (ffestb_local_.format.f);
9356 f->type = FFESTP_formattypeFORMAT;
9357 f->t = ffelex_token_use (t);
9358 f->u.R1003D.R1004 = ffestb_local_.format.pre;
9359 f->u.R1003D.format = ffestb_local_.format.f
9360 = ffestt_formatlist_create (f, ffelex_token_use (t));
9361 f = ffestt_formatlist_append (ffestb_local_.format.f);
9362 f->type = FFESTP_formattypeSLASH;
9363 f->t = ffelex_token_use (t);
9364 f->u.R1010.val.present = FALSE;
9365 f->u.R1010.val.rtexpr = FALSE;
9366 f->u.R1010.val.t = NULL;
9367 f->u.R1010.val.u.unsigned_val = 1;
9368 return (ffelexHandler) ffestb_R100112_;
9370 case FFELEX_typeCLOSE_ARRAY: /* "/)". */
9371 f = ffestt_formatlist_append (ffestb_local_.format.f);
9372 f->type = FFESTP_formattypeSLASH;
9373 f->t = ffelex_token_use (t);
9374 f->u.R1010.val = ffestb_local_.format.pre;
9375 f = ffestb_local_.format.f->u.root.parent;
9377 return (ffelexHandler) ffestb_R100114_;
9378 ffestb_local_.format.f = f->next;
9379 return (ffelexHandler) ffestb_R100111_;
9381 case FFELEX_typeQUOTE:
9383 break; /* A totally bad character in a VXT FORMAT. */
9384 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
9385 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9386 ffelex_token_where_column (ffestb_local_.format.pre.t));
9388 ffelex_token_kill (ffestb_local_.format.pre.t);
9389 ffesta_confirmed ();
9390 #if 0 /* No apparent need for this, and not killed
9392 ffesta_tokens[1] = ffelex_token_use (t);
9394 ffelex_set_expecting_hollerith (-1, '\"',
9395 ffelex_token_where_line (t),
9396 ffelex_token_where_column (t)); /* Don't have to unset
9398 return (ffelexHandler) ffestb_R100113_;
9400 case FFELEX_typeAPOSTROPHE:
9401 ffesta_confirmed ();
9402 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
9403 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
9404 ffelex_token_where_column (ffestb_local_.format.pre.t));
9406 ffelex_token_kill (ffestb_local_.format.pre.t);
9407 #if 0 /* No apparent need for this, and not killed
9409 ffesta_tokens[1] = ffelex_token_use (t);
9411 ffelex_set_expecting_hollerith (-1, '\'', ffelex_token_where_line (t),
9412 ffelex_token_where_column (t)); /* Don't have to unset
9414 return (ffelexHandler) ffestb_R100113_;
9416 case FFELEX_typeEOS:
9417 case FFELEX_typeSEMICOLON:
9418 ffesta_confirmed ();
9419 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t);
9420 for (f = ffestb_local_.format.f;
9421 f->u.root.parent != NULL;
9422 f = f->u.root.parent->next)
9424 ffestb_local_.format.f = f;
9425 ffelex_token_kill (ffestb_local_.format.pre.t);
9426 return (ffelexHandler) ffestb_R100114_ (t);
9428 case FFELEX_typeDOLLAR:
9429 ffestb_local_.format.t = ffelex_token_use (t);
9430 if (ffestb_local_.format.pre.present)
9431 ffesta_confirmed (); /* Number preceding this invalid elsewhere. */
9432 ffestb_local_.format.current = FFESTP_formattypeDOLLAR;
9433 return (ffelexHandler) ffestb_R10015_;
9435 case FFELEX_typeNAMES:
9436 kw = ffestr_format (t);
9437 ffestb_local_.format.t = ffelex_token_use (t);
9440 case FFESTR_formatI:
9441 if (ffestb_local_.format.pre.present)
9442 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9443 ffestb_local_.format.current = FFESTP_formattypeI;
9444 i = FFESTR_formatlI;
9447 case FFESTR_formatB:
9448 if (ffestb_local_.format.pre.present)
9449 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9450 ffestb_local_.format.current = FFESTP_formattypeB;
9451 i = FFESTR_formatlB;
9454 case FFESTR_formatO:
9455 if (ffestb_local_.format.pre.present)
9456 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9457 ffestb_local_.format.current = FFESTP_formattypeO;
9458 i = FFESTR_formatlO;
9461 case FFESTR_formatZ:
9462 if (ffestb_local_.format.pre.present)
9463 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9464 ffestb_local_.format.current = FFESTP_formattypeZ;
9465 i = FFESTR_formatlZ;
9468 case FFESTR_formatF:
9469 if (ffestb_local_.format.pre.present)
9470 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9471 ffestb_local_.format.current = FFESTP_formattypeF;
9472 i = FFESTR_formatlF;
9475 case FFESTR_formatE:
9476 ffestb_local_.format.current = FFESTP_formattypeE;
9477 i = FFESTR_formatlE;
9480 case FFESTR_formatEN:
9481 if (ffestb_local_.format.pre.present)
9482 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9483 ffestb_local_.format.current = FFESTP_formattypeEN;
9484 i = FFESTR_formatlEN;
9487 case FFESTR_formatG:
9488 if (ffestb_local_.format.pre.present)
9489 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9490 ffestb_local_.format.current = FFESTP_formattypeG;
9491 i = FFESTR_formatlG;
9494 case FFESTR_formatL:
9495 if (ffestb_local_.format.pre.present)
9496 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9497 ffestb_local_.format.current = FFESTP_formattypeL;
9498 i = FFESTR_formatlL;
9501 case FFESTR_formatA:
9502 if (ffestb_local_.format.pre.present)
9503 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9504 ffestb_local_.format.current = FFESTP_formattypeA;
9505 i = FFESTR_formatlA;
9508 case FFESTR_formatD:
9509 ffestb_local_.format.current = FFESTP_formattypeD;
9510 i = FFESTR_formatlD;
9513 case FFESTR_formatQ:
9514 ffestb_local_.format.current = FFESTP_formattypeQ;
9515 i = FFESTR_formatlQ;
9518 case FFESTR_formatDOLLAR:
9519 if (ffestb_local_.format.pre.present)
9520 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9521 ffestb_local_.format.current = FFESTP_formattypeDOLLAR;
9522 i = FFESTR_formatlDOLLAR;
9525 case FFESTR_formatP:
9526 if (ffestb_local_.format.pre.present)
9527 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9528 ffestb_local_.format.current = FFESTP_formattypeP;
9529 i = FFESTR_formatlP;
9532 case FFESTR_formatT:
9533 if (ffestb_local_.format.pre.present)
9534 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9535 ffestb_local_.format.current = FFESTP_formattypeT;
9536 i = FFESTR_formatlT;
9539 case FFESTR_formatTL:
9540 if (ffestb_local_.format.pre.present)
9541 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9542 ffestb_local_.format.current = FFESTP_formattypeTL;
9543 i = FFESTR_formatlTL;
9546 case FFESTR_formatTR:
9547 if (ffestb_local_.format.pre.present)
9548 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9549 ffestb_local_.format.current = FFESTP_formattypeTR;
9550 i = FFESTR_formatlTR;
9553 case FFESTR_formatX:
9554 if (ffestb_local_.format.pre.present)
9555 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9556 ffestb_local_.format.current = FFESTP_formattypeX;
9557 i = FFESTR_formatlX;
9560 case FFESTR_formatS:
9561 if (ffestb_local_.format.pre.present)
9562 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9563 ffestb_local_.format.current = FFESTP_formattypeS;
9564 i = FFESTR_formatlS;
9567 case FFESTR_formatSP:
9568 if (ffestb_local_.format.pre.present)
9569 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9570 ffestb_local_.format.current = FFESTP_formattypeSP;
9571 i = FFESTR_formatlSP;
9574 case FFESTR_formatSS:
9575 if (ffestb_local_.format.pre.present)
9576 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9577 ffestb_local_.format.current = FFESTP_formattypeSS;
9578 i = FFESTR_formatlSS;
9581 case FFESTR_formatBN:
9582 if (ffestb_local_.format.pre.present)
9583 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9584 ffestb_local_.format.current = FFESTP_formattypeBN;
9585 i = FFESTR_formatlBN;
9588 case FFESTR_formatBZ:
9589 if (ffestb_local_.format.pre.present)
9590 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9591 ffestb_local_.format.current = FFESTP_formattypeBZ;
9592 i = FFESTR_formatlBZ;
9595 case FFESTR_formatH: /* Error, either "H" or "<expr>H". */
9596 if (ffestb_local_.format.pre.present)
9597 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9598 ffestb_local_.format.current = FFESTP_formattypeH;
9599 i = FFESTR_formatlH;
9602 case FFESTR_formatPD:
9603 if (ffestb_local_.format.pre.present)
9604 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9605 ffestb_subr_R1001_append_p_ ();
9606 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9607 FFESTR_formatlP, 1);
9608 ffestb_local_.format.sign = FALSE;
9609 ffestb_local_.format.pre.present = FALSE;
9610 ffestb_local_.format.pre.rtexpr = FALSE;
9611 ffestb_local_.format.pre.t = NULL;
9612 ffestb_local_.format.pre.u.unsigned_val = 1;
9613 ffestb_local_.format.current = FFESTP_formattypeD;
9614 i = FFESTR_formatlPD;
9617 case FFESTR_formatPE:
9618 if (ffestb_local_.format.pre.present)
9619 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9620 ffestb_subr_R1001_append_p_ ();
9621 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9622 FFESTR_formatlP, 1);
9623 ffestb_local_.format.sign = FALSE;
9624 ffestb_local_.format.pre.present = FALSE;
9625 ffestb_local_.format.pre.rtexpr = FALSE;
9626 ffestb_local_.format.pre.t = NULL;
9627 ffestb_local_.format.pre.u.unsigned_val = 1;
9628 ffestb_local_.format.current = FFESTP_formattypeE;
9629 i = FFESTR_formatlPE;
9632 case FFESTR_formatPEN:
9633 if (ffestb_local_.format.pre.present)
9634 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9635 ffestb_subr_R1001_append_p_ ();
9636 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9637 FFESTR_formatlP, 1);
9638 ffestb_local_.format.sign = FALSE;
9639 ffestb_local_.format.pre.present = FALSE;
9640 ffestb_local_.format.pre.rtexpr = FALSE;
9641 ffestb_local_.format.pre.t = NULL;
9642 ffestb_local_.format.pre.u.unsigned_val = 1;
9643 ffestb_local_.format.current = FFESTP_formattypeEN;
9644 i = FFESTR_formatlPEN;
9647 case FFESTR_formatPF:
9648 if (ffestb_local_.format.pre.present)
9649 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9650 ffestb_subr_R1001_append_p_ ();
9651 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9652 FFESTR_formatlP, 1);
9653 ffestb_local_.format.sign = FALSE;
9654 ffestb_local_.format.pre.present = FALSE;
9655 ffestb_local_.format.pre.rtexpr = FALSE;
9656 ffestb_local_.format.pre.t = NULL;
9657 ffestb_local_.format.pre.u.unsigned_val = 1;
9658 ffestb_local_.format.current = FFESTP_formattypeF;
9659 i = FFESTR_formatlPF;
9662 case FFESTR_formatPG:
9663 if (ffestb_local_.format.pre.present)
9664 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9665 ffestb_subr_R1001_append_p_ ();
9666 ffestb_local_.format.t = ffelex_token_name_from_names (t,
9667 FFESTR_formatlP, 1);
9668 ffestb_local_.format.sign = FALSE;
9669 ffestb_local_.format.pre.present = FALSE;
9670 ffestb_local_.format.pre.rtexpr = FALSE;
9671 ffestb_local_.format.pre.t = NULL;
9672 ffestb_local_.format.pre.u.unsigned_val = 1;
9673 ffestb_local_.format.current = FFESTP_formattypeG;
9674 i = FFESTR_formatlPG;
9678 if (ffestb_local_.format.pre.present)
9679 ffesta_confirmed ();/* Number preceding this invalid elsewhere. */
9680 ffestb_local_.format.current = FFESTP_formattypeNone;
9681 p = strpbrk (ffelex_token_text (t), "0123456789");
9683 i = ffelex_token_length (t);
9685 i = p - ffelex_token_text (t);
9688 p = ffelex_token_text (t) + i;
9690 return (ffelexHandler) ffestb_R10015_;
9693 if (ffestb_local_.format.current == FFESTP_formattypeH)
9694 p = strpbrk (p, "0123456789");
9698 ffestb_local_.format.current = FFESTP_formattypeNone;
9701 return (ffelexHandler) ffestb_R10015_;
9702 i = p - ffelex_token_text (t); /* Collect digits. */
9704 ffestb_local_.format.post.present = TRUE;
9705 ffestb_local_.format.post.rtexpr = FALSE;
9706 ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i);
9707 ffestb_local_.format.post.u.unsigned_val
9708 = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10);
9709 p += ffelex_token_length (ffestb_local_.format.post.t);
9710 i += ffelex_token_length (ffestb_local_.format.post.t);
9712 return (ffelexHandler) ffestb_R10016_;
9713 if ((kw != FFESTR_formatP) || !ffelex_is_firstnamechar (*p))
9715 if (ffestb_local_.format.current != FFESTP_formattypeH)
9716 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL);
9717 return (ffelexHandler) ffestb_R10016_;
9720 /* Here we have [number]P[number][text]. Treat as
9721 [number]P,[number][text]. */
9723 ffestb_subr_R1001_append_p_ ();
9724 t = ffestb_local_.format.t = ffelex_token_names_from_names (t, i, 0);
9725 ffestb_local_.format.sign = FALSE;
9726 ffestb_local_.format.pre = ffestb_local_.format.post;
9727 kw = ffestr_format (t);
9729 { /* Only a few possibilities here. */
9730 case FFESTR_formatD:
9731 ffestb_local_.format.current = FFESTP_formattypeD;
9732 i = FFESTR_formatlD;
9735 case FFESTR_formatE:
9736 ffestb_local_.format.current = FFESTP_formattypeE;
9737 i = FFESTR_formatlE;
9740 case FFESTR_formatEN:
9741 ffestb_local_.format.current = FFESTP_formattypeEN;
9742 i = FFESTR_formatlEN;
9745 case FFESTR_formatF:
9746 ffestb_local_.format.current = FFESTP_formattypeF;
9747 i = FFESTR_formatlF;
9750 case FFESTR_formatG:
9751 ffestb_local_.format.current = FFESTP_formattypeG;
9752 i = FFESTR_formatlG;
9756 ffebad_start (FFEBAD_FORMAT_P_NOCOMMA);
9757 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9759 ffestb_local_.format.current = FFESTP_formattypeNone;
9760 p = strpbrk (ffelex_token_text (t), "0123456789");
9762 i = ffelex_token_length (t);
9764 i = p - ffelex_token_text (t);
9766 p = ffelex_token_text (t) + i;
9768 return (ffelexHandler) ffestb_R10015_;
9771 ffestb_local_.format.current = FFESTP_formattypeNone;
9772 p = strpbrk (p, "0123456789");
9774 return (ffelexHandler) ffestb_R10015_;
9775 i = p - ffelex_token_text (t); /* Collect digits anyway. */
9777 ffestb_local_.format.post.present = TRUE;
9778 ffestb_local_.format.post.rtexpr = FALSE;
9779 ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i);
9780 ffestb_local_.format.post.u.unsigned_val
9781 = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10);
9782 p += ffelex_token_length (ffestb_local_.format.post.t);
9783 i += ffelex_token_length (ffestb_local_.format.post.t);
9785 return (ffelexHandler) ffestb_R10016_;
9786 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL);
9787 return (ffelexHandler) ffestb_R10016_;
9793 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
9794 if (ffestb_local_.format.pre.present)
9795 ffelex_token_kill (ffestb_local_.format.pre.t);
9796 ffestt_formatlist_kill (ffestb_local_.format.f);
9797 return (ffelexHandler) ffelex_swallow_tokens (t,
9798 (ffelexHandler) ffesta_zero);
9801 /* ffestb_R10015_ -- [[+/-] NUMBER] NAMES
9803 return ffestb_R10015_; // to lexer
9805 Here we've gotten at least the initial mnemonic for the edit descriptor.
9806 We expect either a NUMBER, for the post-mnemonic value, a NAMES, for
9807 further clarification (in free-form only, sigh) of the mnemonic, or
9808 anything else. In all cases we go to _6_, with the difference that for
9809 NUMBER and NAMES we send the next token rather than the current token. */
9811 static ffelexHandler
9812 ffestb_R10015_ (ffelexToken t)
9814 bool split_pea; /* New NAMES requires splitting kP from new
9820 switch (ffelex_token_type (t))
9822 case FFELEX_typeOPEN_ANGLE:
9823 ffesta_confirmed ();
9824 ffestb_local_.format.post.t = ffelex_token_use (t);
9825 ffelex_set_names_pure (FALSE);
9826 if (!ffesta_seen_first_exec && !ffestb_local_.format.complained)
9828 ffestb_local_.format.complained = TRUE;
9829 ffebad_start (FFEBAD_FORMAT_EXPR_SPEC);
9830 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
9833 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
9834 FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100116_);
9836 case FFELEX_typeNUMBER:
9837 ffestb_local_.format.post.present = TRUE;
9838 ffestb_local_.format.post.rtexpr = FALSE;
9839 ffestb_local_.format.post.t = ffelex_token_use (t);
9840 ffestb_local_.format.post.u.unsigned_val
9841 = strtoul (ffelex_token_text (t), NULL, 10);
9842 return (ffelexHandler) ffestb_R10016_;
9844 case FFELEX_typeNAMES:
9845 ffesta_confirmed (); /* NAMES " " NAMES invalid elsewhere in
9847 kw = ffestr_format (t);
9848 switch (ffestb_local_.format.current)
9850 case FFESTP_formattypeP:
9854 case FFESTP_formattypeH: /* An error, maintain this indicator. */
9855 kw = FFESTR_formatNone;
9866 case FFESTR_formatF:
9867 switch (ffestb_local_.format.current)
9869 case FFESTP_formattypeP:
9870 ffestb_local_.format.current = FFESTP_formattypeF;
9874 ffestb_local_.format.current = FFESTP_formattypeNone;
9877 i = FFESTR_formatlF;
9880 case FFESTR_formatE:
9881 switch (ffestb_local_.format.current)
9883 case FFESTP_formattypeP:
9884 ffestb_local_.format.current = FFESTP_formattypeE;
9888 ffestb_local_.format.current = FFESTP_formattypeNone;
9891 i = FFESTR_formatlE;
9894 case FFESTR_formatEN:
9895 switch (ffestb_local_.format.current)
9897 case FFESTP_formattypeP:
9898 ffestb_local_.format.current = FFESTP_formattypeEN;
9902 ffestb_local_.format.current = FFESTP_formattypeNone;
9905 i = FFESTR_formatlEN;
9908 case FFESTR_formatG:
9909 switch (ffestb_local_.format.current)
9911 case FFESTP_formattypeP:
9912 ffestb_local_.format.current = FFESTP_formattypeG;
9916 ffestb_local_.format.current = FFESTP_formattypeNone;
9919 i = FFESTR_formatlG;
9922 case FFESTR_formatL:
9923 switch (ffestb_local_.format.current)
9925 case FFESTP_formattypeT:
9926 ffestb_local_.format.current = FFESTP_formattypeTL;
9930 ffestb_local_.format.current = FFESTP_formattypeNone;
9933 i = FFESTR_formatlL;
9936 case FFESTR_formatD:
9937 switch (ffestb_local_.format.current)
9939 case FFESTP_formattypeP:
9940 ffestb_local_.format.current = FFESTP_formattypeD;
9944 ffestb_local_.format.current = FFESTP_formattypeNone;
9947 i = FFESTR_formatlD;
9950 case FFESTR_formatS:
9951 switch (ffestb_local_.format.current)
9953 case FFESTP_formattypeS:
9954 ffestb_local_.format.current = FFESTP_formattypeSS;
9958 ffestb_local_.format.current = FFESTP_formattypeNone;
9961 i = FFESTR_formatlS;
9964 case FFESTR_formatP:
9965 switch (ffestb_local_.format.current)
9967 case FFESTP_formattypeS:
9968 ffestb_local_.format.current = FFESTP_formattypeSP;
9972 ffestb_local_.format.current = FFESTP_formattypeNone;
9975 i = FFESTR_formatlP;
9978 case FFESTR_formatR:
9979 switch (ffestb_local_.format.current)
9981 case FFESTP_formattypeT:
9982 ffestb_local_.format.current = FFESTP_formattypeTR;
9986 ffestb_local_.format.current = FFESTP_formattypeNone;
9989 i = FFESTR_formatlR;
9992 case FFESTR_formatZ:
9993 switch (ffestb_local_.format.current)
9995 case FFESTP_formattypeB:
9996 ffestb_local_.format.current = FFESTP_formattypeBZ;
10000 ffestb_local_.format.current = FFESTP_formattypeNone;
10003 i = FFESTR_formatlZ;
10006 case FFESTR_formatN:
10007 switch (ffestb_local_.format.current)
10009 case FFESTP_formattypeE:
10010 ffestb_local_.format.current = FFESTP_formattypeEN;
10013 case FFESTP_formattypeB:
10014 ffestb_local_.format.current = FFESTP_formattypeBN;
10018 ffestb_local_.format.current = FFESTP_formattypeNone;
10021 i = FFESTR_formatlN;
10025 if (ffestb_local_.format.current != FFESTP_formattypeH)
10026 ffestb_local_.format.current = FFESTP_formattypeNone;
10027 split_pea = FALSE; /* Go ahead and let the P be in the party. */
10028 p = strpbrk (ffelex_token_text (t), "0123456789");
10030 i = ffelex_token_length (t);
10032 i = p - ffelex_token_text (t);
10037 ffestb_subr_R1001_append_p_ ();
10038 ffestb_local_.format.t = ffelex_token_use (t);
10039 ffestb_local_.format.sign = FALSE;
10040 ffestb_local_.format.pre.present = FALSE;
10041 ffestb_local_.format.pre.rtexpr = FALSE;
10042 ffestb_local_.format.pre.t = NULL;
10043 ffestb_local_.format.pre.u.unsigned_val = 1;
10046 p = ffelex_token_text (t) + i;
10048 return (ffelexHandler) ffestb_R10015_;
10051 ffestb_local_.format.current = FFESTP_formattypeNone;
10052 p = strpbrk (p, "0123456789");
10054 return (ffelexHandler) ffestb_R10015_;
10055 i = p - ffelex_token_text (t); /* Collect digits anyway. */
10057 ffestb_local_.format.post.present = TRUE;
10058 ffestb_local_.format.post.rtexpr = FALSE;
10059 ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i);
10060 ffestb_local_.format.post.u.unsigned_val
10061 = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10);
10062 p += ffelex_token_length (ffestb_local_.format.post.t);
10063 i += ffelex_token_length (ffestb_local_.format.post.t);
10065 return (ffelexHandler) ffestb_R10016_;
10066 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL);
10067 return (ffelexHandler) ffestb_R10016_;
10070 ffestb_local_.format.post.present = FALSE;
10071 ffestb_local_.format.post.rtexpr = FALSE;
10072 ffestb_local_.format.post.t = NULL;
10073 ffestb_local_.format.post.u.unsigned_val = 1;
10074 return (ffelexHandler) ffestb_R10016_ (t);
10078 /* ffestb_R10016_ -- [[+/-] NUMBER] NAMES NUMBER
10080 return ffestb_R10016_; // to lexer
10082 Expect a PERIOD here. Maybe find a NUMBER to append to the current
10083 number, in which case return to this state. Maybe find a NAMES to switch
10084 from a kP descriptor to a new descriptor (else the NAMES is spurious),
10085 in which case generator the P item and go to state _4_. Anything
10086 else, pass token on to state _8_. */
10088 static ffelexHandler
10089 ffestb_R10016_ (ffelexToken t)
10093 switch (ffelex_token_type (t))
10095 case FFELEX_typePERIOD:
10096 return (ffelexHandler) ffestb_R10017_;
10098 case FFELEX_typeNUMBER:
10099 assert (ffestb_local_.format.post.present);
10100 ffesta_confirmed ();
10101 if (ffestb_local_.format.post.rtexpr)
10103 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
10104 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10106 return (ffelexHandler) ffestb_R10016_;
10108 for (i = ffelex_token_length (t) + 1; i > 0; --i)
10109 ffestb_local_.format.post.u.unsigned_val *= 10;
10110 ffestb_local_.format.post.u.unsigned_val += strtoul (ffelex_token_text (t),
10112 return (ffelexHandler) ffestb_R10016_;
10114 case FFELEX_typeNAMES:
10115 ffesta_confirmed (); /* NUMBER " " NAMES invalid elsewhere. */
10116 if (ffestb_local_.format.current != FFESTP_formattypeP)
10118 ffesta_ffebad_1t (FFEBAD_FORMAT_TEXT_IN_NUMBER, t);
10119 return (ffelexHandler) ffestb_R10016_;
10121 ffestb_subr_R1001_append_p_ ();
10122 ffestb_local_.format.sign = FALSE;
10123 ffestb_local_.format.pre = ffestb_local_.format.post;
10124 return (ffelexHandler) ffestb_R10014_ (t);
10127 ffestb_local_.format.dot.present = FALSE;
10128 ffestb_local_.format.dot.rtexpr = FALSE;
10129 ffestb_local_.format.dot.t = NULL;
10130 ffestb_local_.format.dot.u.unsigned_val = 1;
10131 return (ffelexHandler) ffestb_R10018_ (t);
10135 /* ffestb_R10017_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD
10137 return ffestb_R10017_; // to lexer
10139 Here we've gotten the period following the edit descriptor.
10140 We expect either a NUMBER, for the dot value, or something else, which
10141 probably means we're not even close to being in a real FORMAT statement. */
10143 static ffelexHandler
10144 ffestb_R10017_ (ffelexToken t)
10146 switch (ffelex_token_type (t))
10148 case FFELEX_typeOPEN_ANGLE:
10149 ffestb_local_.format.dot.t = ffelex_token_use (t);
10150 ffelex_set_names_pure (FALSE);
10151 if (!ffesta_seen_first_exec && !ffestb_local_.format.complained)
10153 ffestb_local_.format.complained = TRUE;
10154 ffebad_start (FFEBAD_FORMAT_EXPR_SPEC);
10155 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10158 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
10159 FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100117_);
10161 case FFELEX_typeNUMBER:
10162 ffestb_local_.format.dot.present = TRUE;
10163 ffestb_local_.format.dot.rtexpr = FALSE;
10164 ffestb_local_.format.dot.t = ffelex_token_use (t);
10165 ffestb_local_.format.dot.u.unsigned_val
10166 = strtoul (ffelex_token_text (t), NULL, 10);
10167 return (ffelexHandler) ffestb_R10018_;
10170 ffelex_token_kill (ffestb_local_.format.t);
10171 if (ffestb_local_.format.pre.present)
10172 ffelex_token_kill (ffestb_local_.format.pre.t);
10173 if (ffestb_local_.format.post.present)
10174 ffelex_token_kill (ffestb_local_.format.post.t);
10175 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_DOT, t);
10176 ffestt_formatlist_kill (ffestb_local_.format.f);
10177 return (ffelexHandler) ffelex_swallow_tokens (t,
10178 (ffelexHandler) ffesta_zero);
10182 /* ffestb_R10018_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD NUMBER
10184 return ffestb_R10018_; // to lexer
10186 Expect a NAMES here, which must begin with "E" to be valid. Maybe find a
10187 NUMBER to append to the current number, in which case return to this state.
10188 Anything else, pass token on to state _10_. */
10190 static ffelexHandler
10191 ffestb_R10018_ (ffelexToken t)
10196 switch (ffelex_token_type (t))
10198 case FFELEX_typeNUMBER:
10199 assert (ffestb_local_.format.dot.present);
10200 ffesta_confirmed ();
10201 if (ffestb_local_.format.dot.rtexpr)
10203 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
10204 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10206 return (ffelexHandler) ffestb_R10018_;
10208 for (i = ffelex_token_length (t) + 1; i > 0; --i)
10209 ffestb_local_.format.dot.u.unsigned_val *= 10;
10210 ffestb_local_.format.dot.u.unsigned_val += strtoul (ffelex_token_text (t),
10212 return (ffelexHandler) ffestb_R10018_;
10214 case FFELEX_typeNAMES:
10215 if (!ffesrc_char_match_init (*(p = ffelex_token_text (t)), 'E', 'e'))
10217 ffesta_ffebad_1t (FFEBAD_FORMAT_TEXT_IN_NUMBER, t);
10218 return (ffelexHandler) ffestb_R10018_;
10221 return (ffelexHandler) ffestb_R10019_; /* Go get NUMBER. */
10225 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, 1, NULL);
10226 return (ffelexHandler) ffestb_R10018_;
10228 ffestb_local_.format.exp.present = TRUE;
10229 ffestb_local_.format.exp.rtexpr = FALSE;
10230 ffestb_local_.format.exp.t = ffelex_token_number_from_names (t, i);
10231 ffestb_local_.format.exp.u.unsigned_val
10232 = strtoul (ffelex_token_text (ffestb_local_.format.exp.t), NULL, 10);
10233 p += ffelex_token_length (ffestb_local_.format.exp.t);
10234 i += ffelex_token_length (ffestb_local_.format.exp.t);
10236 return (ffelexHandler) ffestb_R100110_;
10237 ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL);
10238 return (ffelexHandler) ffestb_R100110_;
10241 ffestb_local_.format.exp.present = FALSE;
10242 ffestb_local_.format.exp.rtexpr = FALSE;
10243 ffestb_local_.format.exp.t = NULL;
10244 ffestb_local_.format.exp.u.unsigned_val = 1;
10245 return (ffelexHandler) ffestb_R100110_ (t);
10249 /* ffestb_R10019_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD NUMBER "E"
10251 return ffestb_R10019_; // to lexer
10253 Here we've gotten the "E" following the edit descriptor.
10254 We expect either a NUMBER, for the exponent value, or something else. */
10256 static ffelexHandler
10257 ffestb_R10019_ (ffelexToken t)
10259 switch (ffelex_token_type (t))
10261 case FFELEX_typeOPEN_ANGLE:
10262 ffestb_local_.format.exp.t = ffelex_token_use (t);
10263 ffelex_set_names_pure (FALSE);
10264 if (!ffesta_seen_first_exec && !ffestb_local_.format.complained)
10266 ffestb_local_.format.complained = TRUE;
10267 ffebad_start (FFEBAD_FORMAT_EXPR_SPEC);
10268 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10271 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
10272 FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100118_);
10274 case FFELEX_typeNUMBER:
10275 ffestb_local_.format.exp.present = TRUE;
10276 ffestb_local_.format.exp.rtexpr = FALSE;
10277 ffestb_local_.format.exp.t = ffelex_token_use (t);
10278 ffestb_local_.format.exp.u.unsigned_val
10279 = strtoul (ffelex_token_text (t), NULL, 10);
10280 return (ffelexHandler) ffestb_R100110_;
10283 ffelex_token_kill (ffestb_local_.format.t);
10284 if (ffestb_local_.format.pre.present)
10285 ffelex_token_kill (ffestb_local_.format.pre.t);
10286 if (ffestb_local_.format.post.present)
10287 ffelex_token_kill (ffestb_local_.format.post.t);
10288 if (ffestb_local_.format.dot.present)
10289 ffelex_token_kill (ffestb_local_.format.dot.t);
10290 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_EXP, t);
10291 ffestt_formatlist_kill (ffestb_local_.format.f);
10292 return (ffelexHandler) ffelex_swallow_tokens (t,
10293 (ffelexHandler) ffesta_zero);
10297 /* ffestb_R100110_ -- [[+/-] NUMBER] NAMES NUMBER [PERIOD NUMBER ["E" NUMBER]]
10299 return ffestb_R100110_; // to lexer
10301 Maybe find a NUMBER to append to the current number, in which case return
10302 to this state. Anything else, handle current descriptor, then pass token
10303 on to state _10_. */
10305 static ffelexHandler
10306 ffestb_R100110_ (ffelexToken t)
10321 ffesttFormatList f;
10323 switch (ffelex_token_type (t))
10325 case FFELEX_typeNUMBER:
10326 assert (ffestb_local_.format.exp.present);
10327 ffesta_confirmed ();
10328 if (ffestb_local_.format.exp.rtexpr)
10330 ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER);
10331 ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
10333 return (ffelexHandler) ffestb_R100110_;
10335 for (i = ffelex_token_length (t) + 1; i > 0; --i)
10336 ffestb_local_.format.exp.u.unsigned_val *= 10;
10337 ffestb_local_.format.exp.u.unsigned_val += strtoul (ffelex_token_text (t),
10339 return (ffelexHandler) ffestb_R100110_;
10342 if (ffestb_local_.format.sign
10343 && (ffestb_local_.format.current != FFESTP_formattypeP)
10344 && (ffestb_local_.format.current != FFESTP_formattypeH))
10346 ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN);
10347 ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t),
10348 ffelex_token_where_column (ffestb_local_.format.pre.t));
10350 ffestb_local_.format.pre.u.unsigned_val
10351 = (ffestb_local_.format.pre.u.signed_val < 0)
10352 ? -ffestb_local_.format.pre.u.signed_val
10353 : ffestb_local_.format.pre.u.signed_val;
10355 switch (ffestb_local_.format.current)
10357 case FFESTP_formattypeI:
10358 err = FFEBAD_FORMAT_BAD_I_SPEC;
10366 case FFESTP_formattypeB:
10367 err = FFEBAD_FORMAT_BAD_B_SPEC;
10375 case FFESTP_formattypeO:
10376 err = FFEBAD_FORMAT_BAD_O_SPEC;
10384 case FFESTP_formattypeZ:
10385 err = FFEBAD_FORMAT_BAD_Z_SPEC;
10393 case FFESTP_formattypeF:
10394 err = FFEBAD_FORMAT_BAD_F_SPEC;
10402 case FFESTP_formattypeE:
10403 err = FFEBAD_FORMAT_BAD_E_SPEC;
10411 case FFESTP_formattypeEN:
10412 err = FFEBAD_FORMAT_BAD_EN_SPEC;
10420 case FFESTP_formattypeG:
10421 err = FFEBAD_FORMAT_BAD_G_SPEC;
10429 case FFESTP_formattypeL:
10430 err = FFEBAD_FORMAT_BAD_L_SPEC;
10438 case FFESTP_formattypeA:
10439 err = FFEBAD_FORMAT_BAD_A_SPEC;
10447 case FFESTP_formattypeD:
10448 err = FFEBAD_FORMAT_BAD_D_SPEC;
10456 case FFESTP_formattypeQ:
10457 err = FFEBAD_FORMAT_BAD_Q_SPEC;
10465 case FFESTP_formattypeDOLLAR:
10466 err = FFEBAD_FORMAT_BAD_DOLLAR_SPEC;
10474 case FFESTP_formattypeP:
10475 err = FFEBAD_FORMAT_BAD_P_SPEC;
10483 case FFESTP_formattypeT:
10484 err = FFEBAD_FORMAT_BAD_T_SPEC;
10492 case FFESTP_formattypeTL:
10493 err = FFEBAD_FORMAT_BAD_TL_SPEC;
10501 case FFESTP_formattypeTR:
10502 err = FFEBAD_FORMAT_BAD_TR_SPEC;
10510 case FFESTP_formattypeX:
10511 err = FFEBAD_FORMAT_BAD_X_SPEC;
10519 case FFESTP_formattypeS:
10520 err = FFEBAD_FORMAT_BAD_S_SPEC;
10528 case FFESTP_formattypeSP:
10529 err = FFEBAD_FORMAT_BAD_SP_SPEC;
10537 case FFESTP_formattypeSS:
10538 err = FFEBAD_FORMAT_BAD_SS_SPEC;
10546 case FFESTP_formattypeBN:
10547 err = FFEBAD_FORMAT_BAD_BN_SPEC;
10555 case FFESTP_formattypeBZ:
10556 err = FFEBAD_FORMAT_BAD_BZ_SPEC;
10564 case FFESTP_formattypeH: /* Definitely an error, make sure of
10566 err = FFEBAD_FORMAT_BAD_H_SPEC;
10567 pre = ffestb_local_.format.pre.present ? disallowed : required;
10574 case FFESTP_formattypeNone:
10575 ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_SPEC,
10576 ffestb_local_.format.t);
10578 clean_up_to_11_: /* :::::::::::::::::::: */
10580 ffelex_token_kill (ffestb_local_.format.t);
10581 if (ffestb_local_.format.pre.present)
10582 ffelex_token_kill (ffestb_local_.format.pre.t);
10583 if (ffestb_local_.format.post.present)
10584 ffelex_token_kill (ffestb_local_.format.post.t);
10585 if (ffestb_local_.format.dot.present)
10586 ffelex_token_kill (ffestb_local_.format.dot.t);
10587 if (ffestb_local_.format.exp.present)
10588 ffelex_token_kill (ffestb_local_.format.exp.t);
10589 return (ffelexHandler) ffestb_R100111_ (t);
10592 assert ("bad format item" == NULL);
10593 err = FFEBAD_FORMAT_BAD_H_SPEC;
10601 if (((pre == disallowed) && ffestb_local_.format.pre.present)
10602 || ((pre == required) && !ffestb_local_.format.pre.present))
10604 ffesta_ffebad_1t (err, (pre == required)
10605 ? ffestb_local_.format.t : ffestb_local_.format.pre.t);
10606 goto clean_up_to_11_; /* :::::::::::::::::::: */
10608 if (((post == disallowed) && ffestb_local_.format.post.present)
10609 || ((post == required) && !ffestb_local_.format.post.present))
10611 ffesta_ffebad_1t (err, (post == required)
10612 ? ffestb_local_.format.t : ffestb_local_.format.post.t);
10613 goto clean_up_to_11_; /* :::::::::::::::::::: */
10615 if (((dot == disallowed) && ffestb_local_.format.dot.present)
10616 || ((dot == required) && !ffestb_local_.format.dot.present))
10618 ffesta_ffebad_1t (err, (dot == required)
10619 ? ffestb_local_.format.t : ffestb_local_.format.dot.t);
10620 goto clean_up_to_11_; /* :::::::::::::::::::: */
10622 if (((exp == disallowed) && ffestb_local_.format.exp.present)
10623 || ((exp == required) && !ffestb_local_.format.exp.present))
10625 ffesta_ffebad_1t (err, (exp == required)
10626 ? ffestb_local_.format.t : ffestb_local_.format.exp.t);
10627 goto clean_up_to_11_; /* :::::::::::::::::::: */
10629 f = ffestt_formatlist_append (ffestb_local_.format.f);
10630 f->type = ffestb_local_.format.current;
10631 f->t = ffestb_local_.format.t;
10634 f->u.R1005.R1004 = ffestb_local_.format.pre;
10635 f->u.R1005.R1006 = ffestb_local_.format.post;
10636 f->u.R1005.R1007_or_R1008 = ffestb_local_.format.dot;
10637 f->u.R1005.R1009 = ffestb_local_.format.exp;
10640 /* Must be R1010. */
10642 if (pre == disallowed)
10643 f->u.R1010.val = ffestb_local_.format.post;
10645 f->u.R1010.val = ffestb_local_.format.pre;
10647 return (ffelexHandler) ffestb_R100111_ (t);
10651 /* ffestb_R100111_ -- edit-descriptor
10653 return ffestb_R100111_; // to lexer
10655 Expect a COMMA, CLOSE_PAREN, CLOSE_ARRAY, COLON, COLONCOLON, SLASH, or
10656 CONCAT, or complain about missing comma. */
10658 static ffelexHandler
10659 ffestb_R100111_ (ffelexToken t)
10661 ffesttFormatList f;
10663 switch (ffelex_token_type (t))
10665 case FFELEX_typeCOMMA:
10666 return (ffelexHandler) ffestb_R10012_;
10668 case FFELEX_typeCOLON:
10669 case FFELEX_typeCOLONCOLON:
10670 case FFELEX_typeSLASH:
10671 case FFELEX_typeCONCAT:
10672 return (ffelexHandler) ffestb_R10012_ (t);
10674 case FFELEX_typeCLOSE_PAREN:
10675 f = ffestb_local_.format.f->u.root.parent;
10677 return (ffelexHandler) ffestb_R100114_;
10678 ffestb_local_.format.f = f->next;
10679 return (ffelexHandler) ffestb_R100111_;
10681 case FFELEX_typeCLOSE_ARRAY: /* "/)". */
10682 f = ffestt_formatlist_append (ffestb_local_.format.f);
10683 f->type = FFESTP_formattypeSLASH;
10684 f->t = ffelex_token_use (t);
10685 f->u.R1010.val.present = FALSE;
10686 f->u.R1010.val.rtexpr = FALSE;
10687 f->u.R1010.val.t = NULL;
10688 f->u.R1010.val.u.unsigned_val = 1;
10689 f = ffestb_local_.format.f->u.root.parent;
10691 return (ffelexHandler) ffestb_R100114_;
10692 ffestb_local_.format.f = f->next;
10693 return (ffelexHandler) ffestb_R100111_;
10695 case FFELEX_typeOPEN_ANGLE:
10696 case FFELEX_typeDOLLAR:
10697 case FFELEX_typeNUMBER:
10698 case FFELEX_typeOPEN_PAREN:
10699 case FFELEX_typeOPEN_ARRAY:
10700 case FFELEX_typeQUOTE:
10701 case FFELEX_typeAPOSTROPHE:
10702 case FFELEX_typeNAMES:
10703 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_COMMA, t);
10704 return (ffelexHandler) ffestb_R10012_ (t);
10706 case FFELEX_typeEOS:
10707 case FFELEX_typeSEMICOLON:
10708 ffesta_confirmed ();
10709 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t);
10710 for (f = ffestb_local_.format.f;
10711 f->u.root.parent != NULL;
10712 f = f->u.root.parent->next)
10714 ffestb_local_.format.f = f;
10715 return (ffelexHandler) ffestb_R100114_ (t);
10718 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10719 ffestt_formatlist_kill (ffestb_local_.format.f);
10720 return (ffelexHandler) ffelex_swallow_tokens (t,
10721 (ffelexHandler) ffesta_zero);
10725 /* ffestb_R100112_ -- COLON, COLONCOLON, SLASH, OPEN_ARRAY, or CONCAT
10727 return ffestb_R100112_; // to lexer
10729 Like _11_ except the COMMA is optional. */
10731 static ffelexHandler
10732 ffestb_R100112_ (ffelexToken t)
10734 ffesttFormatList f;
10736 switch (ffelex_token_type (t))
10738 case FFELEX_typeCOMMA:
10739 return (ffelexHandler) ffestb_R10012_;
10741 case FFELEX_typeCOLON:
10742 case FFELEX_typeCOLONCOLON:
10743 case FFELEX_typeSLASH:
10744 case FFELEX_typeCONCAT:
10745 case FFELEX_typeOPEN_ANGLE:
10746 case FFELEX_typeNAMES:
10747 case FFELEX_typeDOLLAR:
10748 case FFELEX_typeNUMBER:
10749 case FFELEX_typeOPEN_PAREN:
10750 case FFELEX_typeOPEN_ARRAY:
10751 case FFELEX_typeQUOTE:
10752 case FFELEX_typeAPOSTROPHE:
10753 case FFELEX_typePLUS:
10754 case FFELEX_typeMINUS:
10755 return (ffelexHandler) ffestb_R10012_ (t);
10757 case FFELEX_typeCLOSE_PAREN:
10758 f = ffestb_local_.format.f->u.root.parent;
10760 return (ffelexHandler) ffestb_R100114_;
10761 ffestb_local_.format.f = f->next;
10762 return (ffelexHandler) ffestb_R100111_;
10764 case FFELEX_typeCLOSE_ARRAY: /* "/)". */
10765 f = ffestt_formatlist_append (ffestb_local_.format.f);
10766 f->type = FFESTP_formattypeSLASH;
10767 f->t = ffelex_token_use (t);
10768 f->u.R1010.val.present = FALSE;
10769 f->u.R1010.val.rtexpr = FALSE;
10770 f->u.R1010.val.t = NULL;
10771 f->u.R1010.val.u.unsigned_val = 1;
10772 f = ffestb_local_.format.f->u.root.parent;
10774 return (ffelexHandler) ffestb_R100114_;
10775 ffestb_local_.format.f = f->next;
10776 return (ffelexHandler) ffestb_R100111_;
10778 case FFELEX_typeEOS:
10779 case FFELEX_typeSEMICOLON:
10780 ffesta_confirmed ();
10781 ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t);
10782 for (f = ffestb_local_.format.f;
10783 f->u.root.parent != NULL;
10784 f = f->u.root.parent->next)
10786 ffestb_local_.format.f = f;
10787 return (ffelexHandler) ffestb_R100114_ (t);
10790 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10791 ffestt_formatlist_kill (ffestb_local_.format.f);
10792 return (ffelexHandler) ffelex_swallow_tokens (t,
10793 (ffelexHandler) ffesta_zero);
10797 /* ffestb_R100113_ -- Handle CHARACTER token.
10799 return ffestb_R100113_; // to lexer
10801 Append the format item to the list, go to _11_. */
10803 static ffelexHandler
10804 ffestb_R100113_ (ffelexToken t)
10806 ffesttFormatList f;
10808 assert (ffelex_token_type (t) == FFELEX_typeCHARACTER);
10810 if (ffe_is_pedantic_not_90 () && (ffelex_token_length (t) == 0))
10812 ffebad_start (FFEBAD_NULL_CHAR_CONST);
10813 ffebad_here (0, ffelex_token_where_line (t),
10814 ffelex_token_where_column (t));
10818 f = ffestt_formatlist_append (ffestb_local_.format.f);
10819 f->type = FFESTP_formattypeR1016;
10820 f->t = ffelex_token_use (t);
10821 return (ffelexHandler) ffestb_R100111_;
10824 /* ffestb_R100114_ -- "FORMAT" OPEN_PAREN format-item-list CLOSE_PAREN
10826 return ffestb_R100114_; // to lexer
10828 Handle EOS/SEMICOLON or something else. */
10830 static ffelexHandler
10831 ffestb_R100114_ (ffelexToken t)
10833 ffelex_set_names_pure (FALSE);
10835 switch (ffelex_token_type (t))
10837 case FFELEX_typeEOS:
10838 case FFELEX_typeSEMICOLON:
10839 ffesta_confirmed ();
10840 if (!ffesta_is_inhibited () && !ffestb_local_.format.complained)
10841 ffestc_R1001 (ffestb_local_.format.f);
10842 ffestt_formatlist_kill (ffestb_local_.format.f);
10843 return (ffelexHandler) ffesta_zero (t);
10846 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10847 ffestt_formatlist_kill (ffestb_local_.format.f);
10848 return (ffelexHandler) ffelex_swallow_tokens (t,
10849 (ffelexHandler) ffesta_zero);
10853 /* ffestb_R100115_ -- OPEN_ANGLE expr
10855 (ffestb_R100115_) // to expression handler
10857 Handle expression prior to the edit descriptor. */
10859 static ffelexHandler
10860 ffestb_R100115_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
10862 switch (ffelex_token_type (t))
10864 case FFELEX_typeCLOSE_ANGLE:
10865 ffestb_local_.format.pre.present = TRUE;
10866 ffestb_local_.format.pre.rtexpr = TRUE;
10867 ffestb_local_.format.pre.u.expr = expr;
10868 ffelex_set_names_pure (TRUE);
10869 return (ffelexHandler) ffestb_R10014_;
10872 ffelex_token_kill (ffestb_local_.format.pre.t);
10873 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10874 ffestt_formatlist_kill (ffestb_local_.format.f);
10875 return (ffelexHandler) ffelex_swallow_tokens (t,
10876 (ffelexHandler) ffesta_zero);
10880 /* ffestb_R100116_ -- "[n]X" OPEN_ANGLE expr
10882 (ffestb_R100116_) // to expression handler
10884 Handle expression after the edit descriptor. */
10886 static ffelexHandler
10887 ffestb_R100116_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
10889 switch (ffelex_token_type (t))
10891 case FFELEX_typeCLOSE_ANGLE:
10892 ffestb_local_.format.post.present = TRUE;
10893 ffestb_local_.format.post.rtexpr = TRUE;
10894 ffestb_local_.format.post.u.expr = expr;
10895 ffelex_set_names_pure (TRUE);
10896 return (ffelexHandler) ffestb_R10016_;
10899 ffelex_token_kill (ffestb_local_.format.t);
10900 ffelex_token_kill (ffestb_local_.format.post.t);
10901 if (ffestb_local_.format.pre.present)
10902 ffelex_token_kill (ffestb_local_.format.pre.t);
10903 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10904 ffestt_formatlist_kill (ffestb_local_.format.f);
10905 return (ffelexHandler) ffelex_swallow_tokens (t,
10906 (ffelexHandler) ffesta_zero);
10910 /* ffestb_R100117_ -- "[n]X[n]." OPEN_ANGLE expr
10912 (ffestb_R100117_) // to expression handler
10914 Handle expression after the PERIOD. */
10916 static ffelexHandler
10917 ffestb_R100117_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
10919 switch (ffelex_token_type (t))
10921 case FFELEX_typeCLOSE_ANGLE:
10922 ffestb_local_.format.dot.present = TRUE;
10923 ffestb_local_.format.dot.rtexpr = TRUE;
10924 ffestb_local_.format.dot.u.expr = expr;
10925 ffelex_set_names_pure (TRUE);
10926 return (ffelexHandler) ffestb_R10018_;
10929 ffelex_token_kill (ffestb_local_.format.t);
10930 ffelex_token_kill (ffestb_local_.format.dot.t);
10931 if (ffestb_local_.format.pre.present)
10932 ffelex_token_kill (ffestb_local_.format.pre.t);
10933 if (ffestb_local_.format.post.present)
10934 ffelex_token_kill (ffestb_local_.format.post.t);
10935 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10936 ffestt_formatlist_kill (ffestb_local_.format.f);
10937 return (ffelexHandler) ffelex_swallow_tokens (t,
10938 (ffelexHandler) ffesta_zero);
10942 /* ffestb_R100118_ -- "[n]X[n].[n]E" OPEN_ANGLE expr
10944 (ffestb_R100118_) // to expression handler
10946 Handle expression after the "E". */
10948 static ffelexHandler
10949 ffestb_R100118_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
10951 switch (ffelex_token_type (t))
10953 case FFELEX_typeCLOSE_ANGLE:
10954 ffestb_local_.format.exp.present = TRUE;
10955 ffestb_local_.format.exp.rtexpr = TRUE;
10956 ffestb_local_.format.exp.u.expr = expr;
10957 ffelex_set_names_pure (TRUE);
10958 return (ffelexHandler) ffestb_R100110_;
10961 ffelex_token_kill (ffestb_local_.format.t);
10962 ffelex_token_kill (ffestb_local_.format.exp.t);
10963 if (ffestb_local_.format.pre.present)
10964 ffelex_token_kill (ffestb_local_.format.pre.t);
10965 if (ffestb_local_.format.post.present)
10966 ffelex_token_kill (ffestb_local_.format.post.t);
10967 if (ffestb_local_.format.dot.present)
10968 ffelex_token_kill (ffestb_local_.format.dot.t);
10969 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t);
10970 ffestt_formatlist_kill (ffestb_local_.format.f);
10971 return (ffelexHandler) ffelex_swallow_tokens (t,
10972 (ffelexHandler) ffesta_zero);
10976 /* ffestb_R1107 -- Parse the USE statement
10978 return ffestb_R1107; // to lexer
10980 Make sure the statement has a valid form for the USE statement.
10981 If it does, implement the statement. */
10985 ffestb_R1107 (ffelexToken t)
10990 switch (ffelex_token_type (ffesta_tokens[0]))
10992 case FFELEX_typeNAME:
10993 if (ffesta_first_kw != FFESTR_firstUSE)
10994 goto bad_0; /* :::::::::::::::::::: */
10995 switch (ffelex_token_type (t))
10997 case FFELEX_typeNAME:
11000 case FFELEX_typeEOS:
11001 case FFELEX_typeSEMICOLON:
11002 case FFELEX_typeCOMMA:
11003 case FFELEX_typeCOLONCOLON:
11004 ffesta_confirmed (); /* Error, but clearly intended. */
11005 goto bad_1; /* :::::::::::::::::::: */
11008 goto bad_0; /* :::::::::::::::::::: */
11010 ffesta_confirmed ();
11011 ffesta_tokens[1] = ffelex_token_use (t);
11012 return (ffelexHandler) ffestb_R11071_;
11014 case FFELEX_typeNAMES:
11015 if (ffesta_first_kw != FFESTR_firstUSE)
11016 goto bad_0; /* :::::::::::::::::::: */
11017 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlUSE);
11018 if (!ffesrc_is_name_init (*p))
11019 goto bad_i; /* :::::::::::::::::::: */
11020 switch (ffelex_token_type (t))
11022 case FFELEX_typeCOLONCOLON:
11023 ffesta_confirmed (); /* Error, but clearly intended. */
11024 goto bad_1; /* :::::::::::::::::::: */
11027 goto bad_1; /* :::::::::::::::::::: */
11029 case FFELEX_typeCOMMA:
11030 case FFELEX_typeEOS:
11031 case FFELEX_typeSEMICOLON:
11034 ffesta_confirmed ();
11036 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
11037 return (ffelexHandler) ffestb_R11071_ (t);
11040 goto bad_0; /* :::::::::::::::::::: */
11043 bad_0: /* :::::::::::::::::::: */
11044 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", ffesta_tokens[0]);
11045 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11047 bad_1: /* :::::::::::::::::::: */
11048 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11049 return (ffelexHandler) ffelex_swallow_tokens (t,
11050 (ffelexHandler) ffesta_zero); /* Invalid second token. */
11052 bad_i: /* :::::::::::::::::::: */
11053 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "USE", ffesta_tokens[0], i, t);
11054 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11057 /* ffestb_R11071_ -- "USE" NAME
11059 return ffestb_R11071_; // to lexer
11061 Make sure the statement has a valid form for the USE statement. If it
11062 does, implement the statement. */
11064 static ffelexHandler
11065 ffestb_R11071_ (ffelexToken t)
11067 switch (ffelex_token_type (t))
11069 case FFELEX_typeEOS:
11070 case FFELEX_typeSEMICOLON:
11071 if (!ffesta_is_inhibited ())
11073 ffestc_R1107_start (ffesta_tokens[1], FALSE);
11074 ffestc_R1107_finish ();
11076 ffelex_token_kill (ffesta_tokens[1]);
11077 return (ffelexHandler) ffesta_zero (t);
11079 case FFELEX_typeCOMMA:
11080 return (ffelexHandler) ffestb_R11072_;
11086 ffelex_token_kill (ffesta_tokens[1]);
11087 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11088 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11091 /* ffestb_R11072_ -- "USE" NAME COMMA
11093 return ffestb_R11072_; // to lexer
11095 Make sure the statement has a valid form for the USE statement. If it
11096 does, implement the statement. */
11098 static ffelexHandler
11099 ffestb_R11072_ (ffelexToken t)
11101 switch (ffelex_token_type (t))
11103 case FFELEX_typeNAME:
11104 ffesta_tokens[2] = ffelex_token_use (t);
11105 return (ffelexHandler) ffestb_R11073_;
11111 ffelex_token_kill (ffesta_tokens[1]);
11112 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11113 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11116 /* ffestb_R11073_ -- "USE" NAME COMMA NAME
11118 return ffestb_R11073_; // to lexer
11120 Make sure the statement has a valid form for the USE statement. If it
11121 does, implement the statement. */
11123 static ffelexHandler
11124 ffestb_R11073_ (ffelexToken t)
11126 switch (ffelex_token_type (t))
11128 case FFELEX_typeCOLON:
11129 if (ffestr_other (ffesta_tokens[2]) != FFESTR_otherONLY)
11131 if (!ffesta_is_inhibited ())
11132 ffestc_R1107_start (ffesta_tokens[1], TRUE);
11133 ffelex_token_kill (ffesta_tokens[1]);
11134 ffelex_token_kill (ffesta_tokens[2]);
11135 return (ffelexHandler) ffestb_R11074_;
11137 case FFELEX_typePOINTS:
11138 if (!ffesta_is_inhibited ())
11139 ffestc_R1107_start (ffesta_tokens[1], FALSE);
11140 ffelex_token_kill (ffesta_tokens[1]);
11141 ffesta_tokens[1] = ffesta_tokens[2];
11142 return (ffelexHandler) ffestb_R110711_;
11148 ffelex_token_kill (ffesta_tokens[1]);
11149 ffelex_token_kill (ffesta_tokens[2]);
11150 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11151 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11154 /* ffestb_R11074_ -- "USE" NAME COMMA "ONLY" COLON
11156 return ffestb_R11074_; // to lexer
11158 Make sure the statement has a valid form for the USE statement. If it
11159 does, implement the statement. */
11161 static ffelexHandler
11162 ffestb_R11074_ (ffelexToken t)
11164 switch (ffelex_token_type (t))
11166 case FFELEX_typeNAME:
11167 ffesta_tokens[1] = ffelex_token_use (t);
11168 return (ffelexHandler) ffestb_R11075_;
11170 case FFELEX_typeEOS:
11171 case FFELEX_typeSEMICOLON:
11172 if (!ffesta_is_inhibited ())
11173 ffestc_R1107_finish ();
11174 return (ffelexHandler) ffesta_zero (t);
11180 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11181 ffestc_R1107_finish ();
11182 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11185 /* ffestb_R11075_ -- "USE" NAME COMMA "ONLY" COLON NAME
11187 return ffestb_R11075_; // to lexer
11189 Make sure the statement has a valid form for the USE statement. If it
11190 does, implement the statement. */
11192 static ffelexHandler
11193 ffestb_R11075_ (ffelexToken t)
11195 switch (ffelex_token_type (t))
11197 case FFELEX_typeEOS:
11198 case FFELEX_typeSEMICOLON:
11199 if (!ffesta_is_inhibited ())
11201 ffestc_R1107_item (NULL, ffesta_tokens[1]);
11202 ffestc_R1107_finish ();
11204 ffelex_token_kill (ffesta_tokens[1]);
11205 return (ffelexHandler) ffesta_zero (t);
11207 case FFELEX_typeCOMMA:
11208 if (!ffesta_is_inhibited ())
11209 ffestc_R1107_item (NULL, ffesta_tokens[1]);
11210 ffelex_token_kill (ffesta_tokens[1]);
11211 return (ffelexHandler) ffestb_R11078_;
11213 case FFELEX_typePOINTS:
11214 return (ffelexHandler) ffestb_R11076_;
11220 ffelex_token_kill (ffesta_tokens[1]);
11221 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11222 ffestc_R1107_finish ();
11223 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11226 /* ffestb_R11076_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS
11228 return ffestb_R11076_; // to lexer
11230 Make sure the statement has a valid form for the USE statement. If it
11231 does, implement the statement. */
11233 static ffelexHandler
11234 ffestb_R11076_ (ffelexToken t)
11236 switch (ffelex_token_type (t))
11238 case FFELEX_typeNAME:
11239 if (!ffesta_is_inhibited ())
11240 ffestc_R1107_item (ffesta_tokens[1], t);
11241 ffelex_token_kill (ffesta_tokens[1]);
11242 return (ffelexHandler) ffestb_R11077_;
11248 ffelex_token_kill (ffesta_tokens[1]);
11249 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11250 ffestc_R1107_finish ();
11251 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11254 /* ffestb_R11077_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS NAME
11256 return ffestb_R11077_; // to lexer
11258 Make sure the statement has a valid form for the USE statement. If it
11259 does, implement the statement. */
11261 static ffelexHandler
11262 ffestb_R11077_ (ffelexToken t)
11264 switch (ffelex_token_type (t))
11266 case FFELEX_typeEOS:
11267 case FFELEX_typeSEMICOLON:
11268 if (!ffesta_is_inhibited ())
11269 ffestc_R1107_finish ();
11270 return (ffelexHandler) ffesta_zero (t);
11272 case FFELEX_typeCOMMA:
11273 return (ffelexHandler) ffestb_R11078_;
11279 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11280 ffestc_R1107_finish ();
11281 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11284 /* ffestb_R11078_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS NAME COMMA
11286 return ffestb_R11078_; // to lexer
11288 Make sure the statement has a valid form for the USE statement. If it
11289 does, implement the statement. */
11291 static ffelexHandler
11292 ffestb_R11078_ (ffelexToken t)
11294 switch (ffelex_token_type (t))
11296 case FFELEX_typeNAME:
11297 ffesta_tokens[1] = ffelex_token_use (t);
11298 return (ffelexHandler) ffestb_R11075_;
11304 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11305 ffestc_R1107_finish ();
11306 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11309 /* ffestb_R11079_ -- "USE" NAME COMMA
11311 return ffestb_R11079_; // to lexer
11313 Make sure the statement has a valid form for the USE statement. If it
11314 does, implement the statement. */
11316 static ffelexHandler
11317 ffestb_R11079_ (ffelexToken t)
11319 switch (ffelex_token_type (t))
11321 case FFELEX_typeNAME:
11322 ffesta_tokens[1] = ffelex_token_use (t);
11323 return (ffelexHandler) ffestb_R110710_;
11329 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11330 ffestc_R1107_finish ();
11331 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11334 /* ffestb_R110710_ -- "USE" NAME COMMA NAME
11336 return ffestb_R110710_; // to lexer
11338 Make sure the statement has a valid form for the USE statement. If it
11339 does, implement the statement. */
11341 static ffelexHandler
11342 ffestb_R110710_ (ffelexToken t)
11344 switch (ffelex_token_type (t))
11346 case FFELEX_typePOINTS:
11347 return (ffelexHandler) ffestb_R110711_;
11353 ffelex_token_kill (ffesta_tokens[1]);
11354 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11355 ffestc_R1107_finish ();
11356 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11359 /* ffestb_R110711_ -- "USE" NAME COMMA NAME POINTS
11361 return ffestb_R110711_; // to lexer
11363 Make sure the statement has a valid form for the USE statement. If it
11364 does, implement the statement. */
11366 static ffelexHandler
11367 ffestb_R110711_ (ffelexToken t)
11369 switch (ffelex_token_type (t))
11371 case FFELEX_typeNAME:
11372 if (!ffesta_is_inhibited ())
11373 ffestc_R1107_item (ffesta_tokens[1], t);
11374 ffelex_token_kill (ffesta_tokens[1]);
11375 return (ffelexHandler) ffestb_R110712_;
11381 ffelex_token_kill (ffesta_tokens[1]);
11382 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11383 ffestc_R1107_finish ();
11384 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11387 /* ffestb_R110712_ -- "USE" NAME COMMA NAME POINTS NAME
11389 return ffestb_R110712_; // to lexer
11391 Make sure the statement has a valid form for the USE statement. If it
11392 does, implement the statement. */
11394 static ffelexHandler
11395 ffestb_R110712_ (ffelexToken t)
11397 switch (ffelex_token_type (t))
11399 case FFELEX_typeEOS:
11400 case FFELEX_typeSEMICOLON:
11401 if (!ffesta_is_inhibited ())
11402 ffestc_R1107_finish ();
11403 return (ffelexHandler) ffesta_zero (t);
11405 case FFELEX_typeCOMMA:
11406 return (ffelexHandler) ffestb_R11079_;
11412 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t);
11413 ffestc_R1107_finish ();
11414 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11418 /* ffestb_R1202 -- Parse the INTERFACE statement
11420 return ffestb_R1202; // to lexer
11422 Make sure the statement has a valid form for the INTERFACE statement.
11423 If it does, implement the statement.
11426 Allow INTERFACE by itself; missed this
11427 valid form when originally doing syntactic analysis code. */
11431 ffestb_R1202 (ffelexToken t)
11436 switch (ffelex_token_type (ffesta_tokens[0]))
11438 case FFELEX_typeNAME:
11439 if (ffesta_first_kw != FFESTR_firstINTERFACE)
11440 goto bad_0; /* :::::::::::::::::::: */
11441 switch (ffelex_token_type (t))
11443 case FFELEX_typeNAME:
11446 case FFELEX_typeEOS:
11447 case FFELEX_typeSEMICOLON:
11448 ffesta_confirmed ();
11449 if (!ffesta_is_inhibited ())
11450 ffestc_R1202 (FFESTP_definedoperatorNone, NULL);
11451 return (ffelexHandler) ffesta_zero (t);
11453 case FFELEX_typeCOMMA:
11454 case FFELEX_typeCOLONCOLON:
11455 ffesta_confirmed (); /* Error, but clearly intended. */
11456 goto bad_1; /* :::::::::::::::::::: */
11459 goto bad_1; /* :::::::::::::::::::: */
11462 ffesta_confirmed ();
11463 switch (ffesta_second_kw)
11465 case FFESTR_secondOPERATOR:
11466 ffestb_local_.interface.operator = FFESTP_definedoperatorOPERATOR;
11469 case FFESTR_secondASSIGNMENT:
11470 ffestb_local_.interface.operator = FFESTP_definedoperatorASSIGNMENT;
11474 ffestb_local_.interface.operator = FFESTP_definedoperatorNone;
11477 ffesta_tokens[1] = ffelex_token_use (t);
11478 return (ffelexHandler) ffestb_R12021_;
11480 case FFELEX_typeNAMES:
11481 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlINTERFACE);
11482 switch (ffesta_first_kw)
11484 case FFESTR_firstINTERFACEOPERATOR:
11485 if (*(ffelex_token_text (ffesta_tokens[0])
11486 + FFESTR_firstlINTERFACEOPERATOR) == '\0')
11487 ffestb_local_.interface.operator
11488 = FFESTP_definedoperatorOPERATOR;
11491 case FFESTR_firstINTERFACEASSGNMNT:
11492 if (*(ffelex_token_text (ffesta_tokens[0])
11493 + FFESTR_firstlINTERFACEASSGNMNT) == '\0')
11494 ffestb_local_.interface.operator
11495 = FFESTP_definedoperatorASSIGNMENT;
11498 case FFESTR_firstINTERFACE:
11499 ffestb_local_.interface.operator = FFESTP_definedoperatorNone;
11503 goto bad_0; /* :::::::::::::::::::: */
11505 switch (ffelex_token_type (t))
11507 case FFELEX_typeCOMMA:
11508 case FFELEX_typeCOLONCOLON:
11509 ffesta_confirmed (); /* Error, but clearly intended. */
11510 goto bad_1; /* :::::::::::::::::::: */
11513 goto bad_1; /* :::::::::::::::::::: */
11515 case FFELEX_typeOPEN_PAREN:
11516 case FFELEX_typeOPEN_ARRAY: /* Sigh. */
11519 case FFELEX_typeEOS:
11520 case FFELEX_typeSEMICOLON:
11521 ffesta_confirmed ();
11524 if (!ffesta_is_inhibited ())
11525 ffestc_R1202 (FFESTP_definedoperatorNone, NULL);
11526 return (ffelexHandler) ffesta_zero (t);
11530 if (!ffesrc_is_name_init (*p))
11531 goto bad_i; /* :::::::::::::::::::: */
11532 ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
11533 return (ffelexHandler) ffestb_R12021_ (t);
11536 goto bad_0; /* :::::::::::::::::::: */
11539 bad_0: /* :::::::::::::::::::: */
11540 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", ffesta_tokens[0]);
11541 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11543 bad_1: /* :::::::::::::::::::: */
11544 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11545 return (ffelexHandler) ffelex_swallow_tokens (t,
11546 (ffelexHandler) ffesta_zero); /* Invalid second token. */
11548 bad_i: /* :::::::::::::::::::: */
11549 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "INTERFACE", ffesta_tokens[0], i, t);
11550 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11553 /* ffestb_R12021_ -- "INTERFACE" NAME
11555 return ffestb_R12021_; // to lexer
11557 Make sure the statement has a valid form for the INTERFACE statement. If
11558 it does, implement the statement. */
11560 static ffelexHandler
11561 ffestb_R12021_ (ffelexToken t)
11563 ffestb_local_.interface.slash = TRUE; /* Slash follows open paren. */
11565 switch (ffelex_token_type (t))
11567 case FFELEX_typeEOS:
11568 case FFELEX_typeSEMICOLON:
11569 if (!ffesta_is_inhibited ())
11570 ffestc_R1202 (FFESTP_definedoperatorNone, ffesta_tokens[1]);
11571 ffelex_token_kill (ffesta_tokens[1]);
11572 return (ffelexHandler) ffesta_zero (t);
11574 case FFELEX_typeOPEN_PAREN:
11575 ffestb_local_.interface.slash = FALSE; /* Slash doesn't follow. */
11576 /* Fall through. */
11577 case FFELEX_typeOPEN_ARRAY:
11578 switch (ffestb_local_.interface.operator)
11580 case FFESTP_definedoperatorNone:
11583 case FFESTP_definedoperatorOPERATOR:
11584 ffestb_local_.interface.assignment = FALSE;
11585 return (ffelexHandler) ffestb_R12022_;
11587 case FFESTP_definedoperatorASSIGNMENT:
11588 ffestb_local_.interface.assignment = TRUE;
11589 return (ffelexHandler) ffestb_R12022_;
11596 case FFELEX_typeCOMMA:
11597 case FFELEX_typeCOLONCOLON:
11598 ffesta_confirmed (); /* Error, but clearly intended. */
11605 ffelex_token_kill (ffesta_tokens[1]);
11606 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11607 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11610 /* ffestb_R12022_ -- "INTERFACE" "OPERATOR/ASSIGNMENT" OPEN_PAREN
11612 return ffestb_R12022_; // to lexer
11614 Make sure the statement has a valid form for the INTERFACE statement. If
11615 it does, implement the statement. */
11617 static ffelexHandler
11618 ffestb_R12022_ (ffelexToken t)
11620 ffesta_tokens[2] = ffelex_token_use (t);
11622 switch (ffelex_token_type (t))
11624 case FFELEX_typePERIOD:
11625 if (ffestb_local_.interface.slash)
11627 return (ffelexHandler) ffestb_R12023_;
11629 case FFELEX_typePOWER:
11630 if (ffestb_local_.interface.slash)
11632 ffestb_local_.interface.operator = FFESTP_definedoperatorPOWER;
11633 return (ffelexHandler) ffestb_R12025_;
11635 case FFELEX_typeASTERISK:
11636 if (ffestb_local_.interface.slash)
11638 ffestb_local_.interface.operator = FFESTP_definedoperatorMULT;
11639 return (ffelexHandler) ffestb_R12025_;
11641 case FFELEX_typePLUS:
11642 if (ffestb_local_.interface.slash)
11644 ffestb_local_.interface.operator = FFESTP_definedoperatorADD;
11645 return (ffelexHandler) ffestb_R12025_;
11647 case FFELEX_typeCONCAT:
11648 if (ffestb_local_.interface.slash)
11650 ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT;
11651 return (ffelexHandler) ffestb_R12025_;
11653 case FFELEX_typeSLASH:
11654 if (ffestb_local_.interface.slash)
11656 ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT;
11657 return (ffelexHandler) ffestb_R12025_;
11659 ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE;
11660 return (ffelexHandler) ffestb_R12025_;
11662 case FFELEX_typeMINUS:
11663 if (ffestb_local_.interface.slash)
11665 ffestb_local_.interface.operator = FFESTP_definedoperatorSUBTRACT;
11666 return (ffelexHandler) ffestb_R12025_;
11668 case FFELEX_typeREL_EQ:
11669 if (ffestb_local_.interface.slash)
11671 ffestb_local_.interface.operator = FFESTP_definedoperatorEQ;
11672 return (ffelexHandler) ffestb_R12025_;
11674 case FFELEX_typeREL_NE:
11675 if (ffestb_local_.interface.slash)
11677 ffestb_local_.interface.operator = FFESTP_definedoperatorNE;
11678 return (ffelexHandler) ffestb_R12025_;
11680 case FFELEX_typeOPEN_ANGLE:
11681 if (ffestb_local_.interface.slash)
11683 ffestb_local_.interface.operator = FFESTP_definedoperatorLT;
11684 return (ffelexHandler) ffestb_R12025_;
11686 case FFELEX_typeREL_LE:
11687 if (ffestb_local_.interface.slash)
11689 ffestb_local_.interface.operator = FFESTP_definedoperatorLE;
11690 return (ffelexHandler) ffestb_R12025_;
11692 case FFELEX_typeCLOSE_ANGLE:
11693 if (ffestb_local_.interface.slash)
11695 ffestb_local_.interface.operator = FFESTP_definedoperatorGT;
11696 return (ffelexHandler) ffestb_R12025_;
11698 case FFELEX_typeREL_GE:
11699 if (ffestb_local_.interface.slash)
11701 ffestb_local_.interface.operator = FFESTP_definedoperatorGE;
11702 return (ffelexHandler) ffestb_R12025_;
11704 case FFELEX_typeEQUALS:
11705 if (ffestb_local_.interface.slash)
11707 ffestb_local_.interface.operator = FFESTP_definedoperatorNE;
11708 return (ffelexHandler) ffestb_R12025_;
11710 ffestb_local_.interface.operator = FFESTP_definedoperatorASSIGNMENT;
11711 return (ffelexHandler) ffestb_R12025_;
11713 case FFELEX_typeCLOSE_ARRAY:
11714 if (!ffestb_local_.interface.slash)
11716 ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE;
11717 return (ffelexHandler) ffestb_R12026_;
11719 ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT;
11720 return (ffelexHandler) ffestb_R12026_;
11722 case FFELEX_typeCLOSE_PAREN:
11723 if (!ffestb_local_.interface.slash)
11725 ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE;
11726 return (ffelexHandler) ffestb_R12026_;
11732 ffelex_token_kill (ffesta_tokens[1]);
11733 ffelex_token_kill (ffesta_tokens[2]);
11734 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11735 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11738 /* ffestb_R12023_ -- "INTERFACE" NAME OPEN_PAREN PERIOD
11740 return ffestb_R12023_; // to lexer
11742 Make sure the statement has a valid form for the INTERFACE statement. If
11743 it does, implement the statement. */
11745 static ffelexHandler
11746 ffestb_R12023_ (ffelexToken t)
11748 switch (ffelex_token_type (t))
11750 case FFELEX_typeNAME:
11751 ffelex_token_kill (ffesta_tokens[2]);
11752 ffesta_tokens[2] = ffelex_token_use (t);
11753 return (ffelexHandler) ffestb_R12024_;
11759 ffelex_token_kill (ffesta_tokens[1]);
11760 ffelex_token_kill (ffesta_tokens[2]);
11761 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11762 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11765 /* ffestb_R12024_ -- "INTERFACE" NAME OPEN_PAREN PERIOD NAME
11767 return ffestb_R12024_; // to lexer
11769 Make sure the statement has a valid form for the INTERFACE statement. If
11770 it does, implement the statement. */
11772 static ffelexHandler
11773 ffestb_R12024_ (ffelexToken t)
11775 switch (ffelex_token_type (t))
11777 case FFELEX_typePERIOD:
11778 return (ffelexHandler) ffestb_R12025_;
11784 ffelex_token_kill (ffesta_tokens[1]);
11785 ffelex_token_kill (ffesta_tokens[2]);
11786 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11787 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11790 /* ffestb_R12025_ -- "INTERFACE" NAME OPEN_PAREN operator
11792 return ffestb_R12025_; // to lexer
11794 Make sure the statement has a valid form for the INTERFACE statement. If
11795 it does, implement the statement. */
11797 static ffelexHandler
11798 ffestb_R12025_ (ffelexToken t)
11800 switch (ffelex_token_type (t))
11802 case FFELEX_typeCLOSE_PAREN:
11803 return (ffelexHandler) ffestb_R12026_;
11809 ffelex_token_kill (ffesta_tokens[1]);
11810 ffelex_token_kill (ffesta_tokens[2]);
11811 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11812 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11815 /* ffestb_R12026_ -- "INTERFACE" NAME OPEN_PAREN operator CLOSE_PAREN
11817 return ffestb_R12026_; // to lexer
11819 Make sure the statement has a valid form for the INTERFACE statement. If
11820 it does, implement the statement. */
11822 static ffelexHandler
11823 ffestb_R12026_ (ffelexToken t)
11827 switch (ffelex_token_type (t))
11829 case FFELEX_typeEOS:
11830 case FFELEX_typeSEMICOLON:
11831 ffesta_confirmed ();
11832 if (ffestb_local_.interface.assignment
11833 && (ffestb_local_.interface.operator
11834 != FFESTP_definedoperatorASSIGNMENT))
11836 ffebad_start (FFEBAD_INTERFACE_ASSIGNMENT);
11837 ffebad_here (0, ffelex_token_where_line (ffesta_tokens[1]),
11838 ffelex_token_where_column (ffesta_tokens[1]));
11839 ffebad_here (1, ffelex_token_where_line (ffesta_tokens[2]),
11840 ffelex_token_where_column (ffesta_tokens[2]));
11843 switch (ffelex_token_type (ffesta_tokens[2]))
11845 case FFELEX_typeNAME:
11846 switch (ffestr_other (ffesta_tokens[2]))
11848 case FFESTR_otherNOT:
11849 if (!ffesta_is_inhibited ())
11850 ffestc_R1202 (FFESTP_definedoperatorNOT, NULL);
11853 case FFESTR_otherAND:
11854 if (!ffesta_is_inhibited ())
11855 ffestc_R1202 (FFESTP_definedoperatorAND, NULL);
11858 case FFESTR_otherOR:
11859 if (!ffesta_is_inhibited ())
11860 ffestc_R1202 (FFESTP_definedoperatorOR, NULL);
11863 case FFESTR_otherEQV:
11864 if (!ffesta_is_inhibited ())
11865 ffestc_R1202 (FFESTP_definedoperatorEQV, NULL);
11868 case FFESTR_otherNEQV:
11869 if (!ffesta_is_inhibited ())
11870 ffestc_R1202 (FFESTP_definedoperatorNEQV, NULL);
11873 case FFESTR_otherEQ:
11874 if (!ffesta_is_inhibited ())
11875 ffestc_R1202 (FFESTP_definedoperatorEQ, NULL);
11878 case FFESTR_otherNE:
11879 if (!ffesta_is_inhibited ())
11880 ffestc_R1202 (FFESTP_definedoperatorNE, NULL);
11883 case FFESTR_otherLT:
11884 if (!ffesta_is_inhibited ())
11885 ffestc_R1202 (FFESTP_definedoperatorLT, NULL);
11888 case FFESTR_otherLE:
11889 if (!ffesta_is_inhibited ())
11890 ffestc_R1202 (FFESTP_definedoperatorLE, NULL);
11893 case FFESTR_otherGT:
11894 if (!ffesta_is_inhibited ())
11895 ffestc_R1202 (FFESTP_definedoperatorGT, NULL);
11898 case FFESTR_otherGE:
11899 if (!ffesta_is_inhibited ())
11900 ffestc_R1202 (FFESTP_definedoperatorGE, NULL);
11904 for (p = ffelex_token_text (ffesta_tokens[2]); *p != '\0'; ++p)
11908 ffelex_token_kill (ffesta_tokens[1]);
11909 ffelex_token_kill (ffesta_tokens[2]);
11910 ffesta_ffebad_1t (FFEBAD_INTERFACE_NONLETTER,
11912 return (ffelexHandler) ffelex_swallow_tokens (t,
11913 (ffelexHandler) ffesta_zero);
11916 if (!ffesta_is_inhibited ())
11917 ffestc_R1202 (FFESTP_definedoperatorOPERATOR,
11922 case FFELEX_typeEQUALS:
11923 if (!ffestb_local_.interface.assignment
11924 && (ffestb_local_.interface.operator
11925 == FFESTP_definedoperatorASSIGNMENT))
11927 ffebad_start (FFEBAD_INTERFACE_OPERATOR);
11928 ffebad_here (0, ffelex_token_where_line (ffesta_tokens[1]),
11929 ffelex_token_where_column (ffesta_tokens[1]));
11930 ffebad_here (1, ffelex_token_where_line (ffesta_tokens[2]),
11931 ffelex_token_where_column (ffesta_tokens[2]));
11934 if (!ffesta_is_inhibited ())
11935 ffestc_R1202 (ffestb_local_.interface.operator, NULL);
11939 if (!ffesta_is_inhibited ())
11940 ffestc_R1202 (ffestb_local_.interface.operator, NULL);
11942 ffelex_token_kill (ffesta_tokens[1]);
11943 ffelex_token_kill (ffesta_tokens[2]);
11944 return (ffelexHandler) ffesta_zero (t);
11950 ffelex_token_kill (ffesta_tokens[1]);
11951 ffelex_token_kill (ffesta_tokens[2]);
11952 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t);
11953 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
11957 /* ffestb_S3P4 -- Parse the INCLUDE line
11959 return ffestb_S3P4; // to lexer
11961 Make sure the statement has a valid form for the INCLUDE line. If it
11962 does, implement the statement. */
11965 ffestb_S3P4 (ffelexToken t)
11969 ffelexHandler next;
11973 switch (ffelex_token_type (ffesta_tokens[0]))
11975 case FFELEX_typeNAME:
11976 if (ffesta_first_kw != FFESTR_firstINCLUDE)
11977 goto bad_0; /* :::::::::::::::::::: */
11978 switch (ffelex_token_type (t))
11980 case FFELEX_typeNUMBER:
11981 case FFELEX_typeAPOSTROPHE:
11982 case FFELEX_typeQUOTE:
11986 goto bad_1; /* :::::::::::::::::::: */
11988 ffesta_confirmed ();
11989 return (ffelexHandler) (*((ffelexHandler)
11990 ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextINCLUDE,
11991 (ffeexprCallback) ffestb_S3P41_)))
11994 case FFELEX_typeNAMES:
11995 if (ffesta_first_kw != FFESTR_firstINCLUDE)
11996 goto bad_0; /* :::::::::::::::::::: */
11997 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlINCLUDE);
11998 switch (ffelex_token_type (t))
12001 goto bad_1; /* :::::::::::::::::::: */
12003 case FFELEX_typeAPOSTROPHE:
12004 case FFELEX_typeQUOTE:
12007 ffesta_confirmed ();
12009 return (ffelexHandler) (*((ffelexHandler)
12010 ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextINCLUDE,
12011 (ffeexprCallback) ffestb_S3P41_)))
12014 goto bad_i; /* :::::::::::::::::::: */
12015 nt = ffelex_token_number_from_names (ffesta_tokens[0], i);
12016 p += ffelex_token_length (nt);
12017 i += ffelex_token_length (nt);
12018 if ((*p != '_') || (++i, *++p != '\0'))
12020 ffelex_token_kill (nt);
12021 goto bad_i; /* :::::::::::::::::::: */
12023 ut = ffelex_token_uscore_from_names (ffesta_tokens[0], i - 1);
12024 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs
12025 (ffesta_output_pool, FFEEXPR_contextINCLUDE,
12026 (ffeexprCallback) ffestb_S3P41_)))
12028 ffelex_token_kill (nt);
12029 next = (ffelexHandler) (*next) (ut);
12030 ffelex_token_kill (ut);
12031 return (ffelexHandler) (*next) (t);
12034 goto bad_0; /* :::::::::::::::::::: */
12037 bad_0: /* :::::::::::::::::::: */
12038 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", ffesta_tokens[0]);
12039 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12041 bad_1: /* :::::::::::::::::::: */
12042 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", t);
12043 return (ffelexHandler) ffelex_swallow_tokens (t,
12044 (ffelexHandler) ffesta_zero); /* Invalid second token. */
12046 bad_i: /* :::::::::::::::::::: */
12047 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "INCLUDE", ffesta_tokens[0], i, t);
12048 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12051 /* ffestb_S3P41_ -- "INCLUDE" [NUMBER "_"] expr
12053 (ffestb_S3P41_) // to expression handler
12055 Make sure the next token is an EOS, but not a SEMICOLON. */
12057 static ffelexHandler
12058 ffestb_S3P41_ (ffelexToken ft, ffebld expr, ffelexToken t)
12060 switch (ffelex_token_type (t))
12062 case FFELEX_typeEOS:
12063 case FFELEX_typeSEMICOLON:
12066 if (!ffesta_is_inhibited ())
12068 if (ffe_is_pedantic ()
12069 && ((ffelex_token_type (t) == FFELEX_typeSEMICOLON)
12070 || ffesta_line_has_semicolons))
12072 ffebad_start_msg ("INCLUDE at %0 not the only statement on the source line", FFEBAD_severityWARNING);
12073 ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
12074 ffelex_token_where_column (ffesta_tokens[0]));
12077 ffestc_S3P4 (expr, ft);
12079 return (ffelexHandler) ffesta_zero (t);
12082 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", t);
12086 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12089 /* ffestb_V012 -- Parse the MAP statement
12091 return ffestb_V012; // to lexer
12093 Make sure the statement has a valid form for the MAP statement. If
12094 it does, implement the statement. */
12098 ffestb_V012 (ffelexToken t)
12103 switch (ffelex_token_type (ffesta_tokens[0]))
12105 case FFELEX_typeNAME:
12106 if (ffesta_first_kw != FFESTR_firstMAP)
12107 goto bad_0; /* :::::::::::::::::::: */
12110 case FFELEX_typeNAMES:
12111 if (ffesta_first_kw != FFESTR_firstMAP)
12112 goto bad_0; /* :::::::::::::::::::: */
12113 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlMAP)
12115 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlMAP);
12116 goto bad_i; /* :::::::::::::::::::: */
12121 goto bad_0; /* :::::::::::::::::::: */
12124 switch (ffelex_token_type (t))
12126 case FFELEX_typeEOS:
12127 case FFELEX_typeSEMICOLON:
12128 ffesta_confirmed ();
12129 if (!ffesta_is_inhibited ())
12131 return (ffelexHandler) ffesta_zero (t);
12133 case FFELEX_typeCOMMA:
12134 case FFELEX_typeCOLONCOLON:
12135 ffesta_confirmed (); /* Error, but clearly intended. */
12136 goto bad_1; /* :::::::::::::::::::: */
12139 goto bad_1; /* :::::::::::::::::::: */
12142 bad_0: /* :::::::::::::::::::: */
12143 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MAP", ffesta_tokens[0]);
12144 return (ffelexHandler) ffelex_swallow_tokens (t,
12145 (ffelexHandler) ffesta_zero); /* Invalid first token. */
12147 bad_1: /* :::::::::::::::::::: */
12148 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MAP", t);
12149 return (ffelexHandler) ffelex_swallow_tokens (t,
12150 (ffelexHandler) ffesta_zero); /* Invalid second token. */
12152 bad_i: /* :::::::::::::::::::: */
12153 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "MAP", ffesta_tokens[0], i, t);
12154 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12158 /* ffestb_V014 -- Parse the VOLATILE statement
12160 return ffestb_V014; // to lexer
12162 Make sure the statement has a valid form for the VOLATILE statement. If it
12163 does, implement the statement. */
12166 ffestb_V014 (ffelexToken t)
12171 ffelexHandler next;
12173 switch (ffelex_token_type (ffesta_tokens[0]))
12175 case FFELEX_typeNAME:
12176 if (ffesta_first_kw != FFESTR_firstVOLATILE)
12177 goto bad_0; /* :::::::::::::::::::: */
12178 switch (ffelex_token_type (t))
12180 case FFELEX_typeEOS:
12181 case FFELEX_typeSEMICOLON:
12182 case FFELEX_typeCOMMA:
12183 ffesta_confirmed (); /* Error, but clearly intended. */
12184 goto bad_1; /* :::::::::::::::::::: */
12187 goto bad_1; /* :::::::::::::::::::: */
12189 case FFELEX_typeNAME:
12190 case FFELEX_typeSLASH:
12191 ffesta_confirmed ();
12192 if (!ffesta_is_inhibited ())
12193 ffestc_V014_start ();
12194 return (ffelexHandler) ffestb_V0141_ (t);
12196 case FFELEX_typeCOLONCOLON:
12197 ffesta_confirmed ();
12198 if (!ffesta_is_inhibited ())
12199 ffestc_V014_start ();
12200 return (ffelexHandler) ffestb_V0141_;
12203 case FFELEX_typeNAMES:
12204 if (ffesta_first_kw != FFESTR_firstVOLATILE)
12205 goto bad_0; /* :::::::::::::::::::: */
12206 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlVOLATILE);
12207 switch (ffelex_token_type (t))
12210 goto bad_1; /* :::::::::::::::::::: */
12212 case FFELEX_typeCOMMA:
12213 case FFELEX_typeEOS:
12214 case FFELEX_typeSEMICOLON:
12215 ffesta_confirmed ();
12218 case FFELEX_typeSLASH:
12219 ffesta_confirmed ();
12221 goto bad_i; /* :::::::::::::::::::: */
12222 if (!ffesta_is_inhibited ())
12223 ffestc_V014_start ();
12224 return (ffelexHandler) ffestb_V0141_ (t);
12226 case FFELEX_typeCOLONCOLON:
12227 ffesta_confirmed ();
12229 goto bad_i; /* :::::::::::::::::::: */
12230 if (!ffesta_is_inhibited ())
12231 ffestc_V014_start ();
12232 return (ffelexHandler) ffestb_V0141_;
12235 /* Here, we have at least one char after "VOLATILE" and t is COMMA or
12238 if (!ffesrc_is_name_init (*p))
12239 goto bad_i; /* :::::::::::::::::::: */
12240 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
12241 if (!ffesta_is_inhibited ())
12242 ffestc_V014_start ();
12243 next = (ffelexHandler) ffestb_V0141_ (nt);
12244 ffelex_token_kill (nt);
12245 return (ffelexHandler) (*next) (t);
12248 goto bad_0; /* :::::::::::::::::::: */
12251 bad_0: /* :::::::::::::::::::: */
12252 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", ffesta_tokens[0]);
12253 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12255 bad_1: /* :::::::::::::::::::: */
12256 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12257 return (ffelexHandler) ffelex_swallow_tokens (t,
12258 (ffelexHandler) ffesta_zero); /* Invalid second token. */
12260 bad_i: /* :::::::::::::::::::: */
12261 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "VOLATILE", ffesta_tokens[0], i, t);
12262 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12265 /* ffestb_V0141_ -- "VOLATILE" [COLONCOLON]
12267 return ffestb_V0141_; // to lexer
12269 Handle NAME or SLASH. */
12271 static ffelexHandler
12272 ffestb_V0141_ (ffelexToken t)
12274 switch (ffelex_token_type (t))
12276 case FFELEX_typeNAME:
12277 ffestb_local_.V014.is_cblock = FALSE;
12278 ffesta_tokens[1] = ffelex_token_use (t);
12279 return (ffelexHandler) ffestb_V0144_;
12281 case FFELEX_typeSLASH:
12282 ffestb_local_.V014.is_cblock = TRUE;
12283 return (ffelexHandler) ffestb_V0142_;
12286 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12290 if (!ffesta_is_inhibited ())
12291 ffestc_V014_finish ();
12292 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12295 /* ffestb_V0142_ -- "VOLATILE" [COLONCOLON] SLASH
12297 return ffestb_V0142_; // to lexer
12301 static ffelexHandler
12302 ffestb_V0142_ (ffelexToken t)
12304 switch (ffelex_token_type (t))
12306 case FFELEX_typeNAME:
12307 ffesta_tokens[1] = ffelex_token_use (t);
12308 return (ffelexHandler) ffestb_V0143_;
12311 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12315 if (!ffesta_is_inhibited ())
12316 ffestc_V014_finish ();
12317 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12320 /* ffestb_V0143_ -- "VOLATILE" [COLONCOLON] SLASH NAME
12322 return ffestb_V0143_; // to lexer
12326 static ffelexHandler
12327 ffestb_V0143_ (ffelexToken t)
12329 switch (ffelex_token_type (t))
12331 case FFELEX_typeSLASH:
12332 return (ffelexHandler) ffestb_V0144_;
12335 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12339 if (!ffesta_is_inhibited ())
12340 ffestc_V014_finish ();
12341 ffelex_token_kill (ffesta_tokens[1]);
12342 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12345 /* ffestb_V0144_ -- "VOLATILE" [COLONCOLON] R523
12347 return ffestb_V0144_; // to lexer
12349 Handle COMMA or EOS/SEMICOLON. */
12351 static ffelexHandler
12352 ffestb_V0144_ (ffelexToken t)
12354 switch (ffelex_token_type (t))
12356 case FFELEX_typeCOMMA:
12357 if (!ffesta_is_inhibited ())
12359 if (ffestb_local_.V014.is_cblock)
12360 ffestc_V014_item_cblock (ffesta_tokens[1]);
12362 ffestc_V014_item_object (ffesta_tokens[1]);
12364 ffelex_token_kill (ffesta_tokens[1]);
12365 return (ffelexHandler) ffestb_V0141_;
12367 case FFELEX_typeEOS:
12368 case FFELEX_typeSEMICOLON:
12369 if (!ffesta_is_inhibited ())
12371 if (ffestb_local_.V014.is_cblock)
12372 ffestc_V014_item_cblock (ffesta_tokens[1]);
12374 ffestc_V014_item_object (ffesta_tokens[1]);
12375 ffestc_V014_finish ();
12377 ffelex_token_kill (ffesta_tokens[1]);
12378 return (ffelexHandler) ffesta_zero (t);
12381 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t);
12385 if (!ffesta_is_inhibited ())
12386 ffestc_V014_finish ();
12387 ffelex_token_kill (ffesta_tokens[1]);
12388 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12391 /* ffestb_V025 -- Parse the DEFINEFILE statement
12393 return ffestb_V025; // to lexer
12395 Make sure the statement has a valid form for the DEFINEFILE statement.
12396 If it does, implement the statement. */
12400 ffestb_V025 (ffelexToken t)
12405 ffelexHandler next;
12407 ffestb_local_.V025.started = FALSE;
12408 switch (ffelex_token_type (ffesta_tokens[0]))
12410 case FFELEX_typeNAME:
12411 switch (ffesta_first_kw)
12413 case FFESTR_firstDEFINE:
12414 if ((ffelex_token_type (t) != FFELEX_typeNAME)
12415 || (ffesta_second_kw != FFESTR_secondFILE))
12416 goto bad_1; /* :::::::::::::::::::: */
12417 ffesta_confirmed ();
12418 return (ffelexHandler) ffestb_V0251_;
12420 case FFESTR_firstDEFINEFILE:
12421 return (ffelexHandler) ffestb_V0251_ (t);
12424 goto bad_0; /* :::::::::::::::::::: */
12427 case FFELEX_typeNAMES:
12428 if (ffesta_first_kw != FFESTR_firstDEFINEFILE)
12429 goto bad_0; /* :::::::::::::::::::: */
12430 switch (ffelex_token_type (t))
12432 case FFELEX_typeCOMMA:
12433 case FFELEX_typeEOS:
12434 case FFELEX_typeSEMICOLON:
12435 case FFELEX_typeCOLONCOLON:
12436 ffesta_confirmed (); /* Error, but clearly intended. */
12437 goto bad_1; /* :::::::::::::::::::: */
12440 goto bad_1; /* :::::::::::::::::::: */
12442 case FFELEX_typeOPEN_PAREN:
12445 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDEFINEFILE);
12447 nt = ffelex_token_number_from_names (ffesta_tokens[0], i);
12448 else if (ffesrc_is_name_init (*p))
12449 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
12451 goto bad_i; /* :::::::::::::::::::: */
12452 next = (ffelexHandler) ffestb_V0251_ (nt);
12453 ffelex_token_kill (nt);
12454 return (ffelexHandler) (*next) (t);
12457 goto bad_0; /* :::::::::::::::::::: */
12460 bad_0: /* :::::::::::::::::::: */
12461 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", ffesta_tokens[0]);
12462 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12464 bad_1: /* :::::::::::::::::::: */
12465 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12466 return (ffelexHandler) ffelex_swallow_tokens (t,
12467 (ffelexHandler) ffesta_zero); /* Invalid second token. */
12469 bad_i: /* :::::::::::::::::::: */
12470 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", ffesta_tokens[0], i, t);
12471 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12474 /* ffestb_V0251_ -- "DEFINEFILE" or "DEFINE" "FILE"
12476 return ffestb_V0251_; // to lexer
12478 Make sure the statement has a valid form for the DEFINEFILE statement. If it
12479 does, implement the statement. */
12481 static ffelexHandler
12482 ffestb_V0251_ (ffelexToken t)
12484 switch (ffelex_token_type (t))
12486 case FFELEX_typeNAME:
12487 case FFELEX_typeNUMBER:
12488 if (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME)
12489 ffesta_confirmed ();
12490 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
12491 FFEEXPR_contextFILEUNIT_DF, (ffeexprCallback) ffestb_V0252_)))
12494 case FFELEX_typeEOS:
12495 case FFELEX_typeSEMICOLON:
12496 case FFELEX_typeCOMMA:
12497 case FFELEX_typeCOLONCOLON:
12498 ffesta_confirmed (); /* Error, but clearly intended. */
12505 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12506 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12509 /* ffestb_V0252_ -- "DEFINEFILE" expr
12511 (ffestb_V0252_) // to expression handler
12513 Make sure the statement has a valid form for the DEFINEFILE statement. If
12514 it does, implement the statement. */
12516 static ffelexHandler
12517 ffestb_V0252_ (ffelexToken ft, ffebld expr, ffelexToken t)
12519 switch (ffelex_token_type (t))
12521 case FFELEX_typeOPEN_PAREN:
12522 ffestb_local_.V025.u = expr;
12523 ffesta_tokens[1] = ffelex_token_use (ft);
12524 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
12525 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0253_);
12531 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12532 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12535 /* ffestb_V0253_ -- "DEFINEFILE" expr OPEN_PAREN expr
12537 (ffestb_V0253_) // to expression handler
12539 Make sure the statement has a valid form for the DEFINEFILE statement. If
12540 it does, implement the statement. */
12542 static ffelexHandler
12543 ffestb_V0253_ (ffelexToken ft, ffebld expr, ffelexToken t)
12545 switch (ffelex_token_type (t))
12547 case FFELEX_typeCOMMA:
12548 ffestb_local_.V025.m = expr;
12549 ffesta_tokens[2] = ffelex_token_use (ft);
12550 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
12551 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0254_);
12557 ffelex_token_kill (ffesta_tokens[1]);
12558 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12559 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12562 /* ffestb_V0254_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr
12564 (ffestb_V0254_) // to expression handler
12566 Make sure the statement has a valid form for the DEFINEFILE statement. If
12567 it does, implement the statement. */
12569 static ffelexHandler
12570 ffestb_V0254_ (ffelexToken ft, ffebld expr, ffelexToken t)
12572 switch (ffelex_token_type (t))
12574 case FFELEX_typeCOMMA:
12575 ffestb_local_.V025.n = expr;
12576 ffesta_tokens[3] = ffelex_token_use (ft);
12577 return (ffelexHandler) ffestb_V0255_;
12583 ffelex_token_kill (ffesta_tokens[1]);
12584 ffelex_token_kill (ffesta_tokens[2]);
12585 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12586 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12589 /* ffestb_V0255_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA
12591 return ffestb_V0255_; // to lexer
12593 Make sure the statement has a valid form for the DEFINEFILE statement. If
12594 it does, implement the statement. */
12596 static ffelexHandler
12597 ffestb_V0255_ (ffelexToken t)
12601 switch (ffelex_token_type (t))
12603 case FFELEX_typeNAME:
12604 p = ffelex_token_text (t);
12605 if (!ffesrc_char_match_init (*p, 'U', 'u') || (*++p != '\0'))
12607 return (ffelexHandler) ffestb_V0256_;
12613 ffelex_token_kill (ffesta_tokens[1]);
12614 ffelex_token_kill (ffesta_tokens[2]);
12615 ffelex_token_kill (ffesta_tokens[3]);
12616 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12617 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12620 /* ffestb_V0256_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U"
12622 return ffestb_V0256_; // to lexer
12624 Make sure the statement has a valid form for the DEFINEFILE statement. If
12625 it does, implement the statement. */
12627 static ffelexHandler
12628 ffestb_V0256_ (ffelexToken t)
12630 switch (ffelex_token_type (t))
12632 case FFELEX_typeCOMMA:
12633 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
12634 FFEEXPR_contextFILEASSOC,
12635 (ffeexprCallback) ffestb_V0257_);
12641 ffelex_token_kill (ffesta_tokens[1]);
12642 ffelex_token_kill (ffesta_tokens[2]);
12643 ffelex_token_kill (ffesta_tokens[3]);
12644 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12645 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12648 /* ffestb_V0257_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U"
12651 (ffestb_V0257_) // to expression handler
12653 Make sure the statement has a valid form for the DEFINEFILE statement. If
12654 it does, implement the statement. */
12656 static ffelexHandler
12657 ffestb_V0257_ (ffelexToken ft, ffebld expr, ffelexToken t)
12659 switch (ffelex_token_type (t))
12661 case FFELEX_typeCLOSE_PAREN:
12662 ffestb_local_.V025.asv = expr;
12663 ffesta_tokens[4] = ffelex_token_use (ft);
12664 return (ffelexHandler) ffestb_V0258_;
12670 ffelex_token_kill (ffesta_tokens[1]);
12671 ffelex_token_kill (ffesta_tokens[2]);
12672 ffelex_token_kill (ffesta_tokens[3]);
12673 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12674 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12677 /* ffestb_V0258_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U"
12678 COMMA expr CLOSE_PAREN
12680 return ffestb_V0258_; // to lexer
12682 Make sure the statement has a valid form for the DEFINEFILE statement. If
12683 it does, implement the statement. */
12685 static ffelexHandler
12686 ffestb_V0258_ (ffelexToken t)
12688 switch (ffelex_token_type (t))
12690 case FFELEX_typeCOMMA:
12691 case FFELEX_typeEOS:
12692 case FFELEX_typeSEMICOLON:
12693 if (!ffestb_local_.V025.started)
12695 ffesta_confirmed ();
12696 if (!ffesta_is_inhibited ())
12697 ffestc_V025_start ();
12698 ffestb_local_.V025.started = TRUE;
12700 if (!ffesta_is_inhibited ())
12701 ffestc_V025_item (ffestb_local_.V025.u, ffesta_tokens[1],
12702 ffestb_local_.V025.m, ffesta_tokens[2],
12703 ffestb_local_.V025.n, ffesta_tokens[3],
12704 ffestb_local_.V025.asv, ffesta_tokens[4]);
12705 ffelex_token_kill (ffesta_tokens[1]);
12706 ffelex_token_kill (ffesta_tokens[2]);
12707 ffelex_token_kill (ffesta_tokens[3]);
12708 ffelex_token_kill (ffesta_tokens[4]);
12709 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
12710 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
12711 FFEEXPR_contextFILEUNIT_DF, (ffeexprCallback) ffestb_V0252_);
12712 if (!ffesta_is_inhibited ())
12713 ffestc_V025_finish ();
12714 return (ffelexHandler) ffesta_zero (t);
12720 ffelex_token_kill (ffesta_tokens[1]);
12721 ffelex_token_kill (ffesta_tokens[2]);
12722 ffelex_token_kill (ffesta_tokens[3]);
12723 ffelex_token_kill (ffesta_tokens[4]);
12724 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t);
12725 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
12729 /* ffestb_subr_kill_easy_ -- Kill I/O statement data structure
12731 ffestb_subr_kill_easy_();
12733 Kills all tokens in the I/O data structure. Assumes that they are
12734 overlaid with each other (union) in ffest_private.h and the typing
12735 and structure references assume (though not necessarily dangerous if
12736 FALSE) that INQUIRE has the most file elements. */
12738 #if FFESTB_KILL_EASY_
12740 ffestb_subr_kill_easy_ (ffestpInquireIx max)
12742 ffestpInquireIx ix;
12744 for (ix = 0; ix < max; ++ix)
12746 if (ffestp_file.inquire.inquire_spec[ix].kw_or_val_present)
12748 if (ffestp_file.inquire.inquire_spec[ix].kw_present)
12749 ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].kw);
12750 if (ffestp_file.inquire.inquire_spec[ix].value_present)
12751 ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].value);
12757 /* ffestb_subr_kill_accept_ -- Kill ACCEPT statement data structure
12759 ffestb_subr_kill_accept_();
12761 Kills all tokens in the ACCEPT data structure. */
12763 #if !FFESTB_KILL_EASY_
12765 ffestb_subr_kill_accept_ ()
12769 for (ix = 0; ix < FFESTP_acceptix; ++ix)
12771 if (ffestp_file.accept.accept_spec[ix].kw_or_val_present)
12773 if (ffestp_file.accept.accept_spec[ix].kw_present)
12774 ffelex_token_kill (ffestp_file.accept.accept_spec[ix].kw);
12775 if (ffestp_file.accept.accept_spec[ix].value_present)
12776 ffelex_token_kill (ffestp_file.accept.accept_spec[ix].value);
12782 /* ffestb_subr_kill_beru_ -- Kill BACKSPACE/ENDFILE/REWIND/UNLOCK statement
12785 ffestb_subr_kill_beru_();
12787 Kills all tokens in the BACKSPACE/ENDFILE/REWIND/UNLOCK data structure. */
12789 #if !FFESTB_KILL_EASY_
12791 ffestb_subr_kill_beru_ ()
12795 for (ix = 0; ix < FFESTP_beruix; ++ix)
12797 if (ffestp_file.beru.beru_spec[ix].kw_or_val_present)
12799 if (ffestp_file.beru.beru_spec[ix].kw_present)
12800 ffelex_token_kill (ffestp_file.beru.beru_spec[ix].kw);
12801 if (ffestp_file.beru.beru_spec[ix].value_present)
12802 ffelex_token_kill (ffestp_file.beru.beru_spec[ix].value);
12808 /* ffestb_subr_kill_close_ -- Kill CLOSE statement data structure
12810 ffestb_subr_kill_close_();
12812 Kills all tokens in the CLOSE data structure. */
12814 #if !FFESTB_KILL_EASY_
12816 ffestb_subr_kill_close_ ()
12820 for (ix = 0; ix < FFESTP_closeix; ++ix)
12822 if (ffestp_file.close.close_spec[ix].kw_or_val_present)
12824 if (ffestp_file.close.close_spec[ix].kw_present)
12825 ffelex_token_kill (ffestp_file.close.close_spec[ix].kw);
12826 if (ffestp_file.close.close_spec[ix].value_present)
12827 ffelex_token_kill (ffestp_file.close.close_spec[ix].value);
12833 /* ffestb_subr_kill_delete_ -- Kill DELETE statement data structure
12835 ffestb_subr_kill_delete_();
12837 Kills all tokens in the DELETE data structure. */
12839 #if !FFESTB_KILL_EASY_
12841 ffestb_subr_kill_delete_ ()
12845 for (ix = 0; ix < FFESTP_deleteix; ++ix)
12847 if (ffestp_file.delete.delete_spec[ix].kw_or_val_present)
12849 if (ffestp_file.delete.delete_spec[ix].kw_present)
12850 ffelex_token_kill (ffestp_file.delete.delete_spec[ix].kw);
12851 if (ffestp_file.delete.delete_spec[ix].value_present)
12852 ffelex_token_kill (ffestp_file.delete.delete_spec[ix].value);
12858 /* ffestb_subr_kill_inquire_ -- Kill INQUIRE statement data structure
12860 ffestb_subr_kill_inquire_();
12862 Kills all tokens in the INQUIRE data structure. */
12864 #if !FFESTB_KILL_EASY_
12866 ffestb_subr_kill_inquire_ ()
12868 ffestpInquireIx ix;
12870 for (ix = 0; ix < FFESTP_inquireix; ++ix)
12872 if (ffestp_file.inquire.inquire_spec[ix].kw_or_val_present)
12874 if (ffestp_file.inquire.inquire_spec[ix].kw_present)
12875 ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].kw);
12876 if (ffestp_file.inquire.inquire_spec[ix].value_present)
12877 ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].value);
12883 /* ffestb_subr_kill_open_ -- Kill OPEN statement data structure
12885 ffestb_subr_kill_open_();
12887 Kills all tokens in the OPEN data structure. */
12889 #if !FFESTB_KILL_EASY_
12891 ffestb_subr_kill_open_ ()
12895 for (ix = 0; ix < FFESTP_openix; ++ix)
12897 if (ffestp_file.open.open_spec[ix].kw_or_val_present)
12899 if (ffestp_file.open.open_spec[ix].kw_present)
12900 ffelex_token_kill (ffestp_file.open.open_spec[ix].kw);
12901 if (ffestp_file.open.open_spec[ix].value_present)
12902 ffelex_token_kill (ffestp_file.open.open_spec[ix].value);
12908 /* ffestb_subr_kill_print_ -- Kill PRINT statement data structure
12910 ffestb_subr_kill_print_();
12912 Kills all tokens in the PRINT data structure. */
12914 #if !FFESTB_KILL_EASY_
12916 ffestb_subr_kill_print_ ()
12920 for (ix = 0; ix < FFESTP_printix; ++ix)
12922 if (ffestp_file.print.print_spec[ix].kw_or_val_present)
12924 if (ffestp_file.print.print_spec[ix].kw_present)
12925 ffelex_token_kill (ffestp_file.print.print_spec[ix].kw);
12926 if (ffestp_file.print.print_spec[ix].value_present)
12927 ffelex_token_kill (ffestp_file.print.print_spec[ix].value);
12933 /* ffestb_subr_kill_read_ -- Kill READ statement data structure
12935 ffestb_subr_kill_read_();
12937 Kills all tokens in the READ data structure. */
12939 #if !FFESTB_KILL_EASY_
12941 ffestb_subr_kill_read_ ()
12945 for (ix = 0; ix < FFESTP_readix; ++ix)
12947 if (ffestp_file.read.read_spec[ix].kw_or_val_present)
12949 if (ffestp_file.read.read_spec[ix].kw_present)
12950 ffelex_token_kill (ffestp_file.read.read_spec[ix].kw);
12951 if (ffestp_file.read.read_spec[ix].value_present)
12952 ffelex_token_kill (ffestp_file.read.read_spec[ix].value);
12958 /* ffestb_subr_kill_rewrite_ -- Kill REWRITE statement data structure
12960 ffestb_subr_kill_rewrite_();
12962 Kills all tokens in the REWRITE data structure. */
12964 #if !FFESTB_KILL_EASY_
12966 ffestb_subr_kill_rewrite_ ()
12968 ffestpRewriteIx ix;
12970 for (ix = 0; ix < FFESTP_rewriteix; ++ix)
12972 if (ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present)
12974 if (ffestp_file.rewrite.rewrite_spec[ix].kw_present)
12975 ffelex_token_kill (ffestp_file.rewrite.rewrite_spec[ix].kw);
12976 if (ffestp_file.rewrite.rewrite_spec[ix].value_present)
12977 ffelex_token_kill (ffestp_file.rewrite.rewrite_spec[ix].value);
12983 /* ffestb_subr_kill_type_ -- Kill TYPE statement data structure
12985 ffestb_subr_kill_type_();
12987 Kills all tokens in the TYPE data structure. */
12989 #if !FFESTB_KILL_EASY_
12991 ffestb_subr_kill_type_ ()
12995 for (ix = 0; ix < FFESTP_typeix; ++ix)
12997 if (ffestp_file.type.type_spec[ix].kw_or_val_present)
12999 if (ffestp_file.type.type_spec[ix].kw_present)
13000 ffelex_token_kill (ffestp_file.type.type_spec[ix].kw);
13001 if (ffestp_file.type.type_spec[ix].value_present)
13002 ffelex_token_kill (ffestp_file.type.type_spec[ix].value);
13008 /* ffestb_subr_kill_write_ -- Kill WRITE statement data structure
13010 ffestb_subr_kill_write_();
13012 Kills all tokens in the WRITE data structure. */
13014 #if !FFESTB_KILL_EASY_
13016 ffestb_subr_kill_write_ ()
13020 for (ix = 0; ix < FFESTP_writeix; ++ix)
13022 if (ffestp_file.write.write_spec[ix].kw_or_val_present)
13024 if (ffestp_file.write.write_spec[ix].kw_present)
13025 ffelex_token_kill (ffestp_file.write.write_spec[ix].kw);
13026 if (ffestp_file.write.write_spec[ix].value_present)
13027 ffelex_token_kill (ffestp_file.write.write_spec[ix].value);
13033 /* ffestb_beru -- Parse the BACKSPACE/ENDFILE/REWIND/UNLOCK statement
13035 return ffestb_beru; // to lexer
13037 Make sure the statement has a valid form for the BACKSPACE/ENDFILE/REWIND/
13038 UNLOCK statement. If it does, implement the statement. */
13041 ffestb_beru (ffelexToken t)
13043 ffelexHandler next;
13046 switch (ffelex_token_type (ffesta_tokens[0]))
13048 case FFELEX_typeNAME:
13049 switch (ffelex_token_type (t))
13051 case FFELEX_typeCOMMA:
13052 case FFELEX_typeCOLONCOLON:
13053 case FFELEX_typeEOS:
13054 case FFELEX_typeSEMICOLON:
13055 ffesta_confirmed (); /* Error, but clearly intended. */
13056 goto bad_1; /* :::::::::::::::::::: */
13058 case FFELEX_typeEQUALS:
13059 case FFELEX_typePOINTS:
13060 case FFELEX_typeCOLON:
13061 goto bad_1; /* :::::::::::::::::::: */
13063 case FFELEX_typeNAME:
13064 case FFELEX_typeNUMBER:
13065 ffesta_confirmed ();
13068 case FFELEX_typeOPEN_PAREN:
13069 for (ix = 0; ix < FFESTP_beruix; ++ix)
13070 ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE;
13071 ffesta_tokens[1] = ffelex_token_use (t);
13072 return (ffelexHandler) ffestb_beru2_;
13078 for (ix = 0; ix < FFESTP_beruix; ++ix)
13079 ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE;
13080 return (ffelexHandler) (*((ffelexHandler)
13081 ffeexpr_rhs (ffesta_output_pool,
13082 FFEEXPR_contextFILENUM,
13083 (ffeexprCallback) ffestb_beru1_)))
13086 case FFELEX_typeNAMES:
13087 switch (ffelex_token_type (t))
13089 case FFELEX_typeCOMMA:
13090 case FFELEX_typeCOLONCOLON:
13091 ffesta_confirmed (); /* Error, but clearly intended. */
13092 goto bad_1; /* :::::::::::::::::::: */
13094 case FFELEX_typeEQUALS:
13095 case FFELEX_typePOINTS:
13096 case FFELEX_typeCOLON:
13097 goto bad_1; /* :::::::::::::::::::: */
13099 case FFELEX_typeEOS:
13100 case FFELEX_typeSEMICOLON:
13101 ffesta_confirmed ();
13104 case FFELEX_typeOPEN_PAREN:
13105 if (ffelex_token_length (ffesta_tokens[0])
13106 != ffestb_args.beru.len)
13109 for (ix = 0; ix < FFESTP_beruix; ++ix)
13110 ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE;
13111 ffesta_tokens[1] = ffelex_token_use (t);
13112 return (ffelexHandler) ffestb_beru2_;
13117 for (ix = 0; ix < FFESTP_beruix; ++ix)
13118 ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE;
13119 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13120 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_beru1_);
13121 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
13122 ffestb_args.beru.len);
13124 return (ffelexHandler) ffelex_swallow_tokens (t,
13125 (ffelexHandler) ffesta_zero);
13126 return (ffelexHandler) (*next) (t);
13129 goto bad_0; /* :::::::::::::::::::: */
13132 bad_0: /* :::::::::::::::::::: */
13133 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, ffesta_tokens[0]);
13134 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13136 bad_1: /* :::::::::::::::::::: */
13137 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13138 return (ffelexHandler) ffelex_swallow_tokens (t,
13139 (ffelexHandler) ffesta_zero); /* Invalid second token. */
13142 /* ffestb_beru1_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" expr
13144 (ffestb_beru1_) // to expression handler
13146 Make sure the next token is an EOS or SEMICOLON. */
13148 static ffelexHandler
13149 ffestb_beru1_ (ffelexToken ft, ffebld expr, ffelexToken t)
13151 switch (ffelex_token_type (t))
13153 case FFELEX_typeEOS:
13154 case FFELEX_typeSEMICOLON:
13157 ffesta_confirmed ();
13158 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_or_val_present
13160 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_present = FALSE;
13161 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_present = TRUE;
13162 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_is_label
13164 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value
13165 = ffelex_token_use (ft);
13166 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].u.expr = expr;
13167 if (!ffesta_is_inhibited ())
13169 switch (ffesta_first_kw)
13171 case FFESTR_firstBACKSPACE:
13175 case FFESTR_firstENDFILE:
13176 case FFESTR_firstEND:
13180 case FFESTR_firstREWIND:
13185 case FFESTR_firstUNLOCK:
13194 ffestb_subr_kill_beru_ ();
13195 return (ffelexHandler) ffesta_zero (t);
13201 ffestb_subr_kill_beru_ ();
13202 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13203 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13206 /* ffestb_beru2_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN
13208 return ffestb_beru2_; // to lexer
13210 Handle expr construct (not NAME=expr construct) here. */
13212 static ffelexHandler
13213 ffestb_beru2_ (ffelexToken t)
13216 ffelexHandler next;
13218 switch (ffelex_token_type (t))
13220 case FFELEX_typeNAME:
13221 ffesta_tokens[2] = ffelex_token_use (t);
13222 return (ffelexHandler) ffestb_beru3_;
13225 nt = ffesta_tokens[1];
13226 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13227 FFEEXPR_contextFILENUMAMBIG, (ffeexprCallback) ffestb_beru4_)))
13229 ffelex_token_kill (nt);
13230 return (ffelexHandler) (*next) (t);
13234 /* ffestb_beru3_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN NAME
13236 return ffestb_beru3_; // to lexer
13238 If EQUALS here, go to states that handle it. Else, send NAME and this
13239 token thru expression handler. */
13241 static ffelexHandler
13242 ffestb_beru3_ (ffelexToken t)
13244 ffelexHandler next;
13248 switch (ffelex_token_type (t))
13250 case FFELEX_typeEQUALS:
13251 ffelex_token_kill (ffesta_tokens[1]);
13252 nt = ffesta_tokens[2];
13253 next = (ffelexHandler) ffestb_beru5_ (nt);
13254 ffelex_token_kill (nt);
13255 return (ffelexHandler) (*next) (t);
13258 nt = ffesta_tokens[1];
13259 ot = ffesta_tokens[2];
13260 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13261 FFEEXPR_contextFILENUMAMBIG, (ffeexprCallback) ffestb_beru4_)))
13263 ffelex_token_kill (nt);
13264 next = (ffelexHandler) (*next) (ot);
13265 ffelex_token_kill (ot);
13266 return (ffelexHandler) (*next) (t);
13270 /* ffestb_beru4_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN expr [CLOSE_PAREN]
13272 (ffestb_beru4_) // to expression handler
13274 Handle COMMA or EOS/SEMICOLON here.
13277 Now using new mechanism whereby expr comes back as opITEM if the
13278 expr is considered part (or all) of an I/O control list (and should
13279 be stripped of its outer opITEM node) or not if it is considered
13280 a plain unit number that happens to have been enclosed in parens.
13282 No longer expecting close-paren here because of constructs like
13283 BACKSPACE (5)+2, so now expecting either COMMA because it was a
13284 construct like BACKSPACE (5+2,... or EOS/SEMICOLON because it is like
13285 the former construct. Ah, the vagaries of Fortran. */
13287 static ffelexHandler
13288 ffestb_beru4_ (ffelexToken ft, ffebld expr, ffelexToken t)
13292 switch (ffelex_token_type (t))
13294 case FFELEX_typeCOMMA:
13295 case FFELEX_typeEOS:
13296 case FFELEX_typeSEMICOLON:
13297 case FFELEX_typeCLOSE_PAREN:
13300 if (ffebld_op (expr) == FFEBLD_opITEM)
13303 expr = ffebld_head (expr);
13307 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_or_val_present
13309 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_present = FALSE;
13310 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_present = TRUE;
13311 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_is_label
13313 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value
13314 = ffelex_token_use (ft);
13315 ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].u.expr = expr;
13317 return (ffelexHandler) ffestb_beru9_ (t);
13318 return (ffelexHandler) ffestb_beru10_ (t);
13324 ffestb_subr_kill_beru_ ();
13325 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13326 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13329 /* ffestb_beru5_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN [external-file-unit
13332 return ffestb_beru5_; // to lexer
13334 Handle expr construct (not NAME=expr construct) here. */
13336 static ffelexHandler
13337 ffestb_beru5_ (ffelexToken t)
13341 ffestb_local_.beru.label = FALSE;
13343 switch (ffelex_token_type (t))
13345 case FFELEX_typeNAME:
13346 kw = ffestr_genio (t);
13349 case FFESTR_genioERR:
13350 ffestb_local_.beru.ix = FFESTP_beruixERR;
13351 ffestb_local_.beru.label = TRUE;
13354 case FFESTR_genioIOSTAT:
13355 ffestb_local_.beru.ix = FFESTP_beruixIOSTAT;
13356 ffestb_local_.beru.left = TRUE;
13357 ffestb_local_.beru.context = FFEEXPR_contextFILEINT;
13360 case FFESTR_genioUNIT:
13361 ffestb_local_.beru.ix = FFESTP_beruixUNIT;
13362 ffestb_local_.beru.left = FALSE;
13363 ffestb_local_.beru.context = FFEEXPR_contextFILENUM;
13367 goto bad; /* :::::::::::::::::::: */
13369 if (ffestp_file.beru.beru_spec[ffestb_local_.beru.ix]
13370 .kw_or_val_present)
13371 break; /* Can't specify a keyword twice! */
13372 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix]
13373 .kw_or_val_present = TRUE;
13374 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix]
13375 .kw_present = TRUE;
13376 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix]
13377 .value_present = FALSE;
13378 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_is_label
13379 = ffestb_local_.beru.label;
13380 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].kw
13381 = ffelex_token_use (t);
13382 return (ffelexHandler) ffestb_beru6_;
13388 bad: /* :::::::::::::::::::: */
13389 ffestb_subr_kill_beru_ ();
13390 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13391 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13394 /* ffestb_beru6_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN [external-file-unit
13397 return ffestb_beru6_; // to lexer
13399 Make sure EQUALS here, send next token to expression handler. */
13401 static ffelexHandler
13402 ffestb_beru6_ (ffelexToken t)
13405 switch (ffelex_token_type (t))
13407 case FFELEX_typeEQUALS:
13408 ffesta_confirmed ();
13409 if (ffestb_local_.beru.label)
13410 return (ffelexHandler) ffestb_beru8_;
13411 if (ffestb_local_.beru.left)
13412 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
13413 ffestb_local_.beru.context,
13414 (ffeexprCallback) ffestb_beru7_);
13415 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13416 ffestb_local_.beru.context,
13417 (ffeexprCallback) ffestb_beru7_);
13423 ffestb_subr_kill_beru_ ();
13424 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13425 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13428 /* ffestb_beru7_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS expr
13430 (ffestb_beru7_) // to expression handler
13432 Handle COMMA or CLOSE_PAREN here. */
13434 static ffelexHandler
13435 ffestb_beru7_ (ffelexToken ft, ffebld expr, ffelexToken t)
13437 switch (ffelex_token_type (t))
13439 case FFELEX_typeCOMMA:
13440 case FFELEX_typeCLOSE_PAREN:
13443 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_present
13445 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value
13446 = ffelex_token_use (ft);
13447 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].u.expr = expr;
13448 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
13449 return (ffelexHandler) ffestb_beru5_;
13450 return (ffelexHandler) ffestb_beru10_;
13456 ffestb_subr_kill_beru_ ();
13457 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13458 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13461 /* ffestb_beru8_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS
13463 return ffestb_beru8_; // to lexer
13465 Handle NUMBER for label here. */
13467 static ffelexHandler
13468 ffestb_beru8_ (ffelexToken t)
13470 switch (ffelex_token_type (t))
13472 case FFELEX_typeNUMBER:
13473 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_present
13475 ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value
13476 = ffelex_token_use (t);
13477 return (ffelexHandler) ffestb_beru9_;
13483 ffestb_subr_kill_beru_ ();
13484 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13485 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13488 /* ffestb_beru9_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS
13491 return ffestb_beru9_; // to lexer
13493 Handle COMMA or CLOSE_PAREN here. */
13495 static ffelexHandler
13496 ffestb_beru9_ (ffelexToken t)
13498 switch (ffelex_token_type (t))
13500 case FFELEX_typeCOMMA:
13501 return (ffelexHandler) ffestb_beru5_;
13503 case FFELEX_typeCLOSE_PAREN:
13504 return (ffelexHandler) ffestb_beru10_;
13510 ffestb_subr_kill_beru_ ();
13511 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13512 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13515 /* ffestb_beru10_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... CLOSE_PAREN
13517 return ffestb_beru10_; // to lexer
13519 Handle EOS or SEMICOLON here. */
13521 static ffelexHandler
13522 ffestb_beru10_ (ffelexToken t)
13524 switch (ffelex_token_type (t))
13526 case FFELEX_typeEOS:
13527 case FFELEX_typeSEMICOLON:
13528 ffesta_confirmed ();
13529 if (!ffesta_is_inhibited ())
13531 switch (ffesta_first_kw)
13533 case FFESTR_firstBACKSPACE:
13537 case FFESTR_firstENDFILE:
13538 case FFESTR_firstEND:
13542 case FFESTR_firstREWIND:
13547 case FFESTR_firstUNLOCK:
13556 ffestb_subr_kill_beru_ ();
13557 return (ffelexHandler) ffesta_zero (t);
13563 ffestb_subr_kill_beru_ ();
13564 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t);
13565 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13568 /* ffestb_vxtcode -- Parse the VXT DECODE/ENCODE statement
13570 return ffestb_vxtcode; // to lexer
13572 Make sure the statement has a valid form for the VXT DECODE/ENCODE
13573 statement. If it does, implement the statement. */
13577 ffestb_vxtcode (ffelexToken t)
13579 ffestpVxtcodeIx ix;
13581 switch (ffelex_token_type (ffesta_tokens[0]))
13583 case FFELEX_typeNAME:
13584 switch (ffelex_token_type (t))
13586 case FFELEX_typeCOMMA:
13587 case FFELEX_typeCOLONCOLON:
13588 case FFELEX_typeEOS:
13589 case FFELEX_typeSEMICOLON:
13590 case FFELEX_typeNAME:
13591 case FFELEX_typeNUMBER:
13592 ffesta_confirmed (); /* Error, but clearly intended. */
13593 goto bad_1; /* :::::::::::::::::::: */
13596 goto bad_1; /* :::::::::::::::::::: */
13598 case FFELEX_typeOPEN_PAREN:
13599 for (ix = 0; ix < FFESTP_vxtcodeix; ++ix)
13600 ffestp_file.vxtcode.vxtcode_spec[ix].kw_or_val_present = FALSE;
13601 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13602 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_vxtcode1_);
13605 case FFELEX_typeNAMES:
13606 switch (ffelex_token_type (t))
13608 case FFELEX_typeEOS:
13609 case FFELEX_typeSEMICOLON:
13610 case FFELEX_typeCOMMA:
13611 case FFELEX_typeCOLONCOLON:
13612 ffesta_confirmed (); /* Error, but clearly intended. */
13613 goto bad_1; /* :::::::::::::::::::: */
13616 goto bad_1; /* :::::::::::::::::::: */
13618 case FFELEX_typeOPEN_PAREN:
13619 if (ffelex_token_length (ffesta_tokens[0])
13620 != ffestb_args.vxtcode.len)
13621 goto bad_0; /* :::::::::::::::::::: */
13623 for (ix = 0; ix < FFESTP_vxtcodeix; ++ix)
13624 ffestp_file.vxtcode.vxtcode_spec[ix].kw_or_val_present = FALSE;
13625 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13626 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_vxtcode1_);
13630 goto bad_0; /* :::::::::::::::::::: */
13633 bad_0: /* :::::::::::::::::::: */
13634 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, ffesta_tokens[0]);
13635 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13637 bad_1: /* :::::::::::::::::::: */
13638 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13639 return (ffelexHandler) ffelex_swallow_tokens (t,
13640 (ffelexHandler) ffesta_zero); /* Invalid second token. */
13643 /* ffestb_vxtcode1_ -- "VXTCODE" OPEN_PAREN expr
13645 (ffestb_vxtcode1_) // to expression handler
13647 Handle COMMA here. */
13649 static ffelexHandler
13650 ffestb_vxtcode1_ (ffelexToken ft, ffebld expr, ffelexToken t)
13652 switch (ffelex_token_type (t))
13654 case FFELEX_typeCOMMA:
13657 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].kw_or_val_present
13659 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].kw_present = FALSE;
13660 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value_present = TRUE;
13661 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value_is_label
13663 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value
13664 = ffelex_token_use (ft);
13665 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].u.expr = expr;
13666 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13667 FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_vxtcode2_);
13673 ffestb_subr_kill_vxtcode_ ();
13674 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13675 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13678 /* ffestb_vxtcode2_ -- "VXTCODE" OPEN_PAREN expr COMMA expr
13680 (ffestb_vxtcode2_) // to expression handler
13682 Handle COMMA here. */
13684 static ffelexHandler
13685 ffestb_vxtcode2_ (ffelexToken ft, ffebld expr, ffelexToken t)
13687 switch (ffelex_token_type (t))
13689 case FFELEX_typeCOMMA:
13690 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].kw_or_val_present
13692 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].kw_present = FALSE;
13693 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value_present = TRUE;
13694 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value_is_label
13696 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value
13697 = ffelex_token_use (ft);
13698 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].u.expr = expr;
13699 if (ffesta_first_kw == FFESTR_firstENCODE)
13700 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
13701 FFEEXPR_contextFILEVXTCODE,
13702 (ffeexprCallback) ffestb_vxtcode3_);
13703 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13704 FFEEXPR_contextFILEVXTCODE,
13705 (ffeexprCallback) ffestb_vxtcode3_);
13711 ffestb_subr_kill_vxtcode_ ();
13712 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13713 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13716 /* ffestb_vxtcode3_ -- "VXTCODE" OPEN_PAREN expr COMMA expr COMMA expr
13718 (ffestb_vxtcode3_) // to expression handler
13720 Handle COMMA or CLOSE_PAREN here. */
13722 static ffelexHandler
13723 ffestb_vxtcode3_ (ffelexToken ft, ffebld expr, ffelexToken t)
13725 switch (ffelex_token_type (t))
13727 case FFELEX_typeCOMMA:
13728 case FFELEX_typeCLOSE_PAREN:
13731 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].kw_or_val_present
13733 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].kw_present = FALSE;
13734 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value_present = TRUE;
13735 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value_is_label
13737 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value
13738 = ffelex_token_use (ft);
13739 ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].u.expr = expr;
13740 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
13741 return (ffelexHandler) ffestb_vxtcode4_;
13742 return (ffelexHandler) ffestb_vxtcode9_;
13748 ffestb_subr_kill_vxtcode_ ();
13749 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13750 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13753 /* ffestb_vxtcode4_ -- "VXTCODE" OPEN_PAREN ...
13755 return ffestb_vxtcode4_; // to lexer
13757 Handle NAME=expr construct here. */
13759 static ffelexHandler
13760 ffestb_vxtcode4_ (ffelexToken t)
13764 ffestb_local_.vxtcode.label = FALSE;
13766 switch (ffelex_token_type (t))
13768 case FFELEX_typeNAME:
13769 kw = ffestr_genio (t);
13772 case FFESTR_genioERR:
13773 ffestb_local_.vxtcode.ix = FFESTP_vxtcodeixERR;
13774 ffestb_local_.vxtcode.label = TRUE;
13777 case FFESTR_genioIOSTAT:
13778 ffestb_local_.vxtcode.ix = FFESTP_vxtcodeixIOSTAT;
13779 ffestb_local_.vxtcode.left = TRUE;
13780 ffestb_local_.vxtcode.context = FFEEXPR_contextFILEINT;
13784 goto bad; /* :::::::::::::::::::: */
13786 if (ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix]
13787 .kw_or_val_present)
13788 break; /* Can't specify a keyword twice! */
13789 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix]
13790 .kw_or_val_present = TRUE;
13791 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix]
13792 .kw_present = TRUE;
13793 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix]
13794 .value_present = FALSE;
13795 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_is_label
13796 = ffestb_local_.vxtcode.label;
13797 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].kw
13798 = ffelex_token_use (t);
13799 return (ffelexHandler) ffestb_vxtcode5_;
13805 bad: /* :::::::::::::::::::: */
13806 ffestb_subr_kill_vxtcode_ ();
13807 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13808 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13811 /* ffestb_vxtcode5_ -- "VXTCODE" OPEN_PAREN [external-file-unit COMMA [format
13814 return ffestb_vxtcode5_; // to lexer
13816 Make sure EQUALS here, send next token to expression handler. */
13818 static ffelexHandler
13819 ffestb_vxtcode5_ (ffelexToken t)
13821 switch (ffelex_token_type (t))
13823 case FFELEX_typeEQUALS:
13824 ffesta_confirmed ();
13825 if (ffestb_local_.vxtcode.label)
13826 return (ffelexHandler) ffestb_vxtcode7_;
13827 if (ffestb_local_.vxtcode.left)
13828 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
13829 ffestb_local_.vxtcode.context,
13830 (ffeexprCallback) ffestb_vxtcode6_);
13831 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13832 ffestb_local_.vxtcode.context,
13833 (ffeexprCallback) ffestb_vxtcode6_);
13839 ffestb_subr_kill_vxtcode_ ();
13840 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13841 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13844 /* ffestb_vxtcode6_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS expr
13846 (ffestb_vxtcode6_) // to expression handler
13848 Handle COMMA or CLOSE_PAREN here. */
13850 static ffelexHandler
13851 ffestb_vxtcode6_ (ffelexToken ft, ffebld expr, ffelexToken t)
13853 switch (ffelex_token_type (t))
13855 case FFELEX_typeCOMMA:
13856 case FFELEX_typeCLOSE_PAREN:
13859 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_present
13861 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value
13862 = ffelex_token_use (ft);
13863 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].u.expr = expr;
13864 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
13865 return (ffelexHandler) ffestb_vxtcode4_;
13866 return (ffelexHandler) ffestb_vxtcode9_;
13872 ffestb_subr_kill_vxtcode_ ();
13873 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13874 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13877 /* ffestb_vxtcode7_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS
13879 return ffestb_vxtcode7_; // to lexer
13881 Handle NUMBER for label here. */
13883 static ffelexHandler
13884 ffestb_vxtcode7_ (ffelexToken t)
13886 switch (ffelex_token_type (t))
13888 case FFELEX_typeNUMBER:
13889 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_present
13891 ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value
13892 = ffelex_token_use (t);
13893 return (ffelexHandler) ffestb_vxtcode8_;
13899 ffestb_subr_kill_vxtcode_ ();
13900 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13901 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13904 /* ffestb_vxtcode8_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS NUMBER
13906 return ffestb_vxtcode8_; // to lexer
13908 Handle COMMA or CLOSE_PAREN here. */
13910 static ffelexHandler
13911 ffestb_vxtcode8_ (ffelexToken t)
13913 switch (ffelex_token_type (t))
13915 case FFELEX_typeCOMMA:
13916 return (ffelexHandler) ffestb_vxtcode4_;
13918 case FFELEX_typeCLOSE_PAREN:
13919 return (ffelexHandler) ffestb_vxtcode9_;
13925 ffestb_subr_kill_vxtcode_ ();
13926 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13927 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
13930 /* ffestb_vxtcode9_ -- "VXTCODE" OPEN_PAREN ... CLOSE_PAREN
13932 return ffestb_vxtcode9_; // to lexer
13934 Handle EOS or SEMICOLON here.
13937 Context for ENCODE/DECODE expressions is now IOLISTDF instead of IOLIST
13938 since they apply to internal files. */
13940 static ffelexHandler
13941 ffestb_vxtcode9_ (ffelexToken t)
13943 ffelexHandler next;
13945 switch (ffelex_token_type (t))
13947 case FFELEX_typeEOS:
13948 case FFELEX_typeSEMICOLON:
13949 ffesta_confirmed ();
13950 if (!ffesta_is_inhibited ())
13952 if (ffesta_first_kw == FFESTR_firstENCODE)
13954 ffestc_V023_start ();
13955 ffestc_V023_finish ();
13959 ffestc_V024_start ();
13960 ffestc_V024_finish ();
13963 ffestb_subr_kill_vxtcode_ ();
13964 return (ffelexHandler) ffesta_zero (t);
13966 case FFELEX_typeNAME:
13967 case FFELEX_typeOPEN_PAREN:
13968 case FFELEX_typeCOMMA:
13969 ffesta_confirmed ();
13970 if (!ffesta_is_inhibited ())
13971 if (ffesta_first_kw == FFESTR_firstENCODE)
13972 ffestc_V023_start ();
13974 ffestc_V024_start ();
13975 ffestb_subr_kill_vxtcode_ ();
13976 if (ffesta_first_kw == FFESTR_firstDECODE)
13977 next = (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
13978 FFEEXPR_contextIOLISTDF,
13979 (ffeexprCallback) ffestb_vxtcode10_);
13981 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
13982 FFEEXPR_contextIOLISTDF,
13983 (ffeexprCallback) ffestb_vxtcode10_);
13985 /* EXTENSION: Allow an optional preceding COMMA here if not pedantic.
13986 (f2c provides this extension, as do other compilers, supposedly.) */
13988 if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA))
13991 return (ffelexHandler) (*next) (t);
13997 ffestb_subr_kill_vxtcode_ ();
13998 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
13999 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14002 /* ffestb_vxtcode10_ -- "VXTCODE(...)" expr
14004 (ffestb_vxtcode10_) // to expression handler
14006 Handle COMMA or EOS/SEMICOLON here.
14009 Context for ENCODE/DECODE expressions is now IOLISTDF instead of IOLIST
14010 since they apply to internal files. */
14012 static ffelexHandler
14013 ffestb_vxtcode10_ (ffelexToken ft, ffebld expr, ffelexToken t)
14015 switch (ffelex_token_type (t))
14017 case FFELEX_typeCOMMA:
14020 if (!ffesta_is_inhibited ())
14021 if (ffesta_first_kw == FFESTR_firstENCODE)
14022 ffestc_V023_item (expr, ft);
14024 ffestc_V024_item (expr, ft);
14025 if (ffesta_first_kw == FFESTR_firstDECODE)
14026 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
14027 FFEEXPR_contextIOLISTDF,
14028 (ffeexprCallback) ffestb_vxtcode10_);
14029 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14030 FFEEXPR_contextIOLISTDF,
14031 (ffeexprCallback) ffestb_vxtcode10_);
14033 case FFELEX_typeEOS:
14034 case FFELEX_typeSEMICOLON:
14037 if (!ffesta_is_inhibited ())
14039 if (ffesta_first_kw == FFESTR_firstENCODE)
14041 ffestc_V023_item (expr, ft);
14042 ffestc_V023_finish ();
14046 ffestc_V024_item (expr, ft);
14047 ffestc_V024_finish ();
14050 return (ffelexHandler) ffesta_zero (t);
14056 if (!ffesta_is_inhibited ())
14057 if (ffesta_first_kw == FFESTR_firstENCODE)
14058 ffestc_V023_finish ();
14060 ffestc_V024_finish ();
14061 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t);
14062 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14066 /* ffestb_R904 -- Parse an OPEN statement
14068 return ffestb_R904; // to lexer
14070 Make sure the statement has a valid form for an OPEN statement.
14071 If it does, implement the statement. */
14074 ffestb_R904 (ffelexToken t)
14078 switch (ffelex_token_type (ffesta_tokens[0]))
14080 case FFELEX_typeNAME:
14081 if (ffesta_first_kw != FFESTR_firstOPEN)
14082 goto bad_0; /* :::::::::::::::::::: */
14085 case FFELEX_typeNAMES:
14086 if (ffesta_first_kw != FFESTR_firstOPEN)
14087 goto bad_0; /* :::::::::::::::::::: */
14088 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlOPEN)
14089 goto bad_0; /* :::::::::::::::::::: */
14093 goto bad_0; /* :::::::::::::::::::: */
14096 switch (ffelex_token_type (t))
14098 case FFELEX_typeOPEN_PAREN:
14101 case FFELEX_typeEOS:
14102 case FFELEX_typeSEMICOLON:
14103 case FFELEX_typeCOMMA:
14104 case FFELEX_typeCOLONCOLON:
14105 ffesta_confirmed (); /* Error, but clearly intended. */
14106 goto bad_1; /* :::::::::::::::::::: */
14109 goto bad_1; /* :::::::::::::::::::: */
14112 for (ix = 0; ix < FFESTP_openix; ++ix)
14113 ffestp_file.open.open_spec[ix].kw_or_val_present = FALSE;
14115 return (ffelexHandler) ffestb_R9041_;
14117 bad_0: /* :::::::::::::::::::: */
14118 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", ffesta_tokens[0]);
14119 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14121 bad_1: /* :::::::::::::::::::: */
14122 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14123 return (ffelexHandler) ffelex_swallow_tokens (t,
14124 (ffelexHandler) ffesta_zero); /* Invalid second token. */
14127 /* ffestb_R9041_ -- "OPEN" OPEN_PAREN
14129 return ffestb_R9041_; // to lexer
14131 Handle expr construct (not NAME=expr construct) here. */
14133 static ffelexHandler
14134 ffestb_R9041_ (ffelexToken t)
14136 switch (ffelex_token_type (t))
14138 case FFELEX_typeNAME:
14139 ffesta_tokens[1] = ffelex_token_use (t);
14140 return (ffelexHandler) ffestb_R9042_;
14143 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14144 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9043_)))
14149 /* ffestb_R9042_ -- "OPEN" OPEN_PAREN NAME
14151 return ffestb_R9042_; // to lexer
14153 If EQUALS here, go to states that handle it. Else, send NAME and this
14154 token thru expression handler. */
14156 static ffelexHandler
14157 ffestb_R9042_ (ffelexToken t)
14159 ffelexHandler next;
14162 switch (ffelex_token_type (t))
14164 case FFELEX_typeEQUALS:
14165 nt = ffesta_tokens[1];
14166 next = (ffelexHandler) ffestb_R9044_ (nt);
14167 ffelex_token_kill (nt);
14168 return (ffelexHandler) (*next) (t);
14171 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14172 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9043_)))
14173 (ffesta_tokens[1]);
14174 ffelex_token_kill (ffesta_tokens[1]);
14175 return (ffelexHandler) (*next) (t);
14179 /* ffestb_R9043_ -- "OPEN" OPEN_PAREN expr
14181 (ffestb_R9043_) // to expression handler
14183 Handle COMMA or CLOSE_PAREN here. */
14185 static ffelexHandler
14186 ffestb_R9043_ (ffelexToken ft, ffebld expr, ffelexToken t)
14188 switch (ffelex_token_type (t))
14190 case FFELEX_typeCOMMA:
14191 case FFELEX_typeCLOSE_PAREN:
14194 ffestp_file.open.open_spec[FFESTP_openixUNIT].kw_or_val_present
14196 ffestp_file.open.open_spec[FFESTP_openixUNIT].kw_present = FALSE;
14197 ffestp_file.open.open_spec[FFESTP_openixUNIT].value_present = TRUE;
14198 ffestp_file.open.open_spec[FFESTP_openixUNIT].value_is_label
14200 ffestp_file.open.open_spec[FFESTP_openixUNIT].value
14201 = ffelex_token_use (ft);
14202 ffestp_file.open.open_spec[FFESTP_openixUNIT].u.expr = expr;
14203 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
14204 return (ffelexHandler) ffestb_R9044_;
14205 return (ffelexHandler) ffestb_R9049_;
14211 ffestb_subr_kill_open_ ();
14212 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14213 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14216 /* ffestb_R9044_ -- "OPEN" OPEN_PAREN [external-file-unit COMMA]
14218 return ffestb_R9044_; // to lexer
14220 Handle expr construct (not NAME=expr construct) here. */
14222 static ffelexHandler
14223 ffestb_R9044_ (ffelexToken t)
14227 ffestb_local_.open.label = FALSE;
14229 switch (ffelex_token_type (t))
14231 case FFELEX_typeNAME:
14232 kw = ffestr_open (t);
14235 case FFESTR_openACCESS:
14236 ffestb_local_.open.ix = FFESTP_openixACCESS;
14237 ffestb_local_.open.left = FALSE;
14238 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14241 case FFESTR_openACTION:
14242 ffestb_local_.open.ix = FFESTP_openixACTION;
14243 ffestb_local_.open.left = FALSE;
14244 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14247 case FFESTR_openASSOCIATEVARIABLE:
14248 ffestb_local_.open.ix = FFESTP_openixASSOCIATEVARIABLE;
14249 ffestb_local_.open.left = TRUE;
14250 ffestb_local_.open.context = FFEEXPR_contextFILEASSOC;
14253 case FFESTR_openBLANK:
14254 ffestb_local_.open.ix = FFESTP_openixBLANK;
14255 ffestb_local_.open.left = FALSE;
14256 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14259 case FFESTR_openBLOCKSIZE:
14260 ffestb_local_.open.ix = FFESTP_openixBLOCKSIZE;
14261 ffestb_local_.open.left = FALSE;
14262 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14265 case FFESTR_openBUFFERCOUNT:
14266 ffestb_local_.open.ix = FFESTP_openixBUFFERCOUNT;
14267 ffestb_local_.open.left = FALSE;
14268 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14271 case FFESTR_openCARRIAGECONTROL:
14272 ffestb_local_.open.ix = FFESTP_openixCARRIAGECONTROL;
14273 ffestb_local_.open.left = FALSE;
14274 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14277 case FFESTR_openDEFAULTFILE:
14278 ffestb_local_.open.ix = FFESTP_openixDEFAULTFILE;
14279 ffestb_local_.open.left = FALSE;
14280 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14283 case FFESTR_openDELIM:
14284 ffestb_local_.open.ix = FFESTP_openixDELIM;
14285 ffestb_local_.open.left = FALSE;
14286 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14289 case FFESTR_openDISP:
14290 case FFESTR_openDISPOSE:
14291 ffestb_local_.open.ix = FFESTP_openixDISPOSE;
14292 ffestb_local_.open.left = FALSE;
14293 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14296 case FFESTR_openERR:
14297 ffestb_local_.open.ix = FFESTP_openixERR;
14298 ffestb_local_.open.label = TRUE;
14301 case FFESTR_openEXTENDSIZE:
14302 ffestb_local_.open.ix = FFESTP_openixEXTENDSIZE;
14303 ffestb_local_.open.left = FALSE;
14304 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14307 case FFESTR_openFILE:
14308 case FFESTR_openNAME:
14309 ffestb_local_.open.ix = FFESTP_openixFILE;
14310 ffestb_local_.open.left = FALSE;
14311 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14314 case FFESTR_openFORM:
14315 ffestb_local_.open.ix = FFESTP_openixFORM;
14316 ffestb_local_.open.left = FALSE;
14317 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14320 case FFESTR_openINITIALSIZE:
14321 ffestb_local_.open.ix = FFESTP_openixINITIALSIZE;
14322 ffestb_local_.open.left = FALSE;
14323 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14326 case FFESTR_openIOSTAT:
14327 ffestb_local_.open.ix = FFESTP_openixIOSTAT;
14328 ffestb_local_.open.left = TRUE;
14329 ffestb_local_.open.context = FFEEXPR_contextFILEINT;
14332 #if 0 /* Haven't added support for expression
14333 context yet (though easy). */
14334 case FFESTR_openKEY:
14335 ffestb_local_.open.ix = FFESTP_openixKEY;
14336 ffestb_local_.open.left = FALSE;
14337 ffestb_local_.open.context = FFEEXPR_contextFILEKEY;
14341 case FFESTR_openMAXREC:
14342 ffestb_local_.open.ix = FFESTP_openixMAXREC;
14343 ffestb_local_.open.left = FALSE;
14344 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14347 case FFESTR_openNOSPANBLOCKS:
14348 if (ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS]
14349 .kw_or_val_present)
14350 goto bad; /* :::::::::::::::::::: */
14351 ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS]
14352 .kw_or_val_present = TRUE;
14353 ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS]
14354 .kw_present = TRUE;
14355 ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS]
14356 .value_present = FALSE;
14357 ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS].kw
14358 = ffelex_token_use (t);
14359 return (ffelexHandler) ffestb_R9048_;
14361 case FFESTR_openORGANIZATION:
14362 ffestb_local_.open.ix = FFESTP_openixORGANIZATION;
14363 ffestb_local_.open.left = FALSE;
14364 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14367 case FFESTR_openPAD:
14368 ffestb_local_.open.ix = FFESTP_openixPAD;
14369 ffestb_local_.open.left = FALSE;
14370 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14373 case FFESTR_openPOSITION:
14374 ffestb_local_.open.ix = FFESTP_openixPOSITION;
14375 ffestb_local_.open.left = FALSE;
14376 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14379 case FFESTR_openREADONLY:
14380 if (ffestp_file.open.open_spec[FFESTP_openixREADONLY]
14381 .kw_or_val_present)
14382 goto bad; /* :::::::::::::::::::: */
14383 ffestp_file.open.open_spec[FFESTP_openixREADONLY]
14384 .kw_or_val_present = TRUE;
14385 ffestp_file.open.open_spec[FFESTP_openixREADONLY]
14386 .kw_present = TRUE;
14387 ffestp_file.open.open_spec[FFESTP_openixREADONLY]
14388 .value_present = FALSE;
14389 ffestp_file.open.open_spec[FFESTP_openixREADONLY].kw
14390 = ffelex_token_use (t);
14391 return (ffelexHandler) ffestb_R9048_;
14393 case FFESTR_openRECL:
14394 case FFESTR_openRECORDSIZE:
14395 ffestb_local_.open.ix = FFESTP_openixRECL;
14396 ffestb_local_.open.left = FALSE;
14397 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14400 case FFESTR_openRECORDTYPE:
14401 ffestb_local_.open.ix = FFESTP_openixRECORDTYPE;
14402 ffestb_local_.open.left = FALSE;
14403 ffestb_local_.open.context = FFEEXPR_contextFILECHAR;
14406 case FFESTR_openSHARED:
14407 if (ffestp_file.open.open_spec[FFESTP_openixSHARED]
14408 .kw_or_val_present)
14409 goto bad; /* :::::::::::::::::::: */
14410 ffestp_file.open.open_spec[FFESTP_openixSHARED]
14411 .kw_or_val_present = TRUE;
14412 ffestp_file.open.open_spec[FFESTP_openixSHARED]
14413 .kw_present = TRUE;
14414 ffestp_file.open.open_spec[FFESTP_openixSHARED]
14415 .value_present = FALSE;
14416 ffestp_file.open.open_spec[FFESTP_openixSHARED].kw
14417 = ffelex_token_use (t);
14418 return (ffelexHandler) ffestb_R9048_;
14420 case FFESTR_openSTATUS:
14421 case FFESTR_openTYPE:
14422 ffestb_local_.open.ix = FFESTP_openixSTATUS;
14423 ffestb_local_.open.left = FALSE;
14424 ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR;
14427 case FFESTR_openUNIT:
14428 ffestb_local_.open.ix = FFESTP_openixUNIT;
14429 ffestb_local_.open.left = FALSE;
14430 ffestb_local_.open.context = FFEEXPR_contextFILENUM;
14433 case FFESTR_openUSEROPEN:
14434 ffestb_local_.open.ix = FFESTP_openixUSEROPEN;
14435 ffestb_local_.open.left = TRUE;
14436 ffestb_local_.open.context = FFEEXPR_contextFILEEXTFUNC;
14440 goto bad; /* :::::::::::::::::::: */
14442 if (ffestp_file.open.open_spec[ffestb_local_.open.ix]
14443 .kw_or_val_present)
14444 break; /* Can't specify a keyword twice! */
14445 ffestp_file.open.open_spec[ffestb_local_.open.ix]
14446 .kw_or_val_present = TRUE;
14447 ffestp_file.open.open_spec[ffestb_local_.open.ix]
14448 .kw_present = TRUE;
14449 ffestp_file.open.open_spec[ffestb_local_.open.ix]
14450 .value_present = FALSE;
14451 ffestp_file.open.open_spec[ffestb_local_.open.ix].value_is_label
14452 = ffestb_local_.open.label;
14453 ffestp_file.open.open_spec[ffestb_local_.open.ix].kw
14454 = ffelex_token_use (t);
14455 return (ffelexHandler) ffestb_R9045_;
14461 bad: /* :::::::::::::::::::: */
14462 ffestb_subr_kill_open_ ();
14463 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14464 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14467 /* ffestb_R9045_ -- "OPEN" OPEN_PAREN [external-file-unit COMMA] NAME
14469 return ffestb_R9045_; // to lexer
14471 Make sure EQUALS here, send next token to expression handler. */
14473 static ffelexHandler
14474 ffestb_R9045_ (ffelexToken t)
14476 switch (ffelex_token_type (t))
14478 case FFELEX_typeEQUALS:
14479 ffesta_confirmed ();
14480 if (ffestb_local_.open.label)
14481 return (ffelexHandler) ffestb_R9047_;
14482 if (ffestb_local_.open.left)
14483 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
14484 ffestb_local_.open.context,
14485 (ffeexprCallback) ffestb_R9046_);
14486 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14487 ffestb_local_.open.context,
14488 (ffeexprCallback) ffestb_R9046_);
14494 ffestb_subr_kill_open_ ();
14495 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14496 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14499 /* ffestb_R9046_ -- "OPEN" OPEN_PAREN ... NAME EQUALS expr
14501 (ffestb_R9046_) // to expression handler
14503 Handle COMMA or CLOSE_PAREN here. */
14505 static ffelexHandler
14506 ffestb_R9046_ (ffelexToken ft, ffebld expr, ffelexToken t)
14508 switch (ffelex_token_type (t))
14510 case FFELEX_typeCOMMA:
14511 case FFELEX_typeCLOSE_PAREN:
14514 ffestp_file.open.open_spec[ffestb_local_.open.ix].value_present
14516 ffestp_file.open.open_spec[ffestb_local_.open.ix].value
14517 = ffelex_token_use (ft);
14518 ffestp_file.open.open_spec[ffestb_local_.open.ix].u.expr = expr;
14519 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
14520 return (ffelexHandler) ffestb_R9044_;
14521 return (ffelexHandler) ffestb_R9049_;
14527 ffestb_subr_kill_open_ ();
14528 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14529 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14532 /* ffestb_R9047_ -- "OPEN" OPEN_PAREN ... NAME EQUALS
14534 return ffestb_R9047_; // to lexer
14536 Handle NUMBER for label here. */
14538 static ffelexHandler
14539 ffestb_R9047_ (ffelexToken t)
14541 switch (ffelex_token_type (t))
14543 case FFELEX_typeNUMBER:
14544 ffestp_file.open.open_spec[ffestb_local_.open.ix].value_present
14546 ffestp_file.open.open_spec[ffestb_local_.open.ix].value
14547 = ffelex_token_use (t);
14548 return (ffelexHandler) ffestb_R9048_;
14554 ffestb_subr_kill_open_ ();
14555 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14556 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14559 /* ffestb_R9048_ -- "OPEN" OPEN_PAREN ... NAME EQUALS NUMBER
14561 return ffestb_R9048_; // to lexer
14563 Handle COMMA or CLOSE_PAREN here. */
14565 static ffelexHandler
14566 ffestb_R9048_ (ffelexToken t)
14568 switch (ffelex_token_type (t))
14570 case FFELEX_typeCOMMA:
14571 return (ffelexHandler) ffestb_R9044_;
14573 case FFELEX_typeCLOSE_PAREN:
14574 return (ffelexHandler) ffestb_R9049_;
14580 ffestb_subr_kill_open_ ();
14581 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14582 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14585 /* ffestb_R9049_ -- "OPEN" OPEN_PAREN ... CLOSE_PAREN
14587 return ffestb_R9049_; // to lexer
14589 Handle EOS or SEMICOLON here. */
14591 static ffelexHandler
14592 ffestb_R9049_ (ffelexToken t)
14594 switch (ffelex_token_type (t))
14596 case FFELEX_typeEOS:
14597 case FFELEX_typeSEMICOLON:
14598 ffesta_confirmed ();
14599 if (!ffesta_is_inhibited ())
14601 ffestb_subr_kill_open_ ();
14602 return (ffelexHandler) ffesta_zero (t);
14608 ffestb_subr_kill_open_ ();
14609 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t);
14610 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14613 /* ffestb_R907 -- Parse a CLOSE statement
14615 return ffestb_R907; // to lexer
14617 Make sure the statement has a valid form for a CLOSE statement.
14618 If it does, implement the statement. */
14621 ffestb_R907 (ffelexToken t)
14625 switch (ffelex_token_type (ffesta_tokens[0]))
14627 case FFELEX_typeNAME:
14628 if (ffesta_first_kw != FFESTR_firstCLOSE)
14629 goto bad_0; /* :::::::::::::::::::: */
14632 case FFELEX_typeNAMES:
14633 if (ffesta_first_kw != FFESTR_firstCLOSE)
14634 goto bad_0; /* :::::::::::::::::::: */
14635 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCLOSE)
14636 goto bad_0; /* :::::::::::::::::::: */
14640 goto bad_0; /* :::::::::::::::::::: */
14643 switch (ffelex_token_type (t))
14645 case FFELEX_typeOPEN_PAREN:
14648 case FFELEX_typeEOS:
14649 case FFELEX_typeSEMICOLON:
14650 case FFELEX_typeCOMMA:
14651 case FFELEX_typeCOLONCOLON:
14652 ffesta_confirmed (); /* Error, but clearly intended. */
14653 goto bad_1; /* :::::::::::::::::::: */
14656 goto bad_1; /* :::::::::::::::::::: */
14659 for (ix = 0; ix < FFESTP_closeix; ++ix)
14660 ffestp_file.close.close_spec[ix].kw_or_val_present = FALSE;
14662 return (ffelexHandler) ffestb_R9071_;
14664 bad_0: /* :::::::::::::::::::: */
14665 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", ffesta_tokens[0]);
14666 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14668 bad_1: /* :::::::::::::::::::: */
14669 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14670 return (ffelexHandler) ffelex_swallow_tokens (t,
14671 (ffelexHandler) ffesta_zero); /* Invalid second token. */
14674 /* ffestb_R9071_ -- "CLOSE" OPEN_PAREN
14676 return ffestb_R9071_; // to lexer
14678 Handle expr construct (not NAME=expr construct) here. */
14680 static ffelexHandler
14681 ffestb_R9071_ (ffelexToken t)
14683 switch (ffelex_token_type (t))
14685 case FFELEX_typeNAME:
14686 ffesta_tokens[1] = ffelex_token_use (t);
14687 return (ffelexHandler) ffestb_R9072_;
14690 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14691 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9073_)))
14696 /* ffestb_R9072_ -- "CLOSE" OPEN_PAREN NAME
14698 return ffestb_R9072_; // to lexer
14700 If EQUALS here, go to states that handle it. Else, send NAME and this
14701 token thru expression handler. */
14703 static ffelexHandler
14704 ffestb_R9072_ (ffelexToken t)
14706 ffelexHandler next;
14709 switch (ffelex_token_type (t))
14711 case FFELEX_typeEQUALS:
14712 nt = ffesta_tokens[1];
14713 next = (ffelexHandler) ffestb_R9074_ (nt);
14714 ffelex_token_kill (nt);
14715 return (ffelexHandler) (*next) (t);
14718 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14719 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9073_)))
14720 (ffesta_tokens[1]);
14721 ffelex_token_kill (ffesta_tokens[1]);
14722 return (ffelexHandler) (*next) (t);
14726 /* ffestb_R9073_ -- "CLOSE" OPEN_PAREN expr
14728 (ffestb_R9073_) // to expression handler
14730 Handle COMMA or CLOSE_PAREN here. */
14732 static ffelexHandler
14733 ffestb_R9073_ (ffelexToken ft, ffebld expr, ffelexToken t)
14735 switch (ffelex_token_type (t))
14737 case FFELEX_typeCOMMA:
14738 case FFELEX_typeCLOSE_PAREN:
14741 ffestp_file.close.close_spec[FFESTP_closeixUNIT].kw_or_val_present
14743 ffestp_file.close.close_spec[FFESTP_closeixUNIT].kw_present = FALSE;
14744 ffestp_file.close.close_spec[FFESTP_closeixUNIT].value_present = TRUE;
14745 ffestp_file.close.close_spec[FFESTP_closeixUNIT].value_is_label
14747 ffestp_file.close.close_spec[FFESTP_closeixUNIT].value
14748 = ffelex_token_use (ft);
14749 ffestp_file.close.close_spec[FFESTP_closeixUNIT].u.expr = expr;
14750 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
14751 return (ffelexHandler) ffestb_R9074_;
14752 return (ffelexHandler) ffestb_R9079_;
14758 ffestb_subr_kill_close_ ();
14759 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14760 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14763 /* ffestb_R9074_ -- "CLOSE" OPEN_PAREN [external-file-unit COMMA]
14765 return ffestb_R9074_; // to lexer
14767 Handle expr construct (not NAME=expr construct) here. */
14769 static ffelexHandler
14770 ffestb_R9074_ (ffelexToken t)
14774 ffestb_local_.close.label = FALSE;
14776 switch (ffelex_token_type (t))
14778 case FFELEX_typeNAME:
14779 kw = ffestr_genio (t);
14782 case FFESTR_genioERR:
14783 ffestb_local_.close.ix = FFESTP_closeixERR;
14784 ffestb_local_.close.label = TRUE;
14787 case FFESTR_genioIOSTAT:
14788 ffestb_local_.close.ix = FFESTP_closeixIOSTAT;
14789 ffestb_local_.close.left = TRUE;
14790 ffestb_local_.close.context = FFEEXPR_contextFILEINT;
14793 case FFESTR_genioSTATUS:
14794 case FFESTR_genioDISP:
14795 case FFESTR_genioDISPOSE:
14796 ffestb_local_.close.ix = FFESTP_closeixSTATUS;
14797 ffestb_local_.close.left = FALSE;
14798 ffestb_local_.close.context = FFEEXPR_contextFILEDFCHAR;
14801 case FFESTR_genioUNIT:
14802 ffestb_local_.close.ix = FFESTP_closeixUNIT;
14803 ffestb_local_.close.left = FALSE;
14804 ffestb_local_.close.context = FFEEXPR_contextFILENUM;
14808 goto bad; /* :::::::::::::::::::: */
14810 if (ffestp_file.close.close_spec[ffestb_local_.close.ix]
14811 .kw_or_val_present)
14812 break; /* Can't specify a keyword twice! */
14813 ffestp_file.close.close_spec[ffestb_local_.close.ix]
14814 .kw_or_val_present = TRUE;
14815 ffestp_file.close.close_spec[ffestb_local_.close.ix]
14816 .kw_present = TRUE;
14817 ffestp_file.close.close_spec[ffestb_local_.close.ix]
14818 .value_present = FALSE;
14819 ffestp_file.close.close_spec[ffestb_local_.close.ix].value_is_label
14820 = ffestb_local_.close.label;
14821 ffestp_file.close.close_spec[ffestb_local_.close.ix].kw
14822 = ffelex_token_use (t);
14823 return (ffelexHandler) ffestb_R9075_;
14829 bad: /* :::::::::::::::::::: */
14830 ffestb_subr_kill_close_ ();
14831 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14832 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14835 /* ffestb_R9075_ -- "CLOSE" OPEN_PAREN [external-file-unit COMMA] NAME
14837 return ffestb_R9075_; // to lexer
14839 Make sure EQUALS here, send next token to expression handler. */
14841 static ffelexHandler
14842 ffestb_R9075_ (ffelexToken t)
14844 switch (ffelex_token_type (t))
14846 case FFELEX_typeEQUALS:
14847 ffesta_confirmed ();
14848 if (ffestb_local_.close.label)
14849 return (ffelexHandler) ffestb_R9077_;
14850 if (ffestb_local_.close.left)
14851 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
14852 ffestb_local_.close.context,
14853 (ffeexprCallback) ffestb_R9076_);
14854 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
14855 ffestb_local_.close.context,
14856 (ffeexprCallback) ffestb_R9076_);
14862 ffestb_subr_kill_close_ ();
14863 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14864 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14867 /* ffestb_R9076_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS expr
14869 (ffestb_R9076_) // to expression handler
14871 Handle COMMA or CLOSE_PAREN here. */
14873 static ffelexHandler
14874 ffestb_R9076_ (ffelexToken ft, ffebld expr, ffelexToken t)
14876 switch (ffelex_token_type (t))
14878 case FFELEX_typeCOMMA:
14879 case FFELEX_typeCLOSE_PAREN:
14882 ffestp_file.close.close_spec[ffestb_local_.close.ix].value_present
14884 ffestp_file.close.close_spec[ffestb_local_.close.ix].value
14885 = ffelex_token_use (ft);
14886 ffestp_file.close.close_spec[ffestb_local_.close.ix].u.expr = expr;
14887 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
14888 return (ffelexHandler) ffestb_R9074_;
14889 return (ffelexHandler) ffestb_R9079_;
14895 ffestb_subr_kill_close_ ();
14896 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14897 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14900 /* ffestb_R9077_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS
14902 return ffestb_R9077_; // to lexer
14904 Handle NUMBER for label here. */
14906 static ffelexHandler
14907 ffestb_R9077_ (ffelexToken t)
14909 switch (ffelex_token_type (t))
14911 case FFELEX_typeNUMBER:
14912 ffestp_file.close.close_spec[ffestb_local_.close.ix].value_present
14914 ffestp_file.close.close_spec[ffestb_local_.close.ix].value
14915 = ffelex_token_use (t);
14916 return (ffelexHandler) ffestb_R9078_;
14922 ffestb_subr_kill_close_ ();
14923 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14924 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14927 /* ffestb_R9078_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS NUMBER
14929 return ffestb_R9078_; // to lexer
14931 Handle COMMA or CLOSE_PAREN here. */
14933 static ffelexHandler
14934 ffestb_R9078_ (ffelexToken t)
14936 switch (ffelex_token_type (t))
14938 case FFELEX_typeCOMMA:
14939 return (ffelexHandler) ffestb_R9074_;
14941 case FFELEX_typeCLOSE_PAREN:
14942 return (ffelexHandler) ffestb_R9079_;
14948 ffestb_subr_kill_close_ ();
14949 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14950 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14953 /* ffestb_R9079_ -- "CLOSE" OPEN_PAREN ... CLOSE_PAREN
14955 return ffestb_R9079_; // to lexer
14957 Handle EOS or SEMICOLON here. */
14959 static ffelexHandler
14960 ffestb_R9079_ (ffelexToken t)
14962 switch (ffelex_token_type (t))
14964 case FFELEX_typeEOS:
14965 case FFELEX_typeSEMICOLON:
14966 ffesta_confirmed ();
14967 if (!ffesta_is_inhibited ())
14969 ffestb_subr_kill_close_ ();
14970 return (ffelexHandler) ffesta_zero (t);
14976 ffestb_subr_kill_close_ ();
14977 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t);
14978 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
14981 /* ffestb_R909 -- Parse the READ statement
14983 return ffestb_R909; // to lexer
14985 Make sure the statement has a valid form for the READ
14986 statement. If it does, implement the statement. */
14989 ffestb_R909 (ffelexToken t)
14991 ffelexHandler next;
14994 switch (ffelex_token_type (ffesta_tokens[0]))
14996 case FFELEX_typeNAME:
14997 if (ffesta_first_kw != FFESTR_firstREAD)
14998 goto bad_0; /* :::::::::::::::::::: */
14999 switch (ffelex_token_type (t))
15001 case FFELEX_typeCOMMA:
15002 case FFELEX_typeCOLONCOLON:
15003 case FFELEX_typeEOS:
15004 case FFELEX_typeSEMICOLON:
15005 ffesta_confirmed (); /* Error, but clearly intended. */
15006 goto bad_1; /* :::::::::::::::::::: */
15008 case FFELEX_typeEQUALS:
15009 case FFELEX_typePOINTS:
15010 case FFELEX_typeCOLON:
15011 goto bad_1; /* :::::::::::::::::::: */
15013 case FFELEX_typeNAME:
15014 case FFELEX_typeNUMBER:
15015 ffesta_confirmed ();
15018 case FFELEX_typeOPEN_PAREN:
15019 for (ix = 0; ix < FFESTP_readix; ++ix)
15020 ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE;
15021 ffesta_tokens[1] = ffelex_token_use (t);
15022 return (ffelexHandler) ffestb_R9092_;
15028 for (ix = 0; ix < FFESTP_readix; ++ix)
15029 ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE;
15030 return (ffelexHandler) (*((ffelexHandler)
15031 ffeexpr_rhs (ffesta_output_pool,
15032 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9091_)))
15035 case FFELEX_typeNAMES:
15036 if (ffesta_first_kw != FFESTR_firstREAD)
15037 goto bad_0; /* :::::::::::::::::::: */
15038 switch (ffelex_token_type (t))
15040 case FFELEX_typeEOS:
15041 case FFELEX_typeSEMICOLON:
15042 case FFELEX_typeCOMMA:
15043 ffesta_confirmed ();
15044 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREAD)
15046 goto bad_1; /* :::::::::::::::::::: */
15048 case FFELEX_typeCOLONCOLON:
15049 ffesta_confirmed (); /* Error, but clearly intended. */
15050 goto bad_1; /* :::::::::::::::::::: */
15052 case FFELEX_typeEQUALS:
15053 case FFELEX_typePOINTS:
15054 case FFELEX_typeCOLON:
15055 goto bad_1; /* :::::::::::::::::::: */
15057 case FFELEX_typeOPEN_PAREN:
15058 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREAD)
15061 for (ix = 0; ix < FFESTP_readix; ++ix)
15062 ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE;
15063 ffesta_tokens[1] = ffelex_token_use (t);
15064 return (ffelexHandler) ffestb_R9092_;
15069 for (ix = 0; ix < FFESTP_readix; ++ix)
15070 ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE;
15071 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15072 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9091_);
15073 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
15074 FFESTR_firstlREAD);
15076 return (ffelexHandler) ffelex_swallow_tokens (t,
15077 (ffelexHandler) ffesta_zero);
15078 return (ffelexHandler) (*next) (t);
15081 goto bad_0; /* :::::::::::::::::::: */
15084 bad_0: /* :::::::::::::::::::: */
15085 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", ffesta_tokens[0]);
15086 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15088 bad_1: /* :::::::::::::::::::: */
15089 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15090 return (ffelexHandler) ffelex_swallow_tokens (t,
15091 (ffelexHandler) ffesta_zero); /* Invalid second token. */
15094 /* ffestb_R9091_ -- "READ" expr
15096 (ffestb_R9091_) // to expression handler
15098 Make sure the next token is a COMMA or EOS/SEMICOLON. */
15100 static ffelexHandler
15101 ffestb_R9091_ (ffelexToken ft, ffebld expr, ffelexToken t)
15103 switch (ffelex_token_type (t))
15105 case FFELEX_typeEOS:
15106 case FFELEX_typeSEMICOLON:
15107 case FFELEX_typeCOMMA:
15108 ffesta_confirmed ();
15109 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present
15111 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE;
15112 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE;
15113 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label
15115 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value
15116 = ffelex_token_use (ft);
15117 ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr;
15118 if (!ffesta_is_inhibited ())
15119 ffestc_R909_start (TRUE);
15120 ffestb_subr_kill_read_ ();
15121 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15122 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
15123 ffestc_context_iolist (),
15124 (ffeexprCallback) ffestb_R90915_);
15125 if (!ffesta_is_inhibited ())
15126 ffestc_R909_finish ();
15127 return (ffelexHandler) ffesta_zero (t);
15133 ffestb_subr_kill_read_ ();
15134 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15135 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15138 /* ffestb_R9092_ -- "READ" OPEN_PAREN
15140 return ffestb_R9092_; // to lexer
15142 Handle expr construct (not NAME=expr construct) here. */
15144 static ffelexHandler
15145 ffestb_R9092_ (ffelexToken t)
15148 ffelexHandler next;
15150 switch (ffelex_token_type (t))
15152 case FFELEX_typeNAME:
15153 ffesta_tokens[2] = ffelex_token_use (t);
15154 return (ffelexHandler) ffestb_R9093_;
15157 nt = ffesta_tokens[1];
15158 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15159 FFEEXPR_contextFILEUNITAMBIG, (ffeexprCallback) ffestb_R9094_)))
15161 ffelex_token_kill (nt);
15162 return (ffelexHandler) (*next) (t);
15166 /* ffestb_R9093_ -- "READ" OPEN_PAREN NAME
15168 return ffestb_R9093_; // to lexer
15170 If EQUALS here, go to states that handle it. Else, send NAME and this
15171 token thru expression handler. */
15173 static ffelexHandler
15174 ffestb_R9093_ (ffelexToken t)
15176 ffelexHandler next;
15180 switch (ffelex_token_type (t))
15182 case FFELEX_typeEQUALS:
15183 ffelex_token_kill (ffesta_tokens[1]);
15184 nt = ffesta_tokens[2];
15185 next = (ffelexHandler) ffestb_R9098_ (nt);
15186 ffelex_token_kill (nt);
15187 return (ffelexHandler) (*next) (t);
15190 nt = ffesta_tokens[1];
15191 ot = ffesta_tokens[2];
15192 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15193 FFEEXPR_contextFILEUNITAMBIG, (ffeexprCallback) ffestb_R9094_)))
15195 ffelex_token_kill (nt);
15196 next = (ffelexHandler) (*next) (ot);
15197 ffelex_token_kill (ot);
15198 return (ffelexHandler) (*next) (t);
15202 /* ffestb_R9094_ -- "READ" OPEN_PAREN expr [CLOSE_PAREN]
15204 (ffestb_R9094_) // to expression handler
15206 Handle COMMA or EOS/SEMICOLON here.
15209 Use new ffeexpr mechanism whereby the expr is encased in an opITEM if
15210 ffeexpr decided it was an item in a control list (hence a unit
15211 specifier), or a format specifier otherwise. */
15213 static ffelexHandler
15214 ffestb_R9094_ (ffelexToken ft, ffebld expr, ffelexToken t)
15217 goto bad; /* :::::::::::::::::::: */
15219 if (ffebld_op (expr) != FFEBLD_opITEM)
15221 switch (ffelex_token_type (t))
15223 case FFELEX_typeCOMMA:
15224 case FFELEX_typeEOS:
15225 case FFELEX_typeSEMICOLON:
15226 ffesta_confirmed ();
15227 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present
15229 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE;
15230 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE;
15231 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label
15233 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value
15234 = ffelex_token_use (ft);
15235 ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr;
15236 if (!ffesta_is_inhibited ())
15237 ffestc_R909_start (TRUE);
15238 ffestb_subr_kill_read_ ();
15239 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15240 return (ffelexHandler)
15241 ffeexpr_lhs (ffesta_output_pool,
15242 ffestc_context_iolist (),
15243 (ffeexprCallback) ffestb_R90915_);
15244 if (!ffesta_is_inhibited ())
15245 ffestc_R909_finish ();
15246 return (ffelexHandler) ffesta_zero (t);
15249 goto bad; /* :::::::::::::::::::: */
15253 expr = ffebld_head (expr);
15256 goto bad; /* :::::::::::::::::::: */
15258 switch (ffelex_token_type (t))
15260 case FFELEX_typeCOMMA:
15261 case FFELEX_typeCLOSE_PAREN:
15262 ffestp_file.read.read_spec[FFESTP_readixUNIT].kw_or_val_present
15264 ffestp_file.read.read_spec[FFESTP_readixUNIT].kw_present = FALSE;
15265 ffestp_file.read.read_spec[FFESTP_readixUNIT].value_present = TRUE;
15266 ffestp_file.read.read_spec[FFESTP_readixUNIT].value_is_label
15268 ffestp_file.read.read_spec[FFESTP_readixUNIT].value
15269 = ffelex_token_use (ft);
15270 ffestp_file.read.read_spec[FFESTP_readixUNIT].u.expr = expr;
15271 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15272 return (ffelexHandler) ffestb_R9095_;
15273 return (ffelexHandler) ffestb_R90913_;
15279 bad: /* :::::::::::::::::::: */
15280 ffestb_subr_kill_read_ ();
15281 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15282 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15285 /* ffestb_R9095_ -- "READ" OPEN_PAREN expr COMMA
15287 return ffestb_R9095_; // to lexer
15289 Handle expr construct (not NAME=expr construct) here. */
15291 static ffelexHandler
15292 ffestb_R9095_ (ffelexToken t)
15294 switch (ffelex_token_type (t))
15296 case FFELEX_typeNAME:
15297 ffesta_tokens[1] = ffelex_token_use (t);
15298 return (ffelexHandler) ffestb_R9096_;
15301 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15302 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9097_)))
15307 /* ffestb_R9096_ -- "READ" OPEN_PAREN expr COMMA NAME
15309 return ffestb_R9096_; // to lexer
15311 If EQUALS here, go to states that handle it. Else, send NAME and this
15312 token thru expression handler. */
15314 static ffelexHandler
15315 ffestb_R9096_ (ffelexToken t)
15317 ffelexHandler next;
15320 switch (ffelex_token_type (t))
15322 case FFELEX_typeEQUALS:
15323 nt = ffesta_tokens[1];
15324 next = (ffelexHandler) ffestb_R9098_ (nt);
15325 ffelex_token_kill (nt);
15326 return (ffelexHandler) (*next) (t);
15329 nt = ffesta_tokens[1];
15330 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15331 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9097_)))
15333 ffelex_token_kill (nt);
15334 return (ffelexHandler) (*next) (t);
15338 /* ffestb_R9097_ -- "READ" OPEN_PAREN expr COMMA expr
15340 (ffestb_R9097_) // to expression handler
15342 Handle COMMA or CLOSE_PAREN here. */
15344 static ffelexHandler
15345 ffestb_R9097_ (ffelexToken ft, ffebld expr, ffelexToken t)
15347 switch (ffelex_token_type (t))
15349 case FFELEX_typeCOMMA:
15350 case FFELEX_typeCLOSE_PAREN:
15351 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present
15353 ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE;
15354 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE;
15355 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label
15357 ffestp_file.read.read_spec[FFESTP_readixFORMAT].value
15358 = ffelex_token_use (ft);
15359 ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr;
15360 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15361 return (ffelexHandler) ffestb_R9098_;
15362 return (ffelexHandler) ffestb_R90913_;
15368 ffestb_subr_kill_read_ ();
15369 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15370 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15373 /* ffestb_R9098_ -- "READ" OPEN_PAREN [external-file-unit COMMA [format
15376 return ffestb_R9098_; // to lexer
15378 Handle expr construct (not NAME=expr construct) here. */
15380 static ffelexHandler
15381 ffestb_R9098_ (ffelexToken t)
15385 ffestb_local_.read.label = FALSE;
15387 switch (ffelex_token_type (t))
15389 case FFELEX_typeNAME:
15390 kw = ffestr_genio (t);
15393 case FFESTR_genioADVANCE:
15394 ffestb_local_.read.ix = FFESTP_readixADVANCE;
15395 ffestb_local_.read.left = FALSE;
15396 ffestb_local_.read.context = FFEEXPR_contextFILEDFCHAR;
15399 case FFESTR_genioEOR:
15400 ffestb_local_.read.ix = FFESTP_readixEOR;
15401 ffestb_local_.read.label = TRUE;
15404 case FFESTR_genioERR:
15405 ffestb_local_.read.ix = FFESTP_readixERR;
15406 ffestb_local_.read.label = TRUE;
15409 case FFESTR_genioEND:
15410 ffestb_local_.read.ix = FFESTP_readixEND;
15411 ffestb_local_.read.label = TRUE;
15414 case FFESTR_genioFMT:
15415 ffestb_local_.read.ix = FFESTP_readixFORMAT;
15416 ffestb_local_.read.left = FALSE;
15417 ffestb_local_.read.context = FFEEXPR_contextFILEFORMAT;
15420 case FFESTR_genioIOSTAT:
15421 ffestb_local_.read.ix = FFESTP_readixIOSTAT;
15422 ffestb_local_.read.left = TRUE;
15423 ffestb_local_.read.context = FFEEXPR_contextFILEINT;
15426 case FFESTR_genioKEY:
15427 case FFESTR_genioKEYEQ:
15428 ffestb_local_.read.ix = FFESTP_readixKEYEQ;
15429 ffestb_local_.read.left = FALSE;
15430 ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR;
15433 case FFESTR_genioKEYGE:
15434 ffestb_local_.read.ix = FFESTP_readixKEYGE;
15435 ffestb_local_.read.left = FALSE;
15436 ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR;
15439 case FFESTR_genioKEYGT:
15440 ffestb_local_.read.ix = FFESTP_readixKEYGT;
15441 ffestb_local_.read.left = FALSE;
15442 ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR;
15445 case FFESTR_genioKEYID:
15446 ffestb_local_.read.ix = FFESTP_readixKEYID;
15447 ffestb_local_.read.left = FALSE;
15448 ffestb_local_.read.context = FFEEXPR_contextFILENUM;
15451 case FFESTR_genioNML:
15452 ffestb_local_.read.ix = FFESTP_readixFORMAT;
15453 ffestb_local_.read.left = TRUE;
15454 ffestb_local_.read.context = FFEEXPR_contextFILENAMELIST;
15457 case FFESTR_genioNULLS:
15458 ffestb_local_.read.ix = FFESTP_readixNULLS;
15459 ffestb_local_.read.left = TRUE;
15460 ffestb_local_.read.context = FFEEXPR_contextFILEINT;
15463 case FFESTR_genioREC:
15464 ffestb_local_.read.ix = FFESTP_readixREC;
15465 ffestb_local_.read.left = FALSE;
15466 ffestb_local_.read.context = FFEEXPR_contextFILENUM;
15469 case FFESTR_genioSIZE:
15470 ffestb_local_.read.ix = FFESTP_readixSIZE;
15471 ffestb_local_.read.left = TRUE;
15472 ffestb_local_.read.context = FFEEXPR_contextFILEINT;
15475 case FFESTR_genioUNIT:
15476 ffestb_local_.read.ix = FFESTP_readixUNIT;
15477 ffestb_local_.read.left = FALSE;
15478 ffestb_local_.read.context = FFEEXPR_contextFILEUNIT;
15482 goto bad; /* :::::::::::::::::::: */
15484 if (ffestp_file.read.read_spec[ffestb_local_.read.ix]
15485 .kw_or_val_present)
15486 break; /* Can't specify a keyword twice! */
15487 ffestp_file.read.read_spec[ffestb_local_.read.ix]
15488 .kw_or_val_present = TRUE;
15489 ffestp_file.read.read_spec[ffestb_local_.read.ix]
15490 .kw_present = TRUE;
15491 ffestp_file.read.read_spec[ffestb_local_.read.ix]
15492 .value_present = FALSE;
15493 ffestp_file.read.read_spec[ffestb_local_.read.ix].value_is_label
15494 = ffestb_local_.read.label;
15495 ffestp_file.read.read_spec[ffestb_local_.read.ix].kw
15496 = ffelex_token_use (t);
15497 return (ffelexHandler) ffestb_R9099_;
15503 bad: /* :::::::::::::::::::: */
15504 ffestb_subr_kill_read_ ();
15505 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15506 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15509 /* ffestb_R9099_ -- "READ" OPEN_PAREN [external-file-unit COMMA [format
15512 return ffestb_R9099_; // to lexer
15514 Make sure EQUALS here, send next token to expression handler. */
15516 static ffelexHandler
15517 ffestb_R9099_ (ffelexToken t)
15519 switch (ffelex_token_type (t))
15521 case FFELEX_typeEQUALS:
15522 ffesta_confirmed ();
15523 if (ffestb_local_.read.label)
15524 return (ffelexHandler) ffestb_R90911_;
15525 if (ffestb_local_.read.left)
15526 return (ffelexHandler)
15527 ffeexpr_lhs (ffesta_output_pool,
15528 ffestb_local_.read.context,
15529 (ffeexprCallback) ffestb_R90910_);
15530 return (ffelexHandler)
15531 ffeexpr_rhs (ffesta_output_pool,
15532 ffestb_local_.read.context,
15533 (ffeexprCallback) ffestb_R90910_);
15539 ffestb_subr_kill_read_ ();
15540 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15541 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15544 /* ffestb_R90910_ -- "READ" OPEN_PAREN ... NAME EQUALS expr
15546 (ffestb_R90910_) // to expression handler
15548 Handle COMMA or CLOSE_PAREN here. */
15550 static ffelexHandler
15551 ffestb_R90910_ (ffelexToken ft, ffebld expr, ffelexToken t)
15553 switch (ffelex_token_type (t))
15555 case FFELEX_typeCOMMA:
15556 case FFELEX_typeCLOSE_PAREN:
15559 if (ffestb_local_.read.context == FFEEXPR_contextFILEFORMAT)
15560 ffestp_file.read.read_spec[ffestb_local_.read.ix]
15561 .value_is_label = TRUE;
15565 ffestp_file.read.read_spec[ffestb_local_.read.ix].value_present
15567 ffestp_file.read.read_spec[ffestb_local_.read.ix].value
15568 = ffelex_token_use (ft);
15569 ffestp_file.read.read_spec[ffestb_local_.read.ix].u.expr = expr;
15570 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15571 return (ffelexHandler) ffestb_R9098_;
15572 return (ffelexHandler) ffestb_R90913_;
15578 ffestb_subr_kill_read_ ();
15579 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15580 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15583 /* ffestb_R90911_ -- "READ" OPEN_PAREN ... NAME EQUALS
15585 return ffestb_R90911_; // to lexer
15587 Handle NUMBER for label here. */
15589 static ffelexHandler
15590 ffestb_R90911_ (ffelexToken t)
15592 switch (ffelex_token_type (t))
15594 case FFELEX_typeNUMBER:
15595 ffestp_file.read.read_spec[ffestb_local_.read.ix].value_present
15597 ffestp_file.read.read_spec[ffestb_local_.read.ix].value
15598 = ffelex_token_use (t);
15599 return (ffelexHandler) ffestb_R90912_;
15605 ffestb_subr_kill_read_ ();
15606 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15607 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15610 /* ffestb_R90912_ -- "READ" OPEN_PAREN ... NAME EQUALS NUMBER
15612 return ffestb_R90912_; // to lexer
15614 Handle COMMA or CLOSE_PAREN here. */
15616 static ffelexHandler
15617 ffestb_R90912_ (ffelexToken t)
15619 switch (ffelex_token_type (t))
15621 case FFELEX_typeCOMMA:
15622 return (ffelexHandler) ffestb_R9098_;
15624 case FFELEX_typeCLOSE_PAREN:
15625 return (ffelexHandler) ffestb_R90913_;
15631 ffestb_subr_kill_read_ ();
15632 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15633 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15636 /* ffestb_R90913_ -- "READ" OPEN_PAREN ... CLOSE_PAREN
15638 return ffestb_R90913_; // to lexer
15640 Handle EOS or SEMICOLON here.
15643 Fix to allow implied-DO construct here (OPEN_PAREN) -- actually,
15644 don't presume knowledge of what an initial token in an lhs context
15645 is going to be, let ffeexpr_lhs handle that as much as possible. */
15647 static ffelexHandler
15648 ffestb_R90913_ (ffelexToken t)
15650 switch (ffelex_token_type (t))
15652 case FFELEX_typeEOS:
15653 case FFELEX_typeSEMICOLON:
15654 ffesta_confirmed ();
15655 if (!ffesta_is_inhibited ())
15657 ffestc_R909_start (FALSE);
15658 ffestc_R909_finish ();
15660 ffestb_subr_kill_read_ ();
15661 return (ffelexHandler) ffesta_zero (t);
15664 ffesta_confirmed ();
15665 /* Fall through. */
15666 case FFELEX_typeOPEN_PAREN: /* Could still be assignment!! */
15670 /* If token isn't NAME or OPEN_PAREN, ffeexpr_lhs will ultimately whine
15671 about it, so leave it up to that code. */
15673 /* EXTENSION: Allow an optional preceding COMMA here if not pedantic. (f2c
15674 provides this extension, as do other compilers, supposedly.) */
15676 if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA))
15677 return (ffelexHandler)
15678 ffeexpr_lhs (ffesta_output_pool,
15679 ffestc_context_iolist (),
15680 (ffeexprCallback) ffestb_R90914_);
15682 return (ffelexHandler) (*((ffelexHandler)
15683 ffeexpr_lhs (ffesta_output_pool,
15684 ffestc_context_iolist (),
15685 (ffeexprCallback) ffestb_R90914_)))
15689 /* ffestb_R90914_ -- "READ(...)" expr
15691 (ffestb_R90914_) // to expression handler
15693 Handle COMMA or EOS/SEMICOLON here. */
15695 static ffelexHandler
15696 ffestb_R90914_ (ffelexToken ft, ffebld expr, ffelexToken t)
15698 switch (ffelex_token_type (t))
15700 case FFELEX_typeCOMMA:
15704 ffesta_confirmed ();
15705 if (!ffesta_is_inhibited ())
15706 ffestc_R909_start (FALSE);
15707 ffestb_subr_kill_read_ ();
15709 if (!ffesta_is_inhibited ())
15710 ffestc_R909_item (expr, ft);
15711 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
15712 ffestc_context_iolist (),
15713 (ffeexprCallback) ffestb_R90915_);
15715 case FFELEX_typeEOS:
15716 case FFELEX_typeSEMICOLON:
15720 ffesta_confirmed ();
15721 if (!ffesta_is_inhibited ())
15722 ffestc_R909_start (FALSE);
15723 ffestb_subr_kill_read_ ();
15725 if (!ffesta_is_inhibited ())
15727 ffestc_R909_item (expr, ft);
15728 ffestc_R909_finish ();
15730 return (ffelexHandler) ffesta_zero (t);
15736 ffestb_subr_kill_read_ ();
15737 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15738 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15741 /* ffestb_R90915_ -- "READ(...)" expr COMMA expr
15743 (ffestb_R90915_) // to expression handler
15745 Handle COMMA or EOS/SEMICOLON here. */
15747 static ffelexHandler
15748 ffestb_R90915_ (ffelexToken ft, ffebld expr, ffelexToken t)
15750 switch (ffelex_token_type (t))
15752 case FFELEX_typeCOMMA:
15755 if (!ffesta_is_inhibited ())
15756 ffestc_R909_item (expr, ft);
15757 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
15758 ffestc_context_iolist (),
15759 (ffeexprCallback) ffestb_R90915_);
15761 case FFELEX_typeEOS:
15762 case FFELEX_typeSEMICOLON:
15765 if (!ffesta_is_inhibited ())
15767 ffestc_R909_item (expr, ft);
15768 ffestc_R909_finish ();
15770 return (ffelexHandler) ffesta_zero (t);
15776 if (!ffesta_is_inhibited ())
15777 ffestc_R909_finish ();
15778 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t);
15779 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15782 /* ffestb_R910 -- Parse the WRITE statement
15784 return ffestb_R910; // to lexer
15786 Make sure the statement has a valid form for the WRITE
15787 statement. If it does, implement the statement. */
15790 ffestb_R910 (ffelexToken t)
15794 switch (ffelex_token_type (ffesta_tokens[0]))
15796 case FFELEX_typeNAME:
15797 if (ffesta_first_kw != FFESTR_firstWRITE)
15798 goto bad_0; /* :::::::::::::::::::: */
15799 switch (ffelex_token_type (t))
15801 case FFELEX_typeCOMMA:
15802 case FFELEX_typeCOLONCOLON:
15803 case FFELEX_typeEOS:
15804 case FFELEX_typeSEMICOLON:
15805 case FFELEX_typeNAME:
15806 case FFELEX_typeNUMBER:
15807 ffesta_confirmed (); /* Error, but clearly intended. */
15808 goto bad_1; /* :::::::::::::::::::: */
15811 goto bad_1; /* :::::::::::::::::::: */
15813 case FFELEX_typeOPEN_PAREN:
15814 for (ix = 0; ix < FFESTP_writeix; ++ix)
15815 ffestp_file.write.write_spec[ix].kw_or_val_present = FALSE;
15816 return (ffelexHandler) ffestb_R9101_;
15819 case FFELEX_typeNAMES:
15820 if (ffesta_first_kw != FFESTR_firstWRITE)
15821 goto bad_0; /* :::::::::::::::::::: */
15822 switch (ffelex_token_type (t))
15824 case FFELEX_typeEOS:
15825 case FFELEX_typeSEMICOLON:
15826 case FFELEX_typeCOMMA:
15827 case FFELEX_typeCOLONCOLON:
15828 ffesta_confirmed (); /* Error, but clearly intended. */
15829 goto bad_1; /* :::::::::::::::::::: */
15832 goto bad_1; /* :::::::::::::::::::: */
15834 case FFELEX_typeOPEN_PAREN:
15835 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlWRITE)
15836 goto bad_0; /* :::::::::::::::::::: */
15838 for (ix = 0; ix < FFESTP_writeix; ++ix)
15839 ffestp_file.write.write_spec[ix].kw_or_val_present = FALSE;
15840 return (ffelexHandler) ffestb_R9101_;
15844 goto bad_0; /* :::::::::::::::::::: */
15847 bad_0: /* :::::::::::::::::::: */
15848 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", ffesta_tokens[0]);
15849 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15851 bad_1: /* :::::::::::::::::::: */
15852 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
15853 return (ffelexHandler) ffelex_swallow_tokens (t,
15854 (ffelexHandler) ffesta_zero); /* Invalid second token. */
15857 /* ffestb_R9101_ -- "WRITE" OPEN_PAREN
15859 return ffestb_R9101_; // to lexer
15861 Handle expr construct (not NAME=expr construct) here. */
15863 static ffelexHandler
15864 ffestb_R9101_ (ffelexToken t)
15866 switch (ffelex_token_type (t))
15868 case FFELEX_typeNAME:
15869 ffesta_tokens[1] = ffelex_token_use (t);
15870 return (ffelexHandler) ffestb_R9102_;
15873 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15874 FFEEXPR_contextFILEUNIT, (ffeexprCallback) ffestb_R9103_)))
15879 /* ffestb_R9102_ -- "WRITE" OPEN_PAREN NAME
15881 return ffestb_R9102_; // to lexer
15883 If EQUALS here, go to states that handle it. Else, send NAME and this
15884 token thru expression handler. */
15886 static ffelexHandler
15887 ffestb_R9102_ (ffelexToken t)
15889 ffelexHandler next;
15892 switch (ffelex_token_type (t))
15894 case FFELEX_typeEQUALS:
15895 nt = ffesta_tokens[1];
15896 next = (ffelexHandler) ffestb_R9107_ (nt);
15897 ffelex_token_kill (nt);
15898 return (ffelexHandler) (*next) (t);
15901 nt = ffesta_tokens[1];
15902 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15903 FFEEXPR_contextFILEUNIT, (ffeexprCallback) ffestb_R9103_)))
15905 ffelex_token_kill (nt);
15906 return (ffelexHandler) (*next) (t);
15910 /* ffestb_R9103_ -- "WRITE" OPEN_PAREN expr [CLOSE_PAREN]
15912 (ffestb_R9103_) // to expression handler
15914 Handle COMMA or EOS/SEMICOLON here. */
15916 static ffelexHandler
15917 ffestb_R9103_ (ffelexToken ft, ffebld expr, ffelexToken t)
15919 switch (ffelex_token_type (t))
15921 case FFELEX_typeCOMMA:
15922 case FFELEX_typeCLOSE_PAREN:
15925 ffestp_file.write.write_spec[FFESTP_writeixUNIT].kw_or_val_present
15927 ffestp_file.write.write_spec[FFESTP_writeixUNIT].kw_present = FALSE;
15928 ffestp_file.write.write_spec[FFESTP_writeixUNIT].value_present = TRUE;
15929 ffestp_file.write.write_spec[FFESTP_writeixUNIT].value_is_label
15931 ffestp_file.write.write_spec[FFESTP_writeixUNIT].value
15932 = ffelex_token_use (ft);
15933 ffestp_file.write.write_spec[FFESTP_writeixUNIT].u.expr = expr;
15934 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
15935 return (ffelexHandler) ffestb_R9104_;
15936 return (ffelexHandler) ffestb_R91012_;
15942 ffestb_subr_kill_write_ ();
15943 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
15944 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
15947 /* ffestb_R9104_ -- "WRITE" OPEN_PAREN expr COMMA
15949 return ffestb_R9104_; // to lexer
15951 Handle expr construct (not NAME=expr construct) here. */
15953 static ffelexHandler
15954 ffestb_R9104_ (ffelexToken t)
15956 switch (ffelex_token_type (t))
15958 case FFELEX_typeNAME:
15959 ffesta_tokens[1] = ffelex_token_use (t);
15960 return (ffelexHandler) ffestb_R9105_;
15963 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15964 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9106_)))
15969 /* ffestb_R9105_ -- "WRITE" OPEN_PAREN expr COMMA NAME
15971 return ffestb_R9105_; // to lexer
15973 If EQUALS here, go to states that handle it. Else, send NAME and this
15974 token thru expression handler. */
15976 static ffelexHandler
15977 ffestb_R9105_ (ffelexToken t)
15979 ffelexHandler next;
15982 switch (ffelex_token_type (t))
15984 case FFELEX_typeEQUALS:
15985 nt = ffesta_tokens[1];
15986 next = (ffelexHandler) ffestb_R9107_ (nt);
15987 ffelex_token_kill (nt);
15988 return (ffelexHandler) (*next) (t);
15991 nt = ffesta_tokens[1];
15992 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
15993 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9106_)))
15995 ffelex_token_kill (nt);
15996 return (ffelexHandler) (*next) (t);
16000 /* ffestb_R9106_ -- "WRITE" OPEN_PAREN expr COMMA expr
16002 (ffestb_R9106_) // to expression handler
16004 Handle COMMA or CLOSE_PAREN here. */
16006 static ffelexHandler
16007 ffestb_R9106_ (ffelexToken ft, ffebld expr, ffelexToken t)
16009 switch (ffelex_token_type (t))
16011 case FFELEX_typeCOMMA:
16012 case FFELEX_typeCLOSE_PAREN:
16013 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].kw_or_val_present
16015 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].kw_present = FALSE;
16016 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value_present = TRUE;
16017 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value_is_label
16019 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value
16020 = ffelex_token_use (ft);
16021 ffestp_file.write.write_spec[FFESTP_writeixFORMAT].u.expr = expr;
16022 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
16023 return (ffelexHandler) ffestb_R9107_;
16024 return (ffelexHandler) ffestb_R91012_;
16030 ffestb_subr_kill_write_ ();
16031 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16032 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16035 /* ffestb_R9107_ -- "WRITE" OPEN_PAREN [external-file-unit COMMA [format
16038 return ffestb_R9107_; // to lexer
16040 Handle expr construct (not NAME=expr construct) here. */
16042 static ffelexHandler
16043 ffestb_R9107_ (ffelexToken t)
16047 ffestb_local_.write.label = FALSE;
16049 switch (ffelex_token_type (t))
16051 case FFELEX_typeNAME:
16052 kw = ffestr_genio (t);
16055 case FFESTR_genioADVANCE:
16056 ffestb_local_.write.ix = FFESTP_writeixADVANCE;
16057 ffestb_local_.write.left = FALSE;
16058 ffestb_local_.write.context = FFEEXPR_contextFILEDFCHAR;
16061 case FFESTR_genioEOR:
16062 ffestb_local_.write.ix = FFESTP_writeixEOR;
16063 ffestb_local_.write.label = TRUE;
16066 case FFESTR_genioERR:
16067 ffestb_local_.write.ix = FFESTP_writeixERR;
16068 ffestb_local_.write.label = TRUE;
16071 case FFESTR_genioFMT:
16072 ffestb_local_.write.ix = FFESTP_writeixFORMAT;
16073 ffestb_local_.write.left = FALSE;
16074 ffestb_local_.write.context = FFEEXPR_contextFILEFORMAT;
16077 case FFESTR_genioIOSTAT:
16078 ffestb_local_.write.ix = FFESTP_writeixIOSTAT;
16079 ffestb_local_.write.left = TRUE;
16080 ffestb_local_.write.context = FFEEXPR_contextFILEINT;
16083 case FFESTR_genioNML:
16084 ffestb_local_.write.ix = FFESTP_writeixFORMAT;
16085 ffestb_local_.write.left = TRUE;
16086 ffestb_local_.write.context = FFEEXPR_contextFILENAMELIST;
16089 case FFESTR_genioREC:
16090 ffestb_local_.write.ix = FFESTP_writeixREC;
16091 ffestb_local_.write.left = FALSE;
16092 ffestb_local_.write.context = FFEEXPR_contextFILENUM;
16095 case FFESTR_genioUNIT:
16096 ffestb_local_.write.ix = FFESTP_writeixUNIT;
16097 ffestb_local_.write.left = FALSE;
16098 ffestb_local_.write.context = FFEEXPR_contextFILEUNIT;
16102 goto bad; /* :::::::::::::::::::: */
16104 if (ffestp_file.write.write_spec[ffestb_local_.write.ix]
16105 .kw_or_val_present)
16106 break; /* Can't specify a keyword twice! */
16107 ffestp_file.write.write_spec[ffestb_local_.write.ix]
16108 .kw_or_val_present = TRUE;
16109 ffestp_file.write.write_spec[ffestb_local_.write.ix]
16110 .kw_present = TRUE;
16111 ffestp_file.write.write_spec[ffestb_local_.write.ix]
16112 .value_present = FALSE;
16113 ffestp_file.write.write_spec[ffestb_local_.write.ix].value_is_label
16114 = ffestb_local_.write.label;
16115 ffestp_file.write.write_spec[ffestb_local_.write.ix].kw
16116 = ffelex_token_use (t);
16117 return (ffelexHandler) ffestb_R9108_;
16123 bad: /* :::::::::::::::::::: */
16124 ffestb_subr_kill_write_ ();
16125 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16126 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16129 /* ffestb_R9108_ -- "WRITE" OPEN_PAREN [external-file-unit COMMA [format
16132 return ffestb_R9108_; // to lexer
16134 Make sure EQUALS here, send next token to expression handler. */
16136 static ffelexHandler
16137 ffestb_R9108_ (ffelexToken t)
16139 switch (ffelex_token_type (t))
16141 case FFELEX_typeEQUALS:
16142 ffesta_confirmed ();
16143 if (ffestb_local_.write.label)
16144 return (ffelexHandler) ffestb_R91010_;
16145 if (ffestb_local_.write.left)
16146 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
16147 ffestb_local_.write.context,
16148 (ffeexprCallback) ffestb_R9109_);
16149 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16150 ffestb_local_.write.context,
16151 (ffeexprCallback) ffestb_R9109_);
16157 ffestb_subr_kill_write_ ();
16158 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16159 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16162 /* ffestb_R9109_ -- "WRITE" OPEN_PAREN ... NAME EQUALS expr
16164 (ffestb_R9109_) // to expression handler
16166 Handle COMMA or CLOSE_PAREN here. */
16168 static ffelexHandler
16169 ffestb_R9109_ (ffelexToken ft, ffebld expr, ffelexToken t)
16171 switch (ffelex_token_type (t))
16173 case FFELEX_typeCOMMA:
16174 case FFELEX_typeCLOSE_PAREN:
16177 if (ffestb_local_.write.context == FFEEXPR_contextFILEFORMAT)
16178 ffestp_file.write.write_spec[ffestb_local_.write.ix]
16179 .value_is_label = TRUE;
16183 ffestp_file.write.write_spec[ffestb_local_.write.ix].value_present
16185 ffestp_file.write.write_spec[ffestb_local_.write.ix].value
16186 = ffelex_token_use (ft);
16187 ffestp_file.write.write_spec[ffestb_local_.write.ix].u.expr = expr;
16188 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
16189 return (ffelexHandler) ffestb_R9107_;
16190 return (ffelexHandler) ffestb_R91012_;
16196 ffestb_subr_kill_write_ ();
16197 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16198 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16201 /* ffestb_R91010_ -- "WRITE" OPEN_PAREN ... NAME EQUALS
16203 return ffestb_R91010_; // to lexer
16205 Handle NUMBER for label here. */
16207 static ffelexHandler
16208 ffestb_R91010_ (ffelexToken t)
16210 switch (ffelex_token_type (t))
16212 case FFELEX_typeNUMBER:
16213 ffestp_file.write.write_spec[ffestb_local_.write.ix].value_present
16215 ffestp_file.write.write_spec[ffestb_local_.write.ix].value
16216 = ffelex_token_use (t);
16217 return (ffelexHandler) ffestb_R91011_;
16223 ffestb_subr_kill_write_ ();
16224 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16225 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16228 /* ffestb_R91011_ -- "WRITE" OPEN_PAREN ... NAME EQUALS NUMBER
16230 return ffestb_R91011_; // to lexer
16232 Handle COMMA or CLOSE_PAREN here. */
16234 static ffelexHandler
16235 ffestb_R91011_ (ffelexToken t)
16237 switch (ffelex_token_type (t))
16239 case FFELEX_typeCOMMA:
16240 return (ffelexHandler) ffestb_R9107_;
16242 case FFELEX_typeCLOSE_PAREN:
16243 return (ffelexHandler) ffestb_R91012_;
16249 ffestb_subr_kill_write_ ();
16250 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16251 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16254 /* ffestb_R91012_ -- "WRITE" OPEN_PAREN ... CLOSE_PAREN
16256 return ffestb_R91012_; // to lexer
16258 Handle EOS or SEMICOLON here. */
16260 static ffelexHandler
16261 ffestb_R91012_ (ffelexToken t)
16263 switch (ffelex_token_type (t))
16265 case FFELEX_typeEOS:
16266 case FFELEX_typeSEMICOLON:
16267 ffesta_confirmed ();
16268 if (!ffesta_is_inhibited ())
16270 ffestc_R910_start ();
16271 ffestc_R910_finish ();
16273 ffestb_subr_kill_write_ ();
16274 return (ffelexHandler) ffesta_zero (t);
16277 ffesta_confirmed ();
16278 /* Fall through. */
16279 case FFELEX_typeOPEN_PAREN: /* Could still be assignment!! */
16281 /* EXTENSION: Allow an optional preceding COMMA here if not pedantic.
16282 (f2c provides this extension, as do other compilers, supposedly.) */
16284 if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA))
16285 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16286 ffestc_context_iolist (), (ffeexprCallback) ffestb_R91013_);
16288 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16289 ffestc_context_iolist (), (ffeexprCallback) ffestb_R91013_)))
16292 case FFELEX_typeEQUALS:
16293 case FFELEX_typePOINTS:
16297 ffestb_subr_kill_write_ ();
16298 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16299 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16302 /* ffestb_R91013_ -- "WRITE(...)" expr
16304 (ffestb_R91013_) // to expression handler
16306 Handle COMMA or EOS/SEMICOLON here. */
16308 static ffelexHandler
16309 ffestb_R91013_ (ffelexToken ft, ffebld expr, ffelexToken t)
16311 switch (ffelex_token_type (t))
16313 case FFELEX_typeCOMMA:
16317 ffesta_confirmed ();
16318 if (!ffesta_is_inhibited ())
16319 ffestc_R910_start ();
16320 ffestb_subr_kill_write_ ();
16322 if (!ffesta_is_inhibited ())
16323 ffestc_R910_item (expr, ft);
16324 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16325 ffestc_context_iolist (), (ffeexprCallback) ffestb_R91014_);
16327 case FFELEX_typeEOS:
16328 case FFELEX_typeSEMICOLON:
16332 ffesta_confirmed ();
16333 if (!ffesta_is_inhibited ())
16334 ffestc_R910_start ();
16335 ffestb_subr_kill_write_ ();
16337 if (!ffesta_is_inhibited ())
16339 ffestc_R910_item (expr, ft);
16340 ffestc_R910_finish ();
16342 return (ffelexHandler) ffesta_zero (t);
16348 ffestb_subr_kill_write_ ();
16349 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16350 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16353 /* ffestb_R91014_ -- "WRITE(...)" expr COMMA expr
16355 (ffestb_R91014_) // to expression handler
16357 Handle COMMA or EOS/SEMICOLON here. */
16359 static ffelexHandler
16360 ffestb_R91014_ (ffelexToken ft, ffebld expr, ffelexToken t)
16362 switch (ffelex_token_type (t))
16364 case FFELEX_typeCOMMA:
16367 if (!ffesta_is_inhibited ())
16368 ffestc_R910_item (expr, ft);
16369 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16370 ffestc_context_iolist (), (ffeexprCallback) ffestb_R91014_);
16372 case FFELEX_typeEOS:
16373 case FFELEX_typeSEMICOLON:
16376 if (!ffesta_is_inhibited ())
16378 ffestc_R910_item (expr, ft);
16379 ffestc_R910_finish ();
16381 return (ffelexHandler) ffesta_zero (t);
16387 if (!ffesta_is_inhibited ())
16388 ffestc_R910_finish ();
16389 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t);
16390 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16393 /* ffestb_R911 -- Parse the PRINT statement
16395 return ffestb_R911; // to lexer
16397 Make sure the statement has a valid form for the PRINT
16398 statement. If it does, implement the statement. */
16401 ffestb_R911 (ffelexToken t)
16403 ffelexHandler next;
16406 switch (ffelex_token_type (ffesta_tokens[0]))
16408 case FFELEX_typeNAME:
16409 if (ffesta_first_kw != FFESTR_firstPRINT)
16410 goto bad_0; /* :::::::::::::::::::: */
16411 switch (ffelex_token_type (t))
16413 case FFELEX_typeCOMMA:
16414 case FFELEX_typeCOLONCOLON:
16415 case FFELEX_typeEOS:
16416 case FFELEX_typeSEMICOLON:
16417 ffesta_confirmed (); /* Error, but clearly intended. */
16418 goto bad_1; /* :::::::::::::::::::: */
16420 case FFELEX_typeEQUALS:
16421 case FFELEX_typePOINTS:
16422 case FFELEX_typeCOLON:
16423 goto bad_1; /* :::::::::::::::::::: */
16425 case FFELEX_typeNAME:
16426 case FFELEX_typeNUMBER:
16427 ffesta_confirmed ();
16434 for (ix = 0; ix < FFESTP_printix; ++ix)
16435 ffestp_file.print.print_spec[ix].kw_or_val_present = FALSE;
16436 return (ffelexHandler) (*((ffelexHandler)
16437 ffeexpr_rhs (ffesta_output_pool,
16438 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9111_)))
16441 case FFELEX_typeNAMES:
16442 if (ffesta_first_kw != FFESTR_firstPRINT)
16443 goto bad_0; /* :::::::::::::::::::: */
16444 switch (ffelex_token_type (t))
16446 case FFELEX_typeEOS:
16447 case FFELEX_typeSEMICOLON:
16448 case FFELEX_typeCOMMA:
16449 ffesta_confirmed ();
16450 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlPRINT)
16452 goto bad_1; /* :::::::::::::::::::: */
16454 case FFELEX_typeCOLONCOLON:
16455 ffesta_confirmed (); /* Error, but clearly intended. */
16456 goto bad_1; /* :::::::::::::::::::: */
16458 case FFELEX_typeEQUALS:
16459 case FFELEX_typePOINTS:
16460 case FFELEX_typeCOLON:
16461 goto bad_1; /* :::::::::::::::::::: */
16466 for (ix = 0; ix < FFESTP_printix; ++ix)
16467 ffestp_file.print.print_spec[ix].kw_or_val_present = FALSE;
16468 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16469 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9111_);
16470 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
16471 FFESTR_firstlPRINT);
16473 return (ffelexHandler) ffelex_swallow_tokens (t,
16474 (ffelexHandler) ffesta_zero);
16475 return (ffelexHandler) (*next) (t);
16478 goto bad_0; /* :::::::::::::::::::: */
16481 bad_0: /* :::::::::::::::::::: */
16482 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", ffesta_tokens[0]);
16483 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16485 bad_1: /* :::::::::::::::::::: */
16486 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t);
16487 return (ffelexHandler) ffelex_swallow_tokens (t,
16488 (ffelexHandler) ffesta_zero); /* Invalid second token. */
16491 /* ffestb_R9111_ -- "PRINT" expr
16493 (ffestb_R9111_) // to expression handler
16495 Make sure the next token is a COMMA or EOS/SEMICOLON. */
16497 static ffelexHandler
16498 ffestb_R9111_ (ffelexToken ft, ffebld expr, ffelexToken t)
16500 switch (ffelex_token_type (t))
16502 case FFELEX_typeEOS:
16503 case FFELEX_typeSEMICOLON:
16504 case FFELEX_typeCOMMA:
16505 ffesta_confirmed ();
16506 ffestp_file.print.print_spec[FFESTP_printixFORMAT].kw_or_val_present
16508 ffestp_file.print.print_spec[FFESTP_printixFORMAT].kw_present = FALSE;
16509 ffestp_file.print.print_spec[FFESTP_printixFORMAT].value_present = TRUE;
16510 ffestp_file.print.print_spec[FFESTP_printixFORMAT].value_is_label
16512 ffestp_file.print.print_spec[FFESTP_printixFORMAT].value
16513 = ffelex_token_use (ft);
16514 ffestp_file.print.print_spec[FFESTP_printixFORMAT].u.expr = expr;
16515 if (!ffesta_is_inhibited ())
16516 ffestc_R911_start ();
16517 ffestb_subr_kill_print_ ();
16518 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
16519 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16520 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R9112_);
16521 if (!ffesta_is_inhibited ())
16522 ffestc_R911_finish ();
16523 return (ffelexHandler) ffesta_zero (t);
16529 ffestb_subr_kill_print_ ();
16530 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t);
16531 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16534 /* ffestb_R9112_ -- "PRINT" expr COMMA expr
16536 (ffestb_R9112_) // to expression handler
16538 Handle COMMA or EOS/SEMICOLON here. */
16540 static ffelexHandler
16541 ffestb_R9112_ (ffelexToken ft, ffebld expr, ffelexToken t)
16543 switch (ffelex_token_type (t))
16545 case FFELEX_typeCOMMA:
16548 if (!ffesta_is_inhibited ())
16549 ffestc_R911_item (expr, ft);
16550 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16551 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R9112_);
16553 case FFELEX_typeEOS:
16554 case FFELEX_typeSEMICOLON:
16557 if (!ffesta_is_inhibited ())
16559 ffestc_R911_item (expr, ft);
16560 ffestc_R911_finish ();
16562 return (ffelexHandler) ffesta_zero (t);
16568 if (!ffesta_is_inhibited ())
16569 ffestc_R911_finish ();
16570 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t);
16571 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16574 /* ffestb_R923 -- Parse an INQUIRE statement
16576 return ffestb_R923; // to lexer
16578 Make sure the statement has a valid form for an INQUIRE statement.
16579 If it does, implement the statement. */
16582 ffestb_R923 (ffelexToken t)
16584 ffestpInquireIx ix;
16586 switch (ffelex_token_type (ffesta_tokens[0]))
16588 case FFELEX_typeNAME:
16589 if (ffesta_first_kw != FFESTR_firstINQUIRE)
16590 goto bad_0; /* :::::::::::::::::::: */
16593 case FFELEX_typeNAMES:
16594 if (ffesta_first_kw != FFESTR_firstINQUIRE)
16595 goto bad_0; /* :::::::::::::::::::: */
16596 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlINQUIRE)
16597 goto bad_0; /* :::::::::::::::::::: */
16601 goto bad_0; /* :::::::::::::::::::: */
16604 switch (ffelex_token_type (t))
16606 case FFELEX_typeOPEN_PAREN:
16609 case FFELEX_typeEOS:
16610 case FFELEX_typeSEMICOLON:
16611 case FFELEX_typeCOMMA:
16612 case FFELEX_typeCOLONCOLON:
16613 ffesta_confirmed (); /* Error, but clearly intended. */
16614 goto bad_1; /* :::::::::::::::::::: */
16617 goto bad_1; /* :::::::::::::::::::: */
16620 for (ix = 0; ix < FFESTP_inquireix; ++ix)
16621 ffestp_file.inquire.inquire_spec[ix].kw_or_val_present = FALSE;
16623 ffestb_local_.inquire.may_be_iolength = TRUE;
16624 return (ffelexHandler) ffestb_R9231_;
16626 bad_0: /* :::::::::::::::::::: */
16627 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", ffesta_tokens[0]);
16628 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16630 bad_1: /* :::::::::::::::::::: */
16631 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
16632 return (ffelexHandler) ffelex_swallow_tokens (t,
16633 (ffelexHandler) ffesta_zero); /* Invalid second token. */
16636 /* ffestb_R9231_ -- "INQUIRE" OPEN_PAREN
16638 return ffestb_R9231_; // to lexer
16640 Handle expr construct (not NAME=expr construct) here. */
16642 static ffelexHandler
16643 ffestb_R9231_ (ffelexToken t)
16645 switch (ffelex_token_type (t))
16647 case FFELEX_typeNAME:
16648 ffesta_tokens[1] = ffelex_token_use (t);
16649 return (ffelexHandler) ffestb_R9232_;
16652 ffestb_local_.inquire.may_be_iolength = FALSE;
16653 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16654 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9233_)))
16659 /* ffestb_R9232_ -- "INQUIRE" OPEN_PAREN NAME
16661 return ffestb_R9232_; // to lexer
16663 If EQUALS here, go to states that handle it. Else, send NAME and this
16664 token thru expression handler. */
16666 static ffelexHandler
16667 ffestb_R9232_ (ffelexToken t)
16669 ffelexHandler next;
16672 switch (ffelex_token_type (t))
16674 case FFELEX_typeEQUALS:
16675 nt = ffesta_tokens[1];
16676 next = (ffelexHandler) ffestb_R9234_ (nt);
16677 ffelex_token_kill (nt);
16678 return (ffelexHandler) (*next) (t);
16681 ffestb_local_.inquire.may_be_iolength = FALSE;
16682 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16683 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9233_)))
16684 (ffesta_tokens[1]);
16685 ffelex_token_kill (ffesta_tokens[1]);
16686 return (ffelexHandler) (*next) (t);
16690 /* ffestb_R9233_ -- "INQUIRE" OPEN_PAREN expr
16692 (ffestb_R9233_) // to expression handler
16694 Handle COMMA or CLOSE_PAREN here. */
16696 static ffelexHandler
16697 ffestb_R9233_ (ffelexToken ft, ffebld expr, ffelexToken t)
16699 switch (ffelex_token_type (t))
16701 case FFELEX_typeCOMMA:
16702 case FFELEX_typeCLOSE_PAREN:
16705 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].kw_or_val_present
16707 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].kw_present = FALSE;
16708 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value_present = TRUE;
16709 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value_is_label
16711 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value
16712 = ffelex_token_use (ft);
16713 ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].u.expr = expr;
16714 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
16715 return (ffelexHandler) ffestb_R9234_;
16716 return (ffelexHandler) ffestb_R9239_;
16722 ffestb_subr_kill_inquire_ ();
16723 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
16724 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16727 /* ffestb_R9234_ -- "INQUIRE" OPEN_PAREN [external-file-unit COMMA]
16729 return ffestb_R9234_; // to lexer
16731 Handle expr construct (not NAME=expr construct) here. */
16733 static ffelexHandler
16734 ffestb_R9234_ (ffelexToken t)
16738 ffestb_local_.inquire.label = FALSE;
16740 switch (ffelex_token_type (t))
16742 case FFELEX_typeNAME:
16743 kw = ffestr_inquire (t);
16744 if (kw != FFESTR_inquireIOLENGTH)
16745 ffestb_local_.inquire.may_be_iolength = FALSE;
16748 case FFESTR_inquireACCESS:
16749 ffestb_local_.inquire.ix = FFESTP_inquireixACCESS;
16750 ffestb_local_.inquire.left = TRUE;
16751 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16754 case FFESTR_inquireACTION:
16755 ffestb_local_.inquire.ix = FFESTP_inquireixACTION;
16756 ffestb_local_.inquire.left = TRUE;
16757 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16760 case FFESTR_inquireBLANK:
16761 ffestb_local_.inquire.ix = FFESTP_inquireixBLANK;
16762 ffestb_local_.inquire.left = TRUE;
16763 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16766 case FFESTR_inquireCARRIAGECONTROL:
16767 ffestb_local_.inquire.ix = FFESTP_inquireixCARRIAGECONTROL;
16768 ffestb_local_.inquire.left = TRUE;
16769 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16772 case FFESTR_inquireDEFAULTFILE:
16773 ffestb_local_.inquire.ix = FFESTP_inquireixDEFAULTFILE;
16774 ffestb_local_.inquire.left = FALSE;
16775 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16778 case FFESTR_inquireDELIM:
16779 ffestb_local_.inquire.ix = FFESTP_inquireixDELIM;
16780 ffestb_local_.inquire.left = TRUE;
16781 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16784 case FFESTR_inquireDIRECT:
16785 ffestb_local_.inquire.ix = FFESTP_inquireixDIRECT;
16786 ffestb_local_.inquire.left = TRUE;
16787 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16790 case FFESTR_inquireERR:
16791 ffestb_local_.inquire.ix = FFESTP_inquireixERR;
16792 ffestb_local_.inquire.label = TRUE;
16795 case FFESTR_inquireEXIST:
16796 ffestb_local_.inquire.ix = FFESTP_inquireixEXIST;
16797 ffestb_local_.inquire.left = TRUE;
16798 ffestb_local_.inquire.context = FFEEXPR_contextFILELOG;
16801 case FFESTR_inquireFILE:
16802 ffestb_local_.inquire.ix = FFESTP_inquireixFILE;
16803 ffestb_local_.inquire.left = FALSE;
16804 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16807 case FFESTR_inquireFORM:
16808 ffestb_local_.inquire.ix = FFESTP_inquireixFORM;
16809 ffestb_local_.inquire.left = TRUE;
16810 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16813 case FFESTR_inquireFORMATTED:
16814 ffestb_local_.inquire.ix = FFESTP_inquireixFORMATTED;
16815 ffestb_local_.inquire.left = TRUE;
16816 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16819 case FFESTR_inquireIOLENGTH:
16820 if (!ffestb_local_.inquire.may_be_iolength)
16821 goto bad; /* :::::::::::::::::::: */
16822 ffestb_local_.inquire.ix = FFESTP_inquireixIOLENGTH;
16823 ffestb_local_.inquire.left = TRUE;
16824 ffestb_local_.inquire.context = FFEEXPR_contextFILEINT;
16827 case FFESTR_inquireIOSTAT:
16828 ffestb_local_.inquire.ix = FFESTP_inquireixIOSTAT;
16829 ffestb_local_.inquire.left = TRUE;
16830 ffestb_local_.inquire.context = FFEEXPR_contextFILEINT;
16833 case FFESTR_inquireKEYED:
16834 ffestb_local_.inquire.ix = FFESTP_inquireixKEYED;
16835 ffestb_local_.inquire.left = TRUE;
16836 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16839 case FFESTR_inquireNAME:
16840 ffestb_local_.inquire.ix = FFESTP_inquireixNAME;
16841 ffestb_local_.inquire.left = TRUE;
16842 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16845 case FFESTR_inquireNAMED:
16846 ffestb_local_.inquire.ix = FFESTP_inquireixNAMED;
16847 ffestb_local_.inquire.left = TRUE;
16848 ffestb_local_.inquire.context = FFEEXPR_contextFILELOG;
16851 case FFESTR_inquireNEXTREC:
16852 ffestb_local_.inquire.ix = FFESTP_inquireixNEXTREC;
16853 ffestb_local_.inquire.left = TRUE;
16854 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFINT;
16857 case FFESTR_inquireNUMBER:
16858 ffestb_local_.inquire.ix = FFESTP_inquireixNUMBER;
16859 ffestb_local_.inquire.left = TRUE;
16860 ffestb_local_.inquire.context = FFEEXPR_contextFILEINT;
16863 case FFESTR_inquireOPENED:
16864 ffestb_local_.inquire.ix = FFESTP_inquireixOPENED;
16865 ffestb_local_.inquire.left = TRUE;
16866 ffestb_local_.inquire.context = FFEEXPR_contextFILELOG;
16869 case FFESTR_inquireORGANIZATION:
16870 ffestb_local_.inquire.ix = FFESTP_inquireixORGANIZATION;
16871 ffestb_local_.inquire.left = TRUE;
16872 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16875 case FFESTR_inquirePAD:
16876 ffestb_local_.inquire.ix = FFESTP_inquireixPAD;
16877 ffestb_local_.inquire.left = TRUE;
16878 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16881 case FFESTR_inquirePOSITION:
16882 ffestb_local_.inquire.ix = FFESTP_inquireixPOSITION;
16883 ffestb_local_.inquire.left = TRUE;
16884 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16887 case FFESTR_inquireREAD:
16888 ffestb_local_.inquire.ix = FFESTP_inquireixREAD;
16889 ffestb_local_.inquire.left = TRUE;
16890 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16893 case FFESTR_inquireREADWRITE:
16894 ffestb_local_.inquire.ix = FFESTP_inquireixREADWRITE;
16895 ffestb_local_.inquire.left = TRUE;
16896 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16899 case FFESTR_inquireRECL:
16900 ffestb_local_.inquire.ix = FFESTP_inquireixRECL;
16901 ffestb_local_.inquire.left = TRUE;
16902 ffestb_local_.inquire.context = FFEEXPR_contextFILEINT;
16905 case FFESTR_inquireRECORDTYPE:
16906 ffestb_local_.inquire.ix = FFESTP_inquireixRECORDTYPE;
16907 ffestb_local_.inquire.left = TRUE;
16908 ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR;
16911 case FFESTR_inquireSEQUENTIAL:
16912 ffestb_local_.inquire.ix = FFESTP_inquireixSEQUENTIAL;
16913 ffestb_local_.inquire.left = TRUE;
16914 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16917 case FFESTR_inquireUNFORMATTED:
16918 ffestb_local_.inquire.ix = FFESTP_inquireixUNFORMATTED;
16919 ffestb_local_.inquire.left = TRUE;
16920 ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR;
16923 case FFESTR_inquireUNIT:
16924 ffestb_local_.inquire.ix = FFESTP_inquireixUNIT;
16925 ffestb_local_.inquire.left = FALSE;
16926 ffestb_local_.inquire.context = FFEEXPR_contextFILENUM;
16930 goto bad; /* :::::::::::::::::::: */
16932 if (ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix]
16933 .kw_or_val_present)
16934 break; /* Can't specify a keyword twice! */
16935 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix]
16936 .kw_or_val_present = TRUE;
16937 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix]
16938 .kw_present = TRUE;
16939 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix]
16940 .value_present = FALSE;
16941 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_is_label
16942 = ffestb_local_.inquire.label;
16943 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].kw
16944 = ffelex_token_use (t);
16945 return (ffelexHandler) ffestb_R9235_;
16951 bad: /* :::::::::::::::::::: */
16952 ffestb_subr_kill_inquire_ ();
16953 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
16954 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16957 /* ffestb_R9235_ -- "INQUIRE" OPEN_PAREN [external-file-unit COMMA] NAME
16959 return ffestb_R9235_; // to lexer
16961 Make sure EQUALS here, send next token to expression handler. */
16963 static ffelexHandler
16964 ffestb_R9235_ (ffelexToken t)
16966 switch (ffelex_token_type (t))
16968 case FFELEX_typeEQUALS:
16969 ffesta_confirmed ();
16970 if (ffestb_local_.inquire.label)
16971 return (ffelexHandler) ffestb_R9237_;
16972 if (ffestb_local_.inquire.left)
16973 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
16974 ffestb_local_.inquire.context,
16975 (ffeexprCallback) ffestb_R9236_);
16976 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
16977 ffestb_local_.inquire.context,
16978 (ffeexprCallback) ffestb_R9236_);
16984 ffestb_subr_kill_inquire_ ();
16985 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
16986 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
16989 /* ffestb_R9236_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS expr
16991 (ffestb_R9236_) // to expression handler
16993 Handle COMMA or CLOSE_PAREN here. */
16995 static ffelexHandler
16996 ffestb_R9236_ (ffelexToken ft, ffebld expr, ffelexToken t)
16998 switch (ffelex_token_type (t))
17000 case FFELEX_typeCOMMA:
17001 if (ffestb_local_.inquire.ix == FFESTP_inquireixIOLENGTH)
17002 break; /* IOLENGTH=expr must be followed by
17004 /* Fall through. */
17005 case FFELEX_typeCLOSE_PAREN:
17008 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_present
17010 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value
17011 = ffelex_token_use (ft);
17012 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].u.expr = expr;
17013 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17014 return (ffelexHandler) ffestb_R9234_;
17015 if (ffestb_local_.inquire.ix == FFESTP_inquireixIOLENGTH)
17016 return (ffelexHandler) ffestb_R92310_;
17017 return (ffelexHandler) ffestb_R9239_;
17023 ffestb_subr_kill_inquire_ ();
17024 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17025 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17028 /* ffestb_R9237_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS
17030 return ffestb_R9237_; // to lexer
17032 Handle NUMBER for label here. */
17034 static ffelexHandler
17035 ffestb_R9237_ (ffelexToken t)
17037 switch (ffelex_token_type (t))
17039 case FFELEX_typeNUMBER:
17040 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_present
17042 ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value
17043 = ffelex_token_use (t);
17044 return (ffelexHandler) ffestb_R9238_;
17050 ffestb_subr_kill_inquire_ ();
17051 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17052 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17055 /* ffestb_R9238_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS NUMBER
17057 return ffestb_R9238_; // to lexer
17059 Handle COMMA or CLOSE_PAREN here. */
17061 static ffelexHandler
17062 ffestb_R9238_ (ffelexToken t)
17064 switch (ffelex_token_type (t))
17066 case FFELEX_typeCOMMA:
17067 return (ffelexHandler) ffestb_R9234_;
17069 case FFELEX_typeCLOSE_PAREN:
17070 return (ffelexHandler) ffestb_R9239_;
17076 ffestb_subr_kill_inquire_ ();
17077 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17078 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17081 /* ffestb_R9239_ -- "INQUIRE" OPEN_PAREN ... CLOSE_PAREN
17083 return ffestb_R9239_; // to lexer
17085 Handle EOS or SEMICOLON here. */
17087 static ffelexHandler
17088 ffestb_R9239_ (ffelexToken t)
17090 switch (ffelex_token_type (t))
17092 case FFELEX_typeEOS:
17093 case FFELEX_typeSEMICOLON:
17094 ffesta_confirmed ();
17095 if (!ffesta_is_inhibited ())
17097 ffestb_subr_kill_inquire_ ();
17098 return (ffelexHandler) ffesta_zero (t);
17104 ffestb_subr_kill_inquire_ ();
17105 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17106 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17109 /* ffestb_R92310_ -- "INQUIRE(IOLENGTH=expr)"
17111 return ffestb_R92310_; // to lexer
17113 Make sure EOS or SEMICOLON not here; begin R923B processing and expect
17116 static ffelexHandler
17117 ffestb_R92310_ (ffelexToken t)
17119 switch (ffelex_token_type (t))
17121 case FFELEX_typeEOS:
17122 case FFELEX_typeSEMICOLON:
17126 ffesta_confirmed ();
17127 if (!ffesta_is_inhibited ())
17128 ffestc_R923B_start ();
17129 ffestb_subr_kill_inquire_ ();
17130 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17131 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R92311_)))
17135 ffestb_subr_kill_inquire_ ();
17136 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17137 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17140 /* ffestb_R92311_ -- "INQUIRE(IOLENGTH=expr)" expr
17142 (ffestb_R92311_) // to expression handler
17144 Handle COMMA or EOS/SEMICOLON here. */
17146 static ffelexHandler
17147 ffestb_R92311_ (ffelexToken ft, ffebld expr, ffelexToken t)
17149 switch (ffelex_token_type (t))
17151 case FFELEX_typeCOMMA:
17154 if (!ffesta_is_inhibited ())
17155 ffestc_R923B_item (expr, ft);
17156 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17157 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R92311_);
17159 case FFELEX_typeEOS:
17160 case FFELEX_typeSEMICOLON:
17163 if (!ffesta_is_inhibited ())
17165 ffestc_R923B_item (expr, ft);
17166 ffestc_R923B_finish ();
17168 return (ffelexHandler) ffesta_zero (t);
17174 if (!ffesta_is_inhibited ())
17175 ffestc_R923B_finish ();
17176 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t);
17177 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17180 /* ffestb_V018 -- Parse the REWRITE statement
17182 return ffestb_V018; // to lexer
17184 Make sure the statement has a valid form for the REWRITE
17185 statement. If it does, implement the statement. */
17189 ffestb_V018 (ffelexToken t)
17191 ffestpRewriteIx ix;
17193 switch (ffelex_token_type (ffesta_tokens[0]))
17195 case FFELEX_typeNAME:
17196 if (ffesta_first_kw != FFESTR_firstREWRITE)
17197 goto bad_0; /* :::::::::::::::::::: */
17198 switch (ffelex_token_type (t))
17200 case FFELEX_typeCOMMA:
17201 case FFELEX_typeCOLONCOLON:
17202 case FFELEX_typeEOS:
17203 case FFELEX_typeSEMICOLON:
17204 case FFELEX_typeNAME:
17205 case FFELEX_typeNUMBER:
17206 ffesta_confirmed (); /* Error, but clearly intended. */
17207 goto bad_1; /* :::::::::::::::::::: */
17210 goto bad_1; /* :::::::::::::::::::: */
17212 case FFELEX_typeOPEN_PAREN:
17213 for (ix = 0; ix < FFESTP_rewriteix; ++ix)
17214 ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present = FALSE;
17215 return (ffelexHandler) ffestb_V0181_;
17218 case FFELEX_typeNAMES:
17219 if (ffesta_first_kw != FFESTR_firstREWRITE)
17220 goto bad_0; /* :::::::::::::::::::: */
17221 switch (ffelex_token_type (t))
17223 case FFELEX_typeEOS:
17224 case FFELEX_typeSEMICOLON:
17225 case FFELEX_typeCOMMA:
17226 case FFELEX_typeCOLONCOLON:
17227 ffesta_confirmed (); /* Error, but clearly intended. */
17228 goto bad_1; /* :::::::::::::::::::: */
17231 goto bad_1; /* :::::::::::::::::::: */
17233 case FFELEX_typeOPEN_PAREN:
17234 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREWRITE)
17235 goto bad_0; /* :::::::::::::::::::: */
17237 for (ix = 0; ix < FFESTP_rewriteix; ++ix)
17238 ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present = FALSE;
17239 return (ffelexHandler) ffestb_V0181_;
17243 goto bad_0; /* :::::::::::::::::::: */
17246 bad_0: /* :::::::::::::::::::: */
17247 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", ffesta_tokens[0]);
17248 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17250 bad_1: /* :::::::::::::::::::: */
17251 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17252 return (ffelexHandler) ffelex_swallow_tokens (t,
17253 (ffelexHandler) ffesta_zero); /* Invalid second token. */
17256 /* ffestb_V0181_ -- "REWRITE" OPEN_PAREN
17258 return ffestb_V0181_; // to lexer
17260 Handle expr construct (not NAME=expr construct) here. */
17262 static ffelexHandler
17263 ffestb_V0181_ (ffelexToken t)
17265 switch (ffelex_token_type (t))
17267 case FFELEX_typeNAME:
17268 ffesta_tokens[1] = ffelex_token_use (t);
17269 return (ffelexHandler) ffestb_V0182_;
17272 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17273 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0183_)))
17278 /* ffestb_V0182_ -- "REWRITE" OPEN_PAREN NAME
17280 return ffestb_V0182_; // to lexer
17282 If EQUALS here, go to states that handle it. Else, send NAME and this
17283 token thru expression handler. */
17285 static ffelexHandler
17286 ffestb_V0182_ (ffelexToken t)
17288 ffelexHandler next;
17291 switch (ffelex_token_type (t))
17293 case FFELEX_typeEQUALS:
17294 nt = ffesta_tokens[1];
17295 next = (ffelexHandler) ffestb_V0187_ (nt);
17296 ffelex_token_kill (nt);
17297 return (ffelexHandler) (*next) (t);
17300 nt = ffesta_tokens[1];
17301 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17302 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0183_)))
17304 ffelex_token_kill (nt);
17305 return (ffelexHandler) (*next) (t);
17309 /* ffestb_V0183_ -- "REWRITE" OPEN_PAREN expr [CLOSE_PAREN]
17311 (ffestb_V0183_) // to expression handler
17313 Handle COMMA or EOS/SEMICOLON here. */
17315 static ffelexHandler
17316 ffestb_V0183_ (ffelexToken ft, ffebld expr, ffelexToken t)
17318 switch (ffelex_token_type (t))
17320 case FFELEX_typeCOMMA:
17321 case FFELEX_typeCLOSE_PAREN:
17324 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].kw_or_val_present
17326 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].kw_present = FALSE;
17327 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value_present = TRUE;
17328 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value_is_label
17330 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value
17331 = ffelex_token_use (ft);
17332 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].u.expr = expr;
17333 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17334 return (ffelexHandler) ffestb_V0184_;
17335 return (ffelexHandler) ffestb_V01812_;
17341 ffestb_subr_kill_rewrite_ ();
17342 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17343 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17346 /* ffestb_V0184_ -- "REWRITE" OPEN_PAREN expr COMMA
17348 return ffestb_V0184_; // to lexer
17350 Handle expr construct (not NAME=expr construct) here. */
17352 static ffelexHandler
17353 ffestb_V0184_ (ffelexToken t)
17355 switch (ffelex_token_type (t))
17357 case FFELEX_typeNAME:
17358 ffesta_tokens[1] = ffelex_token_use (t);
17359 return (ffelexHandler) ffestb_V0185_;
17362 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17363 FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_V0186_)))
17368 /* ffestb_V0185_ -- "REWRITE" OPEN_PAREN expr COMMA NAME
17370 return ffestb_V0185_; // to lexer
17372 If EQUALS here, go to states that handle it. Else, send NAME and this
17373 token thru expression handler. */
17375 static ffelexHandler
17376 ffestb_V0185_ (ffelexToken t)
17378 ffelexHandler next;
17381 switch (ffelex_token_type (t))
17383 case FFELEX_typeEQUALS:
17384 nt = ffesta_tokens[1];
17385 next = (ffelexHandler) ffestb_V0187_ (nt);
17386 ffelex_token_kill (nt);
17387 return (ffelexHandler) (*next) (t);
17390 nt = ffesta_tokens[1];
17391 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17392 FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_V0186_)))
17394 ffelex_token_kill (nt);
17395 return (ffelexHandler) (*next) (t);
17399 /* ffestb_V0186_ -- "REWRITE" OPEN_PAREN expr COMMA expr
17401 (ffestb_V0186_) // to expression handler
17403 Handle COMMA or CLOSE_PAREN here. */
17405 static ffelexHandler
17406 ffestb_V0186_ (ffelexToken ft, ffebld expr, ffelexToken t)
17408 switch (ffelex_token_type (t))
17410 case FFELEX_typeCOMMA:
17411 case FFELEX_typeCLOSE_PAREN:
17412 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].kw_or_val_present
17414 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].kw_present = FALSE;
17415 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value_present = TRUE;
17416 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value_is_label
17418 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value
17419 = ffelex_token_use (ft);
17420 ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].u.expr = expr;
17421 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17422 return (ffelexHandler) ffestb_V0187_;
17423 return (ffelexHandler) ffestb_V01812_;
17429 ffestb_subr_kill_rewrite_ ();
17430 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17431 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17434 /* ffestb_V0187_ -- "REWRITE" OPEN_PAREN [external-file-unit COMMA [format
17437 return ffestb_V0187_; // to lexer
17439 Handle expr construct (not NAME=expr construct) here. */
17441 static ffelexHandler
17442 ffestb_V0187_ (ffelexToken t)
17446 ffestb_local_.rewrite.label = FALSE;
17448 switch (ffelex_token_type (t))
17450 case FFELEX_typeNAME:
17451 kw = ffestr_genio (t);
17454 case FFESTR_genioERR:
17455 ffestb_local_.rewrite.ix = FFESTP_rewriteixERR;
17456 ffestb_local_.rewrite.label = TRUE;
17459 case FFESTR_genioFMT:
17460 ffestb_local_.rewrite.ix = FFESTP_rewriteixFMT;
17461 ffestb_local_.rewrite.left = FALSE;
17462 ffestb_local_.rewrite.context = FFEEXPR_contextFILEFORMAT;
17465 case FFESTR_genioIOSTAT:
17466 ffestb_local_.rewrite.ix = FFESTP_rewriteixIOSTAT;
17467 ffestb_local_.rewrite.left = TRUE;
17468 ffestb_local_.rewrite.context = FFEEXPR_contextFILEINT;
17471 case FFESTR_genioUNIT:
17472 ffestb_local_.rewrite.ix = FFESTP_rewriteixUNIT;
17473 ffestb_local_.rewrite.left = FALSE;
17474 ffestb_local_.rewrite.context = FFEEXPR_contextFILENUM;
17478 goto bad; /* :::::::::::::::::::: */
17480 if (ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17481 .kw_or_val_present)
17482 break; /* Can't specify a keyword twice! */
17483 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17484 .kw_or_val_present = TRUE;
17485 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17486 .kw_present = TRUE;
17487 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17488 .value_present = FALSE;
17489 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_is_label
17490 = ffestb_local_.rewrite.label;
17491 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].kw
17492 = ffelex_token_use (t);
17493 return (ffelexHandler) ffestb_V0188_;
17499 bad: /* :::::::::::::::::::: */
17500 ffestb_subr_kill_rewrite_ ();
17501 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17502 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17505 /* ffestb_V0188_ -- "REWRITE" OPEN_PAREN [external-file-unit COMMA [format
17508 return ffestb_V0188_; // to lexer
17510 Make sure EQUALS here, send next token to expression handler. */
17512 static ffelexHandler
17513 ffestb_V0188_ (ffelexToken t)
17515 switch (ffelex_token_type (t))
17517 case FFELEX_typeEQUALS:
17518 ffesta_confirmed ();
17519 if (ffestb_local_.rewrite.label)
17520 return (ffelexHandler) ffestb_V01810_;
17521 if (ffestb_local_.rewrite.left)
17522 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
17523 ffestb_local_.rewrite.context,
17524 (ffeexprCallback) ffestb_V0189_);
17525 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17526 ffestb_local_.rewrite.context,
17527 (ffeexprCallback) ffestb_V0189_);
17533 ffestb_subr_kill_rewrite_ ();
17534 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17535 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17538 /* ffestb_V0189_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS expr
17540 (ffestb_V0189_) // to expression handler
17542 Handle COMMA or CLOSE_PAREN here. */
17544 static ffelexHandler
17545 ffestb_V0189_ (ffelexToken ft, ffebld expr, ffelexToken t)
17547 switch (ffelex_token_type (t))
17549 case FFELEX_typeCOMMA:
17550 case FFELEX_typeCLOSE_PAREN:
17552 if (ffestb_local_.rewrite.context == FFEEXPR_contextFILEFORMAT)
17553 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix]
17554 .value_is_label = TRUE;
17557 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_present
17559 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value
17560 = ffelex_token_use (ft);
17561 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].u.expr = expr;
17562 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17563 return (ffelexHandler) ffestb_V0187_;
17564 return (ffelexHandler) ffestb_V01812_;
17570 ffestb_subr_kill_rewrite_ ();
17571 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17572 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17575 /* ffestb_V01810_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS
17577 return ffestb_V01810_; // to lexer
17579 Handle NUMBER for label here. */
17581 static ffelexHandler
17582 ffestb_V01810_ (ffelexToken t)
17584 switch (ffelex_token_type (t))
17586 case FFELEX_typeNUMBER:
17587 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_present
17589 ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value
17590 = ffelex_token_use (t);
17591 return (ffelexHandler) ffestb_V01811_;
17597 ffestb_subr_kill_rewrite_ ();
17598 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17599 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17602 /* ffestb_V01811_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS NUMBER
17604 return ffestb_V01811_; // to lexer
17606 Handle COMMA or CLOSE_PAREN here. */
17608 static ffelexHandler
17609 ffestb_V01811_ (ffelexToken t)
17611 switch (ffelex_token_type (t))
17613 case FFELEX_typeCOMMA:
17614 return (ffelexHandler) ffestb_V0187_;
17616 case FFELEX_typeCLOSE_PAREN:
17617 return (ffelexHandler) ffestb_V01812_;
17623 ffestb_subr_kill_rewrite_ ();
17624 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17625 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17628 /* ffestb_V01812_ -- "REWRITE" OPEN_PAREN ... CLOSE_PAREN
17630 return ffestb_V01812_; // to lexer
17632 Handle EOS or SEMICOLON here. */
17634 static ffelexHandler
17635 ffestb_V01812_ (ffelexToken t)
17637 switch (ffelex_token_type (t))
17639 case FFELEX_typeEOS:
17640 case FFELEX_typeSEMICOLON:
17641 ffesta_confirmed ();
17642 if (!ffesta_is_inhibited ())
17644 ffestc_V018_start ();
17645 ffestc_V018_finish ();
17647 ffestb_subr_kill_rewrite_ ();
17648 return (ffelexHandler) ffesta_zero (t);
17650 case FFELEX_typeNAME:
17651 case FFELEX_typeOPEN_PAREN:
17652 case FFELEX_typeCOMMA:
17653 ffesta_confirmed ();
17654 if (!ffesta_is_inhibited ())
17655 ffestc_V018_start ();
17656 ffestb_subr_kill_rewrite_ ();
17658 /* EXTENSION: Allow an optional preceding COMMA here if not pedantic.
17659 (f2c provides this extension, as do other compilers, supposedly.) */
17661 if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA))
17662 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17663 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_);
17665 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17666 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_)))
17673 ffestb_subr_kill_rewrite_ ();
17674 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17675 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17678 /* ffestb_V01813_ -- "REWRITE(...)" expr
17680 (ffestb_V01813_) // to expression handler
17682 Handle COMMA or EOS/SEMICOLON here. */
17684 static ffelexHandler
17685 ffestb_V01813_ (ffelexToken ft, ffebld expr, ffelexToken t)
17687 switch (ffelex_token_type (t))
17689 case FFELEX_typeCOMMA:
17692 if (!ffesta_is_inhibited ())
17693 ffestc_V018_item (expr, ft);
17694 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17695 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_);
17697 case FFELEX_typeEOS:
17698 case FFELEX_typeSEMICOLON:
17701 if (!ffesta_is_inhibited ())
17703 ffestc_V018_item (expr, ft);
17704 ffestc_V018_finish ();
17706 return (ffelexHandler) ffesta_zero (t);
17712 if (!ffesta_is_inhibited ())
17713 ffestc_V018_finish ();
17714 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t);
17715 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17718 /* ffestb_V019 -- Parse the ACCEPT statement
17720 return ffestb_V019; // to lexer
17722 Make sure the statement has a valid form for the ACCEPT
17723 statement. If it does, implement the statement. */
17726 ffestb_V019 (ffelexToken t)
17728 ffelexHandler next;
17731 switch (ffelex_token_type (ffesta_tokens[0]))
17733 case FFELEX_typeNAME:
17734 if (ffesta_first_kw != FFESTR_firstACCEPT)
17735 goto bad_0; /* :::::::::::::::::::: */
17736 switch (ffelex_token_type (t))
17738 case FFELEX_typeCOMMA:
17739 case FFELEX_typeCOLONCOLON:
17740 case FFELEX_typeEOS:
17741 case FFELEX_typeSEMICOLON:
17742 ffesta_confirmed (); /* Error, but clearly intended. */
17743 goto bad_1; /* :::::::::::::::::::: */
17745 case FFELEX_typeEQUALS:
17746 case FFELEX_typePOINTS:
17747 case FFELEX_typeCOLON:
17748 goto bad_1; /* :::::::::::::::::::: */
17750 case FFELEX_typeNAME:
17751 case FFELEX_typeNUMBER:
17752 ffesta_confirmed ();
17759 for (ix = 0; ix < FFESTP_acceptix; ++ix)
17760 ffestp_file.accept.accept_spec[ix].kw_or_val_present = FALSE;
17761 return (ffelexHandler) (*((ffelexHandler)
17762 ffeexpr_rhs (ffesta_output_pool,
17763 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0191_)))
17766 case FFELEX_typeNAMES:
17767 if (ffesta_first_kw != FFESTR_firstACCEPT)
17768 goto bad_0; /* :::::::::::::::::::: */
17769 switch (ffelex_token_type (t))
17771 case FFELEX_typeEOS:
17772 case FFELEX_typeSEMICOLON:
17773 case FFELEX_typeCOMMA:
17774 ffesta_confirmed ();
17775 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlACCEPT)
17777 goto bad_1; /* :::::::::::::::::::: */
17779 case FFELEX_typeCOLONCOLON:
17780 ffesta_confirmed (); /* Error, but clearly intended. */
17781 goto bad_1; /* :::::::::::::::::::: */
17783 case FFELEX_typeEQUALS:
17784 case FFELEX_typePOINTS:
17785 case FFELEX_typeCOLON:
17786 goto bad_1; /* :::::::::::::::::::: */
17791 for (ix = 0; ix < FFESTP_acceptix; ++ix)
17792 ffestp_file.accept.accept_spec[ix].kw_or_val_present = FALSE;
17793 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17794 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0191_);
17795 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
17796 FFESTR_firstlACCEPT);
17798 return (ffelexHandler) ffelex_swallow_tokens (t,
17799 (ffelexHandler) ffesta_zero);
17800 return (ffelexHandler) (*next) (t);
17803 goto bad_0; /* :::::::::::::::::::: */
17806 bad_0: /* :::::::::::::::::::: */
17807 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", ffesta_tokens[0]);
17808 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17810 bad_1: /* :::::::::::::::::::: */
17811 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t);
17812 return (ffelexHandler) ffelex_swallow_tokens (t,
17813 (ffelexHandler) ffesta_zero); /* Invalid second token. */
17816 /* ffestb_V0191_ -- "ACCEPT" expr
17818 (ffestb_V0191_) // to expression handler
17820 Make sure the next token is a COMMA or EOS/SEMICOLON. */
17822 static ffelexHandler
17823 ffestb_V0191_ (ffelexToken ft, ffebld expr, ffelexToken t)
17825 switch (ffelex_token_type (t))
17827 case FFELEX_typeEOS:
17828 case FFELEX_typeSEMICOLON:
17829 case FFELEX_typeCOMMA:
17830 ffesta_confirmed ();
17831 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].kw_or_val_present
17833 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].kw_present = FALSE;
17834 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value_present = TRUE;
17835 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value_is_label
17837 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value
17838 = ffelex_token_use (ft);
17839 ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].u.expr = expr;
17840 if (!ffesta_is_inhibited ())
17841 ffestc_V019_start ();
17842 ffestb_subr_kill_accept_ ();
17843 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
17844 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
17845 FFEEXPR_contextIOLIST,
17846 (ffeexprCallback) ffestb_V0192_);
17847 if (!ffesta_is_inhibited ())
17848 ffestc_V019_finish ();
17849 return (ffelexHandler) ffesta_zero (t);
17855 ffestb_subr_kill_accept_ ();
17856 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t);
17857 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17860 /* ffestb_V0192_ -- "ACCEPT" expr COMMA expr
17862 (ffestb_V0192_) // to expression handler
17864 Handle COMMA or EOS/SEMICOLON here. */
17866 static ffelexHandler
17867 ffestb_V0192_ (ffelexToken ft, ffebld expr, ffelexToken t)
17869 switch (ffelex_token_type (t))
17871 case FFELEX_typeCOMMA:
17874 if (!ffesta_is_inhibited ())
17875 ffestc_V019_item (expr, ft);
17876 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
17877 FFEEXPR_contextIOLIST,
17878 (ffeexprCallback) ffestb_V0192_);
17880 case FFELEX_typeEOS:
17881 case FFELEX_typeSEMICOLON:
17884 if (!ffesta_is_inhibited ())
17886 ffestc_V019_item (expr, ft);
17887 ffestc_V019_finish ();
17889 return (ffelexHandler) ffesta_zero (t);
17895 if (!ffesta_is_inhibited ())
17896 ffestc_V019_finish ();
17897 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t);
17898 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
17902 /* ffestb_V020 -- Parse the TYPE statement
17904 return ffestb_V020; // to lexer
17906 Make sure the statement has a valid form for the TYPE
17907 statement. If it does, implement the statement. */
17910 ffestb_V020 (ffelexToken t)
17914 ffelexHandler next;
17917 switch (ffelex_token_type (ffesta_tokens[0]))
17919 case FFELEX_typeNAME:
17920 if (ffesta_first_kw != FFESTR_firstTYPE)
17921 goto bad_0; /* :::::::::::::::::::: */
17922 switch (ffelex_token_type (t))
17924 case FFELEX_typeCOLONCOLON:
17925 case FFELEX_typeEOS:
17926 case FFELEX_typeSEMICOLON:
17927 ffesta_confirmed (); /* Error, but clearly intended. */
17928 goto bad_1; /* :::::::::::::::::::: */
17930 case FFELEX_typeEQUALS:
17931 case FFELEX_typePOINTS:
17932 case FFELEX_typeCOLON:
17933 case FFELEX_typeCOMMA: /* Because "TYPE,PUBLIC::A" is ambiguous with
17935 goto bad_1; /* :::::::::::::::::::: */
17937 case FFELEX_typeNUMBER:
17938 ffesta_confirmed ();
17941 case FFELEX_typeNAME: /* Because TYPE A is ambiguous with '90. */
17946 for (ix = 0; ix < FFESTP_typeix; ++ix)
17947 ffestp_file.type.type_spec[ix].kw_or_val_present = FALSE;
17948 return (ffelexHandler) (*((ffelexHandler)
17949 ffeexpr_rhs (ffesta_output_pool,
17950 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0201_)))
17953 case FFELEX_typeNAMES:
17954 if (ffesta_first_kw != FFESTR_firstTYPE)
17955 goto bad_0; /* :::::::::::::::::::: */
17956 switch (ffelex_token_type (t))
17958 case FFELEX_typeEOS:
17959 case FFELEX_typeSEMICOLON:
17960 case FFELEX_typeCOMMA:
17961 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlTYPE)
17963 goto bad_1; /* :::::::::::::::::::: */
17965 case FFELEX_typeCOLONCOLON:
17966 ffesta_confirmed (); /* Error, but clearly intended. */
17967 goto bad_1; /* :::::::::::::::::::: */
17969 case FFELEX_typeOPEN_PAREN:
17970 if (ffelex_token_length (ffesta_tokens[0]) == FFESTR_firstlTYPE)
17971 break; /* Else might be assignment/stmtfuncdef. */
17972 goto bad_1; /* :::::::::::::::::::: */
17974 case FFELEX_typeEQUALS:
17975 case FFELEX_typePOINTS:
17976 case FFELEX_typeCOLON:
17977 goto bad_1; /* :::::::::::::::::::: */
17982 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlTYPE);
17984 ffesta_confirmed (); /* Else might be '90 TYPE statement. */
17985 for (ix = 0; ix < FFESTP_typeix; ++ix)
17986 ffestp_file.type.type_spec[ix].kw_or_val_present = FALSE;
17987 next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
17988 FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0201_);
17989 next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0],
17990 FFESTR_firstlTYPE);
17992 return (ffelexHandler) ffelex_swallow_tokens (t,
17993 (ffelexHandler) ffesta_zero);
17994 return (ffelexHandler) (*next) (t);
17997 goto bad_0; /* :::::::::::::::::::: */
18000 bad_0: /* :::::::::::::::::::: */
18001 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", ffesta_tokens[0]);
18002 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18004 bad_1: /* :::::::::::::::::::: */
18005 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t);
18006 return (ffelexHandler) ffelex_swallow_tokens (t,
18007 (ffelexHandler) ffesta_zero); /* Invalid second token. */
18010 /* ffestb_V0201_ -- "TYPE" expr
18012 (ffestb_V0201_) // to expression handler
18014 Make sure the next token is a COMMA or EOS/SEMICOLON. */
18016 static ffelexHandler
18017 ffestb_V0201_ (ffelexToken ft, ffebld expr, ffelexToken t)
18021 switch (ffelex_token_type (t))
18023 case FFELEX_typeEOS:
18024 case FFELEX_typeSEMICOLON:
18025 if (!ffe_is_vxt () && (expr != NULL)
18026 && (ffebld_op (expr) == FFEBLD_opSYMTER))
18029 /* Fall through. */
18030 case FFELEX_typeCOMMA:
18031 if (!ffe_is_vxt () && comma && (expr != NULL)
18032 && (ffebld_op (expr) == FFEBLD_opPAREN)
18033 && (ffebld_op (ffebld_left (expr)) == FFEBLD_opSYMTER))
18035 ffesta_confirmed ();
18036 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].kw_or_val_present
18038 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].kw_present = FALSE;
18039 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value_present = TRUE;
18040 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value_is_label
18042 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value
18043 = ffelex_token_use (ft);
18044 ffestp_file.type.type_spec[FFESTP_typeixFORMAT].u.expr = expr;
18045 if (!ffesta_is_inhibited ())
18046 ffestc_V020_start ();
18047 ffestb_subr_kill_type_ ();
18048 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18049 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18050 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V0202_);
18051 if (!ffesta_is_inhibited ())
18052 ffestc_V020_finish ();
18053 return (ffelexHandler) ffesta_zero (t);
18059 ffestb_subr_kill_type_ ();
18060 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t);
18061 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18064 /* ffestb_V0202_ -- "TYPE" expr COMMA expr
18066 (ffestb_V0202_) // to expression handler
18068 Handle COMMA or EOS/SEMICOLON here. */
18070 static ffelexHandler
18071 ffestb_V0202_ (ffelexToken ft, ffebld expr, ffelexToken t)
18073 switch (ffelex_token_type (t))
18075 case FFELEX_typeCOMMA:
18078 if (!ffesta_is_inhibited ())
18079 ffestc_V020_item (expr, ft);
18080 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18081 FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V0202_);
18083 case FFELEX_typeEOS:
18084 case FFELEX_typeSEMICOLON:
18087 if (!ffesta_is_inhibited ())
18089 ffestc_V020_item (expr, ft);
18090 ffestc_V020_finish ();
18092 return (ffelexHandler) ffesta_zero (t);
18098 if (!ffesta_is_inhibited ())
18099 ffestc_V020_finish ();
18100 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t);
18101 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18104 /* ffestb_V021 -- Parse a DELETE statement
18106 return ffestb_V021; // to lexer
18108 Make sure the statement has a valid form for a DELETE statement.
18109 If it does, implement the statement. */
18113 ffestb_V021 (ffelexToken t)
18117 switch (ffelex_token_type (ffesta_tokens[0]))
18119 case FFELEX_typeNAME:
18120 if (ffesta_first_kw != FFESTR_firstDELETE)
18121 goto bad_0; /* :::::::::::::::::::: */
18124 case FFELEX_typeNAMES:
18125 if (ffesta_first_kw != FFESTR_firstDELETE)
18126 goto bad_0; /* :::::::::::::::::::: */
18127 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlDELETE)
18128 goto bad_0; /* :::::::::::::::::::: */
18132 goto bad_0; /* :::::::::::::::::::: */
18135 switch (ffelex_token_type (t))
18137 case FFELEX_typeOPEN_PAREN:
18140 case FFELEX_typeEOS:
18141 case FFELEX_typeSEMICOLON:
18142 case FFELEX_typeCOMMA:
18143 case FFELEX_typeCOLONCOLON:
18144 ffesta_confirmed (); /* Error, but clearly intended. */
18145 goto bad_1; /* :::::::::::::::::::: */
18148 goto bad_1; /* :::::::::::::::::::: */
18151 for (ix = 0; ix < FFESTP_deleteix; ++ix)
18152 ffestp_file.delete.delete_spec[ix].kw_or_val_present = FALSE;
18154 return (ffelexHandler) ffestb_V0211_;
18156 bad_0: /* :::::::::::::::::::: */
18157 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", ffesta_tokens[0]);
18158 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18160 bad_1: /* :::::::::::::::::::: */
18161 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18162 return (ffelexHandler) ffelex_swallow_tokens (t,
18163 (ffelexHandler) ffesta_zero); /* Invalid second token. */
18166 /* ffestb_V0211_ -- "DELETE" OPEN_PAREN
18168 return ffestb_V0211_; // to lexer
18170 Handle expr construct (not NAME=expr construct) here. */
18172 static ffelexHandler
18173 ffestb_V0211_ (ffelexToken t)
18175 switch (ffelex_token_type (t))
18177 case FFELEX_typeNAME:
18178 ffesta_tokens[1] = ffelex_token_use (t);
18179 return (ffelexHandler) ffestb_V0212_;
18182 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18183 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0213_)))
18188 /* ffestb_V0212_ -- "DELETE" OPEN_PAREN NAME
18190 return ffestb_V0212_; // to lexer
18192 If EQUALS here, go to states that handle it. Else, send NAME and this
18193 token thru expression handler. */
18195 static ffelexHandler
18196 ffestb_V0212_ (ffelexToken t)
18198 ffelexHandler next;
18201 switch (ffelex_token_type (t))
18203 case FFELEX_typeEQUALS:
18204 nt = ffesta_tokens[1];
18205 next = (ffelexHandler) ffestb_V0214_ (nt);
18206 ffelex_token_kill (nt);
18207 return (ffelexHandler) (*next) (t);
18210 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18211 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0213_)))
18212 (ffesta_tokens[1]);
18213 ffelex_token_kill (ffesta_tokens[1]);
18214 return (ffelexHandler) (*next) (t);
18218 /* ffestb_V0213_ -- "DELETE" OPEN_PAREN expr
18220 (ffestb_V0213_) // to expression handler
18222 Handle COMMA or DELETE_PAREN here. */
18224 static ffelexHandler
18225 ffestb_V0213_ (ffelexToken ft, ffebld expr, ffelexToken t)
18227 switch (ffelex_token_type (t))
18229 case FFELEX_typeCOMMA:
18230 case FFELEX_typeCLOSE_PAREN:
18233 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].kw_or_val_present
18235 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].kw_present = FALSE;
18236 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value_present = TRUE;
18237 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value_is_label
18239 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value
18240 = ffelex_token_use (ft);
18241 ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].u.expr = expr;
18242 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18243 return (ffelexHandler) ffestb_V0214_;
18244 return (ffelexHandler) ffestb_V0219_;
18250 ffestb_subr_kill_delete_ ();
18251 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18252 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18255 /* ffestb_V0214_ -- "DELETE" OPEN_PAREN [external-file-unit COMMA]
18257 return ffestb_V0214_; // to lexer
18259 Handle expr construct (not NAME=expr construct) here. */
18261 static ffelexHandler
18262 ffestb_V0214_ (ffelexToken t)
18266 ffestb_local_.delete.label = FALSE;
18268 switch (ffelex_token_type (t))
18270 case FFELEX_typeNAME:
18271 kw = ffestr_genio (t);
18274 case FFESTR_genioERR:
18275 ffestb_local_.delete.ix = FFESTP_deleteixERR;
18276 ffestb_local_.delete.label = TRUE;
18279 case FFESTR_genioIOSTAT:
18280 ffestb_local_.delete.ix = FFESTP_deleteixIOSTAT;
18281 ffestb_local_.delete.left = TRUE;
18282 ffestb_local_.delete.context = FFEEXPR_contextFILEINT;
18285 case FFESTR_genioREC:
18286 ffestb_local_.delete.ix = FFESTP_deleteixREC;
18287 ffestb_local_.delete.left = FALSE;
18288 ffestb_local_.delete.context = FFEEXPR_contextFILENUM;
18291 case FFESTR_genioUNIT:
18292 ffestb_local_.delete.ix = FFESTP_deleteixUNIT;
18293 ffestb_local_.delete.left = FALSE;
18294 ffestb_local_.delete.context = FFEEXPR_contextFILENUM;
18298 goto bad; /* :::::::::::::::::::: */
18300 if (ffestp_file.delete.delete_spec[ffestb_local_.delete.ix]
18301 .kw_or_val_present)
18302 break; /* Can't specify a keyword twice! */
18303 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix]
18304 .kw_or_val_present = TRUE;
18305 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix]
18306 .kw_present = TRUE;
18307 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix]
18308 .value_present = FALSE;
18309 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_is_label
18310 = ffestb_local_.delete.label;
18311 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].kw
18312 = ffelex_token_use (t);
18313 return (ffelexHandler) ffestb_V0215_;
18319 bad: /* :::::::::::::::::::: */
18320 ffestb_subr_kill_delete_ ();
18321 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18322 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18325 /* ffestb_V0215_ -- "DELETE" OPEN_PAREN [external-file-unit COMMA] NAME
18327 return ffestb_V0215_; // to lexer
18329 Make sure EQUALS here, send next token to expression handler. */
18331 static ffelexHandler
18332 ffestb_V0215_ (ffelexToken t)
18334 switch (ffelex_token_type (t))
18336 case FFELEX_typeEQUALS:
18337 ffesta_confirmed ();
18338 if (ffestb_local_.delete.label)
18339 return (ffelexHandler) ffestb_V0217_;
18340 if (ffestb_local_.delete.left)
18341 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
18342 ffestb_local_.delete.context,
18343 (ffeexprCallback) ffestb_V0216_);
18344 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18345 ffestb_local_.delete.context, (ffeexprCallback) ffestb_V0216_);
18351 ffestb_subr_kill_delete_ ();
18352 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18353 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18356 /* ffestb_V0216_ -- "DELETE" OPEN_PAREN ... NAME EQUALS expr
18358 (ffestb_V0216_) // to expression handler
18360 Handle COMMA or CLOSE_PAREN here. */
18362 static ffelexHandler
18363 ffestb_V0216_ (ffelexToken ft, ffebld expr, ffelexToken t)
18365 switch (ffelex_token_type (t))
18367 case FFELEX_typeCOMMA:
18368 case FFELEX_typeCLOSE_PAREN:
18371 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_present
18373 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value
18374 = ffelex_token_use (ft);
18375 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].u.expr = expr;
18376 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18377 return (ffelexHandler) ffestb_V0214_;
18378 return (ffelexHandler) ffestb_V0219_;
18384 ffestb_subr_kill_delete_ ();
18385 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18386 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18389 /* ffestb_V0217_ -- "DELETE" OPEN_PAREN ... NAME EQUALS
18391 return ffestb_V0217_; // to lexer
18393 Handle NUMBER for label here. */
18395 static ffelexHandler
18396 ffestb_V0217_ (ffelexToken t)
18398 switch (ffelex_token_type (t))
18400 case FFELEX_typeNUMBER:
18401 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_present
18403 ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value
18404 = ffelex_token_use (t);
18405 return (ffelexHandler) ffestb_V0218_;
18411 ffestb_subr_kill_delete_ ();
18412 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18413 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18416 /* ffestb_V0218_ -- "DELETE" OPEN_PAREN ... NAME EQUALS NUMBER
18418 return ffestb_V0218_; // to lexer
18420 Handle COMMA or CLOSE_PAREN here. */
18422 static ffelexHandler
18423 ffestb_V0218_ (ffelexToken t)
18425 switch (ffelex_token_type (t))
18427 case FFELEX_typeCOMMA:
18428 return (ffelexHandler) ffestb_V0214_;
18430 case FFELEX_typeCLOSE_PAREN:
18431 return (ffelexHandler) ffestb_V0219_;
18437 ffestb_subr_kill_delete_ ();
18438 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18439 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18442 /* ffestb_V0219_ -- "DELETE" OPEN_PAREN ... CLOSE_PAREN
18444 return ffestb_V0219_; // to lexer
18446 Handle EOS or SEMICOLON here. */
18448 static ffelexHandler
18449 ffestb_V0219_ (ffelexToken t)
18451 switch (ffelex_token_type (t))
18453 case FFELEX_typeEOS:
18454 case FFELEX_typeSEMICOLON:
18455 ffesta_confirmed ();
18456 if (!ffesta_is_inhibited ())
18458 ffestb_subr_kill_delete_ ();
18459 return (ffelexHandler) ffesta_zero (t);
18465 ffestb_subr_kill_delete_ ();
18466 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t);
18467 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18470 /* ffestb_V026 -- Parse a FIND statement
18472 return ffestb_V026; // to lexer
18474 Make sure the statement has a valid form for a FIND statement.
18475 If it does, implement the statement. */
18478 ffestb_V026 (ffelexToken t)
18482 switch (ffelex_token_type (ffesta_tokens[0]))
18484 case FFELEX_typeNAME:
18485 if (ffesta_first_kw != FFESTR_firstFIND)
18486 goto bad_0; /* :::::::::::::::::::: */
18489 case FFELEX_typeNAMES:
18490 if (ffesta_first_kw != FFESTR_firstFIND)
18491 goto bad_0; /* :::::::::::::::::::: */
18492 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlFIND)
18493 goto bad_0; /* :::::::::::::::::::: */
18497 goto bad_0; /* :::::::::::::::::::: */
18500 switch (ffelex_token_type (t))
18502 case FFELEX_typeOPEN_PAREN:
18505 case FFELEX_typeEOS:
18506 case FFELEX_typeSEMICOLON:
18507 case FFELEX_typeCOMMA:
18508 case FFELEX_typeCOLONCOLON:
18509 ffesta_confirmed (); /* Error, but clearly intended. */
18510 goto bad_1; /* :::::::::::::::::::: */
18513 goto bad_1; /* :::::::::::::::::::: */
18516 for (ix = 0; ix < FFESTP_findix; ++ix)
18517 ffestp_file.find.find_spec[ix].kw_or_val_present = FALSE;
18519 return (ffelexHandler) ffestb_V0261_;
18521 bad_0: /* :::::::::::::::::::: */
18522 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", ffesta_tokens[0]);
18523 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18525 bad_1: /* :::::::::::::::::::: */
18526 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18527 return (ffelexHandler) ffelex_swallow_tokens (t,
18528 (ffelexHandler) ffesta_zero); /* Invalid second token. */
18531 /* ffestb_V0261_ -- "FIND" OPEN_PAREN
18533 return ffestb_V0261_; // to lexer
18535 Handle expr construct (not NAME=expr construct) here. */
18537 static ffelexHandler
18538 ffestb_V0261_ (ffelexToken t)
18540 switch (ffelex_token_type (t))
18542 case FFELEX_typeNAME:
18543 ffesta_tokens[1] = ffelex_token_use (t);
18544 return (ffelexHandler) ffestb_V0262_;
18547 return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18548 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0263_)))
18553 /* ffestb_V0262_ -- "FIND" OPEN_PAREN NAME
18555 return ffestb_V0262_; // to lexer
18557 If EQUALS here, go to states that handle it. Else, send NAME and this
18558 token thru expression handler. */
18560 static ffelexHandler
18561 ffestb_V0262_ (ffelexToken t)
18563 ffelexHandler next;
18566 switch (ffelex_token_type (t))
18568 case FFELEX_typeEQUALS:
18569 nt = ffesta_tokens[1];
18570 next = (ffelexHandler) ffestb_V0264_ (nt);
18571 ffelex_token_kill (nt);
18572 return (ffelexHandler) (*next) (t);
18575 next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18576 FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0263_)))
18577 (ffesta_tokens[1]);
18578 ffelex_token_kill (ffesta_tokens[1]);
18579 return (ffelexHandler) (*next) (t);
18583 /* ffestb_V0263_ -- "FIND" OPEN_PAREN expr
18585 (ffestb_V0263_) // to expression handler
18587 Handle COMMA or FIND_PAREN here. */
18589 static ffelexHandler
18590 ffestb_V0263_ (ffelexToken ft, ffebld expr, ffelexToken t)
18592 switch (ffelex_token_type (t))
18594 case FFELEX_typeCOMMA:
18595 case FFELEX_typeCLOSE_PAREN:
18598 ffestp_file.find.find_spec[FFESTP_findixUNIT].kw_or_val_present
18600 ffestp_file.find.find_spec[FFESTP_findixUNIT].kw_present = FALSE;
18601 ffestp_file.find.find_spec[FFESTP_findixUNIT].value_present = TRUE;
18602 ffestp_file.find.find_spec[FFESTP_findixUNIT].value_is_label
18604 ffestp_file.find.find_spec[FFESTP_findixUNIT].value
18605 = ffelex_token_use (ft);
18606 ffestp_file.find.find_spec[FFESTP_findixUNIT].u.expr = expr;
18607 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18608 return (ffelexHandler) ffestb_V0264_;
18609 return (ffelexHandler) ffestb_V0269_;
18615 ffestb_subr_kill_find_ ();
18616 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18617 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18620 /* ffestb_V0264_ -- "FIND" OPEN_PAREN [external-file-unit COMMA]
18622 return ffestb_V0264_; // to lexer
18624 Handle expr construct (not NAME=expr construct) here. */
18626 static ffelexHandler
18627 ffestb_V0264_ (ffelexToken t)
18631 ffestb_local_.find.label = FALSE;
18633 switch (ffelex_token_type (t))
18635 case FFELEX_typeNAME:
18636 kw = ffestr_genio (t);
18639 case FFESTR_genioERR:
18640 ffestb_local_.find.ix = FFESTP_findixERR;
18641 ffestb_local_.find.label = TRUE;
18644 case FFESTR_genioIOSTAT:
18645 ffestb_local_.find.ix = FFESTP_findixIOSTAT;
18646 ffestb_local_.find.left = TRUE;
18647 ffestb_local_.find.context = FFEEXPR_contextFILEINT;
18650 case FFESTR_genioREC:
18651 ffestb_local_.find.ix = FFESTP_findixREC;
18652 ffestb_local_.find.left = FALSE;
18653 ffestb_local_.find.context = FFEEXPR_contextFILENUM;
18656 case FFESTR_genioUNIT:
18657 ffestb_local_.find.ix = FFESTP_findixUNIT;
18658 ffestb_local_.find.left = FALSE;
18659 ffestb_local_.find.context = FFEEXPR_contextFILENUM;
18663 goto bad; /* :::::::::::::::::::: */
18665 if (ffestp_file.find.find_spec[ffestb_local_.find.ix]
18666 .kw_or_val_present)
18667 break; /* Can't specify a keyword twice! */
18668 ffestp_file.find.find_spec[ffestb_local_.find.ix]
18669 .kw_or_val_present = TRUE;
18670 ffestp_file.find.find_spec[ffestb_local_.find.ix]
18671 .kw_present = TRUE;
18672 ffestp_file.find.find_spec[ffestb_local_.find.ix]
18673 .value_present = FALSE;
18674 ffestp_file.find.find_spec[ffestb_local_.find.ix].value_is_label
18675 = ffestb_local_.find.label;
18676 ffestp_file.find.find_spec[ffestb_local_.find.ix].kw
18677 = ffelex_token_use (t);
18678 return (ffelexHandler) ffestb_V0265_;
18684 bad: /* :::::::::::::::::::: */
18685 ffestb_subr_kill_find_ ();
18686 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18687 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18690 /* ffestb_V0265_ -- "FIND" OPEN_PAREN [external-file-unit COMMA] NAME
18692 return ffestb_V0265_; // to lexer
18694 Make sure EQUALS here, send next token to expression handler. */
18696 static ffelexHandler
18697 ffestb_V0265_ (ffelexToken t)
18699 switch (ffelex_token_type (t))
18701 case FFELEX_typeEQUALS:
18702 ffesta_confirmed ();
18703 if (ffestb_local_.find.label)
18704 return (ffelexHandler) ffestb_V0267_;
18705 if (ffestb_local_.find.left)
18706 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
18707 ffestb_local_.find.context,
18708 (ffeexprCallback) ffestb_V0266_);
18709 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
18710 ffestb_local_.find.context,
18711 (ffeexprCallback) ffestb_V0266_);
18717 ffestb_subr_kill_find_ ();
18718 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18719 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18722 /* ffestb_V0266_ -- "FIND" OPEN_PAREN ... NAME EQUALS expr
18724 (ffestb_V0266_) // to expression handler
18726 Handle COMMA or CLOSE_PAREN here. */
18728 static ffelexHandler
18729 ffestb_V0266_ (ffelexToken ft, ffebld expr, ffelexToken t)
18731 switch (ffelex_token_type (t))
18733 case FFELEX_typeCOMMA:
18734 case FFELEX_typeCLOSE_PAREN:
18737 ffestp_file.find.find_spec[ffestb_local_.find.ix].value_present
18739 ffestp_file.find.find_spec[ffestb_local_.find.ix].value
18740 = ffelex_token_use (ft);
18741 ffestp_file.find.find_spec[ffestb_local_.find.ix].u.expr = expr;
18742 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
18743 return (ffelexHandler) ffestb_V0264_;
18744 return (ffelexHandler) ffestb_V0269_;
18750 ffestb_subr_kill_find_ ();
18751 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18752 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18755 /* ffestb_V0267_ -- "FIND" OPEN_PAREN ... NAME EQUALS
18757 return ffestb_V0267_; // to lexer
18759 Handle NUMBER for label here. */
18761 static ffelexHandler
18762 ffestb_V0267_ (ffelexToken t)
18764 switch (ffelex_token_type (t))
18766 case FFELEX_typeNUMBER:
18767 ffestp_file.find.find_spec[ffestb_local_.find.ix].value_present
18769 ffestp_file.find.find_spec[ffestb_local_.find.ix].value
18770 = ffelex_token_use (t);
18771 return (ffelexHandler) ffestb_V0268_;
18777 ffestb_subr_kill_find_ ();
18778 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18779 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18782 /* ffestb_V0268_ -- "FIND" OPEN_PAREN ... NAME EQUALS NUMBER
18784 return ffestb_V0268_; // to lexer
18786 Handle COMMA or CLOSE_PAREN here. */
18788 static ffelexHandler
18789 ffestb_V0268_ (ffelexToken t)
18791 switch (ffelex_token_type (t))
18793 case FFELEX_typeCOMMA:
18794 return (ffelexHandler) ffestb_V0264_;
18796 case FFELEX_typeCLOSE_PAREN:
18797 return (ffelexHandler) ffestb_V0269_;
18803 ffestb_subr_kill_find_ ();
18804 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18805 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18808 /* ffestb_V0269_ -- "FIND" OPEN_PAREN ... CLOSE_PAREN
18810 return ffestb_V0269_; // to lexer
18812 Handle EOS or SEMICOLON here. */
18814 static ffelexHandler
18815 ffestb_V0269_ (ffelexToken t)
18817 switch (ffelex_token_type (t))
18819 case FFELEX_typeEOS:
18820 case FFELEX_typeSEMICOLON:
18821 ffesta_confirmed ();
18822 if (!ffesta_is_inhibited ())
18824 ffestb_subr_kill_find_ ();
18825 return (ffelexHandler) ffesta_zero (t);
18831 ffestb_subr_kill_find_ ();
18832 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t);
18833 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
18837 /* ffestb_dimlist -- Parse the ALLOCATABLE/POINTER/TARGET statement
18839 return ffestb_dimlist; // to lexer
18841 Make sure the statement has a valid form for the ALLOCATABLE/POINTER/
18842 TARGET statement. If it does, implement the statement. */
18846 ffestb_dimlist (ffelexToken t)
18851 ffelexHandler next;
18853 switch (ffelex_token_type (ffesta_tokens[0]))
18855 case FFELEX_typeNAME:
18856 switch (ffelex_token_type (t))
18858 case FFELEX_typeCOMMA:
18859 case FFELEX_typeEOS:
18860 case FFELEX_typeSEMICOLON:
18861 ffesta_confirmed (); /* Error, but clearly intended. */
18862 goto bad_1; /* :::::::::::::::::::: */
18865 goto bad_1; /* :::::::::::::::::::: */
18867 case FFELEX_typeCOLONCOLON:
18868 ffesta_confirmed ();
18869 if (!ffesta_is_inhibited ())
18871 switch (ffesta_first_kw)
18873 case FFESTR_firstALLOCATABLE:
18874 ffestc_R525_start ();
18877 case FFESTR_firstPOINTER:
18878 ffestc_R526_start ();
18881 case FFESTR_firstTARGET:
18882 ffestc_R527_start ();
18889 ffestb_local_.dimlist.started = TRUE;
18890 return (ffelexHandler) ffestb_dimlist1_;
18892 case FFELEX_typeNAME:
18893 ffesta_confirmed ();
18894 if (!ffesta_is_inhibited ())
18896 switch (ffesta_first_kw)
18898 case FFESTR_firstALLOCATABLE:
18899 ffestc_R525_start ();
18902 case FFESTR_firstPOINTER:
18903 ffestc_R526_start ();
18906 case FFESTR_firstTARGET:
18907 ffestc_R527_start ();
18914 ffestb_local_.dimlist.started = TRUE;
18915 return (ffelexHandler) ffestb_dimlist1_ (t);
18918 case FFELEX_typeNAMES:
18919 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.dimlist.len);
18920 switch (ffelex_token_type (t))
18923 goto bad_1; /* :::::::::::::::::::: */
18925 case FFELEX_typeEOS:
18926 case FFELEX_typeSEMICOLON:
18927 case FFELEX_typeCOMMA:
18928 ffesta_confirmed ();
18929 if (!ffesrc_is_name_init (*p))
18930 goto bad_i; /* :::::::::::::::::::: */
18931 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
18932 if (!ffesta_is_inhibited ())
18934 switch (ffesta_first_kw)
18936 case FFESTR_firstALLOCATABLE:
18937 ffestc_R525_start ();
18940 case FFESTR_firstPOINTER:
18941 ffestc_R526_start ();
18944 case FFESTR_firstTARGET:
18945 ffestc_R527_start ();
18952 ffestb_local_.dimlist.started = TRUE;
18953 next = (ffelexHandler) ffestb_dimlist1_ (nt);
18954 ffelex_token_kill (nt);
18955 return (ffelexHandler) (*next) (t);
18957 case FFELEX_typeCOLONCOLON:
18958 ffesta_confirmed ();
18960 goto bad_i; /* :::::::::::::::::::: */
18961 if (!ffesta_is_inhibited ())
18963 switch (ffesta_first_kw)
18965 case FFESTR_firstALLOCATABLE:
18966 ffestc_R525_start ();
18969 case FFESTR_firstPOINTER:
18970 ffestc_R526_start ();
18973 case FFESTR_firstTARGET:
18974 ffestc_R527_start ();
18981 ffestb_local_.dimlist.started = TRUE;
18982 return (ffelexHandler) ffestb_dimlist1_;
18984 case FFELEX_typeOPEN_PAREN:
18985 if (!ffesrc_is_name_init (*p))
18986 goto bad_i; /* :::::::::::::::::::: */
18987 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
18988 ffestb_local_.dimlist.started = FALSE;
18989 next = (ffelexHandler) ffestb_dimlist1_ (nt);
18990 ffelex_token_kill (nt);
18991 return (ffelexHandler) (*next) (t);
18995 goto bad_0; /* :::::::::::::::::::: */
18998 bad_0: /* :::::::::::::::::::: */
18999 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, ffesta_tokens[0]);
19000 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19002 bad_1: /* :::::::::::::::::::: */
19003 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19004 return (ffelexHandler) ffelex_swallow_tokens (t,
19005 (ffelexHandler) ffesta_zero); /* Invalid second token. */
19007 bad_i: /* :::::::::::::::::::: */
19008 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, ffesta_tokens[0], i, t);
19009 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19012 /* ffestb_dimlist1_ -- "ALLOCATABLE/POINTER/TARGET" [COLONCOLON]
19014 return ffestb_dimlist1_; // to lexer
19018 static ffelexHandler
19019 ffestb_dimlist1_ (ffelexToken t)
19021 switch (ffelex_token_type (t))
19023 case FFELEX_typeNAME:
19024 ffesta_tokens[1] = ffelex_token_use (t);
19025 return (ffelexHandler) ffestb_dimlist2_;
19028 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19032 if (!ffesta_is_inhibited ())
19034 switch (ffesta_first_kw)
19036 case FFESTR_firstALLOCATABLE:
19037 ffestc_R525_finish ();
19040 case FFESTR_firstPOINTER:
19041 ffestc_R526_finish ();
19044 case FFESTR_firstTARGET:
19045 ffestc_R527_finish ();
19052 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19055 /* ffestb_dimlist2_ -- "ALLOCATABLE/POINTER/TARGET" ... NAME
19057 return ffestb_dimlist2_; // to lexer
19059 Handle OPEN_PAREN. */
19061 static ffelexHandler
19062 ffestb_dimlist2_ (ffelexToken t)
19064 switch (ffelex_token_type (t))
19066 case FFELEX_typeOPEN_PAREN:
19067 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
19068 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_dimlist3_;
19069 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
19070 ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLIST;
19071 #ifdef FFECOM_dimensionsMAX
19072 ffestb_subrargs_.dim_list.ndims = 0;
19074 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
19075 FFEEXPR_contextDIMLIST, (ffeexprCallback) ffestb_subr_dimlist_);
19077 case FFELEX_typeCOMMA:
19078 ffesta_confirmed ();
19079 if (!ffesta_is_inhibited ())
19081 if (!ffestb_local_.dimlist.started)
19083 switch (ffesta_first_kw)
19085 case FFESTR_firstALLOCATABLE:
19086 ffestc_R525_start ();
19089 case FFESTR_firstPOINTER:
19090 ffestc_R526_start ();
19093 case FFESTR_firstTARGET:
19094 ffestc_R527_start ();
19100 ffestb_local_.dimlist.started = TRUE;
19102 switch (ffesta_first_kw)
19104 case FFESTR_firstALLOCATABLE:
19105 ffestc_R525_item (ffesta_tokens[1], NULL);
19108 case FFESTR_firstPOINTER:
19109 ffestc_R526_item (ffesta_tokens[1], NULL);
19112 case FFESTR_firstTARGET:
19113 ffestc_R527_item (ffesta_tokens[1], NULL);
19120 ffelex_token_kill (ffesta_tokens[1]);
19121 return (ffelexHandler) ffestb_dimlist4_;
19123 case FFELEX_typeEOS:
19124 case FFELEX_typeSEMICOLON:
19125 ffesta_confirmed ();
19126 if (!ffesta_is_inhibited ())
19128 if (!ffestb_local_.dimlist.started)
19130 switch (ffesta_first_kw)
19132 case FFESTR_firstALLOCATABLE:
19133 ffestc_R525_start ();
19136 case FFESTR_firstPOINTER:
19137 ffestc_R526_start ();
19140 case FFESTR_firstTARGET:
19141 ffestc_R527_start ();
19148 switch (ffesta_first_kw)
19150 case FFESTR_firstALLOCATABLE:
19151 ffestc_R525_item (ffesta_tokens[1], NULL);
19152 ffestc_R525_finish ();
19155 case FFESTR_firstPOINTER:
19156 ffestc_R526_item (ffesta_tokens[1], NULL);
19157 ffestc_R526_finish ();
19160 case FFESTR_firstTARGET:
19161 ffestc_R527_item (ffesta_tokens[1], NULL);
19162 ffestc_R527_finish ();
19169 ffelex_token_kill (ffesta_tokens[1]);
19170 return (ffelexHandler) ffesta_zero (t);
19173 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19177 if (!ffesta_is_inhibited ())
19179 switch (ffesta_first_kw)
19181 case FFESTR_firstALLOCATABLE:
19182 ffestc_R525_finish ();
19185 case FFESTR_firstPOINTER:
19186 ffestc_R526_finish ();
19189 case FFESTR_firstTARGET:
19190 ffestc_R527_finish ();
19197 ffelex_token_kill (ffesta_tokens[1]);
19198 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19201 /* ffestb_dimlist3_ -- "ALLOCATABLE/POINTER/TARGET" ... NAME OPEN_PAREN
19202 dimlist CLOSE_PAREN
19204 return ffestb_dimlist3_; // to lexer
19206 Handle COMMA or EOS/SEMICOLON. */
19208 static ffelexHandler
19209 ffestb_dimlist3_ (ffelexToken t)
19211 if (!ffestb_subrargs_.dim_list.ok)
19212 goto bad; /* :::::::::::::::::::: */
19214 switch (ffelex_token_type (t))
19216 case FFELEX_typeCOMMA:
19217 ffesta_confirmed ();
19218 if (!ffesta_is_inhibited ())
19220 if (!ffestb_local_.dimlist.started)
19222 switch (ffesta_first_kw)
19224 case FFESTR_firstALLOCATABLE:
19225 ffestc_R525_start ();
19228 case FFESTR_firstPOINTER:
19229 ffestc_R526_start ();
19232 case FFESTR_firstTARGET:
19233 ffestc_R527_start ();
19239 ffestb_local_.dimlist.started = TRUE;
19241 switch (ffesta_first_kw)
19243 case FFESTR_firstALLOCATABLE:
19244 ffestc_R525_item (ffesta_tokens[1],
19245 ffestb_subrargs_.dim_list.dims);
19248 case FFESTR_firstPOINTER:
19249 ffestc_R526_item (ffesta_tokens[1],
19250 ffestb_subrargs_.dim_list.dims);
19253 case FFESTR_firstTARGET:
19254 ffestc_R527_item (ffesta_tokens[1],
19255 ffestb_subrargs_.dim_list.dims);
19262 ffelex_token_kill (ffesta_tokens[1]);
19263 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19264 return (ffelexHandler) ffestb_dimlist4_;
19266 case FFELEX_typeEOS:
19267 case FFELEX_typeSEMICOLON:
19268 ffesta_confirmed ();
19269 if (!ffesta_is_inhibited ())
19271 if (!ffestb_local_.dimlist.started)
19273 switch (ffesta_first_kw)
19275 case FFESTR_firstALLOCATABLE:
19276 ffestc_R525_start ();
19279 case FFESTR_firstPOINTER:
19280 ffestc_R526_start ();
19283 case FFESTR_firstTARGET:
19284 ffestc_R527_start ();
19291 switch (ffesta_first_kw)
19293 case FFESTR_firstALLOCATABLE:
19294 ffestc_R525_item (ffesta_tokens[1],
19295 ffestb_subrargs_.dim_list.dims);
19296 ffestc_R525_finish ();
19299 case FFESTR_firstPOINTER:
19300 ffestc_R526_item (ffesta_tokens[1],
19301 ffestb_subrargs_.dim_list.dims);
19302 ffestc_R526_finish ();
19305 case FFESTR_firstTARGET:
19306 ffestc_R527_item (ffesta_tokens[1],
19307 ffestb_subrargs_.dim_list.dims);
19308 ffestc_R527_finish ();
19315 ffelex_token_kill (ffesta_tokens[1]);
19316 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19317 return (ffelexHandler) ffesta_zero (t);
19323 bad: /* :::::::::::::::::::: */
19324 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19325 if (ffestb_local_.dimlist.started && !ffesta_is_inhibited ())
19327 switch (ffesta_first_kw)
19329 case FFESTR_firstALLOCATABLE:
19330 ffestc_R525_finish ();
19333 case FFESTR_firstPOINTER:
19334 ffestc_R526_finish ();
19337 case FFESTR_firstTARGET:
19338 ffestc_R527_finish ();
19345 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19346 ffelex_token_kill (ffesta_tokens[1]);
19347 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19350 /* ffestb_dimlist4_ -- "ALLOCATABLE/POINTER/TARGET" ... COMMA
19352 return ffestb_dimlist4_; // to lexer
19354 Make sure we don't have EOS or SEMICOLON. */
19356 static ffelexHandler
19357 ffestb_dimlist4_ (ffelexToken t)
19359 switch (ffelex_token_type (t))
19361 case FFELEX_typeEOS:
19362 case FFELEX_typeSEMICOLON:
19363 if (!ffesta_is_inhibited ())
19365 switch (ffesta_first_kw)
19367 case FFESTR_firstALLOCATABLE:
19368 ffestc_R525_finish ();
19371 case FFESTR_firstPOINTER:
19372 ffestc_R526_finish ();
19375 case FFESTR_firstTARGET:
19376 ffestc_R527_finish ();
19383 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t);
19384 return (ffelexHandler) ffesta_zero (t);
19387 return (ffelexHandler) ffestb_dimlist1_ (t);
19392 /* ffestb_dummy -- Parse an ENTRY/FUNCTION/SUBROUTINE statement
19394 return ffestb_dummy; // to lexer
19396 Make sure the statement has a valid form for an ENTRY/FUNCTION/SUBROUTINE
19397 statement. If it does, implement the statement. */
19400 ffestb_dummy (ffelexToken t)
19405 switch (ffelex_token_type (ffesta_tokens[0]))
19407 case FFELEX_typeNAME:
19408 switch (ffelex_token_type (t))
19410 case FFELEX_typeEOS:
19411 case FFELEX_typeSEMICOLON:
19412 case FFELEX_typeCOMMA:
19413 case FFELEX_typeCOLONCOLON:
19414 ffesta_confirmed (); /* Error, but clearly intended. */
19415 goto bad_1; /* :::::::::::::::::::: */
19418 goto bad_1; /* :::::::::::::::::::: */
19420 case FFELEX_typeNAME:
19424 ffesta_confirmed ();
19425 ffesta_tokens[1] = ffelex_token_use (t);
19426 ffestb_local_.decl.recursive = NULL;
19427 ffestb_local_.dummy.badname = ffestb_args.dummy.badname;
19428 ffestb_local_.dummy.is_subr = ffestb_args.dummy.is_subr;
19429 ffestb_local_.dummy.first_kw = ffesta_first_kw;
19430 return (ffelexHandler) ffestb_dummy1_;
19432 case FFELEX_typeNAMES:
19433 switch (ffelex_token_type (t))
19435 case FFELEX_typeCOMMA:
19436 case FFELEX_typeCOLONCOLON:
19437 ffesta_confirmed (); /* Error, but clearly intended. */
19438 goto bad_1; /* :::::::::::::::::::: */
19441 goto bad_1; /* :::::::::::::::::::: */
19443 case FFELEX_typeEOS:
19444 case FFELEX_typeSEMICOLON:
19445 ffesta_confirmed ();
19448 case FFELEX_typeOPEN_PAREN:
19451 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.dummy.len);
19452 if (!ffesrc_is_name_init (*p))
19453 goto bad_i; /* :::::::::::::::::::: */
19455 = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
19456 ffestb_local_.decl.recursive = NULL;
19457 ffestb_local_.dummy.badname = ffestb_args.dummy.badname;
19458 ffestb_local_.dummy.is_subr = ffestb_args.dummy.is_subr;
19459 ffestb_local_.dummy.first_kw = ffesta_first_kw;
19460 return (ffelexHandler) ffestb_dummy1_ (t);
19463 goto bad_0; /* :::::::::::::::::::: */
19466 bad_0: /* :::::::::::::::::::: */
19467 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, ffesta_tokens[0]);
19468 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19470 bad_1: /* :::::::::::::::::::: */
19471 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, t);
19472 return (ffelexHandler) ffelex_swallow_tokens (t,
19473 (ffelexHandler) ffesta_zero); /* Invalid second token. */
19475 bad_i: /* :::::::::::::::::::: */
19476 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, ffesta_tokens[0], i, t);
19477 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19480 /* ffestb_dummy1_ -- "ENTRY/FUNCTION/SUBROUTINE" NAME
19482 return ffestb_dummy1_; // to lexer
19484 Make sure the next token is an EOS, SEMICOLON, or OPEN_PAREN. In the
19485 former case, just implement a null arg list, else get the arg list and
19488 static ffelexHandler
19489 ffestb_dummy1_ (ffelexToken t)
19491 switch (ffelex_token_type (t))
19493 case FFELEX_typeEOS:
19494 case FFELEX_typeSEMICOLON:
19495 if (ffestb_local_.dummy.first_kw == FFESTR_firstFUNCTION)
19497 ffesta_confirmed (); /* Later, not if typename w/o RECURSIVE. */
19498 break; /* Produce an error message, need that open
19501 ffesta_confirmed ();
19502 if (!ffesta_is_inhibited ())
19503 { /* Pretend as though we got a truly NULL
19505 ffestb_subrargs_.name_list.args = NULL;
19506 ffestb_subrargs_.name_list.ok = TRUE;
19507 ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
19508 return (ffelexHandler) ffestb_dummy2_ (t);
19510 if (ffestb_local_.decl.recursive != NULL)
19511 ffelex_token_kill (ffestb_local_.decl.recursive);
19512 ffelex_token_kill (ffesta_tokens[1]);
19513 return (ffelexHandler) ffesta_zero (t);
19515 case FFELEX_typeOPEN_PAREN:
19516 ffestb_subrargs_.name_list.args = ffestt_tokenlist_create ();
19517 ffestb_subrargs_.name_list.handler = (ffelexHandler) ffestb_dummy2_;
19518 ffestb_subrargs_.name_list.is_subr = ffestb_local_.dummy.is_subr;
19519 ffestb_subrargs_.name_list.names = FALSE;
19520 return (ffelexHandler) ffestb_subr_name_list_;
19526 if (ffestb_local_.decl.recursive != NULL)
19527 ffelex_token_kill (ffestb_local_.decl.recursive);
19528 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_local_.dummy.badname, t);
19529 ffelex_token_kill (ffesta_tokens[1]);
19530 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19533 /* ffestb_dummy2_ -- <dummy-keyword> NAME OPEN_PAREN arg-list CLOSE_PAREN
19535 return ffestb_dummy2_; // to lexer
19537 Make sure the statement has a valid form for a dummy-def statement. If it
19538 does, implement the statement. */
19540 static ffelexHandler
19541 ffestb_dummy2_ (ffelexToken t)
19543 if (!ffestb_subrargs_.name_list.ok)
19544 goto bad; /* :::::::::::::::::::: */
19546 switch (ffelex_token_type (t))
19548 case FFELEX_typeEOS:
19549 case FFELEX_typeSEMICOLON:
19550 ffesta_confirmed ();
19551 if (!ffesta_is_inhibited ())
19553 switch (ffestb_local_.dummy.first_kw)
19555 case FFESTR_firstFUNCTION:
19556 ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
19557 ffestb_subrargs_.name_list.close_paren, FFESTP_typeNone,
19558 NULL, NULL, NULL, NULL, ffestb_local_.decl.recursive, NULL);
19561 case FFESTR_firstSUBROUTINE:
19562 ffestc_R1223 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
19563 ffestb_subrargs_.name_list.close_paren,
19564 ffestb_local_.decl.recursive);
19567 case FFESTR_firstENTRY:
19568 ffestc_R1226 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
19569 ffestb_subrargs_.name_list.close_paren);
19576 ffelex_token_kill (ffesta_tokens[1]);
19577 if (ffestb_local_.decl.recursive != NULL)
19578 ffelex_token_kill (ffestb_local_.decl.recursive);
19579 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
19580 if (ffestb_subrargs_.name_list.args != NULL)
19581 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
19582 return (ffelexHandler) ffesta_zero (t);
19584 case FFELEX_typeNAME:
19585 ffesta_confirmed ();
19586 if ((ffestb_local_.dummy.first_kw != FFESTR_firstFUNCTION)
19587 || (ffestr_other (t) != FFESTR_otherRESULT))
19589 ffestb_local_.decl.type = FFESTP_typeNone;
19590 ffestb_local_.decl.kind = NULL;
19591 ffestb_local_.decl.kindt = NULL;
19592 ffestb_local_.decl.len = NULL;
19593 ffestb_local_.decl.lent = NULL;
19594 return (ffelexHandler) ffestb_decl_funcname_6_;
19600 bad: /* :::::::::::::::::::: */
19601 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_local_.dummy.badname, t);
19602 ffelex_token_kill (ffesta_tokens[1]);
19603 if (ffestb_local_.decl.recursive != NULL)
19604 ffelex_token_kill (ffestb_local_.decl.recursive);
19605 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
19606 if (ffestb_subrargs_.name_list.args != NULL)
19607 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
19608 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19611 /* ffestb_R524 -- Parse the DIMENSION statement
19613 return ffestb_R524; // to lexer
19615 Make sure the statement has a valid form for the DIMENSION statement. If
19616 it does, implement the statement. */
19619 ffestb_R524 (ffelexToken t)
19624 ffelexHandler next;
19626 switch (ffelex_token_type (ffesta_tokens[0]))
19628 case FFELEX_typeNAME:
19629 switch (ffelex_token_type (t))
19631 case FFELEX_typeCOMMA:
19632 case FFELEX_typeCOLONCOLON:
19633 case FFELEX_typeEOS:
19634 case FFELEX_typeSEMICOLON:
19635 ffesta_confirmed (); /* Error, but clearly intended. */
19636 goto bad_1; /* :::::::::::::::::::: */
19639 goto bad_1; /* :::::::::::::::::::: */
19641 case FFELEX_typeNAME:
19642 ffesta_confirmed ();
19643 if (!ffesta_is_inhibited ())
19644 ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL);
19645 ffestb_local_.dimension.started = TRUE;
19646 return (ffelexHandler) ffestb_R5241_ (t);
19649 case FFELEX_typeNAMES:
19650 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.R524.len);
19651 switch (ffelex_token_type (t))
19654 goto bad_1; /* :::::::::::::::::::: */
19656 case FFELEX_typeEOS:
19657 case FFELEX_typeSEMICOLON:
19658 case FFELEX_typeCOMMA:
19659 case FFELEX_typeCOLONCOLON:
19660 ffesta_confirmed ();
19661 goto bad_1; /* :::::::::::::::::::: */
19663 case FFELEX_typeOPEN_PAREN:
19667 /* Here, we have at least one char after "DIMENSION" and t is
19670 if (!ffesrc_is_name_init (*p))
19671 goto bad_i; /* :::::::::::::::::::: */
19672 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
19673 ffestb_local_.dimension.started = FALSE;
19674 next = (ffelexHandler) ffestb_R5241_ (nt);
19675 ffelex_token_kill (nt);
19676 return (ffelexHandler) (*next) (t);
19679 goto bad_0; /* :::::::::::::::::::: */
19682 bad_0: /* :::::::::::::::::::: */
19683 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, ffesta_tokens[0]);
19684 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19686 bad_1: /* :::::::::::::::::::: */
19687 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19688 return (ffelexHandler) ffelex_swallow_tokens (t,
19689 (ffelexHandler) ffesta_zero); /* Invalid second token. */
19691 bad_i: /* :::::::::::::::::::: */
19692 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, ffesta_tokens[0], i, t);
19693 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19696 /* ffestb_R5241_ -- "DIMENSION"
19698 return ffestb_R5241_; // to lexer
19702 static ffelexHandler
19703 ffestb_R5241_ (ffelexToken t)
19705 switch (ffelex_token_type (t))
19707 case FFELEX_typeNAME:
19708 ffesta_tokens[1] = ffelex_token_use (t);
19709 return (ffelexHandler) ffestb_R5242_;
19712 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19716 if (!ffesta_is_inhibited ())
19717 ffestc_R524_finish ();
19718 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19721 /* ffestb_R5242_ -- "DIMENSION" ... NAME
19723 return ffestb_R5242_; // to lexer
19725 Handle OPEN_PAREN. */
19727 static ffelexHandler
19728 ffestb_R5242_ (ffelexToken t)
19730 switch (ffelex_token_type (t))
19732 case FFELEX_typeOPEN_PAREN:
19733 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
19734 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_R5243_;
19735 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
19736 ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid
19737 ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON;
19738 #ifdef FFECOM_dimensionsMAX
19739 ffestb_subrargs_.dim_list.ndims = 0;
19741 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
19742 ffestb_subrargs_.dim_list.ctx,
19743 (ffeexprCallback) ffestb_subr_dimlist_);
19746 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19750 if (!ffesta_is_inhibited ())
19751 ffestc_R524_finish ();
19752 ffelex_token_kill (ffesta_tokens[1]);
19753 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19756 /* ffestb_R5243_ -- "DIMENSION" ... NAME OPEN_PAREN dimlist CLOSE_PAREN
19758 return ffestb_R5243_; // to lexer
19760 Handle COMMA or EOS/SEMICOLON. */
19762 static ffelexHandler
19763 ffestb_R5243_ (ffelexToken t)
19765 if (!ffestb_subrargs_.dim_list.ok)
19766 goto bad; /* :::::::::::::::::::: */
19768 switch (ffelex_token_type (t))
19770 case FFELEX_typeCOMMA:
19771 ffesta_confirmed ();
19772 if (!ffesta_is_inhibited ())
19774 if (!ffestb_local_.dimension.started)
19776 ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL);
19777 ffestb_local_.dimension.started = TRUE;
19779 ffestc_R524_item (ffesta_tokens[1],
19780 ffestb_subrargs_.dim_list.dims);
19782 ffelex_token_kill (ffesta_tokens[1]);
19783 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19784 return (ffelexHandler) ffestb_R5244_;
19786 case FFELEX_typeEOS:
19787 case FFELEX_typeSEMICOLON:
19788 ffesta_confirmed ();
19789 if (!ffesta_is_inhibited ())
19791 if (!ffestb_local_.dimension.started)
19793 ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL);
19794 ffestb_local_.dimension.started = TRUE;
19796 ffestc_R524_item (ffesta_tokens[1],
19797 ffestb_subrargs_.dim_list.dims);
19798 ffestc_R524_finish ();
19800 ffelex_token_kill (ffesta_tokens[1]);
19801 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19802 return (ffelexHandler) ffesta_zero (t);
19808 bad: /* :::::::::::::::::::: */
19809 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19810 if (ffestb_local_.dimension.started && !ffesta_is_inhibited ())
19811 ffestc_R524_finish ();
19812 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
19813 ffelex_token_kill (ffesta_tokens[1]);
19814 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19817 /* ffestb_R5244_ -- "DIMENSION" ... COMMA
19819 return ffestb_R5244_; // to lexer
19821 Make sure we don't have EOS or SEMICOLON. */
19823 static ffelexHandler
19824 ffestb_R5244_ (ffelexToken t)
19826 switch (ffelex_token_type (t))
19828 case FFELEX_typeEOS:
19829 case FFELEX_typeSEMICOLON:
19830 if (!ffesta_is_inhibited ())
19831 ffestc_R524_finish ();
19832 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t);
19833 return (ffelexHandler) ffesta_zero (t);
19836 return (ffelexHandler) ffestb_R5241_ (t);
19840 /* ffestb_R547 -- Parse the COMMON statement
19842 return ffestb_R547; // to lexer
19844 Make sure the statement has a valid form for the COMMON statement. If it
19845 does, implement the statement. */
19848 ffestb_R547 (ffelexToken t)
19853 ffelexHandler next;
19855 switch (ffelex_token_type (ffesta_tokens[0]))
19857 case FFELEX_typeNAME:
19858 if (ffesta_first_kw != FFESTR_firstCOMMON)
19859 goto bad_0; /* :::::::::::::::::::: */
19860 switch (ffelex_token_type (t))
19862 case FFELEX_typeCOMMA:
19863 case FFELEX_typeCOLONCOLON:
19864 case FFELEX_typeEOS:
19865 case FFELEX_typeSEMICOLON:
19866 ffesta_confirmed (); /* Error, but clearly intended. */
19867 goto bad_1; /* :::::::::::::::::::: */
19870 goto bad_1; /* :::::::::::::::::::: */
19872 case FFELEX_typeNAME:
19873 case FFELEX_typeSLASH:
19874 case FFELEX_typeCONCAT:
19875 ffesta_confirmed ();
19876 if (!ffesta_is_inhibited ())
19877 ffestc_R547_start ();
19878 ffestb_local_.common.started = TRUE;
19879 return (ffelexHandler) ffestb_R5471_ (t);
19882 case FFELEX_typeNAMES:
19883 if (ffesta_first_kw != FFESTR_firstCOMMON)
19884 goto bad_0; /* :::::::::::::::::::: */
19885 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCOMMON);
19886 switch (ffelex_token_type (t))
19889 goto bad_1; /* :::::::::::::::::::: */
19891 case FFELEX_typeEOS:
19892 case FFELEX_typeSEMICOLON:
19893 case FFELEX_typeCOMMA:
19894 case FFELEX_typeCOLONCOLON:
19895 ffesta_confirmed ();
19898 case FFELEX_typeSLASH:
19899 case FFELEX_typeCONCAT:
19900 ffesta_confirmed ();
19903 if (!ffesta_is_inhibited ())
19904 ffestc_R547_start ();
19905 ffestb_local_.common.started = TRUE;
19906 return (ffelexHandler) ffestb_R5471_ (t);
19908 case FFELEX_typeOPEN_PAREN:
19912 /* Here, we have at least one char after "COMMON" and t is COMMA,
19913 EOS/SEMICOLON, OPEN_PAREN, SLASH, or CONCAT. */
19915 if (!ffesrc_is_name_init (*p))
19916 goto bad_i; /* :::::::::::::::::::: */
19917 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
19918 if (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN)
19919 ffestb_local_.common.started = FALSE;
19922 if (!ffesta_is_inhibited ())
19923 ffestc_R547_start ();
19924 ffestb_local_.common.started = TRUE;
19926 next = (ffelexHandler) ffestb_R5471_ (nt);
19927 ffelex_token_kill (nt);
19928 return (ffelexHandler) (*next) (t);
19931 goto bad_0; /* :::::::::::::::::::: */
19934 bad_0: /* :::::::::::::::::::: */
19935 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", ffesta_tokens[0]);
19936 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19938 bad_1: /* :::::::::::::::::::: */
19939 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
19940 return (ffelexHandler) ffelex_swallow_tokens (t,
19941 (ffelexHandler) ffesta_zero); /* Invalid second token. */
19943 bad_i: /* :::::::::::::::::::: */
19944 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "COMMON", ffesta_tokens[0], i, t);
19945 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19948 /* ffestb_R5471_ -- "COMMON"
19950 return ffestb_R5471_; // to lexer
19952 Handle NAME, SLASH, or CONCAT. */
19954 static ffelexHandler
19955 ffestb_R5471_ (ffelexToken t)
19957 switch (ffelex_token_type (t))
19959 case FFELEX_typeNAME:
19960 return (ffelexHandler) ffestb_R5474_ (t);
19962 case FFELEX_typeSLASH:
19963 return (ffelexHandler) ffestb_R5472_;
19965 case FFELEX_typeCONCAT:
19966 if (!ffesta_is_inhibited ())
19967 ffestc_R547_item_cblock (NULL);
19968 return (ffelexHandler) ffestb_R5474_;
19971 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
19975 if (!ffesta_is_inhibited ())
19976 ffestc_R547_finish ();
19977 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
19980 /* ffestb_R5472_ -- "COMMON" SLASH
19982 return ffestb_R5472_; // to lexer
19986 static ffelexHandler
19987 ffestb_R5472_ (ffelexToken t)
19989 switch (ffelex_token_type (t))
19991 case FFELEX_typeNAME:
19992 ffesta_tokens[1] = ffelex_token_use (t);
19993 return (ffelexHandler) ffestb_R5473_;
19995 case FFELEX_typeSLASH:
19996 if (!ffesta_is_inhibited ())
19997 ffestc_R547_item_cblock (NULL);
19998 return (ffelexHandler) ffestb_R5474_;
20001 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20005 if (!ffesta_is_inhibited ())
20006 ffestc_R547_finish ();
20007 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20010 /* ffestb_R5473_ -- "COMMON" SLASH NAME
20012 return ffestb_R5473_; // to lexer
20016 static ffelexHandler
20017 ffestb_R5473_ (ffelexToken t)
20019 switch (ffelex_token_type (t))
20021 case FFELEX_typeSLASH:
20022 if (!ffesta_is_inhibited ())
20023 ffestc_R547_item_cblock (ffesta_tokens[1]);
20024 ffelex_token_kill (ffesta_tokens[1]);
20025 return (ffelexHandler) ffestb_R5474_;
20028 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20032 if (!ffesta_is_inhibited ())
20033 ffestc_R547_finish ();
20034 ffelex_token_kill (ffesta_tokens[1]);
20035 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20038 /* ffestb_R5474_ -- "COMMON" [SLASH NAME SLASH] or "COMMON" CONCAT
20040 return ffestb_R5474_; // to lexer
20044 static ffelexHandler
20045 ffestb_R5474_ (ffelexToken t)
20047 switch (ffelex_token_type (t))
20049 case FFELEX_typeNAME:
20050 ffesta_tokens[1] = ffelex_token_use (t);
20051 return (ffelexHandler) ffestb_R5475_;
20054 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20058 if (!ffesta_is_inhibited ())
20059 ffestc_R547_finish ();
20060 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20063 /* ffestb_R5475_ -- "COMMON" ... NAME
20065 return ffestb_R5475_; // to lexer
20067 Handle OPEN_PAREN. */
20069 static ffelexHandler
20070 ffestb_R5475_ (ffelexToken t)
20072 switch (ffelex_token_type (t))
20074 case FFELEX_typeOPEN_PAREN:
20075 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
20076 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_R5476_;
20077 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
20078 ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON;
20079 #ifdef FFECOM_dimensionsMAX
20080 ffestb_subrargs_.dim_list.ndims = 0;
20082 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
20083 FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_);
20085 case FFELEX_typeCOMMA:
20086 if (!ffesta_is_inhibited ())
20087 ffestc_R547_item_object (ffesta_tokens[1], NULL);
20088 ffelex_token_kill (ffesta_tokens[1]);
20089 return (ffelexHandler) ffestb_R5477_;
20091 case FFELEX_typeSLASH:
20092 case FFELEX_typeCONCAT:
20093 if (!ffesta_is_inhibited ())
20094 ffestc_R547_item_object (ffesta_tokens[1], NULL);
20095 ffelex_token_kill (ffesta_tokens[1]);
20096 return (ffelexHandler) ffestb_R5471_ (t);
20098 case FFELEX_typeEOS:
20099 case FFELEX_typeSEMICOLON:
20100 if (!ffesta_is_inhibited ())
20102 ffestc_R547_item_object (ffesta_tokens[1], NULL);
20103 ffestc_R547_finish ();
20105 ffelex_token_kill (ffesta_tokens[1]);
20106 return (ffelexHandler) ffesta_zero (t);
20109 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20113 if (!ffesta_is_inhibited ())
20114 ffestc_R547_finish ();
20115 ffelex_token_kill (ffesta_tokens[1]);
20116 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20119 /* ffestb_R5476_ -- "COMMON" ... NAME OPEN_PAREN dimlist CLOSE_PAREN
20121 return ffestb_R5476_; // to lexer
20123 Handle COMMA, SLASH, CONCAT, EOS/SEMICOLON. */
20125 static ffelexHandler
20126 ffestb_R5476_ (ffelexToken t)
20128 if (!ffestb_subrargs_.dim_list.ok)
20129 goto bad; /* :::::::::::::::::::: */
20131 switch (ffelex_token_type (t))
20133 case FFELEX_typeCOMMA:
20134 ffesta_confirmed ();
20135 if (!ffesta_is_inhibited ())
20137 if (!ffestb_local_.common.started)
20139 ffestc_R547_start ();
20140 ffestb_local_.common.started = TRUE;
20142 ffestc_R547_item_object (ffesta_tokens[1],
20143 ffestb_subrargs_.dim_list.dims);
20145 ffelex_token_kill (ffesta_tokens[1]);
20146 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
20147 return (ffelexHandler) ffestb_R5477_;
20149 case FFELEX_typeSLASH:
20150 case FFELEX_typeCONCAT:
20151 ffesta_confirmed ();
20152 if (!ffesta_is_inhibited ())
20154 if (!ffestb_local_.common.started)
20156 ffestc_R547_start ();
20157 ffestb_local_.common.started = TRUE;
20159 ffestc_R547_item_object (ffesta_tokens[1],
20160 ffestb_subrargs_.dim_list.dims);
20162 ffelex_token_kill (ffesta_tokens[1]);
20163 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
20164 return (ffelexHandler) ffestb_R5471_ (t);
20166 case FFELEX_typeEOS:
20167 case FFELEX_typeSEMICOLON:
20168 ffesta_confirmed ();
20169 if (!ffesta_is_inhibited ())
20171 if (!ffestb_local_.common.started)
20172 ffestc_R547_start ();
20173 ffestc_R547_item_object (ffesta_tokens[1],
20174 ffestb_subrargs_.dim_list.dims);
20175 ffestc_R547_finish ();
20177 ffelex_token_kill (ffesta_tokens[1]);
20178 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
20179 return (ffelexHandler) ffesta_zero (t);
20185 bad: /* :::::::::::::::::::: */
20186 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20187 if (ffestb_local_.common.started && !ffesta_is_inhibited ())
20188 ffestc_R547_finish ();
20189 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
20190 ffelex_token_kill (ffesta_tokens[1]);
20191 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20194 /* ffestb_R5477_ -- "COMMON" ... COMMA
20196 return ffestb_R5477_; // to lexer
20198 Make sure we don't have EOS or SEMICOLON. */
20200 static ffelexHandler
20201 ffestb_R5477_ (ffelexToken t)
20203 switch (ffelex_token_type (t))
20205 case FFELEX_typeEOS:
20206 case FFELEX_typeSEMICOLON:
20207 if (!ffesta_is_inhibited ())
20208 ffestc_R547_finish ();
20209 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t);
20210 return (ffelexHandler) ffesta_zero (t);
20213 return (ffelexHandler) ffestb_R5471_ (t);
20217 /* ffestb_R624 -- Parse a NULLIFY statement
20219 return ffestb_R624; // to lexer
20221 Make sure the statement has a valid form for a NULLIFY
20222 statement. If it does, implement the statement.
20225 Rewrite to produce a list of expressions rather than just names; this
20226 eases semantic checking, putting it in expression handling where that
20227 kind of thing gets done anyway, and makes it easier to support more
20228 flexible extensions to Fortran 90 like NULLIFY(FOO%BAR). */
20232 ffestb_R624 (ffelexToken t)
20234 switch (ffelex_token_type (ffesta_tokens[0]))
20236 case FFELEX_typeNAME:
20237 if (ffesta_first_kw != FFESTR_firstNULLIFY)
20238 goto bad_0; /* :::::::::::::::::::: */
20241 case FFELEX_typeNAMES:
20242 if (ffesta_first_kw != FFESTR_firstNULLIFY)
20243 goto bad_0; /* :::::::::::::::::::: */
20244 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlNULLIFY)
20245 goto bad_0; /* :::::::::::::::::::: */
20249 goto bad_0; /* :::::::::::::::::::: */
20252 switch (ffelex_token_type (t))
20254 case FFELEX_typeOPEN_PAREN:
20257 case FFELEX_typeEOS:
20258 case FFELEX_typeSEMICOLON:
20259 case FFELEX_typeCOMMA:
20260 case FFELEX_typeCOLONCOLON:
20261 case FFELEX_typeNAME:
20262 ffesta_confirmed (); /* Error, but clearly intended. */
20263 goto bad_1; /* :::::::::::::::::::: */
20266 goto bad_1; /* :::::::::::::::::::: */
20269 ffestb_local_.R624.exprs = ffestt_exprlist_create ();
20270 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
20271 FFEEXPR_contextNULLIFY,
20272 (ffeexprCallback) ffestb_R6241_);
20274 bad_0: /* :::::::::::::::::::: */
20275 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", ffesta_tokens[0]);
20276 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20278 bad_1: /* :::::::::::::::::::: */
20279 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t);
20280 return (ffelexHandler) ffelex_swallow_tokens (t,
20281 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20284 /* ffestb_R6241_ -- "NULLIFY" OPEN_PAREN expr
20286 return ffestb_R6241_; // to lexer
20288 Make sure the statement has a valid form for a NULLIFY statement. If it
20289 does, implement the statement.
20292 Rewrite to produce a list of expressions rather than just names; this
20293 eases semantic checking, putting it in expression handling where that
20294 kind of thing gets done anyway, and makes it easier to support more
20295 flexible extensions to Fortran 90 like NULLIFY(FOO%BAR). */
20297 static ffelexHandler
20298 ffestb_R6241_ (ffelexToken ft, ffebld expr, ffelexToken t)
20300 switch (ffelex_token_type (t))
20302 case FFELEX_typeCLOSE_PAREN:
20305 ffestt_exprlist_append (ffestb_local_.R624.exprs, expr,
20306 ffelex_token_use (t));
20307 return (ffelexHandler) ffestb_R6242_;
20309 case FFELEX_typeCOMMA:
20312 ffestt_exprlist_append (ffestb_local_.R624.exprs, expr,
20313 ffelex_token_use (t));
20314 return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
20315 FFEEXPR_contextNULLIFY,
20316 (ffeexprCallback) ffestb_R6241_);
20322 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t);
20323 ffestt_exprlist_kill (ffestb_local_.R624.exprs);
20324 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20327 /* ffestb_R6242_ -- "NULLIFY" OPEN_PAREN expr-list CLOSE_PAREN
20329 return ffestb_R6242_; // to lexer
20331 Make sure the statement has a valid form for a NULLIFY statement. If it
20332 does, implement the statement. */
20334 static ffelexHandler
20335 ffestb_R6242_ (ffelexToken t)
20337 switch (ffelex_token_type (t))
20339 case FFELEX_typeEOS:
20340 case FFELEX_typeSEMICOLON:
20341 ffesta_confirmed ();
20342 if (!ffesta_is_inhibited ())
20343 ffestc_R624 (ffestb_local_.R624.exprs);
20344 ffestt_exprlist_kill (ffestb_local_.R624.exprs);
20345 return (ffelexHandler) ffesta_zero (t);
20351 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t);
20352 ffestt_exprlist_kill (ffestb_local_.R624.exprs);
20353 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20357 /* ffestb_R1229 -- Parse a STMTFUNCTION statement
20359 return ffestb_R1229; // to lexer
20361 Make sure the statement has a valid form for a STMTFUNCTION
20362 statement. If it does, implement the statement. */
20365 ffestb_R1229 (ffelexToken t)
20367 switch (ffelex_token_type (ffesta_tokens[0]))
20369 case FFELEX_typeNAME:
20370 case FFELEX_typeNAMES:
20374 goto bad_0; /* :::::::::::::::::::: */
20377 switch (ffelex_token_type (t))
20379 case FFELEX_typeOPEN_PAREN:
20382 case FFELEX_typeEOS:
20383 case FFELEX_typeSEMICOLON:
20384 case FFELEX_typeCOMMA:
20385 case FFELEX_typeCOLONCOLON:
20386 case FFELEX_typeNAME:
20387 ffesta_confirmed (); /* Error, but clearly intended. */
20388 goto bad_1; /* :::::::::::::::::::: */
20391 goto bad_1; /* :::::::::::::::::::: */
20394 ffestb_subrargs_.name_list.args = ffestt_tokenlist_create ();
20395 ffestb_subrargs_.name_list.handler = (ffelexHandler) ffestb_R12291_;
20396 ffestb_subrargs_.name_list.is_subr = FALSE; /* No "*" items in list! */
20397 ffestb_subrargs_.name_list.names = TRUE; /* In case "IF(FOO)CALL
20399 return (ffelexHandler) ffestb_subr_name_list_;
20401 bad_0: /* :::::::::::::::::::: */
20402 bad_1: /* :::::::::::::::::::: */
20403 ffesta_ffebad_2t (FFEBAD_UNREC_STMT, ffesta_tokens[0], t);
20404 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20407 /* ffestb_R12291_ -- "STMTFUNCTION" OPEN_PAREN dummy-name-list CLOSE_PAREN
20409 return ffestb_R12291_; // to lexer
20411 Make sure the statement has a valid form for a STMTFUNCTION statement. If
20412 it does, implement the statement. */
20414 static ffelexHandler
20415 ffestb_R12291_ (ffelexToken t)
20417 ffelex_set_names (FALSE);
20419 if (!ffestb_subrargs_.name_list.ok)
20420 goto bad; /* :::::::::::::::::::: */
20422 switch (ffelex_token_type (t))
20424 case FFELEX_typeEQUALS:
20425 ffesta_confirmed ();
20426 if (!ffesta_is_inhibited ())
20427 ffestc_R1229_start (ffesta_tokens[0],
20428 ffestb_subrargs_.name_list.args,
20429 ffestb_subrargs_.name_list.close_paren);
20430 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
20431 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
20432 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
20433 FFEEXPR_contextSFUNCDEF, (ffeexprCallback) ffestb_R12292_);
20439 bad: /* :::::::::::::::::::: */
20440 ffesta_ffebad_2t (FFEBAD_UNREC_STMT, ffesta_tokens[0], t);
20441 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
20442 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
20443 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20446 /* ffestb_R12292_ -- "STMTFUNCTION" OPEN_PAREN dummy-name-list CLOSE_PAREN
20449 (ffestb_R12292_) // to expression handler
20451 Make sure the statement has a valid form for a STMTFUNCTION statement. If
20452 it does, implement the statement. */
20454 static ffelexHandler
20455 ffestb_R12292_ (ffelexToken ft, ffebld expr, ffelexToken t)
20458 goto bad; /* :::::::::::::::::::: */
20460 switch (ffelex_token_type (t))
20462 case FFELEX_typeEOS:
20463 case FFELEX_typeSEMICOLON:
20464 if (!ffesta_is_inhibited ())
20465 ffestc_R1229_finish (expr, ft);
20466 return (ffelexHandler) ffesta_zero (t);
20472 bad: /* :::::::::::::::::::: */
20473 ffestc_R1229_finish (NULL, NULL);
20474 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "statement-function-definition", t);
20475 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20478 /* ffestb_decl_chartype -- Parse the CHARACTER statement
20480 return ffestb_decl_chartype; // to lexer
20482 Make sure the statement has a valid form for the CHARACTER statement. If
20483 it does, implement the statement. */
20486 ffestb_decl_chartype (ffelexToken t)
20491 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
20492 ffestb_local_.decl.recursive = NULL;
20493 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
20494 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
20496 switch (ffelex_token_type (ffesta_tokens[0]))
20498 case FFELEX_typeNAME:
20499 if (ffesta_first_kw != FFESTR_firstCHRCTR)
20500 goto bad_0; /* :::::::::::::::::::: */
20501 switch (ffelex_token_type (t))
20503 case FFELEX_typeEOS:
20504 case FFELEX_typeSEMICOLON:
20505 ffesta_confirmed (); /* Error, but clearly intended. */
20506 goto bad_1; /* :::::::::::::::::::: */
20509 goto bad_1; /* :::::::::::::::::::: */
20511 case FFELEX_typeCOMMA:
20512 ffesta_confirmed ();
20513 if (!ffesta_is_inhibited ())
20514 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20515 NULL, NULL, NULL, NULL);
20516 return (ffelexHandler) ffestb_decl_attrs_;
20518 case FFELEX_typeCOLONCOLON:
20519 ffestb_local_.decl.coloncolon = TRUE;
20520 ffesta_confirmed ();
20521 if (!ffesta_is_inhibited ())
20522 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20523 NULL, NULL, NULL, NULL);
20524 return (ffelexHandler) ffestb_decl_ents_;
20526 case FFELEX_typeASTERISK:
20527 ffesta_confirmed ();
20528 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_chartype1_;
20529 ffestb_local_.decl.badname = "TYPEDECL";
20530 return (ffelexHandler) ffestb_decl_starlen_;
20532 case FFELEX_typeOPEN_PAREN:
20533 ffestb_local_.decl.kind = NULL;
20534 ffestb_local_.decl.kindt = NULL;
20535 ffestb_local_.decl.len = NULL;
20536 ffestb_local_.decl.lent = NULL;
20537 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20538 ffestb_local_.decl.badname = "_TYPEDECL";
20539 return (ffelexHandler) ffestb_decl_typeparams_;
20541 case FFELEX_typeNAME:
20542 ffesta_confirmed ();
20543 ffestb_local_.decl.kind = NULL;
20544 ffestb_local_.decl.kindt = NULL;
20545 ffestb_local_.decl.len = NULL;
20546 ffestb_local_.decl.lent = NULL;
20547 return (ffelexHandler) ffestb_decl_entsp_ (t);
20550 case FFELEX_typeNAMES:
20551 if (ffesta_first_kw != FFESTR_firstCHRCTR)
20552 goto bad_0; /* :::::::::::::::::::: */
20553 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCHRCTR);
20554 switch (ffelex_token_type (t))
20557 goto bad_1; /* :::::::::::::::::::: */
20559 case FFELEX_typeEOS:
20560 case FFELEX_typeSEMICOLON:
20561 ffesta_confirmed ();
20564 case FFELEX_typeCOMMA:
20565 ffesta_confirmed ();
20568 if (!ffesta_is_inhibited ())
20569 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20570 NULL, NULL, NULL, NULL);
20571 return (ffelexHandler) ffestb_decl_attrs_;
20573 case FFELEX_typeCOLONCOLON:
20574 ffestb_local_.decl.coloncolon = TRUE;
20575 ffesta_confirmed ();
20577 goto bad_i; /* :::::::::::::::::::: */
20578 if (!ffesta_is_inhibited ())
20579 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20580 NULL, NULL, NULL, NULL);
20581 return (ffelexHandler) ffestb_decl_ents_;
20583 case FFELEX_typeASTERISK:
20584 ffesta_confirmed ();
20587 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_chartype1_;
20588 ffestb_local_.decl.badname = "TYPEDECL";
20589 return (ffelexHandler) ffestb_decl_starlen_;
20591 case FFELEX_typeSLASH:
20592 ffesta_confirmed ();
20595 goto bad_1; /* :::::::::::::::::::: */
20597 case FFELEX_typeOPEN_PAREN:
20600 ffestb_local_.decl.kind = NULL;
20601 ffestb_local_.decl.kindt = NULL;
20602 ffestb_local_.decl.len = NULL;
20603 ffestb_local_.decl.lent = NULL;
20604 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20605 ffestb_local_.decl.badname = "TYPEDECL";
20606 return (ffelexHandler) ffestb_decl_typeparams_;
20608 if (!ffesrc_is_name_init (*p))
20609 goto bad_i; /* :::::::::::::::::::: */
20610 ffestb_local_.decl.kind = NULL;
20611 ffestb_local_.decl.kindt = NULL;
20612 ffestb_local_.decl.len = NULL;
20613 ffestb_local_.decl.lent = NULL;
20614 ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0);
20615 return (ffelexHandler) ffestb_decl_entsp_2_ (t);
20618 goto bad_0; /* :::::::::::::::::::: */
20621 bad_0: /* :::::::::::::::::::: */
20622 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
20623 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20625 bad_1: /* :::::::::::::::::::: */
20626 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
20627 return (ffelexHandler) ffelex_swallow_tokens (t,
20628 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20630 bad_i: /* :::::::::::::::::::: */
20631 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t);
20632 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20635 /* ffestb_decl_chartype1_ -- "CHARACTER" ASTERISK char-length
20637 return ffestb_decl_chartype1_; // to lexer
20639 Handle COMMA, COLONCOLON, or anything else. */
20641 static ffelexHandler
20642 ffestb_decl_chartype1_ (ffelexToken t)
20644 ffelex_set_names (FALSE);
20646 switch (ffelex_token_type (t))
20648 case FFELEX_typeCOLONCOLON:
20649 ffestb_local_.decl.coloncolon = TRUE;
20650 /* Fall through. */
20651 case FFELEX_typeCOMMA:
20652 ffesta_confirmed ();
20653 if (!ffesta_is_inhibited ())
20654 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20655 NULL, NULL, ffestb_local_.decl.len, ffestb_local_.decl.lent);
20656 if (ffestb_local_.decl.lent != NULL)
20657 ffelex_token_kill (ffestb_local_.decl.lent);
20658 return (ffelexHandler) ffestb_decl_ents_;
20661 return (ffelexHandler) ffestb_decl_entsp_ (t);
20665 /* ffestb_decl_dbltype -- Parse the DOUBLEPRECISION/DOUBLECOMPLEX statement
20667 return ffestb_decl_dbltype; // to lexer
20669 Make sure the statement has a valid form for the DOUBLEPRECISION/
20670 DOUBLECOMPLEX statement. If it does, implement the statement. */
20673 ffestb_decl_dbltype (ffelexToken t)
20678 ffestb_local_.decl.type = ffestb_args.decl.type;
20679 ffestb_local_.decl.recursive = NULL;
20680 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
20681 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
20683 switch (ffelex_token_type (ffesta_tokens[0]))
20685 case FFELEX_typeNAME:
20686 switch (ffelex_token_type (t))
20688 case FFELEX_typeEOS:
20689 case FFELEX_typeSEMICOLON:
20690 ffesta_confirmed (); /* Error, but clearly intended. */
20691 goto bad_1; /* :::::::::::::::::::: */
20694 goto bad_1; /* :::::::::::::::::::: */
20696 case FFELEX_typeCOMMA:
20697 ffesta_confirmed ();
20698 if (!ffesta_is_inhibited ())
20699 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20700 NULL, NULL, NULL, NULL);
20701 return (ffelexHandler) ffestb_decl_attrs_;
20703 case FFELEX_typeCOLONCOLON:
20704 ffestb_local_.decl.coloncolon = TRUE;
20705 ffesta_confirmed ();
20706 if (!ffesta_is_inhibited ())
20707 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20708 NULL, NULL, NULL, NULL);
20709 return (ffelexHandler) ffestb_decl_ents_;
20711 case FFELEX_typeNAME:
20712 ffesta_confirmed ();
20713 ffestb_local_.decl.kind = NULL;
20714 ffestb_local_.decl.kindt = NULL;
20715 ffestb_local_.decl.len = NULL;
20716 ffestb_local_.decl.lent = NULL;
20717 return (ffelexHandler) ffestb_decl_entsp_ (t);
20720 case FFELEX_typeNAMES:
20721 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.decl.len);
20722 switch (ffelex_token_type (t))
20725 goto bad_1; /* :::::::::::::::::::: */
20727 case FFELEX_typeEOS:
20728 case FFELEX_typeSEMICOLON:
20729 ffesta_confirmed ();
20732 case FFELEX_typeCOMMA:
20733 ffesta_confirmed ();
20736 if (!ffesta_is_inhibited ())
20737 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20738 NULL, NULL, NULL, NULL);
20739 return (ffelexHandler) ffestb_decl_attrs_;
20741 case FFELEX_typeCOLONCOLON:
20742 ffestb_local_.decl.coloncolon = TRUE;
20743 ffesta_confirmed ();
20745 goto bad_i; /* :::::::::::::::::::: */
20746 if (!ffesta_is_inhibited ())
20747 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20748 NULL, NULL, NULL, NULL);
20749 return (ffelexHandler) ffestb_decl_ents_;
20751 case FFELEX_typeSLASH:
20752 ffesta_confirmed ();
20755 goto bad_1; /* :::::::::::::::::::: */
20757 case FFELEX_typeOPEN_PAREN:
20760 goto bad_1; /* :::::::::::::::::::: */
20762 if (!ffesrc_is_name_init (*p))
20763 goto bad_i; /* :::::::::::::::::::: */
20764 ffestb_local_.decl.kind = NULL;
20765 ffestb_local_.decl.kindt = NULL;
20766 ffestb_local_.decl.len = NULL;
20767 ffestb_local_.decl.lent = NULL;
20768 ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0);
20769 return (ffelexHandler) ffestb_decl_entsp_2_ (t);
20772 goto bad_0; /* :::::::::::::::::::: */
20775 bad_0: /* :::::::::::::::::::: */
20776 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
20777 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20779 bad_1: /* :::::::::::::::::::: */
20780 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
20781 return (ffelexHandler) ffelex_swallow_tokens (t,
20782 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20784 bad_i: /* :::::::::::::::::::: */
20785 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t);
20786 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20789 /* ffestb_decl_double -- Parse the DOUBLE PRECISION/DOUBLE COMPLEX statement
20791 return ffestb_decl_double; // to lexer
20793 Make sure the statement has a valid form for the DOUBLE PRECISION/
20794 DOUBLE COMPLEX statement. If it does, implement the statement. */
20797 ffestb_decl_double (ffelexToken t)
20799 ffestb_local_.decl.recursive = NULL;
20800 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
20801 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
20803 switch (ffelex_token_type (ffesta_tokens[0]))
20805 case FFELEX_typeNAME:
20806 if (ffesta_first_kw != FFESTR_firstDBL)
20807 goto bad_0; /* :::::::::::::::::::: */
20808 switch (ffelex_token_type (t))
20810 case FFELEX_typeEOS:
20811 case FFELEX_typeSEMICOLON:
20812 case FFELEX_typeCOMMA:
20813 case FFELEX_typeCOLONCOLON:
20814 ffesta_confirmed (); /* Error, but clearly intended. */
20815 goto bad_1; /* :::::::::::::::::::: */
20818 goto bad_1; /* :::::::::::::::::::: */
20820 case FFELEX_typeNAME:
20821 ffesta_confirmed ();
20822 switch (ffestr_second (t))
20824 case FFESTR_secondCOMPLEX:
20825 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
20828 case FFESTR_secondPRECISION:
20829 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
20833 goto bad_1; /* :::::::::::::::::::: */
20835 ffestb_local_.decl.kind = NULL;
20836 ffestb_local_.decl.kindt = NULL;
20837 ffestb_local_.decl.len = NULL;
20838 ffestb_local_.decl.lent = NULL;
20839 return (ffelexHandler) ffestb_decl_attrsp_;
20843 goto bad_0; /* :::::::::::::::::::: */
20846 bad_0: /* :::::::::::::::::::: */
20847 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
20848 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20850 bad_1: /* :::::::::::::::::::: */
20851 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
20852 return (ffelexHandler) ffelex_swallow_tokens (t,
20853 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20856 /* ffestb_decl_gentype -- Parse the INTEGER/REAL/COMPLEX/LOGICAL statement
20858 return ffestb_decl_gentype; // to lexer
20860 Make sure the statement has a valid form for the INTEGER/REAL/COMPLEX/
20861 LOGICAL statement. If it does, implement the statement. */
20864 ffestb_decl_gentype (ffelexToken t)
20869 ffestb_local_.decl.type = ffestb_args.decl.type;
20870 ffestb_local_.decl.recursive = NULL;
20871 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
20872 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
20874 switch (ffelex_token_type (ffesta_tokens[0]))
20876 case FFELEX_typeNAME:
20877 switch (ffelex_token_type (t))
20879 case FFELEX_typeEOS:
20880 case FFELEX_typeSEMICOLON:
20881 ffesta_confirmed (); /* Error, but clearly intended. */
20882 goto bad_1; /* :::::::::::::::::::: */
20885 goto bad_1; /* :::::::::::::::::::: */
20887 case FFELEX_typeCOMMA:
20888 ffesta_confirmed ();
20889 if (!ffesta_is_inhibited ())
20890 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20891 NULL, NULL, NULL, NULL);
20892 return (ffelexHandler) ffestb_decl_attrs_;
20894 case FFELEX_typeCOLONCOLON:
20895 ffestb_local_.decl.coloncolon = TRUE;
20896 ffesta_confirmed ();
20897 if (!ffesta_is_inhibited ())
20898 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20899 NULL, NULL, NULL, NULL);
20900 return (ffelexHandler) ffestb_decl_ents_;
20902 case FFELEX_typeASTERISK:
20903 ffesta_confirmed ();
20904 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20905 ffestb_local_.decl.badname = "TYPEDECL";
20906 return (ffelexHandler) ffestb_decl_starkind_;
20908 case FFELEX_typeOPEN_PAREN:
20909 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20910 ffestb_local_.decl.badname = "TYPEDECL";
20911 return (ffelexHandler) ffestb_decl_kindparam_;
20913 case FFELEX_typeNAME:
20914 ffesta_confirmed ();
20915 ffestb_local_.decl.kind = NULL;
20916 ffestb_local_.decl.kindt = NULL;
20917 ffestb_local_.decl.len = NULL;
20918 ffestb_local_.decl.lent = NULL;
20919 return (ffelexHandler) ffestb_decl_entsp_ (t);
20922 case FFELEX_typeNAMES:
20923 p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.decl.len);
20924 switch (ffelex_token_type (t))
20927 goto bad_1; /* :::::::::::::::::::: */
20929 case FFELEX_typeEOS:
20930 case FFELEX_typeSEMICOLON:
20931 ffesta_confirmed ();
20934 case FFELEX_typeCOMMA:
20935 ffesta_confirmed ();
20938 if (!ffesta_is_inhibited ())
20939 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20940 NULL, NULL, NULL, NULL);
20941 return (ffelexHandler) ffestb_decl_attrs_;
20943 case FFELEX_typeCOLONCOLON:
20944 ffestb_local_.decl.coloncolon = TRUE;
20945 ffesta_confirmed ();
20947 goto bad_i; /* :::::::::::::::::::: */
20948 if (!ffesta_is_inhibited ())
20949 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
20950 NULL, NULL, NULL, NULL);
20951 return (ffelexHandler) ffestb_decl_ents_;
20953 case FFELEX_typeSLASH:
20954 ffesta_confirmed ();
20957 goto bad_1; /* :::::::::::::::::::: */
20959 case FFELEX_typeASTERISK:
20960 ffesta_confirmed ();
20963 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20964 ffestb_local_.decl.badname = "TYPEDECL";
20965 return (ffelexHandler) ffestb_decl_starkind_;
20967 case FFELEX_typeOPEN_PAREN:
20970 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
20971 ffestb_local_.decl.badname = "TYPEDECL";
20972 return (ffelexHandler) ffestb_decl_kindparam_;
20974 if (!ffesrc_is_name_init (*p))
20975 goto bad_i; /* :::::::::::::::::::: */
20976 ffestb_local_.decl.kind = NULL;
20977 ffestb_local_.decl.kindt = NULL;
20978 ffestb_local_.decl.len = NULL;
20979 ffestb_local_.decl.lent = NULL;
20980 ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0);
20981 return (ffelexHandler) ffestb_decl_entsp_2_ (t);
20984 goto bad_0; /* :::::::::::::::::::: */
20987 bad_0: /* :::::::::::::::::::: */
20988 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
20989 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
20991 bad_1: /* :::::::::::::::::::: */
20992 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
20993 return (ffelexHandler) ffelex_swallow_tokens (t,
20994 (ffelexHandler) ffesta_zero); /* Invalid second token. */
20996 bad_i: /* :::::::::::::::::::: */
20997 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t);
20998 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21001 /* ffestb_decl_recursive -- Parse the RECURSIVE FUNCTION statement
21003 return ffestb_decl_recursive; // to lexer
21005 Make sure the statement has a valid form for the RECURSIVE FUNCTION
21006 statement. If it does, implement the statement. */
21010 ffestb_decl_recursive (ffelexToken t)
21016 ffelexHandler next;
21019 switch (ffelex_token_type (ffesta_tokens[0]))
21021 case FFELEX_typeNAME:
21022 if (ffesta_first_kw != FFESTR_firstRECURSIVE)
21023 goto bad_0; /* :::::::::::::::::::: */
21024 switch (ffelex_token_type (t))
21026 case FFELEX_typeEOS:
21027 case FFELEX_typeSEMICOLON:
21028 case FFELEX_typeCOMMA:
21029 case FFELEX_typeCOLONCOLON:
21030 ffesta_confirmed (); /* Error, but clearly intended. */
21031 goto bad_1; /* :::::::::::::::::::: */
21034 goto bad_1; /* :::::::::::::::::::: */
21036 case FFELEX_typeNAME:
21039 ffesta_confirmed ();
21040 ffestb_local_.decl.recursive = ffelex_token_use (ffesta_tokens[0]);
21041 switch (ffesta_second_kw)
21043 case FFESTR_secondINTEGER:
21044 ffestb_local_.decl.type = FFESTP_typeINTEGER;
21045 return (ffelexHandler) ffestb_decl_recursive1_;
21047 case FFESTR_secondBYTE:
21048 ffestb_local_.decl.type = FFESTP_typeBYTE;
21049 return (ffelexHandler) ffestb_decl_recursive1_;
21051 case FFESTR_secondWORD:
21052 ffestb_local_.decl.type = FFESTP_typeWORD;
21053 return (ffelexHandler) ffestb_decl_recursive1_;
21055 case FFESTR_secondREAL:
21056 ffestb_local_.decl.type = FFESTP_typeREAL;
21057 return (ffelexHandler) ffestb_decl_recursive1_;
21059 case FFESTR_secondCOMPLEX:
21060 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
21061 return (ffelexHandler) ffestb_decl_recursive1_;
21063 case FFESTR_secondLOGICAL:
21064 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
21065 return (ffelexHandler) ffestb_decl_recursive1_;
21067 case FFESTR_secondCHARACTER:
21068 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
21069 return (ffelexHandler) ffestb_decl_recursive1_;
21071 case FFESTR_secondDOUBLE:
21072 return (ffelexHandler) ffestb_decl_recursive2_;
21074 case FFESTR_secondDOUBLEPRECISION:
21075 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
21076 ffestb_local_.decl.kind = NULL;
21077 ffestb_local_.decl.kindt = NULL;
21078 ffestb_local_.decl.len = NULL;
21079 ffestb_local_.decl.lent = NULL;
21080 return (ffelexHandler) ffestb_decl_func_;
21082 case FFESTR_secondDOUBLECOMPLEX:
21083 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
21084 ffestb_local_.decl.kind = NULL;
21085 ffestb_local_.decl.kindt = NULL;
21086 ffestb_local_.decl.len = NULL;
21087 ffestb_local_.decl.lent = NULL;
21088 return (ffelexHandler) ffestb_decl_func_;
21090 case FFESTR_secondTYPE:
21091 ffestb_local_.decl.type = FFESTP_typeTYPE;
21092 return (ffelexHandler) ffestb_decl_recursive3_;
21094 case FFESTR_secondFUNCTION:
21095 ffestb_local_.dummy.first_kw = FFESTR_firstFUNCTION;
21096 ffestb_local_.dummy.badname = "FUNCTION";
21097 ffestb_local_.dummy.is_subr = FALSE;
21098 return (ffelexHandler) ffestb_decl_recursive4_;
21100 case FFESTR_secondSUBROUTINE:
21101 ffestb_local_.dummy.first_kw = FFESTR_firstSUBROUTINE;
21102 ffestb_local_.dummy.badname = "SUBROUTINE";
21103 ffestb_local_.dummy.is_subr = TRUE;
21104 return (ffelexHandler) ffestb_decl_recursive4_;
21107 ffelex_token_kill (ffestb_local_.decl.recursive);
21108 goto bad_1; /* :::::::::::::::::::: */
21111 case FFELEX_typeNAMES:
21112 if (ffesta_first_kw != FFESTR_firstRECURSIVE)
21113 goto bad_0; /* :::::::::::::::::::: */
21114 switch (ffelex_token_type (t))
21116 case FFELEX_typeCOMMA:
21117 case FFELEX_typeCOLONCOLON:
21118 case FFELEX_typeASTERISK:
21119 case FFELEX_typeSEMICOLON:
21120 case FFELEX_typeEOS:
21121 ffesta_confirmed ();
21127 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlRECURSIVE);
21128 if (!ffesrc_is_name_init (*p))
21129 goto bad_0; /* :::::::::::::::::::: */
21130 ffestb_local_.decl.recursive
21131 = ffelex_token_name_from_names (ffesta_tokens[0], 0,
21132 FFESTR_firstlRECURSIVE);
21133 nt = ffelex_token_names_from_names (ffesta_tokens[0],
21134 FFESTR_firstlRECURSIVE, 0);
21135 switch (ffestr_first (nt))
21137 case FFESTR_firstINTGR:
21138 p = ffelex_token_text (nt) + (i = FFESTR_firstlINTGR);
21139 ffestb_local_.decl.type = FFESTP_typeINTEGER;
21141 goto typefunc; /* :::::::::::::::::::: */
21143 case FFESTR_firstBYTE:
21144 p = ffelex_token_text (nt) + (i = FFESTR_firstlBYTE);
21145 ffestb_local_.decl.type = FFESTP_typeBYTE;
21147 goto typefunc; /* :::::::::::::::::::: */
21149 case FFESTR_firstWORD:
21150 p = ffelex_token_text (nt) + (i = FFESTR_firstlWORD);
21151 ffestb_local_.decl.type = FFESTP_typeWORD;
21153 goto typefunc; /* :::::::::::::::::::: */
21155 case FFESTR_firstREAL:
21156 p = ffelex_token_text (nt) + (i = FFESTR_firstlREAL);
21157 ffestb_local_.decl.type = FFESTP_typeREAL;
21159 goto typefunc; /* :::::::::::::::::::: */
21161 case FFESTR_firstCMPLX:
21162 p = ffelex_token_text (nt) + (i = FFESTR_firstlCMPLX);
21163 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
21165 goto typefunc; /* :::::::::::::::::::: */
21167 case FFESTR_firstLGCL:
21168 p = ffelex_token_text (nt) + (i = FFESTR_firstlLGCL);
21169 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
21171 goto typefunc; /* :::::::::::::::::::: */
21173 case FFESTR_firstCHRCTR:
21174 p = ffelex_token_text (nt) + (i = FFESTR_firstlCHRCTR);
21175 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
21177 goto typefunc; /* :::::::::::::::::::: */
21179 case FFESTR_firstDBLPRCSN:
21180 p = ffelex_token_text (nt) + (i = FFESTR_firstlDBLPRCSN);
21181 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
21183 goto typefunc; /* :::::::::::::::::::: */
21185 case FFESTR_firstDBLCMPLX:
21186 p = ffelex_token_text (nt) + (i = FFESTR_firstlDBLCMPLX);
21187 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
21189 goto typefunc; /* :::::::::::::::::::: */
21191 case FFESTR_firstTYPE:
21192 p = ffelex_token_text (nt) + (i = FFESTR_firstlTYPE);
21193 ffestb_local_.decl.type = FFESTP_typeTYPE;
21194 next = (ffelexHandler) ffestb_decl_recursive3_;
21197 case FFESTR_firstFUNCTION:
21198 p = ffelex_token_text (nt) + (i = FFESTR_firstlFUNCTION);
21199 ffestb_local_.dummy.first_kw = FFESTR_firstFUNCTION;
21200 ffestb_local_.dummy.badname = "FUNCTION";
21201 ffestb_local_.dummy.is_subr = FALSE;
21202 next = (ffelexHandler) ffestb_decl_recursive4_;
21205 case FFESTR_firstSUBROUTINE:
21206 p = ffelex_token_text (nt) + (i = FFESTR_firstlSUBROUTINE);
21207 ffestb_local_.dummy.first_kw = FFESTR_firstSUBROUTINE;
21208 ffestb_local_.dummy.badname = "SUBROUTINE";
21209 ffestb_local_.dummy.is_subr = TRUE;
21210 next = (ffelexHandler) ffestb_decl_recursive4_;
21214 ffelex_token_kill (ffestb_local_.decl.recursive);
21215 ffelex_token_kill (nt);
21216 goto bad_1; /* :::::::::::::::::::: */
21220 ffelex_token_kill (nt);
21221 return (ffelexHandler) (*next) (t);
21223 if (!ffesrc_is_name_init (*p))
21224 goto bad_i; /* :::::::::::::::::::: */
21225 ot = ffelex_token_name_from_names (nt, i, 0);
21226 ffelex_token_kill (nt);
21227 next = (ffelexHandler) (*next) (ot);
21228 ffelex_token_kill (ot);
21229 return (ffelexHandler) (*next) (t);
21232 goto bad_0; /* :::::::::::::::::::: */
21235 typefunc: /* :::::::::::::::::::: */
21238 ffelex_token_kill (nt);
21239 if (needfunc) /* DOUBLE PRECISION or DOUBLE COMPLEX? */
21241 ffelex_token_kill (ffestb_local_.decl.recursive);
21242 goto bad_1; /* :::::::::::::::::::: */
21244 return (ffelexHandler) ffestb_decl_recursive1_ (t);
21246 if (!ffesrc_is_name_init (*p))
21247 goto bad_i; /* :::::::::::::::::::: */
21248 ot = ffelex_token_names_from_names (nt, i, 0);
21249 ffelex_token_kill (nt);
21250 if (ffestr_first (ot) != FFESTR_firstFUNCTION)
21251 goto bad_o; /* :::::::::::::::::::: */
21252 p = ffelex_token_text (ot) + (i = FFESTR_firstlFUNCTION);
21253 if (!ffesrc_is_name_init (*p))
21254 goto bad_i; /* :::::::::::::::::::: */
21255 ffesta_tokens[1] = ffelex_token_name_from_names (ot, i, 0);
21256 ffelex_token_kill (ot);
21257 ffestb_local_.decl.kind = NULL;
21258 ffestb_local_.decl.kindt = NULL;
21259 ffestb_local_.decl.len = NULL;
21260 ffestb_local_.decl.lent = NULL;
21261 return (ffelexHandler) ffestb_decl_funcname_1_ (t);
21263 bad_0: /* :::::::::::::::::::: */
21264 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ffesta_tokens[0]);
21265 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21267 bad_1: /* :::::::::::::::::::: */
21268 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21269 return (ffelexHandler) ffelex_swallow_tokens (t,
21270 (ffelexHandler) ffesta_zero); /* Invalid second token. */
21272 bad_i: /* :::::::::::::::::::: */
21273 ffelex_token_kill (ffestb_local_.decl.recursive);
21274 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", nt, i, t);
21275 ffelex_token_kill (nt);
21276 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21278 bad_o: /* :::::::::::::::::::: */
21279 ffelex_token_kill (ffestb_local_.decl.recursive);
21280 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ot);
21281 ffelex_token_kill (ot);
21282 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21285 /* ffestb_decl_recursive1_ -- "RECURSIVE" generic-type
21287 return ffestb_decl_recursive1_; // to lexer
21289 Handle ASTERISK, OPEN_PAREN, or NAME. */
21291 static ffelexHandler
21292 ffestb_decl_recursive1_ (ffelexToken t)
21294 switch (ffelex_token_type (t))
21296 case FFELEX_typeASTERISK:
21297 ffesta_confirmed ();
21298 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_;
21299 ffestb_local_.decl.badname = "TYPEFUNC";
21300 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
21301 return (ffelexHandler) ffestb_decl_starlen_;
21302 return (ffelexHandler) ffestb_decl_starkind_;
21304 case FFELEX_typeOPEN_PAREN:
21305 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_;
21306 ffestb_local_.decl.badname = "TYPEFUNC";
21307 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
21309 ffestb_local_.decl.kind = NULL;
21310 ffestb_local_.decl.kindt = NULL;
21311 ffestb_local_.decl.len = NULL;
21312 ffestb_local_.decl.lent = NULL;
21313 return (ffelexHandler) ffestb_decl_typeparams_;
21315 return (ffelexHandler) ffestb_decl_kindparam_;
21317 case FFELEX_typeNAME:
21318 ffestb_local_.decl.kind = NULL;
21319 ffestb_local_.decl.kindt = NULL;
21320 ffestb_local_.decl.len = NULL;
21321 ffestb_local_.decl.lent = NULL;
21322 return (ffelexHandler) ffestb_decl_func_ (t);
21328 if (ffestb_local_.decl.recursive != NULL)
21329 ffelex_token_kill (ffestb_local_.decl.recursive);
21330 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21331 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21334 /* ffestb_decl_recursive2_ -- "RECURSIVE" "DOUBLE"
21336 return ffestb_decl_recursive2_; // to lexer
21340 static ffelexHandler
21341 ffestb_decl_recursive2_ (ffelexToken t)
21343 switch (ffelex_token_type (t))
21345 case FFELEX_typeNAME:
21346 switch (ffestr_second (t))
21348 case FFESTR_secondPRECISION:
21349 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
21352 case FFESTR_secondCOMPLEX:
21353 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
21357 goto bad; /* :::::::::::::::::::: */
21359 ffestb_local_.decl.kind = NULL;
21360 ffestb_local_.decl.kindt = NULL;
21361 ffestb_local_.decl.len = NULL;
21362 ffestb_local_.decl.lent = NULL;
21363 return (ffelexHandler) ffestb_decl_func_;
21369 bad: /* :::::::::::::::::::: */
21370 if (ffestb_local_.decl.recursive != NULL)
21371 ffelex_token_kill (ffestb_local_.decl.recursive);
21372 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21373 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21376 /* ffestb_decl_recursive3_ -- "RECURSIVE" "TYPE"
21378 return ffestb_decl_recursive3_; // to lexer
21380 Handle OPEN_PAREN. */
21382 static ffelexHandler
21383 ffestb_decl_recursive3_ (ffelexToken t)
21385 switch (ffelex_token_type (t))
21387 case FFELEX_typeOPEN_PAREN:
21388 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_;
21389 ffestb_local_.decl.badname = "TYPEFUNC";
21390 return (ffelexHandler) ffestb_decl_typetype1_;
21396 if (ffestb_local_.decl.recursive != NULL)
21397 ffelex_token_kill (ffestb_local_.decl.recursive);
21398 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21399 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21402 /* ffestb_decl_recursive4_ -- "RECURSIVE" "FUNCTION/SUBROUTINE"
21404 return ffestb_decl_recursive4_; // to lexer
21406 Handle OPEN_PAREN. */
21408 static ffelexHandler
21409 ffestb_decl_recursive4_ (ffelexToken t)
21411 switch (ffelex_token_type (t))
21413 case FFELEX_typeNAME:
21414 ffesta_tokens[1] = ffelex_token_use (t);
21415 return (ffelexHandler) ffestb_dummy1_;
21421 if (ffestb_local_.decl.recursive != NULL)
21422 ffelex_token_kill (ffestb_local_.decl.recursive);
21423 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
21424 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21428 /* ffestb_decl_typetype -- Parse the R426/R501/R1219 TYPE statement
21430 return ffestb_decl_typetype; // to lexer
21432 Make sure the statement has a valid form for the TYPE statement. If it
21433 does, implement the statement. */
21437 ffestb_decl_typetype (ffelexToken t)
21439 switch (ffelex_token_type (ffesta_tokens[0]))
21441 case FFELEX_typeNAME:
21442 if (ffesta_first_kw != FFESTR_firstTYPE)
21443 goto bad_0; /* :::::::::::::::::::: */
21446 case FFELEX_typeNAMES:
21447 if (ffesta_first_kw != FFESTR_firstTYPE)
21448 goto bad_0; /* :::::::::::::::::::: */
21449 if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlTYPE)
21450 goto bad_0; /* :::::::::::::::::::: */
21454 goto bad_0; /* :::::::::::::::::::: */
21457 switch (ffelex_token_type (t))
21459 case FFELEX_typeOPEN_PAREN:
21462 case FFELEX_typeEOS:
21463 case FFELEX_typeSEMICOLON:
21464 case FFELEX_typeCOLONCOLON:/* Not COMMA: R424 "TYPE,PUBLIC::A". */
21465 ffesta_confirmed (); /* Error, but clearly intended. */
21466 goto bad_1; /* :::::::::::::::::::: */
21469 goto bad_1; /* :::::::::::::::::::: */
21472 ffestb_local_.decl.recursive = NULL;
21473 ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */
21474 ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */
21476 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_;
21477 ffestb_local_.decl.badname = "type-declaration";
21478 return (ffelexHandler) ffestb_decl_typetype1_;
21480 bad_0: /* :::::::::::::::::::: */
21481 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]);
21482 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21484 bad_1: /* :::::::::::::::::::: */
21485 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21486 return (ffelexHandler) ffelex_swallow_tokens (t,
21487 (ffelexHandler) ffesta_zero); /* Invalid second token. */
21491 /* ffestb_decl_attrs_ -- "type" [type parameters] COMMA
21493 return ffestb_decl_attrs_; // to lexer
21495 Handle NAME of an attribute. */
21497 static ffelexHandler
21498 ffestb_decl_attrs_ (ffelexToken t)
21500 switch (ffelex_token_type (t))
21502 case FFELEX_typeNAME:
21503 switch (ffestr_first (t))
21506 case FFESTR_firstALLOCATABLE:
21507 if (!ffesta_is_inhibited ())
21508 ffestc_decl_attrib (FFESTP_attribALLOCATABLE, t,
21509 FFESTR_otherNone, NULL);
21510 return (ffelexHandler) ffestb_decl_attrs_7_;
21513 case FFESTR_firstDIMENSION:
21514 ffesta_tokens[1] = ffelex_token_use (t);
21515 return (ffelexHandler) ffestb_decl_attrs_1_;
21517 case FFESTR_firstEXTERNAL:
21518 if (!ffesta_is_inhibited ())
21519 ffestc_decl_attrib (FFESTP_attribEXTERNAL, t,
21520 FFESTR_otherNone, NULL);
21521 return (ffelexHandler) ffestb_decl_attrs_7_;
21524 case FFESTR_firstINTENT:
21525 ffesta_tokens[1] = ffelex_token_use (t);
21526 return (ffelexHandler) ffestb_decl_attrs_3_;
21529 case FFESTR_firstINTRINSIC:
21530 if (!ffesta_is_inhibited ())
21531 ffestc_decl_attrib (FFESTP_attribINTRINSIC, t,
21532 FFESTR_otherNone, NULL);
21533 return (ffelexHandler) ffestb_decl_attrs_7_;
21536 case FFESTR_firstOPTIONAL:
21537 if (!ffesta_is_inhibited ())
21538 ffestc_decl_attrib (FFESTP_attribOPTIONAL, t,
21539 FFESTR_otherNone, NULL);
21540 return (ffelexHandler) ffestb_decl_attrs_7_;
21543 case FFESTR_firstPARAMETER:
21544 ffestb_local_.decl.parameter = TRUE;
21545 if (!ffesta_is_inhibited ())
21546 ffestc_decl_attrib (FFESTP_attribPARAMETER, t,
21547 FFESTR_otherNone, NULL);
21548 return (ffelexHandler) ffestb_decl_attrs_7_;
21551 case FFESTR_firstPOINTER:
21552 if (!ffesta_is_inhibited ())
21553 ffestc_decl_attrib (FFESTP_attribPOINTER, t,
21554 FFESTR_otherNone, NULL);
21555 return (ffelexHandler) ffestb_decl_attrs_7_;
21559 case FFESTR_firstPRIVATE:
21560 if (!ffesta_is_inhibited ())
21561 ffestc_decl_attrib (FFESTP_attribPRIVATE, t,
21562 FFESTR_otherNone, NULL);
21563 return (ffelexHandler) ffestb_decl_attrs_7_;
21565 case FFESTR_firstPUBLIC:
21566 if (!ffesta_is_inhibited ())
21567 ffestc_decl_attrib (FFESTP_attribPUBLIC, t,
21568 FFESTR_otherNone, NULL);
21569 return (ffelexHandler) ffestb_decl_attrs_7_;
21572 case FFESTR_firstSAVE:
21573 if (!ffesta_is_inhibited ())
21574 ffestc_decl_attrib (FFESTP_attribSAVE, t,
21575 FFESTR_otherNone, NULL);
21576 return (ffelexHandler) ffestb_decl_attrs_7_;
21579 case FFESTR_firstTARGET:
21580 if (!ffesta_is_inhibited ())
21581 ffestc_decl_attrib (FFESTP_attribTARGET, t,
21582 FFESTR_otherNone, NULL);
21583 return (ffelexHandler) ffestb_decl_attrs_7_;
21587 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21588 return (ffelexHandler) ffestb_decl_attrs_7_;
21596 if (!ffesta_is_inhibited ())
21597 ffestc_decl_finish ();
21598 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21599 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21602 /* ffestb_decl_attrs_1_ -- "type" [type parameters] ",DIMENSION"
21604 return ffestb_decl_attrs_1_; // to lexer
21606 Handle OPEN_PAREN. */
21608 static ffelexHandler
21609 ffestb_decl_attrs_1_ (ffelexToken t)
21611 switch (ffelex_token_type (t))
21613 case FFELEX_typeOPEN_PAREN:
21614 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
21615 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_decl_attrs_2_;
21616 ffestb_subrargs_.dim_list.pool = ffesta_scratch_pool;
21617 ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid
21618 ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON;
21619 #ifdef FFECOM_dimensionsMAX
21620 ffestb_subrargs_.dim_list.ndims = 0;
21622 return (ffelexHandler) ffeexpr_rhs (ffesta_scratch_pool,
21623 ffestb_subrargs_.dim_list.ctx,
21624 (ffeexprCallback) ffestb_subr_dimlist_);
21626 case FFELEX_typeCOMMA:
21627 case FFELEX_typeCOLONCOLON:
21628 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, ffesta_tokens[1]);
21629 ffelex_token_kill (ffesta_tokens[1]);
21630 return (ffelexHandler) ffestb_decl_attrs_7_ (t);
21636 if (!ffesta_is_inhibited ())
21637 ffestc_decl_finish ();
21638 ffelex_token_kill (ffesta_tokens[1]);
21639 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21640 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21643 /* ffestb_decl_attrs_2_ -- "type" [type parameters] ",DIMENSION" OPEN_PAREN
21644 dimlist CLOSE_PAREN
21646 return ffestb_decl_attrs_2_; // to lexer
21648 Handle COMMA or COLONCOLON. */
21650 static ffelexHandler
21651 ffestb_decl_attrs_2_ (ffelexToken t)
21653 if (!ffestb_subrargs_.dim_list.ok)
21654 goto bad; /* :::::::::::::::::::: */
21656 switch (ffelex_token_type (t))
21658 case FFELEX_typeCOMMA:
21659 case FFELEX_typeCOLONCOLON:
21660 if (!ffesta_is_inhibited ())
21661 ffestc_decl_attrib (FFESTP_attribDIMENSION, ffesta_tokens[1],
21662 FFESTR_otherNone, ffestb_subrargs_.dim_list.dims);
21663 ffelex_token_kill (ffesta_tokens[1]);
21664 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
21665 return (ffelexHandler) ffestb_decl_attrs_7_ (t);
21671 bad: /* :::::::::::::::::::: */
21672 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21673 if (!ffesta_is_inhibited ())
21674 ffestc_decl_finish ();
21675 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
21676 ffelex_token_kill (ffesta_tokens[1]);
21677 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21680 /* ffestb_decl_attrs_3_ -- "type" [type parameters] ",INTENT"
21682 return ffestb_decl_attrs_3_; // to lexer
21684 Handle OPEN_PAREN. */
21687 static ffelexHandler
21688 ffestb_decl_attrs_3_ (ffelexToken t)
21690 switch (ffelex_token_type (t))
21692 case FFELEX_typeOPEN_PAREN:
21693 return (ffelexHandler) ffestb_decl_attrs_4_;
21695 case FFELEX_typeCOMMA:
21696 case FFELEX_typeCOLONCOLON:
21697 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, ffesta_tokens[1]);
21698 ffelex_token_kill (ffesta_tokens[1]);
21699 return (ffelexHandler) ffestb_decl_attrs_7_ (t);
21705 if (!ffesta_is_inhibited ())
21706 ffestc_decl_finish ();
21707 ffelex_token_kill (ffesta_tokens[1]);
21708 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21709 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21712 /* ffestb_decl_attrs_4_ -- "type" [type parameters] ",INTENT" OPEN_PAREN
21714 return ffestb_decl_attrs_4_; // to lexer
21718 static ffelexHandler
21719 ffestb_decl_attrs_4_ (ffelexToken t)
21721 switch (ffelex_token_type (t))
21723 case FFELEX_typeNAME:
21724 ffestb_local_.decl.kw = ffestr_other (t);
21725 switch (ffestb_local_.decl.kw)
21727 case FFESTR_otherIN:
21728 return (ffelexHandler) ffestb_decl_attrs_5_;
21730 case FFESTR_otherINOUT:
21731 return (ffelexHandler) ffestb_decl_attrs_6_;
21733 case FFESTR_otherOUT:
21734 return (ffelexHandler) ffestb_decl_attrs_6_;
21737 ffestb_local_.decl.kw = FFESTR_otherNone;
21738 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21739 return (ffelexHandler) ffestb_decl_attrs_5_;
21747 if (!ffesta_is_inhibited ())
21748 ffestc_decl_finish ();
21749 ffelex_token_kill (ffesta_tokens[1]);
21750 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21751 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21754 /* ffestb_decl_attrs_5_ -- "type" [type parameters] ",INTENT" OPEN_PAREN "IN"
21756 return ffestb_decl_attrs_5_; // to lexer
21758 Handle NAME or CLOSE_PAREN. */
21760 static ffelexHandler
21761 ffestb_decl_attrs_5_ (ffelexToken t)
21763 switch (ffelex_token_type (t))
21765 case FFELEX_typeNAME:
21766 switch (ffestr_other (t))
21768 case FFESTR_otherOUT:
21769 if (ffestb_local_.decl.kw != FFESTR_otherNone)
21770 ffestb_local_.decl.kw = FFESTR_otherINOUT;
21771 return (ffelexHandler) ffestb_decl_attrs_6_;
21774 if (ffestb_local_.decl.kw != FFESTR_otherNone)
21776 ffestb_local_.decl.kw = FFESTR_otherNone;
21777 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t);
21779 return (ffelexHandler) ffestb_decl_attrs_5_;
21783 case FFELEX_typeCLOSE_PAREN:
21784 return (ffelexHandler) ffestb_decl_attrs_6_ (t);
21790 if (!ffesta_is_inhibited ())
21791 ffestc_decl_finish ();
21792 ffelex_token_kill (ffesta_tokens[1]);
21793 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21794 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21797 /* ffestb_decl_attrs_6_ -- "type" [type parameters] ",INTENT" OPEN_PAREN "IN"
21800 return ffestb_decl_attrs_6_; // to lexer
21802 Handle CLOSE_PAREN. */
21804 static ffelexHandler
21805 ffestb_decl_attrs_6_ (ffelexToken t)
21807 switch (ffelex_token_type (t))
21809 case FFELEX_typeCLOSE_PAREN:
21810 if ((ffestb_local_.decl.kw != FFESTR_otherNone)
21811 && !ffesta_is_inhibited ())
21812 ffestc_decl_attrib (FFESTP_attribINTENT, ffesta_tokens[1],
21813 ffestb_local_.decl.kw, NULL);
21814 ffelex_token_kill (ffesta_tokens[1]);
21815 return (ffelexHandler) ffestb_decl_attrs_7_;
21821 if (!ffesta_is_inhibited ())
21822 ffestc_decl_finish ();
21823 ffelex_token_kill (ffesta_tokens[1]);
21824 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21825 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21829 /* ffestb_decl_attrs_7_ -- "type" [type parameters] attribute
21831 return ffestb_decl_attrs_7_; // to lexer
21833 Handle COMMA (another attribute) or COLONCOLON (entities). */
21835 static ffelexHandler
21836 ffestb_decl_attrs_7_ (ffelexToken t)
21838 switch (ffelex_token_type (t))
21840 case FFELEX_typeCOMMA:
21841 return (ffelexHandler) ffestb_decl_attrs_;
21843 case FFELEX_typeCOLONCOLON:
21844 ffestb_local_.decl.coloncolon = TRUE;
21845 return (ffelexHandler) ffestb_decl_ents_;
21851 if (!ffesta_is_inhibited ())
21852 ffestc_decl_finish ();
21853 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21854 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21857 /* ffestb_decl_attrsp_ -- "type" [type parameters]
21859 return ffestb_decl_attrsp_; // to lexer
21861 Handle COMMA (meaning we have attributes), COLONCOLON (meaning we have
21862 no attributes but entities), or go to entsp to see about functions or
21865 static ffelexHandler
21866 ffestb_decl_attrsp_ (ffelexToken t)
21868 ffelex_set_names (FALSE);
21870 switch (ffelex_token_type (t))
21872 case FFELEX_typeCOMMA:
21873 ffesta_confirmed ();
21874 if (!ffesta_is_inhibited ())
21875 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
21876 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
21877 ffestb_local_.decl.len, ffestb_local_.decl.lent);
21878 if (ffestb_local_.decl.kindt != NULL)
21879 ffelex_token_kill (ffestb_local_.decl.kindt);
21880 if (ffestb_local_.decl.lent != NULL)
21881 ffelex_token_kill (ffestb_local_.decl.lent);
21882 return (ffelexHandler) ffestb_decl_attrs_;
21884 case FFELEX_typeCOLONCOLON:
21885 ffestb_local_.decl.coloncolon = TRUE;
21886 ffesta_confirmed ();
21887 if (!ffesta_is_inhibited ())
21888 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
21889 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
21890 ffestb_local_.decl.len, ffestb_local_.decl.lent);
21891 if (ffestb_local_.decl.kindt != NULL)
21892 ffelex_token_kill (ffestb_local_.decl.kindt);
21893 if (ffestb_local_.decl.lent != NULL)
21894 ffelex_token_kill (ffestb_local_.decl.lent);
21895 return (ffelexHandler) ffestb_decl_ents_;
21898 return (ffelexHandler) ffestb_decl_entsp_ (t);
21902 /* ffestb_decl_ents_ -- "type" [type parameters] [attributes "::"]
21904 return ffestb_decl_ents_; // to lexer
21906 Handle NAME of an entity. */
21908 static ffelexHandler
21909 ffestb_decl_ents_ (ffelexToken t)
21911 switch (ffelex_token_type (t))
21913 case FFELEX_typeNAME:
21914 ffesta_tokens[1] = ffelex_token_use (t);
21915 return (ffelexHandler) ffestb_decl_ents_1_;
21921 if (!ffesta_is_inhibited ())
21922 ffestc_decl_finish ();
21923 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21924 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21927 /* ffestb_decl_ents_1_ -- "type" [type parameters] [attributes "::"] NAME
21929 return ffestb_decl_ents_1_; // to lexer
21931 Handle ASTERISK, OPEN_PAREN, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */
21933 static ffelexHandler
21934 ffestb_decl_ents_1_ (ffelexToken t)
21936 switch (ffelex_token_type (t))
21938 case FFELEX_typeCOMMA:
21939 if (!ffesta_is_inhibited ())
21940 ffestc_decl_item (ffesta_tokens[1], NULL, NULL, NULL, NULL, NULL, NULL,
21942 ffelex_token_kill (ffesta_tokens[1]);
21943 return (ffelexHandler) ffestb_decl_ents_;
21945 case FFELEX_typeEOS:
21946 case FFELEX_typeSEMICOLON:
21947 if (!ffesta_is_inhibited ())
21949 ffestc_decl_item (ffesta_tokens[1], NULL, NULL, NULL, NULL, NULL, NULL,
21951 ffestc_decl_finish ();
21953 ffelex_token_kill (ffesta_tokens[1]);
21954 return (ffelexHandler) ffesta_zero (t);
21956 case FFELEX_typeASTERISK:
21957 ffestb_local_.decl.len = NULL;
21958 ffestb_local_.decl.lent = NULL;
21959 return (ffelexHandler) ffestb_decl_ents_2_;
21961 case FFELEX_typeOPEN_PAREN:
21962 ffestb_local_.decl.kind = NULL;
21963 ffestb_local_.decl.kindt = NULL;
21964 ffestb_local_.decl.len = NULL;
21965 ffestb_local_.decl.lent = NULL;
21966 return (ffelexHandler) ffestb_decl_ents_3_ (t);
21968 case FFELEX_typeEQUALS:
21969 case FFELEX_typeSLASH:
21970 ffestb_local_.decl.kind = NULL;
21971 ffestb_local_.decl.kindt = NULL;
21972 ffestb_subrargs_.dim_list.dims = NULL;
21973 ffestb_local_.decl.len = NULL;
21974 ffestb_local_.decl.lent = NULL;
21975 return (ffelexHandler) ffestb_decl_ents_7_ (t);
21981 if (!ffesta_is_inhibited ())
21982 ffestc_decl_finish ();
21983 ffelex_token_kill (ffesta_tokens[1]);
21984 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
21985 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
21988 /* ffestb_decl_ents_2_ -- "type" [type parameters] [attributes "::"] NAME
21991 return ffestb_decl_ents_2_; // to lexer
21993 Handle NUMBER or OPEN_PAREN. */
21995 static ffelexHandler
21996 ffestb_decl_ents_2_ (ffelexToken t)
21998 switch (ffelex_token_type (t))
22000 case FFELEX_typeNUMBER:
22001 if (ffestb_local_.decl.type != FFESTP_typeCHARACTER)
22003 ffestb_local_.decl.kind = NULL;
22004 ffestb_local_.decl.kindt = ffelex_token_use (t);
22005 return (ffelexHandler) ffestb_decl_ents_3_;
22007 /* Fall through. *//* (CHARACTER's *n is always a len spec. */
22008 case FFELEX_typeOPEN_PAREN:/* "*(" is after the (omitted)
22010 ffestb_local_.decl.kind = NULL;
22011 ffestb_local_.decl.kindt = NULL;
22012 ffestb_subrargs_.dim_list.dims = NULL;
22013 return (ffelexHandler) ffestb_decl_ents_5_ (t);
22019 if (!ffesta_is_inhibited ())
22020 ffestc_decl_finish ();
22021 ffelex_token_kill (ffesta_tokens[1]);
22022 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22023 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22026 /* ffestb_decl_ents_3_ -- "type" [type parameters] [attributes "::"] NAME
22029 return ffestb_decl_ents_3_; // to lexer
22031 Handle ASTERISK, OPEN_PAREN, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */
22033 static ffelexHandler
22034 ffestb_decl_ents_3_ (ffelexToken t)
22036 switch (ffelex_token_type (t))
22038 case FFELEX_typeCOMMA:
22039 if (!ffesta_is_inhibited ())
22040 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22041 ffestb_local_.decl.kindt, NULL, NULL, NULL, NULL, NULL, FALSE);
22042 ffelex_token_kill (ffesta_tokens[1]);
22043 if (ffestb_local_.decl.kindt != NULL)
22044 ffelex_token_kill (ffestb_local_.decl.kindt);
22045 return (ffelexHandler) ffestb_decl_ents_;
22047 case FFELEX_typeEOS:
22048 case FFELEX_typeSEMICOLON:
22049 if (!ffesta_is_inhibited ())
22051 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22052 ffestb_local_.decl.kindt, NULL, NULL, NULL, NULL, NULL, FALSE);
22053 ffestc_decl_finish ();
22055 ffelex_token_kill (ffesta_tokens[1]);
22056 if (ffestb_local_.decl.kindt != NULL)
22057 ffelex_token_kill (ffestb_local_.decl.kindt);
22058 return (ffelexHandler) ffesta_zero (t);
22060 case FFELEX_typeASTERISK:
22061 ffestb_subrargs_.dim_list.dims = NULL;
22062 return (ffelexHandler) ffestb_decl_ents_5_;
22064 case FFELEX_typeOPEN_PAREN:
22065 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
22066 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_decl_ents_4_;
22067 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
22068 ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid
22069 ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON;
22070 #ifdef FFECOM_dimensionsMAX
22071 ffestb_subrargs_.dim_list.ndims = 0;
22073 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
22074 ffestb_subrargs_.dim_list.ctx,
22075 (ffeexprCallback) ffestb_subr_dimlist_);
22077 case FFELEX_typeEQUALS:
22078 case FFELEX_typeSLASH:
22079 ffestb_local_.decl.kind = NULL;
22080 ffestb_local_.decl.kindt = NULL;
22081 ffestb_subrargs_.dim_list.dims = NULL;
22082 ffestb_local_.decl.len = NULL;
22083 ffestb_local_.decl.lent = NULL;
22084 return (ffelexHandler) ffestb_decl_ents_7_ (t);
22090 if (!ffesta_is_inhibited ())
22091 ffestc_decl_finish ();
22092 ffelex_token_kill (ffesta_tokens[1]);
22093 if (ffestb_local_.decl.kindt != NULL)
22094 ffelex_token_kill (ffestb_local_.decl.kindt);
22095 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22096 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22099 /* ffestb_decl_ents_4_ -- "type" [type parameters] [attributes "::"] NAME
22100 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22102 return ffestb_decl_ents_4_; // to lexer
22104 Handle ASTERISK, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */
22106 static ffelexHandler
22107 ffestb_decl_ents_4_ (ffelexToken t)
22111 if (!ffestb_subrargs_.dim_list.ok)
22112 goto bad; /* :::::::::::::::::::: */
22114 if (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeNAMES)
22116 switch (ffelex_token_type (t))
22118 case FFELEX_typeCOMMA:
22119 case FFELEX_typeEOS:
22120 case FFELEX_typeSEMICOLON:
22121 case FFELEX_typeASTERISK:
22122 case FFELEX_typeSLASH: /* But NOT FFELEX_typeEQUALS. */
22123 case FFELEX_typeCOLONCOLON: /* Actually an error. */
22124 break; /* Confirm and handle. */
22126 default: /* Perhaps EQUALS, as in
22127 INTEGERFUNCTIONX(A)=B. */
22128 goto bad; /* :::::::::::::::::::: */
22130 ffesta_confirmed ();
22131 if (!ffesta_is_inhibited ())
22133 nt = ffelex_token_name_from_names (ffesta_tokens[1], 0, 0);
22134 ffelex_token_kill (ffesta_tokens[1]);
22135 ffesta_tokens[1] = nt;
22136 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
22137 NULL, NULL, NULL, NULL);
22141 switch (ffelex_token_type (t))
22143 case FFELEX_typeCOMMA:
22144 if (!ffesta_is_inhibited ())
22145 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22146 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22147 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22149 ffelex_token_kill (ffesta_tokens[1]);
22150 if (ffestb_local_.decl.kindt != NULL)
22151 ffelex_token_kill (ffestb_local_.decl.kindt);
22152 if (ffestb_local_.decl.lent != NULL)
22153 ffelex_token_kill (ffestb_local_.decl.lent);
22154 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22155 return (ffelexHandler) ffestb_decl_ents_;
22157 case FFELEX_typeEOS:
22158 case FFELEX_typeSEMICOLON:
22159 if (!ffesta_is_inhibited ())
22161 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22162 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22163 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22165 ffestc_decl_finish ();
22167 ffelex_token_kill (ffesta_tokens[1]);
22168 if (ffestb_local_.decl.kindt != NULL)
22169 ffelex_token_kill (ffestb_local_.decl.kindt);
22170 if (ffestb_local_.decl.lent != NULL)
22171 ffelex_token_kill (ffestb_local_.decl.lent);
22172 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22173 return (ffelexHandler) ffesta_zero (t);
22175 case FFELEX_typeASTERISK:
22176 if (ffestb_local_.decl.lent != NULL)
22177 break; /* Can't specify "*length" twice. */
22178 return (ffelexHandler) ffestb_decl_ents_5_;
22180 case FFELEX_typeEQUALS:
22181 case FFELEX_typeSLASH:
22182 return (ffelexHandler) ffestb_decl_ents_7_ (t);
22188 bad: /* :::::::::::::::::::: */
22189 if ((ffelex_token_type (ffesta_tokens[1]) != FFELEX_typeNAMES)
22190 && !ffesta_is_inhibited ())
22191 ffestc_decl_finish ();
22192 ffelex_token_kill (ffesta_tokens[1]);
22193 if (ffestb_local_.decl.kindt != NULL)
22194 ffelex_token_kill (ffestb_local_.decl.kindt);
22195 if (ffestb_local_.decl.lent != NULL)
22196 ffelex_token_kill (ffestb_local_.decl.lent);
22197 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22198 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22199 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22202 /* ffestb_decl_ents_5_ -- "type" [type parameters] [attributes "::"] NAME
22203 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22206 return ffestb_decl_ents_5_; // to lexer
22208 Handle NUMBER or OPEN_PAREN. */
22210 static ffelexHandler
22211 ffestb_decl_ents_5_ (ffelexToken t)
22213 switch (ffelex_token_type (t))
22215 case FFELEX_typeNUMBER:
22216 ffestb_local_.decl.len = NULL;
22217 ffestb_local_.decl.lent = ffelex_token_use (t);
22218 return (ffelexHandler) ffestb_decl_ents_7_;
22220 case FFELEX_typeOPEN_PAREN:
22221 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
22222 FFEEXPR_contextCHARACTERSIZE, (ffeexprCallback) ffestb_decl_ents_6_);
22228 if (!ffesta_is_inhibited ())
22229 ffestc_decl_finish ();
22230 ffelex_token_kill (ffesta_tokens[1]);
22231 if (ffestb_local_.decl.kindt != NULL)
22232 ffelex_token_kill (ffestb_local_.decl.kindt);
22233 if (ffestb_subrargs_.dim_list.dims != NULL)
22234 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22235 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22236 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22239 /* ffestb_decl_ents_6_ -- "type" [type parameters] [attributes "::"] NAME
22240 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22241 ASTERISK OPEN_PAREN expr
22243 (ffestb_decl_ents_6_) // to expression handler
22245 Handle CLOSE_PAREN. */
22247 static ffelexHandler
22248 ffestb_decl_ents_6_ (ffelexToken ft, ffebld expr, ffelexToken t)
22250 switch (ffelex_token_type (t))
22252 case FFELEX_typeCLOSE_PAREN:
22255 ffestb_local_.decl.len = expr;
22256 ffestb_local_.decl.lent = ffelex_token_use (ft);
22257 return (ffelexHandler) ffestb_decl_ents_7_;
22263 if (!ffesta_is_inhibited ())
22264 ffestc_decl_finish ();
22265 ffelex_token_kill (ffesta_tokens[1]);
22266 if (ffestb_local_.decl.kindt != NULL)
22267 ffelex_token_kill (ffestb_local_.decl.kindt);
22268 if (ffestb_subrargs_.dim_list.dims != NULL)
22269 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22270 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22271 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22274 /* ffestb_decl_ents_7_ -- "type" [type parameters] [attributes "::"] NAME
22275 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22276 [ASTERISK charlength]
22278 return ffestb_decl_ents_7_; // to lexer
22280 Handle EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */
22282 static ffelexHandler
22283 ffestb_decl_ents_7_ (ffelexToken t)
22285 switch (ffelex_token_type (t))
22287 case FFELEX_typeCOMMA:
22288 if (!ffesta_is_inhibited ())
22289 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22290 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22291 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22293 ffelex_token_kill (ffesta_tokens[1]);
22294 if (ffestb_local_.decl.kindt != NULL)
22295 ffelex_token_kill (ffestb_local_.decl.kindt);
22296 if (ffestb_subrargs_.dim_list.dims != NULL)
22297 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22298 if (ffestb_local_.decl.lent != NULL)
22299 ffelex_token_kill (ffestb_local_.decl.lent);
22300 return (ffelexHandler) ffestb_decl_ents_;
22302 case FFELEX_typeEOS:
22303 case FFELEX_typeSEMICOLON:
22304 if (!ffesta_is_inhibited ())
22306 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22307 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22308 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22310 ffestc_decl_finish ();
22312 ffelex_token_kill (ffesta_tokens[1]);
22313 if (ffestb_local_.decl.kindt != NULL)
22314 ffelex_token_kill (ffestb_local_.decl.kindt);
22315 if (ffestb_subrargs_.dim_list.dims != NULL)
22316 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22317 if (ffestb_local_.decl.lent != NULL)
22318 ffelex_token_kill (ffestb_local_.decl.lent);
22319 return (ffelexHandler) ffesta_zero (t);
22321 case FFELEX_typeEQUALS:
22322 if (!ffestb_local_.decl.coloncolon)
22323 ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_INIT, t);
22324 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
22325 ffestb_local_.decl.parameter ? FFEEXPR_contextPARAMETER
22326 : FFEEXPR_contextINITVAL, (ffeexprCallback) ffestb_decl_ents_8_);
22328 case FFELEX_typeSLASH:
22329 if (!ffesta_is_inhibited ())
22331 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22332 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22333 ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL,
22335 ffestc_decl_itemstartvals ();
22337 ffelex_token_kill (ffesta_tokens[1]);
22338 if (ffestb_local_.decl.kindt != NULL)
22339 ffelex_token_kill (ffestb_local_.decl.kindt);
22340 if (ffestb_subrargs_.dim_list.dims != NULL)
22341 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22342 if (ffestb_local_.decl.lent != NULL)
22343 ffelex_token_kill (ffestb_local_.decl.lent);
22344 return (ffelexHandler) ffeexpr_rhs
22345 (ffesta_output_pool, FFEEXPR_contextDATA,
22346 (ffeexprCallback) ffestb_decl_ents_9_);
22352 if (!ffesta_is_inhibited ())
22353 ffestc_decl_finish ();
22354 ffelex_token_kill (ffesta_tokens[1]);
22355 if (ffestb_local_.decl.kindt != NULL)
22356 ffelex_token_kill (ffestb_local_.decl.kindt);
22357 if (ffestb_subrargs_.dim_list.dims != NULL)
22358 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22359 if (ffestb_local_.decl.lent != NULL)
22360 ffelex_token_kill (ffestb_local_.decl.lent);
22361 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22362 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22365 /* ffestb_decl_ents_8_ -- "type" [type parameters] [attributes "::"] NAME
22366 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22367 [ASTERISK charlength] EQUALS expr
22369 (ffestb_decl_ents_8_) // to expression handler
22371 Handle COMMA or EOS/SEMICOLON. */
22373 static ffelexHandler
22374 ffestb_decl_ents_8_ (ffelexToken ft, ffebld expr, ffelexToken t)
22376 switch (ffelex_token_type (t))
22378 case FFELEX_typeCOMMA:
22381 if (!ffesta_is_inhibited ())
22382 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22383 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22384 ffestb_local_.decl.len, ffestb_local_.decl.lent, expr, ft,
22386 ffelex_token_kill (ffesta_tokens[1]);
22387 if (ffestb_local_.decl.kindt != NULL)
22388 ffelex_token_kill (ffestb_local_.decl.kindt);
22389 if (ffestb_subrargs_.dim_list.dims != NULL)
22390 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22391 if (ffestb_local_.decl.lent != NULL)
22392 ffelex_token_kill (ffestb_local_.decl.lent);
22393 return (ffelexHandler) ffestb_decl_ents_;
22395 case FFELEX_typeEOS:
22396 case FFELEX_typeSEMICOLON:
22397 if (!ffesta_is_inhibited ())
22399 ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind,
22400 ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims,
22401 ffestb_local_.decl.len, ffestb_local_.decl.lent, expr, ft,
22403 ffestc_decl_finish ();
22405 ffelex_token_kill (ffesta_tokens[1]);
22406 if (ffestb_local_.decl.kindt != NULL)
22407 ffelex_token_kill (ffestb_local_.decl.kindt);
22408 if (ffestb_subrargs_.dim_list.dims != NULL)
22409 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22410 if (ffestb_local_.decl.lent != NULL)
22411 ffelex_token_kill (ffestb_local_.decl.lent);
22412 return (ffelexHandler) ffesta_zero (t);
22418 if (!ffesta_is_inhibited ())
22419 ffestc_decl_finish ();
22420 ffelex_token_kill (ffesta_tokens[1]);
22421 if (ffestb_local_.decl.kindt != NULL)
22422 ffelex_token_kill (ffestb_local_.decl.kindt);
22423 if (ffestb_subrargs_.dim_list.dims != NULL)
22424 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
22425 if (ffestb_local_.decl.lent != NULL)
22426 ffelex_token_kill (ffestb_local_.decl.lent);
22427 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22428 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22431 /* ffestb_decl_ents_9_ -- "type" ... SLASH expr
22433 (ffestb_decl_ents_9_) // to expression handler
22435 Handle ASTERISK, COMMA, or SLASH. */
22437 static ffelexHandler
22438 ffestb_decl_ents_9_ (ffelexToken ft, ffebld expr, ffelexToken t)
22440 switch (ffelex_token_type (t))
22442 case FFELEX_typeCOMMA:
22445 if (!ffesta_is_inhibited ())
22446 ffestc_decl_itemvalue (NULL, NULL, expr, ft);
22447 return (ffelexHandler) ffeexpr_rhs
22448 (ffesta_output_pool, FFEEXPR_contextDATA,
22449 (ffeexprCallback) ffestb_decl_ents_9_);
22451 case FFELEX_typeASTERISK:
22454 ffestb_local_.decl.expr = expr;
22455 ffesta_tokens[1] = ffelex_token_use (ft);
22456 return (ffelexHandler) ffeexpr_rhs
22457 (ffesta_output_pool, FFEEXPR_contextDATA,
22458 (ffeexprCallback) ffestb_decl_ents_10_);
22460 case FFELEX_typeSLASH:
22463 if (!ffesta_is_inhibited ())
22465 ffestc_decl_itemvalue (NULL, NULL, expr, ft);
22466 ffestc_decl_itemendvals (t);
22468 return (ffelexHandler) ffestb_decl_ents_11_;
22471 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22475 if (!ffesta_is_inhibited ())
22477 ffestc_decl_itemendvals (t);
22478 ffestc_decl_finish ();
22480 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22483 /* ffestb_decl_ents_10_ -- "type" ... SLASH expr ASTERISK expr
22485 (ffestb_decl_ents_10_) // to expression handler
22487 Handle COMMA or SLASH. */
22489 static ffelexHandler
22490 ffestb_decl_ents_10_ (ffelexToken ft, ffebld expr, ffelexToken t)
22492 switch (ffelex_token_type (t))
22494 case FFELEX_typeCOMMA:
22497 if (!ffesta_is_inhibited ())
22498 ffestc_decl_itemvalue (ffestb_local_.decl.expr, ffesta_tokens[1],
22500 ffelex_token_kill (ffesta_tokens[1]);
22501 return (ffelexHandler) ffeexpr_rhs
22502 (ffesta_output_pool, FFEEXPR_contextDATA,
22503 (ffeexprCallback) ffestb_decl_ents_9_);
22505 case FFELEX_typeSLASH:
22508 if (!ffesta_is_inhibited ())
22510 ffestc_decl_itemvalue (ffestb_local_.decl.expr, ffesta_tokens[1],
22512 ffestc_decl_itemendvals (t);
22514 ffelex_token_kill (ffesta_tokens[1]);
22515 return (ffelexHandler) ffestb_decl_ents_11_;
22518 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22522 if (!ffesta_is_inhibited ())
22524 ffestc_decl_itemendvals (t);
22525 ffestc_decl_finish ();
22527 ffelex_token_kill (ffesta_tokens[1]);
22528 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22531 /* ffestb_decl_ents_11_ -- "type" [type parameters] [attributes "::"] NAME
22532 [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN]
22533 [ASTERISK charlength] SLASH initvals SLASH
22535 return ffestb_decl_ents_11_; // to lexer
22537 Handle COMMA or EOS/SEMICOLON. */
22539 static ffelexHandler
22540 ffestb_decl_ents_11_ (ffelexToken t)
22542 switch (ffelex_token_type (t))
22544 case FFELEX_typeCOMMA:
22545 return (ffelexHandler) ffestb_decl_ents_;
22547 case FFELEX_typeEOS:
22548 case FFELEX_typeSEMICOLON:
22549 if (!ffesta_is_inhibited ())
22550 ffestc_decl_finish ();
22551 return (ffelexHandler) ffesta_zero (t);
22557 if (!ffesta_is_inhibited ())
22558 ffestc_decl_finish ();
22559 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22560 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22563 /* ffestb_decl_entsp_ -- "type" [type parameters]
22565 return ffestb_decl_entsp_; // to lexer
22567 Handle NAME or NAMES beginning either an entity (object) declaration or
22568 a function definition.. */
22570 static ffelexHandler
22571 ffestb_decl_entsp_ (ffelexToken t)
22573 switch (ffelex_token_type (t))
22575 case FFELEX_typeNAME:
22576 ffesta_confirmed ();
22577 ffesta_tokens[1] = ffelex_token_use (t);
22578 return (ffelexHandler) ffestb_decl_entsp_1_;
22580 case FFELEX_typeNAMES:
22581 ffesta_confirmed ();
22582 ffesta_tokens[1] = ffelex_token_use (t);
22583 return (ffelexHandler) ffestb_decl_entsp_2_;
22589 if (ffestb_local_.decl.kindt != NULL)
22590 ffelex_token_kill (ffestb_local_.decl.kindt);
22591 if (ffestb_local_.decl.lent != NULL)
22592 ffelex_token_kill (ffestb_local_.decl.lent);
22593 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t);
22594 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22597 /* ffestb_decl_entsp_1_ -- "type" [type parameters] NAME
22599 return ffestb_decl_entsp_1_; // to lexer
22601 If we get another NAME token here, then the previous one must be
22602 "RECURSIVE" or "FUNCTION" and we handle it accordingly. Otherwise,
22603 we send the previous and current token through to _ents_. */
22605 static ffelexHandler
22606 ffestb_decl_entsp_1_ (ffelexToken t)
22608 switch (ffelex_token_type (t))
22610 case FFELEX_typeNAME:
22611 switch (ffestr_first (ffesta_tokens[1]))
22614 case FFESTR_firstRECURSIVE:
22615 if (ffestr_first (t) != FFESTR_firstFUNCTION)
22617 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
22620 ffestb_local_.decl.recursive = ffesta_tokens[1];
22621 return (ffelexHandler) ffestb_decl_funcname_;
22624 case FFESTR_firstFUNCTION:
22625 ffelex_token_kill (ffesta_tokens[1]);
22626 return (ffelexHandler) ffestb_decl_funcname_ (t);
22629 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ffesta_tokens[1]);
22635 if ((ffelex_token_type (ffesta_tokens[1]) != FFELEX_typeNAMES)
22636 && !ffesta_is_inhibited ())
22637 ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
22638 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
22639 ffestb_local_.decl.len, ffestb_local_.decl.lent);
22640 if (ffestb_local_.decl.kindt != NULL)
22641 ffelex_token_kill (ffestb_local_.decl.kindt);
22642 if (ffestb_local_.decl.lent != NULL)
22643 ffelex_token_kill (ffestb_local_.decl.lent);
22644 /* NAME/NAMES token already in ffesta_tokens[1]. */
22645 return (ffelexHandler) ffestb_decl_ents_1_ (t);
22648 if (ffestb_local_.decl.kindt != NULL)
22649 ffelex_token_kill (ffestb_local_.decl.kindt);
22650 if (ffestb_local_.decl.lent != NULL)
22651 ffelex_token_kill (ffestb_local_.decl.lent);
22652 ffelex_token_kill (ffesta_tokens[1]);
22653 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22656 /* ffestb_decl_entsp_2_ -- "type" [type parameters] NAMES
22658 return ffestb_decl_entsp_2_; // to lexer
22660 If we get an ASTERISK or OPEN_PAREN here, then if the previous NAMES
22661 begins with "FUNCTION" or "RECURSIVEFUNCTION" and is followed by a
22662 first-name-char, we have a possible syntactically ambiguous situation.
22663 Otherwise, we have a straightforward situation just as if we went
22664 through _entsp_1_ instead of here. */
22666 static ffelexHandler
22667 ffestb_decl_entsp_2_ (ffelexToken t)
22674 switch (ffelex_token_type (t))
22676 case FFELEX_typeASTERISK:
22677 ffesta_confirmed ();
22678 switch (ffestb_local_.decl.type)
22680 case FFESTP_typeINTEGER:
22681 case FFESTP_typeREAL:
22682 case FFESTP_typeCOMPLEX:
22683 case FFESTP_typeLOGICAL:
22684 asterisk_ok = (ffestb_local_.decl.kindt == NULL);
22687 case FFESTP_typeCHARACTER:
22688 asterisk_ok = (ffestb_local_.decl.lent == NULL);
22691 case FFESTP_typeBYTE:
22692 case FFESTP_typeWORD:
22694 asterisk_ok = FALSE;
22697 switch (ffestr_first (ffesta_tokens[1]))
22700 case FFESTR_firstRECURSIVEFNCTN:
22702 break; /* For our own convenience, treat as non-FN
22704 p = ffelex_token_text (ffesta_tokens[1])
22705 + (i = FFESTR_firstlRECURSIVEFNCTN);
22706 if (!ffesrc_is_name_init (*p))
22708 ffestb_local_.decl.recursive
22709 = ffelex_token_name_from_names (ffesta_tokens[1], 0,
22710 FFESTR_firstlRECURSIVEFNCTN);
22711 ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1],
22712 FFESTR_firstlRECURSIVEFNCTN, 0);
22713 return (ffelexHandler) ffestb_decl_entsp_3_;
22716 case FFESTR_firstFUNCTION:
22718 break; /* For our own convenience, treat as non-FN
22720 p = ffelex_token_text (ffesta_tokens[1])
22721 + (i = FFESTR_firstlFUNCTION);
22722 if (!ffesrc_is_name_init (*p))
22724 ffestb_local_.decl.recursive = NULL;
22725 ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1],
22726 FFESTR_firstlFUNCTION, 0);
22727 return (ffelexHandler) ffestb_decl_entsp_3_;
22734 case FFELEX_typeOPEN_PAREN:
22735 ffestb_local_.decl.aster_after = FALSE;
22736 switch (ffestr_first (ffesta_tokens[1]))
22739 case FFESTR_firstRECURSIVEFNCTN:
22740 p = ffelex_token_text (ffesta_tokens[1])
22741 + (i = FFESTR_firstlRECURSIVEFNCTN);
22742 if (!ffesrc_is_name_init (*p))
22744 ffestb_local_.decl.recursive
22745 = ffelex_token_name_from_names (ffesta_tokens[1], 0,
22746 FFESTR_firstlRECURSIVEFNCTN);
22747 ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1],
22748 FFESTR_firstlRECURSIVEFNCTN, 0);
22749 return (ffelexHandler) ffestb_decl_entsp_5_ (t);
22752 case FFESTR_firstFUNCTION:
22753 p = ffelex_token_text (ffesta_tokens[1])
22754 + (i = FFESTR_firstlFUNCTION);
22755 if (!ffesrc_is_name_init (*p))
22757 ffestb_local_.decl.recursive = NULL;
22758 ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1],
22759 FFESTR_firstlFUNCTION, 0);
22760 return (ffelexHandler) ffestb_decl_entsp_5_ (t);
22765 if ((ffestb_local_.decl.kindt != NULL)
22766 || (ffestb_local_.decl.lent != NULL))
22767 break; /* Have kind/len type param, definitely not
22768 assignment stmt. */
22769 return (ffelexHandler) ffestb_decl_entsp_1_ (t);
22775 nt = ffelex_token_name_from_names (ffesta_tokens[1], 0, 0);
22776 ffelex_token_kill (ffesta_tokens[1]);
22777 ffesta_tokens[1] = nt; /* Change NAMES to NAME. */
22778 return (ffelexHandler) ffestb_decl_entsp_1_ (t);
22781 /* ffestb_decl_entsp_3_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22784 return ffestb_decl_entsp_3_; // to lexer
22786 Handle NUMBER or OPEN_PAREN. */
22788 static ffelexHandler
22789 ffestb_decl_entsp_3_ (ffelexToken t)
22791 ffestb_local_.decl.aster_after = TRUE;
22793 switch (ffelex_token_type (t))
22795 case FFELEX_typeNUMBER:
22796 switch (ffestb_local_.decl.type)
22798 case FFESTP_typeINTEGER:
22799 case FFESTP_typeREAL:
22800 case FFESTP_typeCOMPLEX:
22801 case FFESTP_typeLOGICAL:
22802 ffestb_local_.decl.kindt = ffelex_token_use (t);
22805 case FFESTP_typeCHARACTER:
22806 ffestb_local_.decl.lent = ffelex_token_use (t);
22809 case FFESTP_typeBYTE:
22810 case FFESTP_typeWORD:
22814 return (ffelexHandler) ffestb_decl_entsp_5_;
22816 case FFELEX_typeOPEN_PAREN:
22817 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
22818 FFEEXPR_contextCHARACTERSIZE,
22819 (ffeexprCallback) ffestb_decl_entsp_4_);
22825 if (ffestb_local_.decl.recursive != NULL)
22826 ffelex_token_kill (ffestb_local_.decl.recursive);
22827 if (ffestb_local_.decl.kindt != NULL)
22828 ffelex_token_kill (ffestb_local_.decl.kindt);
22829 if (ffestb_local_.decl.lent != NULL)
22830 ffelex_token_kill (ffestb_local_.decl.lent);
22831 ffelex_token_kill (ffesta_tokens[1]);
22832 ffelex_token_kill (ffesta_tokens[2]);
22833 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
22834 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22837 /* ffestb_decl_entsp_4_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22838 NAME ASTERISK OPEN_PAREN expr
22840 (ffestb_decl_entsp_4_) // to expression handler
22842 Allow only CLOSE_PAREN; and deal with character-length expression. */
22844 static ffelexHandler
22845 ffestb_decl_entsp_4_ (ffelexToken ft, ffebld expr, ffelexToken t)
22847 switch (ffelex_token_type (t))
22849 case FFELEX_typeCLOSE_PAREN:
22852 switch (ffestb_local_.decl.type)
22854 case FFESTP_typeCHARACTER:
22855 ffestb_local_.decl.len = expr;
22856 ffestb_local_.decl.lent = ffelex_token_use (ft);
22860 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
22863 return (ffelexHandler) ffestb_decl_entsp_5_;
22869 if (ffestb_local_.decl.recursive != NULL)
22870 ffelex_token_kill (ffestb_local_.decl.recursive);
22871 if (ffestb_local_.decl.kindt != NULL)
22872 ffelex_token_kill (ffestb_local_.decl.kindt);
22873 if (ffestb_local_.decl.lent != NULL)
22874 ffelex_token_kill (ffestb_local_.decl.lent);
22875 ffelex_token_kill (ffesta_tokens[1]);
22876 ffelex_token_kill (ffesta_tokens[2]);
22877 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
22878 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
22881 /* ffestb_decl_entsp_5_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22882 NAME [type parameter]
22884 return ffestb_decl_entsp_5_; // to lexer
22886 Make sure the next token is an OPEN_PAREN. Get the arg list or dimension
22887 list. If it can't be an arg list, or if the CLOSE_PAREN is followed by
22888 something other than EOS/SEMICOLON or NAME, then treat as dimension list
22889 and handle statement as an R426/R501. If it can't be a dimension list, or
22890 if the CLOSE_PAREN is followed by NAME, treat as an arg list and handle
22891 statement as an R1219. If it can be either an arg list or a dimension
22892 list and if the CLOSE_PAREN is followed by EOS/SEMICOLON, ask FFESTC
22893 whether to treat the statement as an R426/R501 or an R1219 and act
22896 static ffelexHandler
22897 ffestb_decl_entsp_5_ (ffelexToken t)
22899 switch (ffelex_token_type (t))
22901 case FFELEX_typeOPEN_PAREN:
22902 if (ffestb_local_.decl.aster_after && (ffestb_local_.decl.len != NULL))
22903 { /* "CHARACTER[RECURSIVE]FUNCTIONxyz*(len-expr)
22904 (..." must be a function-stmt, since the
22905 (len-expr) cannot precede (array-spec) in
22906 an object declaration but can precede
22907 (name-list) in a function stmt. */
22908 ffelex_token_kill (ffesta_tokens[1]);
22909 ffesta_tokens[1] = ffesta_tokens[2];
22910 return (ffelexHandler) ffestb_decl_funcname_4_ (t);
22912 ffestb_local_.decl.toklist = ffestt_tokenlist_create ();
22913 ffestb_local_.decl.empty = TRUE;
22914 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
22915 return (ffelexHandler) ffestb_decl_entsp_6_;
22921 assert (ffestb_local_.decl.aster_after);
22922 ffesta_confirmed (); /* We've seen an ASTERISK, so even EQUALS
22924 ffestb_subr_ambig_to_ents_ ();
22925 ffestb_subrargs_.dim_list.dims = NULL;
22926 return (ffelexHandler) ffestb_decl_ents_7_ (t);
22929 /* ffestb_decl_entsp_6_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22930 NAME [type parameter] OPEN_PAREN
22932 return ffestb_decl_entsp_6_; // to lexer
22934 If CLOSE_PAREN, we definitely have an R1219 function-stmt, since
22935 the notation "name()" is invalid for a declaration. */
22937 static ffelexHandler
22938 ffestb_decl_entsp_6_ (ffelexToken t)
22940 ffelexHandler next;
22942 switch (ffelex_token_type (t))
22944 case FFELEX_typeCLOSE_PAREN:
22945 if (!ffestb_local_.decl.empty)
22946 { /* Trailing comma, just a warning for
22947 stmt func def, so allow ambiguity. */
22948 ffestt_tokenlist_append (ffestb_local_.decl.toklist,
22949 ffelex_token_use (t));
22950 return (ffelexHandler) ffestb_decl_entsp_8_;
22952 ffelex_token_kill (ffesta_tokens[1]);
22953 ffesta_tokens[1] = ffesta_tokens[2];
22954 next = (ffelexHandler) ffestt_tokenlist_handle
22955 (ffestb_local_.decl.toklist, (ffelexHandler) ffestb_decl_funcname_4_);
22956 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
22957 return (ffelexHandler) (*next) (t);
22959 case FFELEX_typeNAME:
22960 ffestb_local_.decl.empty = FALSE;
22961 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
22962 return (ffelexHandler) ffestb_decl_entsp_7_;
22964 case FFELEX_typeEQUALS:
22965 case FFELEX_typePOINTS:
22966 case FFELEX_typePERCENT:
22967 case FFELEX_typePERIOD:
22968 case FFELEX_typeOPEN_PAREN:
22969 if ((ffestb_local_.decl.kindt != NULL)
22970 || (ffestb_local_.decl.lent != NULL))
22971 break; /* type(params)name or type*val name, either
22973 return (ffelexHandler) ffestb_subr_ambig_nope_ (t);
22979 ffesta_confirmed ();
22980 ffestb_subr_ambig_to_ents_ ();
22981 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
22982 (ffelexHandler) ffestb_decl_ents_3_);
22983 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
22984 return (ffelexHandler) (*next) (t);
22987 /* ffestb_decl_entsp_7_ -- "type" [type parameters] [RECURSIVE] FUNCTION
22988 NAME [type parameter] OPEN_PAREN NAME
22990 return ffestb_decl_entsp_7_; // to lexer
22992 Expect COMMA or CLOSE_PAREN to remain ambiguous, else not an R1219
22995 static ffelexHandler
22996 ffestb_decl_entsp_7_ (ffelexToken t)
22998 ffelexHandler next;
23000 switch (ffelex_token_type (t))
23002 case FFELEX_typeCLOSE_PAREN:
23003 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
23004 return (ffelexHandler) ffestb_decl_entsp_8_;
23006 case FFELEX_typeCOMMA:
23007 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
23008 return (ffelexHandler) ffestb_decl_entsp_6_;
23010 case FFELEX_typeEQUALS:
23011 case FFELEX_typePOINTS:
23012 case FFELEX_typePERCENT:
23013 case FFELEX_typePERIOD:
23014 case FFELEX_typeOPEN_PAREN:
23015 if ((ffestb_local_.decl.kindt != NULL)
23016 || (ffestb_local_.decl.lent != NULL))
23017 break; /* type(params)name or type*val name, either
23019 return (ffelexHandler) ffestb_subr_ambig_nope_ (t);
23025 ffesta_confirmed ();
23026 ffestb_subr_ambig_to_ents_ ();
23027 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
23028 (ffelexHandler) ffestb_decl_ents_3_);
23029 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
23030 return (ffelexHandler) (*next) (t);
23033 /* ffestb_decl_entsp_8_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23034 NAME [type parameter] OPEN_PAREN name-list
23037 return ffestb_decl_entsp_8_; // to lexer
23039 If EOS/SEMICOLON, situation remains ambiguous, ask FFESTC to resolve
23040 it. If NAME (must be "RESULT", but that is checked later on),
23041 definitely an R1219 function-stmt. Anything else, handle as entity decl. */
23043 static ffelexHandler
23044 ffestb_decl_entsp_8_ (ffelexToken t)
23046 ffelexHandler next;
23048 switch (ffelex_token_type (t))
23050 case FFELEX_typeEOS:
23051 case FFELEX_typeSEMICOLON:
23052 ffesta_confirmed ();
23053 if (ffestc_is_decl_not_R1219 ())
23055 /* Fall through. */
23056 case FFELEX_typeNAME:
23057 ffesta_confirmed ();
23058 ffelex_token_kill (ffesta_tokens[1]);
23059 ffesta_tokens[1] = ffesta_tokens[2];
23060 next = (ffelexHandler) ffestt_tokenlist_handle
23061 (ffestb_local_.decl.toklist, (ffelexHandler) ffestb_decl_funcname_4_);
23062 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
23063 return (ffelexHandler) (*next) (t);
23065 case FFELEX_typeEQUALS:
23066 case FFELEX_typePOINTS:
23067 case FFELEX_typePERCENT:
23068 case FFELEX_typePERIOD:
23069 case FFELEX_typeOPEN_PAREN:
23070 if ((ffestb_local_.decl.kindt != NULL)
23071 || (ffestb_local_.decl.lent != NULL))
23072 break; /* type(params)name or type*val name, either
23074 return (ffelexHandler) ffestb_subr_ambig_nope_ (t);
23080 ffesta_confirmed ();
23081 ffestb_subr_ambig_to_ents_ ();
23082 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
23083 (ffelexHandler) ffestb_decl_ents_3_);
23084 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
23085 return (ffelexHandler) (*next) (t);
23088 /* ffestb_decl_func_ -- ["type" [type parameters]] RECURSIVE
23090 return ffestb_decl_func_; // to lexer
23092 Handle "FUNCTION". */
23095 static ffelexHandler
23096 ffestb_decl_func_ (ffelexToken t)
23101 ffelex_set_names (FALSE);
23103 switch (ffelex_token_type (t))
23105 case FFELEX_typeNAME:
23106 if (ffestr_first (t) != FFESTR_firstFUNCTION)
23108 return (ffelexHandler) ffestb_decl_funcname_;
23110 case FFELEX_typeNAMES:
23111 ffesta_confirmed ();
23112 if (ffestr_first (t) != FFESTR_firstFUNCTION)
23114 p = ffelex_token_text (t) + (i = FFESTR_firstlFUNCTION);
23117 if (!ffesrc_is_name_init (*p))
23118 goto bad_i; /* :::::::::::::::::::: */
23119 ffesta_tokens[1] = ffelex_token_name_from_names (t, i, 0);
23120 return (ffelexHandler) ffestb_decl_funcname_1_;
23126 if (ffestb_local_.decl.recursive != NULL)
23127 ffelex_token_kill (ffestb_local_.decl.recursive);
23128 if (ffestb_local_.decl.kindt != NULL)
23129 ffelex_token_kill (ffestb_local_.decl.kindt);
23130 if (ffestb_local_.decl.lent != NULL)
23131 ffelex_token_kill (ffestb_local_.decl.lent);
23132 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23133 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23135 bad_i: /* :::::::::::::::::::: */
23136 if (ffestb_local_.decl.recursive != NULL)
23137 ffelex_token_kill (ffestb_local_.decl.recursive);
23138 if (ffestb_local_.decl.kindt != NULL)
23139 ffelex_token_kill (ffestb_local_.decl.kindt);
23140 if (ffestb_local_.decl.lent != NULL)
23141 ffelex_token_kill (ffestb_local_.decl.lent);
23142 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t, i, NULL);
23143 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23147 /* ffestb_decl_funcname_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23149 return ffestb_decl_funcname_; // to lexer
23151 Handle NAME of a function. */
23153 static ffelexHandler
23154 ffestb_decl_funcname_ (ffelexToken t)
23156 switch (ffelex_token_type (t))
23158 case FFELEX_typeNAME:
23159 ffesta_tokens[1] = ffelex_token_use (t);
23160 return (ffelexHandler) ffestb_decl_funcname_1_;
23166 if (ffestb_local_.decl.recursive != NULL)
23167 ffelex_token_kill (ffestb_local_.decl.recursive);
23168 if (ffestb_local_.decl.kindt != NULL)
23169 ffelex_token_kill (ffestb_local_.decl.kindt);
23170 if (ffestb_local_.decl.lent != NULL)
23171 ffelex_token_kill (ffestb_local_.decl.lent);
23172 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23173 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23176 /* ffestb_decl_funcname_1_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23179 return ffestb_decl_funcname_1_; // to lexer
23181 Handle ASTERISK or OPEN_PAREN. */
23183 static ffelexHandler
23184 ffestb_decl_funcname_1_ (ffelexToken t)
23186 switch (ffelex_token_type (t))
23188 case FFELEX_typeASTERISK:
23189 return (ffelexHandler) ffestb_decl_funcname_2_;
23191 case FFELEX_typeOPEN_PAREN:
23192 return (ffelexHandler) ffestb_decl_funcname_4_ (t);
23198 if (ffestb_local_.decl.recursive != NULL)
23199 ffelex_token_kill (ffestb_local_.decl.recursive);
23200 if (ffestb_local_.decl.kindt != NULL)
23201 ffelex_token_kill (ffestb_local_.decl.kindt);
23202 if (ffestb_local_.decl.lent != NULL)
23203 ffelex_token_kill (ffestb_local_.decl.lent);
23204 ffelex_token_kill (ffesta_tokens[1]);
23205 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23206 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23209 /* ffestb_decl_funcname_2_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23212 return ffestb_decl_funcname_2_; // to lexer
23214 Handle NUMBER or OPEN_PAREN. */
23216 static ffelexHandler
23217 ffestb_decl_funcname_2_ (ffelexToken t)
23219 switch (ffelex_token_type (t))
23221 case FFELEX_typeNUMBER:
23222 switch (ffestb_local_.decl.type)
23224 case FFESTP_typeINTEGER:
23225 case FFESTP_typeREAL:
23226 case FFESTP_typeCOMPLEX:
23227 case FFESTP_typeLOGICAL:
23228 if (ffestb_local_.decl.kindt == NULL)
23229 ffestb_local_.decl.kindt = ffelex_token_use (t);
23231 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23234 case FFESTP_typeCHARACTER:
23235 if (ffestb_local_.decl.lent == NULL)
23236 ffestb_local_.decl.lent = ffelex_token_use (t);
23238 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23241 case FFESTP_typeBYTE:
23242 case FFESTP_typeWORD:
23244 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23247 return (ffelexHandler) ffestb_decl_funcname_4_;
23249 case FFELEX_typeOPEN_PAREN:
23250 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
23251 FFEEXPR_contextCHARACTERSIZE,
23252 (ffeexprCallback) ffestb_decl_funcname_3_);
23258 if (ffestb_local_.decl.recursive != NULL)
23259 ffelex_token_kill (ffestb_local_.decl.recursive);
23260 if (ffestb_local_.decl.kindt != NULL)
23261 ffelex_token_kill (ffestb_local_.decl.kindt);
23262 if (ffestb_local_.decl.lent != NULL)
23263 ffelex_token_kill (ffestb_local_.decl.lent);
23264 ffelex_token_kill (ffesta_tokens[1]);
23265 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23266 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23269 /* ffestb_decl_funcname_3_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23270 NAME ASTERISK OPEN_PAREN expr
23272 (ffestb_decl_funcname_3_) // to expression handler
23274 Allow only CLOSE_PAREN; and deal with character-length expression. */
23276 static ffelexHandler
23277 ffestb_decl_funcname_3_ (ffelexToken ft, ffebld expr, ffelexToken t)
23279 switch (ffelex_token_type (t))
23281 case FFELEX_typeCLOSE_PAREN:
23284 switch (ffestb_local_.decl.type)
23286 case FFESTP_typeCHARACTER:
23287 if (ffestb_local_.decl.lent == NULL)
23289 ffestb_local_.decl.len = expr;
23290 ffestb_local_.decl.lent = ffelex_token_use (ft);
23293 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23297 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23300 return (ffelexHandler) ffestb_decl_funcname_4_;
23306 if (ffestb_local_.decl.recursive != NULL)
23307 ffelex_token_kill (ffestb_local_.decl.recursive);
23308 if (ffestb_local_.decl.kindt != NULL)
23309 ffelex_token_kill (ffestb_local_.decl.kindt);
23310 if (ffestb_local_.decl.lent != NULL)
23311 ffelex_token_kill (ffestb_local_.decl.lent);
23312 ffelex_token_kill (ffesta_tokens[1]);
23313 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23314 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23317 /* ffestb_decl_funcname_4_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23318 NAME [type parameter]
23320 return ffestb_decl_funcname_4_; // to lexer
23322 Make sure the next token is an OPEN_PAREN. Get the arg list and
23325 static ffelexHandler
23326 ffestb_decl_funcname_4_ (ffelexToken t)
23328 switch (ffelex_token_type (t))
23330 case FFELEX_typeOPEN_PAREN:
23331 ffestb_subrargs_.name_list.args = ffestt_tokenlist_create ();
23332 ffestb_subrargs_.name_list.handler
23333 = (ffelexHandler) ffestb_decl_funcname_5_;
23334 ffestb_subrargs_.name_list.is_subr = FALSE;
23335 ffestb_subrargs_.name_list.names = FALSE;
23336 return (ffelexHandler) ffestb_subr_name_list_;
23342 if (ffestb_local_.decl.recursive != NULL)
23343 ffelex_token_kill (ffestb_local_.decl.recursive);
23344 if (ffestb_local_.decl.kindt != NULL)
23345 ffelex_token_kill (ffestb_local_.decl.kindt);
23346 if (ffestb_local_.decl.lent != NULL)
23347 ffelex_token_kill (ffestb_local_.decl.lent);
23348 ffelex_token_kill (ffesta_tokens[1]);
23349 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23350 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23353 /* ffestb_decl_funcname_5_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23354 NAME [type parameter] OPEN_PAREN arg-list
23357 return ffestb_decl_funcname_5_; // to lexer
23359 Must have EOS/SEMICOLON or "RESULT" here. */
23361 static ffelexHandler
23362 ffestb_decl_funcname_5_ (ffelexToken t)
23364 if (!ffestb_subrargs_.name_list.ok)
23365 goto bad; /* :::::::::::::::::::: */
23367 switch (ffelex_token_type (t))
23369 case FFELEX_typeEOS:
23370 case FFELEX_typeSEMICOLON:
23371 ffesta_confirmed ();
23372 if (!ffesta_is_inhibited ())
23373 ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
23374 ffestb_subrargs_.name_list.close_paren, ffestb_local_.decl.type,
23375 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
23376 ffestb_local_.decl.len, ffestb_local_.decl.lent,
23377 ffestb_local_.decl.recursive, NULL);
23378 if (ffestb_local_.decl.recursive != NULL)
23379 ffelex_token_kill (ffestb_local_.decl.recursive);
23380 if (ffestb_local_.decl.kindt != NULL)
23381 ffelex_token_kill (ffestb_local_.decl.kindt);
23382 if (ffestb_local_.decl.lent != NULL)
23383 ffelex_token_kill (ffestb_local_.decl.lent);
23384 ffelex_token_kill (ffesta_tokens[1]);
23385 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23386 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23387 return (ffelexHandler) ffesta_zero (t);
23389 case FFELEX_typeNAME:
23390 if (ffestr_other (t) != FFESTR_otherRESULT)
23392 return (ffelexHandler) ffestb_decl_funcname_6_;
23398 bad: /* :::::::::::::::::::: */
23399 if (ffestb_local_.decl.recursive != NULL)
23400 ffelex_token_kill (ffestb_local_.decl.recursive);
23401 if (ffestb_local_.decl.kindt != NULL)
23402 ffelex_token_kill (ffestb_local_.decl.kindt);
23403 if (ffestb_local_.decl.lent != NULL)
23404 ffelex_token_kill (ffestb_local_.decl.lent);
23405 ffelex_token_kill (ffesta_tokens[1]);
23406 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23407 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23408 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23409 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23412 /* ffestb_decl_funcname_6_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23413 NAME [type parameter] OPEN_PAREN arglist
23414 CLOSE_PAREN "RESULT"
23416 return ffestb_decl_funcname_6_; // to lexer
23418 Make sure the next token is an OPEN_PAREN. */
23420 static ffelexHandler
23421 ffestb_decl_funcname_6_ (ffelexToken t)
23423 switch (ffelex_token_type (t))
23425 case FFELEX_typeOPEN_PAREN:
23426 return (ffelexHandler) ffestb_decl_funcname_7_;
23432 if (ffestb_local_.decl.recursive != NULL)
23433 ffelex_token_kill (ffestb_local_.decl.recursive);
23434 if (ffestb_local_.decl.kindt != NULL)
23435 ffelex_token_kill (ffestb_local_.decl.kindt);
23436 if (ffestb_local_.decl.lent != NULL)
23437 ffelex_token_kill (ffestb_local_.decl.lent);
23438 ffelex_token_kill (ffesta_tokens[1]);
23439 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23440 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23441 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23442 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23445 /* ffestb_decl_funcname_7_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23446 NAME [type parameter] OPEN_PAREN arglist
23447 CLOSE_PAREN "RESULT" OPEN_PAREN
23449 return ffestb_decl_funcname_7_; // to lexer
23451 Make sure the next token is a NAME. */
23453 static ffelexHandler
23454 ffestb_decl_funcname_7_ (ffelexToken t)
23456 switch (ffelex_token_type (t))
23458 case FFELEX_typeNAME:
23459 ffesta_tokens[2] = ffelex_token_use (t);
23460 return (ffelexHandler) ffestb_decl_funcname_8_;
23466 if (ffestb_local_.decl.recursive != NULL)
23467 ffelex_token_kill (ffestb_local_.decl.recursive);
23468 if (ffestb_local_.decl.kindt != NULL)
23469 ffelex_token_kill (ffestb_local_.decl.kindt);
23470 if (ffestb_local_.decl.lent != NULL)
23471 ffelex_token_kill (ffestb_local_.decl.lent);
23472 ffelex_token_kill (ffesta_tokens[1]);
23473 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23474 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23475 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23476 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23479 /* ffestb_decl_funcname_8_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23480 NAME [type parameter] OPEN_PAREN arglist
23481 CLOSE_PAREN "RESULT" OPEN_PAREN NAME
23483 return ffestb_decl_funcname_8_; // to lexer
23485 Make sure the next token is a CLOSE_PAREN. */
23487 static ffelexHandler
23488 ffestb_decl_funcname_8_ (ffelexToken t)
23490 switch (ffelex_token_type (t))
23492 case FFELEX_typeCLOSE_PAREN:
23493 return (ffelexHandler) ffestb_decl_funcname_9_;
23499 if (ffestb_local_.decl.recursive != NULL)
23500 ffelex_token_kill (ffestb_local_.decl.recursive);
23501 if (ffestb_local_.decl.kindt != NULL)
23502 ffelex_token_kill (ffestb_local_.decl.kindt);
23503 if (ffestb_local_.decl.lent != NULL)
23504 ffelex_token_kill (ffestb_local_.decl.lent);
23505 ffelex_token_kill (ffesta_tokens[1]);
23506 ffelex_token_kill (ffesta_tokens[2]);
23507 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23508 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23509 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23510 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23513 /* ffestb_decl_funcname_9_ -- "type" [type parameters] [RECURSIVE] FUNCTION
23514 NAME [type parameter] OPEN_PAREN arg-list
23515 CLOSE_PAREN "RESULT" OPEN_PAREN NAME CLOSE_PAREN
23517 return ffestb_decl_funcname_9_; // to lexer
23519 Must have EOS/SEMICOLON here. */
23521 static ffelexHandler
23522 ffestb_decl_funcname_9_ (ffelexToken t)
23524 switch (ffelex_token_type (t))
23526 case FFELEX_typeEOS:
23527 case FFELEX_typeSEMICOLON:
23528 if (!ffesta_is_inhibited ())
23529 ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args,
23530 ffestb_subrargs_.name_list.close_paren, ffestb_local_.decl.type,
23531 ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
23532 ffestb_local_.decl.len, ffestb_local_.decl.lent,
23533 ffestb_local_.decl.recursive, ffesta_tokens[2]);
23534 if (ffestb_local_.decl.recursive != NULL)
23535 ffelex_token_kill (ffestb_local_.decl.recursive);
23536 if (ffestb_local_.decl.kindt != NULL)
23537 ffelex_token_kill (ffestb_local_.decl.kindt);
23538 if (ffestb_local_.decl.lent != NULL)
23539 ffelex_token_kill (ffestb_local_.decl.lent);
23540 ffelex_token_kill (ffesta_tokens[1]);
23541 ffelex_token_kill (ffesta_tokens[2]);
23542 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23543 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23544 return (ffelexHandler) ffesta_zero (t);
23550 if (ffestb_local_.decl.recursive != NULL)
23551 ffelex_token_kill (ffestb_local_.decl.recursive);
23552 if (ffestb_local_.decl.kindt != NULL)
23553 ffelex_token_kill (ffestb_local_.decl.kindt);
23554 if (ffestb_local_.decl.lent != NULL)
23555 ffelex_token_kill (ffestb_local_.decl.lent);
23556 ffelex_token_kill (ffesta_tokens[1]);
23557 ffelex_token_kill (ffesta_tokens[2]);
23558 ffelex_token_kill (ffestb_subrargs_.name_list.close_paren);
23559 ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args);
23560 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
23561 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23564 /* ffestb_V003 -- Parse the STRUCTURE statement
23566 return ffestb_V003; // to lexer
23568 Make sure the statement has a valid form for the STRUCTURE statement.
23569 If it does, implement the statement. */
23573 ffestb_V003 (ffelexToken t)
23578 ffelexHandler next;
23580 switch (ffelex_token_type (ffesta_tokens[0]))
23582 case FFELEX_typeNAME:
23583 if (ffesta_first_kw != FFESTR_firstSTRUCTURE)
23584 goto bad_0; /* :::::::::::::::::::: */
23585 switch (ffelex_token_type (t))
23587 case FFELEX_typeCOMMA:
23588 case FFELEX_typeCOLONCOLON:
23589 case FFELEX_typeEOS:
23590 case FFELEX_typeSEMICOLON:
23591 ffesta_confirmed (); /* Error, but clearly intended. */
23592 goto bad_1; /* :::::::::::::::::::: */
23595 goto bad_1; /* :::::::::::::::::::: */
23597 case FFELEX_typeNAME:
23598 ffesta_confirmed ();
23599 if (!ffesta_is_inhibited ())
23600 ffestc_V003_start (NULL);
23601 ffestb_local_.structure.started = TRUE;
23602 return (ffelexHandler) ffestb_V0034_ (t);
23604 case FFELEX_typeSLASH:
23605 ffesta_confirmed ();
23606 return (ffelexHandler) ffestb_V0031_;
23609 case FFELEX_typeNAMES:
23610 if (ffesta_first_kw != FFESTR_firstSTRUCTURE)
23611 goto bad_0; /* :::::::::::::::::::: */
23612 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSTRUCTURE);
23613 switch (ffelex_token_type (t))
23616 goto bad_1; /* :::::::::::::::::::: */
23618 case FFELEX_typeEOS:
23619 case FFELEX_typeSEMICOLON:
23620 case FFELEX_typeCOMMA:
23621 case FFELEX_typeCOLONCOLON:
23622 ffesta_confirmed ();
23625 case FFELEX_typeSLASH:
23626 ffesta_confirmed ();
23628 goto bad_1; /* :::::::::::::::::::: */
23629 return (ffelexHandler) ffestb_V0031_;
23631 case FFELEX_typeOPEN_PAREN:
23635 /* Here, we have at least one char after "STRUCTURE" and t is COMMA,
23636 EOS/SEMICOLON, or OPEN_PAREN. */
23638 if (!ffesrc_is_name_init (*p))
23639 goto bad_i; /* :::::::::::::::::::: */
23640 nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
23641 if (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN)
23642 ffestb_local_.structure.started = FALSE;
23645 if (!ffesta_is_inhibited ())
23646 ffestc_V003_start (NULL);
23647 ffestb_local_.structure.started = TRUE;
23649 next = (ffelexHandler) ffestb_V0034_ (nt);
23650 ffelex_token_kill (nt);
23651 return (ffelexHandler) (*next) (t);
23654 goto bad_0; /* :::::::::::::::::::: */
23657 bad_0: /* :::::::::::::::::::: */
23658 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", ffesta_tokens[0]);
23659 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23661 bad_1: /* :::::::::::::::::::: */
23662 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23663 return (ffelexHandler) ffelex_swallow_tokens (t,
23664 (ffelexHandler) ffesta_zero); /* Invalid second token. */
23666 bad_i: /* :::::::::::::::::::: */
23667 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", ffesta_tokens[0], i, t);
23668 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23671 /* ffestb_V0031_ -- "STRUCTURE" SLASH
23673 return ffestb_V0031_; // to lexer
23677 static ffelexHandler
23678 ffestb_V0031_ (ffelexToken t)
23680 switch (ffelex_token_type (t))
23682 case FFELEX_typeNAME:
23683 ffesta_tokens[1] = ffelex_token_use (t);
23684 return (ffelexHandler) ffestb_V0032_;
23687 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23691 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23694 /* ffestb_V0032_ -- "STRUCTURE" SLASH NAME
23696 return ffestb_V0032_; // to lexer
23700 static ffelexHandler
23701 ffestb_V0032_ (ffelexToken t)
23703 switch (ffelex_token_type (t))
23705 case FFELEX_typeSLASH:
23706 if (!ffesta_is_inhibited ())
23707 ffestc_V003_start (ffesta_tokens[1]);
23708 ffestb_local_.structure.started = TRUE;
23709 ffelex_token_kill (ffesta_tokens[1]);
23710 return (ffelexHandler) ffestb_V0033_;
23713 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23717 ffelex_token_kill (ffesta_tokens[1]);
23718 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23721 /* ffestb_V0033_ -- "STRUCTURE" SLASH NAME SLASH
23723 return ffestb_V0033_; // to lexer
23725 Handle NAME or EOS/SEMICOLON. */
23727 static ffelexHandler
23728 ffestb_V0033_ (ffelexToken t)
23730 switch (ffelex_token_type (t))
23732 case FFELEX_typeNAME:
23733 return (ffelexHandler) ffestb_V0034_ (t);
23735 case FFELEX_typeEOS:
23736 case FFELEX_typeSEMICOLON:
23737 if (!ffesta_is_inhibited ())
23738 ffestc_V003_finish ();
23739 return (ffelexHandler) ffesta_zero (t);
23742 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23746 ffelex_token_kill (ffesta_tokens[1]);
23747 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23750 /* ffestb_V0034_ -- "STRUCTURE" [SLASH NAME SLASH]
23752 return ffestb_V0034_; // to lexer
23756 static ffelexHandler
23757 ffestb_V0034_ (ffelexToken t)
23759 switch (ffelex_token_type (t))
23761 case FFELEX_typeNAME:
23762 ffesta_tokens[1] = ffelex_token_use (t);
23763 return (ffelexHandler) ffestb_V0035_;
23766 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23770 if (!ffesta_is_inhibited ())
23771 ffestc_V003_finish ();
23772 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23775 /* ffestb_V0035_ -- "STRUCTURE" ... NAME
23777 return ffestb_V0035_; // to lexer
23779 Handle OPEN_PAREN. */
23781 static ffelexHandler
23782 ffestb_V0035_ (ffelexToken t)
23784 switch (ffelex_token_type (t))
23786 case FFELEX_typeOPEN_PAREN:
23787 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
23788 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_V0036_;
23789 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
23790 ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON;
23791 #ifdef FFECOM_dimensionsMAX
23792 ffestb_subrargs_.dim_list.ndims = 0;
23794 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
23795 FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_);
23797 case FFELEX_typeCOMMA:
23798 if (!ffesta_is_inhibited ())
23799 ffestc_V003_item (ffesta_tokens[1], NULL);
23800 ffelex_token_kill (ffesta_tokens[1]);
23801 return (ffelexHandler) ffestb_V0034_;
23803 case FFELEX_typeEOS:
23804 case FFELEX_typeSEMICOLON:
23805 if (!ffesta_is_inhibited ())
23807 ffestc_V003_item (ffesta_tokens[1], NULL);
23808 ffestc_V003_finish ();
23810 ffelex_token_kill (ffesta_tokens[1]);
23811 return (ffelexHandler) ffesta_zero (t);
23814 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23818 if (!ffesta_is_inhibited ())
23819 ffestc_V003_finish ();
23820 ffelex_token_kill (ffesta_tokens[1]);
23821 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23824 /* ffestb_V0036_ -- "STRUCTURE" ... NAME OPEN_PAREN dimlist CLOSE_PAREN
23826 return ffestb_V0036_; // to lexer
23828 Handle COMMA or EOS/SEMICOLON. */
23830 static ffelexHandler
23831 ffestb_V0036_ (ffelexToken t)
23833 if (!ffestb_subrargs_.dim_list.ok)
23834 goto bad; /* :::::::::::::::::::: */
23836 switch (ffelex_token_type (t))
23838 case FFELEX_typeCOMMA:
23839 ffesta_confirmed ();
23840 if (!ffesta_is_inhibited ())
23842 if (!ffestb_local_.structure.started)
23844 ffestc_V003_start (NULL);
23845 ffestb_local_.structure.started = TRUE;
23847 ffestc_V003_item (ffesta_tokens[1],
23848 ffestb_subrargs_.dim_list.dims);
23850 ffelex_token_kill (ffesta_tokens[1]);
23851 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
23852 return (ffelexHandler) ffestb_V0034_;
23854 case FFELEX_typeEOS:
23855 case FFELEX_typeSEMICOLON:
23856 ffesta_confirmed ();
23857 if (!ffesta_is_inhibited ())
23859 if (!ffestb_local_.structure.started)
23860 ffestc_V003_start (NULL);
23861 ffestc_V003_item (ffesta_tokens[1],
23862 ffestb_subrargs_.dim_list.dims);
23863 ffestc_V003_finish ();
23865 ffelex_token_kill (ffesta_tokens[1]);
23866 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
23867 return (ffelexHandler) ffesta_zero (t);
23873 bad: /* :::::::::::::::::::: */
23874 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t);
23875 if (ffestb_local_.structure.started && !ffesta_is_inhibited ())
23876 ffestc_V003_finish ();
23877 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
23878 ffelex_token_kill (ffesta_tokens[1]);
23879 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23882 /* ffestb_V016 -- Parse the RECORD statement
23884 return ffestb_V016; // to lexer
23886 Make sure the statement has a valid form for the RECORD statement. If it
23887 does, implement the statement. */
23890 ffestb_V016 (ffelexToken t)
23895 switch (ffelex_token_type (ffesta_tokens[0]))
23897 case FFELEX_typeNAME:
23898 if (ffesta_first_kw != FFESTR_firstRECORD)
23899 goto bad_0; /* :::::::::::::::::::: */
23902 case FFELEX_typeNAMES:
23903 if (ffesta_first_kw != FFESTR_firstRECORD)
23904 goto bad_0; /* :::::::::::::::::::: */
23905 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlRECORD);
23907 goto bad_i; /* :::::::::::::::::::: */
23911 goto bad_0; /* :::::::::::::::::::: */
23914 switch (ffelex_token_type (t))
23916 case FFELEX_typeCOMMA:
23917 case FFELEX_typeEOS:
23918 case FFELEX_typeSEMICOLON:
23919 case FFELEX_typeCOLONCOLON:
23920 ffesta_confirmed (); /* Error, but clearly intended. */
23921 goto bad_1; /* :::::::::::::::::::: */
23924 goto bad_1; /* :::::::::::::::::::: */
23926 case FFELEX_typeSLASH:
23930 ffesta_confirmed ();
23931 if (!ffesta_is_inhibited ())
23932 ffestc_V016_start ();
23933 return (ffelexHandler) ffestb_V0161_;
23935 bad_0: /* :::::::::::::::::::: */
23936 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", ffesta_tokens[0]);
23937 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23939 bad_1: /* :::::::::::::::::::: */
23940 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
23941 return (ffelexHandler) ffelex_swallow_tokens (t,
23942 (ffelexHandler) ffesta_zero); /* Invalid second token. */
23944 bad_i: /* :::::::::::::::::::: */
23945 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "RECORD", ffesta_tokens[0], i, t);
23946 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23949 /* ffestb_V0161_ -- "RECORD" SLASH
23951 return ffestb_V0161_; // to lexer
23955 static ffelexHandler
23956 ffestb_V0161_ (ffelexToken t)
23958 switch (ffelex_token_type (t))
23960 case FFELEX_typeNAME:
23961 if (!ffesta_is_inhibited ())
23962 ffestc_V016_item_structure (t);
23963 return (ffelexHandler) ffestb_V0162_;
23966 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
23970 if (!ffesta_is_inhibited ())
23971 ffestc_V016_finish ();
23972 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23975 /* ffestb_V0162_ -- "RECORD" SLASH NAME
23977 return ffestb_V0162_; // to lexer
23981 static ffelexHandler
23982 ffestb_V0162_ (ffelexToken t)
23984 switch (ffelex_token_type (t))
23986 case FFELEX_typeSLASH:
23987 return (ffelexHandler) ffestb_V0163_;
23990 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
23994 if (!ffesta_is_inhibited ())
23995 ffestc_V016_finish ();
23996 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
23999 /* ffestb_V0163_ -- "RECORD" SLASH NAME SLASH
24001 return ffestb_V0163_; // to lexer
24005 static ffelexHandler
24006 ffestb_V0163_ (ffelexToken t)
24008 switch (ffelex_token_type (t))
24010 case FFELEX_typeNAME:
24011 ffesta_tokens[1] = ffelex_token_use (t);
24012 return (ffelexHandler) ffestb_V0164_;
24015 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
24019 if (!ffesta_is_inhibited ())
24020 ffestc_V016_finish ();
24021 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24024 /* ffestb_V0164_ -- "RECORD" ... NAME
24026 return ffestb_V0164_; // to lexer
24028 Handle OPEN_PAREN. */
24030 static ffelexHandler
24031 ffestb_V0164_ (ffelexToken t)
24033 switch (ffelex_token_type (t))
24035 case FFELEX_typeOPEN_PAREN:
24036 ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create ();
24037 ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_V0165_;
24038 ffestb_subrargs_.dim_list.pool = ffesta_output_pool;
24039 ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON;
24040 #ifdef FFECOM_dimensionsMAX
24041 ffestb_subrargs_.dim_list.ndims = 0;
24043 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
24044 FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_);
24046 case FFELEX_typeCOMMA:
24047 if (!ffesta_is_inhibited ())
24048 ffestc_V016_item_object (ffesta_tokens[1], NULL);
24049 ffelex_token_kill (ffesta_tokens[1]);
24050 return (ffelexHandler) ffestb_V0166_;
24052 case FFELEX_typeEOS:
24053 case FFELEX_typeSEMICOLON:
24054 if (!ffesta_is_inhibited ())
24056 ffestc_V016_item_object (ffesta_tokens[1], NULL);
24057 ffestc_V016_finish ();
24059 ffelex_token_kill (ffesta_tokens[1]);
24060 return (ffelexHandler) ffesta_zero (t);
24063 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
24067 if (!ffesta_is_inhibited ())
24068 ffestc_V016_finish ();
24069 ffelex_token_kill (ffesta_tokens[1]);
24070 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24073 /* ffestb_V0165_ -- "RECORD" ... NAME OPEN_PAREN dimlist CLOSE_PAREN
24075 return ffestb_V0165_; // to lexer
24077 Handle COMMA or EOS/SEMICOLON. */
24079 static ffelexHandler
24080 ffestb_V0165_ (ffelexToken t)
24082 if (!ffestb_subrargs_.dim_list.ok)
24083 goto bad; /* :::::::::::::::::::: */
24085 switch (ffelex_token_type (t))
24087 case FFELEX_typeCOMMA:
24088 if (!ffesta_is_inhibited ())
24089 ffestc_V016_item_object (ffesta_tokens[1],
24090 ffestb_subrargs_.dim_list.dims);
24091 ffelex_token_kill (ffesta_tokens[1]);
24092 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
24093 return (ffelexHandler) ffestb_V0166_;
24095 case FFELEX_typeEOS:
24096 case FFELEX_typeSEMICOLON:
24097 if (!ffesta_is_inhibited ())
24099 ffestc_V016_item_object (ffesta_tokens[1],
24100 ffestb_subrargs_.dim_list.dims);
24101 ffestc_V016_finish ();
24103 ffelex_token_kill (ffesta_tokens[1]);
24104 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
24105 return (ffelexHandler) ffesta_zero (t);
24111 bad: /* :::::::::::::::::::: */
24112 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
24113 if (ffestb_local_.structure.started && !ffesta_is_inhibited ())
24114 ffestc_V016_finish ();
24115 ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims);
24116 ffelex_token_kill (ffesta_tokens[1]);
24117 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24120 /* ffestb_V0166_ -- "RECORD" SLASH NAME SLASH NAME [OPEN_PAREN dimlist
24123 return ffestb_V0166_; // to lexer
24125 Handle NAME or SLASH. */
24127 static ffelexHandler
24128 ffestb_V0166_ (ffelexToken t)
24130 switch (ffelex_token_type (t))
24132 case FFELEX_typeNAME:
24133 ffesta_tokens[1] = ffelex_token_use (t);
24134 return (ffelexHandler) ffestb_V0164_;
24136 case FFELEX_typeSLASH:
24137 return (ffelexHandler) ffestb_V0161_;
24140 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t);
24144 if (!ffesta_is_inhibited ())
24145 ffestc_V016_finish ();
24146 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24150 /* ffestb_V027 -- Parse the VXT PARAMETER statement
24152 return ffestb_V027; // to lexer
24154 Make sure the statement has a valid form for the VXT PARAMETER statement.
24155 If it does, implement the statement. */
24158 ffestb_V027 (ffelexToken t)
24163 switch (ffelex_token_type (ffesta_tokens[0]))
24165 case FFELEX_typeNAME:
24166 if (ffesta_first_kw != FFESTR_firstPARAMETER)
24167 goto bad_0; /* :::::::::::::::::::: */
24168 switch (ffelex_token_type (t))
24170 case FFELEX_typeNAME:
24174 goto bad_1; /* :::::::::::::::::::: */
24176 ffesta_confirmed ();
24177 ffestb_local_.vxtparam.started = TRUE;
24178 if (!ffesta_is_inhibited ())
24179 ffestc_V027_start ();
24180 ffesta_tokens[1] = ffelex_token_use (t);
24181 return (ffelexHandler) ffestb_V0271_;
24183 case FFELEX_typeNAMES:
24184 if (ffesta_first_kw != FFESTR_firstPARAMETER)
24185 goto bad_0; /* :::::::::::::::::::: */
24186 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlPARAMETER);
24187 switch (ffelex_token_type (t))
24189 case FFELEX_typeEQUALS:
24193 goto bad_1; /* :::::::::::::::::::: */
24195 if (!ffesrc_is_name_init (*p))
24196 goto bad_i; /* :::::::::::::::::::: */
24197 ffestb_local_.vxtparam.started = FALSE;
24198 ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i,
24200 return (ffelexHandler) ffestb_V0271_ (t);
24203 goto bad_0; /* :::::::::::::::::::: */
24206 bad_0: /* :::::::::::::::::::: */
24207 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0]);
24208 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24210 bad_1: /* :::::::::::::::::::: */
24211 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
24212 return (ffelexHandler) ffelex_swallow_tokens (t,
24213 (ffelexHandler) ffesta_zero); /* Invalid second token. */
24215 bad_i: /* :::::::::::::::::::: */
24216 ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0], i, t);
24217 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24220 /* ffestb_V0271_ -- "PARAMETER" NAME
24222 return ffestb_V0271_; // to lexer
24226 static ffelexHandler
24227 ffestb_V0271_ (ffelexToken t)
24229 switch (ffelex_token_type (t))
24231 case FFELEX_typeEQUALS:
24232 return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
24233 FFEEXPR_contextPARAMETER, (ffeexprCallback) ffestb_V0272_);
24236 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
24240 ffelex_token_kill (ffesta_tokens[1]);
24241 if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ())
24242 ffestc_V027_finish ();
24243 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24246 /* ffestb_V0272_ -- "PARAMETER" NAME EQUALS expr
24248 (ffestb_V0272_) // to expression handler
24250 Handle COMMA or EOS/SEMICOLON. */
24252 static ffelexHandler
24253 ffestb_V0272_ (ffelexToken ft, ffebld expr, ffelexToken t)
24255 switch (ffelex_token_type (t))
24257 case FFELEX_typeEOS:
24258 case FFELEX_typeSEMICOLON:
24259 if (!ffestb_local_.vxtparam.started)
24261 if (ffestc_is_let_not_V027 ())
24262 break; /* Not a valid VXTPARAMETER stmt. */
24263 ffesta_confirmed ();
24264 if (!ffesta_is_inhibited ())
24265 ffestc_V027_start ();
24266 ffestb_local_.vxtparam.started = TRUE;
24270 if (!ffesta_is_inhibited ())
24272 ffestc_V027_item (ffesta_tokens[1], expr, ft);
24273 ffestc_V027_finish ();
24275 ffelex_token_kill (ffesta_tokens[1]);
24276 return (ffelexHandler) ffesta_zero (t);
24278 case FFELEX_typeCOMMA:
24279 ffesta_confirmed ();
24280 if (!ffestb_local_.vxtparam.started)
24282 if (!ffesta_is_inhibited ())
24283 ffestc_V027_start ();
24284 ffestb_local_.vxtparam.started = TRUE;
24288 if (!ffesta_is_inhibited ())
24289 ffestc_V027_item (ffesta_tokens[1], expr, ft);
24290 ffelex_token_kill (ffesta_tokens[1]);
24291 return (ffelexHandler) ffestb_V0273_;
24297 ffelex_token_kill (ffesta_tokens[1]);
24298 if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ())
24299 ffestc_V027_finish ();
24300 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
24301 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24304 /* ffestb_V0273_ -- "PARAMETER" NAME EQUALS expr COMMA
24306 return ffestb_V0273_; // to lexer
24310 static ffelexHandler
24311 ffestb_V0273_ (ffelexToken t)
24313 switch (ffelex_token_type (t))
24315 case FFELEX_typeNAME:
24316 ffesta_tokens[1] = ffelex_token_use (t);
24317 return (ffelexHandler) ffestb_V0271_;
24320 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t);
24324 if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ())
24325 ffestc_V027_finish ();
24326 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24329 /* ffestb_decl_R539 -- Parse the IMPLICIT FUNCTION statement
24331 return ffestb_decl_R539; // to lexer
24333 Make sure the statement has a valid form for the IMPLICIT
24334 statement. If it does, implement the statement. */
24337 ffestb_decl_R539 (ffelexToken t)
24344 ffestb_local_.decl.recursive = NULL;
24346 switch (ffelex_token_type (ffesta_tokens[0]))
24348 case FFELEX_typeNAME:
24349 if (ffesta_first_kw != FFESTR_firstIMPLICIT)
24350 goto bad_0; /* :::::::::::::::::::: */
24351 switch (ffelex_token_type (t))
24353 case FFELEX_typeEOS:
24354 case FFELEX_typeSEMICOLON:
24355 case FFELEX_typeCOMMA:
24356 case FFELEX_typeCOLONCOLON:
24357 ffesta_confirmed (); /* Error, but clearly intended. */
24358 goto bad_1; /* :::::::::::::::::::: */
24361 goto bad_1; /* :::::::::::::::::::: */
24363 case FFELEX_typeNAME:
24366 ffesta_confirmed ();
24367 ffestb_local_.decl.imp_started = FALSE;
24368 switch (ffesta_second_kw)
24370 case FFESTR_secondINTEGER:
24371 ffestb_local_.decl.type = FFESTP_typeINTEGER;
24372 return (ffelexHandler) ffestb_decl_R5391_;
24374 case FFESTR_secondBYTE:
24375 ffestb_local_.decl.type = FFESTP_typeBYTE;
24376 return (ffelexHandler) ffestb_decl_R5391_;
24378 case FFESTR_secondWORD:
24379 ffestb_local_.decl.type = FFESTP_typeWORD;
24380 return (ffelexHandler) ffestb_decl_R5391_;
24382 case FFESTR_secondREAL:
24383 ffestb_local_.decl.type = FFESTP_typeREAL;
24384 return (ffelexHandler) ffestb_decl_R5391_;
24386 case FFESTR_secondCOMPLEX:
24387 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
24388 return (ffelexHandler) ffestb_decl_R5391_;
24390 case FFESTR_secondLOGICAL:
24391 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
24392 return (ffelexHandler) ffestb_decl_R5391_;
24394 case FFESTR_secondCHARACTER:
24395 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
24396 return (ffelexHandler) ffestb_decl_R5391_;
24398 case FFESTR_secondDOUBLE:
24399 return (ffelexHandler) ffestb_decl_R5392_;
24401 case FFESTR_secondDOUBLEPRECISION:
24402 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
24403 ffestb_local_.decl.kind = NULL;
24404 ffestb_local_.decl.kindt = NULL;
24405 ffestb_local_.decl.len = NULL;
24406 ffestb_local_.decl.lent = NULL;
24407 return (ffelexHandler) ffestb_decl_R539letters_;
24409 case FFESTR_secondDOUBLECOMPLEX:
24410 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
24411 ffestb_local_.decl.kind = NULL;
24412 ffestb_local_.decl.kindt = NULL;
24413 ffestb_local_.decl.len = NULL;
24414 ffestb_local_.decl.lent = NULL;
24415 return (ffelexHandler) ffestb_decl_R539letters_;
24417 case FFESTR_secondNONE:
24418 return (ffelexHandler) ffestb_decl_R5394_;
24421 case FFESTR_secondTYPE:
24422 ffestb_local_.decl.type = FFESTP_typeTYPE;
24423 return (ffelexHandler) ffestb_decl_R5393_;
24427 goto bad_1; /* :::::::::::::::::::: */
24430 case FFELEX_typeNAMES:
24431 if (ffesta_first_kw != FFESTR_firstIMPLICIT)
24432 goto bad_0; /* :::::::::::::::::::: */
24433 switch (ffelex_token_type (t))
24435 case FFELEX_typeCOMMA:
24436 case FFELEX_typeCOLONCOLON:
24437 case FFELEX_typeASTERISK:
24438 case FFELEX_typeSEMICOLON:
24439 case FFELEX_typeEOS:
24440 ffesta_confirmed ();
24443 case FFELEX_typeOPEN_PAREN:
24447 goto bad_1; /* :::::::::::::::::::: */
24449 p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlIMPLICIT);
24450 if (!ffesrc_is_name_init (*p))
24451 goto bad_0; /* :::::::::::::::::::: */
24452 ffestb_local_.decl.imp_started = FALSE;
24453 nt = ffelex_token_name_from_names (ffesta_tokens[0],
24454 FFESTR_firstlIMPLICIT, 0);
24455 kw = ffestr_second (nt);
24456 ffelex_token_kill (nt);
24459 case FFESTR_secondINTEGER:
24460 ffestb_local_.decl.type = FFESTP_typeINTEGER;
24461 return (ffelexHandler) ffestb_decl_R5391_ (t);
24463 case FFESTR_secondBYTE:
24464 ffestb_local_.decl.type = FFESTP_typeBYTE;
24465 return (ffelexHandler) ffestb_decl_R5391_ (t);
24467 case FFESTR_secondWORD:
24468 ffestb_local_.decl.type = FFESTP_typeWORD;
24469 return (ffelexHandler) ffestb_decl_R5391_ (t);
24471 case FFESTR_secondREAL:
24472 ffestb_local_.decl.type = FFESTP_typeREAL;
24473 return (ffelexHandler) ffestb_decl_R5391_ (t);
24475 case FFESTR_secondCOMPLEX:
24476 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
24477 return (ffelexHandler) ffestb_decl_R5391_ (t);
24479 case FFESTR_secondLOGICAL:
24480 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
24481 return (ffelexHandler) ffestb_decl_R5391_ (t);
24483 case FFESTR_secondCHARACTER:
24484 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
24485 return (ffelexHandler) ffestb_decl_R5391_ (t);
24487 case FFESTR_secondDOUBLEPRECISION:
24488 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
24489 ffestb_local_.decl.kind = NULL;
24490 ffestb_local_.decl.kindt = NULL;
24491 ffestb_local_.decl.len = NULL;
24492 ffestb_local_.decl.lent = NULL;
24493 return (ffelexHandler) ffestb_decl_R539letters_ (t);
24495 case FFESTR_secondDOUBLECOMPLEX:
24496 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
24497 ffestb_local_.decl.kind = NULL;
24498 ffestb_local_.decl.kindt = NULL;
24499 ffestb_local_.decl.len = NULL;
24500 ffestb_local_.decl.lent = NULL;
24501 return (ffelexHandler) ffestb_decl_R539letters_ (t);
24503 case FFESTR_secondNONE:
24504 return (ffelexHandler) ffestb_decl_R5394_ (t);
24507 case FFESTR_secondTYPE:
24508 ffestb_local_.decl.type = FFESTP_typeTYPE;
24509 return (ffelexHandler) ffestb_decl_R5393_ (t);
24513 goto bad_1; /* :::::::::::::::::::: */
24517 goto bad_0; /* :::::::::::::::::::: */
24520 bad_0: /* :::::::::::::::::::: */
24521 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", ffesta_tokens[0]);
24522 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24524 bad_1: /* :::::::::::::::::::: */
24525 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24526 return (ffelexHandler) ffelex_swallow_tokens (t,
24527 (ffelexHandler) ffesta_zero); /* Invalid second token. */
24530 /* ffestb_decl_R5391_ -- "IMPLICIT" generic-type
24532 return ffestb_decl_R5391_; // to lexer
24534 Handle ASTERISK or OPEN_PAREN. */
24536 static ffelexHandler
24537 ffestb_decl_R5391_ (ffelexToken t)
24539 switch (ffelex_token_type (t))
24541 case FFELEX_typeASTERISK:
24542 ffesta_confirmed ();
24543 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_;
24544 ffestb_local_.decl.badname = "IMPLICIT";
24545 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
24546 return (ffelexHandler) ffestb_decl_starlen_;
24547 return (ffelexHandler) ffestb_decl_starkind_;
24549 case FFELEX_typeOPEN_PAREN:
24550 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_;
24551 ffestb_local_.decl.badname = "IMPLICIT";
24552 ffestb_local_.decl.kind = NULL;
24553 ffestb_local_.decl.kindt = NULL;
24554 ffestb_local_.decl.len = NULL;
24555 ffestb_local_.decl.lent = NULL;
24556 if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
24557 ffestb_local_.decl.imp_handler
24558 = (ffelexHandler) ffestb_decl_typeparams_;
24560 ffestb_local_.decl.imp_handler
24561 = (ffelexHandler) ffestb_decl_kindparam_;
24562 return (ffelexHandler) ffestb_decl_R539maybe_ (t);
24568 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24569 ffestc_R539finish ();
24570 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24571 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24574 /* ffestb_decl_R5392_ -- "IMPLICIT" "DOUBLE"
24576 return ffestb_decl_R5392_; // to lexer
24580 static ffelexHandler
24581 ffestb_decl_R5392_ (ffelexToken t)
24583 switch (ffelex_token_type (t))
24585 case FFELEX_typeNAME:
24586 switch (ffestr_second (t))
24588 case FFESTR_secondPRECISION:
24589 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
24592 case FFESTR_secondCOMPLEX:
24593 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
24597 goto bad; /* :::::::::::::::::::: */
24599 ffestb_local_.decl.kind = NULL;
24600 ffestb_local_.decl.kindt = NULL;
24601 ffestb_local_.decl.len = NULL;
24602 ffestb_local_.decl.lent = NULL;
24603 return (ffelexHandler) ffestb_decl_R539letters_;
24609 bad: /* :::::::::::::::::::: */
24610 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24611 ffestc_R539finish ();
24612 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24613 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24616 /* ffestb_decl_R5393_ -- "IMPLICIT" "TYPE"
24618 return ffestb_decl_R5393_; // to lexer
24620 Handle OPEN_PAREN. */
24623 static ffelexHandler
24624 ffestb_decl_R5393_ (ffelexToken t)
24626 switch (ffelex_token_type (t))
24628 case FFELEX_typeOPEN_PAREN:
24629 ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_;
24630 ffestb_local_.decl.badname = "IMPLICIT";
24631 return (ffelexHandler) ffestb_decl_typetype1_;
24637 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24638 ffestc_R539finish ();
24639 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24640 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24644 /* ffestb_decl_R5394_ -- "IMPLICIT" "NONE"
24646 return ffestb_decl_R5394_; // to lexer
24648 Handle EOS/SEMICOLON. */
24650 static ffelexHandler
24651 ffestb_decl_R5394_ (ffelexToken t)
24653 switch (ffelex_token_type (t))
24655 case FFELEX_typeEOS:
24656 case FFELEX_typeSEMICOLON:
24657 ffesta_confirmed ();
24658 if (!ffesta_is_inhibited ())
24659 ffestc_R539 (); /* IMPLICIT NONE. */
24660 return (ffelexHandler) ffesta_zero (t);
24666 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24667 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24670 /* ffestb_decl_R5395_ -- "IMPLICIT" implicit-spec-list COMMA
24672 return ffestb_decl_R5395_; // to lexer
24674 Handle NAME for next type-spec. */
24676 static ffelexHandler
24677 ffestb_decl_R5395_ (ffelexToken t)
24679 switch (ffelex_token_type (t))
24681 case FFELEX_typeNAME:
24682 switch (ffestr_second (t))
24684 case FFESTR_secondINTEGER:
24685 ffestb_local_.decl.type = FFESTP_typeINTEGER;
24686 return (ffelexHandler) ffestb_decl_R5391_;
24688 case FFESTR_secondBYTE:
24689 ffestb_local_.decl.type = FFESTP_typeBYTE;
24690 return (ffelexHandler) ffestb_decl_R5391_;
24692 case FFESTR_secondWORD:
24693 ffestb_local_.decl.type = FFESTP_typeWORD;
24694 return (ffelexHandler) ffestb_decl_R5391_;
24696 case FFESTR_secondREAL:
24697 ffestb_local_.decl.type = FFESTP_typeREAL;
24698 return (ffelexHandler) ffestb_decl_R5391_;
24700 case FFESTR_secondCOMPLEX:
24701 ffestb_local_.decl.type = FFESTP_typeCOMPLEX;
24702 return (ffelexHandler) ffestb_decl_R5391_;
24704 case FFESTR_secondLOGICAL:
24705 ffestb_local_.decl.type = FFESTP_typeLOGICAL;
24706 return (ffelexHandler) ffestb_decl_R5391_;
24708 case FFESTR_secondCHARACTER:
24709 ffestb_local_.decl.type = FFESTP_typeCHARACTER;
24710 return (ffelexHandler) ffestb_decl_R5391_;
24712 case FFESTR_secondDOUBLE:
24713 return (ffelexHandler) ffestb_decl_R5392_;
24715 case FFESTR_secondDOUBLEPRECISION:
24716 ffestb_local_.decl.type = FFESTP_typeDBLPRCSN;
24717 ffestb_local_.decl.kind = NULL;
24718 ffestb_local_.decl.kindt = NULL;
24719 ffestb_local_.decl.len = NULL;
24720 ffestb_local_.decl.lent = NULL;
24721 return (ffelexHandler) ffestb_decl_R539letters_;
24723 case FFESTR_secondDOUBLECOMPLEX:
24724 ffestb_local_.decl.type = FFESTP_typeDBLCMPLX;
24725 ffestb_local_.decl.kind = NULL;
24726 ffestb_local_.decl.kindt = NULL;
24727 ffestb_local_.decl.len = NULL;
24728 ffestb_local_.decl.lent = NULL;
24729 return (ffelexHandler) ffestb_decl_R539letters_;
24732 case FFESTR_secondTYPE:
24733 ffestb_local_.decl.type = FFESTP_typeTYPE;
24734 return (ffelexHandler) ffestb_decl_R5393_;
24746 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24747 ffestc_R539finish ();
24748 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24749 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24752 /* ffestb_decl_R539letters_ -- "IMPLICIT" type-spec
24754 return ffestb_decl_R539letters_; // to lexer
24756 Handle OPEN_PAREN. */
24758 static ffelexHandler
24759 ffestb_decl_R539letters_ (ffelexToken t)
24761 ffelex_set_names (FALSE);
24763 switch (ffelex_token_type (t))
24765 case FFELEX_typeOPEN_PAREN:
24766 ffestb_local_.decl.imps = ffestt_implist_create ();
24767 return (ffelexHandler) ffestb_decl_R539letters_1_;
24773 if (ffestb_local_.decl.kindt != NULL)
24774 ffelex_token_kill (ffestb_local_.decl.kindt);
24775 if (ffestb_local_.decl.lent != NULL)
24776 ffelex_token_kill (ffestb_local_.decl.lent);
24777 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24778 ffestc_R539finish ();
24779 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24780 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24783 /* ffestb_decl_R539letters_1_ -- "IMPLICIT" type-spec OPEN_PAREN
24785 return ffestb_decl_R539letters_1_; // to lexer
24789 static ffelexHandler
24790 ffestb_decl_R539letters_1_ (ffelexToken t)
24792 switch (ffelex_token_type (t))
24794 case FFELEX_typeNAME:
24795 if (ffelex_token_length (t) != 1)
24797 ffesta_tokens[1] = ffelex_token_use (t);
24798 return (ffelexHandler) ffestb_decl_R539letters_2_;
24804 ffestt_implist_kill (ffestb_local_.decl.imps);
24805 if (ffestb_local_.decl.kindt != NULL)
24806 ffelex_token_kill (ffestb_local_.decl.kindt);
24807 if (ffestb_local_.decl.lent != NULL)
24808 ffelex_token_kill (ffestb_local_.decl.lent);
24809 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24810 ffestc_R539finish ();
24811 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24812 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24815 /* ffestb_decl_R539letters_2_ -- "IMPLICIT" type-spec OPEN_PAREN NAME
24817 return ffestb_decl_R539letters_2_; // to lexer
24819 Handle COMMA or MINUS. */
24821 static ffelexHandler
24822 ffestb_decl_R539letters_2_ (ffelexToken t)
24824 switch (ffelex_token_type (t))
24826 case FFELEX_typeCOMMA:
24827 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL);
24828 return (ffelexHandler) ffestb_decl_R539letters_1_;
24830 case FFELEX_typeCLOSE_PAREN:
24831 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL);
24832 return (ffelexHandler) ffestb_decl_R539letters_5_;
24834 case FFELEX_typeMINUS:
24835 return (ffelexHandler) ffestb_decl_R539letters_3_;
24841 ffelex_token_kill (ffesta_tokens[1]);
24842 ffestt_implist_kill (ffestb_local_.decl.imps);
24843 if (ffestb_local_.decl.kindt != NULL)
24844 ffelex_token_kill (ffestb_local_.decl.kindt);
24845 if (ffestb_local_.decl.lent != NULL)
24846 ffelex_token_kill (ffestb_local_.decl.lent);
24847 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24848 ffestc_R539finish ();
24849 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24850 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24853 /* ffestb_decl_R539letters_3_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS
24855 return ffestb_decl_R539letters_3_; // to lexer
24859 static ffelexHandler
24860 ffestb_decl_R539letters_3_ (ffelexToken t)
24862 switch (ffelex_token_type (t))
24864 case FFELEX_typeNAME:
24865 if (ffelex_token_length (t) != 1)
24867 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1],
24868 ffelex_token_use (t));
24869 return (ffelexHandler) ffestb_decl_R539letters_4_;
24875 ffelex_token_kill (ffesta_tokens[1]);
24876 ffestt_implist_kill (ffestb_local_.decl.imps);
24877 if (ffestb_local_.decl.kindt != NULL)
24878 ffelex_token_kill (ffestb_local_.decl.kindt);
24879 if (ffestb_local_.decl.lent != NULL)
24880 ffelex_token_kill (ffestb_local_.decl.lent);
24881 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24882 ffestc_R539finish ();
24883 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24884 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24887 /* ffestb_decl_R539letters_4_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS
24890 return ffestb_decl_R539letters_4_; // to lexer
24892 Handle COMMA or CLOSE_PAREN. */
24894 static ffelexHandler
24895 ffestb_decl_R539letters_4_ (ffelexToken t)
24897 switch (ffelex_token_type (t))
24899 case FFELEX_typeCOMMA:
24900 return (ffelexHandler) ffestb_decl_R539letters_1_;
24902 case FFELEX_typeCLOSE_PAREN:
24903 return (ffelexHandler) ffestb_decl_R539letters_5_;
24909 ffestt_implist_kill (ffestb_local_.decl.imps);
24910 if (ffestb_local_.decl.kindt != NULL)
24911 ffelex_token_kill (ffestb_local_.decl.kindt);
24912 if (ffestb_local_.decl.lent != NULL)
24913 ffelex_token_kill (ffestb_local_.decl.lent);
24914 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24915 ffestc_R539finish ();
24916 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24917 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24920 /* ffestb_decl_R539letters_5_ -- "IMPLICIT" type-spec OPEN_PAREN
24921 letter-spec-list CLOSE_PAREN
24923 return ffestb_decl_R539letters_5_; // to lexer
24925 Handle COMMA or EOS/SEMICOLON. */
24927 static ffelexHandler
24928 ffestb_decl_R539letters_5_ (ffelexToken t)
24930 switch (ffelex_token_type (t))
24932 case FFELEX_typeCOMMA:
24933 case FFELEX_typeEOS:
24934 case FFELEX_typeSEMICOLON:
24935 if (!ffestb_local_.decl.imp_started)
24937 ffestb_local_.decl.imp_started = TRUE;
24938 ffesta_confirmed ();
24939 if (!ffesta_is_inhibited ())
24940 ffestc_R539start ();
24942 if (!ffesta_is_inhibited ())
24943 ffestc_R539item (ffestb_local_.decl.type, ffestb_local_.decl.kind,
24944 ffestb_local_.decl.kindt, ffestb_local_.decl.len,
24945 ffestb_local_.decl.lent, ffestb_local_.decl.imps);
24946 if (ffestb_local_.decl.kindt != NULL)
24947 ffelex_token_kill (ffestb_local_.decl.kindt);
24948 if (ffestb_local_.decl.lent != NULL)
24949 ffelex_token_kill (ffestb_local_.decl.lent);
24950 ffestt_implist_kill (ffestb_local_.decl.imps);
24951 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
24952 return (ffelexHandler) ffestb_decl_R5395_;
24953 if (!ffesta_is_inhibited ())
24954 ffestc_R539finish ();
24955 return (ffelexHandler) ffesta_zero (t);
24961 ffestt_implist_kill (ffestb_local_.decl.imps);
24962 if (ffestb_local_.decl.kindt != NULL)
24963 ffelex_token_kill (ffestb_local_.decl.kindt);
24964 if (ffestb_local_.decl.lent != NULL)
24965 ffelex_token_kill (ffestb_local_.decl.lent);
24966 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
24967 ffestc_R539finish ();
24968 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
24969 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
24972 /* ffestb_decl_R539maybe_ -- "IMPLICIT" generic-type-spec
24974 return ffestb_decl_R539maybe_; // to lexer
24976 Handle OPEN_PAREN. */
24978 static ffelexHandler
24979 ffestb_decl_R539maybe_ (ffelexToken t)
24981 assert (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN);
24982 ffestb_local_.decl.imps = ffestt_implist_create ();
24983 ffestb_local_.decl.toklist = ffestt_tokenlist_create ();
24984 ffestb_local_.decl.imp_seen_comma
24985 = (ffestb_local_.decl.type != FFESTP_typeCHARACTER);
24986 return (ffelexHandler) ffestb_decl_R539maybe_1_;
24989 /* ffestb_decl_R539maybe_1_ -- "IMPLICIT" generic-type-spec OPEN_PAREN
24991 return ffestb_decl_R539maybe_1_; // to lexer
24995 static ffelexHandler
24996 ffestb_decl_R539maybe_1_ (ffelexToken t)
24998 ffelexHandler next;
25000 switch (ffelex_token_type (t))
25002 case FFELEX_typeNAME:
25003 if (ffelex_token_length (t) != 1)
25005 ffesta_tokens[1] = ffelex_token_use (t);
25006 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25007 return (ffelexHandler) ffestb_decl_R539maybe_2_;
25013 ffestt_implist_kill (ffestb_local_.decl.imps);
25014 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25015 (ffelexHandler) ffestb_local_.decl.imp_handler);
25016 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25017 return (ffelexHandler) (*next) (t);
25020 /* ffestb_decl_R539maybe_2_ -- "IMPLICIT" generic-type-spec OPEN_PAREN NAME
25022 return ffestb_decl_R539maybe_2_; // to lexer
25024 Handle COMMA or MINUS. */
25026 static ffelexHandler
25027 ffestb_decl_R539maybe_2_ (ffelexToken t)
25029 ffelexHandler next;
25031 switch (ffelex_token_type (t))
25033 case FFELEX_typeCOMMA:
25034 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL);
25035 if (ffestb_local_.decl.imp_seen_comma)
25037 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25038 return (ffelexHandler) ffestb_decl_R539letters_1_;
25040 ffestb_local_.decl.imp_seen_comma = TRUE;
25041 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25042 return (ffelexHandler) ffestb_decl_R539maybe_1_;
25044 case FFELEX_typeCLOSE_PAREN:
25045 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL);
25046 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25047 return (ffelexHandler) ffestb_decl_R539maybe_5_;
25049 case FFELEX_typeMINUS:
25050 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25051 return (ffelexHandler) ffestb_decl_R539maybe_3_;
25057 ffelex_token_kill (ffesta_tokens[1]);
25058 ffestt_implist_kill (ffestb_local_.decl.imps);
25059 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25060 (ffelexHandler) ffestb_local_.decl.imp_handler);
25061 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25062 return (ffelexHandler) (*next) (t);
25065 /* ffestb_decl_R539maybe_3_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS
25067 return ffestb_decl_R539maybe_3_; // to lexer
25071 static ffelexHandler
25072 ffestb_decl_R539maybe_3_ (ffelexToken t)
25074 ffelexHandler next;
25076 switch (ffelex_token_type (t))
25078 case FFELEX_typeNAME:
25079 if (ffelex_token_length (t) != 1)
25081 ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1],
25082 ffelex_token_use (t));
25083 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25084 return (ffelexHandler) ffestb_decl_R539maybe_4_;
25090 ffelex_token_kill (ffesta_tokens[1]);
25091 ffestt_implist_kill (ffestb_local_.decl.imps);
25092 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25093 (ffelexHandler) ffestb_local_.decl.imp_handler);
25094 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25095 return (ffelexHandler) (*next) (t);
25098 /* ffestb_decl_R539maybe_4_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS
25101 return ffestb_decl_R539maybe_4_; // to lexer
25103 Handle COMMA or CLOSE_PAREN. */
25105 static ffelexHandler
25106 ffestb_decl_R539maybe_4_ (ffelexToken t)
25108 ffelexHandler next;
25110 switch (ffelex_token_type (t))
25112 case FFELEX_typeCOMMA:
25113 if (ffestb_local_.decl.imp_seen_comma)
25115 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25116 return (ffelexHandler) ffestb_decl_R539letters_1_;
25118 ffestb_local_.decl.imp_seen_comma = TRUE;
25119 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25120 return (ffelexHandler) ffestb_decl_R539maybe_1_;
25122 case FFELEX_typeCLOSE_PAREN:
25123 ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t));
25124 return (ffelexHandler) ffestb_decl_R539maybe_5_;
25130 ffestt_implist_kill (ffestb_local_.decl.imps);
25131 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25132 (ffelexHandler) ffestb_local_.decl.imp_handler);
25133 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25134 return (ffelexHandler) (*next) (t);
25137 /* ffestb_decl_R539maybe_5_ -- "IMPLICIT" type-spec OPEN_PAREN
25138 letter-spec-list CLOSE_PAREN
25140 return ffestb_decl_R539maybe_5_; // to lexer
25142 Handle COMMA or EOS/SEMICOLON. */
25144 static ffelexHandler
25145 ffestb_decl_R539maybe_5_ (ffelexToken t)
25147 ffelexHandler next;
25149 switch (ffelex_token_type (t))
25151 case FFELEX_typeCOMMA:
25152 case FFELEX_typeEOS:
25153 case FFELEX_typeSEMICOLON:
25154 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25155 if (!ffestb_local_.decl.imp_started)
25157 ffestb_local_.decl.imp_started = TRUE;
25158 ffesta_confirmed ();
25159 if (!ffesta_is_inhibited ())
25160 ffestc_R539start ();
25162 if (!ffesta_is_inhibited ())
25163 ffestc_R539item (ffestb_local_.decl.type, ffestb_local_.decl.kind,
25164 ffestb_local_.decl.kindt, ffestb_local_.decl.len,
25165 ffestb_local_.decl.lent, ffestb_local_.decl.imps);
25166 if (ffestb_local_.decl.kindt != NULL)
25167 ffelex_token_kill (ffestb_local_.decl.kindt);
25168 if (ffestb_local_.decl.lent != NULL)
25169 ffelex_token_kill (ffestb_local_.decl.lent);
25170 ffestt_implist_kill (ffestb_local_.decl.imps);
25171 if (ffelex_token_type (t) == FFELEX_typeCOMMA)
25172 return (ffelexHandler) ffestb_decl_R5395_;
25173 if (!ffesta_is_inhibited ())
25174 ffestc_R539finish ();
25175 return (ffelexHandler) ffesta_zero (t);
25177 case FFELEX_typeOPEN_PAREN:
25178 ffesta_confirmed ();
25179 ffestt_implist_kill (ffestb_local_.decl.imps);
25180 next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist,
25181 (ffelexHandler) ffestb_local_.decl.imp_handler);
25182 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25183 return (ffelexHandler) (*next) (t);
25189 ffestt_implist_kill (ffestb_local_.decl.imps);
25190 ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
25191 if (ffestb_local_.decl.kindt != NULL)
25192 ffelex_token_kill (ffestb_local_.decl.kindt);
25193 if (ffestb_local_.decl.lent != NULL)
25194 ffelex_token_kill (ffestb_local_.decl.lent);
25195 if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ())
25196 ffestc_R539finish ();
25197 ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t);
25198 return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);