blob: 673f96c23c543a72438d11d9b0382a81f1a58ce2 [file] [log] [blame]
/* stb.c -- Implementation File (module.c template V1.0)
Copyright (C) 1995, 1996, 2002, 2003
Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
GNU Fortran is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Fortran is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Fortran; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
Related Modules:
st.c
Description:
Parses the proper form for statements, builds up expression trees for
them, but does not actually implement them. Uses ffebad (primarily via
ffesta_ffebad_start) to indicate errors in form. In many cases, an invalid
statement form indicates another possible statement needs to be looked at
by ffest. In a few cases, a valid statement form might not completely
determine the nature of the statement, as in REALFUNCTIONA(B), which is
a valid form for either the first statement of a function named A taking
an argument named B or for the declaration of a real array named FUNCTIONA
with an adjustable size of B. A similar (though somewhat easier) choice
must be made for the statement-function-def vs. assignment forms, as in
the case of FOO(A) = A+2.0.
A given parser consists of one or more state handlers, the first of which
is the initial state, and the last of which (for any given input) returns
control to a final state handler (ffesta_zero or ffesta_two, explained
below). The functions handling the states for a given parser usually have
the same names, differing only in the final number, as in ffestb_foo_
(handles the initial state), ffestb_foo_1_, ffestb_foo_2_ (handle
subsequent states), although liberties sometimes are taken with the "foo"
part either when keywords are clarified into given statements or are
transferred into other possible areas. (For example, the type-name
states can hop over to _dummy_ functions when the FUNCTION or RECURSIVE
keywords are seen, though this kind of thing is kept to a minimum.) Only
the names without numbers are exported to the rest of ffest; the others
are local (static).
Each initial state is provided with the first token in ffesta_tokens[0],
which will be killed upon return to the final state (ffesta_zero or
ffelex_swallow_tokens passed through to ffesta_zero), so while it may
be changed to another token, a valid token must be left there to be
killed. Also, a "convenient" array of tokens are left in
ffesta_tokens[1..FFESTA_tokensMAX]. The initial state of this set of
elements is undefined, thus, if tokens are stored here, they must be
killed before returning to the final state. Any parser may also use
cross-state local variables by sticking a structure containing storage
for those variables in the local union ffestb_local_ (unless the union
goes on strike). Furthermore, parsers that handle more than one first or
second tokens (like _varlist_, which handles EXTERNAL, INTENT, INTRINSIC,
OPTIONAL,
PUBLIC, or PRIVATE, and _endxyz_, which handles ENDBLOCK, ENDBLOCKDATA,
ENDDO, ENDIF, and so on) may expect arguments from ffest in the
ffest-wide union ffest_args_, the substructure specific to the parser.
A parser's responsibility is: to call either ffesta_confirmed or
ffest_ffebad_start before returning to the final state; to be the only
parser that can possibly call ffesta_confirmed for a given statement;
to call ffest_ffebad_start immediately upon recognizing a bad token
(specifically one that another statement parser might confirm upon);
to call ffestc functions only after calling ffesta_confirmed and only
when ffesta_is_inhibited returns FALSE; and to call ffesta_is_inhibited
only after calling ffesta_confirmed. Confirm as early as reasonably
possible, even when only one ffestc function is called for the statement
later on, because early confirmation can enhance the error-reporting
capabilities if a subsequent error is detected and this parser isn't
the first possibility for the statement.
To assist the parser, functions like ffesta_ffebad_1t and _1p_ have
been provided to make use of ffest_ffebad_start fairly easy.
Modifications:
*/
/* Include files. */
#include "proj.h"
#include "stb.h"
#include "bad.h"
#include "expr.h"
#include "lex.h"
#include "malloc.h"
#include "src.h"
#include "sta.h"
#include "stc.h"
#include "stp.h"
#include "str.h"
/* Externals defined here. */
struct _ffestb_args_ ffestb_args;
/* Simple definitions and enumerations. */
#define FFESTB_KILL_EASY_ 1 /* 1 for only one _subr_kill_xyz_ fn. */
/* Internal typedefs. */
union ffestb_subrargs_u_
{
struct
{
ffesttTokenList labels; /* Input arg, must not be NULL. */
ffelexHandler handler; /* Input arg, call me when done. */
bool ok; /* Output arg, TRUE if list ended in
CLOSE_PAREN. */
}
label_list;
struct
{
ffesttDimList dims; /* Input arg, must not be NULL. */
ffelexHandler handler; /* Input arg, call me when done. */
mallocPool pool; /* Pool to allocate into. */
bool ok; /* Output arg, TRUE if list ended in
CLOSE_PAREN. */
ffeexprContext ctx; /* DIMLIST or DIMLISTCOMMON. */
#ifdef FFECOM_dimensionsMAX
int ndims; /* For backends that really can't have
infinite dims. */
#endif
}
dim_list;
struct
{
ffesttTokenList args; /* Input arg, must not be NULL. */
ffelexHandler handler; /* Input arg, call me when done. */
ffelexToken close_paren;/* Output arg if ok, CLOSE_PAREN token. */
bool is_subr; /* Input arg, TRUE if list in subr-def
context. */
bool ok; /* Output arg, TRUE if list ended in
CLOSE_PAREN. */
bool names; /* Do ffelex_set_names(TRUE) before return. */
}
name_list;
};
union ffestb_local_u_
{
struct
{
ffebld expr;
}
call_stmt;
struct
{
ffebld expr;
}
go_to;
struct
{
ffebld dest;
bool vxtparam; /* If assignment might really be VXT
PARAMETER stmt. */
}
let;
struct
{
ffebld expr;
}
if_stmt;
struct
{
ffebld expr;
}
else_stmt;
struct
{
ffebld expr;
}
dowhile;
struct
{
ffebld var;
ffebld start;
ffebld end;
}
do_stmt;
struct
{
bool is_cblock;
}
R522;
struct
{
ffebld expr;
bool started;
}
parameter;
struct
{
ffesttExprList exprs;
bool started;
}
equivalence;
struct
{
ffebld expr;
bool started;
}
data;
struct
{
ffestrOther kw;
}
varlist;
struct
{
ffelexHandler next;
}
construct;
struct
{
ffesttFormatList f;
ffestpFormatType current; /* What we're currently working on. */
ffelexToken t; /* Token of what we're currently working on. */
ffesttFormatValue pre;
ffesttFormatValue post;
ffesttFormatValue dot;
ffesttFormatValue exp;
bool sign; /* _3_, pos/neg; elsewhere, signed/unsigned. */
bool complained; /* If run-time expr seen in nonexec context. */
}
format;
struct
{
ffebld expr;
}
selectcase;
struct
{
ffesttCaseList cases;
}
case_stmt;
struct
{
bool is_cblock;
}
V014;
struct
{
ffestpBeruIx ix;
bool label;
bool left;
ffeexprContext context;
}
beru;
struct
{
ffestpCloseIx ix;
bool label;
bool left;
ffeexprContext context;
}
close;
struct
{
ffestpDeleteIx ix;
bool label;
bool left;
ffeexprContext context;
}
delete;
struct
{
ffestpDeleteIx ix;
bool label;
bool left;
ffeexprContext context;
}
find;
struct
{
ffestpInquireIx ix;
bool label;
bool left;
ffeexprContext context;
bool may_be_iolength;
}
inquire;
struct
{
ffestpOpenIx ix;
bool label;
bool left;
ffeexprContext context;
}
open;
struct
{
ffestpReadIx ix;
bool label;
bool left;
ffeexprContext context;
}
read;
struct
{
ffestpRewriteIx ix;
bool label;
bool left;
ffeexprContext context;
}
rewrite;
struct
{
ffestpWriteIx ix;
bool label;
bool left;
ffeexprContext context;
}
vxtcode;
struct
{
ffestpWriteIx ix;
bool label;
bool left;
ffeexprContext context;
}
write;
struct
{
bool started;
}
common;
struct
{
bool started;
}
dimension;
struct
{
bool started;
}
dimlist;
struct
{
const char *badname;
ffestrFirst first_kw;
bool is_subr;
}
dummy;
struct
{
ffebld kind; /* Kind type parameter, if any. */
ffelexToken kindt; /* Kind type first token, if any. */
ffebld len; /* Length type parameter, if any. */
ffelexToken lent; /* Length type parameter, if any. */
ffelexHandler handler;
ffelexToken recursive;
ffebld expr;
ffesttTokenList toklist;/* For ambiguity resolution. */
ffesttImpList imps; /* List of IMPLICIT letters. */
ffelexHandler imp_handler; /* Call if paren list wasn't letters. */
const char *badname;
ffestrOther kw; /* INTENT(IN/OUT/INOUT). */
ffestpType type;
bool parameter; /* If PARAMETER attribute seen (governs =expr
context). */
bool coloncolon; /* If COLONCOLON seen (allows =expr). */
bool aster_after; /* "*" seen after, not before,
[RECURSIVE]FUNCTIONxyz. */
bool empty; /* Ambig function dummy arg list empty so
far? */
bool imp_started; /* Started IMPLICIT statement already. */
bool imp_seen_comma; /* TRUE if next COMMA within parens means not
R541. */
}
decl;
struct
{
bool started;
}
vxtparam;
}; /* Merge with the one in ffestb later. */
/* Private include files. */
/* Internal structure definitions. */
/* Static objects accessed by functions in this module. */
static union ffestb_subrargs_u_ ffestb_subrargs_;
static union ffestb_local_u_ ffestb_local_;
/* Static functions (internal). */
static void ffestb_subr_ambig_to_ents_ (void);
static ffelexHandler ffestb_subr_ambig_nope_ (ffelexToken t);
static ffelexHandler ffestb_subr_dimlist_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_subr_dimlist_1_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_subr_dimlist_2_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_subr_name_list_ (ffelexToken t);
static ffelexHandler ffestb_subr_name_list_1_ (ffelexToken t);
static void ffestb_subr_R1001_append_p_ (void);
static ffelexHandler ffestb_decl_kindparam_ (ffelexToken t);
static ffelexHandler ffestb_decl_kindparam_1_ (ffelexToken t);
static ffelexHandler ffestb_decl_kindparam_2_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_starkind_ (ffelexToken t);
static ffelexHandler ffestb_decl_starlen_ (ffelexToken t);
static ffelexHandler ffestb_decl_starlen_1_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_typeparams_ (ffelexToken t);
static ffelexHandler ffestb_decl_typeparams_1_ (ffelexToken t);
static ffelexHandler ffestb_decl_typeparams_2_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_typeparams_3_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_subr_label_list_ (ffelexToken t);
static ffelexHandler ffestb_subr_label_list_1_ (ffelexToken t);
static ffelexHandler ffestb_do1_ (ffelexToken t);
static ffelexHandler ffestb_do2_ (ffelexToken t);
static ffelexHandler ffestb_do3_ (ffelexToken t);
static ffelexHandler ffestb_do4_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_do5_ (ffelexToken t);
static ffelexHandler ffestb_do6_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_do7_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_do8_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_do9_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_else1_ (ffelexToken t);
static ffelexHandler ffestb_else2_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_else3_ (ffelexToken t);
static ffelexHandler ffestb_else4_ (ffelexToken t);
static ffelexHandler ffestb_else5_ (ffelexToken t);
static ffelexHandler ffestb_end1_ (ffelexToken t);
static ffelexHandler ffestb_end2_ (ffelexToken t);
static ffelexHandler ffestb_end3_ (ffelexToken t);
static ffelexHandler ffestb_goto1_ (ffelexToken t);
static ffelexHandler ffestb_goto2_ (ffelexToken t);
static ffelexHandler ffestb_goto3_ (ffelexToken t);
static ffelexHandler ffestb_goto4_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_goto5_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_goto6_ (ffelexToken t);
static ffelexHandler ffestb_goto7_ (ffelexToken t);
static ffelexHandler ffestb_halt1_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_if1_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_if2_ (ffelexToken t);
static ffelexHandler ffestb_if3_ (ffelexToken t);
static ffelexHandler ffestb_let1_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_let2_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_varlist5_ (ffelexToken t);
static ffelexHandler ffestb_varlist6_ (ffelexToken t);
static ffelexHandler ffestb_R5221_ (ffelexToken t);
static ffelexHandler ffestb_R5222_ (ffelexToken t);
static ffelexHandler ffestb_R5223_ (ffelexToken t);
static ffelexHandler ffestb_R5224_ (ffelexToken t);
static ffelexHandler ffestb_R5281_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R5282_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R5283_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R5284_ (ffelexToken t);
static ffelexHandler ffestb_R5371_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R5372_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R5373_ (ffelexToken t);
static ffelexHandler ffestb_R5421_ (ffelexToken t);
static ffelexHandler ffestb_R5422_ (ffelexToken t);
static ffelexHandler ffestb_R5423_ (ffelexToken t);
static ffelexHandler ffestb_R5424_ (ffelexToken t);
static ffelexHandler ffestb_R5425_ (ffelexToken t);
static ffelexHandler ffestb_R5441_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R5442_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R5443_ (ffelexToken t);
static ffelexHandler ffestb_R5444_ (ffelexToken t);
static ffelexHandler ffestb_R8341_ (ffelexToken t);
static ffelexHandler ffestb_R8351_ (ffelexToken t);
static ffelexHandler ffestb_R8381_ (ffelexToken t);
static ffelexHandler ffestb_R8382_ (ffelexToken t);
static ffelexHandler ffestb_R8383_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R8401_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R8402_ (ffelexToken t);
static ffelexHandler ffestb_R8403_ (ffelexToken t);
static ffelexHandler ffestb_R8404_ (ffelexToken t);
static ffelexHandler ffestb_R8405_ (ffelexToken t);
static ffelexHandler ffestb_R8406_ (ffelexToken t);
static ffelexHandler ffestb_R8407_ (ffelexToken t);
static ffelexHandler ffestb_R11021_ (ffelexToken t);
static ffelexHandler ffestb_R1111_1_ (ffelexToken t);
static ffelexHandler ffestb_R1111_2_ (ffelexToken t);
static ffelexHandler ffestb_R12121_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R12271_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_construct1_ (ffelexToken t);
static ffelexHandler ffestb_construct2_ (ffelexToken t);
static ffelexHandler ffestb_R8091_ (ffelexToken t);
static ffelexHandler ffestb_R8092_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R8093_ (ffelexToken t);
static ffelexHandler ffestb_R8101_ (ffelexToken t);
static ffelexHandler ffestb_R8102_ (ffelexToken t);
static ffelexHandler ffestb_R8103_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R8104_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R10011_ (ffelexToken t);
static ffelexHandler ffestb_R10012_ (ffelexToken t);
static ffelexHandler ffestb_R10013_ (ffelexToken t);
static ffelexHandler ffestb_R10014_ (ffelexToken t);
static ffelexHandler ffestb_R10015_ (ffelexToken t);
static ffelexHandler ffestb_R10016_ (ffelexToken t);
static ffelexHandler ffestb_R10017_ (ffelexToken t);
static ffelexHandler ffestb_R10018_ (ffelexToken t);
static ffelexHandler ffestb_R10019_ (ffelexToken t);
static ffelexHandler ffestb_R100110_ (ffelexToken t);
static ffelexHandler ffestb_R100111_ (ffelexToken t);
static ffelexHandler ffestb_R100112_ (ffelexToken t);
static ffelexHandler ffestb_R100113_ (ffelexToken t);
static ffelexHandler ffestb_R100114_ (ffelexToken t);
static ffelexHandler ffestb_R100115_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R100116_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R100117_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R100118_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_S3P41_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_V0141_ (ffelexToken t);
static ffelexHandler ffestb_V0142_ (ffelexToken t);
static ffelexHandler ffestb_V0143_ (ffelexToken t);
static ffelexHandler ffestb_V0144_ (ffelexToken t);
#if FFESTB_KILL_EASY_
static void ffestb_subr_kill_easy_ (ffestpInquireIx max);
#else
static void ffestb_subr_kill_accept_ (void);
static void ffestb_subr_kill_beru_ (void);
static void ffestb_subr_kill_close_ (void);
static void ffestb_subr_kill_delete_ (void);
static void ffestb_subr_kill_find_ (void); /* Not written yet. */
static void ffestb_subr_kill_inquire_ (void);
static void ffestb_subr_kill_open_ (void);
static void ffestb_subr_kill_print_ (void);
static void ffestb_subr_kill_read_ (void);
static void ffestb_subr_kill_rewrite_ (void);
static void ffestb_subr_kill_type_ (void);
static void ffestb_subr_kill_vxtcode_ (void); /* Not written yet. */
static void ffestb_subr_kill_write_ (void);
#endif
static ffelexHandler ffestb_beru1_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_beru2_ (ffelexToken t);
static ffelexHandler ffestb_beru3_ (ffelexToken t);
static ffelexHandler ffestb_beru4_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_beru5_ (ffelexToken t);
static ffelexHandler ffestb_beru6_ (ffelexToken t);
static ffelexHandler ffestb_beru7_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_beru8_ (ffelexToken t);
static ffelexHandler ffestb_beru9_ (ffelexToken t);
static ffelexHandler ffestb_beru10_ (ffelexToken t);
static ffelexHandler ffestb_R9041_ (ffelexToken t);
static ffelexHandler ffestb_R9042_ (ffelexToken t);
static ffelexHandler ffestb_R9043_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9044_ (ffelexToken t);
static ffelexHandler ffestb_R9045_ (ffelexToken t);
static ffelexHandler ffestb_R9046_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9047_ (ffelexToken t);
static ffelexHandler ffestb_R9048_ (ffelexToken t);
static ffelexHandler ffestb_R9049_ (ffelexToken t);
static ffelexHandler ffestb_R9071_ (ffelexToken t);
static ffelexHandler ffestb_R9072_ (ffelexToken t);
static ffelexHandler ffestb_R9073_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9074_ (ffelexToken t);
static ffelexHandler ffestb_R9075_ (ffelexToken t);
static ffelexHandler ffestb_R9076_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9077_ (ffelexToken t);
static ffelexHandler ffestb_R9078_ (ffelexToken t);
static ffelexHandler ffestb_R9079_ (ffelexToken t);
static ffelexHandler ffestb_R9091_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9092_ (ffelexToken t);
static ffelexHandler ffestb_R9093_ (ffelexToken t);
static ffelexHandler ffestb_R9094_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9095_ (ffelexToken t);
static ffelexHandler ffestb_R9096_ (ffelexToken t);
static ffelexHandler ffestb_R9097_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9098_ (ffelexToken t);
static ffelexHandler ffestb_R9099_ (ffelexToken t);
static ffelexHandler ffestb_R90910_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R90911_ (ffelexToken t);
static ffelexHandler ffestb_R90912_ (ffelexToken t);
static ffelexHandler ffestb_R90913_ (ffelexToken t);
static ffelexHandler ffestb_R90914_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R90915_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9101_ (ffelexToken t);
static ffelexHandler ffestb_R9102_ (ffelexToken t);
static ffelexHandler ffestb_R9103_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9104_ (ffelexToken t);
static ffelexHandler ffestb_R9105_ (ffelexToken t);
static ffelexHandler ffestb_R9106_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9107_ (ffelexToken t);
static ffelexHandler ffestb_R9108_ (ffelexToken t);
static ffelexHandler ffestb_R9109_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R91010_ (ffelexToken t);
static ffelexHandler ffestb_R91011_ (ffelexToken t);
static ffelexHandler ffestb_R91012_ (ffelexToken t);
static ffelexHandler ffestb_R91013_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R91014_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9111_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9112_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9231_ (ffelexToken t);
static ffelexHandler ffestb_R9232_ (ffelexToken t);
static ffelexHandler ffestb_R9233_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9234_ (ffelexToken t);
static ffelexHandler ffestb_R9235_ (ffelexToken t);
static ffelexHandler ffestb_R9236_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_R9237_ (ffelexToken t);
static ffelexHandler ffestb_R9238_ (ffelexToken t);
static ffelexHandler ffestb_R9239_ (ffelexToken t);
static ffelexHandler ffestb_R92310_ (ffelexToken t);
static ffelexHandler ffestb_R92311_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_V0201_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_V0202_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_dummy1_ (ffelexToken t);
static ffelexHandler ffestb_dummy2_ (ffelexToken t);
static ffelexHandler ffestb_R5241_ (ffelexToken t);
static ffelexHandler ffestb_R5242_ (ffelexToken t);
static ffelexHandler ffestb_R5243_ (ffelexToken t);
static ffelexHandler ffestb_R5244_ (ffelexToken t);
static ffelexHandler ffestb_R5471_ (ffelexToken t);
static ffelexHandler ffestb_R5472_ (ffelexToken t);
static ffelexHandler ffestb_R5473_ (ffelexToken t);
static ffelexHandler ffestb_R5474_ (ffelexToken t);
static ffelexHandler ffestb_R5475_ (ffelexToken t);
static ffelexHandler ffestb_R5476_ (ffelexToken t);
static ffelexHandler ffestb_R5477_ (ffelexToken t);
static ffelexHandler ffestb_R12291_ (ffelexToken t);
static ffelexHandler ffestb_R12292_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_chartype1_ (ffelexToken t);
static ffelexHandler ffestb_decl_attrs_ (ffelexToken t);
static ffelexHandler ffestb_decl_attrs_1_ (ffelexToken t);
static ffelexHandler ffestb_decl_attrs_2_ (ffelexToken t);
static ffelexHandler ffestb_decl_attrs_7_ (ffelexToken t);
static ffelexHandler ffestb_decl_attrsp_ (ffelexToken t);
static ffelexHandler ffestb_decl_ents_ (ffelexToken t);
static ffelexHandler ffestb_decl_ents_1_ (ffelexToken t);
static ffelexHandler ffestb_decl_ents_2_ (ffelexToken t);
static ffelexHandler ffestb_decl_ents_3_ (ffelexToken t);
static ffelexHandler ffestb_decl_ents_4_ (ffelexToken t);
static ffelexHandler ffestb_decl_ents_5_ (ffelexToken t);
static ffelexHandler ffestb_decl_ents_6_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_ents_7_ (ffelexToken t);
static ffelexHandler ffestb_decl_ents_8_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_ents_9_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_ents_10_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_ents_11_ (ffelexToken t);
static ffelexHandler ffestb_decl_entsp_ (ffelexToken t);
static ffelexHandler ffestb_decl_entsp_1_ (ffelexToken t);
static ffelexHandler ffestb_decl_entsp_2_ (ffelexToken t);
static ffelexHandler ffestb_decl_entsp_3_ (ffelexToken t);
static ffelexHandler ffestb_decl_entsp_4_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_entsp_5_ (ffelexToken t);
static ffelexHandler ffestb_decl_entsp_6_ (ffelexToken t);
static ffelexHandler ffestb_decl_entsp_7_ (ffelexToken t);
static ffelexHandler ffestb_decl_entsp_8_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_1_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_2_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_3_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_decl_funcname_4_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_5_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_6_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_7_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_8_ (ffelexToken t);
static ffelexHandler ffestb_decl_funcname_9_ (ffelexToken t);
static ffelexHandler ffestb_V0271_ (ffelexToken t);
static ffelexHandler ffestb_V0272_ (ffelexToken ft, ffebld expr,
ffelexToken t);
static ffelexHandler ffestb_V0273_ (ffelexToken t);
static ffelexHandler ffestb_decl_R5391_ (ffelexToken t);
static ffelexHandler ffestb_decl_R5392_ (ffelexToken t);
static ffelexHandler ffestb_decl_R5394_ (ffelexToken t);
static ffelexHandler ffestb_decl_R5395_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539letters_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539letters_1_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539letters_2_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539letters_3_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539letters_4_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539letters_5_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539maybe_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539maybe_1_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539maybe_2_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539maybe_3_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539maybe_4_ (ffelexToken t);
static ffelexHandler ffestb_decl_R539maybe_5_ (ffelexToken t);
/* Internal macros. */
#if FFESTB_KILL_EASY_
#define ffestb_subr_kill_accept_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_acceptix)
#define ffestb_subr_kill_beru_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_beruix)
#define ffestb_subr_kill_close_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_closeix)
#define ffestb_subr_kill_delete_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_deleteix)
#define ffestb_subr_kill_find_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_findix)
#define ffestb_subr_kill_inquire_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_inquireix)
#define ffestb_subr_kill_open_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_openix)
#define ffestb_subr_kill_print_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_printix)
#define ffestb_subr_kill_read_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_readix)
#define ffestb_subr_kill_rewrite_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_rewriteix)
#define ffestb_subr_kill_type_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_typeix)
#define ffestb_subr_kill_vxtcode_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_vxtcodeix)
#define ffestb_subr_kill_write_() \
ffestb_subr_kill_easy_((ffestpInquireIx) FFESTP_writeix)
#endif
/* ffestb_subr_ambig_nope_ -- Cleans up and aborts ambig w/o confirming
ffestb_subr_ambig_nope_();
Switch from ambiguity handling in _entsp_ functions to handling entities
in _ents_ (perform housekeeping tasks). */
static ffelexHandler
ffestb_subr_ambig_nope_ (ffelexToken t)
{
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
if (ffestb_local_.decl.kindt != NULL)
ffelex_token_kill (ffestb_local_.decl.kindt);
if (ffestb_local_.decl.lent != NULL)
ffelex_token_kill (ffestb_local_.decl.lent);
ffelex_token_kill (ffesta_tokens[1]);
ffelex_token_kill (ffesta_tokens[2]);
ffestt_tokenlist_kill (ffestb_local_.decl.toklist);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_subr_ambig_to_ents_ -- Switches from ambiguity to entity decl
ffestb_subr_ambig_to_ents_();
Switch from ambiguity handling in _entsp_ functions to handling entities
in _ents_ (perform housekeeping tasks). */
static void
ffestb_subr_ambig_to_ents_ (void)
{
ffelexToken nt;
nt = ffelex_token_name_from_names (ffesta_tokens[1], 0, 0);
ffelex_token_kill (ffesta_tokens[1]);
ffelex_token_kill (ffesta_tokens[2]);
ffesta_tokens[1] = nt;
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
if (!ffestb_local_.decl.aster_after)
{
if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
{
if (!ffesta_is_inhibited ())
ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
ffestb_local_.decl.kind, ffestb_local_.decl.kindt,
ffestb_local_.decl.len, ffestb_local_.decl.lent);
if (ffestb_local_.decl.kindt != NULL)
{
ffelex_token_kill (ffestb_local_.decl.kindt);
ffestb_local_.decl.kind = NULL;
ffestb_local_.decl.kindt = NULL;
}
if (ffestb_local_.decl.lent != NULL)
{
ffelex_token_kill (ffestb_local_.decl.lent);
ffestb_local_.decl.len = NULL;
ffestb_local_.decl.lent = NULL;
}
}
else
{
if (!ffesta_is_inhibited ())
ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
ffestb_local_.decl.kind, ffestb_local_.decl.kindt, NULL,
NULL);
if (ffestb_local_.decl.kindt != NULL)
{
ffelex_token_kill (ffestb_local_.decl.kindt);
ffestb_local_.decl.kind = NULL;
ffestb_local_.decl.kindt = NULL;
}
}
return;
}
if (ffestb_local_.decl.type == FFESTP_typeCHARACTER)
{
if (!ffesta_is_inhibited ())
ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
ffestb_local_.decl.kind, ffestb_local_.decl.kindt, NULL, NULL);
if (ffestb_local_.decl.kindt != NULL)
{
ffelex_token_kill (ffestb_local_.decl.kindt);
ffestb_local_.decl.kind = NULL;
ffestb_local_.decl.kindt = NULL;
}
}
else if (!ffesta_is_inhibited ())
ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0],
NULL, NULL, NULL, NULL);
/* NAME/NAMES token already in ffesta_tokens[1]. */
}
/* ffestb_subr_dimlist_ -- OPEN_PAREN expr
(ffestb_subr_dimlist_) // to expression handler
Deal with a dimension list.
19-Dec-90 JCB 1.1
Detect too many dimensions if backend wants it. */
static ffelexHandler
ffestb_subr_dimlist_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
if (expr == NULL)
break;
#ifdef FFECOM_dimensionsMAX
if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX)
{
ffesta_ffebad_1t (FFEBAD_TOO_MANY_DIMS, ft);
ffestb_subrargs_.dim_list.ok = TRUE; /* Not a parse error, really. */
return (ffelexHandler) ffestb_subrargs_.dim_list.handler;
}
#endif
ffestt_dimlist_append (ffestb_subrargs_.dim_list.dims, NULL, expr,
ffelex_token_use (t));
ffestb_subrargs_.dim_list.ok = TRUE;
return (ffelexHandler) ffestb_subrargs_.dim_list.handler;
case FFELEX_typeCOMMA:
if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
break;
#ifdef FFECOM_dimensionsMAX
if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX)
{
ffesta_ffebad_1t (FFEBAD_TOO_MANY_DIMS, ft);
return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
ffestb_subrargs_.dim_list.ctx,
(ffeexprCallback) ffestb_subr_dimlist_2_);
}
#endif
ffestt_dimlist_append (ffestb_subrargs_.dim_list.dims, NULL, expr,
ffelex_token_use (t));
return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
ffestb_subrargs_.dim_list.ctx,
(ffeexprCallback) ffestb_subr_dimlist_);
case FFELEX_typeCOLON:
if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
break;
#ifdef FFECOM_dimensionsMAX
if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX)
{
ffesta_ffebad_1t (FFEBAD_TOO_MANY_DIMS, ft);
return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
ffestb_subrargs_.dim_list.ctx,
(ffeexprCallback) ffestb_subr_dimlist_2_);
}
#endif
ffestt_dimlist_append (ffestb_subrargs_.dim_list.dims, expr, NULL,
ffelex_token_use (t)); /* NULL second expr for
now, just plug in. */
return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
ffestb_subrargs_.dim_list.ctx,
(ffeexprCallback) ffestb_subr_dimlist_1_);
default:
break;
}
ffestb_subrargs_.dim_list.ok = FALSE;
return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t);
}
/* ffestb_subr_dimlist_1_ -- OPEN_PAREN expr COLON expr
(ffestb_subr_dimlist_1_) // to expression handler
Get the upper bound. */
static ffelexHandler
ffestb_subr_dimlist_1_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
ffestb_subrargs_.dim_list.dims->previous->upper = expr;
ffestb_subrargs_.dim_list.ok = TRUE;
return (ffelexHandler) ffestb_subrargs_.dim_list.handler;
case FFELEX_typeCOMMA:
if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
break;
ffestb_subrargs_.dim_list.dims->previous->upper = expr;
return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
ffestb_subrargs_.dim_list.ctx, (ffeexprCallback) ffestb_subr_dimlist_);
default:
break;
}
ffestb_subrargs_.dim_list.ok = FALSE;
return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t);
}
/* ffestb_subr_dimlist_2_ -- OPEN_PAREN too-many-dim-exprs
(ffestb_subr_dimlist_2_) // to expression handler
Get the upper bound. */
static ffelexHandler
ffestb_subr_dimlist_2_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
ffestb_subrargs_.dim_list.ok = TRUE; /* Not a parse error, really. */
return (ffelexHandler) ffestb_subrargs_.dim_list.handler;
case FFELEX_typeCOMMA:
case FFELEX_typeCOLON:
if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR))
break;
return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool,
ffestb_subrargs_.dim_list.ctx,
(ffeexprCallback) ffestb_subr_dimlist_2_);
default:
break;
}
ffestb_subrargs_.dim_list.ok = FALSE;
return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t);
}
/* ffestb_subr_name_list_ -- Collect a list of name args and close-paren
return ffestb_subr_name_list_; // to lexer after seeing OPEN_PAREN
This implements R1224 in the Fortran 90 spec. The arg list may be
empty, or be a comma-separated list (an optional trailing comma currently
results in a warning but no other effect) of arguments. For functions,
however, "*" is invalid (we implement dummy-arg-name, rather than R1224
dummy-arg, which itself is either dummy-arg-name or "*"). */
static ffelexHandler
ffestb_subr_name_list_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
if (ffestt_tokenlist_count (ffestb_subrargs_.name_list.args) != 0)
{ /* Trailing comma, warn. */
ffebad_start (FFEBAD_TRAILING_COMMA);
ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t));
ffebad_finish ();
}
ffestb_subrargs_.name_list.ok = TRUE;
ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
if (ffestb_subrargs_.name_list.names)
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_subrargs_.name_list.handler;
case FFELEX_typeASTERISK:
if (!ffestb_subrargs_.name_list.is_subr)
break;
case FFELEX_typeNAME:
ffestt_tokenlist_append (ffestb_subrargs_.name_list.args,
ffelex_token_use (t));
return (ffelexHandler) ffestb_subr_name_list_1_;
default:
break;
}
ffestb_subrargs_.name_list.ok = FALSE;
ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
if (ffestb_subrargs_.name_list.names)
ffelex_set_names (TRUE);
return (ffelexHandler) (*ffestb_subrargs_.name_list.handler) (t);
}
/* ffestb_subr_name_list_1_ -- NAME or ASTERISK
return ffestb_subr_name_list_1_; // to lexer
The next token must be COMMA or CLOSE_PAREN, either way go to original
state, but only after adding the appropriate name list item. */
static ffelexHandler
ffestb_subr_name_list_1_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
return (ffelexHandler) ffestb_subr_name_list_;
case FFELEX_typeCLOSE_PAREN:
ffestb_subrargs_.name_list.ok = TRUE;
ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
if (ffestb_subrargs_.name_list.names)
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_subrargs_.name_list.handler;
default:
ffestb_subrargs_.name_list.ok = FALSE;
ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t);
if (ffestb_subrargs_.name_list.names)
ffelex_set_names (TRUE);
return (ffelexHandler) (*ffestb_subrargs_.name_list.handler) (t);
}
}
static void
ffestb_subr_R1001_append_p_ (void)
{
ffesttFormatList f;
if (!ffestb_local_.format.pre.present)
{
ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_P_SPEC, ffestb_local_.format.t);
ffelex_token_kill (ffestb_local_.format.t);
return;
}
f = ffestt_formatlist_append (ffestb_local_.format.f);
f->type = FFESTP_formattypeP;
f->t = ffestb_local_.format.t;
f->u.R1010.val = ffestb_local_.format.pre;
}
/* ffestb_decl_kindparam_ -- "type" OPEN_PAREN
return ffestb_decl_kindparam_; // to lexer
Handle "[KIND=]expr)". */
static ffelexHandler
ffestb_decl_kindparam_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeNAME:
ffesta_tokens[1] = ffelex_token_use (t);
return (ffelexHandler) ffestb_decl_kindparam_1_;
default:
return (ffelexHandler) (*((ffelexHandler)
ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextKINDTYPE,
(ffeexprCallback) ffestb_decl_kindparam_2_)))
(t);
}
}
/* ffestb_decl_kindparam_1_ -- "type" OPEN_PAREN NAME
return ffestb_decl_kindparam_1_; // to lexer
Handle "[KIND=]expr)". */
static ffelexHandler
ffestb_decl_kindparam_1_ (ffelexToken t)
{
ffelexHandler next;
ffelexToken nt;
switch (ffelex_token_type (t))
{
case FFELEX_typeEQUALS:
ffesta_confirmed ();
if (ffestr_other (ffesta_tokens[1]) != FFESTR_otherKIND)
break;
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextKINDTYPE, (ffeexprCallback) ffestb_decl_kindparam_2_);
default:
nt = ffesta_tokens[1];
next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextKINDTYPE, (ffeexprCallback) ffestb_decl_kindparam_2_)))
(nt);
ffelex_token_kill (nt);
return (ffelexHandler) (*next) (t);
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
ffesta_tokens[1]);
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_decl_kindparam_2_ -- "type" OPEN_PAREN ["KIND="] expr
(ffestb_decl_kindparam_2_) // to expression handler
Handle "[KIND=]expr)". */
static ffelexHandler
ffestb_decl_kindparam_2_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
ffestb_local_.decl.kind = expr;
ffestb_local_.decl.kindt = ffelex_token_use (ft);
ffestb_local_.decl.len = NULL;
ffestb_local_.decl.lent = NULL;
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_local_.decl.handler;
default:
break;
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_decl_starkind_ -- "type" ASTERISK
return ffestb_decl_starkind_; // to lexer
Handle NUMBER. */
static ffelexHandler
ffestb_decl_starkind_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeNUMBER:
ffestb_local_.decl.kindt = ffelex_token_use (t);
ffestb_local_.decl.kind = NULL;
ffestb_local_.decl.len = NULL;
ffestb_local_.decl.lent = NULL;
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_local_.decl.handler;
default:
break;
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_decl_starlen_ -- "CHARACTER" ASTERISK
return ffestb_decl_starlen_; // to lexer
Handle NUMBER. */
static ffelexHandler
ffestb_decl_starlen_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeNUMBER:
ffestb_local_.decl.kind = NULL;
ffestb_local_.decl.kindt = NULL;
ffestb_local_.decl.len = NULL;
ffestb_local_.decl.lent = ffelex_token_use (t);
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_local_.decl.handler;
case FFELEX_typeOPEN_PAREN:
ffestb_local_.decl.kind = NULL;
ffestb_local_.decl.kindt = NULL;
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextCHARACTERSIZE,
(ffeexprCallback) ffestb_decl_starlen_1_);
default:
break;
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_decl_starlen_1_ -- "CHARACTER" ASTERISK OPEN_PAREN expr
(ffestb_decl_starlen_1_) // to expression handler
Handle CLOSE_PAREN. */
static ffelexHandler
ffestb_decl_starlen_1_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
if (expr == NULL)
break;
ffestb_local_.decl.len = expr;
ffestb_local_.decl.lent = ffelex_token_use (ft);
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_local_.decl.handler;
default:
break;
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_decl_typeparams_ -- "CHARACTER" OPEN_PAREN
return ffestb_decl_typeparams_; // to lexer
Handle "[KIND=]expr)". */
static ffelexHandler
ffestb_decl_typeparams_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeNAME:
ffesta_tokens[1] = ffelex_token_use (t);
return (ffelexHandler) ffestb_decl_typeparams_1_;
default:
if (ffestb_local_.decl.lent == NULL)
return (ffelexHandler) (*((ffelexHandler)
ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextCHARACTERSIZE,
(ffeexprCallback) ffestb_decl_typeparams_2_)))
(t);
if (ffestb_local_.decl.kindt != NULL)
break;
return (ffelexHandler) (*((ffelexHandler)
ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextKINDTYPE,
(ffeexprCallback) ffestb_decl_typeparams_3_)))
(t);
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
if (ffestb_local_.decl.kindt != NULL)
ffelex_token_kill (ffestb_local_.decl.kindt);
if (ffestb_local_.decl.lent != NULL)
ffelex_token_kill (ffestb_local_.decl.lent);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_decl_typeparams_1_ -- "CHARACTER" OPEN_PAREN NAME
return ffestb_decl_typeparams_1_; // to lexer
Handle "[KIND=]expr)". */
static ffelexHandler
ffestb_decl_typeparams_1_ (ffelexToken t)
{
ffelexHandler next;
ffelexToken nt;
switch (ffelex_token_type (t))
{
case FFELEX_typeEQUALS:
ffesta_confirmed ();
switch (ffestr_other (ffesta_tokens[1]))
{
case FFESTR_otherLEN:
if (ffestb_local_.decl.lent != NULL)
break;
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextCHARACTERSIZE,
(ffeexprCallback) ffestb_decl_typeparams_2_);
case FFESTR_otherKIND:
if (ffestb_local_.decl.kindt != NULL)
break;
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextKINDTYPE,
(ffeexprCallback) ffestb_decl_typeparams_3_);
default:
break;
}
break;
default:
nt = ffesta_tokens[1];
if (ffestb_local_.decl.lent == NULL)
next = (ffelexHandler) (*((ffelexHandler)
ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextCHARACTERSIZE,
(ffeexprCallback) ffestb_decl_typeparams_2_)))
(nt);
else if (ffestb_local_.decl.kindt == NULL)
next = (ffelexHandler) (*((ffelexHandler)
ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextKINDTYPE,
(ffeexprCallback) ffestb_decl_typeparams_3_)))
(nt);
else
{
ffesta_tokens[1] = nt;
break;
}
ffelex_token_kill (nt);
return (ffelexHandler) (*next) (t);
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
if (ffestb_local_.decl.kindt != NULL)
ffelex_token_kill (ffestb_local_.decl.kindt);
if (ffestb_local_.decl.lent != NULL)
ffelex_token_kill (ffestb_local_.decl.lent);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
ffesta_tokens[1]);
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_decl_typeparams_2_ -- "CHARACTER" OPEN_PAREN ["LEN="] expr
(ffestb_decl_typeparams_2_) // to expression handler
Handle "[LEN=]expr)". */
static ffelexHandler
ffestb_decl_typeparams_2_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
ffestb_local_.decl.len = expr;
ffestb_local_.decl.lent = ffelex_token_use (ft);
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_local_.decl.handler;
case FFELEX_typeCOMMA:
ffestb_local_.decl.len = expr;
ffestb_local_.decl.lent = ffelex_token_use (ft);
return (ffelexHandler) ffestb_decl_typeparams_;
default:
break;
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
if (ffestb_local_.decl.kindt != NULL)
ffelex_token_kill (ffestb_local_.decl.kindt);
if (ffestb_local_.decl.lent != NULL)
ffelex_token_kill (ffestb_local_.decl.lent);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_decl_typeparams_3_ -- "CHARACTER" OPEN_PAREN ["KIND="] expr
(ffestb_decl_typeparams_3_) // to expression handler
Handle "[KIND=]expr)". */
static ffelexHandler
ffestb_decl_typeparams_3_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
ffestb_local_.decl.kind = expr;
ffestb_local_.decl.kindt = ffelex_token_use (ft);
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_local_.decl.handler;
case FFELEX_typeCOMMA:
ffestb_local_.decl.kind = expr;
ffestb_local_.decl.kindt = ffelex_token_use (ft);
return (ffelexHandler) ffestb_decl_typeparams_;
default:
break;
}
if (ffestb_local_.decl.recursive != NULL)
ffelex_token_kill (ffestb_local_.decl.recursive);
if (ffestb_local_.decl.kindt != NULL)
ffelex_token_kill (ffestb_local_.decl.kindt);
if (ffestb_local_.decl.lent != NULL)
ffelex_token_kill (ffestb_local_.decl.lent);
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM,
ffestb_local_.decl.badname,
t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_subr_label_list_ -- Collect a tokenlist of labels and close-paren
return ffestb_subr_label_list_; // to lexer after seeing OPEN_PAREN
First token must be a NUMBER. Must be followed by zero or more COMMA
NUMBER pairs. Must then be followed by a CLOSE_PAREN. If all ok, put
the NUMBER tokens in a token list and return via the handler for the
token after CLOSE_PAREN. Else return via
same handler, but with the ok return value set FALSE. */
static ffelexHandler
ffestb_subr_label_list_ (ffelexToken t)
{
if (ffelex_token_type (t) == FFELEX_typeNUMBER)
{
ffestt_tokenlist_append (ffestb_subrargs_.label_list.labels,
ffelex_token_use (t));
return (ffelexHandler) ffestb_subr_label_list_1_;
}
ffestb_subrargs_.label_list.ok = FALSE;
return (ffelexHandler) (*ffestb_subrargs_.label_list.handler) (t);
}
/* ffestb_subr_label_list_1_ -- NUMBER
return ffestb_subr_label_list_1_; // to lexer after seeing NUMBER
The next token must be COMMA, in which case go back to
ffestb_subr_label_list_, or CLOSE_PAREN, in which case set ok to TRUE
and go to the handler. */
static ffelexHandler
ffestb_subr_label_list_1_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
return (ffelexHandler) ffestb_subr_label_list_;
case FFELEX_typeCLOSE_PAREN:
ffestb_subrargs_.label_list.ok = TRUE;
return (ffelexHandler) ffestb_subrargs_.label_list.handler;
default:
ffestb_subrargs_.label_list.ok = FALSE;
return (ffelexHandler) (*ffestb_subrargs_.label_list.handler) (t);
}
}
/* ffestb_do -- Parse the DO statement
return ffestb_do; // to lexer
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
ffelexHandler
ffestb_do (ffelexToken t)
{
ffeTokenLength i;
unsigned const char *p;
ffelexHandler next;
ffelexToken nt;
ffestrSecond kw;
switch (ffelex_token_type (ffesta_tokens[0]))
{
case FFELEX_typeNAME:
if (ffesta_first_kw != FFESTR_firstDO)
goto bad_0; /* :::::::::::::::::::: */
switch (ffelex_token_type (t))
{
case FFELEX_typeNUMBER:
ffesta_confirmed ();
ffesta_tokens[1] = ffelex_token_use (t);
return (ffelexHandler) ffestb_do1_;
case FFELEX_typeCOMMA:
ffesta_confirmed ();
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_do2_;
case FFELEX_typeNAME:
ffesta_confirmed ();
ffesta_tokens[1] = NULL;
ffesta_tokens[2] = ffelex_token_use (t);
return (ffelexHandler) ffestb_do3_;
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_do1_ (t);
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
}
case FFELEX_typeNAMES:
if (ffesta_first_kw != FFESTR_firstDO)
goto bad_0; /* :::::::::::::::::::: */
p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDO);
switch (ffelex_token_type (t))
{
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeOPEN_PAREN: /* Must be "DO" label "WHILE". */
if (! ISDIGIT (*p))
goto bad_i; /* :::::::::::::::::::: */
ffesta_tokens[1] = ffelex_token_number_from_names (ffesta_tokens[0],
i);
p += ffelex_token_length (ffesta_tokens[1]);
i += ffelex_token_length (ffesta_tokens[1]);
if (((*p) != 'W') && ((*p) != 'w'))
goto bad_i1; /* :::::::::::::::::::: */
nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
kw = ffestr_second (nt);
ffelex_token_kill (nt);
if (kw != FFESTR_secondWHILE)
goto bad_i1; /* :::::::::::::::::::: */
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextDOWHILE, (ffeexprCallback) ffestb_do4_);
case FFELEX_typeCOMMA:
ffesta_confirmed ();
if (*p == '\0')
{
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_do2_;
}
if (! ISDIGIT (*p))
goto bad_i; /* :::::::::::::::::::: */
ffesta_tokens[1] = ffelex_token_number_from_names (ffesta_tokens[0],
i);
p += ffelex_token_length (ffesta_tokens[1]);
i += ffelex_token_length (ffesta_tokens[1]);
if (*p != '\0')
goto bad_i1; /* :::::::::::::::::::: */
return (ffelexHandler) ffestb_do2_;
case FFELEX_typeEQUALS:
if (ISDIGIT (*p))
{
ffesta_tokens[1]
= ffelex_token_number_from_names (ffesta_tokens[0], i);
p += ffelex_token_length (ffesta_tokens[1]);
i += ffelex_token_length (ffesta_tokens[1]);
}
else
ffesta_tokens[1] = NULL;
if (!ffesrc_is_name_init (*p))
goto bad_i1; /* :::::::::::::::::::: */
nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
next = (ffelexHandler) (*((ffelexHandler) ffeexpr_lhs
(ffesta_output_pool, FFEEXPR_contextDO,
(ffeexprCallback) ffestb_do6_)))
(nt);
ffelex_token_kill (nt); /* Will get it back in _6_... */
return (ffelexHandler) (*next) (t);
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
if (ISDIGIT (*p))
{
ffesta_tokens[1]
= ffelex_token_number_from_names (ffesta_tokens[0], i);
p += ffelex_token_length (ffesta_tokens[1]);
i += ffelex_token_length (ffesta_tokens[1]);
}
else
ffesta_tokens[1] = NULL;
if (*p != '\0')
goto bad_i1; /* :::::::::::::::::::: */
return (ffelexHandler) ffestb_do1_ (t);
}
default:
goto bad_0; /* :::::::::::::::::::: */
}
bad_0: /* :::::::::::::::::::: */
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
bad_1: /* :::::::::::::::::::: */
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero); /* Invalid second token. */
bad_i1: /* :::::::::::::::::::: */
if (ffesta_tokens[1])
ffelex_token_kill (ffesta_tokens[1]);
bad_i: /* :::::::::::::::::::: */
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0], i, t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_dowhile -- Parse the DOWHILE statement
return ffestb_dowhile; // to lexer
Make sure the statement has a valid form for the DOWHILE statement. If it
does, implement the statement. */
ffelexHandler
ffestb_dowhile (ffelexToken t)
{
ffeTokenLength i;
const char *p;
ffelexHandler next;
ffelexToken nt;
switch (ffelex_token_type (ffesta_tokens[0]))
{
case FFELEX_typeNAMES:
if (ffesta_first_kw != FFESTR_firstDOWHILE)
goto bad_0; /* :::::::::::::::::::: */
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeOPEN_PAREN:
p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDOWHILE);
if (*p != '\0')
goto bad_i; /* :::::::::::::::::::: */
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextDOWHILE, (ffeexprCallback) ffestb_do4_);
case FFELEX_typeEQUALS:/* Not really DOWHILE, but DOWHILExyz=.... */
ffesta_tokens[1] = NULL;
nt = ffelex_token_name_from_names (ffesta_tokens[0], FFESTR_firstlDO,
0);
next = (ffelexHandler) (*((ffelexHandler) ffeexpr_lhs
(ffesta_output_pool, FFEEXPR_contextDO,
(ffeexprCallback) ffestb_do6_)))
(nt);
ffelex_token_kill (nt); /* Will get it back in _6_... */
return (ffelexHandler) (*next) (t);
}
default:
goto bad_0; /* :::::::::::::::::::: */
}
bad_0: /* :::::::::::::::::::: */
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
bad_1: /* :::::::::::::::::::: */
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero); /* Invalid second token. */
bad_i: /* :::::::::::::::::::: */
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0], i, t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_do1_ -- "DO" [label]
return ffestb_do1_; // to lexer
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do1_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
ffesta_confirmed ();
return (ffelexHandler) ffestb_do2_;
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
if (!ffesta_is_inhibited ())
{
if (ffesta_tokens[1] != NULL)
ffestc_R819B (ffesta_construct_name, ffesta_tokens[1], NULL,
NULL);
else
ffestc_R820B (ffesta_construct_name, NULL, NULL);
}
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
return (ffelexHandler) ffesta_zero (t);
case FFELEX_typeNAME:
return (ffelexHandler) ffestb_do2_ (t);
default:
break;
}
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_do2_ -- "DO" [label] [,]
return ffestb_do2_; // to lexer
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do2_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeNAME:
ffesta_tokens[2] = ffelex_token_use (t);
return (ffelexHandler) ffestb_do3_;
default:
break;
}
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_do3_ -- "DO" [label] [,] NAME
return ffestb_do3_; // to lexer
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do3_ (ffelexToken t)
{
ffelexHandler next;
switch (ffelex_token_type (t))
{
case FFELEX_typeEQUALS:
next = (ffelexHandler) (*((ffelexHandler) ffeexpr_lhs (ffesta_output_pool,
FFEEXPR_contextDO, (ffeexprCallback) ffestb_do6_)))
(ffesta_tokens[2]);
ffelex_token_kill (ffesta_tokens[2]); /* Will get it back in _6_... */
return (ffelexHandler) (*next) (t);
case FFELEX_typeOPEN_PAREN:
if (ffestr_second (ffesta_tokens[2]) != FFESTR_secondWHILE)
{
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[2]);
ffelex_token_kill (ffesta_tokens[2]);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero); /* Invalid token. */
}
ffelex_token_kill (ffesta_tokens[2]);
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextDOWHILE, (ffeexprCallback) ffestb_do4_);
default:
break;
}
ffelex_token_kill (ffesta_tokens[2]);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_do4_ -- "DO" [label] [,] "WHILE" OPEN_PAREN expr
(ffestb_do4_) // to expression handler
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do4_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
if (expr == NULL)
break;
ffesta_tokens[2] = ffelex_token_use (ft);
ffestb_local_.dowhile.expr = expr;
return (ffelexHandler) ffestb_do5_;
default:
break;
}
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_do5_ -- "DO" [label] [,] "WHILE" OPEN_PAREN expr CLOSE_PAREN
return ffestb_do5_; // to lexer
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do5_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
if (!ffesta_is_inhibited ())
{
if (ffesta_tokens[1] != NULL)
ffestc_R819B (ffesta_construct_name, ffesta_tokens[1],
ffestb_local_.dowhile.expr, ffesta_tokens[2]);
else
ffestc_R820B (ffesta_construct_name, ffestb_local_.dowhile.expr,
ffesta_tokens[2]);
}
ffelex_token_kill (ffesta_tokens[2]);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
return (ffelexHandler) ffesta_zero (t);
default:
break;
}
ffelex_token_kill (ffesta_tokens[2]);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_do6_ -- "DO" [label] [,] var-expr
(ffestb_do6_) // to expression handler
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do6_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
/* _3_ already ensured that this would be an EQUALS token. If not, it is a
bug in the FFE. */
assert (ffelex_token_type (t) == FFELEX_typeEQUALS);
ffesta_tokens[2] = ffelex_token_use (ft);
ffestb_local_.do_stmt.var = expr;
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextDO, (ffeexprCallback) ffestb_do7_);
}
/* ffestb_do7_ -- "DO" [label] [,] var-expr EQUALS expr
(ffestb_do7_) // to expression handler
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do7_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
ffesta_confirmed ();
if (expr == NULL)
break;
ffesta_tokens[3] = ffelex_token_use (ft);
ffestb_local_.do_stmt.start = expr;
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextDO, (ffeexprCallback) ffestb_do8_);
default:
break;
}
ffelex_token_kill (ffesta_tokens[2]);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_do8_ -- "DO" [label] [,] var-expr EQUALS expr COMMA expr
(ffestb_do8_) // to expression handler
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do8_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
if (expr == NULL)
break;
ffesta_tokens[4] = ffelex_token_use (ft);
ffestb_local_.do_stmt.end = expr;
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextDO, (ffeexprCallback) ffestb_do9_);
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
if (expr == NULL)
break;
ffesta_tokens[4] = ffelex_token_use (ft);
ffestb_local_.do_stmt.end = expr;
return (ffelexHandler) ffestb_do9_ (NULL, NULL, t);
default:
break;
}
ffelex_token_kill (ffesta_tokens[3]);
ffelex_token_kill (ffesta_tokens[2]);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_do9_ -- "DO" [label] [,] var-expr EQUALS expr COMMA expr
[COMMA expr]
(ffestb_do9_) // to expression handler
Make sure the statement has a valid form for the DO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_do9_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
if ((expr == NULL) && (ft != NULL))
break;
if (!ffesta_is_inhibited ())
{
if (ffesta_tokens[1] != NULL)
ffestc_R819A (ffesta_construct_name, ffesta_tokens[1],
ffestb_local_.do_stmt.var, ffesta_tokens[2],
ffestb_local_.do_stmt.start, ffesta_tokens[3],
ffestb_local_.do_stmt.end, ffesta_tokens[4], expr, ft);
else
ffestc_R820A (ffesta_construct_name, ffestb_local_.do_stmt.var,
ffesta_tokens[2], ffestb_local_.do_stmt.start,
ffesta_tokens[3], ffestb_local_.do_stmt.end,
ffesta_tokens[4], expr, ft);
}
ffelex_token_kill (ffesta_tokens[4]);
ffelex_token_kill (ffesta_tokens[3]);
ffelex_token_kill (ffesta_tokens[2]);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
return (ffelexHandler) ffesta_zero (t);
default:
break;
}
ffelex_token_kill (ffesta_tokens[4]);
ffelex_token_kill (ffesta_tokens[3]);
ffelex_token_kill (ffesta_tokens[2]);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_construct_name != NULL)
{
ffelex_token_kill (ffesta_construct_name);
ffesta_construct_name = NULL;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_else -- Parse the ELSE statement
return ffestb_else; // to lexer
Make sure the statement has a valid form for the ELSE statement. If it
does, implement the statement. */
ffelexHandler
ffestb_else (ffelexToken t)
{
ffeTokenLength i;
unsigned const char *p;
switch (ffelex_token_type (ffesta_tokens[0]))
{
case FFELEX_typeNAME:
if (ffesta_first_kw != FFESTR_firstELSE)
goto bad_0; /* :::::::::::::::::::: */
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
ffesta_tokens[1] = NULL;
ffestb_args.elsexyz.second = FFESTR_secondNone;
return (ffelexHandler) ffestb_else1_ (t);
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeNAME:
break;
}
ffesta_confirmed ();
ffestb_args.elsexyz.second = ffesta_second_kw;
ffesta_tokens[1] = ffelex_token_use (t);
return (ffelexHandler) ffestb_else1_;
case FFELEX_typeNAMES:
if (ffesta_first_kw != FFESTR_firstELSE)
goto bad_0; /* :::::::::::::::::::: */
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
break;
}
ffesta_confirmed ();
if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlELSE)
{
p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlELSE);
if (!ffesrc_is_name_init (*p))
goto bad_i; /* :::::::::::::::::::: */
ffesta_tokens[1]
= ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
}
else
ffesta_tokens[1] = NULL;
ffestb_args.elsexyz.second = FFESTR_secondNone;
return (ffelexHandler) ffestb_else1_ (t);
default:
goto bad_0; /* :::::::::::::::::::: */
}
bad_0: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", ffesta_tokens[0]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
bad_1: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", t);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero); /* Invalid second token. */
bad_i: /* :::::::::::::::::::: */
ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ELSE", ffesta_tokens[0], i, t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_elsexyz -- Parse an ELSEIF/ELSEWHERE statement
return ffestb_elsexyz; // to lexer
Expects len and second to be set in ffestb_args.elsexyz to the length
of the ELSExyz keyword involved and the corresponding ffestrSecond value. */
ffelexHandler
ffestb_elsexyz (ffelexToken t)
{
ffeTokenLength i;
const char *p;
switch (ffelex_token_type (ffesta_tokens[0]))
{
case FFELEX_typeNAME:
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
if (ffesta_first_kw == FFESTR_firstELSEIF)
goto bad_0; /* :::::::::::::::::::: */
ffesta_confirmed ();
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_else1_ (t);
case FFELEX_typeNAME:
ffesta_confirmed ();
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeOPEN_PAREN:
if (ffesta_first_kw != FFESTR_firstELSEIF)
goto bad_0; /* :::::::::::::::::::: */
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_else1_ (t);
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
}
case FFELEX_typeNAMES:
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeOPEN_PAREN:
if (ffesta_first_kw != FFESTR_firstELSEIF)
goto bad_1; /* :::::::::::::::::::: */
if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlELSEIF)
{
i = FFESTR_firstlELSEIF;
goto bad_i; /* :::::::::::::::::::: */
}
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_else1_ (t);
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
break;
}
ffesta_confirmed ();
p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlELSE);
ffesta_tokens[1]
= ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
return (ffelexHandler) ffestb_else1_ (t);
default:
goto bad_0; /* :::::::::::::::::::: */
}
bad_0: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", ffesta_tokens[0]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
bad_1: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", t);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero); /* Invalid second token. */
bad_i: /* :::::::::::::::::::: */
ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ELSE IF", ffesta_tokens[0], i, t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_else1_ -- "ELSE" (NAME)
return ffestb_else1_; // to lexer
If EOS/SEMICOLON, implement the appropriate statement (keep in mind that
"ELSE WHERE" is ambiguous at the syntactic level). If OPEN_PAREN, start
expression analysis with callback at _2_. */
static ffelexHandler
ffestb_else1_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeOPEN_PAREN:
if (ffestb_args.elsexyz.second == FFESTR_secondIF)
{
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool,
FFEEXPR_contextIF, (ffeexprCallback) ffestb_else2_);
}
/* Fall through. */
default:
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE", t);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero);
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
break;
}
switch (ffestb_args.elsexyz.second)
{
default:
if (!ffesta_is_inhibited ())
ffestc_R805 (ffesta_tokens[1]);
break;
}
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffesta_zero (t);
}
/* ffestb_else2_ -- "ELSE" "IF" OPEN_PAREN expr
(ffestb_else2_) // to expression handler
Make sure the next token is CLOSE_PAREN. */
static ffelexHandler
ffestb_else2_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
ffestb_local_.else_stmt.expr = expr;
switch (ffelex_token_type (t))
{
case FFELEX_typeCLOSE_PAREN:
if (expr == NULL)
break;
ffesta_tokens[1] = ffelex_token_use (ft);
ffelex_set_names (TRUE);
return (ffelexHandler) ffestb_else3_;
default:
break;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_else3_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN
return ffestb_else3_; // to lexer
Make sure the next token is "THEN". */
static ffelexHandler
ffestb_else3_ (ffelexToken t)
{
ffeTokenLength i;
unsigned const char *p;
ffelex_set_names (FALSE);
switch (ffelex_token_type (t))
{
case FFELEX_typeNAME:
ffesta_confirmed ();
if (ffestr_first (t) == FFESTR_firstTHEN)
return (ffelexHandler) ffestb_else4_;
break;
case FFELEX_typeNAMES:
ffesta_confirmed ();
if (ffestr_first (t) != FFESTR_firstTHEN)
break;
if (ffelex_token_length (t) == FFESTR_firstlTHEN)
return (ffelexHandler) ffestb_else4_;
p = ffelex_token_text (t) + (i = FFESTR_firstlTHEN);
if (!ffesrc_is_name_init (*p))
goto bad_i; /* :::::::::::::::::::: */
ffesta_tokens[2] = ffelex_token_name_from_names (t, i, 0);
return (ffelexHandler) ffestb_else5_;
default:
break;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t);
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
bad_i: /* :::::::::::::::::::: */
ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t, i, NULL);
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_else4_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN "THEN"
return ffestb_else4_; // to lexer
Handle a NAME or EOS/SEMICOLON, then go to state _5_. */
static ffelexHandler
ffestb_else4_ (ffelexToken t)
{
ffelex_set_names (FALSE);
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_tokens[2] = NULL;
return (ffelexHandler) ffestb_else5_ (t);
case FFELEX_typeNAME:
ffesta_tokens[2] = ffelex_token_use (t);
return (ffelexHandler) ffestb_else5_;
default:
break;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t);
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_else5_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN "THEN"
return ffestb_else5_; // to lexer
Make sure the next token is EOS or SEMICOLON; implement R804. */
static ffelexHandler
ffestb_else5_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
if (!ffesta_is_inhibited ())
ffestc_R804 (ffestb_local_.else_stmt.expr, ffesta_tokens[1],
ffesta_tokens[2]);
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_tokens[2] != NULL)
ffelex_token_kill (ffesta_tokens[2]);
return (ffelexHandler) ffesta_zero (t);
default:
break;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t);
ffelex_token_kill (ffesta_tokens[1]);
if (ffesta_tokens[2] != NULL)
ffelex_token_kill (ffesta_tokens[2]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_end -- Parse the END statement
return ffestb_end; // to lexer
Make sure the statement has a valid form for the END statement. If it
does, implement the statement. */
ffelexHandler
ffestb_end (ffelexToken t)
{
ffeTokenLength i;
switch (ffelex_token_type (ffesta_tokens[0]))
{
case FFELEX_typeNAME:
if (ffesta_first_kw != FFESTR_firstEND)
goto bad_0; /* :::::::::::::::::::: */
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_tokens[1] = NULL;
ffestb_args.endxyz.second = FFESTR_secondNone;
return (ffelexHandler) ffestb_end3_ (t);
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeNAME:
break;
}
ffesta_confirmed ();
ffestb_args.endxyz.second = ffesta_second_kw;
switch (ffesta_second_kw)
{
case FFESTR_secondFILE:
ffestb_args.beru.badname = "ENDFILE";
return (ffelexHandler) ffestb_beru;
case FFESTR_secondBLOCK:
return (ffelexHandler) ffestb_end1_;
case FFESTR_secondNone:
goto bad_1; /* :::::::::::::::::::: */
default:
return (ffelexHandler) ffestb_end2_;
}
case FFELEX_typeNAMES:
if (ffesta_first_kw != FFESTR_firstEND)
goto bad_0; /* :::::::::::::::::::: */
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
break;
}
ffesta_confirmed ();
if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlEND)
{
i = FFESTR_firstlEND;
goto bad_i; /* :::::::::::::::::::: */
}
ffesta_tokens[1] = NULL;
ffestb_args.endxyz.second = FFESTR_secondNone;
return (ffelexHandler) ffestb_end3_ (t);
default:
goto bad_0; /* :::::::::::::::::::: */
}
bad_0: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
bad_1: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero); /* Invalid second token. */
bad_i: /* :::::::::::::::::::: */
ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0], i, t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_endxyz -- Parse an ENDxyz statement
return ffestb_endxyz; // to lexer
Expects len and second to be set in ffestb_args.endxyz to the length
of the ENDxyz keyword involved and the corresponding ffestrSecond value. */
ffelexHandler
ffestb_endxyz (ffelexToken t)
{
ffeTokenLength i;
unsigned const char *p;
switch (ffelex_token_type (ffesta_tokens[0]))
{
case FFELEX_typeNAME:
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_end3_ (t);
case FFELEX_typeNAME:
ffesta_confirmed ();
switch (ffestb_args.endxyz.second)
{
case FFESTR_secondBLOCK:
if (ffesta_second_kw != FFESTR_secondDATA)
goto bad_1; /* :::::::::::::::::::: */
return (ffelexHandler) ffestb_end2_;
default:
return (ffelexHandler) ffestb_end2_ (t);
}
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
}
case FFELEX_typeNAMES:
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
break;
}
ffesta_confirmed ();
if (ffestb_args.endxyz.second == FFESTR_secondBLOCK)
{
i = FFESTR_firstlEND;
goto bad_i; /* :::::::::::::::::::: */
}
if (ffelex_token_length (ffesta_tokens[0]) != ffestb_args.endxyz.len)
{
p = ffelex_token_text (ffesta_tokens[0])
+ (i = ffestb_args.endxyz.len);
if (!ffesrc_is_name_init (*p))
goto bad_i; /* :::::::::::::::::::: */
ffesta_tokens[1]
= ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
return (ffelexHandler) ffestb_end3_ (t);
}
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_end3_ (t);
default:
goto bad_0; /* :::::::::::::::::::: */
}
bad_0: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
bad_1: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero); /* Invalid second token. */
bad_i: /* :::::::::::::::::::: */
ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0], i, t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_end1_ -- "END" "BLOCK"
return ffestb_end1_; // to lexer
Make sure the next token is "DATA". */
static ffelexHandler
ffestb_end1_ (ffelexToken t)
{
if ((ffelex_token_type (t) == FFELEX_typeNAME)
&& (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t), "DATA",
"data", "Data")
== 0))
{
return (ffelexHandler) ffestb_end2_;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_end2_ -- "END" <unit-kind>
return ffestb_end2_; // to lexer
Make sure the next token is a NAME or EOS. */
static ffelexHandler
ffestb_end2_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeNAME:
ffesta_tokens[1] = ffelex_token_use (t);
return (ffelexHandler) ffestb_end3_;
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_tokens[1] = NULL;
return (ffelexHandler) ffestb_end3_ (t);
default:
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero);
}
}
/* ffestb_end3_ -- "END" <unit-kind> (NAME)
return ffestb_end3_; // to lexer
Make sure the next token is an EOS, then implement the statement. */
static ffelexHandler
ffestb_end3_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
default:
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero);
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
if (ffestb_args.endxyz.second == FFESTR_secondNone)
{
if (!ffesta_is_inhibited ())
ffestc_end ();
return (ffelexHandler) ffesta_zero (t);
}
break;
}
switch (ffestb_args.endxyz.second)
{
case FFESTR_secondIF:
if (!ffesta_is_inhibited ())
ffestc_R806 (ffesta_tokens[1]);
break;
case FFESTR_secondSELECT:
if (!ffesta_is_inhibited ())
ffestc_R811 (ffesta_tokens[1]);
break;
case FFESTR_secondDO:
if (!ffesta_is_inhibited ())
ffestc_R825 (ffesta_tokens[1]);
break;
case FFESTR_secondPROGRAM:
if (!ffesta_is_inhibited ())
ffestc_R1103 (ffesta_tokens[1]);
break;
case FFESTR_secondBLOCK:
case FFESTR_secondBLOCKDATA:
if (!ffesta_is_inhibited ())
ffestc_R1112 (ffesta_tokens[1]);
break;
case FFESTR_secondFUNCTION:
if (!ffesta_is_inhibited ())
ffestc_R1221 (ffesta_tokens[1]);
break;
case FFESTR_secondSUBROUTINE:
if (!ffesta_is_inhibited ())
ffestc_R1225 (ffesta_tokens[1]);
break;
default:
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", ffesta_tokens[0]);
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero);
}
if (ffesta_tokens[1] != NULL)
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffesta_zero (t);
}
/* ffestb_goto -- Parse the GOTO statement
return ffestb_goto; // to lexer
Make sure the statement has a valid form for the GOTO statement. If it
does, implement the statement. */
ffelexHandler
ffestb_goto (ffelexToken t)
{
ffeTokenLength i;
unsigned const char *p;
ffelexHandler next;
ffelexToken nt;
switch (ffelex_token_type (ffesta_tokens[0]))
{
case FFELEX_typeNAME:
switch (ffesta_first_kw)
{
case FFESTR_firstGO:
if ((ffelex_token_type (t) != FFELEX_typeNAME)
|| (ffesta_second_kw != FFESTR_secondTO))
goto bad_1; /* :::::::::::::::::::: */
ffesta_confirmed ();
return (ffelexHandler) ffestb_goto1_;
case FFESTR_firstGOTO:
return (ffelexHandler) ffestb_goto1_ (t);
default:
goto bad_0; /* :::::::::::::::::::: */
}
case FFELEX_typeNAMES:
if (ffesta_first_kw != FFESTR_firstGOTO)
goto bad_0; /* :::::::::::::::::::: */
switch (ffelex_token_type (t))
{
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
goto bad_1; /* :::::::::::::::::::: */
default:
goto bad_1; /* :::::::::::::::::::: */
case FFELEX_typeOPEN_PAREN:
case FFELEX_typePERCENT: /* Since GOTO I%J is apparently valid
in '90. */
case FFELEX_typeCOMMA:
break;
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
break;
}
if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlGOTO)
{
p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlGOTO);
if (ISDIGIT (*p))
{
nt = ffelex_token_number_from_names (ffesta_tokens[0], i);
p += ffelex_token_length (nt);
i += ffelex_token_length (nt);
if (*p != '\0')
{
ffelex_token_kill (nt);
goto bad_i; /* :::::::::::::::::::: */
}
}
else if (ffesrc_is_name_init (*p))
{
nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0);
}
else
goto bad_i; /* :::::::::::::::::::: */
next = (ffelexHandler) ffestb_goto1_ (nt);
ffelex_token_kill (nt);
return (ffelexHandler) (*next) (t);
}
return (ffelexHandler) ffestb_goto1_ (t);
default:
goto bad_0; /* :::::::::::::::::::: */
}
bad_0: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", ffesta_tokens[0]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
bad_1: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", t);
return (ffelexHandler) ffelex_swallow_tokens (t,
(ffelexHandler) ffesta_zero); /* Invalid second token. */
bad_i: /* :::::::::::::::::::: */
ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "GO TO", ffesta_tokens[0], i, t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_goto1_ -- "GOTO" or "GO" "TO"
return ffestb_goto1_; // to lexer
Make sure the statement has a valid form for the GOTO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_goto1_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeNUMBER:
if (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME)
ffesta_confirmed ();
ffesta_tokens[1] = ffelex_token_use (t);
return (ffelexHandler) ffestb_goto2_;
case FFELEX_typeOPEN_PAREN:
ffesta_tokens[1] = ffelex_token_use (t);
ffestb_subrargs_.label_list.labels = ffestt_tokenlist_create ();
ffestb_subrargs_.label_list.handler = (ffelexHandler) ffestb_goto3_;
return (ffelexHandler) ffestb_subr_label_list_;
case FFELEX_typeNAME:
if (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME)
ffesta_confirmed ();
return (ffelexHandler) (*((ffelexHandler)
ffeexpr_lhs (ffesta_output_pool,
FFEEXPR_contextAGOTO,
(ffeexprCallback) ffestb_goto4_)))
(t);
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
case FFELEX_typeCOMMA:
case FFELEX_typeCOLONCOLON:
ffesta_confirmed (); /* Error, but clearly intended. */
break;
default:
break;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_goto2_ -- "GO/TO" NUMBER
return ffestb_goto2_; // to lexer
Make sure the statement has a valid form for the GOTO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_goto2_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
if (!ffesta_is_inhibited ())
ffestc_R836 (ffesta_tokens[1]);
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffesta_zero (t);
default:
break;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", t);
ffelex_token_kill (ffesta_tokens[1]);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_goto3_ -- "GO/TO" OPEN_PAREN label-list CLOSE_PAREN
return ffestb_goto3_; // to lexer
Make sure the statement has a valid form for the GOTO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_goto3_ (ffelexToken t)
{
if (!ffestb_subrargs_.label_list.ok)
goto bad; /* :::::::::::::::::::: */
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
ffesta_confirmed ();
return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextCGOTO,
(ffeexprCallback) ffestb_goto5_);
case FFELEX_typeEQUALS:
case FFELEX_typePOINTS:
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
break;
default:
ffesta_confirmed ();
/* Fall through. */
case FFELEX_typeOPEN_PAREN: /* Could still be assignment!! */
return (ffelexHandler) (*((ffelexHandler)
ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextCGOTO,
(ffeexprCallback) ffestb_goto5_)))
(t);
}
bad: /* :::::::::::::::::::: */
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "computed-GOTO", t);
ffelex_token_kill (ffesta_tokens[1]);
ffestt_tokenlist_kill (ffestb_subrargs_.label_list.labels);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_goto4_ -- "GO/TO" expr
(ffestb_goto4_) // to expression handler
Make sure the statement has a valid form for the GOTO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_goto4_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeCOMMA:
ffesta_confirmed ();
if (expr == NULL)
break;
ffesta_tokens[1] = ffelex_token_use (ft);
ffestb_local_.go_to.expr = expr;
return (ffelexHandler) ffestb_goto6_;
case FFELEX_typeOPEN_PAREN:
if (expr == NULL)
break;
ffesta_tokens[1] = ffelex_token_use (ft);
ffestb_local_.go_to.expr = expr;
return (ffelexHandler) ffestb_goto6_ (t);
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
ffesta_confirmed ();
if (expr == NULL)
break;
if (!ffesta_is_inhibited ())
ffestc_R839 (expr, ft, NULL);
return (ffelexHandler) ffesta_zero (t);
default:
break;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assigned-GOTO", t);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_goto5_ -- "GO/TO" OPEN_PAREN label-list CLOSE_PAREN (COMMA) expr
(ffestb_goto5_) // to expression handler
Make sure the statement has a valid form for the GOTO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_goto5_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeEOS:
case FFELEX_typeSEMICOLON:
if (expr == NULL)
break;
ffesta_confirmed ();
if (!ffesta_is_inhibited ())
ffestc_R837 (ffestb_subrargs_.label_list.labels, expr, ft);
ffelex_token_kill (ffesta_tokens[1]);
ffestt_tokenlist_kill (ffestb_subrargs_.label_list.labels);
return (ffelexHandler) ffesta_zero (t);
default:
break;
}
ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "computed-GOTO", t);
ffelex_token_kill (ffesta_tokens[1]);
ffestt_tokenlist_kill (ffestb_subrargs_.label_list.labels);
return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero);
}
/* ffestb_goto6_ -- "GO/TO" expr (COMMA)
return ffestb_goto6_; // to lexer
Make sure the statement has a valid form for the GOTO statement. If it
does, implement the statement. */
static ffelexHandler
ffestb_goto6_ (ffelexToken t)
{
switch (ffelex_token_type (t))
{
case FFELEX_typeOPEN_PAREN:
ff