]>
Commit | Line | Data |
---|---|---|
5ff904cd JL |
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). | |
4 | ||
5 | This file is part of GNU Fortran. | |
6 | ||
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) | |
10 | any later version. | |
11 | ||
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. | |
16 | ||
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 | |
20 | 02111-1307, USA. | |
21 | ||
22 | Related Modules: | |
23 | st.c | |
24 | ||
25 | Description: | |
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. | |
37 | ||
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 | |
50 | are local (static). | |
51 | ||
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, | |
64 | OPTIONAL, | |
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. | |
68 | ||
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. | |
81 | ||
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. | |
84 | ||
85 | Modifications: | |
86 | */ | |
87 | ||
88 | /* Include files. */ | |
89 | ||
90 | #include "proj.h" | |
91 | #include <ctype.h> | |
92 | #include "stb.h" | |
93 | #include "bad.h" | |
94 | #include "expr.h" | |
95 | #include "lex.h" | |
96 | #include "malloc.h" | |
97 | #include "src.h" | |
98 | #include "sta.h" | |
99 | #include "stc.h" | |
100 | #include "stp.h" | |
101 | #include "str.h" | |
102 | ||
103 | /* Externals defined here. */ | |
104 | ||
105 | struct _ffestb_args_ ffestb_args; | |
106 | ||
107 | /* Simple definitions and enumerations. */ | |
108 | ||
109 | #define FFESTB_KILL_EASY_ 1 /* 1 for only one _subr_kill_xyz_ fn. */ | |
110 | ||
111 | /* Internal typedefs. */ | |
112 | ||
113 | union ffestb_subrargs_u_ | |
114 | { | |
115 | struct | |
116 | { | |
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 | |
120 | CLOSE_PAREN. */ | |
121 | } | |
122 | label_list; | |
123 | struct | |
124 | { | |
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 | |
129 | CLOSE_PAREN. */ | |
130 | ffeexprContext ctx; /* DIMLIST or DIMLISTCOMMON. */ | |
131 | #ifdef FFECOM_dimensionsMAX | |
132 | int ndims; /* For backends that really can't have | |
133 | infinite dims. */ | |
134 | #endif | |
135 | } | |
136 | dim_list; | |
137 | struct | |
138 | { | |
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 | |
143 | context. */ | |
144 | bool ok; /* Output arg, TRUE if list ended in | |
145 | CLOSE_PAREN. */ | |
146 | bool names; /* Do ffelex_set_names(TRUE) before return. */ | |
147 | } | |
148 | name_list; | |
149 | }; | |
150 | ||
151 | union ffestb_local_u_ | |
152 | { | |
153 | struct | |
154 | { | |
155 | ffebld expr; | |
156 | } | |
157 | call_stmt; | |
158 | struct | |
159 | { | |
160 | ffebld expr; | |
161 | } | |
162 | go_to; | |
163 | struct | |
164 | { | |
165 | ffebld dest; | |
166 | bool vxtparam; /* If assignment might really be VXT | |
167 | PARAMETER stmt. */ | |
168 | } | |
169 | let; | |
170 | struct | |
171 | { | |
172 | ffebld expr; | |
173 | } | |
174 | if_stmt; | |
175 | struct | |
176 | { | |
177 | ffebld expr; | |
178 | } | |
179 | else_stmt; | |
180 | struct | |
181 | { | |
182 | ffebld expr; | |
183 | } | |
184 | dowhile; | |
185 | struct | |
186 | { | |
187 | ffebld var; | |
188 | ffebld start; | |
189 | ffebld end; | |
190 | } | |
191 | do_stmt; | |
192 | struct | |
193 | { | |
194 | bool is_cblock; | |
195 | } | |
196 | R522; | |
197 | struct | |
198 | { | |
199 | ffebld expr; | |
200 | bool started; | |
201 | } | |
202 | parameter; | |
203 | struct | |
204 | { | |
205 | ffesttExprList exprs; | |
206 | bool started; | |
207 | } | |
208 | equivalence; | |
209 | struct | |
210 | { | |
211 | ffebld expr; | |
212 | bool started; | |
213 | } | |
214 | data; | |
215 | struct | |
216 | { | |
217 | ffestrOther kw; | |
218 | } | |
219 | varlist; | |
220 | #if FFESTR_F90 | |
221 | struct | |
222 | { | |
223 | ffestrOther kw; | |
224 | } | |
225 | type; | |
226 | #endif | |
227 | struct | |
228 | { | |
229 | ffelexHandler next; | |
230 | } | |
231 | construct; | |
232 | struct | |
233 | { | |
234 | ffesttFormatList f; | |
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. */ | |
243 | } | |
244 | format; | |
245 | #if FFESTR_F90 | |
246 | struct | |
247 | { | |
248 | bool started; | |
249 | } | |
250 | moduleprocedure; | |
251 | #endif | |
252 | struct | |
253 | { | |
254 | ffebld expr; | |
255 | } | |
256 | selectcase; | |
257 | struct | |
258 | { | |
259 | ffesttCaseList cases; | |
260 | } | |
261 | case_stmt; | |
262 | #if FFESTR_F90 | |
263 | struct | |
264 | { | |
265 | ffesttExprList exprs; | |
266 | ffebld expr; | |
267 | } | |
268 | heap; | |
269 | #endif | |
270 | #if FFESTR_F90 | |
271 | struct | |
272 | { | |
273 | ffesttExprList exprs; | |
274 | } | |
275 | R624; | |
276 | #endif | |
277 | #if FFESTR_F90 | |
278 | struct | |
279 | { | |
280 | ffestpDefinedOperator operator; | |
281 | bool assignment; /* TRUE for INTERFACE ASSIGNMENT, FALSE for | |
282 | ...OPERATOR. */ | |
283 | bool slash; /* TRUE if OPEN_ARRAY, FALSE if OPEN_PAREN. */ | |
284 | } | |
285 | interface; | |
286 | #endif | |
287 | struct | |
288 | { | |
289 | bool is_cblock; | |
290 | } | |
291 | V014; | |
292 | #if FFESTR_VXT | |
293 | struct | |
294 | { | |
295 | bool started; | |
296 | ffebld u; | |
297 | ffebld m; | |
298 | ffebld n; | |
299 | ffebld asv; | |
300 | } | |
301 | V025; | |
302 | #endif | |
303 | struct | |
304 | { | |
305 | ffestpBeruIx ix; | |
306 | bool label; | |
307 | bool left; | |
308 | ffeexprContext context; | |
309 | } | |
310 | beru; | |
311 | struct | |
312 | { | |
313 | ffestpCloseIx ix; | |
314 | bool label; | |
315 | bool left; | |
316 | ffeexprContext context; | |
317 | } | |
318 | close; | |
319 | struct | |
320 | { | |
321 | ffestpDeleteIx ix; | |
322 | bool label; | |
323 | bool left; | |
324 | ffeexprContext context; | |
325 | } | |
326 | delete; | |
327 | struct | |
328 | { | |
329 | ffestpDeleteIx ix; | |
330 | bool label; | |
331 | bool left; | |
332 | ffeexprContext context; | |
333 | } | |
334 | find; | |
335 | struct | |
336 | { | |
337 | ffestpInquireIx ix; | |
338 | bool label; | |
339 | bool left; | |
340 | ffeexprContext context; | |
341 | bool may_be_iolength; | |
342 | } | |
343 | inquire; | |
344 | struct | |
345 | { | |
346 | ffestpOpenIx ix; | |
347 | bool label; | |
348 | bool left; | |
349 | ffeexprContext context; | |
350 | } | |
351 | open; | |
352 | struct | |
353 | { | |
354 | ffestpReadIx ix; | |
355 | bool label; | |
356 | bool left; | |
357 | ffeexprContext context; | |
358 | } | |
359 | read; | |
360 | struct | |
361 | { | |
362 | ffestpRewriteIx ix; | |
363 | bool label; | |
364 | bool left; | |
365 | ffeexprContext context; | |
366 | } | |
367 | rewrite; | |
368 | struct | |
369 | { | |
370 | ffestpWriteIx ix; | |
371 | bool label; | |
372 | bool left; | |
373 | ffeexprContext context; | |
374 | } | |
375 | vxtcode; | |
376 | struct | |
377 | { | |
378 | ffestpWriteIx ix; | |
379 | bool label; | |
380 | bool left; | |
381 | ffeexprContext context; | |
382 | } | |
383 | write; | |
384 | #if FFESTR_F90 | |
385 | struct | |
386 | { | |
387 | bool started; | |
388 | } | |
389 | structure; | |
390 | #endif | |
391 | struct | |
392 | { | |
393 | bool started; | |
394 | } | |
395 | common; | |
396 | struct | |
397 | { | |
398 | bool started; | |
399 | } | |
400 | dimension; | |
401 | struct | |
402 | { | |
403 | bool started; | |
404 | } | |
405 | dimlist; | |
406 | struct | |
407 | { | |
408 | char *badname; | |
409 | ffestrFirst first_kw; | |
410 | bool is_subr; | |
411 | } | |
412 | dummy; | |
413 | struct | |
414 | { | |
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; | |
421 | ffebld expr; | |
422 | ffesttTokenList toklist;/* For ambiguity resolution. */ | |
423 | ffesttImpList imps; /* List of IMPLICIT letters. */ | |
424 | ffelexHandler imp_handler; /* Call if paren list wasn't letters. */ | |
425 | char *badname; | |
426 | ffestrOther kw; /* INTENT(IN/OUT/INOUT). */ | |
427 | ffestpType type; | |
428 | bool parameter; /* If PARAMETER attribute seen (governs =expr | |
429 | context). */ | |
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 | |
434 | far? */ | |
435 | bool imp_started; /* Started IMPLICIT statement already. */ | |
436 | bool imp_seen_comma; /* TRUE if next COMMA within parens means not | |
437 | R541. */ | |
438 | } | |
439 | decl; | |
440 | struct | |
441 | { | |
442 | bool started; | |
443 | } | |
444 | vxtparam; | |
445 | }; /* Merge with the one in ffestb later. */ | |
446 | ||
447 | /* Private include files. */ | |
448 | ||
449 | ||
450 | /* Internal structure definitions. */ | |
451 | ||
452 | ||
453 | /* Static objects accessed by functions in this module. */ | |
454 | ||
455 | static union ffestb_subrargs_u_ ffestb_subrargs_; | |
456 | static union ffestb_local_u_ ffestb_local_; | |
457 | ||
458 | /* Static functions (internal). */ | |
459 | ||
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, | |
463 | ffelexToken t); | |
464 | static ffelexHandler ffestb_subr_dimlist_1_ (ffelexToken ft, ffebld expr, | |
465 | ffelexToken t); | |
466 | static ffelexHandler ffestb_subr_dimlist_2_ (ffelexToken ft, ffebld expr, | |
467 | ffelexToken t); | |
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, | |
474 | ffelexToken t); | |
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, | |
478 | ffelexToken t); | |
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, | |
482 | ffelexToken t); | |
483 | static ffelexHandler ffestb_decl_typeparams_3_ (ffelexToken ft, ffebld expr, | |
484 | ffelexToken t); | |
485 | #if FFESTR_F90 | |
486 | static ffelexHandler ffestb_decl_typetype1_ (ffelexToken t); | |
487 | static ffelexHandler ffestb_decl_typetype2_ (ffelexToken t); | |
488 | #endif | |
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, | |
495 | ffelexToken t); | |
496 | static ffelexHandler ffestb_do5_ (ffelexToken t); | |
497 | static ffelexHandler ffestb_do6_ (ffelexToken ft, ffebld expr, | |
498 | ffelexToken t); | |
499 | static ffelexHandler ffestb_do7_ (ffelexToken ft, ffebld expr, | |
500 | ffelexToken t); | |
501 | static ffelexHandler ffestb_do8_ (ffelexToken ft, ffebld expr, | |
502 | ffelexToken t); | |
503 | static ffelexHandler ffestb_do9_ (ffelexToken ft, ffebld expr, | |
504 | ffelexToken t); | |
505 | static ffelexHandler ffestb_else1_ (ffelexToken t); | |
506 | static ffelexHandler ffestb_else2_ (ffelexToken ft, ffebld expr, | |
507 | ffelexToken t); | |
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, | |
518 | ffelexToken t); | |
519 | static ffelexHandler ffestb_goto5_ (ffelexToken ft, ffebld expr, | |
520 | ffelexToken t); | |
521 | static ffelexHandler ffestb_goto6_ (ffelexToken t); | |
522 | static ffelexHandler ffestb_goto7_ (ffelexToken t); | |
523 | static ffelexHandler ffestb_halt1_ (ffelexToken ft, ffebld expr, | |
524 | ffelexToken t); | |
525 | static ffelexHandler ffestb_if1_ (ffelexToken ft, ffebld expr, | |
526 | ffelexToken t); | |
527 | static ffelexHandler ffestb_if2_ (ffelexToken t); | |
528 | static ffelexHandler ffestb_if3_ (ffelexToken t); | |
529 | static ffelexHandler ffestb_let1_ (ffelexToken ft, ffebld expr, | |
530 | ffelexToken t); | |
531 | static ffelexHandler ffestb_let2_ (ffelexToken ft, ffebld expr, | |
532 | ffelexToken t); | |
533 | #if FFESTR_F90 | |
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); | |
538 | #endif | |
539 | #if FFESTR_F90 | |
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); | |
544 | #endif | |
545 | static ffelexHandler ffestb_varlist5_ (ffelexToken t); | |
546 | static ffelexHandler ffestb_varlist6_ (ffelexToken t); | |
547 | #if FFESTR_F90 | |
548 | static ffelexHandler ffestb_where1_ (ffelexToken ft, ffebld expr, | |
549 | ffelexToken t); | |
550 | static ffelexHandler ffestb_where2_ (ffelexToken t); | |
551 | static ffelexHandler ffestb_where3_ (ffelexToken t); | |
552 | #endif | |
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, | |
558 | ffelexToken t); | |
559 | static ffelexHandler ffestb_R5282_ (ffelexToken ft, ffebld expr, | |
560 | ffelexToken t); | |
561 | static ffelexHandler ffestb_R5283_ (ffelexToken ft, ffebld expr, | |
562 | ffelexToken t); | |
563 | static ffelexHandler ffestb_R5284_ (ffelexToken t); | |
564 | static ffelexHandler ffestb_R5371_ (ffelexToken ft, ffebld expr, | |
565 | ffelexToken t); | |
566 | static ffelexHandler ffestb_R5372_ (ffelexToken ft, ffebld expr, | |
567 | ffelexToken t); | |
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, | |
575 | ffelexToken t); | |
576 | static ffelexHandler ffestb_R5442_ (ffelexToken ft, ffebld expr, | |
577 | ffelexToken t); | |
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, | |
585 | ffelexToken t); | |
586 | static ffelexHandler ffestb_R8401_ (ffelexToken ft, ffebld expr, | |
587 | ffelexToken t); | |
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, | |
598 | ffelexToken t); | |
599 | static ffelexHandler ffestb_R12271_ (ffelexToken ft, ffebld expr, | |
600 | ffelexToken t); | |
601 | static ffelexHandler ffestb_construct1_ (ffelexToken t); | |
602 | static ffelexHandler ffestb_construct2_ (ffelexToken t); | |
603 | #if FFESTR_F90 | |
604 | static ffelexHandler ffestb_heap1_ (ffelexToken ft, ffebld expr, | |
605 | ffelexToken t); | |
606 | static ffelexHandler ffestb_heap2_ (ffelexToken t); | |
607 | static ffelexHandler ffestb_heap3_ (ffelexToken t); | |
608 | static ffelexHandler ffestb_heap4_ (ffelexToken ft, ffebld expr, | |
609 | ffelexToken t); | |
610 | static ffelexHandler ffestb_heap5_ (ffelexToken t); | |
611 | #endif | |
612 | #if FFESTR_F90 | |
613 | static ffelexHandler ffestb_module1_ (ffelexToken t); | |
614 | static ffelexHandler ffestb_module2_ (ffelexToken t); | |
615 | static ffelexHandler ffestb_module3_ (ffelexToken t); | |
616 | #endif | |
617 | static ffelexHandler ffestb_R8091_ (ffelexToken t); | |
618 | static ffelexHandler ffestb_R8092_ (ffelexToken ft, ffebld expr, | |
619 | ffelexToken t); | |
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, | |
624 | ffelexToken t); | |
625 | static ffelexHandler ffestb_R8104_ (ffelexToken ft, ffebld expr, | |
626 | ffelexToken t); | |
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, | |
642 | ffelexToken t); | |
643 | static ffelexHandler ffestb_R100116_ (ffelexToken ft, ffebld expr, | |
644 | ffelexToken t); | |
645 | static ffelexHandler ffestb_R100117_ (ffelexToken ft, ffebld expr, | |
646 | ffelexToken t); | |
647 | static ffelexHandler ffestb_R100118_ (ffelexToken ft, ffebld expr, | |
648 | ffelexToken t); | |
649 | #if FFESTR_F90 | |
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); | |
662 | #endif | |
663 | #if FFESTR_F90 | |
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); | |
670 | #endif | |
671 | static ffelexHandler ffestb_S3P41_ (ffelexToken ft, ffebld expr, | |
672 | ffelexToken t); | |
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); | |
677 | #if FFESTR_VXT | |
678 | static ffelexHandler ffestb_V0251_ (ffelexToken t); | |
679 | static ffelexHandler ffestb_V0252_ (ffelexToken ft, ffebld expr, | |
680 | ffelexToken t); | |
681 | static ffelexHandler ffestb_V0253_ (ffelexToken ft, ffebld expr, | |
682 | ffelexToken t); | |
683 | static ffelexHandler ffestb_V0254_ (ffelexToken ft, ffebld expr, | |
684 | ffelexToken t); | |
685 | static ffelexHandler ffestb_V0255_ (ffelexToken t); | |
686 | static ffelexHandler ffestb_V0256_ (ffelexToken t); | |
687 | static ffelexHandler ffestb_V0257_ (ffelexToken ft, ffebld expr, | |
688 | ffelexToken t); | |
689 | static ffelexHandler ffestb_V0258_ (ffelexToken t); | |
690 | #endif | |
691 | #if FFESTB_KILL_EASY_ | |
692 | static void ffestb_subr_kill_easy_ (ffestpInquireIx max); | |
693 | #else | |
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); | |
707 | #endif | |
708 | static ffelexHandler ffestb_beru1_ (ffelexToken ft, ffebld expr, | |
709 | ffelexToken t); | |
710 | static ffelexHandler ffestb_beru2_ (ffelexToken t); | |
711 | static ffelexHandler ffestb_beru3_ (ffelexToken t); | |
712 | static ffelexHandler ffestb_beru4_ (ffelexToken ft, ffebld expr, | |
713 | ffelexToken t); | |
714 | static ffelexHandler ffestb_beru5_ (ffelexToken t); | |
715 | static ffelexHandler ffestb_beru6_ (ffelexToken t); | |
716 | static ffelexHandler ffestb_beru7_ (ffelexToken ft, ffebld expr, | |
717 | ffelexToken t); | |
718 | static ffelexHandler ffestb_beru8_ (ffelexToken t); | |
719 | static ffelexHandler ffestb_beru9_ (ffelexToken t); | |
720 | static ffelexHandler ffestb_beru10_ (ffelexToken t); | |
721 | #if FFESTR_VXT | |
722 | static ffelexHandler ffestb_vxtcode1_ (ffelexToken ft, ffebld expr, | |
723 | ffelexToken t); | |
724 | static ffelexHandler ffestb_vxtcode2_ (ffelexToken ft, ffebld expr, | |
725 | ffelexToken t); | |
726 | static ffelexHandler ffestb_vxtcode3_ (ffelexToken ft, ffebld expr, | |
727 | ffelexToken t); | |
728 | static ffelexHandler ffestb_vxtcode4_ (ffelexToken t); | |
729 | static ffelexHandler ffestb_vxtcode5_ (ffelexToken t); | |
730 | static ffelexHandler ffestb_vxtcode6_ (ffelexToken ft, ffebld expr, | |
731 | ffelexToken t); | |
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, | |
736 | ffelexToken t); | |
737 | #endif | |
738 | static ffelexHandler ffestb_R9041_ (ffelexToken t); | |
739 | static ffelexHandler ffestb_R9042_ (ffelexToken t); | |
740 | static ffelexHandler ffestb_R9043_ (ffelexToken ft, ffebld expr, | |
741 | ffelexToken t); | |
742 | static ffelexHandler ffestb_R9044_ (ffelexToken t); | |
743 | static ffelexHandler ffestb_R9045_ (ffelexToken t); | |
744 | static ffelexHandler ffestb_R9046_ (ffelexToken ft, ffebld expr, | |
745 | ffelexToken t); | |
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, | |
752 | ffelexToken t); | |
753 | static ffelexHandler ffestb_R9074_ (ffelexToken t); | |
754 | static ffelexHandler ffestb_R9075_ (ffelexToken t); | |
755 | static ffelexHandler ffestb_R9076_ (ffelexToken ft, ffebld expr, | |
756 | ffelexToken t); | |
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, | |
761 | ffelexToken t); | |
762 | static ffelexHandler ffestb_R9092_ (ffelexToken t); | |
763 | static ffelexHandler ffestb_R9093_ (ffelexToken t); | |
764 | static ffelexHandler ffestb_R9094_ (ffelexToken ft, ffebld expr, | |
765 | ffelexToken t); | |
766 | static ffelexHandler ffestb_R9095_ (ffelexToken t); | |
767 | static ffelexHandler ffestb_R9096_ (ffelexToken t); | |
768 | static ffelexHandler ffestb_R9097_ (ffelexToken ft, ffebld expr, | |
769 | ffelexToken t); | |
770 | static ffelexHandler ffestb_R9098_ (ffelexToken t); | |
771 | static ffelexHandler ffestb_R9099_ (ffelexToken t); | |
772 | static ffelexHandler ffestb_R90910_ (ffelexToken ft, ffebld expr, | |
773 | ffelexToken t); | |
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, | |
778 | ffelexToken t); | |
779 | static ffelexHandler ffestb_R90915_ (ffelexToken ft, ffebld expr, | |
780 | ffelexToken t); | |
781 | static ffelexHandler ffestb_R9101_ (ffelexToken t); | |
782 | static ffelexHandler ffestb_R9102_ (ffelexToken t); | |
783 | static ffelexHandler ffestb_R9103_ (ffelexToken ft, ffebld expr, | |
784 | ffelexToken t); | |
785 | static ffelexHandler ffestb_R9104_ (ffelexToken t); | |
786 | static ffelexHandler ffestb_R9105_ (ffelexToken t); | |
787 | static ffelexHandler ffestb_R9106_ (ffelexToken ft, ffebld expr, | |
788 | ffelexToken t); | |
789 | static ffelexHandler ffestb_R9107_ (ffelexToken t); | |
790 | static ffelexHandler ffestb_R9108_ (ffelexToken t); | |
791 | static ffelexHandler ffestb_R9109_ (ffelexToken ft, ffebld expr, | |
792 | ffelexToken t); | |
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, | |
797 | ffelexToken t); | |
798 | static ffelexHandler ffestb_R91014_ (ffelexToken ft, ffebld expr, | |
799 | ffelexToken t); | |
800 | static ffelexHandler ffestb_R9111_ (ffelexToken ft, ffebld expr, | |
801 | ffelexToken t); | |
802 | static ffelexHandler ffestb_R9112_ (ffelexToken ft, ffebld expr, | |
803 | ffelexToken t); | |
804 | static ffelexHandler ffestb_R9231_ (ffelexToken t); | |
805 | static ffelexHandler ffestb_R9232_ (ffelexToken t); | |
806 | static ffelexHandler ffestb_R9233_ (ffelexToken ft, ffebld expr, | |
807 | ffelexToken t); | |
808 | static ffelexHandler ffestb_R9234_ (ffelexToken t); | |
809 | static ffelexHandler ffestb_R9235_ (ffelexToken t); | |
810 | static ffelexHandler ffestb_R9236_ (ffelexToken ft, ffebld expr, | |
811 | ffelexToken t); | |
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, | |
817 | ffelexToken t); | |
818 | #if FFESTR_VXT | |
819 | static ffelexHandler ffestb_V0181_ (ffelexToken t); | |
820 | static ffelexHandler ffestb_V0182_ (ffelexToken t); | |
821 | static ffelexHandler ffestb_V0183_ (ffelexToken ft, ffebld expr, | |
822 | ffelexToken t); | |
823 | static ffelexHandler ffestb_V0184_ (ffelexToken t); | |
824 | static ffelexHandler ffestb_V0185_ (ffelexToken t); | |
825 | static ffelexHandler ffestb_V0186_ (ffelexToken ft, ffebld expr, | |
826 | ffelexToken t); | |
827 | static ffelexHandler ffestb_V0187_ (ffelexToken t); | |
828 | static ffelexHandler ffestb_V0188_ (ffelexToken t); | |
829 | static ffelexHandler ffestb_V0189_ (ffelexToken ft, ffebld expr, | |
830 | ffelexToken t); | |
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, | |
835 | ffelexToken t); | |
836 | static ffelexHandler ffestb_V0191_ (ffelexToken ft, ffebld expr, | |
837 | ffelexToken t); | |
838 | static ffelexHandler ffestb_V0192_ (ffelexToken ft, ffebld expr, | |
839 | ffelexToken t); | |
840 | #endif | |
841 | static ffelexHandler ffestb_V0201_ (ffelexToken ft, ffebld expr, | |
842 | ffelexToken t); | |
843 | static ffelexHandler ffestb_V0202_ (ffelexToken ft, ffebld expr, | |
844 | ffelexToken t); | |
845 | #if FFESTR_VXT | |
846 | static ffelexHandler ffestb_V0211_ (ffelexToken t); | |
847 | static ffelexHandler ffestb_V0212_ (ffelexToken t); | |
848 | static ffelexHandler ffestb_V0213_ (ffelexToken ft, ffebld expr, | |
849 | ffelexToken t); | |
850 | static ffelexHandler ffestb_V0214_ (ffelexToken t); | |
851 | static ffelexHandler ffestb_V0215_ (ffelexToken t); | |
852 | static ffelexHandler ffestb_V0216_ (ffelexToken ft, ffebld expr, | |
853 | ffelexToken t); | |
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, | |
860 | ffelexToken t); | |
861 | static ffelexHandler ffestb_V0264_ (ffelexToken t); | |
862 | static ffelexHandler ffestb_V0265_ (ffelexToken t); | |
863 | static ffelexHandler ffestb_V0266_ (ffelexToken ft, ffebld expr, | |
864 | ffelexToken t); | |
865 | static ffelexHandler ffestb_V0267_ (ffelexToken t); | |
866 | static ffelexHandler ffestb_V0268_ (ffelexToken t); | |
867 | static ffelexHandler ffestb_V0269_ (ffelexToken t); | |
868 | #endif | |
869 | #if FFESTR_F90 | |
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); | |
874 | #endif | |
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); | |
888 | #if FFESTR_F90 | |
889 | static ffelexHandler ffestb_R6241_ (ffelexToken ft, ffebld expr, | |
890 | ffelexToken t); | |
891 | static ffelexHandler ffestb_R6242_ (ffelexToken t); | |
892 | #endif | |
893 | static ffelexHandler ffestb_R12291_ (ffelexToken t); | |
894 | static ffelexHandler ffestb_R12292_ (ffelexToken ft, ffebld expr, | |
895 | ffelexToken t); | |
896 | static ffelexHandler ffestb_decl_chartype1_ (ffelexToken t); | |
897 | #if FFESTR_F90 | |
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); | |
902 | #endif | |
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); | |
906 | #if FFESTR_F90 | |
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); | |
911 | #endif | |
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, | |
921 | ffelexToken t); | |
922 | static ffelexHandler ffestb_decl_ents_7_ (ffelexToken t); | |
923 | static ffelexHandler ffestb_decl_ents_8_ (ffelexToken ft, ffebld expr, | |
924 | ffelexToken t); | |
925 | static ffelexHandler ffestb_decl_ents_9_ (ffelexToken ft, ffebld expr, | |
926 | ffelexToken t); | |
927 | static ffelexHandler ffestb_decl_ents_10_ (ffelexToken ft, ffebld expr, | |
928 | ffelexToken t); | |
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, | |
935 | ffelexToken t); | |
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); | |
940 | #if FFESTR_F90 | |
941 | static ffelexHandler ffestb_decl_func_ (ffelexToken t); | |
942 | #endif | |
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, | |
947 | ffelexToken t); | |
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); | |
954 | #if FFESTR_VXT | |
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); | |
967 | #endif | |
968 | static ffelexHandler ffestb_V0271_ (ffelexToken t); | |
969 | static ffelexHandler ffestb_V0272_ (ffelexToken ft, ffebld expr, | |
970 | ffelexToken t); | |
971 | static ffelexHandler ffestb_V0273_ (ffelexToken t); | |
972 | static ffelexHandler ffestb_decl_R5391_ (ffelexToken t); | |
973 | static ffelexHandler ffestb_decl_R5392_ (ffelexToken t); | |
974 | #if FFESTR_F90 | |
975 | static ffelexHandler ffestb_decl_R5393_ (ffelexToken t); | |
976 | #endif | |
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); | |
991 | ||
992 | /* Internal macros. */ | |
993 | ||
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) | |
1021 | #endif | |
1022 | \f | |
1023 | /* ffestb_subr_ambig_nope_ -- Cleans up and aborts ambig w/o confirming | |
1024 | ||
1025 | ffestb_subr_ambig_nope_(); | |
1026 | ||
1027 | Switch from ambiguity handling in _entsp_ functions to handling entities | |
1028 | in _ents_ (perform housekeeping tasks). */ | |
1029 | ||
1030 | static ffelexHandler | |
1031 | ffestb_subr_ambig_nope_ (ffelexToken t) | |
1032 | { | |
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); | |
1044 | } | |
1045 | ||
1046 | /* ffestb_subr_ambig_to_ents_ -- Switches from ambiguity to entity decl | |
1047 | ||
1048 | ffestb_subr_ambig_to_ents_(); | |
1049 | ||
1050 | Switch from ambiguity handling in _entsp_ functions to handling entities | |
1051 | in _ents_ (perform housekeeping tasks). */ | |
1052 | ||
1053 | static void | |
1054 | ffestb_subr_ambig_to_ents_ () | |
1055 | { | |
1056 | ffelexToken nt; | |
1057 | ||
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) | |
1065 | { | |
1066 | if (ffestb_local_.decl.type == FFESTP_typeCHARACTER) | |
1067 | { | |
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) | |
1073 | { | |
1074 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
1075 | ffestb_local_.decl.kind = NULL; | |
1076 | ffestb_local_.decl.kindt = NULL; | |
1077 | } | |
1078 | if (ffestb_local_.decl.lent != NULL) | |
1079 | { | |
1080 | ffelex_token_kill (ffestb_local_.decl.lent); | |
1081 | ffestb_local_.decl.len = NULL; | |
1082 | ffestb_local_.decl.lent = NULL; | |
1083 | } | |
1084 | } | |
1085 | else | |
1086 | { | |
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, | |
1090 | NULL); | |
1091 | if (ffestb_local_.decl.kindt != NULL) | |
1092 | { | |
1093 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
1094 | ffestb_local_.decl.kind = NULL; | |
1095 | ffestb_local_.decl.kindt = NULL; | |
1096 | } | |
1097 | } | |
1098 | return; | |
1099 | } | |
1100 | if (ffestb_local_.decl.type == FFESTP_typeCHARACTER) | |
1101 | { | |
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) | |
1106 | { | |
1107 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
1108 | ffestb_local_.decl.kind = NULL; | |
1109 | ffestb_local_.decl.kindt = NULL; | |
1110 | } | |
1111 | } | |
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]. */ | |
1116 | } | |
1117 | ||
1118 | /* ffestb_subr_dimlist_ -- OPEN_PAREN expr | |
1119 | ||
1120 | (ffestb_subr_dimlist_) // to expression handler | |
1121 | ||
1122 | Deal with a dimension list. | |
1123 | ||
1124 | 19-Dec-90 JCB 1.1 | |
1125 | Detect too many dimensions if backend wants it. */ | |
1126 | ||
1127 | static ffelexHandler | |
1128 | ffestb_subr_dimlist_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
1129 | { | |
1130 | switch (ffelex_token_type (t)) | |
1131 | { | |
1132 | case FFELEX_typeCLOSE_PAREN: | |
1133 | if (expr == NULL) | |
1134 | break; | |
1135 | #ifdef FFECOM_dimensionsMAX | |
1136 | if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX) | |
1137 | { | |
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; | |
1141 | } | |
1142 | #endif | |
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; | |
1147 | ||
1148 | case FFELEX_typeCOMMA: | |
1149 | if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR)) | |
1150 | break; | |
1151 | #ifdef FFECOM_dimensionsMAX | |
1152 | if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX) | |
1153 | { | |
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_); | |
1158 | } | |
1159 | #endif | |
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_); | |
1165 | ||
1166 | case FFELEX_typeCOLON: | |
1167 | if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR)) | |
1168 | break; | |
1169 | #ifdef FFECOM_dimensionsMAX | |
1170 | if (ffestb_subrargs_.dim_list.ndims++ == FFECOM_dimensionsMAX) | |
1171 | { | |
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_); | |
1176 | } | |
1177 | #endif | |
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_); | |
1184 | ||
1185 | default: | |
1186 | break; | |
1187 | } | |
1188 | ||
1189 | ffestb_subrargs_.dim_list.ok = FALSE; | |
1190 | return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t); | |
1191 | } | |
1192 | ||
1193 | /* ffestb_subr_dimlist_1_ -- OPEN_PAREN expr COLON expr | |
1194 | ||
1195 | (ffestb_subr_dimlist_1_) // to expression handler | |
1196 | ||
1197 | Get the upper bound. */ | |
1198 | ||
1199 | static ffelexHandler | |
1200 | ffestb_subr_dimlist_1_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t) | |
1201 | { | |
1202 | switch (ffelex_token_type (t)) | |
1203 | { | |
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; | |
1208 | ||
1209 | case FFELEX_typeCOMMA: | |
1210 | if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR)) | |
1211 | break; | |
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_); | |
1215 | ||
1216 | default: | |
1217 | break; | |
1218 | } | |
1219 | ||
1220 | ffestb_subrargs_.dim_list.ok = FALSE; | |
1221 | return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t); | |
1222 | } | |
1223 | ||
1224 | /* ffestb_subr_dimlist_2_ -- OPEN_PAREN too-many-dim-exprs | |
1225 | ||
1226 | (ffestb_subr_dimlist_2_) // to expression handler | |
1227 | ||
1228 | Get the upper bound. */ | |
1229 | ||
1230 | static ffelexHandler | |
1231 | ffestb_subr_dimlist_2_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t) | |
1232 | { | |
1233 | switch (ffelex_token_type (t)) | |
1234 | { | |
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; | |
1238 | ||
1239 | case FFELEX_typeCOMMA: | |
1240 | case FFELEX_typeCOLON: | |
1241 | if ((expr != NULL) && (ffebld_op (expr) == FFEBLD_opSTAR)) | |
1242 | break; | |
1243 | return (ffelexHandler) ffeexpr_rhs (ffestb_subrargs_.dim_list.pool, | |
1244 | ffestb_subrargs_.dim_list.ctx, | |
1245 | (ffeexprCallback) ffestb_subr_dimlist_2_); | |
1246 | ||
1247 | default: | |
1248 | break; | |
1249 | } | |
1250 | ||
1251 | ffestb_subrargs_.dim_list.ok = FALSE; | |
1252 | return (ffelexHandler) ffestb_subrargs_.dim_list.handler (t); | |
1253 | } | |
1254 | ||
1255 | /* ffestb_subr_name_list_ -- Collect a list of name args and close-paren | |
1256 | ||
1257 | return ffestb_subr_name_list_; // to lexer after seeing OPEN_PAREN | |
1258 | ||
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 "*"). */ | |
1264 | ||
1265 | static ffelexHandler | |
1266 | ffestb_subr_name_list_ (ffelexToken t) | |
1267 | { | |
1268 | switch (ffelex_token_type (t)) | |
1269 | { | |
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)); | |
1275 | ffebad_finish (); | |
1276 | } | |
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; | |
1282 | ||
1283 | case FFELEX_typeASTERISK: | |
1284 | if (!ffestb_subrargs_.name_list.is_subr) | |
1285 | break; | |
1286 | ||
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_; | |
1291 | ||
1292 | default: | |
1293 | break; | |
1294 | } | |
1295 | ||
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); | |
1301 | } | |
1302 | ||
1303 | /* ffestb_subr_name_list_1_ -- NAME or ASTERISK | |
1304 | ||
1305 | return ffestb_subr_name_list_1_; // to lexer | |
1306 | ||
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. */ | |
1309 | ||
1310 | static ffelexHandler | |
1311 | ffestb_subr_name_list_1_ (ffelexToken t) | |
1312 | { | |
1313 | switch (ffelex_token_type (t)) | |
1314 | { | |
1315 | case FFELEX_typeCOMMA: | |
1316 | return (ffelexHandler) ffestb_subr_name_list_; | |
1317 | ||
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; | |
1324 | ||
1325 | default: | |
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); | |
1331 | } | |
1332 | } | |
1333 | ||
1334 | static void | |
1335 | ffestb_subr_R1001_append_p_ (void) | |
1336 | { | |
1337 | ffesttFormatList f; | |
1338 | ||
1339 | if (!ffestb_local_.format.pre.present) | |
1340 | { | |
1341 | ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_P_SPEC, ffestb_local_.format.t); | |
1342 | ffelex_token_kill (ffestb_local_.format.t); | |
1343 | return; | |
1344 | } | |
1345 | ||
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; | |
1350 | } | |
1351 | ||
1352 | /* ffestb_decl_kindparam_ -- "type" OPEN_PAREN | |
1353 | ||
1354 | return ffestb_decl_kindparam_; // to lexer | |
1355 | ||
1356 | Handle "[KIND=]expr)". */ | |
1357 | ||
1358 | static ffelexHandler | |
1359 | ffestb_decl_kindparam_ (ffelexToken t) | |
1360 | { | |
1361 | switch (ffelex_token_type (t)) | |
1362 | { | |
1363 | case FFELEX_typeNAME: | |
1364 | ffesta_tokens[1] = ffelex_token_use (t); | |
1365 | return (ffelexHandler) ffestb_decl_kindparam_1_; | |
1366 | ||
1367 | default: | |
1368 | return (ffelexHandler) (*((ffelexHandler) | |
1369 | ffeexpr_rhs (ffesta_output_pool, | |
1370 | FFEEXPR_contextKINDTYPE, | |
1371 | (ffeexprCallback) ffestb_decl_kindparam_2_))) | |
1372 | (t); | |
1373 | } | |
1374 | } | |
1375 | ||
1376 | /* ffestb_decl_kindparam_1_ -- "type" OPEN_PAREN NAME | |
1377 | ||
1378 | return ffestb_decl_kindparam_1_; // to lexer | |
1379 | ||
1380 | Handle "[KIND=]expr)". */ | |
1381 | ||
1382 | static ffelexHandler | |
1383 | ffestb_decl_kindparam_1_ (ffelexToken t) | |
1384 | { | |
1385 | ffelexHandler next; | |
1386 | ffelexToken nt; | |
1387 | ||
1388 | switch (ffelex_token_type (t)) | |
1389 | { | |
1390 | case FFELEX_typeEQUALS: | |
1391 | ffesta_confirmed (); | |
1392 | if (ffestr_other (ffesta_tokens[1]) != FFESTR_otherKIND) | |
1393 | break; | |
1394 | ffelex_token_kill (ffesta_tokens[1]); | |
1395 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
1396 | FFEEXPR_contextKINDTYPE, (ffeexprCallback) ffestb_decl_kindparam_2_); | |
1397 | ||
1398 | default: | |
1399 | nt = ffesta_tokens[1]; | |
1400 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
1401 | FFEEXPR_contextKINDTYPE, (ffeexprCallback) ffestb_decl_kindparam_2_))) | |
1402 | (nt); | |
1403 | ffelex_token_kill (nt); | |
1404 | return (ffelexHandler) (*next) (t); | |
1405 | } | |
1406 | ||
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, | |
1411 | ffesta_tokens[1]); | |
1412 | ffelex_token_kill (ffesta_tokens[1]); | |
1413 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1414 | } | |
1415 | ||
1416 | /* ffestb_decl_kindparam_2_ -- "type" OPEN_PAREN ["KIND="] expr | |
1417 | ||
1418 | (ffestb_decl_kindparam_2_) // to expression handler | |
1419 | ||
1420 | Handle "[KIND=]expr)". */ | |
1421 | ||
1422 | static ffelexHandler | |
1423 | ffestb_decl_kindparam_2_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
1424 | { | |
1425 | switch (ffelex_token_type (t)) | |
1426 | { | |
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; | |
1434 | ||
1435 | default: | |
1436 | break; | |
1437 | } | |
1438 | ||
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, | |
1443 | t); | |
1444 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1445 | } | |
1446 | ||
1447 | /* ffestb_decl_starkind_ -- "type" ASTERISK | |
1448 | ||
1449 | return ffestb_decl_starkind_; // to lexer | |
1450 | ||
1451 | Handle NUMBER. */ | |
1452 | ||
1453 | static ffelexHandler | |
1454 | ffestb_decl_starkind_ (ffelexToken t) | |
1455 | { | |
1456 | switch (ffelex_token_type (t)) | |
1457 | { | |
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; | |
1465 | ||
1466 | default: | |
1467 | break; | |
1468 | } | |
1469 | ||
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, | |
1474 | t); | |
1475 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1476 | } | |
1477 | ||
1478 | /* ffestb_decl_starlen_ -- "CHARACTER" ASTERISK | |
1479 | ||
1480 | return ffestb_decl_starlen_; // to lexer | |
1481 | ||
1482 | Handle NUMBER. */ | |
1483 | ||
1484 | static ffelexHandler | |
1485 | ffestb_decl_starlen_ (ffelexToken t) | |
1486 | { | |
1487 | switch (ffelex_token_type (t)) | |
1488 | { | |
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; | |
1496 | ||
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_); | |
1503 | ||
1504 | default: | |
1505 | break; | |
1506 | } | |
1507 | ||
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, | |
1512 | t); | |
1513 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1514 | } | |
1515 | ||
1516 | /* ffestb_decl_starlen_1_ -- "CHARACTER" ASTERISK OPEN_PAREN expr | |
1517 | ||
1518 | (ffestb_decl_starlen_1_) // to expression handler | |
1519 | ||
1520 | Handle CLOSE_PAREN. */ | |
1521 | ||
1522 | static ffelexHandler | |
1523 | ffestb_decl_starlen_1_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
1524 | { | |
1525 | switch (ffelex_token_type (t)) | |
1526 | { | |
1527 | case FFELEX_typeCLOSE_PAREN: | |
1528 | if (expr == NULL) | |
1529 | break; | |
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; | |
1534 | ||
1535 | default: | |
1536 | break; | |
1537 | } | |
1538 | ||
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, | |
1543 | t); | |
1544 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1545 | } | |
1546 | ||
1547 | /* ffestb_decl_typeparams_ -- "CHARACTER" OPEN_PAREN | |
1548 | ||
1549 | return ffestb_decl_typeparams_; // to lexer | |
1550 | ||
1551 | Handle "[KIND=]expr)". */ | |
1552 | ||
1553 | static ffelexHandler | |
1554 | ffestb_decl_typeparams_ (ffelexToken t) | |
1555 | { | |
1556 | switch (ffelex_token_type (t)) | |
1557 | { | |
1558 | case FFELEX_typeNAME: | |
1559 | ffesta_tokens[1] = ffelex_token_use (t); | |
1560 | return (ffelexHandler) ffestb_decl_typeparams_1_; | |
1561 | ||
1562 | default: | |
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_))) | |
1568 | (t); | |
1569 | if (ffestb_local_.decl.kindt != NULL) | |
1570 | break; | |
1571 | return (ffelexHandler) (*((ffelexHandler) | |
1572 | ffeexpr_rhs (ffesta_output_pool, | |
1573 | FFEEXPR_contextKINDTYPE, | |
1574 | (ffeexprCallback) ffestb_decl_typeparams_3_))) | |
1575 | (t); | |
1576 | } | |
1577 | ||
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, | |
1586 | t); | |
1587 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1588 | } | |
1589 | ||
1590 | /* ffestb_decl_typeparams_1_ -- "CHARACTER" OPEN_PAREN NAME | |
1591 | ||
1592 | return ffestb_decl_typeparams_1_; // to lexer | |
1593 | ||
1594 | Handle "[KIND=]expr)". */ | |
1595 | ||
1596 | static ffelexHandler | |
1597 | ffestb_decl_typeparams_1_ (ffelexToken t) | |
1598 | { | |
1599 | ffelexHandler next; | |
1600 | ffelexToken nt; | |
1601 | ||
1602 | switch (ffelex_token_type (t)) | |
1603 | { | |
1604 | case FFELEX_typeEQUALS: | |
1605 | ffesta_confirmed (); | |
1606 | switch (ffestr_other (ffesta_tokens[1])) | |
1607 | { | |
1608 | case FFESTR_otherLEN: | |
1609 | if (ffestb_local_.decl.lent != NULL) | |
1610 | break; | |
1611 | ffelex_token_kill (ffesta_tokens[1]); | |
1612 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
1613 | FFEEXPR_contextCHARACTERSIZE, | |
1614 | (ffeexprCallback) ffestb_decl_typeparams_2_); | |
1615 | ||
1616 | case FFESTR_otherKIND: | |
1617 | if (ffestb_local_.decl.kindt != NULL) | |
1618 | break; | |
1619 | ffelex_token_kill (ffesta_tokens[1]); | |
1620 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
1621 | FFEEXPR_contextKINDTYPE, | |
1622 | (ffeexprCallback) ffestb_decl_typeparams_3_); | |
1623 | ||
1624 | default: | |
1625 | break; | |
1626 | } | |
1627 | break; | |
1628 | ||
1629 | default: | |
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_))) | |
1636 | (nt); | |
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_))) | |
1642 | (nt); | |
1643 | else | |
1644 | { | |
1645 | ffesta_tokens[1] = nt; | |
1646 | break; | |
1647 | } | |
1648 | ffelex_token_kill (nt); | |
1649 | return (ffelexHandler) (*next) (t); | |
1650 | } | |
1651 | ||
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, | |
1660 | ffesta_tokens[1]); | |
1661 | ffelex_token_kill (ffesta_tokens[1]); | |
1662 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1663 | } | |
1664 | ||
1665 | /* ffestb_decl_typeparams_2_ -- "CHARACTER" OPEN_PAREN ["LEN="] expr | |
1666 | ||
1667 | (ffestb_decl_typeparams_2_) // to expression handler | |
1668 | ||
1669 | Handle "[LEN=]expr)". */ | |
1670 | ||
1671 | static ffelexHandler | |
1672 | ffestb_decl_typeparams_2_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
1673 | { | |
1674 | switch (ffelex_token_type (t)) | |
1675 | { | |
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; | |
1681 | ||
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_; | |
1686 | ||
1687 | default: | |
1688 | break; | |
1689 | } | |
1690 | ||
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, | |
1699 | t); | |
1700 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1701 | } | |
1702 | ||
1703 | /* ffestb_decl_typeparams_3_ -- "CHARACTER" OPEN_PAREN ["KIND="] expr | |
1704 | ||
1705 | (ffestb_decl_typeparams_3_) // to expression handler | |
1706 | ||
1707 | Handle "[KIND=]expr)". */ | |
1708 | ||
1709 | static ffelexHandler | |
1710 | ffestb_decl_typeparams_3_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
1711 | { | |
1712 | switch (ffelex_token_type (t)) | |
1713 | { | |
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; | |
1719 | ||
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_; | |
1724 | ||
1725 | default: | |
1726 | break; | |
1727 | } | |
1728 | ||
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, | |
1737 | t); | |
1738 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1739 | } | |
1740 | ||
1741 | /* ffestb_decl_typetype1_ -- "TYPE" OPEN_PAREN | |
1742 | ||
1743 | return ffestb_decl_typetype1_; // to lexer | |
1744 | ||
1745 | Handle NAME. */ | |
1746 | ||
1747 | #if FFESTR_F90 | |
1748 | static ffelexHandler | |
1749 | ffestb_decl_typetype1_ (ffelexToken t) | |
1750 | { | |
1751 | switch (ffelex_token_type (t)) | |
1752 | { | |
1753 | case FFELEX_typeNAME: | |
1754 | ffestb_local_.decl.kindt = ffelex_token_use (t); | |
1755 | return (ffelexHandler) ffestb_decl_typetype2_; | |
1756 | ||
1757 | default: | |
1758 | break; | |
1759 | } | |
1760 | ||
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, | |
1765 | t); | |
1766 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1767 | } | |
1768 | ||
1769 | /* ffestb_decl_typetype2_ -- "TYPE" OPEN_PAREN NAME | |
1770 | ||
1771 | return ffestb_decl_typetype2_; // to lexer | |
1772 | ||
1773 | Handle CLOSE_PAREN. */ | |
1774 | ||
1775 | static ffelexHandler | |
1776 | ffestb_decl_typetype2_ (ffelexToken t) | |
1777 | { | |
1778 | switch (ffelex_token_type (t)) | |
1779 | { | |
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; | |
1787 | ||
1788 | default: | |
1789 | break; | |
1790 | } | |
1791 | ||
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, | |
1797 | t); | |
1798 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
1799 | } | |
1800 | ||
1801 | #endif | |
1802 | /* ffestb_subr_label_list_ -- Collect a tokenlist of labels and close-paren | |
1803 | ||
1804 | return ffestb_subr_label_list_; // to lexer after seeing OPEN_PAREN | |
1805 | ||
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. */ | |
1811 | ||
1812 | static ffelexHandler | |
1813 | ffestb_subr_label_list_ (ffelexToken t) | |
1814 | { | |
1815 | if (ffelex_token_type (t) == FFELEX_typeNUMBER) | |
1816 | { | |
1817 | ffestt_tokenlist_append (ffestb_subrargs_.label_list.labels, | |
1818 | ffelex_token_use (t)); | |
1819 | return (ffelexHandler) ffestb_subr_label_list_1_; | |
1820 | } | |
1821 | ||
1822 | ffestb_subrargs_.label_list.ok = FALSE; | |
1823 | return (ffelexHandler) (*ffestb_subrargs_.label_list.handler) (t); | |
1824 | } | |
1825 | ||
1826 | /* ffestb_subr_label_list_1_ -- NUMBER | |
1827 | ||
1828 | return ffestb_subr_label_list_1_; // to lexer after seeing NUMBER | |
1829 | ||
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. */ | |
1833 | ||
1834 | static ffelexHandler | |
1835 | ffestb_subr_label_list_1_ (ffelexToken t) | |
1836 | { | |
1837 | switch (ffelex_token_type (t)) | |
1838 | { | |
1839 | case FFELEX_typeCOMMA: | |
1840 | return (ffelexHandler) ffestb_subr_label_list_; | |
1841 | ||
1842 | case FFELEX_typeCLOSE_PAREN: | |
1843 | ffestb_subrargs_.label_list.ok = TRUE; | |
1844 | return (ffelexHandler) ffestb_subrargs_.label_list.handler; | |
1845 | ||
1846 | default: | |
1847 | ffestb_subrargs_.label_list.ok = FALSE; | |
1848 | return (ffelexHandler) (*ffestb_subrargs_.label_list.handler) (t); | |
1849 | } | |
1850 | } | |
1851 | ||
1852 | /* ffestb_do -- Parse the DO statement | |
1853 | ||
1854 | return ffestb_do; // to lexer | |
1855 | ||
1856 | Make sure the statement has a valid form for the DO statement. If it | |
1857 | does, implement the statement. */ | |
1858 | ||
1859 | ffelexHandler | |
1860 | ffestb_do (ffelexToken t) | |
1861 | { | |
1862 | ffeTokenLength i; | |
1863 | char *p; | |
1864 | ffelexHandler next; | |
1865 | ffelexToken nt; | |
1866 | ffestrSecond kw; | |
1867 | ||
1868 | switch (ffelex_token_type (ffesta_tokens[0])) | |
1869 | { | |
1870 | case FFELEX_typeNAME: | |
1871 | if (ffesta_first_kw != FFESTR_firstDO) | |
1872 | goto bad_0; /* :::::::::::::::::::: */ | |
1873 | switch (ffelex_token_type (t)) | |
1874 | { | |
1875 | case FFELEX_typeNUMBER: | |
1876 | ffesta_confirmed (); | |
1877 | ffesta_tokens[1] = ffelex_token_use (t); | |
1878 | return (ffelexHandler) ffestb_do1_; | |
1879 | ||
1880 | case FFELEX_typeCOMMA: | |
1881 | ffesta_confirmed (); | |
1882 | ffesta_tokens[1] = NULL; | |
1883 | return (ffelexHandler) ffestb_do2_; | |
1884 | ||
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_; | |
1890 | ||
1891 | case FFELEX_typeEOS: | |
1892 | case FFELEX_typeSEMICOLON: | |
1893 | ffesta_confirmed (); | |
1894 | ffesta_tokens[1] = NULL; | |
1895 | return (ffelexHandler) ffestb_do1_ (t); | |
1896 | ||
1897 | case FFELEX_typeCOLONCOLON: | |
1898 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
1899 | goto bad_1; /* :::::::::::::::::::: */ | |
1900 | ||
1901 | default: | |
1902 | goto bad_1; /* :::::::::::::::::::: */ | |
1903 | } | |
1904 | ||
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)) | |
1910 | { | |
1911 | case FFELEX_typeCOLONCOLON: | |
1912 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
1913 | goto bad_1; /* :::::::::::::::::::: */ | |
1914 | ||
1915 | default: | |
1916 | goto bad_1; /* :::::::::::::::::::: */ | |
1917 | ||
1918 | case FFELEX_typeOPEN_PAREN: /* Must be "DO" label "WHILE". */ | |
1919 | if (!isdigit (*p)) | |
1920 | goto bad_i; /* :::::::::::::::::::: */ | |
1921 | ffesta_tokens[1] = ffelex_token_number_from_names (ffesta_tokens[0], | |
1922 | i); | |
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_); | |
1934 | ||
1935 | case FFELEX_typeCOMMA: | |
1936 | ffesta_confirmed (); | |
1937 | if (*p == '\0') | |
1938 | { | |
1939 | ffesta_tokens[1] = NULL; | |
1940 | return (ffelexHandler) ffestb_do2_; | |
1941 | } | |
1942 | if (!isdigit (*p)) | |
1943 | goto bad_i; /* :::::::::::::::::::: */ | |
1944 | ffesta_tokens[1] = ffelex_token_number_from_names (ffesta_tokens[0], | |
1945 | i); | |
1946 | p += ffelex_token_length (ffesta_tokens[1]); | |
1947 | i += ffelex_token_length (ffesta_tokens[1]); | |
1948 | if (*p != '\0') | |
1949 | goto bad_i1; /* :::::::::::::::::::: */ | |
1950 | return (ffelexHandler) ffestb_do2_; | |
1951 | ||
1952 | case FFELEX_typeEQUALS: | |
1953 | if (isdigit (*p)) | |
1954 | { | |
1955 | ffesta_tokens[1] | |
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]); | |
1959 | } | |
1960 | else | |
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_))) | |
1968 | (nt); | |
1969 | ffelex_token_kill (nt); /* Will get it back in _6_... */ | |
1970 | return (ffelexHandler) (*next) (t); | |
1971 | ||
1972 | case FFELEX_typeEOS: | |
1973 | case FFELEX_typeSEMICOLON: | |
1974 | ffesta_confirmed (); | |
1975 | if (isdigit (*p)) | |
1976 | { | |
1977 | ffesta_tokens[1] | |
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]); | |
1981 | } | |
1982 | else | |
1983 | ffesta_tokens[1] = NULL; | |
1984 | if (*p != '\0') | |
1985 | goto bad_i1; /* :::::::::::::::::::: */ | |
1986 | return (ffelexHandler) ffestb_do1_ (t); | |
1987 | } | |
1988 | ||
1989 | default: | |
1990 | goto bad_0; /* :::::::::::::::::::: */ | |
1991 | } | |
1992 | ||
1993 | bad_0: /* :::::::::::::::::::: */ | |
1994 | if (ffesta_construct_name != NULL) | |
1995 | { | |
1996 | ffelex_token_kill (ffesta_construct_name); | |
1997 | ffesta_construct_name = NULL; | |
1998 | } | |
1999 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0]); | |
2000 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2001 | ||
2002 | bad_1: /* :::::::::::::::::::: */ | |
2003 | if (ffesta_construct_name != NULL) | |
2004 | { | |
2005 | ffelex_token_kill (ffesta_construct_name); | |
2006 | ffesta_construct_name = NULL; | |
2007 | } | |
2008 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2009 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
2010 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
2011 | ||
2012 | bad_i1: /* :::::::::::::::::::: */ | |
2013 | if (ffesta_tokens[1]) | |
2014 | ffelex_token_kill (ffesta_tokens[1]); | |
2015 | ||
2016 | bad_i: /* :::::::::::::::::::: */ | |
2017 | if (ffesta_construct_name != NULL) | |
2018 | { | |
2019 | ffelex_token_kill (ffesta_construct_name); | |
2020 | ffesta_construct_name = NULL; | |
2021 | } | |
2022 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0], i, t); | |
2023 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2024 | } | |
2025 | ||
2026 | /* ffestb_dowhile -- Parse the DOWHILE statement | |
2027 | ||
2028 | return ffestb_dowhile; // to lexer | |
2029 | ||
2030 | Make sure the statement has a valid form for the DOWHILE statement. If it | |
2031 | does, implement the statement. */ | |
2032 | ||
2033 | ffelexHandler | |
2034 | ffestb_dowhile (ffelexToken t) | |
2035 | { | |
2036 | ffeTokenLength i; | |
2037 | char *p; | |
2038 | ffelexHandler next; | |
2039 | ffelexToken nt; | |
2040 | ||
2041 | switch (ffelex_token_type (ffesta_tokens[0])) | |
2042 | { | |
2043 | case FFELEX_typeNAMES: | |
2044 | if (ffesta_first_kw != FFESTR_firstDOWHILE) | |
2045 | goto bad_0; /* :::::::::::::::::::: */ | |
2046 | switch (ffelex_token_type (t)) | |
2047 | { | |
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; /* :::::::::::::::::::: */ | |
2054 | ||
2055 | default: | |
2056 | goto bad_1; /* :::::::::::::::::::: */ | |
2057 | ||
2058 | case FFELEX_typeOPEN_PAREN: | |
2059 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDOWHILE); | |
2060 | if (*p != '\0') | |
2061 | goto bad_i; /* :::::::::::::::::::: */ | |
2062 | ffesta_tokens[1] = NULL; | |
2063 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
2064 | FFEEXPR_contextDOWHILE, (ffeexprCallback) ffestb_do4_); | |
2065 | ||
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, | |
2069 | 0); | |
2070 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_lhs | |
2071 | (ffesta_output_pool, FFEEXPR_contextDO, | |
2072 | (ffeexprCallback) ffestb_do6_))) | |
2073 | (nt); | |
2074 | ffelex_token_kill (nt); /* Will get it back in _6_... */ | |
2075 | return (ffelexHandler) (*next) (t); | |
2076 | } | |
2077 | ||
2078 | default: | |
2079 | goto bad_0; /* :::::::::::::::::::: */ | |
2080 | } | |
2081 | ||
2082 | bad_0: /* :::::::::::::::::::: */ | |
2083 | if (ffesta_construct_name != NULL) | |
2084 | { | |
2085 | ffelex_token_kill (ffesta_construct_name); | |
2086 | ffesta_construct_name = NULL; | |
2087 | } | |
2088 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0]); | |
2089 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2090 | ||
2091 | bad_1: /* :::::::::::::::::::: */ | |
2092 | if (ffesta_construct_name != NULL) | |
2093 | { | |
2094 | ffelex_token_kill (ffesta_construct_name); | |
2095 | ffesta_construct_name = NULL; | |
2096 | } | |
2097 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2098 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
2099 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
2100 | ||
2101 | bad_i: /* :::::::::::::::::::: */ | |
2102 | if (ffesta_construct_name != NULL) | |
2103 | { | |
2104 | ffelex_token_kill (ffesta_construct_name); | |
2105 | ffesta_construct_name = NULL; | |
2106 | } | |
2107 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DO", ffesta_tokens[0], i, t); | |
2108 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2109 | } | |
2110 | ||
2111 | /* ffestb_do1_ -- "DO" [label] | |
2112 | ||
2113 | return ffestb_do1_; // to lexer | |
2114 | ||
2115 | Make sure the statement has a valid form for the DO statement. If it | |
2116 | does, implement the statement. */ | |
2117 | ||
2118 | static ffelexHandler | |
2119 | ffestb_do1_ (ffelexToken t) | |
2120 | { | |
2121 | switch (ffelex_token_type (t)) | |
2122 | { | |
2123 | case FFELEX_typeCOMMA: | |
2124 | ffesta_confirmed (); | |
2125 | return (ffelexHandler) ffestb_do2_; | |
2126 | ||
2127 | case FFELEX_typeEOS: | |
2128 | case FFELEX_typeSEMICOLON: | |
2129 | ffesta_confirmed (); | |
2130 | if (!ffesta_is_inhibited ()) | |
2131 | { | |
2132 | if (ffesta_tokens[1] != NULL) | |
2133 | ffestc_R819B (ffesta_construct_name, ffesta_tokens[1], NULL, | |
2134 | NULL); | |
2135 | else | |
2136 | ffestc_R820B (ffesta_construct_name, NULL, NULL); | |
2137 | } | |
2138 | if (ffesta_tokens[1] != NULL) | |
2139 | ffelex_token_kill (ffesta_tokens[1]); | |
2140 | if (ffesta_construct_name != NULL) | |
2141 | { | |
2142 | ffelex_token_kill (ffesta_construct_name); | |
2143 | ffesta_construct_name = NULL; | |
2144 | } | |
2145 | return (ffelexHandler) ffesta_zero (t); | |
2146 | ||
2147 | case FFELEX_typeNAME: | |
2148 | return (ffelexHandler) ffestb_do2_ (t); | |
2149 | ||
2150 | default: | |
2151 | break; | |
2152 | } | |
2153 | ||
2154 | if (ffesta_tokens[1] != NULL) | |
2155 | ffelex_token_kill (ffesta_tokens[1]); | |
2156 | if (ffesta_construct_name != NULL) | |
2157 | { | |
2158 | ffelex_token_kill (ffesta_construct_name); | |
2159 | ffesta_construct_name = NULL; | |
2160 | } | |
2161 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2162 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2163 | } | |
2164 | ||
2165 | /* ffestb_do2_ -- "DO" [label] [,] | |
2166 | ||
2167 | return ffestb_do2_; // to lexer | |
2168 | ||
2169 | Make sure the statement has a valid form for the DO statement. If it | |
2170 | does, implement the statement. */ | |
2171 | ||
2172 | static ffelexHandler | |
2173 | ffestb_do2_ (ffelexToken t) | |
2174 | { | |
2175 | switch (ffelex_token_type (t)) | |
2176 | { | |
2177 | case FFELEX_typeNAME: | |
2178 | ffesta_tokens[2] = ffelex_token_use (t); | |
2179 | return (ffelexHandler) ffestb_do3_; | |
2180 | ||
2181 | default: | |
2182 | break; | |
2183 | } | |
2184 | ||
2185 | if (ffesta_tokens[1] != NULL) | |
2186 | ffelex_token_kill (ffesta_tokens[1]); | |
2187 | if (ffesta_construct_name != NULL) | |
2188 | { | |
2189 | ffelex_token_kill (ffesta_construct_name); | |
2190 | ffesta_construct_name = NULL; | |
2191 | } | |
2192 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2193 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2194 | } | |
2195 | ||
2196 | /* ffestb_do3_ -- "DO" [label] [,] NAME | |
2197 | ||
2198 | return ffestb_do3_; // to lexer | |
2199 | ||
2200 | Make sure the statement has a valid form for the DO statement. If it | |
2201 | does, implement the statement. */ | |
2202 | ||
2203 | static ffelexHandler | |
2204 | ffestb_do3_ (ffelexToken t) | |
2205 | { | |
2206 | ffelexHandler next; | |
2207 | ||
2208 | switch (ffelex_token_type (t)) | |
2209 | { | |
2210 | case FFELEX_typeEQUALS: | |
2211 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
2212 | FFEEXPR_contextDO, (ffeexprCallback) ffestb_do6_))) | |
2213 | (ffesta_tokens[2]); | |
2214 | ffelex_token_kill (ffesta_tokens[2]); /* Will get it back in _6_... */ | |
2215 | return (ffelexHandler) (*next) (t); | |
2216 | ||
2217 | case FFELEX_typeOPEN_PAREN: | |
2218 | if (ffestr_second (ffesta_tokens[2]) != FFESTR_secondWHILE) | |
2219 | { | |
2220 | if (ffesta_tokens[1] != NULL) | |
2221 | ffelex_token_kill (ffesta_tokens[1]); | |
2222 | if (ffesta_construct_name != NULL) | |
2223 | { | |
2224 | ffelex_token_kill (ffesta_construct_name); | |
2225 | ffesta_construct_name = NULL; | |
2226 | } | |
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. */ | |
2231 | } | |
2232 | ffelex_token_kill (ffesta_tokens[2]); | |
2233 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
2234 | FFEEXPR_contextDOWHILE, (ffeexprCallback) ffestb_do4_); | |
2235 | ||
2236 | default: | |
2237 | break; | |
2238 | } | |
2239 | ||
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) | |
2244 | { | |
2245 | ffelex_token_kill (ffesta_construct_name); | |
2246 | ffesta_construct_name = NULL; | |
2247 | } | |
2248 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2249 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2250 | } | |
2251 | ||
2252 | /* ffestb_do4_ -- "DO" [label] [,] "WHILE" OPEN_PAREN expr | |
2253 | ||
2254 | (ffestb_do4_) // to expression handler | |
2255 | ||
2256 | Make sure the statement has a valid form for the DO statement. If it | |
2257 | does, implement the statement. */ | |
2258 | ||
2259 | static ffelexHandler | |
2260 | ffestb_do4_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
2261 | { | |
2262 | switch (ffelex_token_type (t)) | |
2263 | { | |
2264 | case FFELEX_typeCLOSE_PAREN: | |
2265 | if (expr == NULL) | |
2266 | break; | |
2267 | ffesta_tokens[2] = ffelex_token_use (ft); | |
2268 | ffestb_local_.dowhile.expr = expr; | |
2269 | return (ffelexHandler) ffestb_do5_; | |
2270 | ||
2271 | default: | |
2272 | break; | |
2273 | } | |
2274 | ||
2275 | if (ffesta_tokens[1] != NULL) | |
2276 | ffelex_token_kill (ffesta_tokens[1]); | |
2277 | if (ffesta_construct_name != NULL) | |
2278 | { | |
2279 | ffelex_token_kill (ffesta_construct_name); | |
2280 | ffesta_construct_name = NULL; | |
2281 | } | |
2282 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2283 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2284 | } | |
2285 | ||
2286 | /* ffestb_do5_ -- "DO" [label] [,] "WHILE" OPEN_PAREN expr CLOSE_PAREN | |
2287 | ||
2288 | return ffestb_do5_; // to lexer | |
2289 | ||
2290 | Make sure the statement has a valid form for the DO statement. If it | |
2291 | does, implement the statement. */ | |
2292 | ||
2293 | static ffelexHandler | |
2294 | ffestb_do5_ (ffelexToken t) | |
2295 | { | |
2296 | switch (ffelex_token_type (t)) | |
2297 | { | |
2298 | case FFELEX_typeEOS: | |
2299 | case FFELEX_typeSEMICOLON: | |
2300 | ffesta_confirmed (); | |
2301 | if (!ffesta_is_inhibited ()) | |
2302 | { | |
2303 | if (ffesta_tokens[1] != NULL) | |
2304 | ffestc_R819B (ffesta_construct_name, ffesta_tokens[1], | |
2305 | ffestb_local_.dowhile.expr, ffesta_tokens[2]); | |
2306 | else | |
2307 | ffestc_R820B (ffesta_construct_name, ffestb_local_.dowhile.expr, | |
2308 | ffesta_tokens[2]); | |
2309 | } | |
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) | |
2314 | { | |
2315 | ffelex_token_kill (ffesta_construct_name); | |
2316 | ffesta_construct_name = NULL; | |
2317 | } | |
2318 | return (ffelexHandler) ffesta_zero (t); | |
2319 | ||
2320 | default: | |
2321 | break; | |
2322 | } | |
2323 | ||
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) | |
2328 | { | |
2329 | ffelex_token_kill (ffesta_construct_name); | |
2330 | ffesta_construct_name = NULL; | |
2331 | } | |
2332 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2333 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2334 | } | |
2335 | ||
2336 | /* ffestb_do6_ -- "DO" [label] [,] var-expr | |
2337 | ||
2338 | (ffestb_do6_) // to expression handler | |
2339 | ||
2340 | Make sure the statement has a valid form for the DO statement. If it | |
2341 | does, implement the statement. */ | |
2342 | ||
2343 | static ffelexHandler | |
2344 | ffestb_do6_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
2345 | { | |
2346 | /* _3_ already ensured that this would be an EQUALS token. If not, it is a | |
2347 | bug in the FFE. */ | |
2348 | ||
2349 | assert (ffelex_token_type (t) == FFELEX_typeEQUALS); | |
2350 | ||
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_); | |
2355 | } | |
2356 | ||
2357 | /* ffestb_do7_ -- "DO" [label] [,] var-expr EQUALS expr | |
2358 | ||
2359 | (ffestb_do7_) // to expression handler | |
2360 | ||
2361 | Make sure the statement has a valid form for the DO statement. If it | |
2362 | does, implement the statement. */ | |
2363 | ||
2364 | static ffelexHandler | |
2365 | ffestb_do7_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
2366 | { | |
2367 | switch (ffelex_token_type (t)) | |
2368 | { | |
2369 | case FFELEX_typeCOMMA: | |
2370 | ffesta_confirmed (); | |
2371 | if (expr == NULL) | |
2372 | break; | |
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_); | |
2377 | ||
2378 | default: | |
2379 | break; | |
2380 | } | |
2381 | ||
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) | |
2386 | { | |
2387 | ffelex_token_kill (ffesta_construct_name); | |
2388 | ffesta_construct_name = NULL; | |
2389 | } | |
2390 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2391 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2392 | } | |
2393 | ||
2394 | /* ffestb_do8_ -- "DO" [label] [,] var-expr EQUALS expr COMMA expr | |
2395 | ||
2396 | (ffestb_do8_) // to expression handler | |
2397 | ||
2398 | Make sure the statement has a valid form for the DO statement. If it | |
2399 | does, implement the statement. */ | |
2400 | ||
2401 | static ffelexHandler | |
2402 | ffestb_do8_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
2403 | { | |
2404 | switch (ffelex_token_type (t)) | |
2405 | { | |
2406 | case FFELEX_typeCOMMA: | |
2407 | if (expr == NULL) | |
2408 | break; | |
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_); | |
2413 | ||
2414 | case FFELEX_typeEOS: | |
2415 | case FFELEX_typeSEMICOLON: | |
2416 | if (expr == NULL) | |
2417 | break; | |
2418 | ffesta_tokens[4] = ffelex_token_use (ft); | |
2419 | ffestb_local_.do_stmt.end = expr; | |
2420 | return (ffelexHandler) ffestb_do9_ (NULL, NULL, t); | |
2421 | ||
2422 | default: | |
2423 | break; | |
2424 | } | |
2425 | ||
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) | |
2431 | { | |
2432 | ffelex_token_kill (ffesta_construct_name); | |
2433 | ffesta_construct_name = NULL; | |
2434 | } | |
2435 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2436 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2437 | } | |
2438 | ||
2439 | /* ffestb_do9_ -- "DO" [label] [,] var-expr EQUALS expr COMMA expr | |
2440 | [COMMA expr] | |
2441 | ||
2442 | (ffestb_do9_) // to expression handler | |
2443 | ||
2444 | Make sure the statement has a valid form for the DO statement. If it | |
2445 | does, implement the statement. */ | |
2446 | ||
2447 | static ffelexHandler | |
2448 | ffestb_do9_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
2449 | { | |
2450 | switch (ffelex_token_type (t)) | |
2451 | { | |
2452 | case FFELEX_typeEOS: | |
2453 | case FFELEX_typeSEMICOLON: | |
2454 | if ((expr == NULL) && (ft != NULL)) | |
2455 | break; | |
2456 | if (!ffesta_is_inhibited ()) | |
2457 | { | |
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); | |
2463 | else | |
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); | |
2468 | } | |
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) | |
2475 | { | |
2476 | ffelex_token_kill (ffesta_construct_name); | |
2477 | ffesta_construct_name = NULL; | |
2478 | } | |
2479 | ||
2480 | return (ffelexHandler) ffesta_zero (t); | |
2481 | ||
2482 | default: | |
2483 | break; | |
2484 | } | |
2485 | ||
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) | |
2492 | { | |
2493 | ffelex_token_kill (ffesta_construct_name); | |
2494 | ffesta_construct_name = NULL; | |
2495 | } | |
2496 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DO", t); | |
2497 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2498 | } | |
2499 | ||
2500 | /* ffestb_else -- Parse the ELSE statement | |
2501 | ||
2502 | return ffestb_else; // to lexer | |
2503 | ||
2504 | Make sure the statement has a valid form for the ELSE statement. If it | |
2505 | does, implement the statement. */ | |
2506 | ||
2507 | ffelexHandler | |
2508 | ffestb_else (ffelexToken t) | |
2509 | { | |
2510 | ffeTokenLength i; | |
2511 | char *p; | |
2512 | ||
2513 | switch (ffelex_token_type (ffesta_tokens[0])) | |
2514 | { | |
2515 | case FFELEX_typeNAME: | |
2516 | if (ffesta_first_kw != FFESTR_firstELSE) | |
2517 | goto bad_0; /* :::::::::::::::::::: */ | |
2518 | switch (ffelex_token_type (t)) | |
2519 | { | |
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); | |
2526 | ||
2527 | case FFELEX_typeCOMMA: | |
2528 | case FFELEX_typeCOLONCOLON: | |
2529 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
2530 | goto bad_1; /* :::::::::::::::::::: */ | |
2531 | ||
2532 | default: | |
2533 | goto bad_1; /* :::::::::::::::::::: */ | |
2534 | ||
2535 | case FFELEX_typeNAME: | |
2536 | break; | |
2537 | } | |
2538 | ||
2539 | ffesta_confirmed (); | |
2540 | ffestb_args.elsexyz.second = ffesta_second_kw; | |
2541 | ffesta_tokens[1] = ffelex_token_use (t); | |
2542 | return (ffelexHandler) ffestb_else1_; | |
2543 | ||
2544 | case FFELEX_typeNAMES: | |
2545 | if (ffesta_first_kw != FFESTR_firstELSE) | |
2546 | goto bad_0; /* :::::::::::::::::::: */ | |
2547 | switch (ffelex_token_type (t)) | |
2548 | { | |
2549 | case FFELEX_typeCOMMA: | |
2550 | case FFELEX_typeCOLONCOLON: | |
2551 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
2552 | goto bad_1; /* :::::::::::::::::::: */ | |
2553 | ||
2554 | default: | |
2555 | goto bad_1; /* :::::::::::::::::::: */ | |
2556 | ||
2557 | case FFELEX_typeEOS: | |
2558 | case FFELEX_typeSEMICOLON: | |
2559 | break; | |
2560 | } | |
2561 | ffesta_confirmed (); | |
2562 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlELSE) | |
2563 | { | |
2564 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlELSE); | |
2565 | if (!ffesrc_is_name_init (*p)) | |
2566 | goto bad_i; /* :::::::::::::::::::: */ | |
2567 | ffesta_tokens[1] | |
2568 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
2569 | } | |
2570 | else | |
2571 | ffesta_tokens[1] = NULL; | |
2572 | ffestb_args.elsexyz.second = FFESTR_secondNone; | |
2573 | return (ffelexHandler) ffestb_else1_ (t); | |
2574 | ||
2575 | default: | |
2576 | goto bad_0; /* :::::::::::::::::::: */ | |
2577 | } | |
2578 | ||
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); | |
2582 | ||
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. */ | |
2587 | ||
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); | |
2591 | } | |
2592 | ||
2593 | /* ffestb_elsexyz -- Parse an ELSEIF/ELSEWHERE statement | |
2594 | ||
2595 | return ffestb_elsexyz; // to lexer | |
2596 | ||
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. */ | |
2599 | ||
2600 | ffelexHandler | |
2601 | ffestb_elsexyz (ffelexToken t) | |
2602 | { | |
2603 | ffeTokenLength i; | |
2604 | char *p; | |
2605 | ||
2606 | switch (ffelex_token_type (ffesta_tokens[0])) | |
2607 | { | |
2608 | case FFELEX_typeNAME: | |
2609 | switch (ffelex_token_type (t)) | |
2610 | { | |
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); | |
2618 | ||
2619 | case FFELEX_typeNAME: | |
2620 | ffesta_confirmed (); | |
2621 | goto bad_1; /* :::::::::::::::::::: */ | |
2622 | ||
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); | |
2628 | ||
2629 | case FFELEX_typeCOMMA: | |
2630 | case FFELEX_typeCOLONCOLON: | |
2631 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
2632 | goto bad_1; /* :::::::::::::::::::: */ | |
2633 | ||
2634 | default: | |
2635 | goto bad_1; /* :::::::::::::::::::: */ | |
2636 | } | |
2637 | ||
2638 | case FFELEX_typeNAMES: | |
2639 | switch (ffelex_token_type (t)) | |
2640 | { | |
2641 | case FFELEX_typeCOMMA: | |
2642 | case FFELEX_typeCOLONCOLON: | |
2643 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
2644 | goto bad_1; /* :::::::::::::::::::: */ | |
2645 | ||
2646 | default: | |
2647 | goto bad_1; /* :::::::::::::::::::: */ | |
2648 | ||
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) | |
2653 | { | |
2654 | i = FFESTR_firstlELSEIF; | |
2655 | goto bad_i; /* :::::::::::::::::::: */ | |
2656 | } | |
2657 | ffesta_tokens[1] = NULL; | |
2658 | return (ffelexHandler) ffestb_else1_ (t); | |
2659 | ||
2660 | case FFELEX_typeEOS: | |
2661 | case FFELEX_typeSEMICOLON: | |
2662 | break; | |
2663 | } | |
2664 | ffesta_confirmed (); | |
2665 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlELSE); | |
2666 | ffesta_tokens[1] | |
2667 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
2668 | #if FFESTR_F90 | |
2669 | if ((ffestb_args.elsexyz.second == FFESTR_secondWHERE) | |
2670 | && (ffelex_token_length (ffesta_tokens[1]) != FFESTR_secondlWHERE)) | |
2671 | ffestb_args.elsexyz.second = FFESTR_secondNone; | |
2672 | #endif | |
2673 | return (ffelexHandler) ffestb_else1_ (t); | |
2674 | ||
2675 | default: | |
2676 | goto bad_0; /* :::::::::::::::::::: */ | |
2677 | } | |
2678 | ||
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); | |
2682 | ||
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. */ | |
2687 | ||
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); | |
2691 | } | |
2692 | ||
2693 | /* ffestb_else1_ -- "ELSE" (NAME) | |
2694 | ||
2695 | return ffestb_else1_; // to lexer | |
2696 | ||
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_. */ | |
2700 | ||
2701 | static ffelexHandler | |
2702 | ffestb_else1_ (ffelexToken t) | |
2703 | { | |
2704 | switch (ffelex_token_type (t)) | |
2705 | { | |
2706 | case FFELEX_typeOPEN_PAREN: | |
2707 | if (ffestb_args.elsexyz.second == FFESTR_secondIF) | |
2708 | { | |
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_); | |
2713 | } | |
2714 | /* Fall through. */ | |
2715 | default: | |
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); | |
2721 | ||
2722 | case FFELEX_typeEOS: | |
2723 | case FFELEX_typeSEMICOLON: | |
2724 | ffesta_confirmed (); | |
2725 | break; | |
2726 | ||
2727 | } | |
2728 | ||
2729 | switch (ffestb_args.elsexyz.second) | |
2730 | { | |
2731 | #if FFESTR_F90 | |
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)) | |
2736 | ffestc_R744 (); | |
2737 | else | |
2738 | ffestc_elsewhere (ffesta_tokens[1]); /* R744 or R805. */ | |
2739 | break; | |
2740 | #endif | |
2741 | ||
2742 | default: | |
2743 | if (!ffesta_is_inhibited ()) | |
2744 | ffestc_R805 (ffesta_tokens[1]); | |
2745 | break; | |
2746 | } | |
2747 | ||
2748 | if (ffesta_tokens[1] != NULL) | |
2749 | ffelex_token_kill (ffesta_tokens[1]); | |
2750 | return (ffelexHandler) ffesta_zero (t); | |
2751 | } | |
2752 | ||
2753 | /* ffestb_else2_ -- "ELSE" "IF" OPEN_PAREN expr | |
2754 | ||
2755 | (ffestb_else2_) // to expression handler | |
2756 | ||
2757 | Make sure the next token is CLOSE_PAREN. */ | |
2758 | ||
2759 | static ffelexHandler | |
2760 | ffestb_else2_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
2761 | { | |
2762 | ffestb_local_.else_stmt.expr = expr; | |
2763 | ||
2764 | switch (ffelex_token_type (t)) | |
2765 | { | |
2766 | case FFELEX_typeCLOSE_PAREN: | |
2767 | if (expr == NULL) | |
2768 | break; | |
2769 | ffesta_tokens[1] = ffelex_token_use (ft); | |
2770 | ffelex_set_names (TRUE); | |
2771 | return (ffelexHandler) ffestb_else3_; | |
2772 | ||
2773 | default: | |
2774 | break; | |
2775 | } | |
2776 | ||
2777 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ELSE IF", t); | |
2778 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
2779 | } | |
2780 | ||
2781 | /* ffestb_else3_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN | |
2782 | ||
2783 | return ffestb_else3_; // to lexer | |
2784 | ||
2785 | Make sure the next token is "THEN". */ | |
2786 | ||
2787 | static ffelexHandler | |
2788 | ffestb_else3_ (ffelexToken t) | |
2789 | { | |
2790 | ffeTokenLength i; | |
2791 | char *p; | |
2792 | ||
2793 | ffelex_set_names (FALSE); | |
2794 | ||
2795 | switch (ffelex_token_type (t)) | |
2796 | { | |
2797 | case FFELEX_typeNAME: | |
2798 | ffesta_confirmed (); | |
2799 | if (ffestr_first (t) == FFESTR_firstTHEN) | |
2800 | return (ffelexHandler) ffestb_else4_; | |
2801 | break; | |
2802 | ||
2803 | case FFELEX_typeNAMES: | |
2804 | ffesta_confirmed (); | |
2805 | if (ffestr_first (t) != FFESTR_firstTHEN) | |
2806 | break; | |
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_; | |
2814 | ||
2815 | default: | |
2816 | break; | |
2817 | } | |
2818 | ||
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); | |
2822 | ||
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); | |
2827 | } | |
2828 | ||
2829 | /* ffestb_else4_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN "THEN" | |
2830 | ||
2831 | return ffestb_else4_; // to lexer | |
2832 | ||
2833 | Handle a NAME or EOS/SEMICOLON, then go to state _5_. */ | |
2834 | ||
2835 | static ffelexHandler | |
2836 | ffestb_else4_ (ffelexToken t) | |
2837 | { | |
2838 | ffelex_set_names (FALSE); | |
2839 | ||
2840 | switch (ffelex_token_type (t)) | |
2841 | { | |
2842 | case FFELEX_typeEOS: | |
2843 | case FFELEX_typeSEMICOLON: | |
2844 | ffesta_tokens[2] = NULL; | |
2845 | return (ffelexHandler) ffestb_else5_ (t); | |
2846 | ||
2847 | case FFELEX_typeNAME: | |
2848 | ffesta_tokens[2] = ffelex_token_use (t); | |
2849 | return (ffelexHandler) ffestb_else5_; | |
2850 | ||
2851 | default: | |
2852 | break; | |
2853 | } | |
2854 | ||
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); | |
2858 | } | |
2859 | ||
2860 | /* ffestb_else5_ -- "ELSE" "IF" OPEN_PAREN expr CLOSE_PAREN "THEN" | |
2861 | ||
2862 | return ffestb_else5_; // to lexer | |
2863 | ||
2864 | Make sure the next token is EOS or SEMICOLON; implement R804. */ | |
2865 | ||
2866 | static ffelexHandler | |
2867 | ffestb_else5_ (ffelexToken t) | |
2868 | { | |
2869 | switch (ffelex_token_type (t)) | |
2870 | { | |
2871 | case FFELEX_typeEOS: | |
2872 | case FFELEX_typeSEMICOLON: | |
2873 | if (!ffesta_is_inhibited ()) | |
2874 | ffestc_R804 (ffestb_local_.else_stmt.expr, ffesta_tokens[1], | |
2875 | ffesta_tokens[2]); | |
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); | |
2880 | ||
2881 | default: | |
2882 | break; | |
2883 | } | |
2884 | ||
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); | |
2890 | } | |
2891 | ||
2892 | /* ffestb_end -- Parse the END statement | |
2893 | ||
2894 | return ffestb_end; // to lexer | |
2895 | ||
2896 | Make sure the statement has a valid form for the END statement. If it | |
2897 | does, implement the statement. */ | |
2898 | ||
2899 | ffelexHandler | |
2900 | ffestb_end (ffelexToken t) | |
2901 | { | |
2902 | ffeTokenLength i; | |
2903 | ||
2904 | switch (ffelex_token_type (ffesta_tokens[0])) | |
2905 | { | |
2906 | case FFELEX_typeNAME: | |
2907 | if (ffesta_first_kw != FFESTR_firstEND) | |
2908 | goto bad_0; /* :::::::::::::::::::: */ | |
2909 | switch (ffelex_token_type (t)) | |
2910 | { | |
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); | |
2916 | ||
2917 | case FFELEX_typeCOMMA: | |
2918 | case FFELEX_typeCOLONCOLON: | |
2919 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
2920 | goto bad_1; /* :::::::::::::::::::: */ | |
2921 | ||
2922 | default: | |
2923 | goto bad_1; /* :::::::::::::::::::: */ | |
2924 | ||
2925 | case FFELEX_typeNAME: | |
2926 | break; | |
2927 | } | |
2928 | ||
2929 | ffesta_confirmed (); | |
2930 | ffestb_args.endxyz.second = ffesta_second_kw; | |
2931 | switch (ffesta_second_kw) | |
2932 | { | |
2933 | case FFESTR_secondFILE: | |
2934 | ffestb_args.beru.badname = "ENDFILE"; | |
2935 | return (ffelexHandler) ffestb_beru; | |
2936 | ||
2937 | case FFESTR_secondBLOCK: | |
2938 | return (ffelexHandler) ffestb_end1_; | |
2939 | ||
2940 | #if FFESTR_F90 | |
2941 | case FFESTR_secondINTERFACE: | |
2942 | #endif | |
2943 | #if FFESTR_VXT | |
2944 | case FFESTR_secondMAP: | |
2945 | case FFESTR_secondSTRUCTURE: | |
2946 | case FFESTR_secondUNION: | |
2947 | #endif | |
2948 | #if FFESTR_F90 | |
2949 | case FFESTR_secondWHERE: | |
2950 | ffesta_tokens[1] = NULL; | |
2951 | return (ffelexHandler) ffestb_end3_; | |
2952 | #endif | |
2953 | ||
2954 | case FFESTR_secondNone: | |
2955 | goto bad_1; /* :::::::::::::::::::: */ | |
2956 | ||
2957 | default: | |
2958 | return (ffelexHandler) ffestb_end2_; | |
2959 | } | |
2960 | ||
2961 | case FFELEX_typeNAMES: | |
2962 | if (ffesta_first_kw != FFESTR_firstEND) | |
2963 | goto bad_0; /* :::::::::::::::::::: */ | |
2964 | switch (ffelex_token_type (t)) | |
2965 | { | |
2966 | case FFELEX_typeCOMMA: | |
2967 | case FFELEX_typeCOLONCOLON: | |
2968 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
2969 | goto bad_1; /* :::::::::::::::::::: */ | |
2970 | ||
2971 | default: | |
2972 | goto bad_1; /* :::::::::::::::::::: */ | |
2973 | ||
2974 | case FFELEX_typeEOS: | |
2975 | case FFELEX_typeSEMICOLON: | |
2976 | break; | |
2977 | } | |
2978 | ffesta_confirmed (); | |
2979 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlEND) | |
2980 | { | |
2981 | i = FFESTR_firstlEND; | |
2982 | goto bad_i; /* :::::::::::::::::::: */ | |
2983 | } | |
2984 | ffesta_tokens[1] = NULL; | |
2985 | ffestb_args.endxyz.second = FFESTR_secondNone; | |
2986 | return (ffelexHandler) ffestb_end3_ (t); | |
2987 | ||
2988 | default: | |
2989 | goto bad_0; /* :::::::::::::::::::: */ | |
2990 | } | |
2991 | ||
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); | |
2995 | ||
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. */ | |
3000 | ||
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); | |
3004 | } | |
3005 | ||
3006 | /* ffestb_endxyz -- Parse an ENDxyz statement | |
3007 | ||
3008 | return ffestb_endxyz; // to lexer | |
3009 | ||
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. */ | |
3012 | ||
3013 | ffelexHandler | |
3014 | ffestb_endxyz (ffelexToken t) | |
3015 | { | |
3016 | ffeTokenLength i; | |
3017 | char *p; | |
3018 | ||
3019 | switch (ffelex_token_type (ffesta_tokens[0])) | |
3020 | { | |
3021 | case FFELEX_typeNAME: | |
3022 | switch (ffelex_token_type (t)) | |
3023 | { | |
3024 | case FFELEX_typeEOS: | |
3025 | case FFELEX_typeSEMICOLON: | |
3026 | ffesta_confirmed (); | |
3027 | ffesta_tokens[1] = NULL; | |
3028 | return (ffelexHandler) ffestb_end3_ (t); | |
3029 | ||
3030 | case FFELEX_typeNAME: | |
3031 | ffesta_confirmed (); | |
3032 | switch (ffestb_args.endxyz.second) | |
3033 | { | |
3034 | #if FFESTR_F90 | |
3035 | case FFESTR_secondINTERFACE: | |
3036 | #endif | |
3037 | #if FFESTR_VXT | |
3038 | case FFESTR_secondMAP: | |
3039 | case FFESTR_secondSTRUCTURE: | |
3040 | case FFESTR_secondUNION: | |
3041 | #endif | |
3042 | #if FFESTR_F90 | |
3043 | case FFESTR_secondWHERE: | |
3044 | goto bad_1; /* :::::::::::::::::::: */ | |
3045 | #endif | |
3046 | ||
3047 | case FFESTR_secondBLOCK: | |
3048 | if (ffesta_second_kw != FFESTR_secondDATA) | |
3049 | goto bad_1; /* :::::::::::::::::::: */ | |
3050 | return (ffelexHandler) ffestb_end2_; | |
3051 | ||
3052 | default: | |
3053 | return (ffelexHandler) ffestb_end2_ (t); | |
3054 | } | |
3055 | ||
3056 | case FFELEX_typeCOMMA: | |
3057 | case FFELEX_typeCOLONCOLON: | |
3058 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
3059 | goto bad_1; /* :::::::::::::::::::: */ | |
3060 | ||
3061 | default: | |
3062 | goto bad_1; /* :::::::::::::::::::: */ | |
3063 | } | |
3064 | ||
3065 | case FFELEX_typeNAMES: | |
3066 | switch (ffelex_token_type (t)) | |
3067 | { | |
3068 | case FFELEX_typeCOMMA: | |
3069 | case FFELEX_typeCOLONCOLON: | |
3070 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
3071 | goto bad_1; /* :::::::::::::::::::: */ | |
3072 | ||
3073 | default: | |
3074 | goto bad_1; /* :::::::::::::::::::: */ | |
3075 | ||
3076 | case FFELEX_typeEOS: | |
3077 | case FFELEX_typeSEMICOLON: | |
3078 | break; | |
3079 | } | |
3080 | ffesta_confirmed (); | |
3081 | if (ffestb_args.endxyz.second == FFESTR_secondBLOCK) | |
3082 | { | |
3083 | i = FFESTR_firstlEND; | |
3084 | goto bad_i; /* :::::::::::::::::::: */ | |
3085 | } | |
3086 | if (ffelex_token_length (ffesta_tokens[0]) != ffestb_args.endxyz.len) | |
3087 | { | |
3088 | p = ffelex_token_text (ffesta_tokens[0]) | |
3089 | + (i = ffestb_args.endxyz.len); | |
3090 | switch (ffestb_args.endxyz.second) | |
3091 | { | |
3092 | #if FFESTR_F90 | |
3093 | case FFESTR_secondINTERFACE: | |
3094 | #endif | |
3095 | #if FFESTR_VXT | |
3096 | case FFESTR_secondMAP: | |
3097 | case FFESTR_secondSTRUCTURE: | |
3098 | case FFESTR_secondUNION: | |
3099 | #endif | |
3100 | #if FFESTR_F90 | |
3101 | case FFESTR_secondWHERE: | |
3102 | goto bad_i; /* :::::::::::::::::::: */ | |
3103 | #endif | |
3104 | ||
3105 | default: | |
3106 | break; | |
3107 | } | |
3108 | if (!ffesrc_is_name_init (*p)) | |
3109 | goto bad_i; /* :::::::::::::::::::: */ | |
3110 | ffesta_tokens[1] | |
3111 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
3112 | return (ffelexHandler) ffestb_end3_ (t); | |
3113 | } | |
3114 | ffesta_tokens[1] = NULL; | |
3115 | return (ffelexHandler) ffestb_end3_ (t); | |
3116 | ||
3117 | default: | |
3118 | goto bad_0; /* :::::::::::::::::::: */ | |
3119 | } | |
3120 | ||
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); | |
3124 | ||
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. */ | |
3129 | ||
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); | |
3133 | } | |
3134 | ||
3135 | /* ffestb_end1_ -- "END" "BLOCK" | |
3136 | ||
3137 | return ffestb_end1_; // to lexer | |
3138 | ||
3139 | Make sure the next token is "DATA". */ | |
3140 | ||
3141 | static ffelexHandler | |
3142 | ffestb_end1_ (ffelexToken t) | |
3143 | { | |
3144 | if ((ffelex_token_type (t) == FFELEX_typeNAME) | |
3145 | && (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t), "DATA", | |
3146 | "data", "Data") | |
3147 | == 0)) | |
3148 | { | |
3149 | return (ffelexHandler) ffestb_end2_; | |
3150 | } | |
3151 | ||
3152 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t); | |
3153 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3154 | } | |
3155 | ||
3156 | /* ffestb_end2_ -- "END" <unit-kind> | |
3157 | ||
3158 | return ffestb_end2_; // to lexer | |
3159 | ||
3160 | Make sure the next token is a NAME or EOS. */ | |
3161 | ||
3162 | static ffelexHandler | |
3163 | ffestb_end2_ (ffelexToken t) | |
3164 | { | |
3165 | switch (ffelex_token_type (t)) | |
3166 | { | |
3167 | case FFELEX_typeNAME: | |
3168 | ffesta_tokens[1] = ffelex_token_use (t); | |
3169 | return (ffelexHandler) ffestb_end3_; | |
3170 | ||
3171 | case FFELEX_typeEOS: | |
3172 | case FFELEX_typeSEMICOLON: | |
3173 | ffesta_tokens[1] = NULL; | |
3174 | return (ffelexHandler) ffestb_end3_ (t); | |
3175 | ||
3176 | default: | |
3177 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "END", t); | |
3178 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
3179 | (ffelexHandler) ffesta_zero); | |
3180 | } | |
3181 | } | |
3182 | ||
3183 | /* ffestb_end3_ -- "END" <unit-kind> (NAME) | |
3184 | ||
3185 | return ffestb_end3_; // to lexer | |
3186 | ||
3187 | Make sure the next token is an EOS, then implement the statement. */ | |
3188 | ||
3189 | static ffelexHandler | |
3190 | ffestb_end3_ (ffelexToken t) | |
3191 | { | |
3192 | switch (ffelex_token_type (t)) | |
3193 | { | |
3194 | default: | |
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); | |
3200 | ||
3201 | case FFELEX_typeEOS: | |
3202 | case FFELEX_typeSEMICOLON: | |
3203 | ffesta_confirmed (); | |
3204 | if (ffestb_args.endxyz.second == FFESTR_secondNone) | |
3205 | { | |
3206 | if (!ffesta_is_inhibited ()) | |
3207 | ffestc_end (); | |
3208 | return (ffelexHandler) ffesta_zero (t); | |
3209 | } | |
3210 | break; | |
3211 | } | |
3212 | ||
3213 | switch (ffestb_args.endxyz.second) | |
3214 | { | |
3215 | #if FFESTR_F90 | |
3216 | case FFESTR_secondTYPE: | |
3217 | if (!ffesta_is_inhibited ()) | |
3218 | ffestc_R425 (ffesta_tokens[1]); | |
3219 | break; | |
3220 | #endif | |
3221 | ||
3222 | #if FFESTR_F90 | |
3223 | case FFESTR_secondWHERE: | |
3224 | if (!ffesta_is_inhibited ()) | |
3225 | ffestc_R745 (); | |
3226 | break; | |
3227 | #endif | |
3228 | ||
3229 | case FFESTR_secondIF: | |
3230 | if (!ffesta_is_inhibited ()) | |
3231 | ffestc_R806 (ffesta_tokens[1]); | |
3232 | break; | |
3233 | ||
3234 | case FFESTR_secondSELECT: | |
3235 | if (!ffesta_is_inhibited ()) | |
3236 | ffestc_R811 (ffesta_tokens[1]); | |
3237 | break; | |
3238 | ||
3239 | case FFESTR_secondDO: | |
3240 | if (!ffesta_is_inhibited ()) | |
3241 | ffestc_R825 (ffesta_tokens[1]); | |
3242 | break; | |
3243 | ||
3244 | case FFESTR_secondPROGRAM: | |
3245 | if (!ffesta_is_inhibited ()) | |
3246 | ffestc_R1103 (ffesta_tokens[1]); | |
3247 | break; | |
3248 | ||
3249 | #if FFESTR_F90 | |
3250 | case FFESTR_secondMODULE: | |
3251 | if (!ffesta_is_inhibited ()) | |
3252 | ffestc_R1106 (ffesta_tokens[1]); | |
3253 | break; | |
3254 | #endif | |
3255 | case FFESTR_secondBLOCK: | |
3256 | case FFESTR_secondBLOCKDATA: | |
3257 | if (!ffesta_is_inhibited ()) | |
3258 | ffestc_R1112 (ffesta_tokens[1]); | |
3259 | break; | |
3260 | ||
3261 | #if FFESTR_F90 | |
3262 | case FFESTR_secondINTERFACE: | |
3263 | if (!ffesta_is_inhibited ()) | |
3264 | ffestc_R1203 (); | |
3265 | break; | |
3266 | #endif | |
3267 | ||
3268 | case FFESTR_secondFUNCTION: | |
3269 | if (!ffesta_is_inhibited ()) | |
3270 | ffestc_R1221 (ffesta_tokens[1]); | |
3271 | break; | |
3272 | ||
3273 | case FFESTR_secondSUBROUTINE: | |
3274 | if (!ffesta_is_inhibited ()) | |
3275 | ffestc_R1225 (ffesta_tokens[1]); | |
3276 | break; | |
3277 | ||
3278 | #if FFESTR_VXT | |
3279 | case FFESTR_secondSTRUCTURE: | |
3280 | if (!ffesta_is_inhibited ()) | |
3281 | ffestc_V004 (); | |
3282 | break; | |
3283 | #endif | |
3284 | ||
3285 | #if FFESTR_VXT | |
3286 | case FFESTR_secondUNION: | |
3287 | if (!ffesta_is_inhibited ()) | |
3288 | ffestc_V010 (); | |
3289 | break; | |
3290 | #endif | |
3291 | ||
3292 | #if FFESTR_VXT | |
3293 | case FFESTR_secondMAP: | |
3294 | if (!ffesta_is_inhibited ()) | |
3295 | ffestc_V013 (); | |
3296 | break; | |
3297 | #endif | |
3298 | ||
3299 | default: | |
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); | |
3305 | } | |
3306 | ||
3307 | if (ffesta_tokens[1] != NULL) | |
3308 | ffelex_token_kill (ffesta_tokens[1]); | |
3309 | return (ffelexHandler) ffesta_zero (t); | |
3310 | } | |
3311 | ||
3312 | /* ffestb_goto -- Parse the GOTO statement | |
3313 | ||
3314 | return ffestb_goto; // to lexer | |
3315 | ||
3316 | Make sure the statement has a valid form for the GOTO statement. If it | |
3317 | does, implement the statement. */ | |
3318 | ||
3319 | ffelexHandler | |
3320 | ffestb_goto (ffelexToken t) | |
3321 | { | |
3322 | ffeTokenLength i; | |
3323 | char *p; | |
3324 | ffelexHandler next; | |
3325 | ffelexToken nt; | |
3326 | ||
3327 | switch (ffelex_token_type (ffesta_tokens[0])) | |
3328 | { | |
3329 | case FFELEX_typeNAME: | |
3330 | switch (ffesta_first_kw) | |
3331 | { | |
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_; | |
3338 | ||
3339 | case FFESTR_firstGOTO: | |
3340 | return (ffelexHandler) ffestb_goto1_ (t); | |
3341 | ||
3342 | default: | |
3343 | goto bad_0; /* :::::::::::::::::::: */ | |
3344 | } | |
3345 | ||
3346 | case FFELEX_typeNAMES: | |
3347 | if (ffesta_first_kw != FFESTR_firstGOTO) | |
3348 | goto bad_0; /* :::::::::::::::::::: */ | |
3349 | switch (ffelex_token_type (t)) | |
3350 | { | |
3351 | case FFELEX_typeCOLONCOLON: | |
3352 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
3353 | goto bad_1; /* :::::::::::::::::::: */ | |
3354 | ||
3355 | default: | |
3356 | goto bad_1; /* :::::::::::::::::::: */ | |
3357 | ||
3358 | case FFELEX_typeOPEN_PAREN: | |
3359 | case FFELEX_typePERCENT: /* Since GOTO I%J is apparently valid | |
3360 | in '90. */ | |
3361 | case FFELEX_typeCOMMA: | |
3362 | break; | |
3363 | ||
3364 | case FFELEX_typeEOS: | |
3365 | case FFELEX_typeSEMICOLON: | |
3366 | ffesta_confirmed (); | |
3367 | break; | |
3368 | } | |
3369 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlGOTO) | |
3370 | { | |
3371 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlGOTO); | |
3372 | if (isdigit (*p)) | |
3373 | { | |
3374 | nt = ffelex_token_number_from_names (ffesta_tokens[0], i); | |
3375 | p += ffelex_token_length (nt); | |
3376 | i += ffelex_token_length (nt); | |
3377 | if (*p != '\0') | |
3378 | { | |
3379 | ffelex_token_kill (nt); | |
3380 | goto bad_i; /* :::::::::::::::::::: */ | |
3381 | } | |
3382 | } | |
3383 | else if (ffesrc_is_name_init (*p)) | |
3384 | { | |
3385 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
3386 | } | |
3387 | else | |
3388 | goto bad_i; /* :::::::::::::::::::: */ | |
3389 | next = (ffelexHandler) ffestb_goto1_ (nt); | |
3390 | ffelex_token_kill (nt); | |
3391 | return (ffelexHandler) (*next) (t); | |
3392 | } | |
3393 | return (ffelexHandler) ffestb_goto1_ (t); | |
3394 | ||
3395 | default: | |
3396 | goto bad_0; /* :::::::::::::::::::: */ | |
3397 | } | |
3398 | ||
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); | |
3402 | ||
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. */ | |
3407 | ||
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); | |
3411 | } | |
3412 | ||
3413 | /* ffestb_goto1_ -- "GOTO" or "GO" "TO" | |
3414 | ||
3415 | return ffestb_goto1_; // to lexer | |
3416 | ||
3417 | Make sure the statement has a valid form for the GOTO statement. If it | |
3418 | does, implement the statement. */ | |
3419 | ||
3420 | static ffelexHandler | |
3421 | ffestb_goto1_ (ffelexToken t) | |
3422 | { | |
3423 | switch (ffelex_token_type (t)) | |
3424 | { | |
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_; | |
3430 | ||
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_; | |
3436 | ||
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_))) | |
3444 | (t); | |
3445 | ||
3446 | case FFELEX_typeEOS: | |
3447 | case FFELEX_typeSEMICOLON: | |
3448 | case FFELEX_typeCOMMA: | |
3449 | case FFELEX_typeCOLONCOLON: | |
3450 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
3451 | break; | |
3452 | ||
3453 | default: | |
3454 | break; | |
3455 | } | |
3456 | ||
3457 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "GO TO", t); | |
3458 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3459 | } | |
3460 | ||
3461 | /* ffestb_goto2_ -- "GO/TO" NUMBER | |
3462 | ||
3463 | return ffestb_goto2_; // to lexer | |
3464 | ||
3465 | Make sure the statement has a valid form for the GOTO statement. If it | |
3466 | does, implement the statement. */ | |
3467 | ||
3468 | static ffelexHandler | |
3469 | ffestb_goto2_ (ffelexToken t) | |
3470 | { | |
3471 | switch (ffelex_token_type (t)) | |
3472 | { | |
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); | |
3480 | ||
3481 | default: | |
3482 | break; | |
3483 | } | |
3484 | ||
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); | |
3488 | } | |
3489 | ||
3490 | /* ffestb_goto3_ -- "GO/TO" OPEN_PAREN label-list CLOSE_PAREN | |
3491 | ||
3492 | return ffestb_goto3_; // to lexer | |
3493 | ||
3494 | Make sure the statement has a valid form for the GOTO statement. If it | |
3495 | does, implement the statement. */ | |
3496 | ||
3497 | static ffelexHandler | |
3498 | ffestb_goto3_ (ffelexToken t) | |
3499 | { | |
3500 | if (!ffestb_subrargs_.label_list.ok) | |
3501 | goto bad; /* :::::::::::::::::::: */ | |
3502 | ||
3503 | switch (ffelex_token_type (t)) | |
3504 | { | |
3505 | case FFELEX_typeCOMMA: | |
3506 | ffesta_confirmed (); | |
3507 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextCGOTO, | |
3508 | (ffeexprCallback) ffestb_goto5_); | |
3509 | ||
3510 | case FFELEX_typeEQUALS: | |
3511 | case FFELEX_typePOINTS: | |
3512 | case FFELEX_typeEOS: | |
3513 | case FFELEX_typeSEMICOLON: | |
3514 | break; | |
3515 | ||
3516 | default: | |
3517 | ffesta_confirmed (); | |
3518 | /* Fall through. */ | |
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_))) | |
3523 | (t); | |
3524 | } | |
3525 | ||
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); | |
3531 | } | |
3532 | ||
3533 | /* ffestb_goto4_ -- "GO/TO" expr | |
3534 | ||
3535 | (ffestb_goto4_) // to expression handler | |
3536 | ||
3537 | Make sure the statement has a valid form for the GOTO statement. If it | |
3538 | does, implement the statement. */ | |
3539 | ||
3540 | static ffelexHandler | |
3541 | ffestb_goto4_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
3542 | { | |
3543 | switch (ffelex_token_type (t)) | |
3544 | { | |
3545 | case FFELEX_typeCOMMA: | |
3546 | ffesta_confirmed (); | |
3547 | if (expr == NULL) | |
3548 | break; | |
3549 | ffesta_tokens[1] = ffelex_token_use (ft); | |
3550 | ffestb_local_.go_to.expr = expr; | |
3551 | return (ffelexHandler) ffestb_goto6_; | |
3552 | ||
3553 | case FFELEX_typeOPEN_PAREN: | |
3554 | if (expr == NULL) | |
3555 | break; | |
3556 | ffesta_tokens[1] = ffelex_token_use (ft); | |
3557 | ffestb_local_.go_to.expr = expr; | |
3558 | return (ffelexHandler) ffestb_goto6_ (t); | |
3559 | ||
3560 | case FFELEX_typeEOS: | |
3561 | case FFELEX_typeSEMICOLON: | |
3562 | ffesta_confirmed (); | |
3563 | if (expr == NULL) | |
3564 | break; | |
3565 | if (!ffesta_is_inhibited ()) | |
3566 | ffestc_R839 (expr, ft, NULL); | |
3567 | return (ffelexHandler) ffesta_zero (t); | |
3568 | ||
3569 | default: | |
3570 | break; | |
3571 | } | |
3572 | ||
3573 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assigned-GOTO", t); | |
3574 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3575 | } | |
3576 | ||
3577 | /* ffestb_goto5_ -- "GO/TO" OPEN_PAREN label-list CLOSE_PAREN (COMMA) expr | |
3578 | ||
3579 | (ffestb_goto5_) // to expression handler | |
3580 | ||
3581 | Make sure the statement has a valid form for the GOTO statement. If it | |
3582 | does, implement the statement. */ | |
3583 | ||
3584 | static ffelexHandler | |
3585 | ffestb_goto5_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
3586 | { | |
3587 | switch (ffelex_token_type (t)) | |
3588 | { | |
3589 | case FFELEX_typeEOS: | |
3590 | case FFELEX_typeSEMICOLON: | |
3591 | if (expr == NULL) | |
3592 | break; | |
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); | |
3599 | ||
3600 | default: | |
3601 | break; | |
3602 | } | |
3603 | ||
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); | |
3608 | } | |
3609 | ||
3610 | /* ffestb_goto6_ -- "GO/TO" expr (COMMA) | |
3611 | ||
3612 | return ffestb_goto6_; // to lexer | |
3613 | ||
3614 | Make sure the statement has a valid form for the GOTO statement. If it | |
3615 | does, implement the statement. */ | |
3616 | ||
3617 | static ffelexHandler | |
3618 | ffestb_goto6_ (ffelexToken t) | |
3619 | { | |
3620 | switch (ffelex_token_type (t)) | |
3621 | { | |
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_; | |
3627 | ||
3628 | default: | |
3629 | break; | |
3630 | } | |
3631 | ||
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); | |
3635 | } | |
3636 | ||
3637 | /* ffestb_goto7_ -- "GO/TO" expr (COMMA) OPEN_PAREN label-list CLOSE_PAREN | |
3638 | ||
3639 | return ffestb_goto7_; // to lexer | |
3640 | ||
3641 | Make sure the statement has a valid form for the GOTO statement. If it | |
3642 | does, implement the statement. */ | |
3643 | ||
3644 | static ffelexHandler | |
3645 | ffestb_goto7_ (ffelexToken t) | |
3646 | { | |
3647 | if (!ffestb_subrargs_.label_list.ok) | |
3648 | goto bad; /* :::::::::::::::::::: */ | |
3649 | ||
3650 | switch (ffelex_token_type (t)) | |
3651 | { | |
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); | |
3662 | ||
3663 | default: | |
3664 | break; | |
3665 | } | |
3666 | ||
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); | |
3673 | } | |
3674 | ||
3675 | /* ffestb_halt -- Parse the STOP/PAUSE statement | |
3676 | ||
3677 | return ffestb_halt; // to lexer | |
3678 | ||
3679 | Make sure the statement has a valid form for the STOP/PAUSE statement. If | |
3680 | it does, implement the statement. */ | |
3681 | ||
3682 | ffelexHandler | |
3683 | ffestb_halt (ffelexToken t) | |
3684 | { | |
3685 | ffelexHandler next; | |
3686 | ||
3687 | switch (ffelex_token_type (ffesta_tokens[0])) | |
3688 | { | |
3689 | case FFELEX_typeNAME: | |
3690 | switch (ffelex_token_type (t)) | |
3691 | { | |
3692 | case FFELEX_typeCOMMA: | |
3693 | case FFELEX_typeCOLONCOLON: | |
3694 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
3695 | goto bad_1; /* :::::::::::::::::::: */ | |
3696 | ||
3697 | default: | |
3698 | goto bad_1; /* :::::::::::::::::::: */ | |
3699 | ||
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 (); | |
3707 | break; | |
3708 | } | |
3709 | ||
3710 | return (ffelexHandler) (*((ffelexHandler) | |
3711 | ffeexpr_rhs (ffesta_output_pool, | |
3712 | FFEEXPR_contextSTOP, | |
3713 | (ffeexprCallback) ffestb_halt1_))) | |
3714 | (t); | |
3715 | ||
3716 | case FFELEX_typeNAMES: | |
3717 | switch (ffelex_token_type (t)) | |
3718 | { | |
3719 | default: | |
3720 | goto bad_1; /* :::::::::::::::::::: */ | |
3721 | ||
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 (); | |
3729 | break; | |
3730 | } | |
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); | |
3736 | if (next == NULL) | |
3737 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
3738 | (ffelexHandler) ffesta_zero); | |
3739 | return (ffelexHandler) (*next) (t); | |
3740 | ||
3741 | default: | |
3742 | goto bad_0; /* :::::::::::::::::::: */ | |
3743 | } | |
3744 | ||
3745 | bad_0: /* :::::::::::::::::::: */ | |
3746 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, | |
3747 | (ffesta_first_kw == FFESTR_firstSTOP) | |
3748 | ? "STOP" : "PAUSE", | |
3749 | ffesta_tokens[0]); | |
3750 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3751 | ||
3752 | bad_1: /* :::::::::::::::::::: */ | |
3753 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, | |
3754 | (ffesta_first_kw == FFESTR_firstSTOP) | |
3755 | ? "STOP" : "PAUSE", | |
3756 | t); | |
3757 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
3758 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
3759 | } | |
3760 | ||
3761 | /* ffestb_halt1_ -- "STOP/PAUSE" expr | |
3762 | ||
3763 | (ffestb_halt1_) // to expression handler | |
3764 | ||
3765 | Make sure the next token is an EOS or SEMICOLON. */ | |
3766 | ||
3767 | static ffelexHandler | |
3768 | ffestb_halt1_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
3769 | { | |
3770 | switch (ffelex_token_type (t)) | |
3771 | { | |
3772 | case FFELEX_typeEOS: | |
3773 | case FFELEX_typeSEMICOLON: | |
3774 | ffesta_confirmed (); | |
3775 | if (!ffesta_is_inhibited ()) | |
3776 | if (ffesta_first_kw == FFESTR_firstSTOP) | |
3777 | ffestc_R842 (expr, ft); | |
3778 | else | |
3779 | ffestc_R843 (expr, ft); | |
3780 | return (ffelexHandler) ffesta_zero (t); | |
3781 | ||
3782 | default: | |
3783 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, | |
3784 | (ffesta_first_kw == FFESTR_firstSTOP) | |
3785 | ? "STOP" : "PAUSE", | |
3786 | t); | |
3787 | break; | |
3788 | } | |
3789 | ||
3790 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3791 | } | |
3792 | ||
3793 | /* ffestb_if -- Parse an IF statement | |
3794 | ||
3795 | return ffestb_if; // to lexer | |
3796 | ||
3797 | Make sure the statement has a valid form for an IF statement. | |
3798 | If it does, implement the statement. */ | |
3799 | ||
3800 | ffelexHandler | |
3801 | ffestb_if (ffelexToken t) | |
3802 | { | |
3803 | switch (ffelex_token_type (ffesta_tokens[0])) | |
3804 | { | |
3805 | case FFELEX_typeNAME: | |
3806 | if (ffesta_first_kw != FFESTR_firstIF) | |
3807 | goto bad_0; /* :::::::::::::::::::: */ | |
3808 | break; | |
3809 | ||
3810 | case FFELEX_typeNAMES: | |
3811 | if (ffesta_first_kw != FFESTR_firstIF) | |
3812 | goto bad_0; /* :::::::::::::::::::: */ | |
3813 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlIF) | |
3814 | goto bad_0; /* :::::::::::::::::::: */ | |
3815 | break; | |
3816 | ||
3817 | default: | |
3818 | goto bad_0; /* :::::::::::::::::::: */ | |
3819 | } | |
3820 | ||
3821 | switch (ffelex_token_type (t)) | |
3822 | { | |
3823 | case FFELEX_typeOPEN_PAREN: | |
3824 | break; | |
3825 | ||
3826 | case FFELEX_typeEOS: | |
3827 | case FFELEX_typeSEMICOLON: | |
3828 | case FFELEX_typeCOMMA: | |
3829 | case FFELEX_typeCOLONCOLON: | |
3830 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
3831 | goto bad_1; /* :::::::::::::::::::: */ | |
3832 | ||
3833 | default: | |
3834 | goto bad_1; /* :::::::::::::::::::: */ | |
3835 | } | |
3836 | ||
3837 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextIF, | |
3838 | (ffeexprCallback) ffestb_if1_); | |
3839 | ||
3840 | bad_0: /* :::::::::::::::::::: */ | |
3841 | if (ffesta_construct_name != NULL) | |
3842 | { | |
3843 | ffelex_token_kill (ffesta_construct_name); | |
3844 | ffesta_construct_name = NULL; | |
3845 | } | |
3846 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", ffesta_tokens[0]); | |
3847 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3848 | ||
3849 | bad_1: /* :::::::::::::::::::: */ | |
3850 | if (ffesta_construct_name != NULL) | |
3851 | { | |
3852 | ffelex_token_kill (ffesta_construct_name); | |
3853 | ffesta_construct_name = NULL; | |
3854 | } | |
3855 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t); | |
3856 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
3857 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
3858 | } | |
3859 | ||
3860 | /* ffestb_if1_ -- "IF" OPEN_PAREN expr | |
3861 | ||
3862 | (ffestb_if1_) // to expression handler | |
3863 | ||
3864 | Make sure the next token is CLOSE_PAREN. */ | |
3865 | ||
3866 | static ffelexHandler | |
3867 | ffestb_if1_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
3868 | { | |
3869 | ffestb_local_.if_stmt.expr = expr; | |
3870 | ||
3871 | switch (ffelex_token_type (t)) | |
3872 | { | |
3873 | case FFELEX_typeCLOSE_PAREN: | |
3874 | if (expr == NULL) | |
3875 | break; | |
3876 | ffesta_tokens[1] = ffelex_token_use (ft); | |
3877 | ffelex_set_names (TRUE); | |
3878 | return (ffelexHandler) ffestb_if2_; | |
3879 | ||
3880 | default: | |
3881 | break; | |
3882 | } | |
3883 | ||
3884 | if (ffesta_construct_name != NULL) | |
3885 | { | |
3886 | ffelex_token_kill (ffesta_construct_name); | |
3887 | ffesta_construct_name = NULL; | |
3888 | } | |
3889 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t); | |
3890 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3891 | } | |
3892 | ||
3893 | /* ffestb_if2_ -- "IF" OPEN_PAREN expr CLOSE_PAREN | |
3894 | ||
3895 | return ffestb_if2_; // to lexer | |
3896 | ||
3897 | Make sure the next token is NAME. */ | |
3898 | ||
3899 | static ffelexHandler | |
3900 | ffestb_if2_ (ffelexToken t) | |
3901 | { | |
3902 | ffelex_set_names (FALSE); | |
3903 | ||
3904 | switch (ffelex_token_type (t)) | |
3905 | { | |
3906 | case FFELEX_typeNAME: | |
3907 | case FFELEX_typeNAMES: | |
3908 | ffesta_confirmed (); | |
3909 | ffesta_tokens[2] = ffelex_token_use (t); | |
3910 | return (ffelexHandler) ffestb_if3_; | |
3911 | ||
3912 | default: | |
3913 | break; | |
3914 | } | |
3915 | ||
3916 | ffelex_token_kill (ffesta_tokens[1]); | |
3917 | if ((ffesta_construct_name == NULL) | |
3918 | || (ffelex_token_type (t) != FFELEX_typeNUMBER)) | |
3919 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IF", t); | |
3920 | else | |
3921 | ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT", | |
3922 | ffesta_construct_name, t); | |
3923 | if (ffesta_construct_name != NULL) | |
3924 | { | |
3925 | ffelex_token_kill (ffesta_construct_name); | |
3926 | ffesta_construct_name = NULL; | |
3927 | } | |
3928 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3929 | } | |
3930 | ||
3931 | /* ffestb_if3_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NAME | |
3932 | ||
3933 | return ffestb_if3_; // to lexer | |
3934 | ||
3935 | If the next token is EOS or SEMICOLON and the preceding NAME was "THEN", | |
3936 | implement R803. Else, implement R807 and send the preceding NAME followed | |
3937 | by the current token. */ | |
3938 | ||
3939 | static ffelexHandler | |
3940 | ffestb_if3_ (ffelexToken t) | |
3941 | { | |
3942 | ffelexHandler next; | |
3943 | ||
3944 | switch (ffelex_token_type (t)) | |
3945 | { | |
3946 | case FFELEX_typeEOS: | |
3947 | case FFELEX_typeSEMICOLON: | |
3948 | if (ffestr_first (ffesta_tokens[2]) == FFESTR_firstTHEN) | |
3949 | { | |
3950 | if (!ffesta_is_inhibited ()) | |
3951 | ffestc_R803 (ffesta_construct_name, ffestb_local_.if_stmt.expr, | |
3952 | ffesta_tokens[1]); | |
3953 | ffelex_token_kill (ffesta_tokens[1]); | |
3954 | ffelex_token_kill (ffesta_tokens[2]); | |
3955 | if (ffesta_construct_name != NULL) | |
3956 | { | |
3957 | ffelex_token_kill (ffesta_construct_name); | |
3958 | ffesta_construct_name = NULL; | |
3959 | } | |
3960 | return (ffelexHandler) ffesta_zero (t); | |
3961 | } | |
3962 | break; | |
3963 | ||
3964 | default: | |
3965 | break; | |
3966 | } | |
3967 | ||
3968 | if (ffesta_construct_name != NULL) | |
3969 | { | |
3970 | if (!ffesta_is_inhibited ()) | |
3971 | ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT", | |
3972 | ffesta_construct_name, ffesta_tokens[2]); | |
3973 | ffelex_token_kill (ffesta_construct_name); | |
3974 | ffesta_construct_name = NULL; | |
3975 | ffelex_token_kill (ffesta_tokens[1]); | |
3976 | ffelex_token_kill (ffesta_tokens[2]); | |
3977 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
3978 | } | |
3979 | ||
3980 | if (!ffesta_is_inhibited ()) | |
3981 | ffestc_R807 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]); | |
3982 | ffelex_token_kill (ffesta_tokens[1]); | |
3983 | { | |
3984 | ffelexToken my_2 = ffesta_tokens[2]; | |
3985 | ||
3986 | next = (ffelexHandler) ffesta_two (my_2, t); | |
3987 | ffelex_token_kill (my_2); | |
3988 | } | |
3989 | return (ffelexHandler) next; | |
3990 | } | |
3991 | ||
3992 | /* ffestb_where -- Parse a WHERE statement | |
3993 | ||
3994 | return ffestb_where; // to lexer | |
3995 | ||
3996 | Make sure the statement has a valid form for a WHERE statement. | |
3997 | If it does, implement the statement. */ | |
3998 | ||
3999 | #if FFESTR_F90 | |
4000 | ffelexHandler | |
4001 | ffestb_where (ffelexToken t) | |
4002 | { | |
4003 | switch (ffelex_token_type (ffesta_tokens[0])) | |
4004 | { | |
4005 | case FFELEX_typeNAME: | |
4006 | if (ffesta_first_kw != FFESTR_firstWHERE) | |
4007 | goto bad_0; /* :::::::::::::::::::: */ | |
4008 | break; | |
4009 | ||
4010 | case FFELEX_typeNAMES: | |
4011 | if (ffesta_first_kw != FFESTR_firstWHERE) | |
4012 | goto bad_0; /* :::::::::::::::::::: */ | |
4013 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlWHERE) | |
4014 | goto bad_0; /* :::::::::::::::::::: */ | |
4015 | break; | |
4016 | ||
4017 | default: | |
4018 | goto bad_0; /* :::::::::::::::::::: */ | |
4019 | } | |
4020 | ||
4021 | switch (ffelex_token_type (t)) | |
4022 | { | |
4023 | case FFELEX_typeOPEN_PAREN: | |
4024 | break; | |
4025 | ||
4026 | case FFELEX_typeEOS: | |
4027 | case FFELEX_typeSEMICOLON: | |
4028 | case FFELEX_typeCOMMA: | |
4029 | case FFELEX_typeCOLONCOLON: | |
4030 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
4031 | goto bad_1; /* :::::::::::::::::::: */ | |
4032 | ||
4033 | default: | |
4034 | goto bad_1; /* :::::::::::::::::::: */ | |
4035 | } | |
4036 | ||
4037 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextWHERE, | |
4038 | (ffeexprCallback) ffestb_where1_); | |
4039 | ||
4040 | bad_0: /* :::::::::::::::::::: */ | |
4041 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", ffesta_tokens[0]); | |
4042 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4043 | ||
4044 | bad_1: /* :::::::::::::::::::: */ | |
4045 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t); | |
4046 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
4047 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
4048 | } | |
4049 | ||
4050 | #endif | |
4051 | /* ffestb_where1_ -- "WHERE" OPEN_PAREN expr | |
4052 | ||
4053 | (ffestb_where1_) // to expression handler | |
4054 | ||
4055 | Make sure the next token is CLOSE_PAREN. */ | |
4056 | ||
4057 | #if FFESTR_F90 | |
4058 | static ffelexHandler | |
4059 | ffestb_where1_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
4060 | { | |
4061 | ffestb_local_.if_stmt.expr = expr; | |
4062 | ||
4063 | switch (ffelex_token_type (t)) | |
4064 | { | |
4065 | case FFELEX_typeCLOSE_PAREN: | |
4066 | if (expr == NULL) | |
4067 | break; | |
4068 | ffesta_tokens[1] = ffelex_token_use (ft); | |
4069 | ffelex_set_names (TRUE); | |
4070 | return (ffelexHandler) ffestb_where2_; | |
4071 | ||
4072 | default: | |
4073 | break; | |
4074 | } | |
4075 | ||
4076 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t); | |
4077 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4078 | } | |
4079 | ||
4080 | #endif | |
4081 | /* ffestb_where2_ -- "WHERE" OPEN_PAREN expr CLOSE_PAREN | |
4082 | ||
4083 | return ffestb_where2_; // to lexer | |
4084 | ||
4085 | Make sure the next token is NAME. */ | |
4086 | ||
4087 | #if FFESTR_F90 | |
4088 | static ffelexHandler | |
4089 | ffestb_where2_ (ffelexToken t) | |
4090 | { | |
4091 | ffelex_set_names (FALSE); | |
4092 | ||
4093 | switch (ffelex_token_type (t)) | |
4094 | { | |
4095 | case FFELEX_typeNAME: | |
4096 | case FFELEX_typeNAMES: | |
4097 | ffesta_confirmed (); | |
4098 | ffesta_tokens[2] = ffelex_token_use (t); | |
4099 | return (ffelexHandler) ffestb_where3_; | |
4100 | ||
4101 | case FFELEX_typeEOS: | |
4102 | case FFELEX_typeSEMICOLON: | |
4103 | ffesta_confirmed (); | |
4104 | if (!ffesta_is_inhibited ()) | |
4105 | ffestc_R742 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]); | |
4106 | ffelex_token_kill (ffesta_tokens[1]); | |
4107 | return (ffelexHandler) ffesta_zero (t); | |
4108 | ||
4109 | default: | |
4110 | break; | |
4111 | } | |
4112 | ||
4113 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WHERE", t); | |
4114 | ffelex_token_kill (ffesta_tokens[1]); | |
4115 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4116 | } | |
4117 | ||
4118 | #endif | |
4119 | /* ffestb_where3_ -- "WHERE" OPEN_PAREN expr CLOSE_PAREN NAME | |
4120 | ||
4121 | return ffestb_where3_; // to lexer | |
4122 | ||
4123 | Implement R742. */ | |
4124 | ||
4125 | #if FFESTR_F90 | |
4126 | static ffelexHandler | |
4127 | ffestb_where3_ (ffelexToken t) | |
4128 | { | |
4129 | ffelexHandler next; | |
4130 | ffelexToken my_2 = ffesta_tokens[2]; | |
4131 | ||
4132 | if (!ffesta_is_inhibited ()) | |
4133 | ffestc_R740 (ffestb_local_.if_stmt.expr, ffesta_tokens[1]); | |
4134 | ffelex_token_kill (ffesta_tokens[1]); | |
4135 | next = (ffelexHandler) ffesta_two (my_2, t); | |
4136 | ffelex_token_kill (my_2); | |
4137 | return (ffelexHandler) next; | |
4138 | } | |
4139 | ||
4140 | #endif | |
4141 | /* ffestb_let -- Parse an assignment statement | |
4142 | ||
4143 | return ffestb_let; // to lexer | |
4144 | ||
4145 | Make sure the statement has a valid form for an assignment statement. If | |
4146 | it does, implement the statement. */ | |
4147 | ||
4148 | ffelexHandler | |
4149 | ffestb_let (ffelexToken t) | |
4150 | { | |
4151 | ffelexHandler next; | |
4152 | bool vxtparam; /* TRUE if it might really be a VXT PARAMETER | |
4153 | stmt. */ | |
4154 | char *p; | |
4155 | ||
4156 | switch (ffelex_token_type (ffesta_tokens[0])) | |
4157 | { | |
4158 | case FFELEX_typeNAME: | |
4159 | vxtparam = FALSE; | |
4160 | break; | |
4161 | ||
4162 | case FFELEX_typeNAMES: | |
4163 | vxtparam = TRUE; | |
4164 | break; | |
4165 | ||
4166 | default: | |
4167 | goto bad_0; /* :::::::::::::::::::: */ | |
4168 | } | |
4169 | ||
4170 | switch (ffelex_token_type (t)) | |
4171 | { | |
4172 | case FFELEX_typeOPEN_PAREN: | |
4173 | case FFELEX_typePERCENT: | |
4174 | case FFELEX_typePOINTS: | |
4175 | ffestb_local_.let.vxtparam = FALSE; | |
4176 | break; | |
4177 | ||
4178 | case FFELEX_typeEQUALS: | |
4179 | if (!vxtparam || (ffesta_first_kw != FFESTR_firstPARAMETER)) | |
4180 | { | |
4181 | ffestb_local_.let.vxtparam = FALSE; | |
4182 | break; | |
4183 | } | |
4184 | p = ffelex_token_text (ffesta_tokens[0]) + FFESTR_firstlPARAMETER; | |
4185 | ffestb_local_.let.vxtparam = ffesrc_is_name_init (*p); | |
4186 | break; | |
4187 | ||
4188 | default: | |
4189 | goto bad_1; /* :::::::::::::::::::: */ | |
4190 | } | |
4191 | ||
4192 | next = (ffelexHandler) (*((ffelexHandler) | |
4193 | ffeexpr_lhs (ffesta_output_pool, | |
4194 | FFEEXPR_contextLET, | |
4195 | (ffeexprCallback) ffestb_let1_))) | |
4196 | (ffesta_tokens[0]); | |
4197 | return (ffelexHandler) (*next) (t); | |
4198 | ||
4199 | bad_0: /* :::::::::::::::::::: */ | |
4200 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", ffesta_tokens[0]); | |
4201 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4202 | ||
4203 | bad_1: /* :::::::::::::::::::: */ | |
4204 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", t); | |
4205 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
4206 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
4207 | } | |
4208 | ||
4209 | /* ffestb_let1_ -- expr | |
4210 | ||
4211 | (ffestb_let1_) // to expression handler | |
4212 | ||
4213 | Make sure the next token is EQUALS or POINTS. */ | |
4214 | ||
4215 | static ffelexHandler | |
4216 | ffestb_let1_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t) | |
4217 | { | |
4218 | ffestb_local_.let.dest = expr; | |
4219 | ||
4220 | switch (ffelex_token_type (t)) | |
4221 | { | |
4222 | #if FFESTR_F90 | |
4223 | case FFELEX_typePOINTS: | |
4224 | #endif | |
4225 | case FFELEX_typeEQUALS: | |
4226 | if (expr == NULL) | |
4227 | break; | |
4228 | ffesta_tokens[1] = ffelex_token_use (t); | |
4229 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
4230 | FFEEXPR_contextLET, (ffeexprCallback) ffestb_let2_); | |
4231 | ||
4232 | default: | |
4233 | break; | |
4234 | } | |
4235 | ||
4236 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "assignment", t); | |
4237 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4238 | } | |
4239 | ||
4240 | /* ffestb_let2_ -- expr EQUALS/POINTS expr | |
4241 | ||
4242 | (ffestb_end2_) // to expression handler | |
4243 | ||
4244 | Make sure the next token is EOS or SEMICOLON; implement the statement. */ | |
4245 | ||
4246 | static ffelexHandler | |
4247 | ffestb_let2_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
4248 | { | |
4249 | switch (ffelex_token_type (t)) | |
4250 | { | |
4251 | case FFELEX_typeEOS: | |
4252 | case FFELEX_typeSEMICOLON: | |
4253 | if (expr == NULL) | |
4254 | break; | |
4255 | if (ffestb_local_.let.vxtparam && !ffestc_is_let_not_V027 ()) | |
4256 | break; | |
4257 | ffesta_confirmed (); | |
4258 | if (!ffesta_is_inhibited ()) | |
4259 | #if FFESTR_F90 | |
4260 | if (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeEQUALS) | |
4261 | #endif | |
4262 | ffestc_let (ffestb_local_.let.dest, expr, ft); | |
4263 | #if FFESTR_F90 | |
4264 | else | |
4265 | ffestc_R738 (ffestb_local_.let.dest, expr, ft); | |
4266 | #endif | |
4267 | ffelex_token_kill (ffesta_tokens[1]); | |
4268 | return (ffelexHandler) ffesta_zero (t); | |
4269 | ||
4270 | default: | |
4271 | break; | |
4272 | } | |
4273 | ||
4274 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, | |
4275 | (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeEQUALS) | |
4276 | ? "assignment" : "pointer-assignment", | |
4277 | t); | |
4278 | ffelex_token_kill (ffesta_tokens[1]); | |
4279 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4280 | } | |
4281 | ||
4282 | /* ffestb_type -- Parse the TYPE statement | |
4283 | ||
4284 | return ffestb_type; // to lexer | |
4285 | ||
4286 | Make sure the statement has a valid form for the TYPE statement. If | |
4287 | it does, implement the statement. */ | |
4288 | ||
4289 | #if FFESTR_F90 | |
4290 | ffelexHandler | |
4291 | ffestb_type (ffelexToken t) | |
4292 | { | |
4293 | ffeTokenLength i; | |
4294 | char *p; | |
4295 | ||
4296 | switch (ffelex_token_type (ffesta_tokens[0])) | |
4297 | { | |
4298 | case FFELEX_typeNAME: | |
4299 | if (ffesta_first_kw != FFESTR_firstTYPE) | |
4300 | goto bad_0; /* :::::::::::::::::::: */ | |
4301 | switch (ffelex_token_type (t)) | |
4302 | { | |
4303 | case FFELEX_typeEOS: | |
4304 | case FFELEX_typeSEMICOLON: | |
4305 | case FFELEX_typeCOLONCOLON: | |
4306 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
4307 | goto bad_1; /* :::::::::::::::::::: */ | |
4308 | ||
4309 | default: | |
4310 | goto bad_1; /* :::::::::::::::::::: */ | |
4311 | ||
4312 | case FFELEX_typeCOMMA: | |
4313 | ffesta_confirmed (); | |
4314 | return (ffelexHandler) ffestb_type1_; | |
4315 | ||
4316 | case FFELEX_typeNAME: /* No confirm here, because ambig w/V020 VXT | |
4317 | TYPE. */ | |
4318 | ffesta_tokens[1] = NULL; | |
4319 | ffesta_tokens[2] = ffelex_token_use (t); | |
4320 | return (ffelexHandler) ffestb_type4_; | |
4321 | } | |
4322 | ||
4323 | case FFELEX_typeNAMES: | |
4324 | if (ffesta_first_kw != FFESTR_firstTYPE) | |
4325 | goto bad_0; /* :::::::::::::::::::: */ | |
4326 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlTYPE); | |
4327 | switch (ffelex_token_type (t)) | |
4328 | { | |
4329 | default: | |
4330 | goto bad_1; /* :::::::::::::::::::: */ | |
4331 | ||
4332 | case FFELEX_typeCOMMA: | |
4333 | if (*p != '\0') | |
4334 | goto bad_i; /* :::::::::::::::::::: */ | |
4335 | ffesta_confirmed (); | |
4336 | ffelex_set_names (TRUE); | |
4337 | return (ffelexHandler) ffestb_type1_; | |
4338 | ||
4339 | case FFELEX_typeEOS: | |
4340 | case FFELEX_typeSEMICOLON: | |
4341 | break; | |
4342 | } | |
4343 | if (!ffesrc_is_name_init (*p)) | |
4344 | goto bad_i; /* :::::::::::::::::::: */ | |
4345 | ffesta_tokens[1] = NULL; | |
4346 | ffesta_tokens[2] | |
4347 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
4348 | return (ffelexHandler) ffestb_type4_ (t); | |
4349 | ||
4350 | default: | |
4351 | goto bad_0; /* :::::::::::::::::::: */ | |
4352 | } | |
4353 | ||
4354 | bad_0: /* :::::::::::::::::::: */ | |
4355 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", ffesta_tokens[0]); | |
4356 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4357 | ||
4358 | bad_1: /* :::::::::::::::::::: */ | |
4359 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t); | |
4360 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
4361 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
4362 | ||
4363 | bad_i: /* :::::::::::::::::::: */ | |
4364 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "TYPE", ffesta_tokens[0], i, t); | |
4365 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4366 | } | |
4367 | ||
4368 | /* ffestb_type1_ -- "TYPE" COMMA | |
4369 | ||
4370 | return ffestb_type1_; // to lexer | |
4371 | ||
4372 | Make sure the next token is a NAME. */ | |
4373 | ||
4374 | static ffelexHandler | |
4375 | ffestb_type1_ (ffelexToken t) | |
4376 | { | |
4377 | ffeTokenLength i; | |
4378 | char *p; | |
4379 | ||
4380 | ffelex_set_names (FALSE); | |
4381 | ||
4382 | switch (ffelex_token_type (t)) | |
4383 | { | |
4384 | case FFELEX_typeNAME: | |
4385 | ffesta_tokens[1] = ffelex_token_use (t); | |
4386 | ffestb_local_.type.kw = ffestr_other (t); | |
4387 | switch (ffestb_local_.varlist.kw) | |
4388 | { | |
4389 | case FFESTR_otherPUBLIC: | |
4390 | case FFESTR_otherPRIVATE: | |
4391 | return (ffelexHandler) ffestb_type2_; | |
4392 | ||
4393 | default: | |
4394 | ffelex_token_kill (ffesta_tokens[1]); | |
4395 | break; | |
4396 | } | |
4397 | break; | |
4398 | ||
4399 | case FFELEX_typeNAMES: | |
4400 | ffesta_tokens[1] = ffelex_token_use (t); | |
4401 | ffestb_local_.type.kw = ffestr_other (t); | |
4402 | switch (ffestb_local_.varlist.kw) | |
4403 | { | |
4404 | case FFESTR_otherPUBLIC: | |
4405 | p = ffelex_token_text (t) + (i = FFESTR_otherlPUBLIC); | |
4406 | if (*p == '\0') | |
4407 | return (ffelexHandler) ffestb_type2_; | |
4408 | if (!ffesrc_is_name_init (*p)) | |
4409 | goto bad_i1; /* :::::::::::::::::::: */ | |
4410 | ffesta_tokens[2] = ffelex_token_name_from_names (t, i, 0); | |
4411 | return (ffelexHandler) ffestb_type4_; | |
4412 | ||
4413 | case FFESTR_otherPRIVATE: | |
4414 | p = ffelex_token_text (t) + (i = FFESTR_otherlPRIVATE); | |
4415 | if (*p == '\0') | |
4416 | return (ffelexHandler) ffestb_type2_; | |
4417 | if (!ffesrc_is_name_init (*p)) | |
4418 | goto bad_i1; /* :::::::::::::::::::: */ | |
4419 | ffesta_tokens[2] = ffelex_token_name_from_names (t, i, 0); | |
4420 | return (ffelexHandler) ffestb_type4_; | |
4421 | ||
4422 | default: | |
4423 | ffelex_token_kill (ffesta_tokens[1]); | |
4424 | break; | |
4425 | } | |
4426 | break; | |
4427 | ||
4428 | default: | |
4429 | break; | |
4430 | } | |
4431 | ||
4432 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t); | |
4433 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4434 | ||
4435 | bad_i1: /* :::::::::::::::::::: */ | |
4436 | ffelex_token_kill (ffesta_tokens[1]); | |
4437 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "TYPE", t, i, NULL); | |
4438 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4439 | } | |
4440 | ||
4441 | /* ffestb_type2_ -- "TYPE" COMMA NAME | |
4442 | ||
4443 | return ffestb_type2_; // to lexer | |
4444 | ||
4445 | Handle COLONCOLON or NAME. */ | |
4446 | ||
4447 | static ffelexHandler | |
4448 | ffestb_type2_ (ffelexToken t) | |
4449 | { | |
4450 | switch (ffelex_token_type (t)) | |
4451 | { | |
4452 | case FFELEX_typeCOLONCOLON: | |
4453 | return (ffelexHandler) ffestb_type3_; | |
4454 | ||
4455 | case FFELEX_typeNAME: | |
4456 | return (ffelexHandler) ffestb_type3_ (t); | |
4457 | ||
4458 | default: | |
4459 | break; | |
4460 | } | |
4461 | ||
4462 | if (ffesta_tokens[1] != NULL) | |
4463 | ffelex_token_kill (ffesta_tokens[1]); | |
4464 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t); | |
4465 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4466 | } | |
4467 | ||
4468 | /* ffestb_type3_ -- "TYPE" [COMMA NAME [COLONCOLON]] | |
4469 | ||
4470 | return ffestb_type3_; // to lexer | |
4471 | ||
4472 | Make sure the next token is a NAME. */ | |
4473 | ||
4474 | static ffelexHandler | |
4475 | ffestb_type3_ (ffelexToken t) | |
4476 | { | |
4477 | switch (ffelex_token_type (t)) | |
4478 | { | |
4479 | case FFELEX_typeNAME: | |
4480 | ffesta_tokens[2] = ffelex_token_use (t); | |
4481 | return (ffelexHandler) ffestb_type4_; | |
4482 | ||
4483 | default: | |
4484 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t); | |
4485 | break; | |
4486 | } | |
4487 | ||
4488 | if (ffesta_tokens[1] != NULL) | |
4489 | ffelex_token_kill (ffesta_tokens[1]); | |
4490 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4491 | } | |
4492 | ||
4493 | /* ffestb_type4_ -- "TYPE" [COMMA NAME [COLONCOLON]] NAME | |
4494 | ||
4495 | return ffestb_type4_; // to lexer | |
4496 | ||
4497 | Make sure the next token is an EOS or SEMICOLON. */ | |
4498 | ||
4499 | static ffelexHandler | |
4500 | ffestb_type4_ (ffelexToken t) | |
4501 | { | |
4502 | switch (ffelex_token_type (t)) | |
4503 | { | |
4504 | case FFELEX_typeEOS: | |
4505 | case FFELEX_typeSEMICOLON: | |
4506 | ffesta_confirmed (); | |
4507 | if (!ffesta_is_inhibited ()) | |
4508 | ffestc_R424 (ffesta_tokens[1], ffestb_local_.type.kw, | |
4509 | ffesta_tokens[2]); | |
4510 | if (ffesta_tokens[1] != NULL) | |
4511 | ffelex_token_kill (ffesta_tokens[1]); | |
4512 | ffelex_token_kill (ffesta_tokens[2]); | |
4513 | return (ffelexHandler) ffesta_zero (t); | |
4514 | ||
4515 | default: | |
4516 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE", t); | |
4517 | break; | |
4518 | } | |
4519 | ||
4520 | if (ffesta_tokens[1] != NULL) | |
4521 | ffelex_token_kill (ffesta_tokens[1]); | |
4522 | ffelex_token_kill (ffesta_tokens[2]); | |
4523 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4524 | } | |
4525 | ||
4526 | #endif | |
4527 | /* ffestb_varlist -- Parse EXTERNAL/INTENT/INTRINSIC/OPTIONAL/PUBLIC/PRIVATE | |
4528 | statement | |
4529 | ||
4530 | return ffestb_varlist; // to lexer | |
4531 | ||
4532 | Make sure the statement has a valid form. If it | |
4533 | does, implement the statement. */ | |
4534 | ||
4535 | ffelexHandler | |
4536 | ffestb_varlist (ffelexToken t) | |
4537 | { | |
4538 | ffeTokenLength i; | |
4539 | char *p; | |
4540 | ffelexToken nt; | |
4541 | ffelexHandler next; | |
4542 | ||
4543 | switch (ffelex_token_type (ffesta_tokens[0])) | |
4544 | { | |
4545 | case FFELEX_typeNAME: | |
4546 | switch (ffelex_token_type (t)) | |
4547 | { | |
4548 | case FFELEX_typeEOS: | |
4549 | case FFELEX_typeSEMICOLON: | |
4550 | ffesta_confirmed (); | |
4551 | switch (ffesta_first_kw) | |
4552 | { | |
4553 | #if FFESTR_F90 | |
4554 | case FFESTR_firstPUBLIC: | |
4555 | if (!ffesta_is_inhibited ()) | |
4556 | ffestc_R521A (); | |
4557 | return (ffelexHandler) ffesta_zero (t); | |
4558 | ||
4559 | case FFESTR_firstPRIVATE: | |
4560 | if (!ffesta_is_inhibited ()) | |
4561 | ffestc_private (); /* Either R523A or R521B. */ | |
4562 | return (ffelexHandler) ffesta_zero (t); | |
4563 | #endif | |
4564 | ||
4565 | default: | |
4566 | goto bad_1; /* :::::::::::::::::::: */ | |
4567 | } | |
4568 | ||
4569 | case FFELEX_typeCOMMA: | |
4570 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
4571 | goto bad_1; /* :::::::::::::::::::: */ | |
4572 | ||
4573 | case FFELEX_typeCOLONCOLON: | |
4574 | ffesta_confirmed (); | |
4575 | switch (ffesta_first_kw) | |
4576 | { | |
4577 | #if FFESTR_F90 | |
4578 | case FFESTR_firstOPTIONAL: | |
4579 | if (!ffesta_is_inhibited ()) | |
4580 | ffestc_R520_start (); | |
4581 | break; | |
4582 | ||
4583 | case FFESTR_firstPUBLIC: | |
4584 | if (!ffesta_is_inhibited ()) | |
4585 | ffestc_R521Astart (); | |
4586 | break; | |
4587 | ||
4588 | case FFESTR_firstPRIVATE: | |
4589 | if (!ffesta_is_inhibited ()) | |
4590 | ffestc_R521Bstart (); | |
4591 | break; | |
4592 | #endif | |
4593 | ||
4594 | default: | |
4595 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
4596 | goto bad_1; /* :::::::::::::::::::: */ | |
4597 | } | |
4598 | return (ffelexHandler) ffestb_varlist5_; | |
4599 | ||
4600 | default: | |
4601 | goto bad_1; /* :::::::::::::::::::: */ | |
4602 | ||
4603 | case FFELEX_typeOPEN_PAREN: | |
4604 | switch (ffesta_first_kw) | |
4605 | { | |
4606 | #if FFESTR_F90 | |
4607 | case FFESTR_firstINTENT: | |
4608 | return (ffelexHandler) ffestb_varlist1_; | |
4609 | #endif | |
4610 | ||
4611 | default: | |
4612 | goto bad_1; /* :::::::::::::::::::: */ | |
4613 | } | |
4614 | ||
4615 | case FFELEX_typeNAME: | |
4616 | ffesta_confirmed (); | |
4617 | switch (ffesta_first_kw) | |
4618 | { | |
4619 | case FFESTR_firstEXTERNAL: | |
4620 | if (!ffesta_is_inhibited ()) | |
4621 | ffestc_R1207_start (); | |
4622 | break; | |
4623 | ||
4624 | #if FFESTR_F90 | |
4625 | case FFESTR_firstINTENT: | |
4626 | goto bad_1; /* :::::::::::::::::::: */ | |
4627 | #endif | |
4628 | ||
4629 | case FFESTR_firstINTRINSIC: | |
4630 | if (!ffesta_is_inhibited ()) | |
4631 | ffestc_R1208_start (); | |
4632 | break; | |
4633 | ||
4634 | #if FFESTR_F90 | |
4635 | case FFESTR_firstOPTIONAL: | |
4636 | if (!ffesta_is_inhibited ()) | |
4637 | ffestc_R520_start (); | |
4638 | break; | |
4639 | #endif | |
4640 | ||
4641 | #if FFESTR_F90 | |
4642 | case FFESTR_firstPUBLIC: | |
4643 | if (!ffesta_is_inhibited ()) | |
4644 | ffestc_R521Astart (); | |
4645 | break; | |
4646 | ||
4647 | case FFESTR_firstPRIVATE: | |
4648 | if (!ffesta_is_inhibited ()) | |
4649 | ffestc_R521Bstart (); | |
4650 | break; | |
4651 | #endif | |
4652 | ||
4653 | default: | |
4654 | break; | |
4655 | } | |
4656 | return (ffelexHandler) ffestb_varlist5_ (t); | |
4657 | } | |
4658 | ||
4659 | case FFELEX_typeNAMES: | |
4660 | p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.varlist.len); | |
4661 | switch (ffelex_token_type (t)) | |
4662 | { | |
4663 | case FFELEX_typeEOS: | |
4664 | case FFELEX_typeSEMICOLON: | |
4665 | ffesta_confirmed (); | |
4666 | switch (ffesta_first_kw) | |
4667 | { | |
4668 | #if FFESTR_F90 | |
4669 | case FFESTR_firstINTENT: | |
4670 | goto bad_1; /* :::::::::::::::::::: */ | |
4671 | #endif | |
4672 | ||
4673 | default: | |
4674 | break; | |
4675 | } | |
4676 | if (*p != '\0') | |
4677 | break; | |
4678 | switch (ffesta_first_kw) | |
4679 | { | |
4680 | #if FFESTR_F90 | |
4681 | case FFESTR_firstPUBLIC: | |
4682 | if (!ffesta_is_inhibited ()) | |
4683 | ffestc_R521A (); | |
4684 | return (ffelexHandler) ffesta_zero (t); | |
4685 | ||
4686 | case FFESTR_firstPRIVATE: | |
4687 | if (!ffesta_is_inhibited ()) | |
4688 | ffestc_private (); /* Either R423A or R521B. */ | |
4689 | return (ffelexHandler) ffesta_zero (t); | |
4690 | #endif | |
4691 | ||
4692 | default: | |
4693 | goto bad_1; /* :::::::::::::::::::: */ | |
4694 | } | |
4695 | ||
4696 | case FFELEX_typeCOMMA: | |
4697 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
4698 | switch (ffesta_first_kw) | |
4699 | { | |
4700 | #if FFESTR_F90 | |
4701 | case FFESTR_firstINTENT: | |
4702 | goto bad_1; /* :::::::::::::::::::: */ | |
4703 | #endif | |
4704 | ||
4705 | default: | |
4706 | break; | |
4707 | } | |
4708 | if (*p != '\0') | |
4709 | break; | |
4710 | goto bad_1; /* :::::::::::::::::::: */ | |
4711 | ||
4712 | case FFELEX_typeCOLONCOLON: | |
4713 | ffesta_confirmed (); | |
4714 | switch (ffesta_first_kw) | |
4715 | { | |
4716 | #if FFESTR_F90 | |
4717 | case FFESTR_firstOPTIONAL: | |
4718 | if (!ffesta_is_inhibited ()) | |
4719 | ffestc_R520_start (); | |
4720 | break; | |
4721 | #endif | |
4722 | ||
4723 | #if FFESTR_F90 | |
4724 | case FFESTR_firstPUBLIC: | |
4725 | if (!ffesta_is_inhibited ()) | |
4726 | ffestc_R521Astart (); | |
4727 | break; | |
4728 | ||
4729 | case FFESTR_firstPRIVATE: | |
4730 | if (!ffesta_is_inhibited ()) | |
4731 | ffestc_R521Bstart (); | |
4732 | break; | |
4733 | #endif | |
4734 | ||
4735 | default: | |
4736 | goto bad_1; /* :::::::::::::::::::: */ | |
4737 | } | |
4738 | return (ffelexHandler) ffestb_varlist5_; | |
4739 | ||
4740 | case FFELEX_typeOPEN_PAREN: | |
4741 | switch (ffesta_first_kw) | |
4742 | { | |
4743 | #if FFESTR_F90 | |
4744 | case FFESTR_firstINTENT: | |
4745 | if (*p != '\0') | |
4746 | goto bad_1; /* :::::::::::::::::::: */ | |
4747 | return (ffelexHandler) ffestb_varlist1_; | |
4748 | #endif | |
4749 | ||
4750 | default: | |
4751 | goto bad_1; /* :::::::::::::::::::: */ | |
4752 | } | |
4753 | ||
4754 | case FFELEX_typeNAME: | |
4755 | ffesta_confirmed (); | |
4756 | switch (ffesta_first_kw) | |
4757 | { | |
4758 | case FFESTR_firstEXTERNAL: | |
4759 | if (!ffesta_is_inhibited ()) | |
4760 | ffestc_R1207_start (); | |
4761 | break; | |
4762 | ||
4763 | #if FFESTR_F90 | |
4764 | case FFESTR_firstINTENT: | |
4765 | goto bad_1; /* :::::::::::::::::::: */ | |
4766 | #endif | |
4767 | ||
4768 | case FFESTR_firstINTRINSIC: | |
4769 | if (!ffesta_is_inhibited ()) | |
4770 | ffestc_R1208_start (); | |
4771 | break; | |
4772 | ||
4773 | #if FFESTR_F90 | |
4774 | case FFESTR_firstOPTIONAL: | |
4775 | if (!ffesta_is_inhibited ()) | |
4776 | ffestc_R520_start (); | |
4777 | break; | |
4778 | #endif | |
4779 | ||
4780 | #if FFESTR_F90 | |
4781 | case FFESTR_firstPUBLIC: | |
4782 | if (!ffesta_is_inhibited ()) | |
4783 | ffestc_R521Astart (); | |
4784 | break; | |
4785 | ||
4786 | case FFESTR_firstPRIVATE: | |
4787 | if (!ffesta_is_inhibited ()) | |
4788 | ffestc_R521Bstart (); | |
4789 | break; | |
4790 | #endif | |
4791 | ||
4792 | default: | |
4793 | break; | |
4794 | } | |
4795 | return (ffelexHandler) ffestb_varlist5_ (t); | |
4796 | ||
4797 | default: | |
4798 | goto bad_1; /* :::::::::::::::::::: */ | |
4799 | } | |
4800 | ||
4801 | /* Here, we have at least one char after the first keyword and t is | |
4802 | COMMA or EOS/SEMICOLON. Also we know that this form is valid for | |
4803 | only the statements reaching here (specifically, INTENT won't reach | |
4804 | here). */ | |
4805 | ||
4806 | if (!ffesrc_is_name_init (*p)) | |
4807 | goto bad_i; /* :::::::::::::::::::: */ | |
4808 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
4809 | if (!ffesta_is_inhibited ()) | |
4810 | { | |
4811 | switch (ffesta_first_kw) | |
4812 | { | |
4813 | case FFESTR_firstEXTERNAL: | |
4814 | ffestc_R1207_start (); | |
4815 | break; | |
4816 | ||
4817 | case FFESTR_firstINTRINSIC: | |
4818 | ffestc_R1208_start (); | |
4819 | break; | |
4820 | ||
4821 | #if FFESTR_F90 | |
4822 | case FFESTR_firstOPTIONAL: | |
4823 | ffestc_R520_start (); | |
4824 | break; | |
4825 | #endif | |
4826 | ||
4827 | #if FFESTR_F90 | |
4828 | case FFESTR_firstPUBLIC: | |
4829 | ffestc_R521Astart (); | |
4830 | break; | |
4831 | ||
4832 | case FFESTR_firstPRIVATE: | |
4833 | ffestc_R521Bstart (); | |
4834 | break; | |
4835 | #endif | |
4836 | ||
4837 | default: | |
4838 | assert (FALSE); | |
4839 | } | |
4840 | } | |
4841 | next = (ffelexHandler) ffestb_varlist5_ (nt); | |
4842 | ffelex_token_kill (nt); | |
4843 | return (ffelexHandler) (*next) (t); | |
4844 | ||
4845 | default: | |
4846 | goto bad_0; /* :::::::::::::::::::: */ | |
4847 | } | |
4848 | ||
4849 | bad_0: /* :::::::::::::::::::: */ | |
4850 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, ffesta_tokens[0]); | |
4851 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4852 | ||
4853 | bad_1: /* :::::::::::::::::::: */ | |
4854 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t); | |
4855 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
4856 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
4857 | ||
4858 | bad_i: /* :::::::::::::::::::: */ | |
4859 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, ffesta_tokens[0], i, t); | |
4860 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4861 | } | |
4862 | ||
4863 | /* ffestb_varlist1_ -- "INTENT" OPEN_PAREN | |
4864 | ||
4865 | return ffestb_varlist1_; // to lexer | |
4866 | ||
4867 | Handle NAME. */ | |
4868 | ||
4869 | #if FFESTR_F90 | |
4870 | static ffelexHandler | |
4871 | ffestb_varlist1_ (ffelexToken t) | |
4872 | { | |
4873 | switch (ffelex_token_type (t)) | |
4874 | { | |
4875 | case FFELEX_typeNAME: | |
4876 | ffesta_tokens[1] = ffelex_token_use (t); | |
4877 | ffestb_local_.varlist.kw = ffestr_other (t); | |
4878 | switch (ffestb_local_.varlist.kw) | |
4879 | { | |
4880 | case FFESTR_otherIN: | |
4881 | return (ffelexHandler) ffestb_varlist2_; | |
4882 | ||
4883 | case FFESTR_otherINOUT: | |
4884 | return (ffelexHandler) ffestb_varlist3_; | |
4885 | ||
4886 | case FFESTR_otherOUT: | |
4887 | return (ffelexHandler) ffestb_varlist3_; | |
4888 | ||
4889 | default: | |
4890 | ffelex_token_kill (ffesta_tokens[1]); | |
4891 | break; | |
4892 | } | |
4893 | break; | |
4894 | ||
4895 | default: | |
4896 | break; | |
4897 | } | |
4898 | ||
4899 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t); | |
4900 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4901 | } | |
4902 | ||
4903 | /* ffestb_varlist2_ -- "INTENT" OPEN_PAREN "IN" | |
4904 | ||
4905 | return ffestb_varlist2_; // to lexer | |
4906 | ||
4907 | Handle NAME. */ | |
4908 | ||
4909 | static ffelexHandler | |
4910 | ffestb_varlist2_ (ffelexToken t) | |
4911 | { | |
4912 | switch (ffelex_token_type (t)) | |
4913 | { | |
4914 | case FFELEX_typeNAME: | |
4915 | switch (ffestr_other (t)) | |
4916 | { | |
4917 | case FFESTR_otherOUT: | |
4918 | ffestb_local_.varlist.kw = FFESTR_otherINOUT; | |
4919 | return (ffelexHandler) ffestb_varlist3_; | |
4920 | ||
4921 | default: | |
4922 | break; | |
4923 | } | |
4924 | break; | |
4925 | ||
4926 | case FFELEX_typeCLOSE_PAREN: | |
4927 | return (ffelexHandler) ffestb_varlist4_; | |
4928 | ||
4929 | default: | |
4930 | break; | |
4931 | } | |
4932 | ||
4933 | ffelex_token_kill (ffesta_tokens[1]); | |
4934 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t); | |
4935 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4936 | } | |
4937 | ||
4938 | /* ffestb_varlist3_ -- "INTENT" OPEN_PAREN NAME ["OUT"] | |
4939 | ||
4940 | return ffestb_varlist3_; // to lexer | |
4941 | ||
4942 | Handle CLOSE_PAREN. */ | |
4943 | ||
4944 | static ffelexHandler | |
4945 | ffestb_varlist3_ (ffelexToken t) | |
4946 | { | |
4947 | switch (ffelex_token_type (t)) | |
4948 | { | |
4949 | case FFELEX_typeCLOSE_PAREN: | |
4950 | return (ffelexHandler) ffestb_varlist4_; | |
4951 | ||
4952 | default: | |
4953 | break; | |
4954 | } | |
4955 | ||
4956 | ffelex_token_kill (ffesta_tokens[1]); | |
4957 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t); | |
4958 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4959 | } | |
4960 | ||
4961 | /* ffestb_varlist4_ -- "INTENT" OPEN_PAREN NAME ["OUT"] CLOSE_PAREN | |
4962 | ||
4963 | return ffestb_varlist4_; // to lexer | |
4964 | ||
4965 | Handle COLONCOLON or NAME. */ | |
4966 | ||
4967 | static ffelexHandler | |
4968 | ffestb_varlist4_ (ffelexToken t) | |
4969 | { | |
4970 | switch (ffelex_token_type (t)) | |
4971 | { | |
4972 | case FFELEX_typeCOLONCOLON: | |
4973 | ffesta_confirmed (); | |
4974 | if (!ffesta_is_inhibited ()) | |
4975 | ffestc_R519_start (ffesta_tokens[1], ffestb_local_.varlist.kw); | |
4976 | ffelex_token_kill (ffesta_tokens[1]); | |
4977 | return (ffelexHandler) ffestb_varlist5_; | |
4978 | ||
4979 | case FFELEX_typeNAME: | |
4980 | ffesta_confirmed (); | |
4981 | if (!ffesta_is_inhibited ()) | |
4982 | ffestc_R519_start (ffesta_tokens[1], ffestb_local_.varlist.kw); | |
4983 | ffelex_token_kill (ffesta_tokens[1]); | |
4984 | return (ffelexHandler) ffestb_varlist5_ (t); | |
4985 | ||
4986 | default: | |
4987 | break; | |
4988 | } | |
4989 | ||
4990 | ffelex_token_kill (ffesta_tokens[1]); | |
4991 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t); | |
4992 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
4993 | } | |
4994 | ||
4995 | #endif | |
4996 | /* ffestb_varlist5_ -- Handles the list of variable names | |
4997 | ||
4998 | return ffestb_varlist5_; // to lexer | |
4999 | ||
5000 | Handle NAME. */ | |
5001 | ||
5002 | static ffelexHandler | |
5003 | ffestb_varlist5_ (ffelexToken t) | |
5004 | { | |
5005 | switch (ffelex_token_type (t)) | |
5006 | { | |
5007 | case FFELEX_typeNAME: | |
5008 | ffesta_tokens[1] = ffelex_token_use (t); | |
5009 | return (ffelexHandler) ffestb_varlist6_; | |
5010 | ||
5011 | default: | |
5012 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t); | |
5013 | break; | |
5014 | } | |
5015 | ||
5016 | if (!ffesta_is_inhibited ()) | |
5017 | { | |
5018 | switch (ffesta_first_kw) | |
5019 | { | |
5020 | case FFESTR_firstEXTERNAL: | |
5021 | ffestc_R1207_finish (); | |
5022 | break; | |
5023 | ||
5024 | #if FFESTR_F90 | |
5025 | case FFESTR_firstINTENT: | |
5026 | ffestc_R519_finish (); | |
5027 | break; | |
5028 | #endif | |
5029 | ||
5030 | case FFESTR_firstINTRINSIC: | |
5031 | ffestc_R1208_finish (); | |
5032 | break; | |
5033 | ||
5034 | #if FFESTR_F90 | |
5035 | case FFESTR_firstOPTIONAL: | |
5036 | ffestc_R520_finish (); | |
5037 | break; | |
5038 | #endif | |
5039 | ||
5040 | #if FFESTR_F90 | |
5041 | case FFESTR_firstPUBLIC: | |
5042 | ffestc_R521Afinish (); | |
5043 | break; | |
5044 | ||
5045 | case FFESTR_firstPRIVATE: | |
5046 | ffestc_R521Bfinish (); | |
5047 | break; | |
5048 | #endif | |
5049 | ||
5050 | default: | |
5051 | assert (FALSE); | |
5052 | } | |
5053 | } | |
5054 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5055 | } | |
5056 | ||
5057 | /* ffestb_varlist6_ -- (whatever) NAME | |
5058 | ||
5059 | return ffestb_varlist6_; // to lexer | |
5060 | ||
5061 | Handle COMMA or EOS/SEMICOLON. */ | |
5062 | ||
5063 | static ffelexHandler | |
5064 | ffestb_varlist6_ (ffelexToken t) | |
5065 | { | |
5066 | switch (ffelex_token_type (t)) | |
5067 | { | |
5068 | case FFELEX_typeCOMMA: | |
5069 | if (!ffesta_is_inhibited ()) | |
5070 | { | |
5071 | switch (ffesta_first_kw) | |
5072 | { | |
5073 | case FFESTR_firstEXTERNAL: | |
5074 | ffestc_R1207_item (ffesta_tokens[1]); | |
5075 | break; | |
5076 | ||
5077 | #if FFESTR_F90 | |
5078 | case FFESTR_firstINTENT: | |
5079 | ffestc_R519_item (ffesta_tokens[1]); | |
5080 | break; | |
5081 | #endif | |
5082 | ||
5083 | case FFESTR_firstINTRINSIC: | |
5084 | ffestc_R1208_item (ffesta_tokens[1]); | |
5085 | break; | |
5086 | ||
5087 | #if FFESTR_F90 | |
5088 | case FFESTR_firstOPTIONAL: | |
5089 | ffestc_R520_item (ffesta_tokens[1]); | |
5090 | break; | |
5091 | #endif | |
5092 | ||
5093 | #if FFESTR_F90 | |
5094 | case FFESTR_firstPUBLIC: | |
5095 | ffestc_R521Aitem (ffesta_tokens[1]); | |
5096 | break; | |
5097 | ||
5098 | case FFESTR_firstPRIVATE: | |
5099 | ffestc_R521Bitem (ffesta_tokens[1]); | |
5100 | break; | |
5101 | #endif | |
5102 | ||
5103 | default: | |
5104 | assert (FALSE); | |
5105 | } | |
5106 | } | |
5107 | ffelex_token_kill (ffesta_tokens[1]); | |
5108 | return (ffelexHandler) ffestb_varlist5_; | |
5109 | ||
5110 | case FFELEX_typeEOS: | |
5111 | case FFELEX_typeSEMICOLON: | |
5112 | if (!ffesta_is_inhibited ()) | |
5113 | { | |
5114 | switch (ffesta_first_kw) | |
5115 | { | |
5116 | case FFESTR_firstEXTERNAL: | |
5117 | ffestc_R1207_item (ffesta_tokens[1]); | |
5118 | ffestc_R1207_finish (); | |
5119 | break; | |
5120 | ||
5121 | #if FFESTR_F90 | |
5122 | case FFESTR_firstINTENT: | |
5123 | ffestc_R519_item (ffesta_tokens[1]); | |
5124 | ffestc_R519_finish (); | |
5125 | break; | |
5126 | #endif | |
5127 | ||
5128 | case FFESTR_firstINTRINSIC: | |
5129 | ffestc_R1208_item (ffesta_tokens[1]); | |
5130 | ffestc_R1208_finish (); | |
5131 | break; | |
5132 | ||
5133 | #if FFESTR_F90 | |
5134 | case FFESTR_firstOPTIONAL: | |
5135 | ffestc_R520_item (ffesta_tokens[1]); | |
5136 | ffestc_R520_finish (); | |
5137 | break; | |
5138 | #endif | |
5139 | ||
5140 | #if FFESTR_F90 | |
5141 | case FFESTR_firstPUBLIC: | |
5142 | ffestc_R521Aitem (ffesta_tokens[1]); | |
5143 | ffestc_R521Afinish (); | |
5144 | break; | |
5145 | ||
5146 | case FFESTR_firstPRIVATE: | |
5147 | ffestc_R521Bitem (ffesta_tokens[1]); | |
5148 | ffestc_R521Bfinish (); | |
5149 | break; | |
5150 | #endif | |
5151 | ||
5152 | default: | |
5153 | assert (FALSE); | |
5154 | } | |
5155 | } | |
5156 | ffelex_token_kill (ffesta_tokens[1]); | |
5157 | return (ffelexHandler) ffesta_zero (t); | |
5158 | ||
5159 | default: | |
5160 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.varlist.badname, t); | |
5161 | break; | |
5162 | } | |
5163 | ||
5164 | if (!ffesta_is_inhibited ()) | |
5165 | { | |
5166 | switch (ffesta_first_kw) | |
5167 | { | |
5168 | case FFESTR_firstEXTERNAL: | |
5169 | ffestc_R1207_finish (); | |
5170 | break; | |
5171 | ||
5172 | #if FFESTR_F90 | |
5173 | case FFESTR_firstINTENT: | |
5174 | ffestc_R519_finish (); | |
5175 | break; | |
5176 | #endif | |
5177 | ||
5178 | case FFESTR_firstINTRINSIC: | |
5179 | ffestc_R1208_finish (); | |
5180 | break; | |
5181 | ||
5182 | #if FFESTR_F90 | |
5183 | case FFESTR_firstOPTIONAL: | |
5184 | ffestc_R520_finish (); | |
5185 | break; | |
5186 | #endif | |
5187 | ||
5188 | #if FFESTR_F90 | |
5189 | case FFESTR_firstPUBLIC: | |
5190 | ffestc_R521Afinish (); | |
5191 | break; | |
5192 | ||
5193 | case FFESTR_firstPRIVATE: | |
5194 | ffestc_R521Bfinish (); | |
5195 | break; | |
5196 | #endif | |
5197 | ||
5198 | default: | |
5199 | assert (FALSE); | |
5200 | } | |
5201 | } | |
5202 | ffelex_token_kill (ffesta_tokens[1]); | |
5203 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5204 | } | |
5205 | ||
5206 | /* ffestb_R423B -- Parse the SEQUENCE statement | |
5207 | ||
5208 | return ffestb_R423B; // to lexer | |
5209 | ||
5210 | Make sure the statement has a valid form for the SEQUENCE statement. If | |
5211 | it does, implement the statement. */ | |
5212 | ||
5213 | #if FFESTR_F90 | |
5214 | ffelexHandler | |
5215 | ffestb_R423B (ffelexToken t) | |
5216 | { | |
5217 | char *p; | |
5218 | ffeTokenLength i; | |
5219 | ||
5220 | switch (ffelex_token_type (ffesta_tokens[0])) | |
5221 | { | |
5222 | case FFELEX_typeNAME: | |
5223 | if (ffesta_first_kw != FFESTR_firstSEQUENCE) | |
5224 | goto bad_0; /* :::::::::::::::::::: */ | |
5225 | break; | |
5226 | ||
5227 | case FFELEX_typeNAMES: | |
5228 | if (ffesta_first_kw != FFESTR_firstSEQUENCE) | |
5229 | goto bad_0; /* :::::::::::::::::::: */ | |
5230 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlSEQUENCE) | |
5231 | { | |
5232 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSEQUENCE); | |
5233 | goto bad_i; /* :::::::::::::::::::: */ | |
5234 | } | |
5235 | break; | |
5236 | ||
5237 | default: | |
5238 | goto bad_0; /* :::::::::::::::::::: */ | |
5239 | } | |
5240 | ||
5241 | switch (ffelex_token_type (t)) | |
5242 | { | |
5243 | case FFELEX_typeEOS: | |
5244 | case FFELEX_typeSEMICOLON: | |
5245 | ffesta_confirmed (); | |
5246 | if (!ffesta_is_inhibited ()) | |
5247 | ffestc_R423B (); | |
5248 | return (ffelexHandler) ffesta_zero (t); | |
5249 | ||
5250 | case FFELEX_typeCOMMA: | |
5251 | case FFELEX_typeCOLONCOLON: | |
5252 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
5253 | goto bad_1; /* :::::::::::::::::::: */ | |
5254 | ||
5255 | default: | |
5256 | goto bad_1; /* :::::::::::::::::::: */ | |
5257 | } | |
5258 | ||
5259 | bad_0: /* :::::::::::::::::::: */ | |
5260 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", ffesta_tokens[0]); | |
5261 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
5262 | (ffelexHandler) ffesta_zero); /* Invalid first token. */ | |
5263 | ||
5264 | bad_1: /* :::::::::::::::::::: */ | |
5265 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", t); | |
5266 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
5267 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
5268 | ||
5269 | bad_i: /* :::::::::::::::::::: */ | |
5270 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SEQUENCE", ffesta_tokens[0], i, t); | |
5271 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5272 | } | |
5273 | ||
5274 | #endif | |
5275 | /* ffestb_R522 -- Parse the SAVE statement | |
5276 | ||
5277 | return ffestb_R522; // to lexer | |
5278 | ||
5279 | Make sure the statement has a valid form for the SAVE statement. If it | |
5280 | does, implement the statement. */ | |
5281 | ||
5282 | ffelexHandler | |
5283 | ffestb_R522 (ffelexToken t) | |
5284 | { | |
5285 | ffeTokenLength i; | |
5286 | char *p; | |
5287 | ffelexToken nt; | |
5288 | ffelexHandler next; | |
5289 | ||
5290 | switch (ffelex_token_type (ffesta_tokens[0])) | |
5291 | { | |
5292 | case FFELEX_typeNAME: | |
5293 | if (ffesta_first_kw != FFESTR_firstSAVE) | |
5294 | goto bad_0; /* :::::::::::::::::::: */ | |
5295 | switch (ffelex_token_type (t)) | |
5296 | { | |
5297 | case FFELEX_typeCOMMA: | |
5298 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
5299 | goto bad_1; /* :::::::::::::::::::: */ | |
5300 | ||
5301 | default: | |
5302 | goto bad_1; /* :::::::::::::::::::: */ | |
5303 | ||
5304 | case FFELEX_typeEOS: | |
5305 | case FFELEX_typeSEMICOLON: | |
5306 | ffesta_confirmed (); | |
5307 | if (!ffesta_is_inhibited ()) | |
5308 | ffestc_R522 (); | |
5309 | return (ffelexHandler) ffesta_zero (t); | |
5310 | ||
5311 | case FFELEX_typeNAME: | |
5312 | case FFELEX_typeSLASH: | |
5313 | ffesta_confirmed (); | |
5314 | if (!ffesta_is_inhibited ()) | |
5315 | ffestc_R522start (); | |
5316 | return (ffelexHandler) ffestb_R5221_ (t); | |
5317 | ||
5318 | case FFELEX_typeCOLONCOLON: | |
5319 | ffesta_confirmed (); | |
5320 | if (!ffesta_is_inhibited ()) | |
5321 | ffestc_R522start (); | |
5322 | return (ffelexHandler) ffestb_R5221_; | |
5323 | } | |
5324 | ||
5325 | case FFELEX_typeNAMES: | |
5326 | if (ffesta_first_kw != FFESTR_firstSAVE) | |
5327 | goto bad_0; /* :::::::::::::::::::: */ | |
5328 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSAVE); | |
5329 | switch (ffelex_token_type (t)) | |
5330 | { | |
5331 | default: | |
5332 | goto bad_1; /* :::::::::::::::::::: */ | |
5333 | ||
5334 | case FFELEX_typeCOMMA: | |
5335 | ffesta_confirmed (); | |
5336 | break; | |
5337 | ||
5338 | case FFELEX_typeEOS: | |
5339 | case FFELEX_typeSEMICOLON: | |
5340 | ffesta_confirmed (); | |
5341 | if (*p != '\0') | |
5342 | break; | |
5343 | if (!ffesta_is_inhibited ()) | |
5344 | ffestc_R522 (); | |
5345 | return (ffelexHandler) ffesta_zero (t); | |
5346 | ||
5347 | case FFELEX_typeSLASH: | |
5348 | ffesta_confirmed (); | |
5349 | if (*p != '\0') | |
5350 | goto bad_i; /* :::::::::::::::::::: */ | |
5351 | if (!ffesta_is_inhibited ()) | |
5352 | ffestc_R522start (); | |
5353 | return (ffelexHandler) ffestb_R5221_ (t); | |
5354 | ||
5355 | case FFELEX_typeCOLONCOLON: | |
5356 | ffesta_confirmed (); | |
5357 | if (*p != '\0') | |
5358 | goto bad_i; /* :::::::::::::::::::: */ | |
5359 | if (!ffesta_is_inhibited ()) | |
5360 | ffestc_R522start (); | |
5361 | return (ffelexHandler) ffestb_R5221_; | |
5362 | } | |
5363 | ||
5364 | /* Here, we have at least one char after "SAVE" and t is COMMA or | |
5365 | EOS/SEMICOLON. */ | |
5366 | ||
5367 | if (!ffesrc_is_name_init (*p)) | |
5368 | goto bad_i; /* :::::::::::::::::::: */ | |
5369 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
5370 | if (!ffesta_is_inhibited ()) | |
5371 | ffestc_R522start (); | |
5372 | next = (ffelexHandler) ffestb_R5221_ (nt); | |
5373 | ffelex_token_kill (nt); | |
5374 | return (ffelexHandler) (*next) (t); | |
5375 | ||
5376 | default: | |
5377 | goto bad_0; /* :::::::::::::::::::: */ | |
5378 | } | |
5379 | ||
5380 | bad_0: /* :::::::::::::::::::: */ | |
5381 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", ffesta_tokens[0]); | |
5382 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5383 | ||
5384 | bad_1: /* :::::::::::::::::::: */ | |
5385 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t); | |
5386 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
5387 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
5388 | ||
5389 | bad_i: /* :::::::::::::::::::: */ | |
5390 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SAVE", ffesta_tokens[0], i, t); | |
5391 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5392 | } | |
5393 | ||
5394 | /* ffestb_R5221_ -- "SAVE" [COLONCOLON] | |
5395 | ||
5396 | return ffestb_R5221_; // to lexer | |
5397 | ||
5398 | Handle NAME or SLASH. */ | |
5399 | ||
5400 | static ffelexHandler | |
5401 | ffestb_R5221_ (ffelexToken t) | |
5402 | { | |
5403 | switch (ffelex_token_type (t)) | |
5404 | { | |
5405 | case FFELEX_typeNAME: | |
5406 | ffestb_local_.R522.is_cblock = FALSE; | |
5407 | ffesta_tokens[1] = ffelex_token_use (t); | |
5408 | return (ffelexHandler) ffestb_R5224_; | |
5409 | ||
5410 | case FFELEX_typeSLASH: | |
5411 | ffestb_local_.R522.is_cblock = TRUE; | |
5412 | return (ffelexHandler) ffestb_R5222_; | |
5413 | ||
5414 | default: | |
5415 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t); | |
5416 | break; | |
5417 | } | |
5418 | ||
5419 | if (!ffesta_is_inhibited ()) | |
5420 | ffestc_R522finish (); | |
5421 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5422 | } | |
5423 | ||
5424 | /* ffestb_R5222_ -- "SAVE" [COLONCOLON] SLASH | |
5425 | ||
5426 | return ffestb_R5222_; // to lexer | |
5427 | ||
5428 | Handle NAME. */ | |
5429 | ||
5430 | static ffelexHandler | |
5431 | ffestb_R5222_ (ffelexToken t) | |
5432 | { | |
5433 | switch (ffelex_token_type (t)) | |
5434 | { | |
5435 | case FFELEX_typeNAME: | |
5436 | ffesta_tokens[1] = ffelex_token_use (t); | |
5437 | return (ffelexHandler) ffestb_R5223_; | |
5438 | ||
5439 | default: | |
5440 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t); | |
5441 | break; | |
5442 | } | |
5443 | ||
5444 | if (!ffesta_is_inhibited ()) | |
5445 | ffestc_R522finish (); | |
5446 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5447 | } | |
5448 | ||
5449 | /* ffestb_R5223_ -- "SAVE" [COLONCOLON] SLASH NAME | |
5450 | ||
5451 | return ffestb_R5223_; // to lexer | |
5452 | ||
5453 | Handle SLASH. */ | |
5454 | ||
5455 | static ffelexHandler | |
5456 | ffestb_R5223_ (ffelexToken t) | |
5457 | { | |
5458 | switch (ffelex_token_type (t)) | |
5459 | { | |
5460 | case FFELEX_typeSLASH: | |
5461 | return (ffelexHandler) ffestb_R5224_; | |
5462 | ||
5463 | default: | |
5464 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t); | |
5465 | break; | |
5466 | } | |
5467 | ||
5468 | if (!ffesta_is_inhibited ()) | |
5469 | ffestc_R522finish (); | |
5470 | ffelex_token_kill (ffesta_tokens[1]); | |
5471 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5472 | } | |
5473 | ||
5474 | /* ffestb_R5224_ -- "SAVE" [COLONCOLON] R523 | |
5475 | ||
5476 | return ffestb_R5224_; // to lexer | |
5477 | ||
5478 | Handle COMMA or EOS/SEMICOLON. */ | |
5479 | ||
5480 | static ffelexHandler | |
5481 | ffestb_R5224_ (ffelexToken t) | |
5482 | { | |
5483 | switch (ffelex_token_type (t)) | |
5484 | { | |
5485 | case FFELEX_typeCOMMA: | |
5486 | if (!ffesta_is_inhibited ()) | |
5487 | { | |
5488 | if (ffestb_local_.R522.is_cblock) | |
5489 | ffestc_R522item_cblock (ffesta_tokens[1]); | |
5490 | else | |
5491 | ffestc_R522item_object (ffesta_tokens[1]); | |
5492 | } | |
5493 | ffelex_token_kill (ffesta_tokens[1]); | |
5494 | return (ffelexHandler) ffestb_R5221_; | |
5495 | ||
5496 | case FFELEX_typeEOS: | |
5497 | case FFELEX_typeSEMICOLON: | |
5498 | if (!ffesta_is_inhibited ()) | |
5499 | { | |
5500 | if (ffestb_local_.R522.is_cblock) | |
5501 | ffestc_R522item_cblock (ffesta_tokens[1]); | |
5502 | else | |
5503 | ffestc_R522item_object (ffesta_tokens[1]); | |
5504 | ffestc_R522finish (); | |
5505 | } | |
5506 | ffelex_token_kill (ffesta_tokens[1]); | |
5507 | return (ffelexHandler) ffesta_zero (t); | |
5508 | ||
5509 | default: | |
5510 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SAVE", t); | |
5511 | break; | |
5512 | } | |
5513 | ||
5514 | if (!ffesta_is_inhibited ()) | |
5515 | ffestc_R522finish (); | |
5516 | ffelex_token_kill (ffesta_tokens[1]); | |
5517 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5518 | } | |
5519 | ||
5520 | /* ffestb_R528 -- Parse the DATA statement | |
5521 | ||
5522 | return ffestb_R528; // to lexer | |
5523 | ||
5524 | Make sure the statement has a valid form for the DATA statement. If it | |
5525 | does, implement the statement. */ | |
5526 | ||
5527 | ffelexHandler | |
5528 | ffestb_R528 (ffelexToken t) | |
5529 | { | |
5530 | char *p; | |
5531 | ffeTokenLength i; | |
5532 | ffelexToken nt; | |
5533 | ffelexHandler next; | |
5534 | ||
5535 | switch (ffelex_token_type (ffesta_tokens[0])) | |
5536 | { | |
5537 | case FFELEX_typeNAME: | |
5538 | if (ffesta_first_kw != FFESTR_firstDATA) | |
5539 | goto bad_0; /* :::::::::::::::::::: */ | |
5540 | switch (ffelex_token_type (t)) | |
5541 | { | |
5542 | case FFELEX_typeCOMMA: | |
5543 | case FFELEX_typeEOS: | |
5544 | case FFELEX_typeSEMICOLON: | |
5545 | case FFELEX_typeSLASH: | |
5546 | case FFELEX_typeCOLONCOLON: | |
5547 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
5548 | goto bad_1; /* :::::::::::::::::::: */ | |
5549 | ||
5550 | default: | |
5551 | goto bad_1; /* :::::::::::::::::::: */ | |
5552 | ||
5553 | case FFELEX_typeNAME: | |
5554 | ffesta_confirmed (); | |
5555 | break; | |
5556 | ||
5557 | case FFELEX_typeOPEN_PAREN: | |
5558 | break; | |
5559 | } | |
5560 | ffestb_local_.data.started = FALSE; | |
5561 | return (ffelexHandler) (*((ffelexHandler) | |
5562 | ffeexpr_lhs (ffesta_output_pool, | |
5563 | FFEEXPR_contextDATA, | |
5564 | (ffeexprCallback) ffestb_R5281_))) | |
5565 | (t); | |
5566 | ||
5567 | case FFELEX_typeNAMES: | |
5568 | if (ffesta_first_kw != FFESTR_firstDATA) | |
5569 | goto bad_0; /* :::::::::::::::::::: */ | |
5570 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDATA); | |
5571 | switch (ffelex_token_type (t)) | |
5572 | { | |
5573 | case FFELEX_typeEOS: | |
5574 | case FFELEX_typeSEMICOLON: | |
5575 | case FFELEX_typeCOLONCOLON: | |
5576 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
5577 | goto bad_1; /* :::::::::::::::::::: */ | |
5578 | ||
5579 | default: | |
5580 | goto bad_1; /* :::::::::::::::::::: */ | |
5581 | ||
5582 | case FFELEX_typeOPEN_PAREN: | |
5583 | if (*p == '\0') | |
5584 | { | |
5585 | ffestb_local_.data.started = FALSE; | |
5586 | return (ffelexHandler) (*((ffelexHandler) | |
5587 | ffeexpr_lhs (ffesta_output_pool, | |
5588 | FFEEXPR_contextDATA, | |
5589 | (ffeexprCallback) | |
5590 | ffestb_R5281_))) | |
5591 | (t); | |
5592 | } | |
5593 | break; | |
5594 | ||
5595 | case FFELEX_typeCOMMA: | |
5596 | case FFELEX_typeSLASH: | |
5597 | ffesta_confirmed (); | |
5598 | break; | |
5599 | } | |
5600 | if (!ffesrc_is_name_init (*p)) | |
5601 | goto bad_i; /* :::::::::::::::::::: */ | |
5602 | ffestb_local_.data.started = FALSE; | |
5603 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
5604 | next = (ffelexHandler) (*((ffelexHandler) | |
5605 | ffeexpr_lhs (ffesta_output_pool, | |
5606 | FFEEXPR_contextDATA, | |
5607 | (ffeexprCallback) ffestb_R5281_))) | |
5608 | (nt); | |
5609 | ffelex_token_kill (nt); | |
5610 | return (ffelexHandler) (*next) (t); | |
5611 | ||
5612 | default: | |
5613 | goto bad_0; /* :::::::::::::::::::: */ | |
5614 | } | |
5615 | ||
5616 | bad_0: /* :::::::::::::::::::: */ | |
5617 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", ffesta_tokens[0]); | |
5618 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5619 | ||
5620 | bad_1: /* :::::::::::::::::::: */ | |
5621 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t); | |
5622 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
5623 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
5624 | ||
5625 | bad_i: /* :::::::::::::::::::: */ | |
5626 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DATA", ffesta_tokens[0], i, t); | |
5627 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5628 | } | |
5629 | ||
5630 | /* ffestb_R5281_ -- "DATA" expr-list | |
5631 | ||
5632 | (ffestb_R5281_) // to expression handler | |
5633 | ||
5634 | Handle COMMA or SLASH. */ | |
5635 | ||
5636 | static ffelexHandler | |
5637 | ffestb_R5281_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
5638 | { | |
5639 | switch (ffelex_token_type (t)) | |
5640 | { | |
5641 | case FFELEX_typeCOMMA: | |
5642 | ffesta_confirmed (); | |
5643 | if (expr == NULL) | |
5644 | break; | |
5645 | if (!ffesta_is_inhibited ()) | |
5646 | { | |
5647 | if (!ffestb_local_.data.started) | |
5648 | { | |
5649 | ffestc_R528_start (); | |
5650 | ffestb_local_.data.started = TRUE; | |
5651 | } | |
5652 | ffestc_R528_item_object (expr, ft); | |
5653 | } | |
5654 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
5655 | FFEEXPR_contextDATA, | |
5656 | (ffeexprCallback) ffestb_R5281_); | |
5657 | ||
5658 | case FFELEX_typeSLASH: | |
5659 | ffesta_confirmed (); | |
5660 | if (expr == NULL) | |
5661 | break; | |
5662 | if (!ffesta_is_inhibited ()) | |
5663 | { | |
5664 | if (!ffestb_local_.data.started) | |
5665 | { | |
5666 | ffestc_R528_start (); | |
5667 | ffestb_local_.data.started = TRUE; | |
5668 | } | |
5669 | ffestc_R528_item_object (expr, ft); | |
5670 | ffestc_R528_item_startvals (); | |
5671 | } | |
5672 | return (ffelexHandler) ffeexpr_rhs | |
5673 | (ffesta_output_pool, FFEEXPR_contextDATA, | |
5674 | (ffeexprCallback) ffestb_R5282_); | |
5675 | ||
5676 | default: | |
5677 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t); | |
5678 | break; | |
5679 | } | |
5680 | ||
5681 | if (ffestb_local_.data.started && !ffesta_is_inhibited ()) | |
5682 | ffestc_R528_finish (); | |
5683 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5684 | } | |
5685 | ||
5686 | /* ffestb_R5282_ -- "DATA" expr-list SLASH expr-list | |
5687 | ||
5688 | (ffestb_R5282_) // to expression handler | |
5689 | ||
5690 | Handle ASTERISK, COMMA, or SLASH. */ | |
5691 | ||
5692 | static ffelexHandler | |
5693 | ffestb_R5282_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
5694 | { | |
5695 | switch (ffelex_token_type (t)) | |
5696 | { | |
5697 | case FFELEX_typeCOMMA: | |
5698 | if (expr == NULL) | |
5699 | break; | |
5700 | if (!ffesta_is_inhibited ()) | |
5701 | ffestc_R528_item_value (NULL, NULL, expr, ft); | |
5702 | return (ffelexHandler) ffeexpr_rhs | |
5703 | (ffesta_output_pool, FFEEXPR_contextDATA, | |
5704 | (ffeexprCallback) ffestb_R5282_); | |
5705 | ||
5706 | case FFELEX_typeASTERISK: | |
5707 | if (expr == NULL) | |
5708 | break; | |
5709 | ffestb_local_.data.expr = expr; | |
5710 | ffesta_tokens[1] = ffelex_token_use (ft); | |
5711 | return (ffelexHandler) ffeexpr_rhs | |
5712 | (ffesta_output_pool, FFEEXPR_contextDATA, | |
5713 | (ffeexprCallback) ffestb_R5283_); | |
5714 | ||
5715 | case FFELEX_typeSLASH: | |
5716 | if (expr == NULL) | |
5717 | break; | |
5718 | if (!ffesta_is_inhibited ()) | |
5719 | { | |
5720 | ffestc_R528_item_value (NULL, NULL, expr, ft); | |
5721 | ffestc_R528_item_endvals (t); | |
5722 | } | |
5723 | return (ffelexHandler) ffestb_R5284_; | |
5724 | ||
5725 | default: | |
5726 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t); | |
5727 | break; | |
5728 | } | |
5729 | ||
5730 | if (!ffesta_is_inhibited ()) | |
5731 | { | |
5732 | ffestc_R528_item_endvals (t); | |
5733 | ffestc_R528_finish (); | |
5734 | } | |
5735 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5736 | } | |
5737 | ||
5738 | /* ffestb_R5283_ -- "DATA" expr-list SLASH expr ASTERISK expr | |
5739 | ||
5740 | (ffestb_R5283_) // to expression handler | |
5741 | ||
5742 | Handle COMMA or SLASH. */ | |
5743 | ||
5744 | static ffelexHandler | |
5745 | ffestb_R5283_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
5746 | { | |
5747 | switch (ffelex_token_type (t)) | |
5748 | { | |
5749 | case FFELEX_typeCOMMA: | |
5750 | if (expr == NULL) | |
5751 | break; | |
5752 | if (!ffesta_is_inhibited ()) | |
5753 | ffestc_R528_item_value (ffestb_local_.data.expr, ffesta_tokens[1], | |
5754 | expr, ft); | |
5755 | ffelex_token_kill (ffesta_tokens[1]); | |
5756 | return (ffelexHandler) ffeexpr_rhs | |
5757 | (ffesta_output_pool, FFEEXPR_contextDATA, | |
5758 | (ffeexprCallback) ffestb_R5282_); | |
5759 | ||
5760 | case FFELEX_typeSLASH: | |
5761 | if (expr == NULL) | |
5762 | break; | |
5763 | if (!ffesta_is_inhibited ()) | |
5764 | { | |
5765 | ffestc_R528_item_value (ffestb_local_.data.expr, ffesta_tokens[1], | |
5766 | expr, ft); | |
5767 | ffestc_R528_item_endvals (t); | |
5768 | } | |
5769 | ffelex_token_kill (ffesta_tokens[1]); | |
5770 | return (ffelexHandler) ffestb_R5284_; | |
5771 | ||
5772 | default: | |
5773 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t); | |
5774 | break; | |
5775 | } | |
5776 | ||
5777 | if (!ffesta_is_inhibited ()) | |
5778 | { | |
5779 | ffestc_R528_item_endvals (t); | |
5780 | ffestc_R528_finish (); | |
5781 | } | |
5782 | ffelex_token_kill (ffesta_tokens[1]); | |
5783 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5784 | } | |
5785 | ||
5786 | /* ffestb_R5284_ -- "DATA" expr-list SLASH expr-list SLASH | |
5787 | ||
5788 | return ffestb_R5284_; // to lexer | |
5789 | ||
5790 | Handle [COMMA] NAME or EOS/SEMICOLON. */ | |
5791 | ||
5792 | static ffelexHandler | |
5793 | ffestb_R5284_ (ffelexToken t) | |
5794 | { | |
5795 | switch (ffelex_token_type (t)) | |
5796 | { | |
5797 | case FFELEX_typeCOMMA: | |
5798 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
5799 | FFEEXPR_contextDATA, | |
5800 | (ffeexprCallback) ffestb_R5281_); | |
5801 | ||
5802 | case FFELEX_typeNAME: | |
795232f7 | 5803 | case FFELEX_typeOPEN_PAREN: |
5ff904cd JL |
5804 | return (ffelexHandler) (*((ffelexHandler) |
5805 | ffeexpr_lhs (ffesta_output_pool, | |
5806 | FFEEXPR_contextDATA, | |
5807 | (ffeexprCallback) ffestb_R5281_))) | |
5808 | (t); | |
5809 | ||
5810 | case FFELEX_typeEOS: | |
5811 | case FFELEX_typeSEMICOLON: | |
5812 | if (!ffesta_is_inhibited ()) | |
5813 | ffestc_R528_finish (); | |
5814 | return (ffelexHandler) ffesta_zero (t); | |
5815 | ||
5816 | default: | |
5817 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DATA", t); | |
5818 | break; | |
5819 | } | |
5820 | ||
5821 | if (!ffesta_is_inhibited ()) | |
5822 | ffestc_R528_finish (); | |
5823 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5824 | } | |
5825 | ||
5826 | /* ffestb_R537 -- Parse a PARAMETER statement | |
5827 | ||
5828 | return ffestb_R537; // to lexer | |
5829 | ||
5830 | Make sure the statement has a valid form for an PARAMETER statement. | |
5831 | If it does, implement the statement. */ | |
5832 | ||
5833 | ffelexHandler | |
5834 | ffestb_R537 (ffelexToken t) | |
5835 | { | |
5836 | switch (ffelex_token_type (ffesta_tokens[0])) | |
5837 | { | |
5838 | case FFELEX_typeNAME: | |
5839 | if (ffesta_first_kw != FFESTR_firstPARAMETER) | |
5840 | goto bad_0; /* :::::::::::::::::::: */ | |
5841 | break; | |
5842 | ||
5843 | case FFELEX_typeNAMES: | |
5844 | if (ffesta_first_kw != FFESTR_firstPARAMETER) | |
5845 | goto bad_0; /* :::::::::::::::::::: */ | |
5846 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlPARAMETER) | |
5847 | goto bad_0; /* :::::::::::::::::::: */ | |
5848 | break; | |
5849 | ||
5850 | default: | |
5851 | goto bad_0; /* :::::::::::::::::::: */ | |
5852 | } | |
5853 | ||
5854 | switch (ffelex_token_type (t)) | |
5855 | { | |
5856 | case FFELEX_typeOPEN_PAREN: | |
5857 | break; | |
5858 | ||
5859 | case FFELEX_typeEOS: | |
5860 | case FFELEX_typeSEMICOLON: | |
5861 | case FFELEX_typeCOMMA: | |
5862 | case FFELEX_typeCOLONCOLON: | |
5863 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
5864 | goto bad_1; /* :::::::::::::::::::: */ | |
5865 | ||
5866 | default: | |
5867 | goto bad_1; /* :::::::::::::::::::: */ | |
5868 | } | |
5869 | ||
5870 | ffestb_local_.parameter.started = FALSE; | |
5871 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
5872 | FFEEXPR_contextPARAMETER, | |
5873 | (ffeexprCallback) ffestb_R5371_); | |
5874 | ||
5875 | bad_0: /* :::::::::::::::::::: */ | |
5876 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0]); | |
5877 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5878 | ||
5879 | bad_1: /* :::::::::::::::::::: */ | |
5880 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t); | |
5881 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
5882 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
5883 | } | |
5884 | ||
5885 | /* ffestb_R5371_ -- "PARAMETER" OPEN_PAREN expr | |
5886 | ||
5887 | (ffestb_R5371_) // to expression handler | |
5888 | ||
5889 | Make sure the next token is EQUALS. */ | |
5890 | ||
5891 | static ffelexHandler | |
5892 | ffestb_R5371_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
5893 | { | |
5894 | ffestb_local_.parameter.expr = expr; | |
5895 | ||
5896 | switch (ffelex_token_type (t)) | |
5897 | { | |
5898 | case FFELEX_typeEQUALS: | |
5899 | ffesta_confirmed (); | |
5900 | if (expr == NULL) | |
5901 | break; | |
5902 | ffesta_tokens[1] = ffelex_token_use (ft); | |
5903 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
5904 | FFEEXPR_contextPARAMETER, (ffeexprCallback) ffestb_R5372_); | |
5905 | ||
5906 | default: | |
5907 | break; | |
5908 | } | |
5909 | ||
5910 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t); | |
5911 | if (ffestb_local_.parameter.started) | |
5912 | ffestc_R537_finish (); | |
5913 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5914 | } | |
5915 | ||
5916 | /* ffestb_R5372_ -- "PARAMETER" OPEN_PAREN expr EQUALS expr | |
5917 | ||
5918 | (ffestb_R5372_) // to expression handler | |
5919 | ||
5920 | Make sure the next token is COMMA or CLOSE_PAREN. */ | |
5921 | ||
5922 | static ffelexHandler | |
5923 | ffestb_R5372_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
5924 | { | |
5925 | switch (ffelex_token_type (t)) | |
5926 | { | |
5927 | case FFELEX_typeCOMMA: | |
5928 | if (expr == NULL) | |
5929 | break; | |
5930 | if (!ffesta_is_inhibited ()) | |
5931 | { | |
5932 | if (!ffestb_local_.parameter.started) | |
5933 | { | |
5934 | ffestc_R537_start (); | |
5935 | ffestb_local_.parameter.started = TRUE; | |
5936 | } | |
5937 | ffestc_R537_item (ffestb_local_.parameter.expr, ffesta_tokens[1], | |
5938 | expr, ft); | |
5939 | } | |
5940 | ffelex_token_kill (ffesta_tokens[1]); | |
5941 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
5942 | FFEEXPR_contextPARAMETER, | |
5943 | (ffeexprCallback) ffestb_R5371_); | |
5944 | ||
5945 | case FFELEX_typeCLOSE_PAREN: | |
5946 | if (expr == NULL) | |
5947 | break; | |
5948 | if (!ffesta_is_inhibited ()) | |
5949 | { | |
5950 | if (!ffestb_local_.parameter.started) | |
5951 | { | |
5952 | ffestc_R537_start (); | |
5953 | ffestb_local_.parameter.started = TRUE; | |
5954 | } | |
5955 | ffestc_R537_item (ffestb_local_.parameter.expr, ffesta_tokens[1], | |
5956 | expr, ft); | |
5957 | ffestc_R537_finish (); | |
5958 | } | |
5959 | ffelex_token_kill (ffesta_tokens[1]); | |
5960 | return (ffelexHandler) ffestb_R5373_; | |
5961 | ||
5962 | default: | |
5963 | break; | |
5964 | } | |
5965 | ||
5966 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t); | |
5967 | if (ffestb_local_.parameter.started) | |
5968 | ffestc_R537_finish (); | |
5969 | ffelex_token_kill (ffesta_tokens[1]); | |
5970 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5971 | } | |
5972 | ||
5973 | /* ffestb_R5373_ -- "PARAMETER" OPEN_PAREN expr EQUALS expr CLOSE_PAREN | |
5974 | ||
5975 | return ffestb_R5373_; // to lexer | |
5976 | ||
5977 | Make sure the next token is EOS or SEMICOLON, or generate an error. All | |
5978 | cleanup has already been done, by the way. */ | |
5979 | ||
5980 | static ffelexHandler | |
5981 | ffestb_R5373_ (ffelexToken t) | |
5982 | { | |
5983 | switch (ffelex_token_type (t)) | |
5984 | { | |
5985 | case FFELEX_typeEOS: | |
5986 | case FFELEX_typeSEMICOLON: | |
5987 | return (ffelexHandler) ffesta_zero (t); | |
5988 | ||
5989 | default: | |
5990 | break; | |
5991 | } | |
5992 | ||
5993 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t); | |
5994 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
5995 | } | |
5996 | ||
5997 | /* ffestb_R542 -- Parse the NAMELIST statement | |
5998 | ||
5999 | return ffestb_R542; // to lexer | |
6000 | ||
6001 | Make sure the statement has a valid form for the NAMELIST statement. If it | |
6002 | does, implement the statement. */ | |
6003 | ||
6004 | ffelexHandler | |
6005 | ffestb_R542 (ffelexToken t) | |
6006 | { | |
6007 | char *p; | |
6008 | ffeTokenLength i; | |
6009 | ||
6010 | switch (ffelex_token_type (ffesta_tokens[0])) | |
6011 | { | |
6012 | case FFELEX_typeNAME: | |
6013 | if (ffesta_first_kw != FFESTR_firstNAMELIST) | |
6014 | goto bad_0; /* :::::::::::::::::::: */ | |
6015 | break; | |
6016 | ||
6017 | case FFELEX_typeNAMES: | |
6018 | if (ffesta_first_kw != FFESTR_firstNAMELIST) | |
6019 | goto bad_0; /* :::::::::::::::::::: */ | |
6020 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlNAMELIST); | |
6021 | if (*p != '\0') | |
6022 | goto bad_i; /* :::::::::::::::::::: */ | |
6023 | break; | |
6024 | ||
6025 | default: | |
6026 | goto bad_0; /* :::::::::::::::::::: */ | |
6027 | } | |
6028 | ||
6029 | switch (ffelex_token_type (t)) | |
6030 | { | |
6031 | case FFELEX_typeCOMMA: | |
6032 | case FFELEX_typeEOS: | |
6033 | case FFELEX_typeSEMICOLON: | |
6034 | case FFELEX_typeCOLONCOLON: | |
6035 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
6036 | goto bad_1; /* :::::::::::::::::::: */ | |
6037 | ||
6038 | default: | |
6039 | goto bad_1; /* :::::::::::::::::::: */ | |
6040 | ||
6041 | case FFELEX_typeSLASH: | |
6042 | break; | |
6043 | } | |
6044 | ||
6045 | ffesta_confirmed (); | |
6046 | if (!ffesta_is_inhibited ()) | |
6047 | ffestc_R542_start (); | |
6048 | return (ffelexHandler) ffestb_R5421_; | |
6049 | ||
6050 | bad_0: /* :::::::::::::::::::: */ | |
6051 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", ffesta_tokens[0]); | |
6052 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6053 | ||
6054 | bad_1: /* :::::::::::::::::::: */ | |
6055 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t); | |
6056 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
6057 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
6058 | ||
6059 | bad_i: /* :::::::::::::::::::: */ | |
6060 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "NAMELIST", ffesta_tokens[0], i, t); | |
6061 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6062 | } | |
6063 | ||
6064 | /* ffestb_R5421_ -- "NAMELIST" SLASH | |
6065 | ||
6066 | return ffestb_R5421_; // to lexer | |
6067 | ||
6068 | Handle NAME. */ | |
6069 | ||
6070 | static ffelexHandler | |
6071 | ffestb_R5421_ (ffelexToken t) | |
6072 | { | |
6073 | switch (ffelex_token_type (t)) | |
6074 | { | |
6075 | case FFELEX_typeNAME: | |
6076 | if (!ffesta_is_inhibited ()) | |
6077 | ffestc_R542_item_nlist (t); | |
6078 | return (ffelexHandler) ffestb_R5422_; | |
6079 | ||
6080 | default: | |
6081 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t); | |
6082 | break; | |
6083 | } | |
6084 | ||
6085 | if (!ffesta_is_inhibited ()) | |
6086 | ffestc_R542_finish (); | |
6087 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6088 | } | |
6089 | ||
6090 | /* ffestb_R5422_ -- "NAMELIST" SLASH NAME | |
6091 | ||
6092 | return ffestb_R5422_; // to lexer | |
6093 | ||
6094 | Handle SLASH. */ | |
6095 | ||
6096 | static ffelexHandler | |
6097 | ffestb_R5422_ (ffelexToken t) | |
6098 | { | |
6099 | switch (ffelex_token_type (t)) | |
6100 | { | |
6101 | case FFELEX_typeSLASH: | |
6102 | return (ffelexHandler) ffestb_R5423_; | |
6103 | ||
6104 | default: | |
6105 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t); | |
6106 | break; | |
6107 | } | |
6108 | ||
6109 | if (!ffesta_is_inhibited ()) | |
6110 | ffestc_R542_finish (); | |
6111 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6112 | } | |
6113 | ||
6114 | /* ffestb_R5423_ -- "NAMELIST" SLASH NAME SLASH | |
6115 | ||
6116 | return ffestb_R5423_; // to lexer | |
6117 | ||
6118 | Handle NAME. */ | |
6119 | ||
6120 | static ffelexHandler | |
6121 | ffestb_R5423_ (ffelexToken t) | |
6122 | { | |
6123 | switch (ffelex_token_type (t)) | |
6124 | { | |
6125 | case FFELEX_typeNAME: | |
6126 | if (!ffesta_is_inhibited ()) | |
6127 | ffestc_R542_item_nitem (t); | |
6128 | return (ffelexHandler) ffestb_R5424_; | |
6129 | ||
6130 | default: | |
6131 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t); | |
6132 | break; | |
6133 | } | |
6134 | ||
6135 | if (!ffesta_is_inhibited ()) | |
6136 | ffestc_R542_finish (); | |
6137 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6138 | } | |
6139 | ||
6140 | /* ffestb_R5424_ -- "NAMELIST" SLASH NAME SLASH NAME | |
6141 | ||
6142 | return ffestb_R5424_; // to lexer | |
6143 | ||
6144 | Handle COMMA, EOS/SEMICOLON, or SLASH. */ | |
6145 | ||
6146 | static ffelexHandler | |
6147 | ffestb_R5424_ (ffelexToken t) | |
6148 | { | |
6149 | switch (ffelex_token_type (t)) | |
6150 | { | |
6151 | case FFELEX_typeCOMMA: | |
6152 | return (ffelexHandler) ffestb_R5425_; | |
6153 | ||
6154 | case FFELEX_typeEOS: | |
6155 | case FFELEX_typeSEMICOLON: | |
6156 | if (!ffesta_is_inhibited ()) | |
6157 | ffestc_R542_finish (); | |
6158 | return (ffelexHandler) ffesta_zero (t); | |
6159 | ||
6160 | case FFELEX_typeSLASH: | |
6161 | return (ffelexHandler) ffestb_R5421_; | |
6162 | ||
6163 | default: | |
6164 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t); | |
6165 | break; | |
6166 | } | |
6167 | ||
6168 | if (!ffesta_is_inhibited ()) | |
6169 | ffestc_R542_finish (); | |
6170 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6171 | } | |
6172 | ||
6173 | /* ffestb_R5425_ -- "NAMELIST" SLASH NAME SLASH NAME COMMA | |
6174 | ||
6175 | return ffestb_R5425_; // to lexer | |
6176 | ||
6177 | Handle NAME or SLASH. */ | |
6178 | ||
6179 | static ffelexHandler | |
6180 | ffestb_R5425_ (ffelexToken t) | |
6181 | { | |
6182 | switch (ffelex_token_type (t)) | |
6183 | { | |
6184 | case FFELEX_typeNAME: | |
6185 | if (!ffesta_is_inhibited ()) | |
6186 | ffestc_R542_item_nitem (t); | |
6187 | return (ffelexHandler) ffestb_R5424_; | |
6188 | ||
6189 | case FFELEX_typeSLASH: | |
6190 | return (ffelexHandler) ffestb_R5421_; | |
6191 | ||
6192 | default: | |
6193 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NAMELIST", t); | |
6194 | break; | |
6195 | } | |
6196 | ||
6197 | if (!ffesta_is_inhibited ()) | |
6198 | ffestc_R542_finish (); | |
6199 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6200 | } | |
6201 | ||
6202 | /* ffestb_R544 -- Parse an EQUIVALENCE statement | |
6203 | ||
6204 | return ffestb_R544; // to lexer | |
6205 | ||
6206 | Make sure the statement has a valid form for an EQUIVALENCE statement. | |
6207 | If it does, implement the statement. */ | |
6208 | ||
6209 | ffelexHandler | |
6210 | ffestb_R544 (ffelexToken t) | |
6211 | { | |
6212 | switch (ffelex_token_type (ffesta_tokens[0])) | |
6213 | { | |
6214 | case FFELEX_typeNAME: | |
6215 | if (ffesta_first_kw != FFESTR_firstEQUIVALENCE) | |
6216 | goto bad_0; /* :::::::::::::::::::: */ | |
6217 | break; | |
6218 | ||
6219 | case FFELEX_typeNAMES: | |
6220 | if (ffesta_first_kw != FFESTR_firstEQUIVALENCE) | |
6221 | goto bad_0; /* :::::::::::::::::::: */ | |
6222 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlEQUIVALENCE) | |
6223 | goto bad_0; /* :::::::::::::::::::: */ | |
6224 | break; | |
6225 | ||
6226 | default: | |
6227 | goto bad_0; /* :::::::::::::::::::: */ | |
6228 | } | |
6229 | ||
6230 | switch (ffelex_token_type (t)) | |
6231 | { | |
6232 | case FFELEX_typeOPEN_PAREN: | |
6233 | break; | |
6234 | ||
6235 | case FFELEX_typeEOS: | |
6236 | case FFELEX_typeSEMICOLON: | |
6237 | case FFELEX_typeCOMMA: | |
6238 | case FFELEX_typeCOLONCOLON: | |
6239 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
6240 | goto bad_1; /* :::::::::::::::::::: */ | |
6241 | ||
6242 | default: | |
6243 | goto bad_1; /* :::::::::::::::::::: */ | |
6244 | } | |
6245 | ||
6246 | ffestb_local_.equivalence.started = FALSE; | |
6247 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
6248 | FFEEXPR_contextEQUIVALENCE, | |
6249 | (ffeexprCallback) ffestb_R5441_); | |
6250 | ||
6251 | bad_0: /* :::::::::::::::::::: */ | |
6252 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", ffesta_tokens[0]); | |
6253 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6254 | ||
6255 | bad_1: /* :::::::::::::::::::: */ | |
6256 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t); | |
6257 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
6258 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
6259 | } | |
6260 | ||
6261 | /* ffestb_R5441_ -- "EQUIVALENCE" OPEN_PAREN expr | |
6262 | ||
6263 | (ffestb_R5441_) // to expression handler | |
6264 | ||
6265 | Make sure the next token is COMMA. */ | |
6266 | ||
6267 | static ffelexHandler | |
6268 | ffestb_R5441_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
6269 | { | |
6270 | switch (ffelex_token_type (t)) | |
6271 | { | |
6272 | case FFELEX_typeCOMMA: | |
6273 | if (expr == NULL) | |
6274 | break; | |
6275 | ffestb_local_.equivalence.exprs = ffestt_exprlist_create (); | |
6276 | ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr, | |
6277 | ffelex_token_use (ft)); | |
6278 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
6279 | FFEEXPR_contextEQUIVALENCE, | |
6280 | (ffeexprCallback) ffestb_R5442_); | |
6281 | ||
6282 | default: | |
6283 | break; | |
6284 | } | |
6285 | ||
6286 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t); | |
6287 | if (ffestb_local_.equivalence.started) | |
6288 | ffestc_R544_finish (); | |
6289 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6290 | } | |
6291 | ||
6292 | /* ffestb_R5442_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr | |
6293 | ||
6294 | (ffestb_R5442_) // to expression handler | |
6295 | ||
6296 | Make sure the next token is COMMA or CLOSE_PAREN. For COMMA, we just | |
6297 | append the expression to our list and continue; for CLOSE_PAREN, we | |
6298 | append the expression and move to _3_. */ | |
6299 | ||
6300 | static ffelexHandler | |
6301 | ffestb_R5442_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
6302 | { | |
6303 | switch (ffelex_token_type (t)) | |
6304 | { | |
6305 | case FFELEX_typeCOMMA: | |
6306 | if (expr == NULL) | |
6307 | break; | |
6308 | ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr, | |
6309 | ffelex_token_use (ft)); | |
6310 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
6311 | FFEEXPR_contextEQUIVALENCE, | |
6312 | (ffeexprCallback) ffestb_R5442_); | |
6313 | ||
6314 | case FFELEX_typeCLOSE_PAREN: | |
6315 | if (expr == NULL) | |
6316 | break; | |
6317 | ffestt_exprlist_append (ffestb_local_.equivalence.exprs, expr, | |
6318 | ffelex_token_use (ft)); | |
6319 | return (ffelexHandler) ffestb_R5443_; | |
6320 | ||
6321 | default: | |
6322 | break; | |
6323 | } | |
6324 | ||
6325 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t); | |
6326 | if (ffestb_local_.equivalence.started) | |
6327 | ffestc_R544_finish (); | |
6328 | ffestt_exprlist_kill (ffestb_local_.equivalence.exprs); | |
6329 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6330 | } | |
6331 | ||
6332 | /* ffestb_R5443_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr CLOSE_PAREN | |
6333 | ||
6334 | return ffestb_R5443_; // to lexer | |
6335 | ||
6336 | Make sure the next token is COMMA or EOS/SEMICOLON. */ | |
6337 | ||
6338 | static ffelexHandler | |
6339 | ffestb_R5443_ (ffelexToken t) | |
6340 | { | |
6341 | switch (ffelex_token_type (t)) | |
6342 | { | |
6343 | case FFELEX_typeCOMMA: | |
6344 | ffesta_confirmed (); | |
6345 | if (!ffesta_is_inhibited ()) | |
6346 | { | |
6347 | if (!ffestb_local_.equivalence.started) | |
6348 | { | |
6349 | ffestc_R544_start (); | |
6350 | ffestb_local_.equivalence.started = TRUE; | |
6351 | } | |
6352 | ffestc_R544_item (ffestb_local_.equivalence.exprs); | |
6353 | } | |
6354 | ffestt_exprlist_kill (ffestb_local_.equivalence.exprs); | |
6355 | return (ffelexHandler) ffestb_R5444_; | |
6356 | ||
6357 | case FFELEX_typeEOS: | |
6358 | case FFELEX_typeSEMICOLON: | |
6359 | ffesta_confirmed (); | |
6360 | if (!ffesta_is_inhibited ()) | |
6361 | { | |
6362 | if (!ffestb_local_.equivalence.started) | |
6363 | { | |
6364 | ffestc_R544_start (); | |
6365 | ffestb_local_.equivalence.started = TRUE; | |
6366 | } | |
6367 | ffestc_R544_item (ffestb_local_.equivalence.exprs); | |
6368 | ffestc_R544_finish (); | |
6369 | } | |
6370 | ffestt_exprlist_kill (ffestb_local_.equivalence.exprs); | |
6371 | return (ffelexHandler) ffesta_zero (t); | |
6372 | ||
6373 | default: | |
6374 | break; | |
6375 | } | |
6376 | ||
6377 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t); | |
6378 | if (ffestb_local_.equivalence.started) | |
6379 | ffestc_R544_finish (); | |
6380 | ffestt_exprlist_kill (ffestb_local_.equivalence.exprs); | |
6381 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6382 | } | |
6383 | ||
6384 | /* ffestb_R5444_ -- "EQUIVALENCE" OPEN_PAREN expr COMMA expr CLOSE_PAREN COMMA | |
6385 | ||
6386 | return ffestb_R5444_; // to lexer | |
6387 | ||
6388 | Make sure the next token is OPEN_PAREN, or generate an error. */ | |
6389 | ||
6390 | static ffelexHandler | |
6391 | ffestb_R5444_ (ffelexToken t) | |
6392 | { | |
6393 | switch (ffelex_token_type (t)) | |
6394 | { | |
6395 | case FFELEX_typeOPEN_PAREN: | |
6396 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
6397 | FFEEXPR_contextEQUIVALENCE, | |
6398 | (ffeexprCallback) ffestb_R5441_); | |
6399 | ||
6400 | default: | |
6401 | break; | |
6402 | } | |
6403 | ||
6404 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EQUIVALENCE", t); | |
6405 | if (ffestb_local_.equivalence.started) | |
6406 | ffestc_R544_finish (); | |
6407 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6408 | } | |
6409 | ||
6410 | /* ffestb_R834 -- Parse the CYCLE statement | |
6411 | ||
6412 | return ffestb_R834; // to lexer | |
6413 | ||
6414 | Make sure the statement has a valid form for the CYCLE statement. If | |
6415 | it does, implement the statement. */ | |
6416 | ||
6417 | ffelexHandler | |
6418 | ffestb_R834 (ffelexToken t) | |
6419 | { | |
6420 | ffeTokenLength i; | |
6421 | char *p; | |
6422 | ||
6423 | switch (ffelex_token_type (ffesta_tokens[0])) | |
6424 | { | |
6425 | case FFELEX_typeNAME: | |
6426 | if (ffesta_first_kw != FFESTR_firstCYCLE) | |
6427 | goto bad_0; /* :::::::::::::::::::: */ | |
6428 | switch (ffelex_token_type (t)) | |
6429 | { | |
6430 | case FFELEX_typeCOMMA: | |
6431 | case FFELEX_typeCOLONCOLON: | |
6432 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
6433 | goto bad_1; /* :::::::::::::::::::: */ | |
6434 | ||
6435 | default: | |
6436 | goto bad_1; /* :::::::::::::::::::: */ | |
6437 | ||
6438 | case FFELEX_typeNAME: | |
6439 | ffesta_confirmed (); | |
6440 | ffesta_tokens[1] = ffelex_token_use (t); | |
6441 | return (ffelexHandler) ffestb_R8341_; | |
6442 | ||
6443 | case FFELEX_typeEOS: | |
6444 | case FFELEX_typeSEMICOLON: | |
6445 | ffesta_confirmed (); | |
6446 | ffesta_tokens[1] = NULL; | |
6447 | return (ffelexHandler) ffestb_R8341_ (t); | |
6448 | } | |
6449 | ||
6450 | case FFELEX_typeNAMES: | |
6451 | if (ffesta_first_kw != FFESTR_firstCYCLE) | |
6452 | goto bad_0; /* :::::::::::::::::::: */ | |
6453 | switch (ffelex_token_type (t)) | |
6454 | { | |
6455 | default: | |
6456 | goto bad_1; /* :::::::::::::::::::: */ | |
6457 | ||
6458 | case FFELEX_typeEOS: | |
6459 | case FFELEX_typeSEMICOLON: | |
6460 | break; | |
6461 | } | |
6462 | ffesta_confirmed (); | |
6463 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCYCLE); | |
6464 | if (*p == '\0') | |
6465 | { | |
6466 | ffesta_tokens[1] = NULL; | |
6467 | } | |
6468 | else | |
6469 | { | |
6470 | if (!ffesrc_is_name_init (*p)) | |
6471 | goto bad_i; /* :::::::::::::::::::: */ | |
6472 | ffesta_tokens[1] | |
6473 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
6474 | } | |
6475 | return (ffelexHandler) ffestb_R8341_ (t); | |
6476 | ||
6477 | default: | |
6478 | goto bad_0; /* :::::::::::::::::::: */ | |
6479 | } | |
6480 | ||
6481 | bad_0: /* :::::::::::::::::::: */ | |
6482 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", ffesta_tokens[0]); | |
6483 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6484 | ||
6485 | bad_1: /* :::::::::::::::::::: */ | |
6486 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", t); | |
6487 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
6488 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
6489 | ||
6490 | bad_i: /* :::::::::::::::::::: */ | |
6491 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CYCLE", ffesta_tokens[0], i, t); | |
6492 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6493 | } | |
6494 | ||
6495 | /* ffestb_R8341_ -- "CYCLE" [NAME] | |
6496 | ||
6497 | return ffestb_R8341_; // to lexer | |
6498 | ||
6499 | Make sure the next token is an EOS or SEMICOLON. */ | |
6500 | ||
6501 | static ffelexHandler | |
6502 | ffestb_R8341_ (ffelexToken t) | |
6503 | { | |
6504 | switch (ffelex_token_type (t)) | |
6505 | { | |
6506 | case FFELEX_typeEOS: | |
6507 | case FFELEX_typeSEMICOLON: | |
6508 | ffesta_confirmed (); | |
6509 | if (!ffesta_is_inhibited ()) | |
6510 | ffestc_R834 (ffesta_tokens[1]); | |
6511 | if (ffesta_tokens[1] != NULL) | |
6512 | ffelex_token_kill (ffesta_tokens[1]); | |
6513 | return (ffelexHandler) ffesta_zero (t); | |
6514 | ||
6515 | default: | |
6516 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CYCLE", t); | |
6517 | break; | |
6518 | } | |
6519 | ||
6520 | if (ffesta_tokens[1] != NULL) | |
6521 | ffelex_token_kill (ffesta_tokens[1]); | |
6522 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6523 | } | |
6524 | ||
6525 | /* ffestb_R835 -- Parse the EXIT statement | |
6526 | ||
6527 | return ffestb_R835; // to lexer | |
6528 | ||
6529 | Make sure the statement has a valid form for the EXIT statement. If | |
6530 | it does, implement the statement. */ | |
6531 | ||
6532 | ffelexHandler | |
6533 | ffestb_R835 (ffelexToken t) | |
6534 | { | |
6535 | ffeTokenLength i; | |
6536 | char *p; | |
6537 | ||
6538 | switch (ffelex_token_type (ffesta_tokens[0])) | |
6539 | { | |
6540 | case FFELEX_typeNAME: | |
6541 | if (ffesta_first_kw != FFESTR_firstEXIT) | |
6542 | goto bad_0; /* :::::::::::::::::::: */ | |
6543 | switch (ffelex_token_type (t)) | |
6544 | { | |
6545 | case FFELEX_typeCOMMA: | |
6546 | case FFELEX_typeCOLONCOLON: | |
6547 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
6548 | goto bad_1; /* :::::::::::::::::::: */ | |
6549 | ||
6550 | default: | |
6551 | goto bad_1; /* :::::::::::::::::::: */ | |
6552 | ||
6553 | case FFELEX_typeNAME: | |
6554 | ffesta_confirmed (); | |
6555 | ffesta_tokens[1] = ffelex_token_use (t); | |
6556 | return (ffelexHandler) ffestb_R8351_; | |
6557 | ||
6558 | case FFELEX_typeEOS: | |
6559 | case FFELEX_typeSEMICOLON: | |
6560 | ffesta_confirmed (); | |
6561 | ffesta_tokens[1] = NULL; | |
6562 | return (ffelexHandler) ffestb_R8351_ (t); | |
6563 | } | |
6564 | ||
6565 | case FFELEX_typeNAMES: | |
6566 | if (ffesta_first_kw != FFESTR_firstEXIT) | |
6567 | goto bad_0; /* :::::::::::::::::::: */ | |
6568 | switch (ffelex_token_type (t)) | |
6569 | { | |
6570 | default: | |
6571 | goto bad_1; /* :::::::::::::::::::: */ | |
6572 | ||
6573 | case FFELEX_typeEOS: | |
6574 | case FFELEX_typeSEMICOLON: | |
6575 | break; | |
6576 | } | |
6577 | ffesta_confirmed (); | |
6578 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlEXIT); | |
6579 | if (*p == '\0') | |
6580 | { | |
6581 | ffesta_tokens[1] = NULL; | |
6582 | } | |
6583 | else | |
6584 | { | |
6585 | if (!ffesrc_is_name_init (*p)) | |
6586 | goto bad_i; /* :::::::::::::::::::: */ | |
6587 | ffesta_tokens[1] | |
6588 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
6589 | } | |
6590 | return (ffelexHandler) ffestb_R8351_ (t); | |
6591 | ||
6592 | default: | |
6593 | goto bad_0; /* :::::::::::::::::::: */ | |
6594 | } | |
6595 | ||
6596 | bad_0: /* :::::::::::::::::::: */ | |
6597 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", ffesta_tokens[0]); | |
6598 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6599 | ||
6600 | bad_1: /* :::::::::::::::::::: */ | |
6601 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", t); | |
6602 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
6603 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
6604 | ||
6605 | bad_i: /* :::::::::::::::::::: */ | |
6606 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "EXIT", ffesta_tokens[0], i, t); | |
6607 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6608 | } | |
6609 | ||
6610 | /* ffestb_R8351_ -- "EXIT" [NAME] | |
6611 | ||
6612 | return ffestb_R8351_; // to lexer | |
6613 | ||
6614 | Make sure the next token is an EOS or SEMICOLON. */ | |
6615 | ||
6616 | static ffelexHandler | |
6617 | ffestb_R8351_ (ffelexToken t) | |
6618 | { | |
6619 | switch (ffelex_token_type (t)) | |
6620 | { | |
6621 | case FFELEX_typeEOS: | |
6622 | case FFELEX_typeSEMICOLON: | |
6623 | ffesta_confirmed (); | |
6624 | if (!ffesta_is_inhibited ()) | |
6625 | ffestc_R835 (ffesta_tokens[1]); | |
6626 | if (ffesta_tokens[1] != NULL) | |
6627 | ffelex_token_kill (ffesta_tokens[1]); | |
6628 | return (ffelexHandler) ffesta_zero (t); | |
6629 | ||
6630 | default: | |
6631 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "EXIT", t); | |
6632 | break; | |
6633 | } | |
6634 | ||
6635 | if (ffesta_tokens[1] != NULL) | |
6636 | ffelex_token_kill (ffesta_tokens[1]); | |
6637 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6638 | } | |
6639 | ||
6640 | /* ffestb_R838 -- Parse the ASSIGN statement | |
6641 | ||
6642 | return ffestb_R838; // to lexer | |
6643 | ||
6644 | Make sure the statement has a valid form for the ASSIGN statement. If it | |
6645 | does, implement the statement. */ | |
6646 | ||
6647 | ffelexHandler | |
6648 | ffestb_R838 (ffelexToken t) | |
6649 | { | |
6650 | char *p; | |
6651 | ffeTokenLength i; | |
6652 | ffelexHandler next; | |
6653 | ffelexToken et; /* First token in target. */ | |
6654 | ||
6655 | switch (ffelex_token_type (ffesta_tokens[0])) | |
6656 | { | |
6657 | case FFELEX_typeNAME: | |
6658 | if (ffesta_first_kw != FFESTR_firstASSIGN) | |
6659 | goto bad_0; /* :::::::::::::::::::: */ | |
6660 | switch (ffelex_token_type (t)) | |
6661 | { | |
6662 | case FFELEX_typeEOS: | |
6663 | case FFELEX_typeSEMICOLON: | |
6664 | case FFELEX_typeCOMMA: | |
6665 | case FFELEX_typeCOLONCOLON: | |
6666 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
6667 | goto bad_1; /* :::::::::::::::::::: */ | |
6668 | ||
6669 | default: | |
6670 | goto bad_1; /* :::::::::::::::::::: */ | |
6671 | ||
6672 | case FFELEX_typeNUMBER: | |
6673 | break; | |
6674 | } | |
6675 | ffesta_tokens[1] = ffelex_token_use (t); | |
6676 | ffesta_confirmed (); | |
6677 | return (ffelexHandler) ffestb_R8381_; | |
6678 | ||
6679 | case FFELEX_typeNAMES: | |
6680 | if (ffesta_first_kw != FFESTR_firstASSIGN) | |
6681 | goto bad_0; /* :::::::::::::::::::: */ | |
6682 | ||
6683 | switch (ffelex_token_type (t)) | |
6684 | { | |
6685 | case FFELEX_typeEOS: | |
6686 | case FFELEX_typeSEMICOLON: | |
6687 | ffesta_confirmed (); | |
6688 | /* Fall through. */ | |
6689 | case FFELEX_typePERCENT: | |
6690 | case FFELEX_typeOPEN_PAREN: | |
6691 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlASSIGN); | |
6692 | if (!isdigit (*p)) | |
6693 | goto bad_i; /* :::::::::::::::::::: */ | |
6694 | ffesta_tokens[1] | |
6695 | = ffelex_token_number_from_names (ffesta_tokens[0], i); | |
6696 | p += ffelex_token_length (ffesta_tokens[1]); /* Skip to "TO". */ | |
6697 | i += ffelex_token_length (ffesta_tokens[1]); | |
6698 | if (!ffesrc_char_match_init (*p, 'T', 't') /* "TO". */ | |
6699 | || (++i, !ffesrc_char_match_noninit (*++p, 'O', 'o'))) | |
6700 | { | |
6701 | bad_i_1: /* :::::::::::::::::::: */ | |
6702 | ffelex_token_kill (ffesta_tokens[1]); | |
6703 | goto bad_i; /* :::::::::::::::::::: */ | |
6704 | } | |
6705 | ++p, ++i; | |
6706 | if (!ffesrc_is_name_init (*p)) | |
6707 | goto bad_i_1; /* :::::::::::::::::::: */ | |
6708 | et = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
6709 | next = (ffelexHandler) | |
6710 | (*((ffelexHandler) | |
6711 | ffeexpr_lhs (ffesta_output_pool, | |
6712 | FFEEXPR_contextASSIGN, | |
6713 | (ffeexprCallback) | |
6714 | ffestb_R8383_))) | |
6715 | (et); | |
6716 | ffelex_token_kill (et); | |
6717 | return (ffelexHandler) (*next) (t); | |
6718 | ||
6719 | case FFELEX_typeCOMMA: | |
6720 | case FFELEX_typeCOLONCOLON: | |
6721 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
6722 | goto bad_1; /* :::::::::::::::::::: */ | |
6723 | ||
6724 | default: | |
6725 | goto bad_1; /* :::::::::::::::::::: */ | |
6726 | } | |
6727 | ||
6728 | default: | |
6729 | goto bad_0; /* :::::::::::::::::::: */ | |
6730 | } | |
6731 | ||
6732 | bad_0: /* :::::::::::::::::::: */ | |
6733 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", ffesta_tokens[0]); | |
6734 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
6735 | (ffelexHandler) ffesta_zero); /* Invalid first token. */ | |
6736 | ||
6737 | bad_1: /* :::::::::::::::::::: */ | |
6738 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t); | |
6739 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
6740 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
6741 | ||
6742 | bad_i: /* :::::::::::::::::::: */ | |
6743 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "ASSIGN", ffesta_tokens[0], i, t); | |
6744 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6745 | } | |
6746 | ||
6747 | /* ffestb_R8381_ -- "ASSIGN" NUMBER | |
6748 | ||
6749 | return ffestb_R8381_; // to lexer | |
6750 | ||
6751 | Make sure the next token is "TO". */ | |
6752 | ||
6753 | static ffelexHandler | |
6754 | ffestb_R8381_ (ffelexToken t) | |
6755 | { | |
6756 | if ((ffelex_token_type (t) == FFELEX_typeNAME) | |
6757 | && (ffesrc_strcmp_2c (ffe_case_match (), ffelex_token_text (t), "TO", "to", | |
6758 | "To") == 0)) | |
6759 | { | |
6760 | return (ffelexHandler) ffestb_R8382_; | |
6761 | } | |
6762 | ||
6763 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t); | |
6764 | if (ffelex_token_type (t) == FFELEX_typeNAME) | |
6765 | return (ffelexHandler) ffestb_R8382_ (t); /* Maybe user forgot "TO". */ | |
6766 | ||
6767 | ffelex_token_kill (ffesta_tokens[1]); | |
6768 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6769 | } | |
6770 | ||
6771 | /* ffestb_R8382_ -- "ASSIGN" NUMBER ("TO") | |
6772 | ||
6773 | return ffestb_R8382_; // to lexer | |
6774 | ||
6775 | Make sure the next token is a name, then pass it along to the expression | |
6776 | evaluator as an LHS expression. The callback function is _3_. */ | |
6777 | ||
6778 | static ffelexHandler | |
6779 | ffestb_R8382_ (ffelexToken t) | |
6780 | { | |
6781 | if (ffelex_token_type (t) == FFELEX_typeNAME) | |
6782 | { | |
6783 | return (ffelexHandler) | |
6784 | (*((ffelexHandler) | |
6785 | ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextASSIGN, | |
6786 | (ffeexprCallback) ffestb_R8383_))) | |
6787 | (t); | |
6788 | } | |
6789 | ||
6790 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t); | |
6791 | ffelex_token_kill (ffesta_tokens[1]); | |
6792 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6793 | } | |
6794 | ||
6795 | /* ffestb_R8383_ -- "ASSIGN" NUMBER ("TO") expression | |
6796 | ||
6797 | (ffestb_R8383_) // to expression handler | |
6798 | ||
6799 | Make sure the next token is an EOS or SEMICOLON. */ | |
6800 | ||
6801 | static ffelexHandler | |
6802 | ffestb_R8383_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
6803 | { | |
6804 | switch (ffelex_token_type (t)) | |
6805 | { | |
6806 | case FFELEX_typeEOS: | |
6807 | case FFELEX_typeSEMICOLON: | |
6808 | ffesta_confirmed (); | |
6809 | if (expr == NULL) | |
6810 | break; | |
6811 | if (!ffesta_is_inhibited ()) | |
6812 | ffestc_R838 (ffesta_tokens[1], expr, ft); | |
6813 | ffelex_token_kill (ffesta_tokens[1]); | |
6814 | return (ffelexHandler) ffesta_zero (t); | |
6815 | ||
6816 | default: | |
6817 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ASSIGN", t); | |
6818 | break; | |
6819 | } | |
6820 | ||
6821 | ffelex_token_kill (ffesta_tokens[1]); | |
6822 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6823 | } | |
6824 | ||
6825 | /* ffestb_R840 -- Parse an arithmetic-IF statement | |
6826 | ||
6827 | return ffestb_R840; // to lexer | |
6828 | ||
6829 | Make sure the statement has a valid form for an arithmetic-IF statement. | |
6830 | If it does, implement the statement. */ | |
6831 | ||
6832 | ffelexHandler | |
6833 | ffestb_R840 (ffelexToken t) | |
6834 | { | |
6835 | switch (ffelex_token_type (ffesta_tokens[0])) | |
6836 | { | |
6837 | case FFELEX_typeNAME: | |
6838 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlIF) | |
6839 | goto bad_0; /* :::::::::::::::::::: */ | |
6840 | if (ffesta_first_kw != FFESTR_firstIF) | |
6841 | goto bad_0; /* :::::::::::::::::::: */ | |
6842 | break; | |
6843 | ||
6844 | case FFELEX_typeNAMES: | |
6845 | if (ffesta_first_kw != FFESTR_firstIF) | |
6846 | goto bad_0; /* :::::::::::::::::::: */ | |
6847 | break; | |
6848 | ||
6849 | default: | |
6850 | goto bad_0; /* :::::::::::::::::::: */ | |
6851 | } | |
6852 | ||
6853 | switch (ffelex_token_type (t)) | |
6854 | { | |
6855 | case FFELEX_typeOPEN_PAREN: | |
6856 | break; | |
6857 | ||
6858 | default: | |
6859 | goto bad_1; /* :::::::::::::::::::: */ | |
6860 | } | |
6861 | ||
6862 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextARITHIF, | |
6863 | (ffeexprCallback) ffestb_R8401_); | |
6864 | ||
6865 | bad_0: /* :::::::::::::::::::: */ | |
6866 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", ffesta_tokens[0]); | |
6867 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6868 | ||
6869 | bad_1: /* :::::::::::::::::::: */ | |
6870 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t); | |
6871 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
6872 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
6873 | } | |
6874 | ||
6875 | /* ffestb_R8401_ -- "IF" OPEN_PAREN expr | |
6876 | ||
6877 | (ffestb_R8401_) // to expression handler | |
6878 | ||
6879 | Make sure the next token is CLOSE_PAREN. */ | |
6880 | ||
6881 | static ffelexHandler | |
6882 | ffestb_R8401_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
6883 | { | |
6884 | ffestb_local_.if_stmt.expr = expr; | |
6885 | ||
6886 | switch (ffelex_token_type (t)) | |
6887 | { | |
6888 | case FFELEX_typeCLOSE_PAREN: | |
6889 | if (expr == NULL) | |
6890 | break; | |
6891 | ffesta_tokens[1] = ffelex_token_use (ft); | |
6892 | ffelex_set_names (TRUE); /* In case it's a logical IF instead. */ | |
6893 | return (ffelexHandler) ffestb_R8402_; | |
6894 | ||
6895 | default: | |
6896 | break; | |
6897 | } | |
6898 | ||
6899 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t); | |
6900 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6901 | } | |
6902 | ||
6903 | /* ffestb_R8402_ -- "IF" OPEN_PAREN expr CLOSE_PAREN | |
6904 | ||
6905 | return ffestb_R8402_; // to lexer | |
6906 | ||
6907 | Make sure the next token is NUMBER. */ | |
6908 | ||
6909 | static ffelexHandler | |
6910 | ffestb_R8402_ (ffelexToken t) | |
6911 | { | |
6912 | ffelex_set_names (FALSE); | |
6913 | ||
6914 | switch (ffelex_token_type (t)) | |
6915 | { | |
6916 | case FFELEX_typeNUMBER: | |
6917 | ffesta_confirmed (); | |
6918 | ffesta_tokens[2] = ffelex_token_use (t); | |
6919 | return (ffelexHandler) ffestb_R8403_; | |
6920 | ||
6921 | default: | |
6922 | break; | |
6923 | } | |
6924 | ||
6925 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t); | |
6926 | ffelex_token_kill (ffesta_tokens[1]); | |
6927 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6928 | } | |
6929 | ||
6930 | /* ffestb_R8403_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER | |
6931 | ||
6932 | return ffestb_R8403_; // to lexer | |
6933 | ||
6934 | Make sure the next token is COMMA. */ | |
6935 | ||
6936 | static ffelexHandler | |
6937 | ffestb_R8403_ (ffelexToken t) | |
6938 | { | |
6939 | switch (ffelex_token_type (t)) | |
6940 | { | |
6941 | case FFELEX_typeCOMMA: | |
6942 | return (ffelexHandler) ffestb_R8404_; | |
6943 | ||
6944 | default: | |
6945 | break; | |
6946 | } | |
6947 | ||
6948 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t); | |
6949 | ffelex_token_kill (ffesta_tokens[1]); | |
6950 | ffelex_token_kill (ffesta_tokens[2]); | |
6951 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6952 | } | |
6953 | ||
6954 | /* ffestb_R8404_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA | |
6955 | ||
6956 | return ffestb_R8404_; // to lexer | |
6957 | ||
6958 | Make sure the next token is NUMBER. */ | |
6959 | ||
6960 | static ffelexHandler | |
6961 | ffestb_R8404_ (ffelexToken t) | |
6962 | { | |
6963 | switch (ffelex_token_type (t)) | |
6964 | { | |
6965 | case FFELEX_typeNUMBER: | |
6966 | ffesta_tokens[3] = ffelex_token_use (t); | |
6967 | return (ffelexHandler) ffestb_R8405_; | |
6968 | ||
6969 | default: | |
6970 | break; | |
6971 | } | |
6972 | ||
6973 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t); | |
6974 | ffelex_token_kill (ffesta_tokens[1]); | |
6975 | ffelex_token_kill (ffesta_tokens[2]); | |
6976 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
6977 | } | |
6978 | ||
6979 | /* ffestb_R8405_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER | |
6980 | ||
6981 | return ffestb_R8405_; // to lexer | |
6982 | ||
6983 | Make sure the next token is COMMA. */ | |
6984 | ||
6985 | static ffelexHandler | |
6986 | ffestb_R8405_ (ffelexToken t) | |
6987 | { | |
6988 | switch (ffelex_token_type (t)) | |
6989 | { | |
6990 | case FFELEX_typeCOMMA: | |
6991 | return (ffelexHandler) ffestb_R8406_; | |
6992 | ||
6993 | default: | |
6994 | break; | |
6995 | } | |
6996 | ||
6997 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t); | |
6998 | ffelex_token_kill (ffesta_tokens[1]); | |
6999 | ffelex_token_kill (ffesta_tokens[2]); | |
7000 | ffelex_token_kill (ffesta_tokens[3]); | |
7001 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7002 | } | |
7003 | ||
7004 | /* ffestb_R8406_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER COMMA | |
7005 | ||
7006 | return ffestb_R8406_; // to lexer | |
7007 | ||
7008 | Make sure the next token is NUMBER. */ | |
7009 | ||
7010 | static ffelexHandler | |
7011 | ffestb_R8406_ (ffelexToken t) | |
7012 | { | |
7013 | switch (ffelex_token_type (t)) | |
7014 | { | |
7015 | case FFELEX_typeNUMBER: | |
7016 | ffesta_tokens[4] = ffelex_token_use (t); | |
7017 | return (ffelexHandler) ffestb_R8407_; | |
7018 | ||
7019 | default: | |
7020 | break; | |
7021 | } | |
7022 | ||
7023 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t); | |
7024 | ffelex_token_kill (ffesta_tokens[1]); | |
7025 | ffelex_token_kill (ffesta_tokens[2]); | |
7026 | ffelex_token_kill (ffesta_tokens[3]); | |
7027 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7028 | } | |
7029 | ||
7030 | /* ffestb_R8407_ -- "IF" OPEN_PAREN expr CLOSE_PAREN NUMBER COMMA NUMBER COMMA | |
7031 | NUMBER | |
7032 | ||
7033 | return ffestb_R8407_; // to lexer | |
7034 | ||
7035 | Make sure the next token is EOS or SEMICOLON. */ | |
7036 | ||
7037 | static ffelexHandler | |
7038 | ffestb_R8407_ (ffelexToken t) | |
7039 | { | |
7040 | switch (ffelex_token_type (t)) | |
7041 | { | |
7042 | case FFELEX_typeEOS: | |
7043 | case FFELEX_typeSEMICOLON: | |
7044 | if (!ffesta_is_inhibited ()) | |
7045 | ffestc_R840 (ffestb_local_.if_stmt.expr, ffesta_tokens[1], | |
7046 | ffesta_tokens[2], ffesta_tokens[3], ffesta_tokens[4]); | |
7047 | ffelex_token_kill (ffesta_tokens[1]); | |
7048 | ffelex_token_kill (ffesta_tokens[2]); | |
7049 | ffelex_token_kill (ffesta_tokens[3]); | |
7050 | ffelex_token_kill (ffesta_tokens[4]); | |
7051 | return (ffelexHandler) ffesta_zero (t); | |
7052 | ||
7053 | default: | |
7054 | break; | |
7055 | } | |
7056 | ||
7057 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "arithmetic-IF", t); | |
7058 | ffelex_token_kill (ffesta_tokens[1]); | |
7059 | ffelex_token_kill (ffesta_tokens[2]); | |
7060 | ffelex_token_kill (ffesta_tokens[3]); | |
7061 | ffelex_token_kill (ffesta_tokens[4]); | |
7062 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7063 | } | |
7064 | ||
7065 | /* ffestb_R841 -- Parse the CONTINUE statement | |
7066 | ||
7067 | return ffestb_R841; // to lexer | |
7068 | ||
7069 | Make sure the statement has a valid form for the CONTINUE statement. If | |
7070 | it does, implement the statement. */ | |
7071 | ||
7072 | ffelexHandler | |
7073 | ffestb_R841 (ffelexToken t) | |
7074 | { | |
7075 | char *p; | |
7076 | ffeTokenLength i; | |
7077 | ||
7078 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7079 | { | |
7080 | case FFELEX_typeNAME: | |
7081 | if (ffesta_first_kw != FFESTR_firstCONTINUE) | |
7082 | goto bad_0; /* :::::::::::::::::::: */ | |
7083 | break; | |
7084 | ||
7085 | case FFELEX_typeNAMES: | |
7086 | if (ffesta_first_kw != FFESTR_firstCONTINUE) | |
7087 | goto bad_0; /* :::::::::::::::::::: */ | |
7088 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCONTINUE) | |
7089 | { | |
7090 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCONTINUE); | |
7091 | goto bad_i; /* :::::::::::::::::::: */ | |
7092 | } | |
7093 | break; | |
7094 | ||
7095 | default: | |
7096 | goto bad_0; /* :::::::::::::::::::: */ | |
7097 | } | |
7098 | ||
7099 | switch (ffelex_token_type (t)) | |
7100 | { | |
7101 | case FFELEX_typeEOS: | |
7102 | case FFELEX_typeSEMICOLON: | |
7103 | ffesta_confirmed (); | |
7104 | if (!ffesta_is_inhibited ()) | |
7105 | ffestc_R841 (); | |
7106 | return (ffelexHandler) ffesta_zero (t); | |
7107 | ||
7108 | case FFELEX_typeCOMMA: | |
7109 | case FFELEX_typeCOLONCOLON: | |
7110 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7111 | goto bad_1; /* :::::::::::::::::::: */ | |
7112 | ||
7113 | default: | |
7114 | goto bad_1; /* :::::::::::::::::::: */ | |
7115 | } | |
7116 | ||
7117 | bad_0: /* :::::::::::::::::::: */ | |
7118 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTINUE", ffesta_tokens[0]); | |
7119 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7120 | (ffelexHandler) ffesta_zero); /* Invalid first token. */ | |
7121 | ||
7122 | bad_1: /* :::::::::::::::::::: */ | |
7123 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTINUE", t); | |
7124 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7125 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7126 | ||
7127 | bad_i: /* :::::::::::::::::::: */ | |
7128 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CONTINUE", ffesta_tokens[0], i, t); | |
7129 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7130 | } | |
7131 | ||
7132 | /* ffestb_R1102 -- Parse the PROGRAM statement | |
7133 | ||
7134 | return ffestb_R1102; // to lexer | |
7135 | ||
7136 | Make sure the statement has a valid form for the PROGRAM statement. If it | |
7137 | does, implement the statement. */ | |
7138 | ||
7139 | ffelexHandler | |
7140 | ffestb_R1102 (ffelexToken t) | |
7141 | { | |
7142 | ffeTokenLength i; | |
7143 | char *p; | |
7144 | ||
7145 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7146 | { | |
7147 | case FFELEX_typeNAME: | |
7148 | if (ffesta_first_kw != FFESTR_firstPROGRAM) | |
7149 | goto bad_0; /* :::::::::::::::::::: */ | |
7150 | switch (ffelex_token_type (t)) | |
7151 | { | |
7152 | case FFELEX_typeEOS: | |
7153 | case FFELEX_typeSEMICOLON: | |
7154 | case FFELEX_typeCOMMA: | |
7155 | case FFELEX_typeCOLONCOLON: | |
7156 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7157 | goto bad_1; /* :::::::::::::::::::: */ | |
7158 | ||
7159 | default: | |
7160 | goto bad_1; /* :::::::::::::::::::: */ | |
7161 | ||
7162 | case FFELEX_typeNAME: | |
7163 | break; | |
7164 | } | |
7165 | ||
7166 | ffesta_confirmed (); | |
7167 | ffesta_tokens[1] = ffelex_token_use (t); | |
7168 | return (ffelexHandler) ffestb_R11021_; | |
7169 | ||
7170 | case FFELEX_typeNAMES: | |
7171 | if (ffesta_first_kw != FFESTR_firstPROGRAM) | |
7172 | goto bad_0; /* :::::::::::::::::::: */ | |
7173 | switch (ffelex_token_type (t)) | |
7174 | { | |
7175 | case FFELEX_typeCOMMA: | |
7176 | case FFELEX_typeCOLONCOLON: | |
7177 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7178 | goto bad_1; /* :::::::::::::::::::: */ | |
7179 | ||
7180 | default: | |
7181 | goto bad_1; /* :::::::::::::::::::: */ | |
7182 | ||
7183 | case FFELEX_typeEOS: | |
7184 | case FFELEX_typeSEMICOLON: | |
7185 | break; | |
7186 | } | |
7187 | ffesta_confirmed (); | |
7188 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlPROGRAM); | |
7189 | if (!ffesrc_is_name_init (*p)) | |
7190 | goto bad_i; /* :::::::::::::::::::: */ | |
7191 | ffesta_tokens[1] | |
7192 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
7193 | return (ffelexHandler) ffestb_R11021_ (t); | |
7194 | ||
7195 | default: | |
7196 | goto bad_0; /* :::::::::::::::::::: */ | |
7197 | } | |
7198 | ||
7199 | bad_0: /* :::::::::::::::::::: */ | |
7200 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", ffesta_tokens[0]); | |
7201 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7202 | ||
7203 | bad_1: /* :::::::::::::::::::: */ | |
7204 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", t); | |
7205 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7206 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7207 | ||
7208 | bad_i: /* :::::::::::::::::::: */ | |
7209 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "PROGRAM", ffesta_tokens[0], i, t); | |
7210 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7211 | } | |
7212 | ||
7213 | /* ffestb_R11021_ -- "PROGRAM" NAME | |
7214 | ||
7215 | return ffestb_R11021_; // to lexer | |
7216 | ||
7217 | Make sure the next token is an EOS or SEMICOLON. */ | |
7218 | ||
7219 | static ffelexHandler | |
7220 | ffestb_R11021_ (ffelexToken t) | |
7221 | { | |
7222 | switch (ffelex_token_type (t)) | |
7223 | { | |
7224 | case FFELEX_typeEOS: | |
7225 | case FFELEX_typeSEMICOLON: | |
7226 | ffesta_confirmed (); | |
7227 | if (!ffesta_is_inhibited ()) | |
7228 | ffestc_R1102 (ffesta_tokens[1]); | |
7229 | ffelex_token_kill (ffesta_tokens[1]); | |
7230 | return (ffelexHandler) ffesta_zero (t); | |
7231 | ||
7232 | default: | |
7233 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PROGRAM", t); | |
7234 | break; | |
7235 | } | |
7236 | ||
7237 | ffelex_token_kill (ffesta_tokens[1]); | |
7238 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7239 | } | |
7240 | ||
7241 | /* ffestb_block -- Parse the BLOCK DATA statement | |
7242 | ||
7243 | return ffestb_block; // to lexer | |
7244 | ||
7245 | Make sure the statement has a valid form for the BLOCK DATA statement. If | |
7246 | it does, implement the statement. */ | |
7247 | ||
7248 | ffelexHandler | |
7249 | ffestb_block (ffelexToken t) | |
7250 | { | |
7251 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7252 | { | |
7253 | case FFELEX_typeNAME: | |
7254 | if (ffesta_first_kw != FFESTR_firstBLOCK) | |
7255 | goto bad_0; /* :::::::::::::::::::: */ | |
7256 | switch (ffelex_token_type (t)) | |
7257 | { | |
7258 | default: | |
7259 | goto bad_1; /* :::::::::::::::::::: */ | |
7260 | ||
7261 | case FFELEX_typeNAME: | |
7262 | if (ffesta_second_kw != FFESTR_secondDATA) | |
7263 | goto bad_1; /* :::::::::::::::::::: */ | |
7264 | break; | |
7265 | } | |
7266 | ||
7267 | ffesta_confirmed (); | |
7268 | return (ffelexHandler) ffestb_R1111_1_; | |
7269 | ||
7270 | default: | |
7271 | goto bad_0; /* :::::::::::::::::::: */ | |
7272 | } | |
7273 | ||
7274 | bad_0: /* :::::::::::::::::::: */ | |
7275 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0]); | |
7276 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7277 | ||
7278 | bad_1: /* :::::::::::::::::::: */ | |
7279 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t); | |
7280 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7281 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7282 | } | |
7283 | ||
7284 | /* ffestb_blockdata -- Parse the BLOCKDATA statement | |
7285 | ||
7286 | return ffestb_blockdata; // to lexer | |
7287 | ||
7288 | Make sure the statement has a valid form for the BLOCKDATA statement. If | |
7289 | it does, implement the statement. */ | |
7290 | ||
7291 | ffelexHandler | |
7292 | ffestb_blockdata (ffelexToken t) | |
7293 | { | |
7294 | ffeTokenLength i; | |
7295 | char *p; | |
7296 | ||
7297 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7298 | { | |
7299 | case FFELEX_typeNAME: | |
7300 | if (ffesta_first_kw != FFESTR_firstBLOCKDATA) | |
7301 | goto bad_0; /* :::::::::::::::::::: */ | |
7302 | switch (ffelex_token_type (t)) | |
7303 | { | |
7304 | case FFELEX_typeCOMMA: | |
7305 | case FFELEX_typeCOLONCOLON: | |
7306 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7307 | goto bad_1; /* :::::::::::::::::::: */ | |
7308 | ||
7309 | default: | |
7310 | goto bad_1; /* :::::::::::::::::::: */ | |
7311 | ||
7312 | case FFELEX_typeNAME: | |
7313 | ffesta_confirmed (); | |
7314 | ffesta_tokens[1] = ffelex_token_use (t); | |
7315 | return (ffelexHandler) ffestb_R1111_2_; | |
7316 | ||
7317 | case FFELEX_typeEOS: | |
7318 | case FFELEX_typeSEMICOLON: | |
7319 | ffesta_confirmed (); | |
7320 | ffesta_tokens[1] = NULL; | |
7321 | return (ffelexHandler) ffestb_R1111_2_ (t); | |
7322 | } | |
7323 | ||
7324 | case FFELEX_typeNAMES: | |
7325 | if (ffesta_first_kw != FFESTR_firstBLOCKDATA) | |
7326 | goto bad_0; /* :::::::::::::::::::: */ | |
7327 | switch (ffelex_token_type (t)) | |
7328 | { | |
7329 | default: | |
7330 | goto bad_1; /* :::::::::::::::::::: */ | |
7331 | ||
7332 | case FFELEX_typeEOS: | |
7333 | case FFELEX_typeSEMICOLON: | |
7334 | break; | |
7335 | } | |
7336 | ffesta_confirmed (); | |
7337 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlBLOCKDATA); | |
7338 | if (*p == '\0') | |
7339 | { | |
7340 | ffesta_tokens[1] = NULL; | |
7341 | } | |
7342 | else | |
7343 | { | |
7344 | if (!ffesrc_is_name_init (*p)) | |
7345 | goto bad_i; /* :::::::::::::::::::: */ | |
7346 | ffesta_tokens[1] | |
7347 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
7348 | } | |
7349 | return (ffelexHandler) ffestb_R1111_2_ (t); | |
7350 | ||
7351 | default: | |
7352 | goto bad_0; /* :::::::::::::::::::: */ | |
7353 | } | |
7354 | ||
7355 | bad_0: /* :::::::::::::::::::: */ | |
7356 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0]); | |
7357 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7358 | ||
7359 | bad_1: /* :::::::::::::::::::: */ | |
7360 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t); | |
7361 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7362 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7363 | ||
7364 | bad_i: /* :::::::::::::::::::: */ | |
7365 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", ffesta_tokens[0], i, t); | |
7366 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7367 | } | |
7368 | ||
7369 | /* ffestb_R1111_1_ -- "BLOCK" "DATA" | |
7370 | ||
7371 | return ffestb_R1111_1_; // to lexer | |
7372 | ||
7373 | Make sure the next token is a NAME, EOS, or SEMICOLON token. */ | |
7374 | ||
7375 | static ffelexHandler | |
7376 | ffestb_R1111_1_ (ffelexToken t) | |
7377 | { | |
7378 | switch (ffelex_token_type (t)) | |
7379 | { | |
7380 | case FFELEX_typeNAME: | |
7381 | ffesta_tokens[1] = ffelex_token_use (t); | |
7382 | return (ffelexHandler) ffestb_R1111_2_; | |
7383 | ||
7384 | case FFELEX_typeEOS: | |
7385 | case FFELEX_typeSEMICOLON: | |
7386 | ffesta_tokens[1] = NULL; | |
7387 | return (ffelexHandler) ffestb_R1111_2_ (t); | |
7388 | ||
7389 | default: | |
7390 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t); | |
7391 | break; | |
7392 | } | |
7393 | ||
7394 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7395 | } | |
7396 | ||
7397 | /* ffestb_R1111_2_ -- "BLOCK/DATA" NAME | |
7398 | ||
7399 | return ffestb_R1111_2_; // to lexer | |
7400 | ||
7401 | Make sure the next token is an EOS or SEMICOLON. */ | |
7402 | ||
7403 | static ffelexHandler | |
7404 | ffestb_R1111_2_ (ffelexToken t) | |
7405 | { | |
7406 | switch (ffelex_token_type (t)) | |
7407 | { | |
7408 | case FFELEX_typeEOS: | |
7409 | case FFELEX_typeSEMICOLON: | |
7410 | ffesta_confirmed (); | |
7411 | if (!ffesta_is_inhibited ()) | |
7412 | ffestc_R1111 (ffesta_tokens[1]); | |
7413 | if (ffesta_tokens[1] != NULL) | |
7414 | ffelex_token_kill (ffesta_tokens[1]); | |
7415 | return (ffelexHandler) ffesta_zero (t); | |
7416 | ||
7417 | default: | |
7418 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "BLOCK DATA", t); | |
7419 | break; | |
7420 | } | |
7421 | ||
7422 | if (ffesta_tokens[1] != NULL) | |
7423 | ffelex_token_kill (ffesta_tokens[1]); | |
7424 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7425 | } | |
7426 | ||
7427 | /* ffestb_R1212 -- Parse the CALL statement | |
7428 | ||
7429 | return ffestb_R1212; // to lexer | |
7430 | ||
7431 | Make sure the statement has a valid form for the CALL statement. If it | |
7432 | does, implement the statement. */ | |
7433 | ||
7434 | ffelexHandler | |
7435 | ffestb_R1212 (ffelexToken t) | |
7436 | { | |
7437 | ffeTokenLength i; | |
7438 | char *p; | |
7439 | ffelexHandler next; | |
7440 | ffelexToken nt; | |
7441 | ||
7442 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7443 | { | |
7444 | case FFELEX_typeNAME: | |
7445 | if (ffesta_first_kw != FFESTR_firstCALL) | |
7446 | goto bad_0; /* :::::::::::::::::::: */ | |
7447 | switch (ffelex_token_type (t)) | |
7448 | { | |
7449 | case FFELEX_typeEOS: | |
7450 | case FFELEX_typeSEMICOLON: | |
7451 | case FFELEX_typeCOMMA: | |
7452 | case FFELEX_typeCOLONCOLON: | |
7453 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7454 | goto bad_1; /* :::::::::::::::::::: */ | |
7455 | ||
7456 | default: | |
7457 | goto bad_1; /* :::::::::::::::::::: */ | |
7458 | ||
7459 | case FFELEX_typeNAME: | |
7460 | break; | |
7461 | } | |
7462 | ffesta_confirmed (); | |
7463 | return (ffelexHandler) | |
7464 | (*((ffelexHandler) | |
7465 | ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextSUBROUTINEREF, | |
7466 | (ffeexprCallback) ffestb_R12121_))) | |
7467 | (t); | |
7468 | ||
7469 | case FFELEX_typeNAMES: | |
7470 | if (ffesta_first_kw != FFESTR_firstCALL) | |
7471 | goto bad_0; /* :::::::::::::::::::: */ | |
7472 | switch (ffelex_token_type (t)) | |
7473 | { | |
7474 | case FFELEX_typeCOLONCOLON: | |
7475 | case FFELEX_typeCOMMA: | |
7476 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7477 | goto bad_1; /* :::::::::::::::::::: */ | |
7478 | ||
7479 | default: | |
7480 | goto bad_1; /* :::::::::::::::::::: */ | |
7481 | ||
7482 | case FFELEX_typeOPEN_PAREN: | |
7483 | break; | |
7484 | ||
7485 | case FFELEX_typeEOS: | |
7486 | case FFELEX_typeSEMICOLON: | |
7487 | ffesta_confirmed (); | |
7488 | break; | |
7489 | } | |
7490 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCALL); | |
7491 | if (!ffesrc_is_name_init (*p)) | |
7492 | goto bad_i; /* :::::::::::::::::::: */ | |
7493 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
7494 | next = (ffelexHandler) | |
7495 | (*((ffelexHandler) | |
7496 | ffeexpr_lhs (ffesta_output_pool, FFEEXPR_contextSUBROUTINEREF, | |
7497 | (ffeexprCallback) ffestb_R12121_))) | |
7498 | (nt); | |
7499 | ffelex_token_kill (nt); | |
7500 | return (ffelexHandler) (*next) (t); | |
7501 | ||
7502 | default: | |
7503 | goto bad_0; /* :::::::::::::::::::: */ | |
7504 | } | |
7505 | ||
7506 | bad_0: /* :::::::::::::::::::: */ | |
7507 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", ffesta_tokens[0]); | |
7508 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7509 | ||
7510 | bad_1: /* :::::::::::::::::::: */ | |
7511 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", t); | |
7512 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7513 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7514 | ||
7515 | bad_i: /* :::::::::::::::::::: */ | |
7516 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CALL", ffesta_tokens[0], i, t); | |
7517 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7518 | } | |
7519 | ||
7520 | /* ffestb_R12121_ -- "CALL" expr | |
7521 | ||
7522 | (ffestb_R12121_) // to expression handler | |
7523 | ||
7524 | Make sure the statement has a valid form for the CALL statement. If it | |
7525 | does, implement the statement. */ | |
7526 | ||
7527 | static ffelexHandler | |
7528 | ffestb_R12121_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
7529 | { | |
7530 | switch (ffelex_token_type (t)) | |
7531 | { | |
7532 | case FFELEX_typeEOS: | |
7533 | case FFELEX_typeSEMICOLON: | |
7534 | ffesta_confirmed (); | |
7535 | if (expr == NULL) | |
7536 | break; | |
7537 | if (!ffesta_is_inhibited ()) | |
7538 | ffestc_R1212 (expr, ft); | |
7539 | return (ffelexHandler) ffesta_zero (t); | |
7540 | ||
7541 | default: | |
7542 | break; | |
7543 | } | |
7544 | ||
7545 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CALL", t); | |
7546 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7547 | } | |
7548 | ||
7549 | /* ffestb_R1227 -- Parse the RETURN statement | |
7550 | ||
7551 | return ffestb_R1227; // to lexer | |
7552 | ||
7553 | Make sure the statement has a valid form for the RETURN statement. If it | |
7554 | does, implement the statement. */ | |
7555 | ||
7556 | ffelexHandler | |
7557 | ffestb_R1227 (ffelexToken t) | |
7558 | { | |
7559 | ffelexHandler next; | |
7560 | ||
7561 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7562 | { | |
7563 | case FFELEX_typeNAME: | |
7564 | if (ffesta_first_kw != FFESTR_firstRETURN) | |
7565 | goto bad_0; /* :::::::::::::::::::: */ | |
7566 | switch (ffelex_token_type (t)) | |
7567 | { | |
7568 | case FFELEX_typeCOMMA: | |
7569 | case FFELEX_typeCOLONCOLON: | |
7570 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7571 | goto bad_1; /* :::::::::::::::::::: */ | |
7572 | ||
7573 | case FFELEX_typeEQUALS: | |
7574 | case FFELEX_typePOINTS: | |
7575 | case FFELEX_typeCOLON: | |
7576 | goto bad_1; /* :::::::::::::::::::: */ | |
7577 | ||
7578 | case FFELEX_typeEOS: | |
7579 | case FFELEX_typeSEMICOLON: | |
7580 | case FFELEX_typeNAME: | |
7581 | case FFELEX_typeNUMBER: | |
7582 | ffesta_confirmed (); | |
7583 | break; | |
7584 | ||
7585 | default: | |
7586 | break; | |
7587 | } | |
7588 | ||
7589 | return (ffelexHandler) (*((ffelexHandler) | |
7590 | ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextRETURN, | |
7591 | (ffeexprCallback) ffestb_R12271_))) | |
7592 | (t); | |
7593 | ||
7594 | case FFELEX_typeNAMES: | |
7595 | if (ffesta_first_kw != FFESTR_firstRETURN) | |
7596 | goto bad_0; /* :::::::::::::::::::: */ | |
7597 | switch (ffelex_token_type (t)) | |
7598 | { | |
7599 | case FFELEX_typeCOMMA: | |
7600 | case FFELEX_typeCOLONCOLON: | |
7601 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7602 | goto bad_1; /* :::::::::::::::::::: */ | |
7603 | ||
7604 | case FFELEX_typeEQUALS: | |
7605 | case FFELEX_typePOINTS: | |
7606 | case FFELEX_typeCOLON: | |
7607 | goto bad_1; /* :::::::::::::::::::: */ | |
7608 | ||
7609 | case FFELEX_typeEOS: | |
7610 | case FFELEX_typeSEMICOLON: | |
7611 | ffesta_confirmed (); | |
7612 | break; | |
7613 | ||
7614 | default: | |
7615 | break; | |
7616 | } | |
7617 | next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
7618 | FFEEXPR_contextRETURN, (ffeexprCallback) ffestb_R12271_); | |
7619 | next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0], | |
7620 | FFESTR_firstlRETURN); | |
7621 | if (next == NULL) | |
7622 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7623 | (ffelexHandler) ffesta_zero); | |
7624 | return (ffelexHandler) (*next) (t); | |
7625 | ||
7626 | default: | |
7627 | goto bad_0; /* :::::::::::::::::::: */ | |
7628 | } | |
7629 | ||
7630 | bad_0: /* :::::::::::::::::::: */ | |
7631 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", ffesta_tokens[0]); | |
7632 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7633 | ||
7634 | bad_1: /* :::::::::::::::::::: */ | |
7635 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", t); | |
7636 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7637 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7638 | } | |
7639 | ||
7640 | /* ffestb_R12271_ -- "RETURN" expr | |
7641 | ||
7642 | (ffestb_R12271_) // to expression handler | |
7643 | ||
7644 | Make sure the next token is an EOS or SEMICOLON. */ | |
7645 | ||
7646 | static ffelexHandler | |
7647 | ffestb_R12271_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
7648 | { | |
7649 | switch (ffelex_token_type (t)) | |
7650 | { | |
7651 | case FFELEX_typeEOS: | |
7652 | case FFELEX_typeSEMICOLON: | |
7653 | ffesta_confirmed (); | |
7654 | if (!ffesta_is_inhibited ()) | |
7655 | ffestc_R1227 (expr, ft); | |
7656 | return (ffelexHandler) ffesta_zero (t); | |
7657 | ||
7658 | default: | |
7659 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RETURN", t); | |
7660 | break; | |
7661 | } | |
7662 | ||
7663 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7664 | } | |
7665 | ||
7666 | /* ffestb_R1228 -- Parse the CONTAINS statement | |
7667 | ||
7668 | return ffestb_R1228; // to lexer | |
7669 | ||
7670 | Make sure the statement has a valid form for the CONTAINS statement. If | |
7671 | it does, implement the statement. */ | |
7672 | ||
7673 | #if FFESTR_F90 | |
7674 | ffelexHandler | |
7675 | ffestb_R1228 (ffelexToken t) | |
7676 | { | |
7677 | char *p; | |
7678 | ffeTokenLength i; | |
7679 | ||
7680 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7681 | { | |
7682 | case FFELEX_typeNAME: | |
7683 | if (ffesta_first_kw != FFESTR_firstCONTAINS) | |
7684 | goto bad_0; /* :::::::::::::::::::: */ | |
7685 | break; | |
7686 | ||
7687 | case FFELEX_typeNAMES: | |
7688 | if (ffesta_first_kw != FFESTR_firstCONTAINS) | |
7689 | goto bad_0; /* :::::::::::::::::::: */ | |
7690 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCONTAINS) | |
7691 | { | |
7692 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCONTAINS); | |
7693 | goto bad_i; /* :::::::::::::::::::: */ | |
7694 | } | |
7695 | break; | |
7696 | ||
7697 | default: | |
7698 | goto bad_0; /* :::::::::::::::::::: */ | |
7699 | } | |
7700 | ||
7701 | switch (ffelex_token_type (t)) | |
7702 | { | |
7703 | case FFELEX_typeEOS: | |
7704 | case FFELEX_typeSEMICOLON: | |
7705 | ffesta_confirmed (); | |
7706 | if (!ffesta_is_inhibited ()) | |
7707 | ffestc_R1228 (); | |
7708 | return (ffelexHandler) ffesta_zero (t); | |
7709 | ||
7710 | case FFELEX_typeCOMMA: | |
7711 | case FFELEX_typeCOLONCOLON: | |
7712 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7713 | goto bad_1; /* :::::::::::::::::::: */ | |
7714 | ||
7715 | default: | |
7716 | goto bad_1; /* :::::::::::::::::::: */ | |
7717 | } | |
7718 | ||
7719 | bad_0: /* :::::::::::::::::::: */ | |
7720 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTAINS", ffesta_tokens[0]); | |
7721 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7722 | (ffelexHandler) ffesta_zero); /* Invalid first token. */ | |
7723 | ||
7724 | bad_1: /* :::::::::::::::::::: */ | |
7725 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CONTAINS", t); | |
7726 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7727 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7728 | ||
7729 | bad_i: /* :::::::::::::::::::: */ | |
7730 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CONTAINS", ffesta_tokens[0], i, t); | |
7731 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7732 | } | |
7733 | ||
7734 | #endif | |
7735 | /* ffestb_V009 -- Parse the UNION statement | |
7736 | ||
7737 | return ffestb_V009; // to lexer | |
7738 | ||
7739 | Make sure the statement has a valid form for the UNION statement. If | |
7740 | it does, implement the statement. */ | |
7741 | ||
7742 | #if FFESTR_VXT | |
7743 | ffelexHandler | |
7744 | ffestb_V009 (ffelexToken t) | |
7745 | { | |
7746 | char *p; | |
7747 | ffeTokenLength i; | |
7748 | ||
7749 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7750 | { | |
7751 | case FFELEX_typeNAME: | |
7752 | if (ffesta_first_kw != FFESTR_firstUNION) | |
7753 | goto bad_0; /* :::::::::::::::::::: */ | |
7754 | break; | |
7755 | ||
7756 | case FFELEX_typeNAMES: | |
7757 | if (ffesta_first_kw != FFESTR_firstUNION) | |
7758 | goto bad_0; /* :::::::::::::::::::: */ | |
7759 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlUNION) | |
7760 | { | |
7761 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlUNION); | |
7762 | goto bad_i; /* :::::::::::::::::::: */ | |
7763 | } | |
7764 | break; | |
7765 | ||
7766 | default: | |
7767 | goto bad_0; /* :::::::::::::::::::: */ | |
7768 | } | |
7769 | ||
7770 | switch (ffelex_token_type (t)) | |
7771 | { | |
7772 | case FFELEX_typeEOS: | |
7773 | case FFELEX_typeSEMICOLON: | |
7774 | ffesta_confirmed (); | |
7775 | if (!ffesta_is_inhibited ()) | |
7776 | ffestc_V009 (); | |
7777 | return (ffelexHandler) ffesta_zero (t); | |
7778 | ||
7779 | case FFELEX_typeCOMMA: | |
7780 | case FFELEX_typeCOLONCOLON: | |
7781 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7782 | goto bad_1; /* :::::::::::::::::::: */ | |
7783 | ||
7784 | default: | |
7785 | goto bad_1; /* :::::::::::::::::::: */ | |
7786 | } | |
7787 | ||
7788 | bad_0: /* :::::::::::::::::::: */ | |
7789 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "UNION", ffesta_tokens[0]); | |
7790 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7791 | (ffelexHandler) ffesta_zero); /* Invalid first token. */ | |
7792 | ||
7793 | bad_1: /* :::::::::::::::::::: */ | |
7794 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "UNION", t); | |
7795 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7796 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7797 | ||
7798 | bad_i: /* :::::::::::::::::::: */ | |
7799 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "UNION", ffesta_tokens[0], i, t); | |
7800 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7801 | } | |
7802 | ||
7803 | #endif | |
7804 | /* ffestb_construct -- Parse a construct name | |
7805 | ||
7806 | return ffestb_construct; // to lexer | |
7807 | ||
7808 | Make sure the statement can have a construct name (if-then-stmt, do-stmt, | |
7809 | select-case-stmt). */ | |
7810 | ||
7811 | ffelexHandler | |
7812 | ffestb_construct (ffelexToken t UNUSED) | |
7813 | { | |
7814 | /* This handler gets invoked only when token 0 is NAME/NAMES and token 1 is | |
7815 | COLON. */ | |
7816 | ||
7817 | ffesta_confirmed (); | |
7818 | ffelex_set_names (TRUE); | |
7819 | return (ffelexHandler) ffestb_construct1_; | |
7820 | } | |
7821 | ||
7822 | /* ffestb_construct1_ -- NAME COLON | |
7823 | ||
7824 | return ffestb_construct1_; // to lexer | |
7825 | ||
7826 | Make sure we've got a NAME that is DO, DOWHILE, IF, SELECT, or SELECTCASE. */ | |
7827 | ||
7828 | static ffelexHandler | |
7829 | ffestb_construct1_ (ffelexToken t) | |
7830 | { | |
7831 | ffelex_set_names (FALSE); | |
7832 | ||
7833 | switch (ffelex_token_type (t)) | |
7834 | { | |
7835 | case FFELEX_typeNAME: | |
7836 | ffesta_first_kw = ffestr_first (t); | |
7837 | switch (ffesta_first_kw) | |
7838 | { | |
7839 | case FFESTR_firstIF: | |
7840 | ffestb_local_.construct.next = (ffelexHandler) ffestb_if; | |
7841 | break; | |
7842 | ||
7843 | case FFESTR_firstDO: | |
7844 | ffestb_local_.construct.next = (ffelexHandler) ffestb_do; | |
7845 | break; | |
7846 | ||
7847 | case FFESTR_firstDOWHILE: | |
7848 | ffestb_local_.construct.next = (ffelexHandler) ffestb_dowhile; | |
7849 | break; | |
7850 | ||
7851 | case FFESTR_firstSELECT: | |
7852 | case FFESTR_firstSELECTCASE: | |
7853 | ffestb_local_.construct.next = (ffelexHandler) ffestb_R809; | |
7854 | break; | |
7855 | ||
7856 | default: | |
7857 | goto bad; /* :::::::::::::::::::: */ | |
7858 | } | |
7859 | ffesta_construct_name = ffesta_tokens[0]; | |
7860 | ffesta_tokens[0] = ffelex_token_use (t); | |
7861 | return (ffelexHandler) ffestb_construct2_; | |
7862 | ||
7863 | case FFELEX_typeNAMES: | |
7864 | ffesta_first_kw = ffestr_first (t); | |
7865 | switch (ffesta_first_kw) | |
7866 | { | |
7867 | case FFESTR_firstIF: | |
7868 | if (ffelex_token_length (t) != FFESTR_firstlIF) | |
7869 | goto bad; /* :::::::::::::::::::: */ | |
7870 | ffestb_local_.construct.next = (ffelexHandler) ffestb_if; | |
7871 | break; | |
7872 | ||
7873 | case FFESTR_firstDO: | |
7874 | ffestb_local_.construct.next = (ffelexHandler) ffestb_do; | |
7875 | break; | |
7876 | ||
7877 | case FFESTR_firstDOWHILE: | |
7878 | if (ffelex_token_length (t) != FFESTR_firstlDOWHILE) | |
7879 | goto bad; /* :::::::::::::::::::: */ | |
7880 | ffestb_local_.construct.next = (ffelexHandler) ffestb_dowhile; | |
7881 | break; | |
7882 | ||
7883 | case FFESTR_firstSELECTCASE: | |
7884 | if (ffelex_token_length (t) != FFESTR_firstlSELECTCASE) | |
7885 | goto bad; /* :::::::::::::::::::: */ | |
7886 | ffestb_local_.construct.next = (ffelexHandler) ffestb_R809; | |
7887 | break; | |
7888 | ||
7889 | default: | |
7890 | goto bad; /* :::::::::::::::::::: */ | |
7891 | } | |
7892 | ffesta_construct_name = ffesta_tokens[0]; | |
7893 | ffesta_tokens[0] = ffelex_token_use (t); | |
7894 | return (ffelexHandler) ffestb_construct2_; | |
7895 | ||
7896 | default: | |
7897 | break; | |
7898 | } | |
7899 | ||
7900 | bad: /* :::::::::::::::::::: */ | |
7901 | ffesta_ffebad_2st (FFEBAD_INVALID_STMT_FORM, "CONSTRUCT", | |
7902 | ffesta_tokens[0], t); | |
7903 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7904 | } | |
7905 | ||
7906 | /* ffestb_construct2_ -- NAME COLON "DO/DOWHILE/IF/SELECT/SELECTCASE" | |
7907 | ||
7908 | return ffestb_construct2_; // to lexer | |
7909 | ||
7910 | This extra step is needed to set ffesta_second_kw if the second token | |
7911 | (here) is a NAME, so DO and SELECT can continue to expect it. */ | |
7912 | ||
7913 | static ffelexHandler | |
7914 | ffestb_construct2_ (ffelexToken t) | |
7915 | { | |
7916 | if (ffelex_token_type (t) == FFELEX_typeNAME) | |
7917 | ffesta_second_kw = ffestr_second (t); | |
7918 | return (ffelexHandler) (*ffestb_local_.construct.next) (t); | |
7919 | } | |
7920 | ||
7921 | /* ffestb_heap -- Parse an ALLOCATE/DEALLOCATE statement | |
7922 | ||
7923 | return ffestb_heap; // to lexer | |
7924 | ||
7925 | Make sure the statement has a valid form for an ALLOCATE/DEALLOCATE | |
7926 | statement. If it does, implement the statement. */ | |
7927 | ||
7928 | #if FFESTR_F90 | |
7929 | ffelexHandler | |
7930 | ffestb_heap (ffelexToken t) | |
7931 | { | |
7932 | switch (ffelex_token_type (ffesta_tokens[0])) | |
7933 | { | |
7934 | case FFELEX_typeNAME: | |
7935 | break; | |
7936 | ||
7937 | case FFELEX_typeNAMES: | |
7938 | if (ffelex_token_length (ffesta_tokens[0]) != ffestb_args.heap.len) | |
7939 | goto bad_0; /* :::::::::::::::::::: */ | |
7940 | break; | |
7941 | ||
7942 | default: | |
7943 | goto bad_0; /* :::::::::::::::::::: */ | |
7944 | } | |
7945 | ||
7946 | switch (ffelex_token_type (t)) | |
7947 | { | |
7948 | case FFELEX_typeOPEN_PAREN: | |
7949 | break; | |
7950 | ||
7951 | case FFELEX_typeEOS: | |
7952 | case FFELEX_typeSEMICOLON: | |
7953 | case FFELEX_typeCOMMA: | |
7954 | case FFELEX_typeCOLONCOLON: | |
7955 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
7956 | goto bad_1; /* :::::::::::::::::::: */ | |
7957 | ||
7958 | default: | |
7959 | goto bad_1; /* :::::::::::::::::::: */ | |
7960 | } | |
7961 | ||
7962 | ffestb_local_.heap.exprs = ffestt_exprlist_create (); | |
7963 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
7964 | ffestb_args.heap.ctx, | |
7965 | (ffeexprCallback) ffestb_heap1_); | |
7966 | ||
7967 | bad_0: /* :::::::::::::::::::: */ | |
7968 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, ffesta_tokens[0]); | |
7969 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
7970 | ||
7971 | bad_1: /* :::::::::::::::::::: */ | |
7972 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t); | |
7973 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
7974 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
7975 | } | |
7976 | ||
7977 | /* ffestb_heap1_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr | |
7978 | ||
7979 | (ffestb_heap1_) // to expression handler | |
7980 | ||
7981 | Make sure the next token is COMMA. */ | |
7982 | ||
7983 | static ffelexHandler | |
7984 | ffestb_heap1_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
7985 | { | |
7986 | switch (ffelex_token_type (t)) | |
7987 | { | |
7988 | case FFELEX_typeCOMMA: | |
7989 | if (expr == NULL) | |
7990 | break; | |
7991 | ffestt_exprlist_append (ffestb_local_.heap.exprs, expr, | |
7992 | ffelex_token_use (t)); | |
7993 | return (ffelexHandler) ffestb_heap2_; | |
7994 | ||
7995 | case FFELEX_typeCLOSE_PAREN: | |
7996 | if (expr == NULL) | |
7997 | break; | |
7998 | ffestt_exprlist_append (ffestb_local_.heap.exprs, expr, | |
7999 | ffelex_token_use (t)); | |
8000 | ffesta_tokens[1] = NULL; | |
8001 | ffestb_local_.heap.expr = NULL; | |
8002 | return (ffelexHandler) ffestb_heap5_; | |
8003 | ||
8004 | default: | |
8005 | break; | |
8006 | } | |
8007 | ||
8008 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t); | |
8009 | ffestt_exprlist_kill (ffestb_local_.heap.exprs); | |
8010 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8011 | } | |
8012 | ||
8013 | /* ffestb_heap2_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr COMMA | |
8014 | ||
8015 | return ffestb_heap2_; // to lexer | |
8016 | ||
8017 | Make sure the next token is NAME. */ | |
8018 | ||
8019 | static ffelexHandler | |
8020 | ffestb_heap2_ (ffelexToken t) | |
8021 | { | |
8022 | switch (ffelex_token_type (t)) | |
8023 | { | |
8024 | case FFELEX_typeNAME: | |
8025 | ffesta_tokens[1] = ffelex_token_use (t); | |
8026 | return (ffelexHandler) ffestb_heap3_; | |
8027 | ||
8028 | default: | |
8029 | break; | |
8030 | } | |
8031 | ||
8032 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t); | |
8033 | ffestt_exprlist_kill (ffestb_local_.heap.exprs); | |
8034 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8035 | } | |
8036 | ||
8037 | /* ffestb_heap3_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN expr COMMA NAME | |
8038 | ||
8039 | return ffestb_heap3_; // to lexer | |
8040 | ||
8041 | If token is EQUALS, make sure NAME was "STAT" and handle STAT variable; | |
8042 | else pass NAME and token to expression handler. */ | |
8043 | ||
8044 | static ffelexHandler | |
8045 | ffestb_heap3_ (ffelexToken t) | |
8046 | { | |
8047 | ffelexHandler next; | |
8048 | ||
8049 | switch (ffelex_token_type (t)) | |
8050 | { | |
8051 | case FFELEX_typeEQUALS: | |
8052 | ffesta_confirmed (); | |
8053 | if (ffestr_other (ffesta_tokens[1]) != FFESTR_otherSTAT) | |
8054 | break; | |
8055 | ffelex_token_kill (ffesta_tokens[1]); | |
8056 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
8057 | FFEEXPR_contextHEAPSTAT, | |
8058 | (ffeexprCallback) ffestb_heap4_); | |
8059 | ||
8060 | default: | |
8061 | next = (ffelexHandler) | |
8062 | (*((ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
8063 | ffestb_args.heap.ctx, | |
8064 | (ffeexprCallback) ffestb_heap1_))) | |
8065 | (ffesta_tokens[1]); | |
8066 | ffelex_token_kill (ffesta_tokens[1]); | |
8067 | return (ffelexHandler) (*next) (t); | |
8068 | } | |
8069 | ||
8070 | ffelex_token_kill (ffesta_tokens[1]); | |
8071 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t); | |
8072 | ffestt_exprlist_kill (ffestb_local_.heap.exprs); | |
8073 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8074 | } | |
8075 | ||
8076 | /* ffestb_heap4_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN ... COMMA "STAT" EQUALS | |
8077 | expr | |
8078 | ||
8079 | (ffestb_heap4_) // to expression handler | |
8080 | ||
8081 | Make sure the next token is CLOSE_PAREN. */ | |
8082 | ||
8083 | static ffelexHandler | |
8084 | ffestb_heap4_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
8085 | { | |
8086 | switch (ffelex_token_type (t)) | |
8087 | { | |
8088 | case FFELEX_typeCLOSE_PAREN: | |
8089 | if (expr == NULL) | |
8090 | break; | |
8091 | ffesta_tokens[1] = ffelex_token_use (ft); | |
8092 | ffestb_local_.heap.expr = expr; | |
8093 | return (ffelexHandler) ffestb_heap5_; | |
8094 | ||
8095 | default: | |
8096 | break; | |
8097 | } | |
8098 | ||
8099 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t); | |
8100 | ffestt_exprlist_kill (ffestb_local_.heap.exprs); | |
8101 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8102 | } | |
8103 | ||
8104 | /* ffestb_heap5_ -- "ALLOCATE/DEALLOCATE" OPEN_PAREN ... CLOSE_PAREN | |
8105 | ||
8106 | return ffestb_heap5_; // to lexer | |
8107 | ||
8108 | Make sure the next token is EOS/SEMICOLON. */ | |
8109 | ||
8110 | static ffelexHandler | |
8111 | ffestb_heap5_ (ffelexToken t) | |
8112 | { | |
8113 | switch (ffelex_token_type (t)) | |
8114 | { | |
8115 | case FFELEX_typeEOS: | |
8116 | case FFELEX_typeSEMICOLON: | |
8117 | ffesta_confirmed (); | |
8118 | if (!ffesta_is_inhibited ()) | |
8119 | if (ffesta_first_kw == FFESTR_firstALLOCATE) | |
8120 | ffestc_R620 (ffestb_local_.heap.exprs, ffestb_local_.heap.expr, | |
8121 | ffesta_tokens[1]); | |
8122 | else | |
8123 | ffestc_R625 (ffestb_local_.heap.exprs, ffestb_local_.heap.expr, | |
8124 | ffesta_tokens[1]); | |
8125 | ffestt_exprlist_kill (ffestb_local_.heap.exprs); | |
8126 | if (ffesta_tokens[1] != NULL) | |
8127 | ffelex_token_kill (ffesta_tokens[1]); | |
8128 | return (ffelexHandler) ffesta_zero (t); | |
8129 | ||
8130 | default: | |
8131 | break; | |
8132 | } | |
8133 | ||
8134 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.heap.badname, t); | |
8135 | ffestt_exprlist_kill (ffestb_local_.heap.exprs); | |
8136 | if (ffesta_tokens[1] != NULL) | |
8137 | ffelex_token_kill (ffesta_tokens[1]); | |
8138 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8139 | } | |
8140 | ||
8141 | #endif | |
8142 | /* ffestb_module -- Parse the MODULEPROCEDURE statement | |
8143 | ||
8144 | return ffestb_module; // to lexer | |
8145 | ||
8146 | Make sure the statement has a valid form for the MODULEPROCEDURE statement. | |
8147 | If it does, implement the statement. | |
8148 | ||
8149 | 31-May-90 JCB 1.1 | |
8150 | Confirm NAME==MODULE followed by standard four invalid tokens, so we | |
8151 | get decent message if somebody forgets that MODULE requires a name. */ | |
8152 | ||
8153 | #if FFESTR_F90 | |
8154 | ffelexHandler | |
8155 | ffestb_module (ffelexToken t) | |
8156 | { | |
8157 | ffeTokenLength i; | |
8158 | char *p; | |
8159 | ffelexToken nt; | |
8160 | ffelexToken mt; /* Name in MODULE PROCEDUREname, i.e. | |
8161 | includes "PROCEDURE". */ | |
8162 | ||
8163 | switch (ffelex_token_type (ffesta_tokens[0])) | |
8164 | { | |
8165 | case FFELEX_typeNAME: | |
8166 | if (ffesta_first_kw != FFESTR_firstMODULE) | |
8167 | goto bad_0; /* :::::::::::::::::::: */ | |
8168 | switch (ffelex_token_type (t)) | |
8169 | { | |
8170 | case FFELEX_typeNAME: | |
8171 | break; | |
8172 | ||
8173 | case FFELEX_typeCOLONCOLON: | |
8174 | case FFELEX_typeCOMMA: | |
8175 | case FFELEX_typeEOS: | |
8176 | case FFELEX_typeSEMICOLON: | |
8177 | ffesta_confirmed (); | |
8178 | goto bad_1m; /* :::::::::::::::::::: */ | |
8179 | ||
8180 | default: | |
8181 | goto bad_1m; /* :::::::::::::::::::: */ | |
8182 | } | |
8183 | ||
8184 | ffesta_confirmed (); | |
8185 | if (ffesta_second_kw != FFESTR_secondPROCEDURE) | |
8186 | { | |
8187 | ffesta_tokens[1] = ffelex_token_use (t); | |
8188 | return (ffelexHandler) ffestb_module3_; | |
8189 | } | |
8190 | ffestb_local_.moduleprocedure.started = FALSE; | |
8191 | ffesta_tokens[1] = ffelex_token_use (t); | |
8192 | return (ffelexHandler) ffestb_module1_; | |
8193 | ||
8194 | case FFELEX_typeNAMES: | |
8195 | p = ffelex_token_text (ffesta_tokens[0]) | |
8196 | + (i = FFESTR_firstlMODULEPROCEDURE); | |
8197 | if ((ffesta_first_kw == FFESTR_firstMODULE) | |
8198 | || ((ffesta_first_kw == FFESTR_firstMODULEPROCEDURE) | |
8199 | && !ffesrc_is_name_init (*p))) | |
8200 | { /* Definitely not "MODULE PROCEDURE name". */ | |
8201 | switch (ffelex_token_type (t)) | |
8202 | { | |
8203 | case FFELEX_typeCOMMA: | |
8204 | case FFELEX_typeCOLONCOLON: | |
8205 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8206 | goto bad_1m; /* :::::::::::::::::::: */ | |
8207 | ||
8208 | default: | |
8209 | goto bad_1m; /* :::::::::::::::::::: */ | |
8210 | ||
8211 | case FFELEX_typeEOS: | |
8212 | case FFELEX_typeSEMICOLON: | |
8213 | ffesta_confirmed (); | |
8214 | break; | |
8215 | } | |
8216 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlMODULE); | |
8217 | if (!ffesrc_is_name_init (*p)) | |
8218 | goto bad_im; /* :::::::::::::::::::: */ | |
8219 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
8220 | if (!ffesta_is_inhibited ()) | |
8221 | ffestc_R1105 (nt); | |
8222 | ffelex_token_kill (nt); | |
8223 | return (ffelexHandler) ffesta_zero (t); | |
8224 | } | |
8225 | ||
8226 | /* Here we know that we're indeed looking at a MODULEPROCEDURE | |
8227 | statement rather than MODULE and that the character following | |
8228 | MODULEPROCEDURE in the NAMES token is a valid first character for a | |
8229 | NAME. This means that unless the second token is COMMA, we have an | |
8230 | ambiguous statement that can be read either as MODULE PROCEDURE name | |
8231 | or MODULE PROCEDUREname, the former being an R1205, the latter an | |
8232 | R1105. */ | |
8233 | ||
8234 | if (ffesta_first_kw != FFESTR_firstMODULEPROCEDURE) | |
8235 | goto bad_0; /* :::::::::::::::::::: */ | |
8236 | switch (ffelex_token_type (t)) | |
8237 | { | |
8238 | case FFELEX_typeCOLONCOLON: | |
8239 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8240 | goto bad_1; /* :::::::::::::::::::: */ | |
8241 | ||
8242 | default: | |
8243 | goto bad_1; /* :::::::::::::::::::: */ | |
8244 | ||
8245 | case FFELEX_typeCOMMA: /* Aha, clearly not MODULE PROCEDUREname. */ | |
8246 | ffesta_confirmed (); | |
8247 | ffestb_local_.moduleprocedure.started = FALSE; | |
8248 | ffesta_tokens[1] | |
8249 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
8250 | return (ffelexHandler) ffestb_module2_ (t); | |
8251 | ||
8252 | case FFELEX_typeEOS: /* MODULE PROCEDURE name or MODULE | |
8253 | PROCEDUREname. */ | |
8254 | case FFELEX_typeSEMICOLON: | |
8255 | ffesta_confirmed (); | |
8256 | break; | |
8257 | } | |
8258 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
8259 | mt = ffelex_token_name_from_names (ffesta_tokens[0], FFESTR_firstlMODULE, | |
8260 | 0); | |
8261 | if (!ffesta_is_inhibited ()) | |
8262 | ffestc_module (mt, nt); /* Implement ambiguous statement. */ | |
8263 | ffelex_token_kill (nt); | |
8264 | ffelex_token_kill (mt); | |
8265 | return (ffelexHandler) ffesta_zero (t); | |
8266 | ||
8267 | default: | |
8268 | goto bad_0; /* :::::::::::::::::::: */ | |
8269 | } | |
8270 | ||
8271 | bad_0: /* :::::::::::::::::::: */ | |
8272 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", ffesta_tokens[0]); | |
8273 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8274 | ||
8275 | bad_1: /* :::::::::::::::::::: */ | |
8276 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t); | |
8277 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
8278 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
8279 | ||
8280 | bad_1m: /* :::::::::::::::::::: */ | |
8281 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE", t); | |
8282 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
8283 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
8284 | ||
8285 | bad_im: /* :::::::::::::::::::: */ | |
8286 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "MODULE", ffesta_tokens[0], i, t); | |
8287 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8288 | } | |
8289 | ||
8290 | /* ffestb_module1_ -- "MODULEPROCEDURE" or "MODULE" "PROCEDURE" | |
8291 | ||
8292 | return ffestb_module1_; // to lexer | |
8293 | ||
8294 | Make sure the statement has a valid form for the MODULEPROCEDURE statement. If it | |
8295 | does, implement the statement. */ | |
8296 | ||
8297 | static ffelexHandler | |
8298 | ffestb_module1_ (ffelexToken t) | |
8299 | { | |
8300 | switch (ffelex_token_type (t)) | |
8301 | { | |
8302 | case FFELEX_typeNAME: | |
8303 | if (!ffestb_local_.moduleprocedure.started | |
8304 | && (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME)) | |
8305 | { | |
8306 | ffesta_confirmed (); | |
8307 | ffelex_token_kill (ffesta_tokens[1]); | |
8308 | } | |
8309 | ffesta_tokens[1] = ffelex_token_use (t); | |
8310 | return (ffelexHandler) ffestb_module2_; | |
8311 | ||
8312 | case FFELEX_typeEOS: | |
8313 | case FFELEX_typeSEMICOLON: | |
8314 | if (ffestb_local_.moduleprocedure.started) | |
8315 | break; /* Error if we've already seen NAME COMMA. */ | |
8316 | ffesta_confirmed (); | |
8317 | if (!ffesta_is_inhibited ()) | |
8318 | ffestc_R1105 (ffesta_tokens[1]); | |
8319 | ffelex_token_kill (ffesta_tokens[1]); | |
8320 | return (ffelexHandler) ffesta_zero (t); | |
8321 | ||
8322 | case FFELEX_typeCOMMA: | |
8323 | case FFELEX_typeCOLONCOLON: | |
8324 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8325 | break; | |
8326 | ||
8327 | default: | |
8328 | break; | |
8329 | } | |
8330 | ||
8331 | if (ffestb_local_.moduleprocedure.started && !ffesta_is_inhibited ()) | |
8332 | ffestc_R1205_finish (); | |
8333 | else if (!ffestb_local_.moduleprocedure.started) | |
8334 | ffelex_token_kill (ffesta_tokens[1]); | |
8335 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t); | |
8336 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8337 | } | |
8338 | ||
8339 | /* ffestb_module2_ -- "MODULE/PROCEDURE" NAME | |
8340 | ||
8341 | return ffestb_module2_; // to lexer | |
8342 | ||
8343 | Make sure the statement has a valid form for the MODULEPROCEDURE statement. If it | |
8344 | does, implement the statement. */ | |
8345 | ||
8346 | static ffelexHandler | |
8347 | ffestb_module2_ (ffelexToken t) | |
8348 | { | |
8349 | switch (ffelex_token_type (t)) | |
8350 | { | |
8351 | case FFELEX_typeEOS: | |
8352 | case FFELEX_typeSEMICOLON: | |
8353 | if (!ffestb_local_.moduleprocedure.started) | |
8354 | { | |
8355 | ffesta_confirmed (); | |
8356 | if (!ffesta_is_inhibited ()) | |
8357 | ffestc_R1205_start (); | |
8358 | } | |
8359 | if (!ffesta_is_inhibited ()) | |
8360 | { | |
8361 | ffestc_R1205_item (ffesta_tokens[1]); | |
8362 | ffestc_R1205_finish (); | |
8363 | } | |
8364 | ffelex_token_kill (ffesta_tokens[1]); | |
8365 | return (ffelexHandler) ffesta_zero (t); | |
8366 | ||
8367 | case FFELEX_typeCOMMA: | |
8368 | if (!ffestb_local_.moduleprocedure.started) | |
8369 | { | |
8370 | ffestb_local_.moduleprocedure.started = TRUE; | |
8371 | ffesta_confirmed (); | |
8372 | if (!ffesta_is_inhibited ()) | |
8373 | ffestc_R1205_start (); | |
8374 | } | |
8375 | if (!ffesta_is_inhibited ()) | |
8376 | ffestc_R1205_item (ffesta_tokens[1]); | |
8377 | ffelex_token_kill (ffesta_tokens[1]); | |
8378 | return (ffelexHandler) ffestb_module1_; | |
8379 | ||
8380 | default: | |
8381 | break; | |
8382 | } | |
8383 | ||
8384 | if (ffestb_local_.moduleprocedure.started && !ffesta_is_inhibited ()) | |
8385 | ffestc_R1205_finish (); | |
8386 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE PROCEDURE", t); | |
8387 | ffelex_token_kill (ffesta_tokens[1]); | |
8388 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8389 | } | |
8390 | ||
8391 | /* ffestb_module3_ -- "MODULE" NAME | |
8392 | ||
8393 | return ffestb_module3_; // to lexer | |
8394 | ||
8395 | Make sure the statement has a valid form for the MODULE statement. If it | |
8396 | does, implement the statement. */ | |
8397 | ||
8398 | static ffelexHandler | |
8399 | ffestb_module3_ (ffelexToken t) | |
8400 | { | |
8401 | switch (ffelex_token_type (t)) | |
8402 | { | |
8403 | case FFELEX_typeEOS: | |
8404 | case FFELEX_typeSEMICOLON: | |
8405 | if (!ffesta_is_inhibited ()) | |
8406 | ffestc_R1105 (ffesta_tokens[1]); | |
8407 | ffelex_token_kill (ffesta_tokens[1]); | |
8408 | return (ffelexHandler) ffesta_zero (t); | |
8409 | ||
8410 | default: | |
8411 | break; | |
8412 | } | |
8413 | ||
8414 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MODULE", t); | |
8415 | ffelex_token_kill (ffesta_tokens[1]); | |
8416 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8417 | } | |
8418 | ||
8419 | #endif | |
8420 | /* ffestb_R809 -- Parse the SELECTCASE statement | |
8421 | ||
8422 | return ffestb_R809; // to lexer | |
8423 | ||
8424 | Make sure the statement has a valid form for the SELECTCASE statement. | |
8425 | If it does, implement the statement. */ | |
8426 | ||
8427 | ffelexHandler | |
8428 | ffestb_R809 (ffelexToken t) | |
8429 | { | |
8430 | ffeTokenLength i; | |
8431 | char *p; | |
8432 | ||
8433 | switch (ffelex_token_type (ffesta_tokens[0])) | |
8434 | { | |
8435 | case FFELEX_typeNAME: | |
8436 | switch (ffesta_first_kw) | |
8437 | { | |
8438 | case FFESTR_firstSELECT: | |
8439 | if ((ffelex_token_type (t) != FFELEX_typeNAME) | |
8440 | || (ffesta_second_kw != FFESTR_secondCASE)) | |
8441 | goto bad_1; /* :::::::::::::::::::: */ | |
8442 | ffesta_confirmed (); | |
8443 | return (ffelexHandler) ffestb_R8091_; | |
8444 | ||
8445 | case FFESTR_firstSELECTCASE: | |
8446 | return (ffelexHandler) ffestb_R8091_ (t); | |
8447 | ||
8448 | default: | |
8449 | goto bad_0; /* :::::::::::::::::::: */ | |
8450 | } | |
8451 | ||
8452 | case FFELEX_typeNAMES: | |
8453 | if (ffesta_first_kw != FFESTR_firstSELECTCASE) | |
8454 | goto bad_0; /* :::::::::::::::::::: */ | |
8455 | switch (ffelex_token_type (t)) | |
8456 | { | |
8457 | case FFELEX_typeCOMMA: | |
8458 | case FFELEX_typeEOS: | |
8459 | case FFELEX_typeSEMICOLON: | |
8460 | case FFELEX_typeCOLONCOLON: | |
8461 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8462 | goto bad_1; /* :::::::::::::::::::: */ | |
8463 | ||
8464 | default: | |
8465 | goto bad_1; /* :::::::::::::::::::: */ | |
8466 | ||
8467 | case FFELEX_typeOPEN_PAREN: | |
8468 | break; | |
8469 | } | |
8470 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSELECTCASE); | |
8471 | if (*p != '\0') | |
8472 | goto bad_i; /* :::::::::::::::::::: */ | |
8473 | return (ffelexHandler) ffestb_R8091_ (t); | |
8474 | ||
8475 | default: | |
8476 | goto bad_0; /* :::::::::::::::::::: */ | |
8477 | } | |
8478 | ||
8479 | bad_0: /* :::::::::::::::::::: */ | |
8480 | if (ffesta_construct_name != NULL) | |
8481 | { | |
8482 | ffelex_token_kill (ffesta_construct_name); | |
8483 | ffesta_construct_name = NULL; | |
8484 | } | |
8485 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", ffesta_tokens[0]); | |
8486 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8487 | ||
8488 | bad_1: /* :::::::::::::::::::: */ | |
8489 | if (ffesta_construct_name != NULL) | |
8490 | { | |
8491 | ffelex_token_kill (ffesta_construct_name); | |
8492 | ffesta_construct_name = NULL; | |
8493 | } | |
8494 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t); | |
8495 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
8496 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
8497 | ||
8498 | bad_i: /* :::::::::::::::::::: */ | |
8499 | if (ffesta_construct_name != NULL) | |
8500 | { | |
8501 | ffelex_token_kill (ffesta_construct_name); | |
8502 | ffesta_construct_name = NULL; | |
8503 | } | |
8504 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", ffesta_tokens[0], i, t); | |
8505 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8506 | } | |
8507 | ||
8508 | /* ffestb_R8091_ -- "SELECTCASE" or "SELECT" "CASE" | |
8509 | ||
8510 | return ffestb_R8091_; // to lexer | |
8511 | ||
8512 | Make sure the statement has a valid form for the SELECTCASE statement. If it | |
8513 | does, implement the statement. */ | |
8514 | ||
8515 | static ffelexHandler | |
8516 | ffestb_R8091_ (ffelexToken t) | |
8517 | { | |
8518 | switch (ffelex_token_type (t)) | |
8519 | { | |
8520 | case FFELEX_typeOPEN_PAREN: | |
8521 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
8522 | FFEEXPR_contextSELECTCASE, (ffeexprCallback) ffestb_R8092_); | |
8523 | ||
8524 | case FFELEX_typeEOS: | |
8525 | case FFELEX_typeSEMICOLON: | |
8526 | case FFELEX_typeCOMMA: | |
8527 | case FFELEX_typeCOLONCOLON: | |
8528 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8529 | break; | |
8530 | ||
8531 | default: | |
8532 | break; | |
8533 | } | |
8534 | ||
8535 | if (ffesta_construct_name != NULL) | |
8536 | { | |
8537 | ffelex_token_kill (ffesta_construct_name); | |
8538 | ffesta_construct_name = NULL; | |
8539 | } | |
8540 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t); | |
8541 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8542 | } | |
8543 | ||
8544 | /* ffestb_R8092_ -- "SELECT/CASE" OPEN_PAREN expr | |
8545 | ||
8546 | (ffestb_R8092_) // to expression handler | |
8547 | ||
8548 | Make sure the statement has a valid form for the SELECTCASE statement. If it | |
8549 | does, implement the statement. */ | |
8550 | ||
8551 | static ffelexHandler | |
8552 | ffestb_R8092_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
8553 | { | |
8554 | switch (ffelex_token_type (t)) | |
8555 | { | |
8556 | case FFELEX_typeCLOSE_PAREN: | |
8557 | if (expr == NULL) | |
8558 | break; | |
8559 | ffesta_tokens[1] = ffelex_token_use (ft); | |
8560 | ffestb_local_.selectcase.expr = expr; | |
8561 | return (ffelexHandler) ffestb_R8093_; | |
8562 | ||
8563 | default: | |
8564 | break; | |
8565 | } | |
8566 | ||
8567 | if (ffesta_construct_name != NULL) | |
8568 | { | |
8569 | ffelex_token_kill (ffesta_construct_name); | |
8570 | ffesta_construct_name = NULL; | |
8571 | } | |
8572 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t); | |
8573 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8574 | } | |
8575 | ||
8576 | /* ffestb_R8093_ -- "SELECT/CASE" OPEN_PAREN expr CLOSE_PAREN | |
8577 | ||
8578 | return ffestb_R8093_; // to lexer | |
8579 | ||
8580 | Make sure the statement has a valid form for the SELECTCASE statement. If it | |
8581 | does, implement the statement. */ | |
8582 | ||
8583 | static ffelexHandler | |
8584 | ffestb_R8093_ (ffelexToken t) | |
8585 | { | |
8586 | switch (ffelex_token_type (t)) | |
8587 | { | |
8588 | case FFELEX_typeEOS: | |
8589 | case FFELEX_typeSEMICOLON: | |
8590 | ffesta_confirmed (); | |
8591 | if (!ffesta_is_inhibited ()) | |
8592 | ffestc_R809 (ffesta_construct_name, ffestb_local_.selectcase.expr, | |
8593 | ffesta_tokens[1]); | |
8594 | ffelex_token_kill (ffesta_tokens[1]); | |
8595 | if (ffesta_construct_name != NULL) | |
8596 | { | |
8597 | ffelex_token_kill (ffesta_construct_name); | |
8598 | ffesta_construct_name = NULL; | |
8599 | } | |
8600 | return ffesta_zero (t); | |
8601 | ||
8602 | case FFELEX_typeCOMMA: | |
8603 | case FFELEX_typeCOLONCOLON: | |
8604 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8605 | break; | |
8606 | ||
8607 | default: | |
8608 | break; | |
8609 | } | |
8610 | ||
8611 | ffelex_token_kill (ffesta_tokens[1]); | |
8612 | if (ffesta_construct_name != NULL) | |
8613 | { | |
8614 | ffelex_token_kill (ffesta_construct_name); | |
8615 | ffesta_construct_name = NULL; | |
8616 | } | |
8617 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "SELECT CASE", t); | |
8618 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8619 | } | |
8620 | ||
8621 | /* ffestb_R810 -- Parse the CASE statement | |
8622 | ||
8623 | return ffestb_R810; // to lexer | |
8624 | ||
8625 | Make sure the statement has a valid form for the CASE statement. | |
8626 | If it does, implement the statement. */ | |
8627 | ||
8628 | ffelexHandler | |
8629 | ffestb_R810 (ffelexToken t) | |
8630 | { | |
8631 | ffeTokenLength i; | |
8632 | char *p; | |
8633 | ||
8634 | switch (ffelex_token_type (ffesta_tokens[0])) | |
8635 | { | |
8636 | case FFELEX_typeNAME: | |
8637 | if (ffesta_first_kw != FFESTR_firstCASE) | |
8638 | goto bad_0; /* :::::::::::::::::::: */ | |
8639 | switch (ffelex_token_type (t)) | |
8640 | { | |
8641 | case FFELEX_typeCOMMA: | |
8642 | case FFELEX_typeEOS: | |
8643 | case FFELEX_typeSEMICOLON: | |
8644 | case FFELEX_typeCOLONCOLON: | |
8645 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8646 | goto bad_1; /* :::::::::::::::::::: */ | |
8647 | ||
8648 | default: | |
8649 | goto bad_1; /* :::::::::::::::::::: */ | |
8650 | ||
8651 | case FFELEX_typeNAME: | |
8652 | ffesta_confirmed (); | |
8653 | if (ffesta_second_kw != FFESTR_secondDEFAULT) | |
8654 | goto bad_1; /* :::::::::::::::::::: */ | |
8655 | ffestb_local_.case_stmt.cases = NULL; | |
8656 | return (ffelexHandler) ffestb_R8101_; | |
8657 | ||
8658 | case FFELEX_typeOPEN_PAREN: | |
8659 | ffestb_local_.case_stmt.cases = ffestt_caselist_create (); | |
8660 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
8661 | FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_); | |
8662 | } | |
8663 | ||
8664 | case FFELEX_typeNAMES: | |
8665 | switch (ffesta_first_kw) | |
8666 | { | |
8667 | case FFESTR_firstCASEDEFAULT: | |
8668 | switch (ffelex_token_type (t)) | |
8669 | { | |
8670 | case FFELEX_typeCOMMA: | |
8671 | case FFELEX_typeCOLONCOLON: | |
8672 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8673 | goto bad_1; /* :::::::::::::::::::: */ | |
8674 | ||
8675 | default: | |
8676 | goto bad_1; /* :::::::::::::::::::: */ | |
8677 | ||
8678 | case FFELEX_typeEOS: | |
8679 | case FFELEX_typeSEMICOLON: | |
8680 | ffesta_confirmed (); | |
8681 | break; | |
8682 | } | |
8683 | ffestb_local_.case_stmt.cases = NULL; | |
8684 | p = ffelex_token_text (ffesta_tokens[0]) | |
8685 | + (i = FFESTR_firstlCASEDEFAULT); | |
8686 | if (*p == '\0') | |
8687 | return (ffelexHandler) ffestb_R8101_ (t); | |
8688 | if (!ffesrc_is_name_init (*p)) | |
8689 | goto bad_i; /* :::::::::::::::::::: */ | |
8690 | ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i, | |
8691 | 0); | |
8692 | return (ffelexHandler) ffestb_R8102_ (t); | |
8693 | ||
8694 | case FFESTR_firstCASE: | |
8695 | break; | |
8696 | ||
8697 | default: | |
8698 | goto bad_0; /* :::::::::::::::::::: */ | |
8699 | } | |
8700 | ||
8701 | switch (ffelex_token_type (t)) | |
8702 | { | |
8703 | case FFELEX_typeCOMMA: | |
8704 | case FFELEX_typeEOS: | |
8705 | case FFELEX_typeSEMICOLON: | |
8706 | case FFELEX_typeCOLONCOLON: | |
8707 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8708 | goto bad_1; /* :::::::::::::::::::: */ | |
8709 | ||
8710 | default: | |
8711 | goto bad_1; /* :::::::::::::::::::: */ | |
8712 | ||
8713 | case FFELEX_typeOPEN_PAREN: | |
8714 | break; | |
8715 | } | |
8716 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCASE); | |
8717 | if (*p != '\0') | |
8718 | goto bad_i; /* :::::::::::::::::::: */ | |
8719 | ffestb_local_.case_stmt.cases = ffestt_caselist_create (); | |
8720 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
8721 | FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_); | |
8722 | ||
8723 | default: | |
8724 | goto bad_0; /* :::::::::::::::::::: */ | |
8725 | } | |
8726 | ||
8727 | bad_0: /* :::::::::::::::::::: */ | |
8728 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", ffesta_tokens[0]); | |
8729 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8730 | ||
8731 | bad_1: /* :::::::::::::::::::: */ | |
8732 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t); | |
8733 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
8734 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
8735 | ||
8736 | bad_i: /* :::::::::::::::::::: */ | |
8737 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "CASE", ffesta_tokens[0], i, t); | |
8738 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8739 | } | |
8740 | ||
8741 | /* ffestb_R8101_ -- "CASE" case-selector | |
8742 | ||
8743 | return ffestb_R8101_; // to lexer | |
8744 | ||
8745 | Make sure the statement has a valid form for the CASE statement. If it | |
8746 | does, implement the statement. */ | |
8747 | ||
8748 | static ffelexHandler | |
8749 | ffestb_R8101_ (ffelexToken t) | |
8750 | { | |
8751 | switch (ffelex_token_type (t)) | |
8752 | { | |
8753 | case FFELEX_typeNAME: | |
8754 | ffesta_tokens[1] = ffelex_token_use (t); | |
8755 | return (ffelexHandler) ffestb_R8102_; | |
8756 | ||
8757 | case FFELEX_typeEOS: | |
8758 | case FFELEX_typeSEMICOLON: | |
8759 | ffesta_tokens[1] = NULL; | |
8760 | return (ffelexHandler) ffestb_R8102_ (t); | |
8761 | ||
8762 | case FFELEX_typeCOMMA: | |
8763 | case FFELEX_typeCOLONCOLON: | |
8764 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8765 | break; | |
8766 | ||
8767 | default: | |
8768 | break; | |
8769 | } | |
8770 | ||
8771 | if (ffestb_local_.case_stmt.cases != NULL) | |
8772 | ffestt_caselist_kill (ffestb_local_.case_stmt.cases); | |
8773 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t); | |
8774 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8775 | } | |
8776 | ||
8777 | /* ffestb_R8102_ -- "CASE" case-selector [NAME] | |
8778 | ||
8779 | return ffestb_R8102_; // to lexer | |
8780 | ||
8781 | Make sure the statement has a valid form for the CASE statement. If it | |
8782 | does, implement the statement. */ | |
8783 | ||
8784 | static ffelexHandler | |
8785 | ffestb_R8102_ (ffelexToken t) | |
8786 | { | |
8787 | switch (ffelex_token_type (t)) | |
8788 | { | |
8789 | case FFELEX_typeEOS: | |
8790 | case FFELEX_typeSEMICOLON: | |
8791 | ffesta_confirmed (); | |
8792 | if (!ffesta_is_inhibited ()) | |
8793 | ffestc_R810 (ffestb_local_.case_stmt.cases, ffesta_tokens[1]); | |
8794 | if (ffestb_local_.case_stmt.cases != NULL) | |
8795 | ffestt_caselist_kill (ffestb_local_.case_stmt.cases); | |
8796 | if (ffesta_tokens[1] != NULL) | |
8797 | ffelex_token_kill (ffesta_tokens[1]); | |
8798 | return (ffelexHandler) ffesta_zero (t); | |
8799 | ||
8800 | case FFELEX_typeCOMMA: | |
8801 | case FFELEX_typeCOLONCOLON: | |
8802 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8803 | break; | |
8804 | ||
8805 | default: | |
8806 | break; | |
8807 | } | |
8808 | ||
8809 | if (ffestb_local_.case_stmt.cases != NULL) | |
8810 | ffestt_caselist_kill (ffestb_local_.case_stmt.cases); | |
8811 | if (ffesta_tokens[1] != NULL) | |
8812 | ffelex_token_kill (ffesta_tokens[1]); | |
8813 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t); | |
8814 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8815 | } | |
8816 | ||
8817 | /* ffestb_R8103_ -- "CASE" OPEN_PAREN expr | |
8818 | ||
8819 | (ffestb_R8103_) // to expression handler | |
8820 | ||
8821 | Make sure the statement has a valid form for the CASE statement. If it | |
8822 | does, implement the statement. */ | |
8823 | ||
8824 | static ffelexHandler | |
8825 | ffestb_R8103_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
8826 | { | |
8827 | switch (ffelex_token_type (t)) | |
8828 | { | |
8829 | case FFELEX_typeCLOSE_PAREN: | |
8830 | ffestt_caselist_append (ffestb_local_.case_stmt.cases, FALSE, expr, NULL, | |
8831 | ffelex_token_use (ft)); | |
8832 | return (ffelexHandler) ffestb_R8101_; | |
8833 | ||
8834 | case FFELEX_typeCOMMA: | |
8835 | ffestt_caselist_append (ffestb_local_.case_stmt.cases, FALSE, expr, NULL, | |
8836 | ffelex_token_use (ft)); | |
8837 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
8838 | FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_); | |
8839 | ||
8840 | case FFELEX_typeCOLON: | |
8841 | ffestt_caselist_append (ffestb_local_.case_stmt.cases, TRUE, expr, NULL, | |
8842 | ffelex_token_use (ft)); /* NULL second expr for | |
8843 | now, just plug in. */ | |
8844 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
8845 | FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8104_); | |
8846 | ||
8847 | default: | |
8848 | break; | |
8849 | } | |
8850 | ||
8851 | ffestt_caselist_kill (ffestb_local_.case_stmt.cases); | |
8852 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t); | |
8853 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8854 | } | |
8855 | ||
8856 | /* ffestb_R8104_ -- "CASE" OPEN_PAREN expr COLON expr | |
8857 | ||
8858 | (ffestb_R8104_) // to expression handler | |
8859 | ||
8860 | Make sure the statement has a valid form for the CASE statement. If it | |
8861 | does, implement the statement. */ | |
8862 | ||
8863 | static ffelexHandler | |
8864 | ffestb_R8104_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t) | |
8865 | { | |
8866 | switch (ffelex_token_type (t)) | |
8867 | { | |
8868 | case FFELEX_typeCLOSE_PAREN: | |
8869 | ffestb_local_.case_stmt.cases->previous->expr2 = expr; | |
8870 | return (ffelexHandler) ffestb_R8101_; | |
8871 | ||
8872 | case FFELEX_typeCOMMA: | |
8873 | ffestb_local_.case_stmt.cases->previous->expr2 = expr; | |
8874 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
8875 | FFEEXPR_contextCASE, (ffeexprCallback) ffestb_R8103_); | |
8876 | ||
8877 | default: | |
8878 | break; | |
8879 | } | |
8880 | ||
8881 | ffestt_caselist_kill (ffestb_local_.case_stmt.cases); | |
8882 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CASE", t); | |
8883 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8884 | } | |
8885 | ||
8886 | /* ffestb_R1001 -- Parse a FORMAT statement | |
8887 | ||
8888 | return ffestb_R1001; // to lexer | |
8889 | ||
8890 | Make sure the statement has a valid form for an FORMAT statement. | |
8891 | If it does, implement the statement. */ | |
8892 | ||
8893 | ffelexHandler | |
8894 | ffestb_R1001 (ffelexToken t) | |
8895 | { | |
8896 | ffesttFormatList f; | |
8897 | ||
8898 | switch (ffelex_token_type (ffesta_tokens[0])) | |
8899 | { | |
8900 | case FFELEX_typeNAME: | |
8901 | if (ffesta_first_kw != FFESTR_firstFORMAT) | |
8902 | goto bad_0; /* :::::::::::::::::::: */ | |
8903 | break; | |
8904 | ||
8905 | case FFELEX_typeNAMES: | |
8906 | if (ffesta_first_kw != FFESTR_firstFORMAT) | |
8907 | goto bad_0; /* :::::::::::::::::::: */ | |
8908 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlFORMAT) | |
8909 | goto bad_0; /* :::::::::::::::::::: */ | |
8910 | break; | |
8911 | ||
8912 | default: | |
8913 | goto bad_0; /* :::::::::::::::::::: */ | |
8914 | } | |
8915 | ||
8916 | switch (ffelex_token_type (t)) | |
8917 | { | |
8918 | case FFELEX_typeOPEN_PAREN: | |
8919 | ffestb_local_.format.complained = FALSE; | |
8920 | ffestb_local_.format.f = NULL; /* No parent yet. */ | |
8921 | ffestb_local_.format.f = ffestt_formatlist_create (NULL, | |
8922 | ffelex_token_use (t)); | |
8923 | ffelex_set_names_pure (TRUE); /* Have even free-form lexer give us | |
8924 | NAMES. */ | |
8925 | return (ffelexHandler) ffestb_R10011_; | |
8926 | ||
8927 | case FFELEX_typeOPEN_ARRAY:/* "(/". */ | |
8928 | ffesta_confirmed (); | |
8929 | ffestb_local_.format.complained = FALSE; | |
8930 | ffestb_local_.format.f = ffestt_formatlist_create (NULL, | |
8931 | ffelex_token_use (t)); | |
8932 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
8933 | f->type = FFESTP_formattypeSLASH; | |
8934 | f->t = ffelex_token_use (t); | |
8935 | f->u.R1010.val.present = FALSE; | |
8936 | f->u.R1010.val.rtexpr = FALSE; | |
8937 | f->u.R1010.val.t = NULL; | |
8938 | f->u.R1010.val.u.unsigned_val = 1; | |
8939 | ffelex_set_names_pure (TRUE); /* Have even free-form lexer give us | |
8940 | NAMES. */ | |
8941 | return (ffelexHandler) ffestb_R100112_; | |
8942 | ||
8943 | case FFELEX_typeEOS: | |
8944 | case FFELEX_typeSEMICOLON: | |
8945 | case FFELEX_typeCOMMA: | |
8946 | case FFELEX_typeCOLONCOLON: | |
8947 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
8948 | goto bad_1; /* :::::::::::::::::::: */ | |
8949 | ||
8950 | default: | |
8951 | goto bad_1; /* :::::::::::::::::::: */ | |
8952 | } | |
8953 | ||
8954 | bad_0: /* :::::::::::::::::::: */ | |
8955 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", ffesta_tokens[0]); | |
8956 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
8957 | ||
8958 | bad_1: /* :::::::::::::::::::: */ | |
8959 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
8960 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
8961 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
8962 | } | |
8963 | ||
8964 | /* ffestb_R10011_ -- "FORMAT" OPEN_PAREN expr | |
8965 | ||
8966 | return ffestb_R10011_; // to lexer | |
8967 | ||
8968 | For CLOSE_PAREN, wrap up the format list and if it is the top-level one, | |
8969 | exit. For anything else, pass it to _2_. */ | |
8970 | ||
8971 | static ffelexHandler | |
8972 | ffestb_R10011_ (ffelexToken t) | |
8973 | { | |
8974 | ffesttFormatList f; | |
8975 | ||
8976 | switch (ffelex_token_type (t)) | |
8977 | { | |
8978 | case FFELEX_typeCLOSE_PAREN: | |
8979 | break; | |
8980 | ||
8981 | default: | |
8982 | return (ffelexHandler) ffestb_R10012_ (t); | |
8983 | } | |
8984 | ||
8985 | /* If we have a format we're working on, continue working on it. */ | |
8986 | ||
8987 | f = ffestb_local_.format.f->u.root.parent; | |
8988 | ||
8989 | if (f != NULL) | |
8990 | { | |
8991 | ffestb_local_.format.f = f->next; | |
8992 | return (ffelexHandler) ffestb_R100111_; | |
8993 | } | |
8994 | ||
8995 | return (ffelexHandler) ffestb_R100114_; | |
8996 | } | |
8997 | ||
8998 | /* ffestb_R10012_ -- "FORMAT" OPEN_PAREN [format-item-list] | |
8999 | ||
9000 | return ffestb_R10012_; // to lexer | |
9001 | ||
9002 | The initial state for a format-item. Here, just handle the initial | |
9003 | number, sign for number, or run-time expression. Also handle spurious | |
9004 | comma, close-paren (indicating spurious comma), close-array (like | |
9005 | close-paren but preceded by slash), and quoted strings. */ | |
9006 | ||
9007 | static ffelexHandler | |
9008 | ffestb_R10012_ (ffelexToken t) | |
9009 | { | |
9010 | unsigned long unsigned_val; | |
9011 | ffesttFormatList f; | |
9012 | ||
9013 | switch (ffelex_token_type (t)) | |
9014 | { | |
9015 | case FFELEX_typeOPEN_ANGLE: | |
9016 | ffesta_confirmed (); | |
9017 | ffestb_local_.format.pre.t = ffelex_token_use (t); | |
9018 | ffelex_set_names_pure (FALSE); | |
9019 | if (!ffesta_seen_first_exec && !ffestb_local_.format.complained) | |
9020 | { | |
9021 | ffestb_local_.format.complained = TRUE; | |
9022 | ffebad_start (FFEBAD_FORMAT_EXPR_SPEC); | |
9023 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
9024 | ffebad_finish (); | |
9025 | } | |
9026 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
9027 | FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100115_); | |
9028 | ||
9029 | case FFELEX_typeNUMBER: | |
9030 | ffestb_local_.format.sign = FALSE; /* No sign present. */ | |
9031 | ffestb_local_.format.pre.present = TRUE; | |
9032 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9033 | ffestb_local_.format.pre.t = ffelex_token_use (t); | |
9034 | ffestb_local_.format.pre.u.unsigned_val = unsigned_val | |
9035 | = strtoul (ffelex_token_text (t), NULL, 10); | |
9036 | ffelex_set_expecting_hollerith (unsigned_val, '\0', | |
9037 | ffelex_token_where_line (t), | |
9038 | ffelex_token_where_column (t)); | |
9039 | return (ffelexHandler) ffestb_R10014_; | |
9040 | ||
9041 | case FFELEX_typePLUS: | |
9042 | ffestb_local_.format.sign = TRUE; /* Positive. */ | |
9043 | ffestb_local_.format.pre.t = ffelex_token_use (t); | |
9044 | return (ffelexHandler) ffestb_R10013_; | |
9045 | ||
9046 | case FFELEX_typeMINUS: | |
9047 | ffestb_local_.format.sign = FALSE; /* Negative. */ | |
9048 | ffestb_local_.format.pre.t = ffelex_token_use (t); | |
9049 | return (ffelexHandler) ffestb_R10013_; | |
9050 | ||
9051 | case FFELEX_typeCOLON: | |
9052 | case FFELEX_typeCOLONCOLON:/* "::". */ | |
9053 | case FFELEX_typeSLASH: | |
9054 | case FFELEX_typeCONCAT: /* "//". */ | |
9055 | case FFELEX_typeNAMES: | |
9056 | case FFELEX_typeDOLLAR: | |
9057 | case FFELEX_typeOPEN_PAREN: | |
9058 | case FFELEX_typeOPEN_ARRAY:/* "(/". */ | |
9059 | ffestb_local_.format.sign = FALSE; /* No sign present. */ | |
9060 | ffestb_local_.format.pre.present = FALSE; | |
9061 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9062 | ffestb_local_.format.pre.t = NULL; | |
9063 | ffestb_local_.format.pre.u.unsigned_val = 1; | |
9064 | return (ffelexHandler) ffestb_R10014_ (t); | |
9065 | ||
9066 | case FFELEX_typeCOMMA: | |
9067 | ffebad_start (FFEBAD_FORMAT_EXTRA_COMMA); | |
9068 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
9069 | ffebad_finish (); | |
9070 | return (ffelexHandler) ffestb_R10012_; | |
9071 | ||
9072 | case FFELEX_typeCLOSE_PAREN: | |
9073 | ffebad_start (FFEBAD_FORMAT_EXTRA_COMMA); | |
9074 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
9075 | ffebad_finish (); | |
9076 | f = ffestb_local_.format.f->u.root.parent; | |
9077 | if (f == NULL) | |
9078 | return (ffelexHandler) ffestb_R100114_; | |
9079 | ffestb_local_.format.f = f->next; | |
9080 | return (ffelexHandler) ffestb_R100111_; | |
9081 | ||
9082 | case FFELEX_typeCLOSE_ARRAY: /* "/)". */ | |
9083 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9084 | f->type = FFESTP_formattypeSLASH; | |
9085 | f->t = ffelex_token_use (t); | |
9086 | f->u.R1010.val.present = FALSE; | |
9087 | f->u.R1010.val.rtexpr = FALSE; | |
9088 | f->u.R1010.val.t = NULL; | |
9089 | f->u.R1010.val.u.unsigned_val = 1; | |
9090 | f = ffestb_local_.format.f->u.root.parent; | |
9091 | if (f == NULL) | |
9092 | return (ffelexHandler) ffestb_R100114_; | |
9093 | ffestb_local_.format.f = f->next; | |
9094 | return (ffelexHandler) ffestb_R100111_; | |
9095 | ||
9096 | case FFELEX_typeEOS: | |
9097 | case FFELEX_typeSEMICOLON: | |
9098 | ffesta_confirmed (); | |
9099 | ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t); | |
9100 | for (f = ffestb_local_.format.f; | |
9101 | f->u.root.parent != NULL; | |
9102 | f = f->u.root.parent->next) | |
9103 | ; | |
9104 | ffestb_local_.format.f = f; | |
9105 | return (ffelexHandler) ffestb_R100114_ (t); | |
9106 | ||
9107 | case FFELEX_typeQUOTE: | |
9108 | if (ffe_is_vxt ()) | |
9109 | break; /* Error, probably something like FORMAT("17) | |
9110 | = X. */ | |
9111 | ffelex_set_expecting_hollerith (-1, '\"', | |
9112 | ffelex_token_where_line (t), | |
9113 | ffelex_token_where_column (t)); /* Don't have to unset | |
9114 | this one. */ | |
9115 | return (ffelexHandler) ffestb_R100113_; | |
9116 | ||
9117 | case FFELEX_typeAPOSTROPHE: | |
9118 | #if 0 /* No apparent need for this, and not killed | |
9119 | anywhere. */ | |
9120 | ffesta_tokens[1] = ffelex_token_use (t); | |
9121 | #endif | |
9122 | ffelex_set_expecting_hollerith (-1, '\'', | |
9123 | ffelex_token_where_line (t), | |
9124 | ffelex_token_where_column (t)); /* Don't have to unset | |
9125 | this one. */ | |
9126 | return (ffelexHandler) ffestb_R100113_; | |
9127 | ||
9128 | default: | |
9129 | break; | |
9130 | } | |
9131 | ||
9132 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
9133 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
9134 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
9135 | } | |
9136 | ||
9137 | /* ffestb_R10013_ -- "FORMAT" OPEN_PAREN [format-item-list] PLUS/MINUS | |
9138 | ||
9139 | return ffestb_R10013_; // to lexer | |
9140 | ||
9141 | Expect a NUMBER or complain about and then ignore the PLUS/MINUS. */ | |
9142 | ||
9143 | static ffelexHandler | |
9144 | ffestb_R10013_ (ffelexToken t) | |
9145 | { | |
9146 | unsigned long unsigned_val; | |
9147 | ||
9148 | switch (ffelex_token_type (t)) | |
9149 | { | |
9150 | case FFELEX_typeNUMBER: | |
9151 | ffestb_local_.format.pre.present = TRUE; | |
9152 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9153 | unsigned_val = strtoul (ffelex_token_text (t), NULL, 10); | |
9154 | ffestb_local_.format.pre.u.signed_val = ffestb_local_.format.sign | |
9155 | ? unsigned_val : -unsigned_val; | |
9156 | ffestb_local_.format.sign = TRUE; /* Sign present. */ | |
9157 | return (ffelexHandler) ffestb_R10014_; | |
9158 | ||
9159 | default: | |
9160 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN); | |
9161 | ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t), | |
9162 | ffelex_token_where_column (ffestb_local_.format.pre.t)); | |
9163 | ffebad_finish (); | |
9164 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
9165 | return (ffelexHandler) ffestb_R10012_ (t); | |
9166 | } | |
9167 | } | |
9168 | ||
9169 | /* ffestb_R10014_ -- "FORMAT" OPEN_PAREN [format-item-list] [[+/-] NUMBER] | |
9170 | ||
9171 | return ffestb_R10014_; // to lexer | |
9172 | ||
9173 | Here is where we expect to see the actual NAMES, COLON, SLASH, OPEN_PAREN, | |
9174 | OPEN_ARRAY, COLONCOLON, CONCAT, DOLLAR, or HOLLERITH that identifies what | |
9175 | kind of format-item we're dealing with. But if we see a NUMBER instead, it | |
9176 | means free-form spaces number like "5 6 X", so scale the current number | |
9177 | accordingly and reenter this state. (I really wouldn't be surprised if | |
9178 | they change this spacing rule in the F90 spec so that you can't embed | |
9179 | spaces within numbers or within keywords like BN in a free-source-form | |
9180 | program.) */ | |
9181 | ||
9182 | static ffelexHandler | |
9183 | ffestb_R10014_ (ffelexToken t) | |
9184 | { | |
9185 | ffesttFormatList f; | |
9186 | ffeTokenLength i; | |
9187 | char *p; | |
9188 | ffestrFormat kw; | |
9189 | ||
9190 | ffelex_set_expecting_hollerith (0, '\0', | |
9191 | ffewhere_line_unknown (), | |
9192 | ffewhere_column_unknown ()); | |
9193 | ||
9194 | switch (ffelex_token_type (t)) | |
9195 | { | |
9196 | case FFELEX_typeHOLLERITH: | |
9197 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9198 | f->type = FFESTP_formattypeR1016; | |
9199 | f->t = ffelex_token_use (t); | |
9200 | ffelex_token_kill (ffestb_local_.format.pre.t); /* It WAS present! */ | |
9201 | return (ffelexHandler) ffestb_R100111_; | |
9202 | ||
9203 | case FFELEX_typeNUMBER: | |
9204 | assert (ffestb_local_.format.pre.present); | |
9205 | ffesta_confirmed (); | |
9206 | if (ffestb_local_.format.pre.rtexpr) | |
9207 | { | |
9208 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER); | |
9209 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
9210 | ffebad_finish (); | |
9211 | return (ffelexHandler) ffestb_R10014_; | |
9212 | } | |
9213 | if (ffestb_local_.format.sign) | |
9214 | { | |
9215 | for (i = 0; i < ffelex_token_length (t); ++i) | |
9216 | ffestb_local_.format.pre.u.signed_val *= 10; | |
9217 | ffestb_local_.format.pre.u.signed_val += strtoul (ffelex_token_text (t), | |
9218 | NULL, 10); | |
9219 | } | |
9220 | else | |
9221 | { | |
9222 | for (i = 0; i < ffelex_token_length (t); ++i) | |
9223 | ffestb_local_.format.pre.u.unsigned_val *= 10; | |
9224 | ffestb_local_.format.pre.u.unsigned_val += strtoul (ffelex_token_text (t), | |
9225 | NULL, 10); | |
9226 | ffelex_set_expecting_hollerith (ffestb_local_.format.pre.u.unsigned_val, | |
9227 | '\0', | |
9228 | ffelex_token_where_line (t), | |
9229 | ffelex_token_where_column (t)); | |
9230 | } | |
9231 | return (ffelexHandler) ffestb_R10014_; | |
9232 | ||
9233 | case FFELEX_typeCOLONCOLON: /* "::". */ | |
9234 | if (ffestb_local_.format.pre.present) | |
9235 | { | |
9236 | ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_COLON_SPEC, | |
9237 | ffestb_local_.format.pre.t); | |
9238 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
9239 | ffestb_local_.format.pre.present = FALSE; | |
9240 | } | |
9241 | else | |
9242 | { | |
9243 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9244 | f->type = FFESTP_formattypeCOLON; | |
9245 | f->t = ffelex_token_use (t); | |
9246 | f->u.R1010.val.present = FALSE; | |
9247 | f->u.R1010.val.rtexpr = FALSE; | |
9248 | f->u.R1010.val.t = NULL; | |
9249 | f->u.R1010.val.u.unsigned_val = 1; | |
9250 | } | |
9251 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9252 | f->type = FFESTP_formattypeCOLON; | |
9253 | f->t = ffelex_token_use (t); | |
9254 | f->u.R1010.val.present = FALSE; | |
9255 | f->u.R1010.val.rtexpr = FALSE; | |
9256 | f->u.R1010.val.t = NULL; | |
9257 | f->u.R1010.val.u.unsigned_val = 1; | |
9258 | return (ffelexHandler) ffestb_R100112_; | |
9259 | ||
9260 | case FFELEX_typeCOLON: | |
9261 | if (ffestb_local_.format.pre.present) | |
9262 | { | |
9263 | ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_COLON_SPEC, | |
9264 | ffestb_local_.format.pre.t); | |
9265 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
9266 | return (ffelexHandler) ffestb_R100112_; | |
9267 | } | |
9268 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9269 | f->type = FFESTP_formattypeCOLON; | |
9270 | f->t = ffelex_token_use (t); | |
9271 | f->u.R1010.val.present = FALSE; | |
9272 | f->u.R1010.val.rtexpr = FALSE; | |
9273 | f->u.R1010.val.t = NULL; | |
9274 | f->u.R1010.val.u.unsigned_val = 1; | |
9275 | return (ffelexHandler) ffestb_R100112_; | |
9276 | ||
9277 | case FFELEX_typeCONCAT: /* "//". */ | |
9278 | if (ffestb_local_.format.sign) | |
9279 | { | |
9280 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN); | |
9281 | ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t), | |
9282 | ffelex_token_where_column (ffestb_local_.format.pre.t)); | |
9283 | ffebad_finish (); | |
9284 | ffestb_local_.format.pre.u.unsigned_val | |
9285 | = (ffestb_local_.format.pre.u.signed_val < 0) | |
9286 | ? -ffestb_local_.format.pre.u.signed_val | |
9287 | : ffestb_local_.format.pre.u.signed_val; | |
9288 | } | |
9289 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9290 | f->type = FFESTP_formattypeSLASH; | |
9291 | f->t = ffelex_token_use (t); | |
9292 | f->u.R1010.val = ffestb_local_.format.pre; | |
9293 | ffestb_local_.format.pre.present = FALSE; | |
9294 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9295 | ffestb_local_.format.pre.t = NULL; | |
9296 | ffestb_local_.format.pre.u.unsigned_val = 1; | |
9297 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9298 | f->type = FFESTP_formattypeSLASH; | |
9299 | f->t = ffelex_token_use (t); | |
9300 | f->u.R1010.val = ffestb_local_.format.pre; | |
9301 | return (ffelexHandler) ffestb_R100112_; | |
9302 | ||
9303 | case FFELEX_typeSLASH: | |
9304 | if (ffestb_local_.format.sign) | |
9305 | { | |
9306 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN); | |
9307 | ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t), | |
9308 | ffelex_token_where_column (ffestb_local_.format.pre.t)); | |
9309 | ffebad_finish (); | |
9310 | ffestb_local_.format.pre.u.unsigned_val | |
9311 | = (ffestb_local_.format.pre.u.signed_val < 0) | |
9312 | ? -ffestb_local_.format.pre.u.signed_val | |
9313 | : ffestb_local_.format.pre.u.signed_val; | |
9314 | } | |
9315 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9316 | f->type = FFESTP_formattypeSLASH; | |
9317 | f->t = ffelex_token_use (t); | |
9318 | f->u.R1010.val = ffestb_local_.format.pre; | |
9319 | return (ffelexHandler) ffestb_R100112_; | |
9320 | ||
9321 | case FFELEX_typeOPEN_PAREN: | |
9322 | if (ffestb_local_.format.sign) | |
9323 | { | |
9324 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN); | |
9325 | ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t), | |
9326 | ffelex_token_where_column (ffestb_local_.format.pre.t)); | |
9327 | ffebad_finish (); | |
9328 | ffestb_local_.format.pre.u.unsigned_val | |
9329 | = (ffestb_local_.format.pre.u.signed_val < 0) | |
9330 | ? -ffestb_local_.format.pre.u.signed_val | |
9331 | : ffestb_local_.format.pre.u.signed_val; | |
9332 | } | |
9333 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9334 | f->type = FFESTP_formattypeFORMAT; | |
9335 | f->t = ffelex_token_use (t); | |
9336 | f->u.R1003D.R1004 = ffestb_local_.format.pre; | |
9337 | f->u.R1003D.format = ffestb_local_.format.f | |
9338 | = ffestt_formatlist_create (f, ffelex_token_use (t)); | |
9339 | return (ffelexHandler) ffestb_R10011_; | |
9340 | ||
9341 | case FFELEX_typeOPEN_ARRAY:/* "(/". */ | |
9342 | if (ffestb_local_.format.sign) | |
9343 | { | |
9344 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN); | |
9345 | ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t), | |
9346 | ffelex_token_where_column (ffestb_local_.format.pre.t)); | |
9347 | ffebad_finish (); | |
9348 | ffestb_local_.format.pre.u.unsigned_val | |
9349 | = (ffestb_local_.format.pre.u.signed_val < 0) | |
9350 | ? -ffestb_local_.format.pre.u.signed_val | |
9351 | : ffestb_local_.format.pre.u.signed_val; | |
9352 | } | |
9353 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9354 | f->type = FFESTP_formattypeFORMAT; | |
9355 | f->t = ffelex_token_use (t); | |
9356 | f->u.R1003D.R1004 = ffestb_local_.format.pre; | |
9357 | f->u.R1003D.format = ffestb_local_.format.f | |
9358 | = ffestt_formatlist_create (f, ffelex_token_use (t)); | |
9359 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9360 | f->type = FFESTP_formattypeSLASH; | |
9361 | f->t = ffelex_token_use (t); | |
9362 | f->u.R1010.val.present = FALSE; | |
9363 | f->u.R1010.val.rtexpr = FALSE; | |
9364 | f->u.R1010.val.t = NULL; | |
9365 | f->u.R1010.val.u.unsigned_val = 1; | |
9366 | return (ffelexHandler) ffestb_R100112_; | |
9367 | ||
9368 | case FFELEX_typeCLOSE_ARRAY: /* "/)". */ | |
9369 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
9370 | f->type = FFESTP_formattypeSLASH; | |
9371 | f->t = ffelex_token_use (t); | |
9372 | f->u.R1010.val = ffestb_local_.format.pre; | |
9373 | f = ffestb_local_.format.f->u.root.parent; | |
9374 | if (f == NULL) | |
9375 | return (ffelexHandler) ffestb_R100114_; | |
9376 | ffestb_local_.format.f = f->next; | |
9377 | return (ffelexHandler) ffestb_R100111_; | |
9378 | ||
9379 | case FFELEX_typeQUOTE: | |
9380 | if (ffe_is_vxt ()) | |
9381 | break; /* A totally bad character in a VXT FORMAT. */ | |
9382 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER); | |
9383 | ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t), | |
9384 | ffelex_token_where_column (ffestb_local_.format.pre.t)); | |
9385 | ffebad_finish (); | |
9386 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
9387 | ffesta_confirmed (); | |
9388 | #if 0 /* No apparent need for this, and not killed | |
9389 | anywhere. */ | |
9390 | ffesta_tokens[1] = ffelex_token_use (t); | |
9391 | #endif | |
9392 | ffelex_set_expecting_hollerith (-1, '\"', | |
9393 | ffelex_token_where_line (t), | |
9394 | ffelex_token_where_column (t)); /* Don't have to unset | |
9395 | this one. */ | |
9396 | return (ffelexHandler) ffestb_R100113_; | |
9397 | ||
9398 | case FFELEX_typeAPOSTROPHE: | |
9399 | ffesta_confirmed (); | |
9400 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER); | |
9401 | ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t), | |
9402 | ffelex_token_where_column (ffestb_local_.format.pre.t)); | |
9403 | ffebad_finish (); | |
9404 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
9405 | #if 0 /* No apparent need for this, and not killed | |
9406 | anywhere. */ | |
9407 | ffesta_tokens[1] = ffelex_token_use (t); | |
9408 | #endif | |
9409 | ffelex_set_expecting_hollerith (-1, '\'', ffelex_token_where_line (t), | |
9410 | ffelex_token_where_column (t)); /* Don't have to unset | |
9411 | this one. */ | |
9412 | return (ffelexHandler) ffestb_R100113_; | |
9413 | ||
9414 | case FFELEX_typeEOS: | |
9415 | case FFELEX_typeSEMICOLON: | |
9416 | ffesta_confirmed (); | |
9417 | ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t); | |
9418 | for (f = ffestb_local_.format.f; | |
9419 | f->u.root.parent != NULL; | |
9420 | f = f->u.root.parent->next) | |
9421 | ; | |
9422 | ffestb_local_.format.f = f; | |
9423 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
9424 | return (ffelexHandler) ffestb_R100114_ (t); | |
9425 | ||
9426 | case FFELEX_typeDOLLAR: | |
9427 | ffestb_local_.format.t = ffelex_token_use (t); | |
9428 | if (ffestb_local_.format.pre.present) | |
9429 | ffesta_confirmed (); /* Number preceding this invalid elsewhere. */ | |
9430 | ffestb_local_.format.current = FFESTP_formattypeDOLLAR; | |
9431 | return (ffelexHandler) ffestb_R10015_; | |
9432 | ||
9433 | case FFELEX_typeNAMES: | |
9434 | kw = ffestr_format (t); | |
9435 | ffestb_local_.format.t = ffelex_token_use (t); | |
9436 | switch (kw) | |
9437 | { | |
9438 | case FFESTR_formatI: | |
9439 | if (ffestb_local_.format.pre.present) | |
9440 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9441 | ffestb_local_.format.current = FFESTP_formattypeI; | |
9442 | i = FFESTR_formatlI; | |
9443 | break; | |
9444 | ||
9445 | case FFESTR_formatB: | |
9446 | if (ffestb_local_.format.pre.present) | |
9447 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9448 | ffestb_local_.format.current = FFESTP_formattypeB; | |
9449 | i = FFESTR_formatlB; | |
9450 | break; | |
9451 | ||
9452 | case FFESTR_formatO: | |
9453 | if (ffestb_local_.format.pre.present) | |
9454 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9455 | ffestb_local_.format.current = FFESTP_formattypeO; | |
9456 | i = FFESTR_formatlO; | |
9457 | break; | |
9458 | ||
9459 | case FFESTR_formatZ: | |
9460 | if (ffestb_local_.format.pre.present) | |
9461 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9462 | ffestb_local_.format.current = FFESTP_formattypeZ; | |
9463 | i = FFESTR_formatlZ; | |
9464 | break; | |
9465 | ||
9466 | case FFESTR_formatF: | |
9467 | if (ffestb_local_.format.pre.present) | |
9468 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9469 | ffestb_local_.format.current = FFESTP_formattypeF; | |
9470 | i = FFESTR_formatlF; | |
9471 | break; | |
9472 | ||
9473 | case FFESTR_formatE: | |
9474 | ffestb_local_.format.current = FFESTP_formattypeE; | |
9475 | i = FFESTR_formatlE; | |
9476 | break; | |
9477 | ||
9478 | case FFESTR_formatEN: | |
9479 | if (ffestb_local_.format.pre.present) | |
9480 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9481 | ffestb_local_.format.current = FFESTP_formattypeEN; | |
9482 | i = FFESTR_formatlEN; | |
9483 | break; | |
9484 | ||
9485 | case FFESTR_formatG: | |
9486 | if (ffestb_local_.format.pre.present) | |
9487 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9488 | ffestb_local_.format.current = FFESTP_formattypeG; | |
9489 | i = FFESTR_formatlG; | |
9490 | break; | |
9491 | ||
9492 | case FFESTR_formatL: | |
9493 | if (ffestb_local_.format.pre.present) | |
9494 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9495 | ffestb_local_.format.current = FFESTP_formattypeL; | |
9496 | i = FFESTR_formatlL; | |
9497 | break; | |
9498 | ||
9499 | case FFESTR_formatA: | |
9500 | if (ffestb_local_.format.pre.present) | |
9501 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9502 | ffestb_local_.format.current = FFESTP_formattypeA; | |
9503 | i = FFESTR_formatlA; | |
9504 | break; | |
9505 | ||
9506 | case FFESTR_formatD: | |
9507 | ffestb_local_.format.current = FFESTP_formattypeD; | |
9508 | i = FFESTR_formatlD; | |
9509 | break; | |
9510 | ||
9511 | case FFESTR_formatQ: | |
9512 | ffestb_local_.format.current = FFESTP_formattypeQ; | |
9513 | i = FFESTR_formatlQ; | |
9514 | break; | |
9515 | ||
9516 | case FFESTR_formatDOLLAR: | |
9517 | if (ffestb_local_.format.pre.present) | |
9518 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9519 | ffestb_local_.format.current = FFESTP_formattypeDOLLAR; | |
9520 | i = FFESTR_formatlDOLLAR; | |
9521 | break; | |
9522 | ||
9523 | case FFESTR_formatP: | |
9524 | if (ffestb_local_.format.pre.present) | |
9525 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9526 | ffestb_local_.format.current = FFESTP_formattypeP; | |
9527 | i = FFESTR_formatlP; | |
9528 | break; | |
9529 | ||
9530 | case FFESTR_formatT: | |
9531 | if (ffestb_local_.format.pre.present) | |
9532 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9533 | ffestb_local_.format.current = FFESTP_formattypeT; | |
9534 | i = FFESTR_formatlT; | |
9535 | break; | |
9536 | ||
9537 | case FFESTR_formatTL: | |
9538 | if (ffestb_local_.format.pre.present) | |
9539 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9540 | ffestb_local_.format.current = FFESTP_formattypeTL; | |
9541 | i = FFESTR_formatlTL; | |
9542 | break; | |
9543 | ||
9544 | case FFESTR_formatTR: | |
9545 | if (ffestb_local_.format.pre.present) | |
9546 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9547 | ffestb_local_.format.current = FFESTP_formattypeTR; | |
9548 | i = FFESTR_formatlTR; | |
9549 | break; | |
9550 | ||
9551 | case FFESTR_formatX: | |
9552 | if (ffestb_local_.format.pre.present) | |
9553 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9554 | ffestb_local_.format.current = FFESTP_formattypeX; | |
9555 | i = FFESTR_formatlX; | |
9556 | break; | |
9557 | ||
9558 | case FFESTR_formatS: | |
9559 | if (ffestb_local_.format.pre.present) | |
9560 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9561 | ffestb_local_.format.current = FFESTP_formattypeS; | |
9562 | i = FFESTR_formatlS; | |
9563 | break; | |
9564 | ||
9565 | case FFESTR_formatSP: | |
9566 | if (ffestb_local_.format.pre.present) | |
9567 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9568 | ffestb_local_.format.current = FFESTP_formattypeSP; | |
9569 | i = FFESTR_formatlSP; | |
9570 | break; | |
9571 | ||
9572 | case FFESTR_formatSS: | |
9573 | if (ffestb_local_.format.pre.present) | |
9574 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9575 | ffestb_local_.format.current = FFESTP_formattypeSS; | |
9576 | i = FFESTR_formatlSS; | |
9577 | break; | |
9578 | ||
9579 | case FFESTR_formatBN: | |
9580 | if (ffestb_local_.format.pre.present) | |
9581 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9582 | ffestb_local_.format.current = FFESTP_formattypeBN; | |
9583 | i = FFESTR_formatlBN; | |
9584 | break; | |
9585 | ||
9586 | case FFESTR_formatBZ: | |
9587 | if (ffestb_local_.format.pre.present) | |
9588 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9589 | ffestb_local_.format.current = FFESTP_formattypeBZ; | |
9590 | i = FFESTR_formatlBZ; | |
9591 | break; | |
9592 | ||
9593 | case FFESTR_formatH: /* Error, either "H" or "<expr>H". */ | |
9594 | if (ffestb_local_.format.pre.present) | |
9595 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9596 | ffestb_local_.format.current = FFESTP_formattypeH; | |
9597 | i = FFESTR_formatlH; | |
9598 | break; | |
9599 | ||
9600 | case FFESTR_formatPD: | |
9601 | if (ffestb_local_.format.pre.present) | |
9602 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9603 | ffestb_subr_R1001_append_p_ (); | |
9604 | ffestb_local_.format.t = ffelex_token_name_from_names (t, | |
9605 | FFESTR_formatlP, 1); | |
9606 | ffestb_local_.format.sign = FALSE; | |
9607 | ffestb_local_.format.pre.present = FALSE; | |
9608 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9609 | ffestb_local_.format.pre.t = NULL; | |
9610 | ffestb_local_.format.pre.u.unsigned_val = 1; | |
9611 | ffestb_local_.format.current = FFESTP_formattypeD; | |
9612 | i = FFESTR_formatlPD; | |
9613 | break; | |
9614 | ||
9615 | case FFESTR_formatPE: | |
9616 | if (ffestb_local_.format.pre.present) | |
9617 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9618 | ffestb_subr_R1001_append_p_ (); | |
9619 | ffestb_local_.format.t = ffelex_token_name_from_names (t, | |
9620 | FFESTR_formatlP, 1); | |
9621 | ffestb_local_.format.sign = FALSE; | |
9622 | ffestb_local_.format.pre.present = FALSE; | |
9623 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9624 | ffestb_local_.format.pre.t = NULL; | |
9625 | ffestb_local_.format.pre.u.unsigned_val = 1; | |
9626 | ffestb_local_.format.current = FFESTP_formattypeE; | |
9627 | i = FFESTR_formatlPE; | |
9628 | break; | |
9629 | ||
9630 | case FFESTR_formatPEN: | |
9631 | if (ffestb_local_.format.pre.present) | |
9632 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9633 | ffestb_subr_R1001_append_p_ (); | |
9634 | ffestb_local_.format.t = ffelex_token_name_from_names (t, | |
9635 | FFESTR_formatlP, 1); | |
9636 | ffestb_local_.format.sign = FALSE; | |
9637 | ffestb_local_.format.pre.present = FALSE; | |
9638 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9639 | ffestb_local_.format.pre.t = NULL; | |
9640 | ffestb_local_.format.pre.u.unsigned_val = 1; | |
9641 | ffestb_local_.format.current = FFESTP_formattypeEN; | |
9642 | i = FFESTR_formatlPEN; | |
9643 | break; | |
9644 | ||
9645 | case FFESTR_formatPF: | |
9646 | if (ffestb_local_.format.pre.present) | |
9647 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9648 | ffestb_subr_R1001_append_p_ (); | |
9649 | ffestb_local_.format.t = ffelex_token_name_from_names (t, | |
9650 | FFESTR_formatlP, 1); | |
9651 | ffestb_local_.format.sign = FALSE; | |
9652 | ffestb_local_.format.pre.present = FALSE; | |
9653 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9654 | ffestb_local_.format.pre.t = NULL; | |
9655 | ffestb_local_.format.pre.u.unsigned_val = 1; | |
9656 | ffestb_local_.format.current = FFESTP_formattypeF; | |
9657 | i = FFESTR_formatlPF; | |
9658 | break; | |
9659 | ||
9660 | case FFESTR_formatPG: | |
9661 | if (ffestb_local_.format.pre.present) | |
9662 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9663 | ffestb_subr_R1001_append_p_ (); | |
9664 | ffestb_local_.format.t = ffelex_token_name_from_names (t, | |
9665 | FFESTR_formatlP, 1); | |
9666 | ffestb_local_.format.sign = FALSE; | |
9667 | ffestb_local_.format.pre.present = FALSE; | |
9668 | ffestb_local_.format.pre.rtexpr = FALSE; | |
9669 | ffestb_local_.format.pre.t = NULL; | |
9670 | ffestb_local_.format.pre.u.unsigned_val = 1; | |
9671 | ffestb_local_.format.current = FFESTP_formattypeG; | |
9672 | i = FFESTR_formatlPG; | |
9673 | break; | |
9674 | ||
9675 | default: | |
9676 | if (ffestb_local_.format.pre.present) | |
9677 | ffesta_confirmed ();/* Number preceding this invalid elsewhere. */ | |
9678 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9679 | p = strpbrk (ffelex_token_text (t), "0123456789"); | |
9680 | if (p == NULL) | |
9681 | i = ffelex_token_length (t); | |
9682 | else | |
9683 | i = p - ffelex_token_text (t); | |
9684 | break; | |
9685 | } | |
9686 | p = ffelex_token_text (t) + i; | |
9687 | if (*p == '\0') | |
9688 | return (ffelexHandler) ffestb_R10015_; | |
9689 | if (!isdigit (*p)) | |
9690 | { | |
9691 | if (ffestb_local_.format.current == FFESTP_formattypeH) | |
9692 | p = strpbrk (p, "0123456789"); | |
9693 | else | |
9694 | { | |
9695 | p = NULL; | |
9696 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9697 | } | |
9698 | if (p == NULL) | |
9699 | return (ffelexHandler) ffestb_R10015_; | |
9700 | i = p - ffelex_token_text (t); /* Collect digits. */ | |
9701 | } | |
9702 | ffestb_local_.format.post.present = TRUE; | |
9703 | ffestb_local_.format.post.rtexpr = FALSE; | |
9704 | ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i); | |
9705 | ffestb_local_.format.post.u.unsigned_val | |
9706 | = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10); | |
9707 | p += ffelex_token_length (ffestb_local_.format.post.t); | |
9708 | i += ffelex_token_length (ffestb_local_.format.post.t); | |
9709 | if (*p == '\0') | |
9710 | return (ffelexHandler) ffestb_R10016_; | |
9711 | if ((kw != FFESTR_formatP) || !ffelex_is_firstnamechar (*p)) | |
9712 | { | |
9713 | if (ffestb_local_.format.current != FFESTP_formattypeH) | |
9714 | ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL); | |
9715 | return (ffelexHandler) ffestb_R10016_; | |
9716 | } | |
9717 | ||
9718 | /* Here we have [number]P[number][text]. Treat as | |
9719 | [number]P,[number][text]. */ | |
9720 | ||
9721 | ffestb_subr_R1001_append_p_ (); | |
9722 | t = ffestb_local_.format.t = ffelex_token_names_from_names (t, i, 0); | |
9723 | ffestb_local_.format.sign = FALSE; | |
9724 | ffestb_local_.format.pre = ffestb_local_.format.post; | |
9725 | kw = ffestr_format (t); | |
9726 | switch (kw) | |
9727 | { /* Only a few possibilities here. */ | |
9728 | case FFESTR_formatD: | |
9729 | ffestb_local_.format.current = FFESTP_formattypeD; | |
9730 | i = FFESTR_formatlD; | |
9731 | break; | |
9732 | ||
9733 | case FFESTR_formatE: | |
9734 | ffestb_local_.format.current = FFESTP_formattypeE; | |
9735 | i = FFESTR_formatlE; | |
9736 | break; | |
9737 | ||
9738 | case FFESTR_formatEN: | |
9739 | ffestb_local_.format.current = FFESTP_formattypeEN; | |
9740 | i = FFESTR_formatlEN; | |
9741 | break; | |
9742 | ||
9743 | case FFESTR_formatF: | |
9744 | ffestb_local_.format.current = FFESTP_formattypeF; | |
9745 | i = FFESTR_formatlF; | |
9746 | break; | |
9747 | ||
9748 | case FFESTR_formatG: | |
9749 | ffestb_local_.format.current = FFESTP_formattypeG; | |
9750 | i = FFESTR_formatlG; | |
9751 | break; | |
9752 | ||
9753 | default: | |
9754 | ffebad_start (FFEBAD_FORMAT_P_NOCOMMA); | |
9755 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
9756 | ffebad_finish (); | |
9757 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9758 | p = strpbrk (ffelex_token_text (t), "0123456789"); | |
9759 | if (p == NULL) | |
9760 | i = ffelex_token_length (t); | |
9761 | else | |
9762 | i = p - ffelex_token_text (t); | |
9763 | } | |
9764 | p = ffelex_token_text (t) + i; | |
9765 | if (*p == '\0') | |
9766 | return (ffelexHandler) ffestb_R10015_; | |
9767 | if (!isdigit (*p)) | |
9768 | { | |
9769 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9770 | p = strpbrk (p, "0123456789"); | |
9771 | if (p == NULL) | |
9772 | return (ffelexHandler) ffestb_R10015_; | |
9773 | i = p - ffelex_token_text (t); /* Collect digits anyway. */ | |
9774 | } | |
9775 | ffestb_local_.format.post.present = TRUE; | |
9776 | ffestb_local_.format.post.rtexpr = FALSE; | |
9777 | ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i); | |
9778 | ffestb_local_.format.post.u.unsigned_val | |
9779 | = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10); | |
9780 | p += ffelex_token_length (ffestb_local_.format.post.t); | |
9781 | i += ffelex_token_length (ffestb_local_.format.post.t); | |
9782 | if (*p == '\0') | |
9783 | return (ffelexHandler) ffestb_R10016_; | |
9784 | ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL); | |
9785 | return (ffelexHandler) ffestb_R10016_; | |
9786 | ||
9787 | default: | |
9788 | break; | |
9789 | } | |
9790 | ||
9791 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
9792 | if (ffestb_local_.format.pre.present) | |
9793 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
9794 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
9795 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
9796 | (ffelexHandler) ffesta_zero); | |
9797 | } | |
9798 | ||
9799 | /* ffestb_R10015_ -- [[+/-] NUMBER] NAMES | |
9800 | ||
9801 | return ffestb_R10015_; // to lexer | |
9802 | ||
9803 | Here we've gotten at least the initial mnemonic for the edit descriptor. | |
9804 | We expect either a NUMBER, for the post-mnemonic value, a NAMES, for | |
9805 | further clarification (in free-form only, sigh) of the mnemonic, or | |
9806 | anything else. In all cases we go to _6_, with the difference that for | |
9807 | NUMBER and NAMES we send the next token rather than the current token. */ | |
9808 | ||
9809 | static ffelexHandler | |
9810 | ffestb_R10015_ (ffelexToken t) | |
9811 | { | |
9812 | bool split_pea; /* New NAMES requires splitting kP from new | |
9813 | edit desc. */ | |
9814 | ffestrFormat kw; | |
9815 | char *p; | |
9816 | ffeTokenLength i; | |
9817 | ||
9818 | switch (ffelex_token_type (t)) | |
9819 | { | |
9820 | case FFELEX_typeOPEN_ANGLE: | |
9821 | ffesta_confirmed (); | |
9822 | ffestb_local_.format.post.t = ffelex_token_use (t); | |
9823 | ffelex_set_names_pure (FALSE); | |
9824 | if (!ffesta_seen_first_exec && !ffestb_local_.format.complained) | |
9825 | { | |
9826 | ffestb_local_.format.complained = TRUE; | |
9827 | ffebad_start (FFEBAD_FORMAT_EXPR_SPEC); | |
9828 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
9829 | ffebad_finish (); | |
9830 | } | |
9831 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
9832 | FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100116_); | |
9833 | ||
9834 | case FFELEX_typeNUMBER: | |
9835 | ffestb_local_.format.post.present = TRUE; | |
9836 | ffestb_local_.format.post.rtexpr = FALSE; | |
9837 | ffestb_local_.format.post.t = ffelex_token_use (t); | |
9838 | ffestb_local_.format.post.u.unsigned_val | |
9839 | = strtoul (ffelex_token_text (t), NULL, 10); | |
9840 | return (ffelexHandler) ffestb_R10016_; | |
9841 | ||
9842 | case FFELEX_typeNAMES: | |
9843 | ffesta_confirmed (); /* NAMES " " NAMES invalid elsewhere in | |
9844 | free-form. */ | |
9845 | kw = ffestr_format (t); | |
9846 | switch (ffestb_local_.format.current) | |
9847 | { | |
9848 | case FFESTP_formattypeP: | |
9849 | split_pea = TRUE; | |
9850 | break; | |
9851 | ||
9852 | case FFESTP_formattypeH: /* An error, maintain this indicator. */ | |
9853 | kw = FFESTR_formatNone; | |
9854 | split_pea = FALSE; | |
9855 | break; | |
9856 | ||
9857 | default: | |
9858 | split_pea = FALSE; | |
9859 | break; | |
9860 | } | |
9861 | ||
9862 | switch (kw) | |
9863 | { | |
9864 | case FFESTR_formatF: | |
9865 | switch (ffestb_local_.format.current) | |
9866 | { | |
9867 | case FFESTP_formattypeP: | |
9868 | ffestb_local_.format.current = FFESTP_formattypeF; | |
9869 | break; | |
9870 | ||
9871 | default: | |
9872 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9873 | break; | |
9874 | } | |
9875 | i = FFESTR_formatlF; | |
9876 | break; | |
9877 | ||
9878 | case FFESTR_formatE: | |
9879 | switch (ffestb_local_.format.current) | |
9880 | { | |
9881 | case FFESTP_formattypeP: | |
9882 | ffestb_local_.format.current = FFESTP_formattypeE; | |
9883 | break; | |
9884 | ||
9885 | default: | |
9886 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9887 | break; | |
9888 | } | |
9889 | i = FFESTR_formatlE; | |
9890 | break; | |
9891 | ||
9892 | case FFESTR_formatEN: | |
9893 | switch (ffestb_local_.format.current) | |
9894 | { | |
9895 | case FFESTP_formattypeP: | |
9896 | ffestb_local_.format.current = FFESTP_formattypeEN; | |
9897 | break; | |
9898 | ||
9899 | default: | |
9900 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9901 | break; | |
9902 | } | |
9903 | i = FFESTR_formatlEN; | |
9904 | break; | |
9905 | ||
9906 | case FFESTR_formatG: | |
9907 | switch (ffestb_local_.format.current) | |
9908 | { | |
9909 | case FFESTP_formattypeP: | |
9910 | ffestb_local_.format.current = FFESTP_formattypeG; | |
9911 | break; | |
9912 | ||
9913 | default: | |
9914 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9915 | break; | |
9916 | } | |
9917 | i = FFESTR_formatlG; | |
9918 | break; | |
9919 | ||
9920 | case FFESTR_formatL: | |
9921 | switch (ffestb_local_.format.current) | |
9922 | { | |
9923 | case FFESTP_formattypeT: | |
9924 | ffestb_local_.format.current = FFESTP_formattypeTL; | |
9925 | break; | |
9926 | ||
9927 | default: | |
9928 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9929 | break; | |
9930 | } | |
9931 | i = FFESTR_formatlL; | |
9932 | break; | |
9933 | ||
9934 | case FFESTR_formatD: | |
9935 | switch (ffestb_local_.format.current) | |
9936 | { | |
9937 | case FFESTP_formattypeP: | |
9938 | ffestb_local_.format.current = FFESTP_formattypeD; | |
9939 | break; | |
9940 | ||
9941 | default: | |
9942 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9943 | break; | |
9944 | } | |
9945 | i = FFESTR_formatlD; | |
9946 | break; | |
9947 | ||
9948 | case FFESTR_formatS: | |
9949 | switch (ffestb_local_.format.current) | |
9950 | { | |
9951 | case FFESTP_formattypeS: | |
9952 | ffestb_local_.format.current = FFESTP_formattypeSS; | |
9953 | break; | |
9954 | ||
9955 | default: | |
9956 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9957 | break; | |
9958 | } | |
9959 | i = FFESTR_formatlS; | |
9960 | break; | |
9961 | ||
9962 | case FFESTR_formatP: | |
9963 | switch (ffestb_local_.format.current) | |
9964 | { | |
9965 | case FFESTP_formattypeS: | |
9966 | ffestb_local_.format.current = FFESTP_formattypeSP; | |
9967 | break; | |
9968 | ||
9969 | default: | |
9970 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9971 | break; | |
9972 | } | |
9973 | i = FFESTR_formatlP; | |
9974 | break; | |
9975 | ||
9976 | case FFESTR_formatR: | |
9977 | switch (ffestb_local_.format.current) | |
9978 | { | |
9979 | case FFESTP_formattypeT: | |
9980 | ffestb_local_.format.current = FFESTP_formattypeTR; | |
9981 | break; | |
9982 | ||
9983 | default: | |
9984 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9985 | break; | |
9986 | } | |
9987 | i = FFESTR_formatlR; | |
9988 | break; | |
9989 | ||
9990 | case FFESTR_formatZ: | |
9991 | switch (ffestb_local_.format.current) | |
9992 | { | |
9993 | case FFESTP_formattypeB: | |
9994 | ffestb_local_.format.current = FFESTP_formattypeBZ; | |
9995 | break; | |
9996 | ||
9997 | default: | |
9998 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
9999 | break; | |
10000 | } | |
10001 | i = FFESTR_formatlZ; | |
10002 | break; | |
10003 | ||
10004 | case FFESTR_formatN: | |
10005 | switch (ffestb_local_.format.current) | |
10006 | { | |
10007 | case FFESTP_formattypeE: | |
10008 | ffestb_local_.format.current = FFESTP_formattypeEN; | |
10009 | break; | |
10010 | ||
10011 | case FFESTP_formattypeB: | |
10012 | ffestb_local_.format.current = FFESTP_formattypeBN; | |
10013 | break; | |
10014 | ||
10015 | default: | |
10016 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
10017 | break; | |
10018 | } | |
10019 | i = FFESTR_formatlN; | |
10020 | break; | |
10021 | ||
10022 | default: | |
10023 | if (ffestb_local_.format.current != FFESTP_formattypeH) | |
10024 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
10025 | split_pea = FALSE; /* Go ahead and let the P be in the party. */ | |
10026 | p = strpbrk (ffelex_token_text (t), "0123456789"); | |
10027 | if (p == NULL) | |
10028 | i = ffelex_token_length (t); | |
10029 | else | |
10030 | i = p - ffelex_token_text (t); | |
10031 | } | |
10032 | ||
10033 | if (split_pea) | |
10034 | { | |
10035 | ffestb_subr_R1001_append_p_ (); | |
10036 | ffestb_local_.format.t = ffelex_token_use (t); | |
10037 | ffestb_local_.format.sign = FALSE; | |
10038 | ffestb_local_.format.pre.present = FALSE; | |
10039 | ffestb_local_.format.pre.rtexpr = FALSE; | |
10040 | ffestb_local_.format.pre.t = NULL; | |
10041 | ffestb_local_.format.pre.u.unsigned_val = 1; | |
10042 | } | |
10043 | ||
10044 | p = ffelex_token_text (t) + i; | |
10045 | if (*p == '\0') | |
10046 | return (ffelexHandler) ffestb_R10015_; | |
10047 | if (!isdigit (*p)) | |
10048 | { | |
10049 | ffestb_local_.format.current = FFESTP_formattypeNone; | |
10050 | p = strpbrk (p, "0123456789"); | |
10051 | if (p == NULL) | |
10052 | return (ffelexHandler) ffestb_R10015_; | |
10053 | i = p - ffelex_token_text (t); /* Collect digits anyway. */ | |
10054 | } | |
10055 | ffestb_local_.format.post.present = TRUE; | |
10056 | ffestb_local_.format.post.rtexpr = FALSE; | |
10057 | ffestb_local_.format.post.t = ffelex_token_number_from_names (t, i); | |
10058 | ffestb_local_.format.post.u.unsigned_val | |
10059 | = strtoul (ffelex_token_text (ffestb_local_.format.post.t), NULL, 10); | |
10060 | p += ffelex_token_length (ffestb_local_.format.post.t); | |
10061 | i += ffelex_token_length (ffestb_local_.format.post.t); | |
10062 | if (*p == '\0') | |
10063 | return (ffelexHandler) ffestb_R10016_; | |
10064 | ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL); | |
10065 | return (ffelexHandler) ffestb_R10016_; | |
10066 | ||
10067 | default: | |
10068 | ffestb_local_.format.post.present = FALSE; | |
10069 | ffestb_local_.format.post.rtexpr = FALSE; | |
10070 | ffestb_local_.format.post.t = NULL; | |
10071 | ffestb_local_.format.post.u.unsigned_val = 1; | |
10072 | return (ffelexHandler) ffestb_R10016_ (t); | |
10073 | } | |
10074 | } | |
10075 | ||
10076 | /* ffestb_R10016_ -- [[+/-] NUMBER] NAMES NUMBER | |
10077 | ||
10078 | return ffestb_R10016_; // to lexer | |
10079 | ||
10080 | Expect a PERIOD here. Maybe find a NUMBER to append to the current | |
10081 | number, in which case return to this state. Maybe find a NAMES to switch | |
10082 | from a kP descriptor to a new descriptor (else the NAMES is spurious), | |
10083 | in which case generator the P item and go to state _4_. Anything | |
10084 | else, pass token on to state _8_. */ | |
10085 | ||
10086 | static ffelexHandler | |
10087 | ffestb_R10016_ (ffelexToken t) | |
10088 | { | |
10089 | ffeTokenLength i; | |
10090 | ||
10091 | switch (ffelex_token_type (t)) | |
10092 | { | |
10093 | case FFELEX_typePERIOD: | |
10094 | return (ffelexHandler) ffestb_R10017_; | |
10095 | ||
10096 | case FFELEX_typeNUMBER: | |
10097 | assert (ffestb_local_.format.post.present); | |
10098 | ffesta_confirmed (); | |
10099 | if (ffestb_local_.format.post.rtexpr) | |
10100 | { | |
10101 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER); | |
10102 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
10103 | ffebad_finish (); | |
10104 | return (ffelexHandler) ffestb_R10016_; | |
10105 | } | |
10106 | for (i = 0; i < ffelex_token_length (t); ++i) | |
10107 | ffestb_local_.format.post.u.unsigned_val *= 10; | |
10108 | ffestb_local_.format.post.u.unsigned_val += strtoul (ffelex_token_text (t), | |
10109 | NULL, 10); | |
10110 | return (ffelexHandler) ffestb_R10016_; | |
10111 | ||
10112 | case FFELEX_typeNAMES: | |
10113 | ffesta_confirmed (); /* NUMBER " " NAMES invalid elsewhere. */ | |
10114 | if (ffestb_local_.format.current != FFESTP_formattypeP) | |
10115 | { | |
10116 | ffesta_ffebad_1t (FFEBAD_FORMAT_TEXT_IN_NUMBER, t); | |
10117 | return (ffelexHandler) ffestb_R10016_; | |
10118 | } | |
10119 | ffestb_subr_R1001_append_p_ (); | |
10120 | ffestb_local_.format.sign = FALSE; | |
10121 | ffestb_local_.format.pre = ffestb_local_.format.post; | |
10122 | return (ffelexHandler) ffestb_R10014_ (t); | |
10123 | ||
10124 | default: | |
10125 | ffestb_local_.format.dot.present = FALSE; | |
10126 | ffestb_local_.format.dot.rtexpr = FALSE; | |
10127 | ffestb_local_.format.dot.t = NULL; | |
10128 | ffestb_local_.format.dot.u.unsigned_val = 1; | |
10129 | return (ffelexHandler) ffestb_R10018_ (t); | |
10130 | } | |
10131 | } | |
10132 | ||
10133 | /* ffestb_R10017_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD | |
10134 | ||
10135 | return ffestb_R10017_; // to lexer | |
10136 | ||
10137 | Here we've gotten the period following the edit descriptor. | |
10138 | We expect either a NUMBER, for the dot value, or something else, which | |
10139 | probably means we're not even close to being in a real FORMAT statement. */ | |
10140 | ||
10141 | static ffelexHandler | |
10142 | ffestb_R10017_ (ffelexToken t) | |
10143 | { | |
10144 | switch (ffelex_token_type (t)) | |
10145 | { | |
10146 | case FFELEX_typeOPEN_ANGLE: | |
10147 | ffestb_local_.format.dot.t = ffelex_token_use (t); | |
10148 | ffelex_set_names_pure (FALSE); | |
10149 | if (!ffesta_seen_first_exec && !ffestb_local_.format.complained) | |
10150 | { | |
10151 | ffestb_local_.format.complained = TRUE; | |
10152 | ffebad_start (FFEBAD_FORMAT_EXPR_SPEC); | |
10153 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
10154 | ffebad_finish (); | |
10155 | } | |
10156 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
10157 | FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100117_); | |
10158 | ||
10159 | case FFELEX_typeNUMBER: | |
10160 | ffestb_local_.format.dot.present = TRUE; | |
10161 | ffestb_local_.format.dot.rtexpr = FALSE; | |
10162 | ffestb_local_.format.dot.t = ffelex_token_use (t); | |
10163 | ffestb_local_.format.dot.u.unsigned_val | |
10164 | = strtoul (ffelex_token_text (t), NULL, 10); | |
10165 | return (ffelexHandler) ffestb_R10018_; | |
10166 | ||
10167 | default: | |
10168 | ffelex_token_kill (ffestb_local_.format.t); | |
10169 | if (ffestb_local_.format.pre.present) | |
10170 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
10171 | if (ffestb_local_.format.post.present) | |
10172 | ffelex_token_kill (ffestb_local_.format.post.t); | |
10173 | ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_DOT, t); | |
10174 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10175 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10176 | (ffelexHandler) ffesta_zero); | |
10177 | } | |
10178 | } | |
10179 | ||
10180 | /* ffestb_R10018_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD NUMBER | |
10181 | ||
10182 | return ffestb_R10018_; // to lexer | |
10183 | ||
10184 | Expect a NAMES here, which must begin with "E" to be valid. Maybe find a | |
10185 | NUMBER to append to the current number, in which case return to this state. | |
10186 | Anything else, pass token on to state _10_. */ | |
10187 | ||
10188 | static ffelexHandler | |
10189 | ffestb_R10018_ (ffelexToken t) | |
10190 | { | |
10191 | ffeTokenLength i; | |
10192 | char *p; | |
10193 | ||
10194 | switch (ffelex_token_type (t)) | |
10195 | { | |
10196 | case FFELEX_typeNUMBER: | |
10197 | assert (ffestb_local_.format.dot.present); | |
10198 | ffesta_confirmed (); | |
10199 | if (ffestb_local_.format.dot.rtexpr) | |
10200 | { | |
10201 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER); | |
10202 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
10203 | ffebad_finish (); | |
10204 | return (ffelexHandler) ffestb_R10018_; | |
10205 | } | |
10206 | for (i = 0; i < ffelex_token_length (t); ++i) | |
10207 | ffestb_local_.format.dot.u.unsigned_val *= 10; | |
10208 | ffestb_local_.format.dot.u.unsigned_val += strtoul (ffelex_token_text (t), | |
10209 | NULL, 10); | |
10210 | return (ffelexHandler) ffestb_R10018_; | |
10211 | ||
10212 | case FFELEX_typeNAMES: | |
10213 | if (!ffesrc_char_match_init (*(p = ffelex_token_text (t)), 'E', 'e')) | |
10214 | { | |
10215 | ffesta_ffebad_1t (FFEBAD_FORMAT_TEXT_IN_NUMBER, t); | |
10216 | return (ffelexHandler) ffestb_R10018_; | |
10217 | } | |
10218 | if (*++p == '\0') | |
10219 | return (ffelexHandler) ffestb_R10019_; /* Go get NUMBER. */ | |
10220 | i = 1; | |
10221 | if (!isdigit (*p)) | |
10222 | { | |
10223 | ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, 1, NULL); | |
10224 | return (ffelexHandler) ffestb_R10018_; | |
10225 | } | |
10226 | ffestb_local_.format.exp.present = TRUE; | |
10227 | ffestb_local_.format.exp.rtexpr = FALSE; | |
10228 | ffestb_local_.format.exp.t = ffelex_token_number_from_names (t, i); | |
10229 | ffestb_local_.format.exp.u.unsigned_val | |
10230 | = strtoul (ffelex_token_text (ffestb_local_.format.exp.t), NULL, 10); | |
10231 | p += ffelex_token_length (ffestb_local_.format.exp.t); | |
10232 | i += ffelex_token_length (ffestb_local_.format.exp.t); | |
10233 | if (*p == '\0') | |
10234 | return (ffelexHandler) ffestb_R100110_; | |
10235 | ffesta_ffebad_1p (FFEBAD_FORMAT_TEXT_IN_NUMBER, t, i, NULL); | |
10236 | return (ffelexHandler) ffestb_R100110_; | |
10237 | ||
10238 | default: | |
10239 | ffestb_local_.format.exp.present = FALSE; | |
10240 | ffestb_local_.format.exp.rtexpr = FALSE; | |
10241 | ffestb_local_.format.exp.t = NULL; | |
10242 | ffestb_local_.format.exp.u.unsigned_val = 1; | |
10243 | return (ffelexHandler) ffestb_R100110_ (t); | |
10244 | } | |
10245 | } | |
10246 | ||
10247 | /* ffestb_R10019_ -- [[+/-] NUMBER] NAMES NUMBER PERIOD NUMBER "E" | |
10248 | ||
10249 | return ffestb_R10019_; // to lexer | |
10250 | ||
10251 | Here we've gotten the "E" following the edit descriptor. | |
10252 | We expect either a NUMBER, for the exponent value, or something else. */ | |
10253 | ||
10254 | static ffelexHandler | |
10255 | ffestb_R10019_ (ffelexToken t) | |
10256 | { | |
10257 | switch (ffelex_token_type (t)) | |
10258 | { | |
10259 | case FFELEX_typeOPEN_ANGLE: | |
10260 | ffestb_local_.format.exp.t = ffelex_token_use (t); | |
10261 | ffelex_set_names_pure (FALSE); | |
10262 | if (!ffesta_seen_first_exec && !ffestb_local_.format.complained) | |
10263 | { | |
10264 | ffestb_local_.format.complained = TRUE; | |
10265 | ffebad_start (FFEBAD_FORMAT_EXPR_SPEC); | |
10266 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
10267 | ffebad_finish (); | |
10268 | } | |
10269 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
10270 | FFEEXPR_contextFORMAT, (ffeexprCallback) ffestb_R100118_); | |
10271 | ||
10272 | case FFELEX_typeNUMBER: | |
10273 | ffestb_local_.format.exp.present = TRUE; | |
10274 | ffestb_local_.format.exp.rtexpr = FALSE; | |
10275 | ffestb_local_.format.exp.t = ffelex_token_use (t); | |
10276 | ffestb_local_.format.exp.u.unsigned_val | |
10277 | = strtoul (ffelex_token_text (t), NULL, 10); | |
10278 | return (ffelexHandler) ffestb_R100110_; | |
10279 | ||
10280 | default: | |
10281 | ffelex_token_kill (ffestb_local_.format.t); | |
10282 | if (ffestb_local_.format.pre.present) | |
10283 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
10284 | if (ffestb_local_.format.post.present) | |
10285 | ffelex_token_kill (ffestb_local_.format.post.t); | |
10286 | if (ffestb_local_.format.dot.present) | |
10287 | ffelex_token_kill (ffestb_local_.format.dot.t); | |
10288 | ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_EXP, t); | |
10289 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10290 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10291 | (ffelexHandler) ffesta_zero); | |
10292 | } | |
10293 | } | |
10294 | ||
10295 | /* ffestb_R100110_ -- [[+/-] NUMBER] NAMES NUMBER [PERIOD NUMBER ["E" NUMBER]] | |
10296 | ||
10297 | return ffestb_R100110_; // to lexer | |
10298 | ||
10299 | Maybe find a NUMBER to append to the current number, in which case return | |
10300 | to this state. Anything else, handle current descriptor, then pass token | |
10301 | on to state _10_. */ | |
10302 | ||
10303 | static ffelexHandler | |
10304 | ffestb_R100110_ (ffelexToken t) | |
10305 | { | |
10306 | ffeTokenLength i; | |
10307 | enum expect | |
10308 | { | |
10309 | required, | |
10310 | optional, | |
10311 | disallowed | |
10312 | }; | |
10313 | ffebad err; | |
10314 | enum expect pre; | |
10315 | enum expect post; | |
10316 | enum expect dot; | |
10317 | enum expect exp; | |
10318 | bool R1005; | |
10319 | ffesttFormatList f; | |
10320 | ||
10321 | switch (ffelex_token_type (t)) | |
10322 | { | |
10323 | case FFELEX_typeNUMBER: | |
10324 | assert (ffestb_local_.format.exp.present); | |
10325 | ffesta_confirmed (); | |
10326 | if (ffestb_local_.format.exp.rtexpr) | |
10327 | { | |
10328 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_NUMBER); | |
10329 | ffebad_here (0, ffelex_token_where_line (t), ffelex_token_where_column (t)); | |
10330 | ffebad_finish (); | |
10331 | return (ffelexHandler) ffestb_R100110_; | |
10332 | } | |
10333 | for (i = 0; i < ffelex_token_length (t); ++i) | |
10334 | ffestb_local_.format.exp.u.unsigned_val *= 10; | |
10335 | ffestb_local_.format.exp.u.unsigned_val += strtoul (ffelex_token_text (t), | |
10336 | NULL, 10); | |
10337 | return (ffelexHandler) ffestb_R100110_; | |
10338 | ||
10339 | default: | |
10340 | if (ffestb_local_.format.sign | |
10341 | && (ffestb_local_.format.current != FFESTP_formattypeP) | |
10342 | && (ffestb_local_.format.current != FFESTP_formattypeH)) | |
10343 | { | |
10344 | ffebad_start (FFEBAD_FORMAT_SPURIOUS_SIGN); | |
10345 | ffebad_here (0, ffelex_token_where_line (ffestb_local_.format.pre.t), | |
10346 | ffelex_token_where_column (ffestb_local_.format.pre.t)); | |
10347 | ffebad_finish (); | |
10348 | ffestb_local_.format.pre.u.unsigned_val | |
10349 | = (ffestb_local_.format.pre.u.signed_val < 0) | |
10350 | ? -ffestb_local_.format.pre.u.signed_val | |
10351 | : ffestb_local_.format.pre.u.signed_val; | |
10352 | } | |
10353 | switch (ffestb_local_.format.current) | |
10354 | { | |
10355 | case FFESTP_formattypeI: | |
10356 | err = FFEBAD_FORMAT_BAD_I_SPEC; | |
10357 | pre = optional; | |
10358 | post = required; | |
10359 | dot = optional; | |
10360 | exp = disallowed; | |
10361 | R1005 = TRUE; | |
10362 | break; | |
10363 | ||
10364 | case FFESTP_formattypeB: | |
10365 | err = FFEBAD_FORMAT_BAD_B_SPEC; | |
10366 | pre = optional; | |
10367 | post = required; | |
10368 | dot = optional; | |
10369 | exp = disallowed; | |
10370 | R1005 = TRUE; | |
10371 | break; | |
10372 | ||
10373 | case FFESTP_formattypeO: | |
10374 | err = FFEBAD_FORMAT_BAD_O_SPEC; | |
10375 | pre = optional; | |
10376 | post = required; | |
10377 | dot = optional; | |
10378 | exp = disallowed; | |
10379 | R1005 = TRUE; | |
10380 | break; | |
10381 | ||
10382 | case FFESTP_formattypeZ: | |
10383 | err = FFEBAD_FORMAT_BAD_Z_SPEC; | |
10384 | pre = optional; | |
10385 | post = required; | |
10386 | dot = optional; | |
10387 | exp = disallowed; | |
10388 | R1005 = TRUE; | |
10389 | break; | |
10390 | ||
10391 | case FFESTP_formattypeF: | |
10392 | err = FFEBAD_FORMAT_BAD_F_SPEC; | |
10393 | pre = optional; | |
10394 | post = required; | |
10395 | dot = required; | |
10396 | exp = disallowed; | |
10397 | R1005 = TRUE; | |
10398 | break; | |
10399 | ||
10400 | case FFESTP_formattypeE: | |
10401 | err = FFEBAD_FORMAT_BAD_E_SPEC; | |
10402 | pre = optional; | |
10403 | post = required; | |
10404 | dot = required; | |
10405 | exp = optional; | |
10406 | R1005 = TRUE; | |
10407 | break; | |
10408 | ||
10409 | case FFESTP_formattypeEN: | |
10410 | err = FFEBAD_FORMAT_BAD_EN_SPEC; | |
10411 | pre = optional; | |
10412 | post = required; | |
10413 | dot = required; | |
10414 | exp = optional; | |
10415 | R1005 = TRUE; | |
10416 | break; | |
10417 | ||
10418 | case FFESTP_formattypeG: | |
10419 | err = FFEBAD_FORMAT_BAD_G_SPEC; | |
10420 | pre = optional; | |
10421 | post = required; | |
10422 | dot = required; | |
10423 | exp = optional; | |
10424 | R1005 = TRUE; | |
10425 | break; | |
10426 | ||
10427 | case FFESTP_formattypeL: | |
10428 | err = FFEBAD_FORMAT_BAD_L_SPEC; | |
10429 | pre = optional; | |
10430 | post = required; | |
10431 | dot = disallowed; | |
10432 | exp = disallowed; | |
10433 | R1005 = TRUE; | |
10434 | break; | |
10435 | ||
10436 | case FFESTP_formattypeA: | |
10437 | err = FFEBAD_FORMAT_BAD_A_SPEC; | |
10438 | pre = optional; | |
10439 | post = optional; | |
10440 | dot = disallowed; | |
10441 | exp = disallowed; | |
10442 | R1005 = TRUE; | |
10443 | break; | |
10444 | ||
10445 | case FFESTP_formattypeD: | |
10446 | err = FFEBAD_FORMAT_BAD_D_SPEC; | |
10447 | pre = optional; | |
10448 | post = required; | |
10449 | dot = required; | |
10450 | exp = disallowed; | |
10451 | R1005 = TRUE; | |
10452 | break; | |
10453 | ||
10454 | case FFESTP_formattypeQ: | |
10455 | err = FFEBAD_FORMAT_BAD_Q_SPEC; | |
10456 | pre = disallowed; | |
10457 | post = disallowed; | |
10458 | dot = disallowed; | |
10459 | exp = disallowed; | |
10460 | R1005 = FALSE; | |
10461 | break; | |
10462 | ||
10463 | case FFESTP_formattypeDOLLAR: | |
10464 | err = FFEBAD_FORMAT_BAD_DOLLAR_SPEC; | |
10465 | pre = disallowed; | |
10466 | post = disallowed; | |
10467 | dot = disallowed; | |
10468 | exp = disallowed; | |
10469 | R1005 = FALSE; | |
10470 | break; | |
10471 | ||
10472 | case FFESTP_formattypeP: | |
10473 | err = FFEBAD_FORMAT_BAD_P_SPEC; | |
10474 | pre = required; | |
10475 | post = disallowed; | |
10476 | dot = disallowed; | |
10477 | exp = disallowed; | |
10478 | R1005 = FALSE; | |
10479 | break; | |
10480 | ||
10481 | case FFESTP_formattypeT: | |
10482 | err = FFEBAD_FORMAT_BAD_T_SPEC; | |
10483 | pre = disallowed; | |
10484 | post = required; | |
10485 | dot = disallowed; | |
10486 | exp = disallowed; | |
10487 | R1005 = FALSE; | |
10488 | break; | |
10489 | ||
10490 | case FFESTP_formattypeTL: | |
10491 | err = FFEBAD_FORMAT_BAD_TL_SPEC; | |
10492 | pre = disallowed; | |
10493 | post = required; | |
10494 | dot = disallowed; | |
10495 | exp = disallowed; | |
10496 | R1005 = FALSE; | |
10497 | break; | |
10498 | ||
10499 | case FFESTP_formattypeTR: | |
10500 | err = FFEBAD_FORMAT_BAD_TR_SPEC; | |
10501 | pre = disallowed; | |
10502 | post = required; | |
10503 | dot = disallowed; | |
10504 | exp = disallowed; | |
10505 | R1005 = FALSE; | |
10506 | break; | |
10507 | ||
10508 | case FFESTP_formattypeX: | |
10509 | err = FFEBAD_FORMAT_BAD_X_SPEC; | |
10510 | pre = required; | |
10511 | post = disallowed; | |
10512 | dot = disallowed; | |
10513 | exp = disallowed; | |
10514 | R1005 = FALSE; | |
10515 | break; | |
10516 | ||
10517 | case FFESTP_formattypeS: | |
10518 | err = FFEBAD_FORMAT_BAD_S_SPEC; | |
10519 | pre = disallowed; | |
10520 | post = disallowed; | |
10521 | dot = disallowed; | |
10522 | exp = disallowed; | |
10523 | R1005 = FALSE; | |
10524 | break; | |
10525 | ||
10526 | case FFESTP_formattypeSP: | |
10527 | err = FFEBAD_FORMAT_BAD_SP_SPEC; | |
10528 | pre = disallowed; | |
10529 | post = disallowed; | |
10530 | dot = disallowed; | |
10531 | exp = disallowed; | |
10532 | R1005 = FALSE; | |
10533 | break; | |
10534 | ||
10535 | case FFESTP_formattypeSS: | |
10536 | err = FFEBAD_FORMAT_BAD_SS_SPEC; | |
10537 | pre = disallowed; | |
10538 | post = disallowed; | |
10539 | dot = disallowed; | |
10540 | exp = disallowed; | |
10541 | R1005 = FALSE; | |
10542 | break; | |
10543 | ||
10544 | case FFESTP_formattypeBN: | |
10545 | err = FFEBAD_FORMAT_BAD_BN_SPEC; | |
10546 | pre = disallowed; | |
10547 | post = disallowed; | |
10548 | dot = disallowed; | |
10549 | exp = disallowed; | |
10550 | R1005 = FALSE; | |
10551 | break; | |
10552 | ||
10553 | case FFESTP_formattypeBZ: | |
10554 | err = FFEBAD_FORMAT_BAD_BZ_SPEC; | |
10555 | pre = disallowed; | |
10556 | post = disallowed; | |
10557 | dot = disallowed; | |
10558 | exp = disallowed; | |
10559 | R1005 = FALSE; | |
10560 | break; | |
10561 | ||
10562 | case FFESTP_formattypeH: /* Definitely an error, make sure of | |
10563 | it. */ | |
10564 | err = FFEBAD_FORMAT_BAD_H_SPEC; | |
10565 | pre = ffestb_local_.format.pre.present ? disallowed : required; | |
10566 | post = disallowed; | |
10567 | dot = disallowed; | |
10568 | exp = disallowed; | |
10569 | R1005 = FALSE; | |
10570 | break; | |
10571 | ||
10572 | case FFESTP_formattypeNone: | |
10573 | ffesta_ffebad_1t (FFEBAD_FORMAT_BAD_SPEC, | |
10574 | ffestb_local_.format.t); | |
10575 | ||
10576 | clean_up_to_11_: /* :::::::::::::::::::: */ | |
10577 | ||
10578 | ffelex_token_kill (ffestb_local_.format.t); | |
10579 | if (ffestb_local_.format.pre.present) | |
10580 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
10581 | if (ffestb_local_.format.post.present) | |
10582 | ffelex_token_kill (ffestb_local_.format.post.t); | |
10583 | if (ffestb_local_.format.dot.present) | |
10584 | ffelex_token_kill (ffestb_local_.format.dot.t); | |
10585 | if (ffestb_local_.format.exp.present) | |
10586 | ffelex_token_kill (ffestb_local_.format.exp.t); | |
10587 | return (ffelexHandler) ffestb_R100111_ (t); | |
10588 | ||
10589 | default: | |
10590 | assert (FALSE); | |
10591 | err = FFEBAD_FORMAT_BAD_H_SPEC; | |
10592 | pre = disallowed; | |
10593 | post = disallowed; | |
10594 | dot = disallowed; | |
10595 | exp = disallowed; | |
10596 | R1005 = FALSE; | |
10597 | break; | |
10598 | } | |
10599 | if (((pre == disallowed) && ffestb_local_.format.pre.present) | |
10600 | || ((pre == required) && !ffestb_local_.format.pre.present)) | |
10601 | { | |
10602 | ffesta_ffebad_1t (err, (pre == required) | |
10603 | ? ffestb_local_.format.t : ffestb_local_.format.pre.t); | |
10604 | goto clean_up_to_11_; /* :::::::::::::::::::: */ | |
10605 | } | |
10606 | if (((post == disallowed) && ffestb_local_.format.post.present) | |
10607 | || ((post == required) && !ffestb_local_.format.post.present)) | |
10608 | { | |
10609 | ffesta_ffebad_1t (err, (post == required) | |
10610 | ? ffestb_local_.format.t : ffestb_local_.format.post.t); | |
10611 | goto clean_up_to_11_; /* :::::::::::::::::::: */ | |
10612 | } | |
10613 | if (((dot == disallowed) && ffestb_local_.format.dot.present) | |
10614 | || ((dot == required) && !ffestb_local_.format.dot.present)) | |
10615 | { | |
10616 | ffesta_ffebad_1t (err, (dot == required) | |
10617 | ? ffestb_local_.format.t : ffestb_local_.format.dot.t); | |
10618 | goto clean_up_to_11_; /* :::::::::::::::::::: */ | |
10619 | } | |
10620 | if (((exp == disallowed) && ffestb_local_.format.exp.present) | |
10621 | || ((exp == required) && !ffestb_local_.format.exp.present)) | |
10622 | { | |
10623 | ffesta_ffebad_1t (err, (exp == required) | |
10624 | ? ffestb_local_.format.t : ffestb_local_.format.exp.t); | |
10625 | goto clean_up_to_11_; /* :::::::::::::::::::: */ | |
10626 | } | |
10627 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
10628 | f->type = ffestb_local_.format.current; | |
10629 | f->t = ffestb_local_.format.t; | |
10630 | if (R1005) | |
10631 | { | |
10632 | f->u.R1005.R1004 = ffestb_local_.format.pre; | |
10633 | f->u.R1005.R1006 = ffestb_local_.format.post; | |
10634 | f->u.R1005.R1007_or_R1008 = ffestb_local_.format.dot; | |
10635 | f->u.R1005.R1009 = ffestb_local_.format.exp; | |
10636 | } | |
10637 | else | |
10638 | /* Must be R1010. */ | |
10639 | { | |
10640 | if (pre == disallowed) | |
10641 | f->u.R1010.val = ffestb_local_.format.post; | |
10642 | else | |
10643 | f->u.R1010.val = ffestb_local_.format.pre; | |
10644 | } | |
10645 | return (ffelexHandler) ffestb_R100111_ (t); | |
10646 | } | |
10647 | } | |
10648 | ||
10649 | /* ffestb_R100111_ -- edit-descriptor | |
10650 | ||
10651 | return ffestb_R100111_; // to lexer | |
10652 | ||
10653 | Expect a COMMA, CLOSE_PAREN, CLOSE_ARRAY, COLON, COLONCOLON, SLASH, or | |
10654 | CONCAT, or complain about missing comma. */ | |
10655 | ||
10656 | static ffelexHandler | |
10657 | ffestb_R100111_ (ffelexToken t) | |
10658 | { | |
10659 | ffesttFormatList f; | |
10660 | ||
10661 | switch (ffelex_token_type (t)) | |
10662 | { | |
10663 | case FFELEX_typeCOMMA: | |
10664 | return (ffelexHandler) ffestb_R10012_; | |
10665 | ||
10666 | case FFELEX_typeCOLON: | |
10667 | case FFELEX_typeCOLONCOLON: | |
10668 | case FFELEX_typeSLASH: | |
10669 | case FFELEX_typeCONCAT: | |
10670 | return (ffelexHandler) ffestb_R10012_ (t); | |
10671 | ||
10672 | case FFELEX_typeCLOSE_PAREN: | |
10673 | f = ffestb_local_.format.f->u.root.parent; | |
10674 | if (f == NULL) | |
10675 | return (ffelexHandler) ffestb_R100114_; | |
10676 | ffestb_local_.format.f = f->next; | |
10677 | return (ffelexHandler) ffestb_R100111_; | |
10678 | ||
10679 | case FFELEX_typeCLOSE_ARRAY: /* "/)". */ | |
10680 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
10681 | f->type = FFESTP_formattypeSLASH; | |
10682 | f->t = ffelex_token_use (t); | |
10683 | f->u.R1010.val.present = FALSE; | |
10684 | f->u.R1010.val.rtexpr = FALSE; | |
10685 | f->u.R1010.val.t = NULL; | |
10686 | f->u.R1010.val.u.unsigned_val = 1; | |
10687 | f = ffestb_local_.format.f->u.root.parent; | |
10688 | if (f == NULL) | |
10689 | return (ffelexHandler) ffestb_R100114_; | |
10690 | ffestb_local_.format.f = f->next; | |
10691 | return (ffelexHandler) ffestb_R100111_; | |
10692 | ||
10693 | case FFELEX_typeOPEN_ANGLE: | |
10694 | case FFELEX_typeDOLLAR: | |
10695 | case FFELEX_typeNUMBER: | |
10696 | case FFELEX_typeOPEN_PAREN: | |
10697 | case FFELEX_typeOPEN_ARRAY: | |
10698 | case FFELEX_typeQUOTE: | |
10699 | case FFELEX_typeAPOSTROPHE: | |
10700 | case FFELEX_typeNAMES: | |
10701 | ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_COMMA, t); | |
10702 | return (ffelexHandler) ffestb_R10012_ (t); | |
10703 | ||
10704 | case FFELEX_typeEOS: | |
10705 | case FFELEX_typeSEMICOLON: | |
10706 | ffesta_confirmed (); | |
10707 | ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t); | |
10708 | for (f = ffestb_local_.format.f; | |
10709 | f->u.root.parent != NULL; | |
10710 | f = f->u.root.parent->next) | |
10711 | ; | |
10712 | ffestb_local_.format.f = f; | |
10713 | return (ffelexHandler) ffestb_R100114_ (t); | |
10714 | ||
10715 | default: | |
10716 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
10717 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10718 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10719 | (ffelexHandler) ffesta_zero); | |
10720 | } | |
10721 | } | |
10722 | ||
10723 | /* ffestb_R100112_ -- COLON, COLONCOLON, SLASH, OPEN_ARRAY, or CONCAT | |
10724 | ||
10725 | return ffestb_R100112_; // to lexer | |
10726 | ||
10727 | Like _11_ except the COMMA is optional. */ | |
10728 | ||
10729 | static ffelexHandler | |
10730 | ffestb_R100112_ (ffelexToken t) | |
10731 | { | |
10732 | ffesttFormatList f; | |
10733 | ||
10734 | switch (ffelex_token_type (t)) | |
10735 | { | |
10736 | case FFELEX_typeCOMMA: | |
10737 | return (ffelexHandler) ffestb_R10012_; | |
10738 | ||
10739 | case FFELEX_typeCOLON: | |
10740 | case FFELEX_typeCOLONCOLON: | |
10741 | case FFELEX_typeSLASH: | |
10742 | case FFELEX_typeCONCAT: | |
10743 | case FFELEX_typeOPEN_ANGLE: | |
10744 | case FFELEX_typeNAMES: | |
10745 | case FFELEX_typeDOLLAR: | |
10746 | case FFELEX_typeNUMBER: | |
10747 | case FFELEX_typeOPEN_PAREN: | |
10748 | case FFELEX_typeOPEN_ARRAY: | |
10749 | case FFELEX_typeQUOTE: | |
10750 | case FFELEX_typeAPOSTROPHE: | |
10751 | case FFELEX_typePLUS: | |
10752 | case FFELEX_typeMINUS: | |
10753 | return (ffelexHandler) ffestb_R10012_ (t); | |
10754 | ||
10755 | case FFELEX_typeCLOSE_PAREN: | |
10756 | f = ffestb_local_.format.f->u.root.parent; | |
10757 | if (f == NULL) | |
10758 | return (ffelexHandler) ffestb_R100114_; | |
10759 | ffestb_local_.format.f = f->next; | |
10760 | return (ffelexHandler) ffestb_R100111_; | |
10761 | ||
10762 | case FFELEX_typeCLOSE_ARRAY: /* "/)". */ | |
10763 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
10764 | f->type = FFESTP_formattypeSLASH; | |
10765 | f->t = ffelex_token_use (t); | |
10766 | f->u.R1010.val.present = FALSE; | |
10767 | f->u.R1010.val.rtexpr = FALSE; | |
10768 | f->u.R1010.val.t = NULL; | |
10769 | f->u.R1010.val.u.unsigned_val = 1; | |
10770 | f = ffestb_local_.format.f->u.root.parent; | |
10771 | if (f == NULL) | |
10772 | return (ffelexHandler) ffestb_R100114_; | |
10773 | ffestb_local_.format.f = f->next; | |
10774 | return (ffelexHandler) ffestb_R100111_; | |
10775 | ||
10776 | case FFELEX_typeEOS: | |
10777 | case FFELEX_typeSEMICOLON: | |
10778 | ffesta_confirmed (); | |
10779 | ffesta_ffebad_1t (FFEBAD_FORMAT_MISSING_PAREN, t); | |
10780 | for (f = ffestb_local_.format.f; | |
10781 | f->u.root.parent != NULL; | |
10782 | f = f->u.root.parent->next) | |
10783 | ; | |
10784 | ffestb_local_.format.f = f; | |
10785 | return (ffelexHandler) ffestb_R100114_ (t); | |
10786 | ||
10787 | default: | |
10788 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
10789 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10790 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10791 | (ffelexHandler) ffesta_zero); | |
10792 | } | |
10793 | } | |
10794 | ||
10795 | /* ffestb_R100113_ -- Handle CHARACTER token. | |
10796 | ||
10797 | return ffestb_R100113_; // to lexer | |
10798 | ||
10799 | Append the format item to the list, go to _11_. */ | |
10800 | ||
10801 | static ffelexHandler | |
10802 | ffestb_R100113_ (ffelexToken t) | |
10803 | { | |
10804 | ffesttFormatList f; | |
10805 | ||
10806 | assert (ffelex_token_type (t) == FFELEX_typeCHARACTER); | |
10807 | ||
10808 | if (ffe_is_pedantic_not_90 () && (ffelex_token_length (t) == 0)) | |
10809 | { | |
10810 | ffebad_start (FFEBAD_NULL_CHAR_CONST); | |
10811 | ffebad_here (0, ffelex_token_where_line (t), | |
10812 | ffelex_token_where_column (t)); | |
10813 | ffebad_finish (); | |
10814 | } | |
10815 | ||
10816 | f = ffestt_formatlist_append (ffestb_local_.format.f); | |
10817 | f->type = FFESTP_formattypeR1016; | |
10818 | f->t = ffelex_token_use (t); | |
10819 | return (ffelexHandler) ffestb_R100111_; | |
10820 | } | |
10821 | ||
10822 | /* ffestb_R100114_ -- "FORMAT" OPEN_PAREN format-item-list CLOSE_PAREN | |
10823 | ||
10824 | return ffestb_R100114_; // to lexer | |
10825 | ||
10826 | Handle EOS/SEMICOLON or something else. */ | |
10827 | ||
10828 | static ffelexHandler | |
10829 | ffestb_R100114_ (ffelexToken t) | |
10830 | { | |
10831 | ffelex_set_names_pure (FALSE); | |
10832 | ||
10833 | switch (ffelex_token_type (t)) | |
10834 | { | |
10835 | case FFELEX_typeEOS: | |
10836 | case FFELEX_typeSEMICOLON: | |
10837 | ffesta_confirmed (); | |
10838 | if (!ffesta_is_inhibited () && !ffestb_local_.format.complained) | |
10839 | ffestc_R1001 (ffestb_local_.format.f); | |
10840 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10841 | return (ffelexHandler) ffesta_zero (t); | |
10842 | ||
10843 | default: | |
10844 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
10845 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10846 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10847 | (ffelexHandler) ffesta_zero); | |
10848 | } | |
10849 | } | |
10850 | ||
10851 | /* ffestb_R100115_ -- OPEN_ANGLE expr | |
10852 | ||
10853 | (ffestb_R100115_) // to expression handler | |
10854 | ||
10855 | Handle expression prior to the edit descriptor. */ | |
10856 | ||
10857 | static ffelexHandler | |
10858 | ffestb_R100115_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t) | |
10859 | { | |
10860 | switch (ffelex_token_type (t)) | |
10861 | { | |
10862 | case FFELEX_typeCLOSE_ANGLE: | |
10863 | ffestb_local_.format.pre.present = TRUE; | |
10864 | ffestb_local_.format.pre.rtexpr = TRUE; | |
10865 | ffestb_local_.format.pre.u.expr = expr; | |
10866 | ffelex_set_names_pure (TRUE); | |
10867 | return (ffelexHandler) ffestb_R10014_; | |
10868 | ||
10869 | default: | |
10870 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
10871 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
10872 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10873 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10874 | (ffelexHandler) ffesta_zero); | |
10875 | } | |
10876 | } | |
10877 | ||
10878 | /* ffestb_R100116_ -- "[n]X" OPEN_ANGLE expr | |
10879 | ||
10880 | (ffestb_R100116_) // to expression handler | |
10881 | ||
10882 | Handle expression after the edit descriptor. */ | |
10883 | ||
10884 | static ffelexHandler | |
10885 | ffestb_R100116_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t) | |
10886 | { | |
10887 | switch (ffelex_token_type (t)) | |
10888 | { | |
10889 | case FFELEX_typeCLOSE_ANGLE: | |
10890 | ffestb_local_.format.post.present = TRUE; | |
10891 | ffestb_local_.format.post.rtexpr = TRUE; | |
10892 | ffestb_local_.format.post.u.expr = expr; | |
10893 | ffelex_set_names_pure (TRUE); | |
10894 | return (ffelexHandler) ffestb_R10016_; | |
10895 | ||
10896 | default: | |
10897 | ffelex_token_kill (ffestb_local_.format.t); | |
10898 | ffelex_token_kill (ffestb_local_.format.post.t); | |
10899 | if (ffestb_local_.format.pre.present) | |
10900 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
10901 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
10902 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10903 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10904 | (ffelexHandler) ffesta_zero); | |
10905 | } | |
10906 | } | |
10907 | ||
10908 | /* ffestb_R100117_ -- "[n]X[n]." OPEN_ANGLE expr | |
10909 | ||
10910 | (ffestb_R100117_) // to expression handler | |
10911 | ||
10912 | Handle expression after the PERIOD. */ | |
10913 | ||
10914 | static ffelexHandler | |
10915 | ffestb_R100117_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t) | |
10916 | { | |
10917 | switch (ffelex_token_type (t)) | |
10918 | { | |
10919 | case FFELEX_typeCLOSE_ANGLE: | |
10920 | ffestb_local_.format.dot.present = TRUE; | |
10921 | ffestb_local_.format.dot.rtexpr = TRUE; | |
10922 | ffestb_local_.format.dot.u.expr = expr; | |
10923 | ffelex_set_names_pure (TRUE); | |
10924 | return (ffelexHandler) ffestb_R10018_; | |
10925 | ||
10926 | default: | |
10927 | ffelex_token_kill (ffestb_local_.format.t); | |
10928 | ffelex_token_kill (ffestb_local_.format.dot.t); | |
10929 | if (ffestb_local_.format.pre.present) | |
10930 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
10931 | if (ffestb_local_.format.post.present) | |
10932 | ffelex_token_kill (ffestb_local_.format.post.t); | |
10933 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
10934 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10935 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10936 | (ffelexHandler) ffesta_zero); | |
10937 | } | |
10938 | } | |
10939 | ||
10940 | /* ffestb_R100118_ -- "[n]X[n].[n]E" OPEN_ANGLE expr | |
10941 | ||
10942 | (ffestb_R100118_) // to expression handler | |
10943 | ||
10944 | Handle expression after the "E". */ | |
10945 | ||
10946 | static ffelexHandler | |
10947 | ffestb_R100118_ (ffelexToken ft UNUSED, ffebld expr, ffelexToken t) | |
10948 | { | |
10949 | switch (ffelex_token_type (t)) | |
10950 | { | |
10951 | case FFELEX_typeCLOSE_ANGLE: | |
10952 | ffestb_local_.format.exp.present = TRUE; | |
10953 | ffestb_local_.format.exp.rtexpr = TRUE; | |
10954 | ffestb_local_.format.exp.u.expr = expr; | |
10955 | ffelex_set_names_pure (TRUE); | |
10956 | return (ffelexHandler) ffestb_R100110_; | |
10957 | ||
10958 | default: | |
10959 | ffelex_token_kill (ffestb_local_.format.t); | |
10960 | ffelex_token_kill (ffestb_local_.format.exp.t); | |
10961 | if (ffestb_local_.format.pre.present) | |
10962 | ffelex_token_kill (ffestb_local_.format.pre.t); | |
10963 | if (ffestb_local_.format.post.present) | |
10964 | ffelex_token_kill (ffestb_local_.format.post.t); | |
10965 | if (ffestb_local_.format.dot.present) | |
10966 | ffelex_token_kill (ffestb_local_.format.dot.t); | |
10967 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FORMAT", t); | |
10968 | ffestt_formatlist_kill (ffestb_local_.format.f); | |
10969 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
10970 | (ffelexHandler) ffesta_zero); | |
10971 | } | |
10972 | } | |
10973 | ||
10974 | /* ffestb_R1107 -- Parse the USE statement | |
10975 | ||
10976 | return ffestb_R1107; // to lexer | |
10977 | ||
10978 | Make sure the statement has a valid form for the USE statement. | |
10979 | If it does, implement the statement. */ | |
10980 | ||
10981 | #if FFESTR_F90 | |
10982 | ffelexHandler | |
10983 | ffestb_R1107 (ffelexToken t) | |
10984 | { | |
10985 | ffeTokenLength i; | |
10986 | char *p; | |
10987 | ||
10988 | switch (ffelex_token_type (ffesta_tokens[0])) | |
10989 | { | |
10990 | case FFELEX_typeNAME: | |
10991 | if (ffesta_first_kw != FFESTR_firstUSE) | |
10992 | goto bad_0; /* :::::::::::::::::::: */ | |
10993 | switch (ffelex_token_type (t)) | |
10994 | { | |
10995 | case FFELEX_typeNAME: | |
10996 | break; | |
10997 | ||
10998 | case FFELEX_typeEOS: | |
10999 | case FFELEX_typeSEMICOLON: | |
11000 | case FFELEX_typeCOMMA: | |
11001 | case FFELEX_typeCOLONCOLON: | |
11002 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
11003 | goto bad_1; /* :::::::::::::::::::: */ | |
11004 | ||
11005 | default: | |
11006 | goto bad_0; /* :::::::::::::::::::: */ | |
11007 | } | |
11008 | ffesta_confirmed (); | |
11009 | ffesta_tokens[1] = ffelex_token_use (t); | |
11010 | return (ffelexHandler) ffestb_R11071_; | |
11011 | ||
11012 | case FFELEX_typeNAMES: | |
11013 | if (ffesta_first_kw != FFESTR_firstUSE) | |
11014 | goto bad_0; /* :::::::::::::::::::: */ | |
11015 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlUSE); | |
11016 | if (!ffesrc_is_name_init (*p)) | |
11017 | goto bad_i; /* :::::::::::::::::::: */ | |
11018 | switch (ffelex_token_type (t)) | |
11019 | { | |
11020 | case FFELEX_typeCOLONCOLON: | |
11021 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
11022 | goto bad_1; /* :::::::::::::::::::: */ | |
11023 | ||
11024 | default: | |
11025 | goto bad_1; /* :::::::::::::::::::: */ | |
11026 | ||
11027 | case FFELEX_typeCOMMA: | |
11028 | case FFELEX_typeEOS: | |
11029 | case FFELEX_typeSEMICOLON: | |
11030 | break; | |
11031 | } | |
11032 | ffesta_confirmed (); | |
11033 | ffesta_tokens[1] | |
11034 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
11035 | return (ffelexHandler) ffestb_R11071_ (t); | |
11036 | ||
11037 | default: | |
11038 | goto bad_0; /* :::::::::::::::::::: */ | |
11039 | } | |
11040 | ||
11041 | bad_0: /* :::::::::::::::::::: */ | |
11042 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", ffesta_tokens[0]); | |
11043 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11044 | ||
11045 | bad_1: /* :::::::::::::::::::: */ | |
11046 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11047 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
11048 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
11049 | ||
11050 | bad_i: /* :::::::::::::::::::: */ | |
11051 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "USE", ffesta_tokens[0], i, t); | |
11052 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11053 | } | |
11054 | ||
11055 | /* ffestb_R11071_ -- "USE" NAME | |
11056 | ||
11057 | return ffestb_R11071_; // to lexer | |
11058 | ||
11059 | Make sure the statement has a valid form for the USE statement. If it | |
11060 | does, implement the statement. */ | |
11061 | ||
11062 | static ffelexHandler | |
11063 | ffestb_R11071_ (ffelexToken t) | |
11064 | { | |
11065 | switch (ffelex_token_type (t)) | |
11066 | { | |
11067 | case FFELEX_typeEOS: | |
11068 | case FFELEX_typeSEMICOLON: | |
11069 | if (!ffesta_is_inhibited ()) | |
11070 | { | |
11071 | ffestc_R1107_start (ffesta_tokens[1], FALSE); | |
11072 | ffestc_R1107_finish (); | |
11073 | } | |
11074 | ffelex_token_kill (ffesta_tokens[1]); | |
11075 | return (ffelexHandler) ffesta_zero (t); | |
11076 | ||
11077 | case FFELEX_typeCOMMA: | |
11078 | return (ffelexHandler) ffestb_R11072_; | |
11079 | ||
11080 | default: | |
11081 | break; | |
11082 | } | |
11083 | ||
11084 | ffelex_token_kill (ffesta_tokens[1]); | |
11085 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11086 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11087 | } | |
11088 | ||
11089 | /* ffestb_R11072_ -- "USE" NAME COMMA | |
11090 | ||
11091 | return ffestb_R11072_; // to lexer | |
11092 | ||
11093 | Make sure the statement has a valid form for the USE statement. If it | |
11094 | does, implement the statement. */ | |
11095 | ||
11096 | static ffelexHandler | |
11097 | ffestb_R11072_ (ffelexToken t) | |
11098 | { | |
11099 | switch (ffelex_token_type (t)) | |
11100 | { | |
11101 | case FFELEX_typeNAME: | |
11102 | ffesta_tokens[2] = ffelex_token_use (t); | |
11103 | return (ffelexHandler) ffestb_R11073_; | |
11104 | ||
11105 | default: | |
11106 | break; | |
11107 | } | |
11108 | ||
11109 | ffelex_token_kill (ffesta_tokens[1]); | |
11110 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11111 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11112 | } | |
11113 | ||
11114 | /* ffestb_R11073_ -- "USE" NAME COMMA NAME | |
11115 | ||
11116 | return ffestb_R11073_; // to lexer | |
11117 | ||
11118 | Make sure the statement has a valid form for the USE statement. If it | |
11119 | does, implement the statement. */ | |
11120 | ||
11121 | static ffelexHandler | |
11122 | ffestb_R11073_ (ffelexToken t) | |
11123 | { | |
11124 | switch (ffelex_token_type (t)) | |
11125 | { | |
11126 | case FFELEX_typeCOLON: | |
11127 | if (ffestr_other (ffesta_tokens[2]) != FFESTR_otherONLY) | |
11128 | break; | |
11129 | if (!ffesta_is_inhibited ()) | |
11130 | ffestc_R1107_start (ffesta_tokens[1], TRUE); | |
11131 | ffelex_token_kill (ffesta_tokens[1]); | |
11132 | ffelex_token_kill (ffesta_tokens[2]); | |
11133 | return (ffelexHandler) ffestb_R11074_; | |
11134 | ||
11135 | case FFELEX_typePOINTS: | |
11136 | if (!ffesta_is_inhibited ()) | |
11137 | ffestc_R1107_start (ffesta_tokens[1], FALSE); | |
11138 | ffelex_token_kill (ffesta_tokens[1]); | |
11139 | ffesta_tokens[1] = ffesta_tokens[2]; | |
11140 | return (ffelexHandler) ffestb_R110711_; | |
11141 | ||
11142 | default: | |
11143 | break; | |
11144 | } | |
11145 | ||
11146 | ffelex_token_kill (ffesta_tokens[1]); | |
11147 | ffelex_token_kill (ffesta_tokens[2]); | |
11148 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11149 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11150 | } | |
11151 | ||
11152 | /* ffestb_R11074_ -- "USE" NAME COMMA "ONLY" COLON | |
11153 | ||
11154 | return ffestb_R11074_; // to lexer | |
11155 | ||
11156 | Make sure the statement has a valid form for the USE statement. If it | |
11157 | does, implement the statement. */ | |
11158 | ||
11159 | static ffelexHandler | |
11160 | ffestb_R11074_ (ffelexToken t) | |
11161 | { | |
11162 | switch (ffelex_token_type (t)) | |
11163 | { | |
11164 | case FFELEX_typeNAME: | |
11165 | ffesta_tokens[1] = ffelex_token_use (t); | |
11166 | return (ffelexHandler) ffestb_R11075_; | |
11167 | ||
11168 | case FFELEX_typeEOS: | |
11169 | case FFELEX_typeSEMICOLON: | |
11170 | if (!ffesta_is_inhibited ()) | |
11171 | ffestc_R1107_finish (); | |
11172 | return (ffelexHandler) ffesta_zero (t); | |
11173 | ||
11174 | default: | |
11175 | break; | |
11176 | } | |
11177 | ||
11178 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11179 | ffestc_R1107_finish (); | |
11180 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11181 | } | |
11182 | ||
11183 | /* ffestb_R11075_ -- "USE" NAME COMMA "ONLY" COLON NAME | |
11184 | ||
11185 | return ffestb_R11075_; // to lexer | |
11186 | ||
11187 | Make sure the statement has a valid form for the USE statement. If it | |
11188 | does, implement the statement. */ | |
11189 | ||
11190 | static ffelexHandler | |
11191 | ffestb_R11075_ (ffelexToken t) | |
11192 | { | |
11193 | switch (ffelex_token_type (t)) | |
11194 | { | |
11195 | case FFELEX_typeEOS: | |
11196 | case FFELEX_typeSEMICOLON: | |
11197 | if (!ffesta_is_inhibited ()) | |
11198 | { | |
11199 | ffestc_R1107_item (NULL, ffesta_tokens[1]); | |
11200 | ffestc_R1107_finish (); | |
11201 | } | |
11202 | ffelex_token_kill (ffesta_tokens[1]); | |
11203 | return (ffelexHandler) ffesta_zero (t); | |
11204 | ||
11205 | case FFELEX_typeCOMMA: | |
11206 | if (!ffesta_is_inhibited ()) | |
11207 | ffestc_R1107_item (NULL, ffesta_tokens[1]); | |
11208 | ffelex_token_kill (ffesta_tokens[1]); | |
11209 | return (ffelexHandler) ffestb_R11078_; | |
11210 | ||
11211 | case FFELEX_typePOINTS: | |
11212 | return (ffelexHandler) ffestb_R11076_; | |
11213 | ||
11214 | default: | |
11215 | break; | |
11216 | } | |
11217 | ||
11218 | ffelex_token_kill (ffesta_tokens[1]); | |
11219 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11220 | ffestc_R1107_finish (); | |
11221 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11222 | } | |
11223 | ||
11224 | /* ffestb_R11076_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS | |
11225 | ||
11226 | return ffestb_R11076_; // to lexer | |
11227 | ||
11228 | Make sure the statement has a valid form for the USE statement. If it | |
11229 | does, implement the statement. */ | |
11230 | ||
11231 | static ffelexHandler | |
11232 | ffestb_R11076_ (ffelexToken t) | |
11233 | { | |
11234 | switch (ffelex_token_type (t)) | |
11235 | { | |
11236 | case FFELEX_typeNAME: | |
11237 | if (!ffesta_is_inhibited ()) | |
11238 | ffestc_R1107_item (ffesta_tokens[1], t); | |
11239 | ffelex_token_kill (ffesta_tokens[1]); | |
11240 | return (ffelexHandler) ffestb_R11077_; | |
11241 | ||
11242 | default: | |
11243 | break; | |
11244 | } | |
11245 | ||
11246 | ffelex_token_kill (ffesta_tokens[1]); | |
11247 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11248 | ffestc_R1107_finish (); | |
11249 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11250 | } | |
11251 | ||
11252 | /* ffestb_R11077_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS NAME | |
11253 | ||
11254 | return ffestb_R11077_; // to lexer | |
11255 | ||
11256 | Make sure the statement has a valid form for the USE statement. If it | |
11257 | does, implement the statement. */ | |
11258 | ||
11259 | static ffelexHandler | |
11260 | ffestb_R11077_ (ffelexToken t) | |
11261 | { | |
11262 | switch (ffelex_token_type (t)) | |
11263 | { | |
11264 | case FFELEX_typeEOS: | |
11265 | case FFELEX_typeSEMICOLON: | |
11266 | if (!ffesta_is_inhibited ()) | |
11267 | ffestc_R1107_finish (); | |
11268 | return (ffelexHandler) ffesta_zero (t); | |
11269 | ||
11270 | case FFELEX_typeCOMMA: | |
11271 | return (ffelexHandler) ffestb_R11078_; | |
11272 | ||
11273 | default: | |
11274 | break; | |
11275 | } | |
11276 | ||
11277 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11278 | ffestc_R1107_finish (); | |
11279 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11280 | } | |
11281 | ||
11282 | /* ffestb_R11078_ -- "USE" NAME COMMA "ONLY" COLON NAME POINTS NAME COMMA | |
11283 | ||
11284 | return ffestb_R11078_; // to lexer | |
11285 | ||
11286 | Make sure the statement has a valid form for the USE statement. If it | |
11287 | does, implement the statement. */ | |
11288 | ||
11289 | static ffelexHandler | |
11290 | ffestb_R11078_ (ffelexToken t) | |
11291 | { | |
11292 | switch (ffelex_token_type (t)) | |
11293 | { | |
11294 | case FFELEX_typeNAME: | |
11295 | ffesta_tokens[1] = ffelex_token_use (t); | |
11296 | return (ffelexHandler) ffestb_R11075_; | |
11297 | ||
11298 | default: | |
11299 | break; | |
11300 | } | |
11301 | ||
11302 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11303 | ffestc_R1107_finish (); | |
11304 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11305 | } | |
11306 | ||
11307 | /* ffestb_R11079_ -- "USE" NAME COMMA | |
11308 | ||
11309 | return ffestb_R11079_; // to lexer | |
11310 | ||
11311 | Make sure the statement has a valid form for the USE statement. If it | |
11312 | does, implement the statement. */ | |
11313 | ||
11314 | static ffelexHandler | |
11315 | ffestb_R11079_ (ffelexToken t) | |
11316 | { | |
11317 | switch (ffelex_token_type (t)) | |
11318 | { | |
11319 | case FFELEX_typeNAME: | |
11320 | ffesta_tokens[1] = ffelex_token_use (t); | |
11321 | return (ffelexHandler) ffestb_R110710_; | |
11322 | ||
11323 | default: | |
11324 | break; | |
11325 | } | |
11326 | ||
11327 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11328 | ffestc_R1107_finish (); | |
11329 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11330 | } | |
11331 | ||
11332 | /* ffestb_R110710_ -- "USE" NAME COMMA NAME | |
11333 | ||
11334 | return ffestb_R110710_; // to lexer | |
11335 | ||
11336 | Make sure the statement has a valid form for the USE statement. If it | |
11337 | does, implement the statement. */ | |
11338 | ||
11339 | static ffelexHandler | |
11340 | ffestb_R110710_ (ffelexToken t) | |
11341 | { | |
11342 | switch (ffelex_token_type (t)) | |
11343 | { | |
11344 | case FFELEX_typePOINTS: | |
11345 | return (ffelexHandler) ffestb_R110711_; | |
11346 | ||
11347 | default: | |
11348 | break; | |
11349 | } | |
11350 | ||
11351 | ffelex_token_kill (ffesta_tokens[1]); | |
11352 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11353 | ffestc_R1107_finish (); | |
11354 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11355 | } | |
11356 | ||
11357 | /* ffestb_R110711_ -- "USE" NAME COMMA NAME POINTS | |
11358 | ||
11359 | return ffestb_R110711_; // to lexer | |
11360 | ||
11361 | Make sure the statement has a valid form for the USE statement. If it | |
11362 | does, implement the statement. */ | |
11363 | ||
11364 | static ffelexHandler | |
11365 | ffestb_R110711_ (ffelexToken t) | |
11366 | { | |
11367 | switch (ffelex_token_type (t)) | |
11368 | { | |
11369 | case FFELEX_typeNAME: | |
11370 | if (!ffesta_is_inhibited ()) | |
11371 | ffestc_R1107_item (ffesta_tokens[1], t); | |
11372 | ffelex_token_kill (ffesta_tokens[1]); | |
11373 | return (ffelexHandler) ffestb_R110712_; | |
11374 | ||
11375 | default: | |
11376 | break; | |
11377 | } | |
11378 | ||
11379 | ffelex_token_kill (ffesta_tokens[1]); | |
11380 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11381 | ffestc_R1107_finish (); | |
11382 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11383 | } | |
11384 | ||
11385 | /* ffestb_R110712_ -- "USE" NAME COMMA NAME POINTS NAME | |
11386 | ||
11387 | return ffestb_R110712_; // to lexer | |
11388 | ||
11389 | Make sure the statement has a valid form for the USE statement. If it | |
11390 | does, implement the statement. */ | |
11391 | ||
11392 | static ffelexHandler | |
11393 | ffestb_R110712_ (ffelexToken t) | |
11394 | { | |
11395 | switch (ffelex_token_type (t)) | |
11396 | { | |
11397 | case FFELEX_typeEOS: | |
11398 | case FFELEX_typeSEMICOLON: | |
11399 | if (!ffesta_is_inhibited ()) | |
11400 | ffestc_R1107_finish (); | |
11401 | return (ffelexHandler) ffesta_zero (t); | |
11402 | ||
11403 | case FFELEX_typeCOMMA: | |
11404 | return (ffelexHandler) ffestb_R11079_; | |
11405 | ||
11406 | default: | |
11407 | break; | |
11408 | } | |
11409 | ||
11410 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "USE", t); | |
11411 | ffestc_R1107_finish (); | |
11412 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11413 | } | |
11414 | ||
11415 | #endif | |
11416 | /* ffestb_R1202 -- Parse the INTERFACE statement | |
11417 | ||
11418 | return ffestb_R1202; // to lexer | |
11419 | ||
11420 | Make sure the statement has a valid form for the INTERFACE statement. | |
11421 | If it does, implement the statement. | |
11422 | ||
11423 | 15-May-90 JCB 1.1 | |
11424 | Allow INTERFACE by itself; missed this | |
11425 | valid form when originally doing syntactic analysis code. */ | |
11426 | ||
11427 | #if FFESTR_F90 | |
11428 | ffelexHandler | |
11429 | ffestb_R1202 (ffelexToken t) | |
11430 | { | |
11431 | ffeTokenLength i; | |
11432 | char *p; | |
11433 | ||
11434 | switch (ffelex_token_type (ffesta_tokens[0])) | |
11435 | { | |
11436 | case FFELEX_typeNAME: | |
11437 | if (ffesta_first_kw != FFESTR_firstINTERFACE) | |
11438 | goto bad_0; /* :::::::::::::::::::: */ | |
11439 | switch (ffelex_token_type (t)) | |
11440 | { | |
11441 | case FFELEX_typeNAME: | |
11442 | break; | |
11443 | ||
11444 | case FFELEX_typeEOS: | |
11445 | case FFELEX_typeSEMICOLON: | |
11446 | ffesta_confirmed (); | |
11447 | if (!ffesta_is_inhibited ()) | |
11448 | ffestc_R1202 (FFESTP_definedoperatorNone, NULL); | |
11449 | return (ffelexHandler) ffesta_zero (t); | |
11450 | ||
11451 | case FFELEX_typeCOMMA: | |
11452 | case FFELEX_typeCOLONCOLON: | |
11453 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
11454 | goto bad_1; /* :::::::::::::::::::: */ | |
11455 | ||
11456 | default: | |
11457 | goto bad_1; /* :::::::::::::::::::: */ | |
11458 | } | |
11459 | ||
11460 | ffesta_confirmed (); | |
11461 | switch (ffesta_second_kw) | |
11462 | { | |
11463 | case FFESTR_secondOPERATOR: | |
11464 | ffestb_local_.interface.operator = FFESTP_definedoperatorOPERATOR; | |
11465 | break; | |
11466 | ||
11467 | case FFESTR_secondASSIGNMENT: | |
11468 | ffestb_local_.interface.operator = FFESTP_definedoperatorASSIGNMENT; | |
11469 | break; | |
11470 | ||
11471 | default: | |
11472 | ffestb_local_.interface.operator = FFESTP_definedoperatorNone; | |
11473 | break; | |
11474 | } | |
11475 | ffesta_tokens[1] = ffelex_token_use (t); | |
11476 | return (ffelexHandler) ffestb_R12021_; | |
11477 | ||
11478 | case FFELEX_typeNAMES: | |
11479 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlINTERFACE); | |
11480 | switch (ffesta_first_kw) | |
11481 | { | |
11482 | case FFESTR_firstINTERFACEOPERATOR: | |
11483 | if (*(ffelex_token_text (ffesta_tokens[0]) | |
11484 | + FFESTR_firstlINTERFACEOPERATOR) == '\0') | |
11485 | ffestb_local_.interface.operator | |
11486 | = FFESTP_definedoperatorOPERATOR; | |
11487 | break; | |
11488 | ||
11489 | case FFESTR_firstINTERFACEASSGNMNT: | |
11490 | if (*(ffelex_token_text (ffesta_tokens[0]) | |
11491 | + FFESTR_firstlINTERFACEASSGNMNT) == '\0') | |
11492 | ffestb_local_.interface.operator | |
11493 | = FFESTP_definedoperatorASSIGNMENT; | |
11494 | break; | |
11495 | ||
11496 | case FFESTR_firstINTERFACE: | |
11497 | ffestb_local_.interface.operator = FFESTP_definedoperatorNone; | |
11498 | break; | |
11499 | ||
11500 | default: | |
11501 | goto bad_0; /* :::::::::::::::::::: */ | |
11502 | } | |
11503 | switch (ffelex_token_type (t)) | |
11504 | { | |
11505 | case FFELEX_typeCOMMA: | |
11506 | case FFELEX_typeCOLONCOLON: | |
11507 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
11508 | goto bad_1; /* :::::::::::::::::::: */ | |
11509 | ||
11510 | default: | |
11511 | goto bad_1; /* :::::::::::::::::::: */ | |
11512 | ||
11513 | case FFELEX_typeOPEN_PAREN: | |
11514 | case FFELEX_typeOPEN_ARRAY: /* Sigh. */ | |
11515 | break; | |
11516 | ||
11517 | case FFELEX_typeEOS: | |
11518 | case FFELEX_typeSEMICOLON: | |
11519 | ffesta_confirmed (); | |
11520 | if (*p == '\0') | |
11521 | { | |
11522 | if (!ffesta_is_inhibited ()) | |
11523 | ffestc_R1202 (FFESTP_definedoperatorNone, NULL); | |
11524 | return (ffelexHandler) ffesta_zero (t); | |
11525 | } | |
11526 | break; | |
11527 | } | |
11528 | if (!ffesrc_is_name_init (*p)) | |
11529 | goto bad_i; /* :::::::::::::::::::: */ | |
11530 | ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
11531 | return (ffelexHandler) ffestb_R12021_ (t); | |
11532 | ||
11533 | default: | |
11534 | goto bad_0; /* :::::::::::::::::::: */ | |
11535 | } | |
11536 | ||
11537 | bad_0: /* :::::::::::::::::::: */ | |
11538 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", ffesta_tokens[0]); | |
11539 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11540 | ||
11541 | bad_1: /* :::::::::::::::::::: */ | |
11542 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t); | |
11543 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
11544 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
11545 | ||
11546 | bad_i: /* :::::::::::::::::::: */ | |
11547 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "INTERFACE", ffesta_tokens[0], i, t); | |
11548 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11549 | } | |
11550 | ||
11551 | /* ffestb_R12021_ -- "INTERFACE" NAME | |
11552 | ||
11553 | return ffestb_R12021_; // to lexer | |
11554 | ||
11555 | Make sure the statement has a valid form for the INTERFACE statement. If | |
11556 | it does, implement the statement. */ | |
11557 | ||
11558 | static ffelexHandler | |
11559 | ffestb_R12021_ (ffelexToken t) | |
11560 | { | |
11561 | ffestb_local_.interface.slash = TRUE; /* Slash follows open paren. */ | |
11562 | ||
11563 | switch (ffelex_token_type (t)) | |
11564 | { | |
11565 | case FFELEX_typeEOS: | |
11566 | case FFELEX_typeSEMICOLON: | |
11567 | if (!ffesta_is_inhibited ()) | |
11568 | ffestc_R1202 (FFESTP_definedoperatorNone, ffesta_tokens[1]); | |
11569 | ffelex_token_kill (ffesta_tokens[1]); | |
11570 | return (ffelexHandler) ffesta_zero (t); | |
11571 | ||
11572 | case FFELEX_typeOPEN_PAREN: | |
11573 | ffestb_local_.interface.slash = FALSE; /* Slash doesn't follow. */ | |
11574 | /* Fall through. */ | |
11575 | case FFELEX_typeOPEN_ARRAY: | |
11576 | switch (ffestb_local_.interface.operator) | |
11577 | { | |
11578 | case FFESTP_definedoperatorNone: | |
11579 | break; | |
11580 | ||
11581 | case FFESTP_definedoperatorOPERATOR: | |
11582 | ffestb_local_.interface.assignment = FALSE; | |
11583 | return (ffelexHandler) ffestb_R12022_; | |
11584 | ||
11585 | case FFESTP_definedoperatorASSIGNMENT: | |
11586 | ffestb_local_.interface.assignment = TRUE; | |
11587 | return (ffelexHandler) ffestb_R12022_; | |
11588 | ||
11589 | default: | |
11590 | assert (FALSE); | |
11591 | } | |
11592 | break; | |
11593 | ||
11594 | case FFELEX_typeCOMMA: | |
11595 | case FFELEX_typeCOLONCOLON: | |
11596 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
11597 | break; | |
11598 | ||
11599 | default: | |
11600 | break; | |
11601 | } | |
11602 | ||
11603 | ffelex_token_kill (ffesta_tokens[1]); | |
11604 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t); | |
11605 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11606 | } | |
11607 | ||
11608 | /* ffestb_R12022_ -- "INTERFACE" "OPERATOR/ASSIGNMENT" OPEN_PAREN | |
11609 | ||
11610 | return ffestb_R12022_; // to lexer | |
11611 | ||
11612 | Make sure the statement has a valid form for the INTERFACE statement. If | |
11613 | it does, implement the statement. */ | |
11614 | ||
11615 | static ffelexHandler | |
11616 | ffestb_R12022_ (ffelexToken t) | |
11617 | { | |
11618 | ffesta_tokens[2] = ffelex_token_use (t); | |
11619 | ||
11620 | switch (ffelex_token_type (t)) | |
11621 | { | |
11622 | case FFELEX_typePERIOD: | |
11623 | if (ffestb_local_.interface.slash) | |
11624 | break; | |
11625 | return (ffelexHandler) ffestb_R12023_; | |
11626 | ||
11627 | case FFELEX_typePOWER: | |
11628 | if (ffestb_local_.interface.slash) | |
11629 | break; | |
11630 | ffestb_local_.interface.operator = FFESTP_definedoperatorPOWER; | |
11631 | return (ffelexHandler) ffestb_R12025_; | |
11632 | ||
11633 | case FFELEX_typeASTERISK: | |
11634 | if (ffestb_local_.interface.slash) | |
11635 | break; | |
11636 | ffestb_local_.interface.operator = FFESTP_definedoperatorMULT; | |
11637 | return (ffelexHandler) ffestb_R12025_; | |
11638 | ||
11639 | case FFELEX_typePLUS: | |
11640 | if (ffestb_local_.interface.slash) | |
11641 | break; | |
11642 | ffestb_local_.interface.operator = FFESTP_definedoperatorADD; | |
11643 | return (ffelexHandler) ffestb_R12025_; | |
11644 | ||
11645 | case FFELEX_typeCONCAT: | |
11646 | if (ffestb_local_.interface.slash) | |
11647 | break; | |
11648 | ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT; | |
11649 | return (ffelexHandler) ffestb_R12025_; | |
11650 | ||
11651 | case FFELEX_typeSLASH: | |
11652 | if (ffestb_local_.interface.slash) | |
11653 | { | |
11654 | ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT; | |
11655 | return (ffelexHandler) ffestb_R12025_; | |
11656 | } | |
11657 | ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE; | |
11658 | return (ffelexHandler) ffestb_R12025_; | |
11659 | ||
11660 | case FFELEX_typeMINUS: | |
11661 | if (ffestb_local_.interface.slash) | |
11662 | break; | |
11663 | ffestb_local_.interface.operator = FFESTP_definedoperatorSUBTRACT; | |
11664 | return (ffelexHandler) ffestb_R12025_; | |
11665 | ||
11666 | case FFELEX_typeREL_EQ: | |
11667 | if (ffestb_local_.interface.slash) | |
11668 | break; | |
11669 | ffestb_local_.interface.operator = FFESTP_definedoperatorEQ; | |
11670 | return (ffelexHandler) ffestb_R12025_; | |
11671 | ||
11672 | case FFELEX_typeREL_NE: | |
11673 | if (ffestb_local_.interface.slash) | |
11674 | break; | |
11675 | ffestb_local_.interface.operator = FFESTP_definedoperatorNE; | |
11676 | return (ffelexHandler) ffestb_R12025_; | |
11677 | ||
11678 | case FFELEX_typeOPEN_ANGLE: | |
11679 | if (ffestb_local_.interface.slash) | |
11680 | break; | |
11681 | ffestb_local_.interface.operator = FFESTP_definedoperatorLT; | |
11682 | return (ffelexHandler) ffestb_R12025_; | |
11683 | ||
11684 | case FFELEX_typeREL_LE: | |
11685 | if (ffestb_local_.interface.slash) | |
11686 | break; | |
11687 | ffestb_local_.interface.operator = FFESTP_definedoperatorLE; | |
11688 | return (ffelexHandler) ffestb_R12025_; | |
11689 | ||
11690 | case FFELEX_typeCLOSE_ANGLE: | |
11691 | if (ffestb_local_.interface.slash) | |
11692 | break; | |
11693 | ffestb_local_.interface.operator = FFESTP_definedoperatorGT; | |
11694 | return (ffelexHandler) ffestb_R12025_; | |
11695 | ||
11696 | case FFELEX_typeREL_GE: | |
11697 | if (ffestb_local_.interface.slash) | |
11698 | break; | |
11699 | ffestb_local_.interface.operator = FFESTP_definedoperatorGE; | |
11700 | return (ffelexHandler) ffestb_R12025_; | |
11701 | ||
11702 | case FFELEX_typeEQUALS: | |
11703 | if (ffestb_local_.interface.slash) | |
11704 | { | |
11705 | ffestb_local_.interface.operator = FFESTP_definedoperatorNE; | |
11706 | return (ffelexHandler) ffestb_R12025_; | |
11707 | } | |
11708 | ffestb_local_.interface.operator = FFESTP_definedoperatorASSIGNMENT; | |
11709 | return (ffelexHandler) ffestb_R12025_; | |
11710 | ||
11711 | case FFELEX_typeCLOSE_ARRAY: | |
11712 | if (!ffestb_local_.interface.slash) | |
11713 | { | |
11714 | ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE; | |
11715 | return (ffelexHandler) ffestb_R12026_; | |
11716 | } | |
11717 | ffestb_local_.interface.operator = FFESTP_definedoperatorCONCAT; | |
11718 | return (ffelexHandler) ffestb_R12026_; | |
11719 | ||
11720 | case FFELEX_typeCLOSE_PAREN: | |
11721 | if (!ffestb_local_.interface.slash) | |
11722 | break; | |
11723 | ffestb_local_.interface.operator = FFESTP_definedoperatorDIVIDE; | |
11724 | return (ffelexHandler) ffestb_R12026_; | |
11725 | ||
11726 | default: | |
11727 | break; | |
11728 | } | |
11729 | ||
11730 | ffelex_token_kill (ffesta_tokens[1]); | |
11731 | ffelex_token_kill (ffesta_tokens[2]); | |
11732 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t); | |
11733 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11734 | } | |
11735 | ||
11736 | /* ffestb_R12023_ -- "INTERFACE" NAME OPEN_PAREN PERIOD | |
11737 | ||
11738 | return ffestb_R12023_; // to lexer | |
11739 | ||
11740 | Make sure the statement has a valid form for the INTERFACE statement. If | |
11741 | it does, implement the statement. */ | |
11742 | ||
11743 | static ffelexHandler | |
11744 | ffestb_R12023_ (ffelexToken t) | |
11745 | { | |
11746 | switch (ffelex_token_type (t)) | |
11747 | { | |
11748 | case FFELEX_typeNAME: | |
11749 | ffelex_token_kill (ffesta_tokens[2]); | |
11750 | ffesta_tokens[2] = ffelex_token_use (t); | |
11751 | return (ffelexHandler) ffestb_R12024_; | |
11752 | ||
11753 | default: | |
11754 | break; | |
11755 | } | |
11756 | ||
11757 | ffelex_token_kill (ffesta_tokens[1]); | |
11758 | ffelex_token_kill (ffesta_tokens[2]); | |
11759 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t); | |
11760 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11761 | } | |
11762 | ||
11763 | /* ffestb_R12024_ -- "INTERFACE" NAME OPEN_PAREN PERIOD NAME | |
11764 | ||
11765 | return ffestb_R12024_; // to lexer | |
11766 | ||
11767 | Make sure the statement has a valid form for the INTERFACE statement. If | |
11768 | it does, implement the statement. */ | |
11769 | ||
11770 | static ffelexHandler | |
11771 | ffestb_R12024_ (ffelexToken t) | |
11772 | { | |
11773 | switch (ffelex_token_type (t)) | |
11774 | { | |
11775 | case FFELEX_typePERIOD: | |
11776 | return (ffelexHandler) ffestb_R12025_; | |
11777 | ||
11778 | default: | |
11779 | break; | |
11780 | } | |
11781 | ||
11782 | ffelex_token_kill (ffesta_tokens[1]); | |
11783 | ffelex_token_kill (ffesta_tokens[2]); | |
11784 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t); | |
11785 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11786 | } | |
11787 | ||
11788 | /* ffestb_R12025_ -- "INTERFACE" NAME OPEN_PAREN operator | |
11789 | ||
11790 | return ffestb_R12025_; // to lexer | |
11791 | ||
11792 | Make sure the statement has a valid form for the INTERFACE statement. If | |
11793 | it does, implement the statement. */ | |
11794 | ||
11795 | static ffelexHandler | |
11796 | ffestb_R12025_ (ffelexToken t) | |
11797 | { | |
11798 | switch (ffelex_token_type (t)) | |
11799 | { | |
11800 | case FFELEX_typeCLOSE_PAREN: | |
11801 | return (ffelexHandler) ffestb_R12026_; | |
11802 | ||
11803 | default: | |
11804 | break; | |
11805 | } | |
11806 | ||
11807 | ffelex_token_kill (ffesta_tokens[1]); | |
11808 | ffelex_token_kill (ffesta_tokens[2]); | |
11809 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t); | |
11810 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11811 | } | |
11812 | ||
11813 | /* ffestb_R12026_ -- "INTERFACE" NAME OPEN_PAREN operator CLOSE_PAREN | |
11814 | ||
11815 | return ffestb_R12026_; // to lexer | |
11816 | ||
11817 | Make sure the statement has a valid form for the INTERFACE statement. If | |
11818 | it does, implement the statement. */ | |
11819 | ||
11820 | static ffelexHandler | |
11821 | ffestb_R12026_ (ffelexToken t) | |
11822 | { | |
11823 | char *p; | |
11824 | ||
11825 | switch (ffelex_token_type (t)) | |
11826 | { | |
11827 | case FFELEX_typeEOS: | |
11828 | case FFELEX_typeSEMICOLON: | |
11829 | ffesta_confirmed (); | |
11830 | if (ffestb_local_.interface.assignment | |
11831 | && (ffestb_local_.interface.operator | |
11832 | != FFESTP_definedoperatorASSIGNMENT)) | |
11833 | { | |
11834 | ffebad_start (FFEBAD_INTERFACE_ASSIGNMENT); | |
11835 | ffebad_here (0, ffelex_token_where_line (ffesta_tokens[1]), | |
11836 | ffelex_token_where_column (ffesta_tokens[1])); | |
11837 | ffebad_here (1, ffelex_token_where_line (ffesta_tokens[2]), | |
11838 | ffelex_token_where_column (ffesta_tokens[2])); | |
11839 | ffebad_finish (); | |
11840 | } | |
11841 | switch (ffelex_token_type (ffesta_tokens[2])) | |
11842 | { | |
11843 | case FFELEX_typeNAME: | |
11844 | switch (ffestr_other (ffesta_tokens[2])) | |
11845 | { | |
11846 | case FFESTR_otherNOT: | |
11847 | if (!ffesta_is_inhibited ()) | |
11848 | ffestc_R1202 (FFESTP_definedoperatorNOT, NULL); | |
11849 | break; | |
11850 | ||
11851 | case FFESTR_otherAND: | |
11852 | if (!ffesta_is_inhibited ()) | |
11853 | ffestc_R1202 (FFESTP_definedoperatorAND, NULL); | |
11854 | break; | |
11855 | ||
11856 | case FFESTR_otherOR: | |
11857 | if (!ffesta_is_inhibited ()) | |
11858 | ffestc_R1202 (FFESTP_definedoperatorOR, NULL); | |
11859 | break; | |
11860 | ||
11861 | case FFESTR_otherEQV: | |
11862 | if (!ffesta_is_inhibited ()) | |
11863 | ffestc_R1202 (FFESTP_definedoperatorEQV, NULL); | |
11864 | break; | |
11865 | ||
11866 | case FFESTR_otherNEQV: | |
11867 | if (!ffesta_is_inhibited ()) | |
11868 | ffestc_R1202 (FFESTP_definedoperatorNEQV, NULL); | |
11869 | break; | |
11870 | ||
11871 | case FFESTR_otherEQ: | |
11872 | if (!ffesta_is_inhibited ()) | |
11873 | ffestc_R1202 (FFESTP_definedoperatorEQ, NULL); | |
11874 | break; | |
11875 | ||
11876 | case FFESTR_otherNE: | |
11877 | if (!ffesta_is_inhibited ()) | |
11878 | ffestc_R1202 (FFESTP_definedoperatorNE, NULL); | |
11879 | break; | |
11880 | ||
11881 | case FFESTR_otherLT: | |
11882 | if (!ffesta_is_inhibited ()) | |
11883 | ffestc_R1202 (FFESTP_definedoperatorLT, NULL); | |
11884 | break; | |
11885 | ||
11886 | case FFESTR_otherLE: | |
11887 | if (!ffesta_is_inhibited ()) | |
11888 | ffestc_R1202 (FFESTP_definedoperatorLE, NULL); | |
11889 | break; | |
11890 | ||
11891 | case FFESTR_otherGT: | |
11892 | if (!ffesta_is_inhibited ()) | |
11893 | ffestc_R1202 (FFESTP_definedoperatorGT, NULL); | |
11894 | break; | |
11895 | ||
11896 | case FFESTR_otherGE: | |
11897 | if (!ffesta_is_inhibited ()) | |
11898 | ffestc_R1202 (FFESTP_definedoperatorGE, NULL); | |
11899 | break; | |
11900 | ||
11901 | default: | |
11902 | for (p = ffelex_token_text (ffesta_tokens[2]); *p != '\0'; ++p) | |
11903 | { | |
11904 | if (!isalpha (*p)) | |
11905 | { | |
11906 | ffelex_token_kill (ffesta_tokens[1]); | |
11907 | ffelex_token_kill (ffesta_tokens[2]); | |
11908 | ffesta_ffebad_1t (FFEBAD_INTERFACE_NONLETTER, | |
11909 | ffesta_tokens[2]); | |
11910 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
11911 | (ffelexHandler) ffesta_zero); | |
11912 | } | |
11913 | } | |
11914 | if (!ffesta_is_inhibited ()) | |
11915 | ffestc_R1202 (FFESTP_definedoperatorOPERATOR, | |
11916 | ffesta_tokens[2]); | |
11917 | } | |
11918 | break; | |
11919 | ||
11920 | case FFELEX_typeEQUALS: | |
11921 | if (!ffestb_local_.interface.assignment | |
11922 | && (ffestb_local_.interface.operator | |
11923 | == FFESTP_definedoperatorASSIGNMENT)) | |
11924 | { | |
11925 | ffebad_start (FFEBAD_INTERFACE_OPERATOR); | |
11926 | ffebad_here (0, ffelex_token_where_line (ffesta_tokens[1]), | |
11927 | ffelex_token_where_column (ffesta_tokens[1])); | |
11928 | ffebad_here (1, ffelex_token_where_line (ffesta_tokens[2]), | |
11929 | ffelex_token_where_column (ffesta_tokens[2])); | |
11930 | ffebad_finish (); | |
11931 | } | |
11932 | if (!ffesta_is_inhibited ()) | |
11933 | ffestc_R1202 (ffestb_local_.interface.operator, NULL); | |
11934 | break; | |
11935 | ||
11936 | default: | |
11937 | if (!ffesta_is_inhibited ()) | |
11938 | ffestc_R1202 (ffestb_local_.interface.operator, NULL); | |
11939 | } | |
11940 | ffelex_token_kill (ffesta_tokens[1]); | |
11941 | ffelex_token_kill (ffesta_tokens[2]); | |
11942 | return (ffelexHandler) ffesta_zero (t); | |
11943 | ||
11944 | default: | |
11945 | break; | |
11946 | } | |
11947 | ||
11948 | ffelex_token_kill (ffesta_tokens[1]); | |
11949 | ffelex_token_kill (ffesta_tokens[2]); | |
11950 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INTERFACE", t); | |
11951 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
11952 | } | |
11953 | ||
11954 | #endif | |
11955 | /* ffestb_S3P4 -- Parse the INCLUDE line | |
11956 | ||
11957 | return ffestb_S3P4; // to lexer | |
11958 | ||
11959 | Make sure the statement has a valid form for the INCLUDE line. If it | |
11960 | does, implement the statement. */ | |
11961 | ||
11962 | ffelexHandler | |
11963 | ffestb_S3P4 (ffelexToken t) | |
11964 | { | |
11965 | ffeTokenLength i; | |
11966 | char *p; | |
11967 | ffelexHandler next; | |
11968 | ffelexToken nt; | |
11969 | ffelexToken ut; | |
11970 | ||
11971 | switch (ffelex_token_type (ffesta_tokens[0])) | |
11972 | { | |
11973 | case FFELEX_typeNAME: | |
11974 | if (ffesta_first_kw != FFESTR_firstINCLUDE) | |
11975 | goto bad_0; /* :::::::::::::::::::: */ | |
11976 | switch (ffelex_token_type (t)) | |
11977 | { | |
11978 | case FFELEX_typeNUMBER: | |
11979 | case FFELEX_typeAPOSTROPHE: | |
11980 | case FFELEX_typeQUOTE: | |
11981 | break; | |
11982 | ||
11983 | default: | |
11984 | goto bad_1; /* :::::::::::::::::::: */ | |
11985 | } | |
11986 | ffesta_confirmed (); | |
11987 | return (ffelexHandler) (*((ffelexHandler) | |
11988 | ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextINCLUDE, | |
11989 | (ffeexprCallback) ffestb_S3P41_))) | |
11990 | (t); | |
11991 | ||
11992 | case FFELEX_typeNAMES: | |
11993 | if (ffesta_first_kw != FFESTR_firstINCLUDE) | |
11994 | goto bad_0; /* :::::::::::::::::::: */ | |
11995 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlINCLUDE); | |
11996 | switch (ffelex_token_type (t)) | |
11997 | { | |
11998 | default: | |
11999 | goto bad_1; /* :::::::::::::::::::: */ | |
12000 | ||
12001 | case FFELEX_typeAPOSTROPHE: | |
12002 | case FFELEX_typeQUOTE: | |
12003 | break; | |
12004 | } | |
12005 | ffesta_confirmed (); | |
12006 | if (*p == '\0') | |
12007 | return (ffelexHandler) (*((ffelexHandler) | |
12008 | ffeexpr_rhs (ffesta_output_pool, FFEEXPR_contextINCLUDE, | |
12009 | (ffeexprCallback) ffestb_S3P41_))) | |
12010 | (t); | |
12011 | if (!isdigit (*p)) | |
12012 | goto bad_i; /* :::::::::::::::::::: */ | |
12013 | nt = ffelex_token_number_from_names (ffesta_tokens[0], i); | |
12014 | p += ffelex_token_length (nt); | |
12015 | i += ffelex_token_length (nt); | |
12016 | if ((*p != '_') || (++i, *++p != '\0')) | |
12017 | { | |
12018 | ffelex_token_kill (nt); | |
12019 | goto bad_i; /* :::::::::::::::::::: */ | |
12020 | } | |
12021 | ut = ffelex_token_uscore_from_names (ffesta_tokens[0], i - 1); | |
12022 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs | |
12023 | (ffesta_output_pool, FFEEXPR_contextINCLUDE, | |
12024 | (ffeexprCallback) ffestb_S3P41_))) | |
12025 | (nt); | |
12026 | ffelex_token_kill (nt); | |
12027 | next = (ffelexHandler) (*next) (ut); | |
12028 | ffelex_token_kill (ut); | |
12029 | return (ffelexHandler) (*next) (t); | |
12030 | ||
12031 | default: | |
12032 | goto bad_0; /* :::::::::::::::::::: */ | |
12033 | } | |
12034 | ||
12035 | bad_0: /* :::::::::::::::::::: */ | |
12036 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", ffesta_tokens[0]); | |
12037 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12038 | ||
12039 | bad_1: /* :::::::::::::::::::: */ | |
12040 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", t); | |
12041 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
12042 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
12043 | ||
12044 | bad_i: /* :::::::::::::::::::: */ | |
12045 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "INCLUDE", ffesta_tokens[0], i, t); | |
12046 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12047 | } | |
12048 | ||
12049 | /* ffestb_S3P41_ -- "INCLUDE" [NUMBER "_"] expr | |
12050 | ||
12051 | (ffestb_S3P41_) // to expression handler | |
12052 | ||
12053 | Make sure the next token is an EOS, but not a SEMICOLON. */ | |
12054 | ||
12055 | static ffelexHandler | |
12056 | ffestb_S3P41_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
12057 | { | |
12058 | switch (ffelex_token_type (t)) | |
12059 | { | |
12060 | case FFELEX_typeEOS: | |
12061 | case FFELEX_typeSEMICOLON: | |
12062 | if (expr == NULL) | |
12063 | break; | |
12064 | if (!ffesta_is_inhibited ()) | |
12065 | { | |
12066 | if (ffe_is_pedantic () | |
12067 | && ((ffelex_token_type (t) == FFELEX_typeSEMICOLON) | |
12068 | || ffesta_line_has_semicolons)) | |
12069 | { | |
12070 | ffebad_start_msg ("INCLUDE at %0 not the only statement on the source line", FFEBAD_severityWARNING); | |
12071 | ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]), | |
12072 | ffelex_token_where_column (ffesta_tokens[0])); | |
12073 | ffebad_finish (); | |
12074 | } | |
12075 | ffestc_S3P4 (expr, ft); | |
12076 | } | |
12077 | return (ffelexHandler) ffesta_zero (t); | |
12078 | ||
12079 | default: | |
12080 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INCLUDE", t); | |
12081 | break; | |
12082 | } | |
12083 | ||
12084 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12085 | } | |
12086 | ||
12087 | /* ffestb_V012 -- Parse the MAP statement | |
12088 | ||
12089 | return ffestb_V012; // to lexer | |
12090 | ||
12091 | Make sure the statement has a valid form for the MAP statement. If | |
12092 | it does, implement the statement. */ | |
12093 | ||
12094 | #if FFESTR_VXT | |
12095 | ffelexHandler | |
12096 | ffestb_V012 (ffelexToken t) | |
12097 | { | |
12098 | char *p; | |
12099 | ffeTokenLength i; | |
12100 | ||
12101 | switch (ffelex_token_type (ffesta_tokens[0])) | |
12102 | { | |
12103 | case FFELEX_typeNAME: | |
12104 | if (ffesta_first_kw != FFESTR_firstMAP) | |
12105 | goto bad_0; /* :::::::::::::::::::: */ | |
12106 | break; | |
12107 | ||
12108 | case FFELEX_typeNAMES: | |
12109 | if (ffesta_first_kw != FFESTR_firstMAP) | |
12110 | goto bad_0; /* :::::::::::::::::::: */ | |
12111 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlMAP) | |
12112 | { | |
12113 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlMAP); | |
12114 | goto bad_i; /* :::::::::::::::::::: */ | |
12115 | } | |
12116 | break; | |
12117 | ||
12118 | default: | |
12119 | goto bad_0; /* :::::::::::::::::::: */ | |
12120 | } | |
12121 | ||
12122 | switch (ffelex_token_type (t)) | |
12123 | { | |
12124 | case FFELEX_typeEOS: | |
12125 | case FFELEX_typeSEMICOLON: | |
12126 | ffesta_confirmed (); | |
12127 | if (!ffesta_is_inhibited ()) | |
12128 | ffestc_V012 (); | |
12129 | return (ffelexHandler) ffesta_zero (t); | |
12130 | ||
12131 | case FFELEX_typeCOMMA: | |
12132 | case FFELEX_typeCOLONCOLON: | |
12133 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
12134 | goto bad_1; /* :::::::::::::::::::: */ | |
12135 | ||
12136 | default: | |
12137 | goto bad_1; /* :::::::::::::::::::: */ | |
12138 | } | |
12139 | ||
12140 | bad_0: /* :::::::::::::::::::: */ | |
12141 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MAP", ffesta_tokens[0]); | |
12142 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
12143 | (ffelexHandler) ffesta_zero); /* Invalid first token. */ | |
12144 | ||
12145 | bad_1: /* :::::::::::::::::::: */ | |
12146 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "MAP", t); | |
12147 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
12148 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
12149 | ||
12150 | bad_i: /* :::::::::::::::::::: */ | |
12151 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "MAP", ffesta_tokens[0], i, t); | |
12152 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12153 | } | |
12154 | ||
12155 | #endif | |
12156 | /* ffestb_V014 -- Parse the VOLATILE statement | |
12157 | ||
12158 | return ffestb_V014; // to lexer | |
12159 | ||
12160 | Make sure the statement has a valid form for the VOLATILE statement. If it | |
12161 | does, implement the statement. */ | |
12162 | ||
12163 | ffelexHandler | |
12164 | ffestb_V014 (ffelexToken t) | |
12165 | { | |
12166 | ffeTokenLength i; | |
12167 | char *p; | |
12168 | ffelexToken nt; | |
12169 | ffelexHandler next; | |
12170 | ||
12171 | switch (ffelex_token_type (ffesta_tokens[0])) | |
12172 | { | |
12173 | case FFELEX_typeNAME: | |
12174 | if (ffesta_first_kw != FFESTR_firstVOLATILE) | |
12175 | goto bad_0; /* :::::::::::::::::::: */ | |
12176 | switch (ffelex_token_type (t)) | |
12177 | { | |
12178 | case FFELEX_typeEOS: | |
12179 | case FFELEX_typeSEMICOLON: | |
12180 | case FFELEX_typeCOMMA: | |
12181 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
12182 | goto bad_1; /* :::::::::::::::::::: */ | |
12183 | ||
12184 | default: | |
12185 | goto bad_1; /* :::::::::::::::::::: */ | |
12186 | ||
12187 | case FFELEX_typeNAME: | |
12188 | case FFELEX_typeSLASH: | |
12189 | ffesta_confirmed (); | |
12190 | if (!ffesta_is_inhibited ()) | |
12191 | ffestc_V014_start (); | |
12192 | return (ffelexHandler) ffestb_V0141_ (t); | |
12193 | ||
12194 | case FFELEX_typeCOLONCOLON: | |
12195 | ffesta_confirmed (); | |
12196 | if (!ffesta_is_inhibited ()) | |
12197 | ffestc_V014_start (); | |
12198 | return (ffelexHandler) ffestb_V0141_; | |
12199 | } | |
12200 | ||
12201 | case FFELEX_typeNAMES: | |
12202 | if (ffesta_first_kw != FFESTR_firstVOLATILE) | |
12203 | goto bad_0; /* :::::::::::::::::::: */ | |
12204 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlVOLATILE); | |
12205 | switch (ffelex_token_type (t)) | |
12206 | { | |
12207 | default: | |
12208 | goto bad_1; /* :::::::::::::::::::: */ | |
12209 | ||
12210 | case FFELEX_typeCOMMA: | |
12211 | case FFELEX_typeEOS: | |
12212 | case FFELEX_typeSEMICOLON: | |
12213 | ffesta_confirmed (); | |
12214 | break; | |
12215 | ||
12216 | case FFELEX_typeSLASH: | |
12217 | ffesta_confirmed (); | |
12218 | if (*p != '\0') | |
12219 | goto bad_i; /* :::::::::::::::::::: */ | |
12220 | if (!ffesta_is_inhibited ()) | |
12221 | ffestc_V014_start (); | |
12222 | return (ffelexHandler) ffestb_V0141_ (t); | |
12223 | ||
12224 | case FFELEX_typeCOLONCOLON: | |
12225 | ffesta_confirmed (); | |
12226 | if (*p != '\0') | |
12227 | goto bad_i; /* :::::::::::::::::::: */ | |
12228 | if (!ffesta_is_inhibited ()) | |
12229 | ffestc_V014_start (); | |
12230 | return (ffelexHandler) ffestb_V0141_; | |
12231 | } | |
12232 | ||
12233 | /* Here, we have at least one char after "VOLATILE" and t is COMMA or | |
12234 | EOS/SEMICOLON. */ | |
12235 | ||
12236 | if (!ffesrc_is_name_init (*p)) | |
12237 | goto bad_i; /* :::::::::::::::::::: */ | |
12238 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
12239 | if (!ffesta_is_inhibited ()) | |
12240 | ffestc_V014_start (); | |
12241 | next = (ffelexHandler) ffestb_V0141_ (nt); | |
12242 | ffelex_token_kill (nt); | |
12243 | return (ffelexHandler) (*next) (t); | |
12244 | ||
12245 | default: | |
12246 | goto bad_0; /* :::::::::::::::::::: */ | |
12247 | } | |
12248 | ||
12249 | bad_0: /* :::::::::::::::::::: */ | |
12250 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", ffesta_tokens[0]); | |
12251 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12252 | ||
12253 | bad_1: /* :::::::::::::::::::: */ | |
12254 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t); | |
12255 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
12256 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
12257 | ||
12258 | bad_i: /* :::::::::::::::::::: */ | |
12259 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "VOLATILE", ffesta_tokens[0], i, t); | |
12260 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12261 | } | |
12262 | ||
12263 | /* ffestb_V0141_ -- "VOLATILE" [COLONCOLON] | |
12264 | ||
12265 | return ffestb_V0141_; // to lexer | |
12266 | ||
12267 | Handle NAME or SLASH. */ | |
12268 | ||
12269 | static ffelexHandler | |
12270 | ffestb_V0141_ (ffelexToken t) | |
12271 | { | |
12272 | switch (ffelex_token_type (t)) | |
12273 | { | |
12274 | case FFELEX_typeNAME: | |
12275 | ffestb_local_.V014.is_cblock = FALSE; | |
12276 | ffesta_tokens[1] = ffelex_token_use (t); | |
12277 | return (ffelexHandler) ffestb_V0144_; | |
12278 | ||
12279 | case FFELEX_typeSLASH: | |
12280 | ffestb_local_.V014.is_cblock = TRUE; | |
12281 | return (ffelexHandler) ffestb_V0142_; | |
12282 | ||
12283 | default: | |
12284 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t); | |
12285 | break; | |
12286 | } | |
12287 | ||
12288 | if (!ffesta_is_inhibited ()) | |
12289 | ffestc_V014_finish (); | |
12290 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12291 | } | |
12292 | ||
12293 | /* ffestb_V0142_ -- "VOLATILE" [COLONCOLON] SLASH | |
12294 | ||
12295 | return ffestb_V0142_; // to lexer | |
12296 | ||
12297 | Handle NAME. */ | |
12298 | ||
12299 | static ffelexHandler | |
12300 | ffestb_V0142_ (ffelexToken t) | |
12301 | { | |
12302 | switch (ffelex_token_type (t)) | |
12303 | { | |
12304 | case FFELEX_typeNAME: | |
12305 | ffesta_tokens[1] = ffelex_token_use (t); | |
12306 | return (ffelexHandler) ffestb_V0143_; | |
12307 | ||
12308 | default: | |
12309 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t); | |
12310 | break; | |
12311 | } | |
12312 | ||
12313 | if (!ffesta_is_inhibited ()) | |
12314 | ffestc_V014_finish (); | |
12315 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12316 | } | |
12317 | ||
12318 | /* ffestb_V0143_ -- "VOLATILE" [COLONCOLON] SLASH NAME | |
12319 | ||
12320 | return ffestb_V0143_; // to lexer | |
12321 | ||
12322 | Handle SLASH. */ | |
12323 | ||
12324 | static ffelexHandler | |
12325 | ffestb_V0143_ (ffelexToken t) | |
12326 | { | |
12327 | switch (ffelex_token_type (t)) | |
12328 | { | |
12329 | case FFELEX_typeSLASH: | |
12330 | return (ffelexHandler) ffestb_V0144_; | |
12331 | ||
12332 | default: | |
12333 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t); | |
12334 | break; | |
12335 | } | |
12336 | ||
12337 | if (!ffesta_is_inhibited ()) | |
12338 | ffestc_V014_finish (); | |
12339 | ffelex_token_kill (ffesta_tokens[1]); | |
12340 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12341 | } | |
12342 | ||
12343 | /* ffestb_V0144_ -- "VOLATILE" [COLONCOLON] R523 | |
12344 | ||
12345 | return ffestb_V0144_; // to lexer | |
12346 | ||
12347 | Handle COMMA or EOS/SEMICOLON. */ | |
12348 | ||
12349 | static ffelexHandler | |
12350 | ffestb_V0144_ (ffelexToken t) | |
12351 | { | |
12352 | switch (ffelex_token_type (t)) | |
12353 | { | |
12354 | case FFELEX_typeCOMMA: | |
12355 | if (!ffesta_is_inhibited ()) | |
12356 | { | |
12357 | if (ffestb_local_.V014.is_cblock) | |
12358 | ffestc_V014_item_cblock (ffesta_tokens[1]); | |
12359 | else | |
12360 | ffestc_V014_item_object (ffesta_tokens[1]); | |
12361 | } | |
12362 | ffelex_token_kill (ffesta_tokens[1]); | |
12363 | return (ffelexHandler) ffestb_V0141_; | |
12364 | ||
12365 | case FFELEX_typeEOS: | |
12366 | case FFELEX_typeSEMICOLON: | |
12367 | if (!ffesta_is_inhibited ()) | |
12368 | { | |
12369 | if (ffestb_local_.V014.is_cblock) | |
12370 | ffestc_V014_item_cblock (ffesta_tokens[1]); | |
12371 | else | |
12372 | ffestc_V014_item_object (ffesta_tokens[1]); | |
12373 | ffestc_V014_finish (); | |
12374 | } | |
12375 | ffelex_token_kill (ffesta_tokens[1]); | |
12376 | return (ffelexHandler) ffesta_zero (t); | |
12377 | ||
12378 | default: | |
12379 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "VOLATILE", t); | |
12380 | break; | |
12381 | } | |
12382 | ||
12383 | if (!ffesta_is_inhibited ()) | |
12384 | ffestc_V014_finish (); | |
12385 | ffelex_token_kill (ffesta_tokens[1]); | |
12386 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12387 | } | |
12388 | ||
12389 | /* ffestb_V025 -- Parse the DEFINEFILE statement | |
12390 | ||
12391 | return ffestb_V025; // to lexer | |
12392 | ||
12393 | Make sure the statement has a valid form for the DEFINEFILE statement. | |
12394 | If it does, implement the statement. */ | |
12395 | ||
12396 | #if FFESTR_VXT | |
12397 | ffelexHandler | |
12398 | ffestb_V025 (ffelexToken t) | |
12399 | { | |
12400 | ffeTokenLength i; | |
12401 | char *p; | |
12402 | ffelexToken nt; | |
12403 | ffelexHandler next; | |
12404 | ||
12405 | ffestb_local_.V025.started = FALSE; | |
12406 | switch (ffelex_token_type (ffesta_tokens[0])) | |
12407 | { | |
12408 | case FFELEX_typeNAME: | |
12409 | switch (ffesta_first_kw) | |
12410 | { | |
12411 | case FFESTR_firstDEFINE: | |
12412 | if ((ffelex_token_type (t) != FFELEX_typeNAME) | |
12413 | || (ffesta_second_kw != FFESTR_secondFILE)) | |
12414 | goto bad_1; /* :::::::::::::::::::: */ | |
12415 | ffesta_confirmed (); | |
12416 | return (ffelexHandler) ffestb_V0251_; | |
12417 | ||
12418 | case FFESTR_firstDEFINEFILE: | |
12419 | return (ffelexHandler) ffestb_V0251_ (t); | |
12420 | ||
12421 | default: | |
12422 | goto bad_0; /* :::::::::::::::::::: */ | |
12423 | } | |
12424 | ||
12425 | case FFELEX_typeNAMES: | |
12426 | if (ffesta_first_kw != FFESTR_firstDEFINEFILE) | |
12427 | goto bad_0; /* :::::::::::::::::::: */ | |
12428 | switch (ffelex_token_type (t)) | |
12429 | { | |
12430 | case FFELEX_typeCOMMA: | |
12431 | case FFELEX_typeEOS: | |
12432 | case FFELEX_typeSEMICOLON: | |
12433 | case FFELEX_typeCOLONCOLON: | |
12434 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
12435 | goto bad_1; /* :::::::::::::::::::: */ | |
12436 | ||
12437 | default: | |
12438 | goto bad_1; /* :::::::::::::::::::: */ | |
12439 | ||
12440 | case FFELEX_typeOPEN_PAREN: | |
12441 | break; | |
12442 | } | |
12443 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlDEFINEFILE); | |
12444 | if (isdigit (*p)) | |
12445 | nt = ffelex_token_number_from_names (ffesta_tokens[0], i); | |
12446 | else if (ffesrc_is_name_init (*p)) | |
12447 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
12448 | else | |
12449 | goto bad_i; /* :::::::::::::::::::: */ | |
12450 | next = (ffelexHandler) ffestb_V0251_ (nt); | |
12451 | ffelex_token_kill (nt); | |
12452 | return (ffelexHandler) (*next) (t); | |
12453 | ||
12454 | default: | |
12455 | goto bad_0; /* :::::::::::::::::::: */ | |
12456 | } | |
12457 | ||
12458 | bad_0: /* :::::::::::::::::::: */ | |
12459 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", ffesta_tokens[0]); | |
12460 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12461 | ||
12462 | bad_1: /* :::::::::::::::::::: */ | |
12463 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12464 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
12465 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
12466 | ||
12467 | bad_i: /* :::::::::::::::::::: */ | |
12468 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", ffesta_tokens[0], i, t); | |
12469 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12470 | } | |
12471 | ||
12472 | /* ffestb_V0251_ -- "DEFINEFILE" or "DEFINE" "FILE" | |
12473 | ||
12474 | return ffestb_V0251_; // to lexer | |
12475 | ||
12476 | Make sure the statement has a valid form for the DEFINEFILE statement. If it | |
12477 | does, implement the statement. */ | |
12478 | ||
12479 | static ffelexHandler | |
12480 | ffestb_V0251_ (ffelexToken t) | |
12481 | { | |
12482 | switch (ffelex_token_type (t)) | |
12483 | { | |
12484 | case FFELEX_typeNAME: | |
12485 | case FFELEX_typeNUMBER: | |
12486 | if (ffelex_token_type (ffesta_tokens[0]) == FFELEX_typeNAME) | |
12487 | ffesta_confirmed (); | |
12488 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
12489 | FFEEXPR_contextFILEUNIT_DF, (ffeexprCallback) ffestb_V0252_))) | |
12490 | (t); | |
12491 | ||
12492 | case FFELEX_typeEOS: | |
12493 | case FFELEX_typeSEMICOLON: | |
12494 | case FFELEX_typeCOMMA: | |
12495 | case FFELEX_typeCOLONCOLON: | |
12496 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
12497 | break; | |
12498 | ||
12499 | default: | |
12500 | break; | |
12501 | } | |
12502 | ||
12503 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12504 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12505 | } | |
12506 | ||
12507 | /* ffestb_V0252_ -- "DEFINEFILE" expr | |
12508 | ||
12509 | (ffestb_V0252_) // to expression handler | |
12510 | ||
12511 | Make sure the statement has a valid form for the DEFINEFILE statement. If | |
12512 | it does, implement the statement. */ | |
12513 | ||
12514 | static ffelexHandler | |
12515 | ffestb_V0252_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
12516 | { | |
12517 | switch (ffelex_token_type (t)) | |
12518 | { | |
12519 | case FFELEX_typeOPEN_PAREN: | |
12520 | ffestb_local_.V025.u = expr; | |
12521 | ffesta_tokens[1] = ffelex_token_use (ft); | |
12522 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
12523 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0253_); | |
12524 | ||
12525 | default: | |
12526 | break; | |
12527 | } | |
12528 | ||
12529 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12530 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12531 | } | |
12532 | ||
12533 | /* ffestb_V0253_ -- "DEFINEFILE" expr OPEN_PAREN expr | |
12534 | ||
12535 | (ffestb_V0253_) // to expression handler | |
12536 | ||
12537 | Make sure the statement has a valid form for the DEFINEFILE statement. If | |
12538 | it does, implement the statement. */ | |
12539 | ||
12540 | static ffelexHandler | |
12541 | ffestb_V0253_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
12542 | { | |
12543 | switch (ffelex_token_type (t)) | |
12544 | { | |
12545 | case FFELEX_typeCOMMA: | |
12546 | ffestb_local_.V025.m = expr; | |
12547 | ffesta_tokens[2] = ffelex_token_use (ft); | |
12548 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
12549 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0254_); | |
12550 | ||
12551 | default: | |
12552 | break; | |
12553 | } | |
12554 | ||
12555 | ffelex_token_kill (ffesta_tokens[1]); | |
12556 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12557 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12558 | } | |
12559 | ||
12560 | /* ffestb_V0254_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr | |
12561 | ||
12562 | (ffestb_V0254_) // to expression handler | |
12563 | ||
12564 | Make sure the statement has a valid form for the DEFINEFILE statement. If | |
12565 | it does, implement the statement. */ | |
12566 | ||
12567 | static ffelexHandler | |
12568 | ffestb_V0254_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
12569 | { | |
12570 | switch (ffelex_token_type (t)) | |
12571 | { | |
12572 | case FFELEX_typeCOMMA: | |
12573 | ffestb_local_.V025.n = expr; | |
12574 | ffesta_tokens[3] = ffelex_token_use (ft); | |
12575 | return (ffelexHandler) ffestb_V0255_; | |
12576 | ||
12577 | default: | |
12578 | break; | |
12579 | } | |
12580 | ||
12581 | ffelex_token_kill (ffesta_tokens[1]); | |
12582 | ffelex_token_kill (ffesta_tokens[2]); | |
12583 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12584 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12585 | } | |
12586 | ||
12587 | /* ffestb_V0255_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA | |
12588 | ||
12589 | return ffestb_V0255_; // to lexer | |
12590 | ||
12591 | Make sure the statement has a valid form for the DEFINEFILE statement. If | |
12592 | it does, implement the statement. */ | |
12593 | ||
12594 | static ffelexHandler | |
12595 | ffestb_V0255_ (ffelexToken t) | |
12596 | { | |
12597 | char *p; | |
12598 | ||
12599 | switch (ffelex_token_type (t)) | |
12600 | { | |
12601 | case FFELEX_typeNAME: | |
12602 | p = ffelex_token_text (t); | |
12603 | if (!ffesrc_char_match_init (*p, 'U', 'u') || (*++p != '\0')) | |
12604 | break; | |
12605 | return (ffelexHandler) ffestb_V0256_; | |
12606 | ||
12607 | default: | |
12608 | break; | |
12609 | } | |
12610 | ||
12611 | ffelex_token_kill (ffesta_tokens[1]); | |
12612 | ffelex_token_kill (ffesta_tokens[2]); | |
12613 | ffelex_token_kill (ffesta_tokens[3]); | |
12614 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12615 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12616 | } | |
12617 | ||
12618 | /* ffestb_V0256_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U" | |
12619 | ||
12620 | return ffestb_V0256_; // to lexer | |
12621 | ||
12622 | Make sure the statement has a valid form for the DEFINEFILE statement. If | |
12623 | it does, implement the statement. */ | |
12624 | ||
12625 | static ffelexHandler | |
12626 | ffestb_V0256_ (ffelexToken t) | |
12627 | { | |
12628 | switch (ffelex_token_type (t)) | |
12629 | { | |
12630 | case FFELEX_typeCOMMA: | |
12631 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
12632 | FFEEXPR_contextFILEASSOC, | |
12633 | (ffeexprCallback) ffestb_V0257_); | |
12634 | ||
12635 | default: | |
12636 | break; | |
12637 | } | |
12638 | ||
12639 | ffelex_token_kill (ffesta_tokens[1]); | |
12640 | ffelex_token_kill (ffesta_tokens[2]); | |
12641 | ffelex_token_kill (ffesta_tokens[3]); | |
12642 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12643 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12644 | } | |
12645 | ||
12646 | /* ffestb_V0257_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U" | |
12647 | COMMA expr | |
12648 | ||
12649 | (ffestb_V0257_) // to expression handler | |
12650 | ||
12651 | Make sure the statement has a valid form for the DEFINEFILE statement. If | |
12652 | it does, implement the statement. */ | |
12653 | ||
12654 | static ffelexHandler | |
12655 | ffestb_V0257_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
12656 | { | |
12657 | switch (ffelex_token_type (t)) | |
12658 | { | |
12659 | case FFELEX_typeCLOSE_PAREN: | |
12660 | ffestb_local_.V025.asv = expr; | |
12661 | ffesta_tokens[4] = ffelex_token_use (ft); | |
12662 | return (ffelexHandler) ffestb_V0258_; | |
12663 | ||
12664 | default: | |
12665 | break; | |
12666 | } | |
12667 | ||
12668 | ffelex_token_kill (ffesta_tokens[1]); | |
12669 | ffelex_token_kill (ffesta_tokens[2]); | |
12670 | ffelex_token_kill (ffesta_tokens[3]); | |
12671 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12672 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12673 | } | |
12674 | ||
12675 | /* ffestb_V0258_ -- "DEFINEFILE" expr OPEN_PAREN expr COMMA expr COMMA "U" | |
12676 | COMMA expr CLOSE_PAREN | |
12677 | ||
12678 | return ffestb_V0258_; // to lexer | |
12679 | ||
12680 | Make sure the statement has a valid form for the DEFINEFILE statement. If | |
12681 | it does, implement the statement. */ | |
12682 | ||
12683 | static ffelexHandler | |
12684 | ffestb_V0258_ (ffelexToken t) | |
12685 | { | |
12686 | switch (ffelex_token_type (t)) | |
12687 | { | |
12688 | case FFELEX_typeCOMMA: | |
12689 | case FFELEX_typeEOS: | |
12690 | case FFELEX_typeSEMICOLON: | |
12691 | if (!ffestb_local_.V025.started) | |
12692 | { | |
12693 | ffesta_confirmed (); | |
12694 | if (!ffesta_is_inhibited ()) | |
12695 | ffestc_V025_start (); | |
12696 | ffestb_local_.V025.started = TRUE; | |
12697 | } | |
12698 | if (!ffesta_is_inhibited ()) | |
12699 | ffestc_V025_item (ffestb_local_.V025.u, ffesta_tokens[1], | |
12700 | ffestb_local_.V025.m, ffesta_tokens[2], | |
12701 | ffestb_local_.V025.n, ffesta_tokens[3], | |
12702 | ffestb_local_.V025.asv, ffesta_tokens[4]); | |
12703 | ffelex_token_kill (ffesta_tokens[1]); | |
12704 | ffelex_token_kill (ffesta_tokens[2]); | |
12705 | ffelex_token_kill (ffesta_tokens[3]); | |
12706 | ffelex_token_kill (ffesta_tokens[4]); | |
12707 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
12708 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
12709 | FFEEXPR_contextFILEUNIT_DF, (ffeexprCallback) ffestb_V0252_); | |
12710 | if (!ffesta_is_inhibited ()) | |
12711 | ffestc_V025_finish (); | |
12712 | return (ffelexHandler) ffesta_zero (t); | |
12713 | ||
12714 | default: | |
12715 | break; | |
12716 | } | |
12717 | ||
12718 | ffelex_token_kill (ffesta_tokens[1]); | |
12719 | ffelex_token_kill (ffesta_tokens[2]); | |
12720 | ffelex_token_kill (ffesta_tokens[3]); | |
12721 | ffelex_token_kill (ffesta_tokens[4]); | |
12722 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DEFINE FILE", t); | |
12723 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
12724 | } | |
12725 | ||
12726 | #endif | |
12727 | /* ffestb_subr_kill_easy_ -- Kill I/O statement data structure | |
12728 | ||
12729 | ffestb_subr_kill_easy_(); | |
12730 | ||
12731 | Kills all tokens in the I/O data structure. Assumes that they are | |
12732 | overlaid with each other (union) in ffest_private.h and the typing | |
12733 | and structure references assume (though not necessarily dangerous if | |
12734 | FALSE) that INQUIRE has the most file elements. */ | |
12735 | ||
12736 | #if FFESTB_KILL_EASY_ | |
12737 | static void | |
12738 | ffestb_subr_kill_easy_ (ffestpInquireIx max) | |
12739 | { | |
12740 | ffestpInquireIx ix; | |
12741 | ||
12742 | for (ix = 0; ix < max; ++ix) | |
12743 | { | |
12744 | if (ffestp_file.inquire.inquire_spec[ix].kw_or_val_present) | |
12745 | { | |
12746 | if (ffestp_file.inquire.inquire_spec[ix].kw_present) | |
12747 | ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].kw); | |
12748 | if (ffestp_file.inquire.inquire_spec[ix].value_present) | |
12749 | ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].value); | |
12750 | } | |
12751 | } | |
12752 | } | |
12753 | ||
12754 | #endif | |
12755 | /* ffestb_subr_kill_accept_ -- Kill ACCEPT statement data structure | |
12756 | ||
12757 | ffestb_subr_kill_accept_(); | |
12758 | ||
12759 | Kills all tokens in the ACCEPT data structure. */ | |
12760 | ||
12761 | #if !FFESTB_KILL_EASY_ | |
12762 | static void | |
12763 | ffestb_subr_kill_accept_ () | |
12764 | { | |
12765 | ffestpAcceptIx ix; | |
12766 | ||
12767 | for (ix = 0; ix < FFESTP_acceptix; ++ix) | |
12768 | { | |
12769 | if (ffestp_file.accept.accept_spec[ix].kw_or_val_present) | |
12770 | { | |
12771 | if (ffestp_file.accept.accept_spec[ix].kw_present) | |
12772 | ffelex_token_kill (ffestp_file.accept.accept_spec[ix].kw); | |
12773 | if (ffestp_file.accept.accept_spec[ix].value_present) | |
12774 | ffelex_token_kill (ffestp_file.accept.accept_spec[ix].value); | |
12775 | } | |
12776 | } | |
12777 | } | |
12778 | ||
12779 | #endif | |
12780 | /* ffestb_subr_kill_beru_ -- Kill BACKSPACE/ENDFILE/REWIND/UNLOCK statement | |
12781 | data structure | |
12782 | ||
12783 | ffestb_subr_kill_beru_(); | |
12784 | ||
12785 | Kills all tokens in the BACKSPACE/ENDFILE/REWIND/UNLOCK data structure. */ | |
12786 | ||
12787 | #if !FFESTB_KILL_EASY_ | |
12788 | static void | |
12789 | ffestb_subr_kill_beru_ () | |
12790 | { | |
12791 | ffestpBeruIx ix; | |
12792 | ||
12793 | for (ix = 0; ix < FFESTP_beruix; ++ix) | |
12794 | { | |
12795 | if (ffestp_file.beru.beru_spec[ix].kw_or_val_present) | |
12796 | { | |
12797 | if (ffestp_file.beru.beru_spec[ix].kw_present) | |
12798 | ffelex_token_kill (ffestp_file.beru.beru_spec[ix].kw); | |
12799 | if (ffestp_file.beru.beru_spec[ix].value_present) | |
12800 | ffelex_token_kill (ffestp_file.beru.beru_spec[ix].value); | |
12801 | } | |
12802 | } | |
12803 | } | |
12804 | ||
12805 | #endif | |
12806 | /* ffestb_subr_kill_close_ -- Kill CLOSE statement data structure | |
12807 | ||
12808 | ffestb_subr_kill_close_(); | |
12809 | ||
12810 | Kills all tokens in the CLOSE data structure. */ | |
12811 | ||
12812 | #if !FFESTB_KILL_EASY_ | |
12813 | static void | |
12814 | ffestb_subr_kill_close_ () | |
12815 | { | |
12816 | ffestpCloseIx ix; | |
12817 | ||
12818 | for (ix = 0; ix < FFESTP_closeix; ++ix) | |
12819 | { | |
12820 | if (ffestp_file.close.close_spec[ix].kw_or_val_present) | |
12821 | { | |
12822 | if (ffestp_file.close.close_spec[ix].kw_present) | |
12823 | ffelex_token_kill (ffestp_file.close.close_spec[ix].kw); | |
12824 | if (ffestp_file.close.close_spec[ix].value_present) | |
12825 | ffelex_token_kill (ffestp_file.close.close_spec[ix].value); | |
12826 | } | |
12827 | } | |
12828 | } | |
12829 | ||
12830 | #endif | |
12831 | /* ffestb_subr_kill_delete_ -- Kill DELETE statement data structure | |
12832 | ||
12833 | ffestb_subr_kill_delete_(); | |
12834 | ||
12835 | Kills all tokens in the DELETE data structure. */ | |
12836 | ||
12837 | #if !FFESTB_KILL_EASY_ | |
12838 | static void | |
12839 | ffestb_subr_kill_delete_ () | |
12840 | { | |
12841 | ffestpDeleteIx ix; | |
12842 | ||
12843 | for (ix = 0; ix < FFESTP_deleteix; ++ix) | |
12844 | { | |
12845 | if (ffestp_file.delete.delete_spec[ix].kw_or_val_present) | |
12846 | { | |
12847 | if (ffestp_file.delete.delete_spec[ix].kw_present) | |
12848 | ffelex_token_kill (ffestp_file.delete.delete_spec[ix].kw); | |
12849 | if (ffestp_file.delete.delete_spec[ix].value_present) | |
12850 | ffelex_token_kill (ffestp_file.delete.delete_spec[ix].value); | |
12851 | } | |
12852 | } | |
12853 | } | |
12854 | ||
12855 | #endif | |
12856 | /* ffestb_subr_kill_inquire_ -- Kill INQUIRE statement data structure | |
12857 | ||
12858 | ffestb_subr_kill_inquire_(); | |
12859 | ||
12860 | Kills all tokens in the INQUIRE data structure. */ | |
12861 | ||
12862 | #if !FFESTB_KILL_EASY_ | |
12863 | static void | |
12864 | ffestb_subr_kill_inquire_ () | |
12865 | { | |
12866 | ffestpInquireIx ix; | |
12867 | ||
12868 | for (ix = 0; ix < FFESTP_inquireix; ++ix) | |
12869 | { | |
12870 | if (ffestp_file.inquire.inquire_spec[ix].kw_or_val_present) | |
12871 | { | |
12872 | if (ffestp_file.inquire.inquire_spec[ix].kw_present) | |
12873 | ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].kw); | |
12874 | if (ffestp_file.inquire.inquire_spec[ix].value_present) | |
12875 | ffelex_token_kill (ffestp_file.inquire.inquire_spec[ix].value); | |
12876 | } | |
12877 | } | |
12878 | } | |
12879 | ||
12880 | #endif | |
12881 | /* ffestb_subr_kill_open_ -- Kill OPEN statement data structure | |
12882 | ||
12883 | ffestb_subr_kill_open_(); | |
12884 | ||
12885 | Kills all tokens in the OPEN data structure. */ | |
12886 | ||
12887 | #if !FFESTB_KILL_EASY_ | |
12888 | static void | |
12889 | ffestb_subr_kill_open_ () | |
12890 | { | |
12891 | ffestpOpenIx ix; | |
12892 | ||
12893 | for (ix = 0; ix < FFESTP_openix; ++ix) | |
12894 | { | |
12895 | if (ffestp_file.open.open_spec[ix].kw_or_val_present) | |
12896 | { | |
12897 | if (ffestp_file.open.open_spec[ix].kw_present) | |
12898 | ffelex_token_kill (ffestp_file.open.open_spec[ix].kw); | |
12899 | if (ffestp_file.open.open_spec[ix].value_present) | |
12900 | ffelex_token_kill (ffestp_file.open.open_spec[ix].value); | |
12901 | } | |
12902 | } | |
12903 | } | |
12904 | ||
12905 | #endif | |
12906 | /* ffestb_subr_kill_print_ -- Kill PRINT statement data structure | |
12907 | ||
12908 | ffestb_subr_kill_print_(); | |
12909 | ||
12910 | Kills all tokens in the PRINT data structure. */ | |
12911 | ||
12912 | #if !FFESTB_KILL_EASY_ | |
12913 | static void | |
12914 | ffestb_subr_kill_print_ () | |
12915 | { | |
12916 | ffestpPrintIx ix; | |
12917 | ||
12918 | for (ix = 0; ix < FFESTP_printix; ++ix) | |
12919 | { | |
12920 | if (ffestp_file.print.print_spec[ix].kw_or_val_present) | |
12921 | { | |
12922 | if (ffestp_file.print.print_spec[ix].kw_present) | |
12923 | ffelex_token_kill (ffestp_file.print.print_spec[ix].kw); | |
12924 | if (ffestp_file.print.print_spec[ix].value_present) | |
12925 | ffelex_token_kill (ffestp_file.print.print_spec[ix].value); | |
12926 | } | |
12927 | } | |
12928 | } | |
12929 | ||
12930 | #endif | |
12931 | /* ffestb_subr_kill_read_ -- Kill READ statement data structure | |
12932 | ||
12933 | ffestb_subr_kill_read_(); | |
12934 | ||
12935 | Kills all tokens in the READ data structure. */ | |
12936 | ||
12937 | #if !FFESTB_KILL_EASY_ | |
12938 | static void | |
12939 | ffestb_subr_kill_read_ () | |
12940 | { | |
12941 | ffestpReadIx ix; | |
12942 | ||
12943 | for (ix = 0; ix < FFESTP_readix; ++ix) | |
12944 | { | |
12945 | if (ffestp_file.read.read_spec[ix].kw_or_val_present) | |
12946 | { | |
12947 | if (ffestp_file.read.read_spec[ix].kw_present) | |
12948 | ffelex_token_kill (ffestp_file.read.read_spec[ix].kw); | |
12949 | if (ffestp_file.read.read_spec[ix].value_present) | |
12950 | ffelex_token_kill (ffestp_file.read.read_spec[ix].value); | |
12951 | } | |
12952 | } | |
12953 | } | |
12954 | ||
12955 | #endif | |
12956 | /* ffestb_subr_kill_rewrite_ -- Kill REWRITE statement data structure | |
12957 | ||
12958 | ffestb_subr_kill_rewrite_(); | |
12959 | ||
12960 | Kills all tokens in the REWRITE data structure. */ | |
12961 | ||
12962 | #if !FFESTB_KILL_EASY_ | |
12963 | static void | |
12964 | ffestb_subr_kill_rewrite_ () | |
12965 | { | |
12966 | ffestpRewriteIx ix; | |
12967 | ||
12968 | for (ix = 0; ix < FFESTP_rewriteix; ++ix) | |
12969 | { | |
12970 | if (ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present) | |
12971 | { | |
12972 | if (ffestp_file.rewrite.rewrite_spec[ix].kw_present) | |
12973 | ffelex_token_kill (ffestp_file.rewrite.rewrite_spec[ix].kw); | |
12974 | if (ffestp_file.rewrite.rewrite_spec[ix].value_present) | |
12975 | ffelex_token_kill (ffestp_file.rewrite.rewrite_spec[ix].value); | |
12976 | } | |
12977 | } | |
12978 | } | |
12979 | ||
12980 | #endif | |
12981 | /* ffestb_subr_kill_type_ -- Kill TYPE statement data structure | |
12982 | ||
12983 | ffestb_subr_kill_type_(); | |
12984 | ||
12985 | Kills all tokens in the TYPE data structure. */ | |
12986 | ||
12987 | #if !FFESTB_KILL_EASY_ | |
12988 | static void | |
12989 | ffestb_subr_kill_type_ () | |
12990 | { | |
12991 | ffestpTypeIx ix; | |
12992 | ||
12993 | for (ix = 0; ix < FFESTP_typeix; ++ix) | |
12994 | { | |
12995 | if (ffestp_file.type.type_spec[ix].kw_or_val_present) | |
12996 | { | |
12997 | if (ffestp_file.type.type_spec[ix].kw_present) | |
12998 | ffelex_token_kill (ffestp_file.type.type_spec[ix].kw); | |
12999 | if (ffestp_file.type.type_spec[ix].value_present) | |
13000 | ffelex_token_kill (ffestp_file.type.type_spec[ix].value); | |
13001 | } | |
13002 | } | |
13003 | } | |
13004 | ||
13005 | #endif | |
13006 | /* ffestb_subr_kill_write_ -- Kill WRITE statement data structure | |
13007 | ||
13008 | ffestb_subr_kill_write_(); | |
13009 | ||
13010 | Kills all tokens in the WRITE data structure. */ | |
13011 | ||
13012 | #if !FFESTB_KILL_EASY_ | |
13013 | static void | |
13014 | ffestb_subr_kill_write_ () | |
13015 | { | |
13016 | ffestpWriteIx ix; | |
13017 | ||
13018 | for (ix = 0; ix < FFESTP_writeix; ++ix) | |
13019 | { | |
13020 | if (ffestp_file.write.write_spec[ix].kw_or_val_present) | |
13021 | { | |
13022 | if (ffestp_file.write.write_spec[ix].kw_present) | |
13023 | ffelex_token_kill (ffestp_file.write.write_spec[ix].kw); | |
13024 | if (ffestp_file.write.write_spec[ix].value_present) | |
13025 | ffelex_token_kill (ffestp_file.write.write_spec[ix].value); | |
13026 | } | |
13027 | } | |
13028 | } | |
13029 | ||
13030 | #endif | |
13031 | /* ffestb_beru -- Parse the BACKSPACE/ENDFILE/REWIND/UNLOCK statement | |
13032 | ||
13033 | return ffestb_beru; // to lexer | |
13034 | ||
13035 | Make sure the statement has a valid form for the BACKSPACE/ENDFILE/REWIND/ | |
13036 | UNLOCK statement. If it does, implement the statement. */ | |
13037 | ||
13038 | ffelexHandler | |
13039 | ffestb_beru (ffelexToken t) | |
13040 | { | |
13041 | ffelexHandler next; | |
13042 | ffestpBeruIx ix; | |
13043 | ||
13044 | switch (ffelex_token_type (ffesta_tokens[0])) | |
13045 | { | |
13046 | case FFELEX_typeNAME: | |
13047 | switch (ffelex_token_type (t)) | |
13048 | { | |
13049 | case FFELEX_typeCOMMA: | |
13050 | case FFELEX_typeCOLONCOLON: | |
13051 | case FFELEX_typeEOS: | |
13052 | case FFELEX_typeSEMICOLON: | |
13053 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
13054 | goto bad_1; /* :::::::::::::::::::: */ | |
13055 | ||
13056 | case FFELEX_typeEQUALS: | |
13057 | case FFELEX_typePOINTS: | |
13058 | case FFELEX_typeCOLON: | |
13059 | goto bad_1; /* :::::::::::::::::::: */ | |
13060 | ||
13061 | case FFELEX_typeNAME: | |
13062 | case FFELEX_typeNUMBER: | |
13063 | ffesta_confirmed (); | |
13064 | break; | |
13065 | ||
13066 | case FFELEX_typeOPEN_PAREN: | |
13067 | for (ix = 0; ix < FFESTP_beruix; ++ix) | |
13068 | ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE; | |
13069 | ffesta_tokens[1] = ffelex_token_use (t); | |
13070 | return (ffelexHandler) ffestb_beru2_; | |
13071 | ||
13072 | default: | |
13073 | break; | |
13074 | } | |
13075 | ||
13076 | for (ix = 0; ix < FFESTP_beruix; ++ix) | |
13077 | ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE; | |
13078 | return (ffelexHandler) (*((ffelexHandler) | |
13079 | ffeexpr_rhs (ffesta_output_pool, | |
13080 | FFEEXPR_contextFILENUM, | |
13081 | (ffeexprCallback) ffestb_beru1_))) | |
13082 | (t); | |
13083 | ||
13084 | case FFELEX_typeNAMES: | |
13085 | switch (ffelex_token_type (t)) | |
13086 | { | |
13087 | case FFELEX_typeCOMMA: | |
13088 | case FFELEX_typeCOLONCOLON: | |
13089 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
13090 | goto bad_1; /* :::::::::::::::::::: */ | |
13091 | ||
13092 | case FFELEX_typeEQUALS: | |
13093 | case FFELEX_typePOINTS: | |
13094 | case FFELEX_typeCOLON: | |
13095 | goto bad_1; /* :::::::::::::::::::: */ | |
13096 | ||
13097 | case FFELEX_typeEOS: | |
13098 | case FFELEX_typeSEMICOLON: | |
13099 | ffesta_confirmed (); | |
13100 | break; | |
13101 | ||
13102 | case FFELEX_typeOPEN_PAREN: | |
13103 | if (ffelex_token_length (ffesta_tokens[0]) | |
13104 | != ffestb_args.beru.len) | |
13105 | break; | |
13106 | ||
13107 | for (ix = 0; ix < FFESTP_beruix; ++ix) | |
13108 | ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE; | |
13109 | ffesta_tokens[1] = ffelex_token_use (t); | |
13110 | return (ffelexHandler) ffestb_beru2_; | |
13111 | ||
13112 | default: | |
13113 | break; | |
13114 | } | |
13115 | for (ix = 0; ix < FFESTP_beruix; ++ix) | |
13116 | ffestp_file.beru.beru_spec[ix].kw_or_val_present = FALSE; | |
13117 | next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13118 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_beru1_); | |
13119 | next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0], | |
13120 | ffestb_args.beru.len); | |
13121 | if (next == NULL) | |
13122 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
13123 | (ffelexHandler) ffesta_zero); | |
13124 | return (ffelexHandler) (*next) (t); | |
13125 | ||
13126 | default: | |
13127 | goto bad_0; /* :::::::::::::::::::: */ | |
13128 | } | |
13129 | ||
13130 | bad_0: /* :::::::::::::::::::: */ | |
13131 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, ffesta_tokens[0]); | |
13132 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13133 | ||
13134 | bad_1: /* :::::::::::::::::::: */ | |
13135 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13136 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
13137 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
13138 | } | |
13139 | ||
13140 | /* ffestb_beru1_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" expr | |
13141 | ||
13142 | (ffestb_beru1_) // to expression handler | |
13143 | ||
13144 | Make sure the next token is an EOS or SEMICOLON. */ | |
13145 | ||
13146 | static ffelexHandler | |
13147 | ffestb_beru1_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
13148 | { | |
13149 | switch (ffelex_token_type (t)) | |
13150 | { | |
13151 | case FFELEX_typeEOS: | |
13152 | case FFELEX_typeSEMICOLON: | |
13153 | if (expr == NULL) | |
13154 | break; | |
13155 | ffesta_confirmed (); | |
13156 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_or_val_present | |
13157 | = TRUE; | |
13158 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_present = FALSE; | |
13159 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_present = TRUE; | |
13160 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_is_label | |
13161 | = FALSE; | |
13162 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value | |
13163 | = ffelex_token_use (ft); | |
13164 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].u.expr = expr; | |
13165 | if (!ffesta_is_inhibited ()) | |
13166 | { | |
13167 | switch (ffesta_first_kw) | |
13168 | { | |
13169 | case FFESTR_firstBACKSPACE: | |
13170 | ffestc_R919 (); | |
13171 | break; | |
13172 | ||
13173 | case FFESTR_firstENDFILE: | |
13174 | case FFESTR_firstEND: | |
13175 | ffestc_R920 (); | |
13176 | break; | |
13177 | ||
13178 | case FFESTR_firstREWIND: | |
13179 | ffestc_R921 (); | |
13180 | break; | |
13181 | ||
13182 | #if FFESTR_VXT | |
13183 | case FFESTR_firstUNLOCK: | |
13184 | ffestc_V022 (); | |
13185 | break; | |
13186 | #endif | |
13187 | ||
13188 | default: | |
13189 | assert (FALSE); | |
13190 | } | |
13191 | } | |
13192 | ffestb_subr_kill_beru_ (); | |
13193 | return (ffelexHandler) ffesta_zero (t); | |
13194 | ||
13195 | default: | |
13196 | break; | |
13197 | } | |
13198 | ||
13199 | ffestb_subr_kill_beru_ (); | |
13200 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13201 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13202 | } | |
13203 | ||
13204 | /* ffestb_beru2_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN | |
13205 | ||
13206 | return ffestb_beru2_; // to lexer | |
13207 | ||
13208 | Handle expr construct (not NAME=expr construct) here. */ | |
13209 | ||
13210 | static ffelexHandler | |
13211 | ffestb_beru2_ (ffelexToken t) | |
13212 | { | |
13213 | ffelexToken nt; | |
13214 | ffelexHandler next; | |
13215 | ||
13216 | switch (ffelex_token_type (t)) | |
13217 | { | |
13218 | case FFELEX_typeNAME: | |
13219 | ffesta_tokens[2] = ffelex_token_use (t); | |
13220 | return (ffelexHandler) ffestb_beru3_; | |
13221 | ||
13222 | default: | |
13223 | nt = ffesta_tokens[1]; | |
13224 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13225 | FFEEXPR_contextFILENUMAMBIG, (ffeexprCallback) ffestb_beru4_))) | |
13226 | (nt); | |
13227 | ffelex_token_kill (nt); | |
13228 | return (ffelexHandler) (*next) (t); | |
13229 | } | |
13230 | } | |
13231 | ||
13232 | /* ffestb_beru3_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN NAME | |
13233 | ||
13234 | return ffestb_beru3_; // to lexer | |
13235 | ||
13236 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
13237 | token thru expression handler. */ | |
13238 | ||
13239 | static ffelexHandler | |
13240 | ffestb_beru3_ (ffelexToken t) | |
13241 | { | |
13242 | ffelexHandler next; | |
13243 | ffelexToken nt; | |
13244 | ffelexToken ot; | |
13245 | ||
13246 | switch (ffelex_token_type (t)) | |
13247 | { | |
13248 | case FFELEX_typeEQUALS: | |
13249 | ffelex_token_kill (ffesta_tokens[1]); | |
13250 | nt = ffesta_tokens[2]; | |
13251 | next = (ffelexHandler) ffestb_beru5_ (nt); | |
13252 | ffelex_token_kill (nt); | |
13253 | return (ffelexHandler) (*next) (t); | |
13254 | ||
13255 | default: | |
13256 | nt = ffesta_tokens[1]; | |
13257 | ot = ffesta_tokens[2]; | |
13258 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13259 | FFEEXPR_contextFILENUMAMBIG, (ffeexprCallback) ffestb_beru4_))) | |
13260 | (nt); | |
13261 | ffelex_token_kill (nt); | |
13262 | next = (ffelexHandler) (*next) (ot); | |
13263 | ffelex_token_kill (ot); | |
13264 | return (ffelexHandler) (*next) (t); | |
13265 | } | |
13266 | } | |
13267 | ||
13268 | /* ffestb_beru4_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN expr [CLOSE_PAREN] | |
13269 | ||
13270 | (ffestb_beru4_) // to expression handler | |
13271 | ||
13272 | Handle COMMA or EOS/SEMICOLON here. | |
13273 | ||
13274 | 15-Feb-91 JCB 1.2 | |
13275 | Now using new mechanism whereby expr comes back as opITEM if the | |
13276 | expr is considered part (or all) of an I/O control list (and should | |
13277 | be stripped of its outer opITEM node) or not if it is considered | |
13278 | a plain unit number that happens to have been enclosed in parens. | |
13279 | 26-Mar-90 JCB 1.1 | |
13280 | No longer expecting close-paren here because of constructs like | |
13281 | BACKSPACE (5)+2, so now expecting either COMMA because it was a | |
13282 | construct like BACKSPACE (5+2,... or EOS/SEMICOLON because it is like | |
13283 | the former construct. Ah, the vagaries of Fortran. */ | |
13284 | ||
13285 | static ffelexHandler | |
13286 | ffestb_beru4_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
13287 | { | |
13288 | bool inlist; | |
13289 | ||
13290 | switch (ffelex_token_type (t)) | |
13291 | { | |
13292 | case FFELEX_typeCOMMA: | |
13293 | case FFELEX_typeEOS: | |
13294 | case FFELEX_typeSEMICOLON: | |
13295 | case FFELEX_typeCLOSE_PAREN: | |
13296 | if (expr == NULL) | |
13297 | break; | |
13298 | if (ffebld_op (expr) == FFEBLD_opITEM) | |
13299 | { | |
13300 | inlist = TRUE; | |
13301 | expr = ffebld_head (expr); | |
13302 | } | |
13303 | else | |
13304 | inlist = FALSE; | |
13305 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_or_val_present | |
13306 | = TRUE; | |
13307 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].kw_present = FALSE; | |
13308 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_present = TRUE; | |
13309 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value_is_label | |
13310 | = FALSE; | |
13311 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].value | |
13312 | = ffelex_token_use (ft); | |
13313 | ffestp_file.beru.beru_spec[FFESTP_beruixUNIT].u.expr = expr; | |
13314 | if (inlist) | |
13315 | return (ffelexHandler) ffestb_beru9_ (t); | |
13316 | return (ffelexHandler) ffestb_beru10_ (t); | |
13317 | ||
13318 | default: | |
13319 | break; | |
13320 | } | |
13321 | ||
13322 | ffestb_subr_kill_beru_ (); | |
13323 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13324 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13325 | } | |
13326 | ||
13327 | /* ffestb_beru5_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN [external-file-unit | |
13328 | COMMA] | |
13329 | ||
13330 | return ffestb_beru5_; // to lexer | |
13331 | ||
13332 | Handle expr construct (not NAME=expr construct) here. */ | |
13333 | ||
13334 | static ffelexHandler | |
13335 | ffestb_beru5_ (ffelexToken t) | |
13336 | { | |
13337 | ffestrGenio kw; | |
13338 | ||
13339 | ffestb_local_.beru.label = FALSE; | |
13340 | ||
13341 | switch (ffelex_token_type (t)) | |
13342 | { | |
13343 | case FFELEX_typeNAME: | |
13344 | kw = ffestr_genio (t); | |
13345 | switch (kw) | |
13346 | { | |
13347 | case FFESTR_genioERR: | |
13348 | ffestb_local_.beru.ix = FFESTP_beruixERR; | |
13349 | ffestb_local_.beru.label = TRUE; | |
13350 | break; | |
13351 | ||
13352 | case FFESTR_genioIOSTAT: | |
13353 | ffestb_local_.beru.ix = FFESTP_beruixIOSTAT; | |
13354 | ffestb_local_.beru.left = TRUE; | |
13355 | ffestb_local_.beru.context = FFEEXPR_contextFILEINT; | |
13356 | break; | |
13357 | ||
13358 | case FFESTR_genioUNIT: | |
13359 | ffestb_local_.beru.ix = FFESTP_beruixUNIT; | |
13360 | ffestb_local_.beru.left = FALSE; | |
13361 | ffestb_local_.beru.context = FFEEXPR_contextFILENUM; | |
13362 | break; | |
13363 | ||
13364 | default: | |
13365 | goto bad; /* :::::::::::::::::::: */ | |
13366 | } | |
13367 | if (ffestp_file.beru.beru_spec[ffestb_local_.beru.ix] | |
13368 | .kw_or_val_present) | |
13369 | break; /* Can't specify a keyword twice! */ | |
13370 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix] | |
13371 | .kw_or_val_present = TRUE; | |
13372 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix] | |
13373 | .kw_present = TRUE; | |
13374 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix] | |
13375 | .value_present = FALSE; | |
13376 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_is_label | |
13377 | = ffestb_local_.beru.label; | |
13378 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].kw | |
13379 | = ffelex_token_use (t); | |
13380 | return (ffelexHandler) ffestb_beru6_; | |
13381 | ||
13382 | default: | |
13383 | break; | |
13384 | } | |
13385 | ||
13386 | bad: /* :::::::::::::::::::: */ | |
13387 | ffestb_subr_kill_beru_ (); | |
13388 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13389 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13390 | } | |
13391 | ||
13392 | /* ffestb_beru6_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN [external-file-unit | |
13393 | COMMA] NAME | |
13394 | ||
13395 | return ffestb_beru6_; // to lexer | |
13396 | ||
13397 | Make sure EQUALS here, send next token to expression handler. */ | |
13398 | ||
13399 | static ffelexHandler | |
13400 | ffestb_beru6_ (ffelexToken t) | |
13401 | { | |
13402 | ||
13403 | switch (ffelex_token_type (t)) | |
13404 | { | |
13405 | case FFELEX_typeEQUALS: | |
13406 | ffesta_confirmed (); | |
13407 | if (ffestb_local_.beru.label) | |
13408 | return (ffelexHandler) ffestb_beru8_; | |
13409 | if (ffestb_local_.beru.left) | |
13410 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
13411 | ffestb_local_.beru.context, | |
13412 | (ffeexprCallback) ffestb_beru7_); | |
13413 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13414 | ffestb_local_.beru.context, | |
13415 | (ffeexprCallback) ffestb_beru7_); | |
13416 | ||
13417 | default: | |
13418 | break; | |
13419 | } | |
13420 | ||
13421 | ffestb_subr_kill_beru_ (); | |
13422 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13423 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13424 | } | |
13425 | ||
13426 | /* ffestb_beru7_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS expr | |
13427 | ||
13428 | (ffestb_beru7_) // to expression handler | |
13429 | ||
13430 | Handle COMMA or CLOSE_PAREN here. */ | |
13431 | ||
13432 | static ffelexHandler | |
13433 | ffestb_beru7_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
13434 | { | |
13435 | switch (ffelex_token_type (t)) | |
13436 | { | |
13437 | case FFELEX_typeCOMMA: | |
13438 | case FFELEX_typeCLOSE_PAREN: | |
13439 | if (expr == NULL) | |
13440 | break; | |
13441 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_present | |
13442 | = TRUE; | |
13443 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value | |
13444 | = ffelex_token_use (ft); | |
13445 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].u.expr = expr; | |
13446 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
13447 | return (ffelexHandler) ffestb_beru5_; | |
13448 | return (ffelexHandler) ffestb_beru10_; | |
13449 | ||
13450 | default: | |
13451 | break; | |
13452 | } | |
13453 | ||
13454 | ffestb_subr_kill_beru_ (); | |
13455 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13456 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13457 | } | |
13458 | ||
13459 | /* ffestb_beru8_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS | |
13460 | ||
13461 | return ffestb_beru8_; // to lexer | |
13462 | ||
13463 | Handle NUMBER for label here. */ | |
13464 | ||
13465 | static ffelexHandler | |
13466 | ffestb_beru8_ (ffelexToken t) | |
13467 | { | |
13468 | switch (ffelex_token_type (t)) | |
13469 | { | |
13470 | case FFELEX_typeNUMBER: | |
13471 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value_present | |
13472 | = TRUE; | |
13473 | ffestp_file.beru.beru_spec[ffestb_local_.beru.ix].value | |
13474 | = ffelex_token_use (t); | |
13475 | return (ffelexHandler) ffestb_beru9_; | |
13476 | ||
13477 | default: | |
13478 | break; | |
13479 | } | |
13480 | ||
13481 | ffestb_subr_kill_beru_ (); | |
13482 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13483 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13484 | } | |
13485 | ||
13486 | /* ffestb_beru9_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... NAME EQUALS | |
13487 | NUMBER | |
13488 | ||
13489 | return ffestb_beru9_; // to lexer | |
13490 | ||
13491 | Handle COMMA or CLOSE_PAREN here. */ | |
13492 | ||
13493 | static ffelexHandler | |
13494 | ffestb_beru9_ (ffelexToken t) | |
13495 | { | |
13496 | switch (ffelex_token_type (t)) | |
13497 | { | |
13498 | case FFELEX_typeCOMMA: | |
13499 | return (ffelexHandler) ffestb_beru5_; | |
13500 | ||
13501 | case FFELEX_typeCLOSE_PAREN: | |
13502 | return (ffelexHandler) ffestb_beru10_; | |
13503 | ||
13504 | default: | |
13505 | break; | |
13506 | } | |
13507 | ||
13508 | ffestb_subr_kill_beru_ (); | |
13509 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13510 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13511 | } | |
13512 | ||
13513 | /* ffestb_beru10_ -- "BACKSPACE/ENDFILE/REWIND/UNLOCK" OPEN_PAREN ... CLOSE_PAREN | |
13514 | ||
13515 | return ffestb_beru10_; // to lexer | |
13516 | ||
13517 | Handle EOS or SEMICOLON here. */ | |
13518 | ||
13519 | static ffelexHandler | |
13520 | ffestb_beru10_ (ffelexToken t) | |
13521 | { | |
13522 | switch (ffelex_token_type (t)) | |
13523 | { | |
13524 | case FFELEX_typeEOS: | |
13525 | case FFELEX_typeSEMICOLON: | |
13526 | ffesta_confirmed (); | |
13527 | if (!ffesta_is_inhibited ()) | |
13528 | { | |
13529 | switch (ffesta_first_kw) | |
13530 | { | |
13531 | case FFESTR_firstBACKSPACE: | |
13532 | ffestc_R919 (); | |
13533 | break; | |
13534 | ||
13535 | case FFESTR_firstENDFILE: | |
13536 | case FFESTR_firstEND: | |
13537 | ffestc_R920 (); | |
13538 | break; | |
13539 | ||
13540 | case FFESTR_firstREWIND: | |
13541 | ffestc_R921 (); | |
13542 | break; | |
13543 | ||
13544 | #if FFESTR_VXT | |
13545 | case FFESTR_firstUNLOCK: | |
13546 | ffestc_V022 (); | |
13547 | break; | |
13548 | #endif | |
13549 | ||
13550 | default: | |
13551 | assert (FALSE); | |
13552 | } | |
13553 | } | |
13554 | ffestb_subr_kill_beru_ (); | |
13555 | return (ffelexHandler) ffesta_zero (t); | |
13556 | ||
13557 | default: | |
13558 | break; | |
13559 | } | |
13560 | ||
13561 | ffestb_subr_kill_beru_ (); | |
13562 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.beru.badname, t); | |
13563 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13564 | } | |
13565 | ||
13566 | /* ffestb_vxtcode -- Parse the VXT DECODE/ENCODE statement | |
13567 | ||
13568 | return ffestb_vxtcode; // to lexer | |
13569 | ||
13570 | Make sure the statement has a valid form for the VXT DECODE/ENCODE | |
13571 | statement. If it does, implement the statement. */ | |
13572 | ||
13573 | #if FFESTR_VXT | |
13574 | ffelexHandler | |
13575 | ffestb_vxtcode (ffelexToken t) | |
13576 | { | |
13577 | ffestpVxtcodeIx ix; | |
13578 | ||
13579 | switch (ffelex_token_type (ffesta_tokens[0])) | |
13580 | { | |
13581 | case FFELEX_typeNAME: | |
13582 | switch (ffelex_token_type (t)) | |
13583 | { | |
13584 | case FFELEX_typeCOMMA: | |
13585 | case FFELEX_typeCOLONCOLON: | |
13586 | case FFELEX_typeEOS: | |
13587 | case FFELEX_typeSEMICOLON: | |
13588 | case FFELEX_typeNAME: | |
13589 | case FFELEX_typeNUMBER: | |
13590 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
13591 | goto bad_1; /* :::::::::::::::::::: */ | |
13592 | ||
13593 | default: | |
13594 | goto bad_1; /* :::::::::::::::::::: */ | |
13595 | ||
13596 | case FFELEX_typeOPEN_PAREN: | |
13597 | for (ix = 0; ix < FFESTP_vxtcodeix; ++ix) | |
13598 | ffestp_file.vxtcode.vxtcode_spec[ix].kw_or_val_present = FALSE; | |
13599 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13600 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_vxtcode1_); | |
13601 | } | |
13602 | ||
13603 | case FFELEX_typeNAMES: | |
13604 | switch (ffelex_token_type (t)) | |
13605 | { | |
13606 | case FFELEX_typeEOS: | |
13607 | case FFELEX_typeSEMICOLON: | |
13608 | case FFELEX_typeCOMMA: | |
13609 | case FFELEX_typeCOLONCOLON: | |
13610 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
13611 | goto bad_1; /* :::::::::::::::::::: */ | |
13612 | ||
13613 | default: | |
13614 | goto bad_1; /* :::::::::::::::::::: */ | |
13615 | ||
13616 | case FFELEX_typeOPEN_PAREN: | |
13617 | if (ffelex_token_length (ffesta_tokens[0]) | |
13618 | != ffestb_args.vxtcode.len) | |
13619 | goto bad_0; /* :::::::::::::::::::: */ | |
13620 | ||
13621 | for (ix = 0; ix < FFESTP_vxtcodeix; ++ix) | |
13622 | ffestp_file.vxtcode.vxtcode_spec[ix].kw_or_val_present = FALSE; | |
13623 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13624 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_vxtcode1_); | |
13625 | } | |
13626 | ||
13627 | default: | |
13628 | goto bad_0; /* :::::::::::::::::::: */ | |
13629 | } | |
13630 | ||
13631 | bad_0: /* :::::::::::::::::::: */ | |
13632 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, ffesta_tokens[0]); | |
13633 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13634 | ||
13635 | bad_1: /* :::::::::::::::::::: */ | |
13636 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13637 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
13638 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
13639 | } | |
13640 | ||
13641 | /* ffestb_vxtcode1_ -- "VXTCODE" OPEN_PAREN expr | |
13642 | ||
13643 | (ffestb_vxtcode1_) // to expression handler | |
13644 | ||
13645 | Handle COMMA here. */ | |
13646 | ||
13647 | static ffelexHandler | |
13648 | ffestb_vxtcode1_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
13649 | { | |
13650 | switch (ffelex_token_type (t)) | |
13651 | { | |
13652 | case FFELEX_typeCOMMA: | |
13653 | if (expr == NULL) | |
13654 | break; | |
13655 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].kw_or_val_present | |
13656 | = TRUE; | |
13657 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].kw_present = FALSE; | |
13658 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value_present = TRUE; | |
13659 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value_is_label | |
13660 | = FALSE; | |
13661 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].value | |
13662 | = ffelex_token_use (ft); | |
13663 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixC].u.expr = expr; | |
13664 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13665 | FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_vxtcode2_); | |
13666 | ||
13667 | default: | |
13668 | break; | |
13669 | } | |
13670 | ||
13671 | ffestb_subr_kill_vxtcode_ (); | |
13672 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13673 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13674 | } | |
13675 | ||
13676 | /* ffestb_vxtcode2_ -- "VXTCODE" OPEN_PAREN expr COMMA expr | |
13677 | ||
13678 | (ffestb_vxtcode2_) // to expression handler | |
13679 | ||
13680 | Handle COMMA here. */ | |
13681 | ||
13682 | static ffelexHandler | |
13683 | ffestb_vxtcode2_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
13684 | { | |
13685 | switch (ffelex_token_type (t)) | |
13686 | { | |
13687 | case FFELEX_typeCOMMA: | |
13688 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].kw_or_val_present | |
13689 | = TRUE; | |
13690 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].kw_present = FALSE; | |
13691 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value_present = TRUE; | |
13692 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value_is_label | |
13693 | = (expr == NULL); | |
13694 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].value | |
13695 | = ffelex_token_use (ft); | |
13696 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixF].u.expr = expr; | |
13697 | if (ffesta_first_kw == FFESTR_firstENCODE) | |
13698 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
13699 | FFEEXPR_contextFILEVXTCODE, | |
13700 | (ffeexprCallback) ffestb_vxtcode3_); | |
13701 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13702 | FFEEXPR_contextFILEVXTCODE, | |
13703 | (ffeexprCallback) ffestb_vxtcode3_); | |
13704 | ||
13705 | default: | |
13706 | break; | |
13707 | } | |
13708 | ||
13709 | ffestb_subr_kill_vxtcode_ (); | |
13710 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13711 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13712 | } | |
13713 | ||
13714 | /* ffestb_vxtcode3_ -- "VXTCODE" OPEN_PAREN expr COMMA expr COMMA expr | |
13715 | ||
13716 | (ffestb_vxtcode3_) // to expression handler | |
13717 | ||
13718 | Handle COMMA or CLOSE_PAREN here. */ | |
13719 | ||
13720 | static ffelexHandler | |
13721 | ffestb_vxtcode3_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
13722 | { | |
13723 | switch (ffelex_token_type (t)) | |
13724 | { | |
13725 | case FFELEX_typeCOMMA: | |
13726 | case FFELEX_typeCLOSE_PAREN: | |
13727 | if (expr == NULL) | |
13728 | break; | |
13729 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].kw_or_val_present | |
13730 | = TRUE; | |
13731 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].kw_present = FALSE; | |
13732 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value_present = TRUE; | |
13733 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value_is_label | |
13734 | = FALSE; | |
13735 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].value | |
13736 | = ffelex_token_use (ft); | |
13737 | ffestp_file.vxtcode.vxtcode_spec[FFESTP_vxtcodeixB].u.expr = expr; | |
13738 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
13739 | return (ffelexHandler) ffestb_vxtcode4_; | |
13740 | return (ffelexHandler) ffestb_vxtcode9_; | |
13741 | ||
13742 | default: | |
13743 | break; | |
13744 | } | |
13745 | ||
13746 | ffestb_subr_kill_vxtcode_ (); | |
13747 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13748 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13749 | } | |
13750 | ||
13751 | /* ffestb_vxtcode4_ -- "VXTCODE" OPEN_PAREN ... | |
13752 | ||
13753 | return ffestb_vxtcode4_; // to lexer | |
13754 | ||
13755 | Handle NAME=expr construct here. */ | |
13756 | ||
13757 | static ffelexHandler | |
13758 | ffestb_vxtcode4_ (ffelexToken t) | |
13759 | { | |
13760 | ffestrGenio kw; | |
13761 | ||
13762 | ffestb_local_.vxtcode.label = FALSE; | |
13763 | ||
13764 | switch (ffelex_token_type (t)) | |
13765 | { | |
13766 | case FFELEX_typeNAME: | |
13767 | kw = ffestr_genio (t); | |
13768 | switch (kw) | |
13769 | { | |
13770 | case FFESTR_genioERR: | |
13771 | ffestb_local_.vxtcode.ix = FFESTP_vxtcodeixERR; | |
13772 | ffestb_local_.vxtcode.label = TRUE; | |
13773 | break; | |
13774 | ||
13775 | case FFESTR_genioIOSTAT: | |
13776 | ffestb_local_.vxtcode.ix = FFESTP_vxtcodeixIOSTAT; | |
13777 | ffestb_local_.vxtcode.left = TRUE; | |
13778 | ffestb_local_.vxtcode.context = FFEEXPR_contextFILEINT; | |
13779 | break; | |
13780 | ||
13781 | default: | |
13782 | goto bad; /* :::::::::::::::::::: */ | |
13783 | } | |
13784 | if (ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix] | |
13785 | .kw_or_val_present) | |
13786 | break; /* Can't specify a keyword twice! */ | |
13787 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix] | |
13788 | .kw_or_val_present = TRUE; | |
13789 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix] | |
13790 | .kw_present = TRUE; | |
13791 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix] | |
13792 | .value_present = FALSE; | |
13793 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_is_label | |
13794 | = ffestb_local_.vxtcode.label; | |
13795 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].kw | |
13796 | = ffelex_token_use (t); | |
13797 | return (ffelexHandler) ffestb_vxtcode5_; | |
13798 | ||
13799 | default: | |
13800 | break; | |
13801 | } | |
13802 | ||
13803 | bad: /* :::::::::::::::::::: */ | |
13804 | ffestb_subr_kill_vxtcode_ (); | |
13805 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13806 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13807 | } | |
13808 | ||
13809 | /* ffestb_vxtcode5_ -- "VXTCODE" OPEN_PAREN [external-file-unit COMMA [format | |
13810 | COMMA]] NAME | |
13811 | ||
13812 | return ffestb_vxtcode5_; // to lexer | |
13813 | ||
13814 | Make sure EQUALS here, send next token to expression handler. */ | |
13815 | ||
13816 | static ffelexHandler | |
13817 | ffestb_vxtcode5_ (ffelexToken t) | |
13818 | { | |
13819 | switch (ffelex_token_type (t)) | |
13820 | { | |
13821 | case FFELEX_typeEQUALS: | |
13822 | ffesta_confirmed (); | |
13823 | if (ffestb_local_.vxtcode.label) | |
13824 | return (ffelexHandler) ffestb_vxtcode7_; | |
13825 | if (ffestb_local_.vxtcode.left) | |
13826 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
13827 | ffestb_local_.vxtcode.context, | |
13828 | (ffeexprCallback) ffestb_vxtcode6_); | |
13829 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13830 | ffestb_local_.vxtcode.context, | |
13831 | (ffeexprCallback) ffestb_vxtcode6_); | |
13832 | ||
13833 | default: | |
13834 | break; | |
13835 | } | |
13836 | ||
13837 | ffestb_subr_kill_vxtcode_ (); | |
13838 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13839 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13840 | } | |
13841 | ||
13842 | /* ffestb_vxtcode6_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS expr | |
13843 | ||
13844 | (ffestb_vxtcode6_) // to expression handler | |
13845 | ||
13846 | Handle COMMA or CLOSE_PAREN here. */ | |
13847 | ||
13848 | static ffelexHandler | |
13849 | ffestb_vxtcode6_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
13850 | { | |
13851 | switch (ffelex_token_type (t)) | |
13852 | { | |
13853 | case FFELEX_typeCOMMA: | |
13854 | case FFELEX_typeCLOSE_PAREN: | |
13855 | if (expr == NULL) | |
13856 | break; | |
13857 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_present | |
13858 | = TRUE; | |
13859 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value | |
13860 | = ffelex_token_use (ft); | |
13861 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].u.expr = expr; | |
13862 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
13863 | return (ffelexHandler) ffestb_vxtcode4_; | |
13864 | return (ffelexHandler) ffestb_vxtcode9_; | |
13865 | ||
13866 | default: | |
13867 | break; | |
13868 | } | |
13869 | ||
13870 | ffestb_subr_kill_vxtcode_ (); | |
13871 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13872 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13873 | } | |
13874 | ||
13875 | /* ffestb_vxtcode7_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS | |
13876 | ||
13877 | return ffestb_vxtcode7_; // to lexer | |
13878 | ||
13879 | Handle NUMBER for label here. */ | |
13880 | ||
13881 | static ffelexHandler | |
13882 | ffestb_vxtcode7_ (ffelexToken t) | |
13883 | { | |
13884 | switch (ffelex_token_type (t)) | |
13885 | { | |
13886 | case FFELEX_typeNUMBER: | |
13887 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value_present | |
13888 | = TRUE; | |
13889 | ffestp_file.vxtcode.vxtcode_spec[ffestb_local_.vxtcode.ix].value | |
13890 | = ffelex_token_use (t); | |
13891 | return (ffelexHandler) ffestb_vxtcode8_; | |
13892 | ||
13893 | default: | |
13894 | break; | |
13895 | } | |
13896 | ||
13897 | ffestb_subr_kill_vxtcode_ (); | |
13898 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13899 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13900 | } | |
13901 | ||
13902 | /* ffestb_vxtcode8_ -- "VXTCODE" OPEN_PAREN ... NAME EQUALS NUMBER | |
13903 | ||
13904 | return ffestb_vxtcode8_; // to lexer | |
13905 | ||
13906 | Handle COMMA or CLOSE_PAREN here. */ | |
13907 | ||
13908 | static ffelexHandler | |
13909 | ffestb_vxtcode8_ (ffelexToken t) | |
13910 | { | |
13911 | switch (ffelex_token_type (t)) | |
13912 | { | |
13913 | case FFELEX_typeCOMMA: | |
13914 | return (ffelexHandler) ffestb_vxtcode4_; | |
13915 | ||
13916 | case FFELEX_typeCLOSE_PAREN: | |
13917 | return (ffelexHandler) ffestb_vxtcode9_; | |
13918 | ||
13919 | default: | |
13920 | break; | |
13921 | } | |
13922 | ||
13923 | ffestb_subr_kill_vxtcode_ (); | |
13924 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13925 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13926 | } | |
13927 | ||
13928 | /* ffestb_vxtcode9_ -- "VXTCODE" OPEN_PAREN ... CLOSE_PAREN | |
13929 | ||
13930 | return ffestb_vxtcode9_; // to lexer | |
13931 | ||
13932 | Handle EOS or SEMICOLON here. | |
13933 | ||
13934 | 07-Jun-90 JCB 1.1 | |
13935 | Context for ENCODE/DECODE expressions is now IOLISTDF instead of IOLIST | |
13936 | since they apply to internal files. */ | |
13937 | ||
13938 | static ffelexHandler | |
13939 | ffestb_vxtcode9_ (ffelexToken t) | |
13940 | { | |
13941 | ffelexHandler next; | |
13942 | ||
13943 | switch (ffelex_token_type (t)) | |
13944 | { | |
13945 | case FFELEX_typeEOS: | |
13946 | case FFELEX_typeSEMICOLON: | |
13947 | ffesta_confirmed (); | |
13948 | if (!ffesta_is_inhibited ()) | |
13949 | { | |
13950 | if (ffesta_first_kw == FFESTR_firstENCODE) | |
13951 | { | |
13952 | ffestc_V023_start (); | |
13953 | ffestc_V023_finish (); | |
13954 | } | |
13955 | else | |
13956 | { | |
13957 | ffestc_V024_start (); | |
13958 | ffestc_V024_finish (); | |
13959 | } | |
13960 | } | |
13961 | ffestb_subr_kill_vxtcode_ (); | |
13962 | return (ffelexHandler) ffesta_zero (t); | |
13963 | ||
13964 | case FFELEX_typeNAME: | |
13965 | case FFELEX_typeOPEN_PAREN: | |
13966 | case FFELEX_typeCOMMA: | |
13967 | ffesta_confirmed (); | |
13968 | if (!ffesta_is_inhibited ()) | |
13969 | if (ffesta_first_kw == FFESTR_firstENCODE) | |
13970 | ffestc_V023_start (); | |
13971 | else | |
13972 | ffestc_V024_start (); | |
13973 | ffestb_subr_kill_vxtcode_ (); | |
13974 | if (ffesta_first_kw == FFESTR_firstDECODE) | |
13975 | next = (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
13976 | FFEEXPR_contextIOLISTDF, | |
13977 | (ffeexprCallback) ffestb_vxtcode10_); | |
13978 | else | |
13979 | next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
13980 | FFEEXPR_contextIOLISTDF, | |
13981 | (ffeexprCallback) ffestb_vxtcode10_); | |
13982 | ||
13983 | /* EXTENSION: Allow an optional preceding COMMA here if not pedantic. | |
13984 | (f2c provides this extension, as do other compilers, supposedly.) */ | |
13985 | ||
13986 | if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA)) | |
13987 | return next; | |
13988 | ||
13989 | return (ffelexHandler) (*next) (t); | |
13990 | ||
13991 | default: | |
13992 | break; | |
13993 | } | |
13994 | ||
13995 | ffestb_subr_kill_vxtcode_ (); | |
13996 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
13997 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
13998 | } | |
13999 | ||
14000 | /* ffestb_vxtcode10_ -- "VXTCODE(...)" expr | |
14001 | ||
14002 | (ffestb_vxtcode10_) // to expression handler | |
14003 | ||
14004 | Handle COMMA or EOS/SEMICOLON here. | |
14005 | ||
14006 | 07-Jun-90 JCB 1.1 | |
14007 | Context for ENCODE/DECODE expressions is now IOLISTDF instead of IOLIST | |
14008 | since they apply to internal files. */ | |
14009 | ||
14010 | static ffelexHandler | |
14011 | ffestb_vxtcode10_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
14012 | { | |
14013 | switch (ffelex_token_type (t)) | |
14014 | { | |
14015 | case FFELEX_typeCOMMA: | |
14016 | if (expr == NULL) | |
14017 | break; | |
14018 | if (!ffesta_is_inhibited ()) | |
14019 | if (ffesta_first_kw == FFESTR_firstENCODE) | |
14020 | ffestc_V023_item (expr, ft); | |
14021 | else | |
14022 | ffestc_V024_item (expr, ft); | |
14023 | if (ffesta_first_kw == FFESTR_firstDECODE) | |
14024 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
14025 | FFEEXPR_contextIOLISTDF, | |
14026 | (ffeexprCallback) ffestb_vxtcode10_); | |
14027 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
14028 | FFEEXPR_contextIOLISTDF, | |
14029 | (ffeexprCallback) ffestb_vxtcode10_); | |
14030 | ||
14031 | case FFELEX_typeEOS: | |
14032 | case FFELEX_typeSEMICOLON: | |
14033 | if (expr == NULL) | |
14034 | break; | |
14035 | if (!ffesta_is_inhibited ()) | |
14036 | { | |
14037 | if (ffesta_first_kw == FFESTR_firstENCODE) | |
14038 | { | |
14039 | ffestc_V023_item (expr, ft); | |
14040 | ffestc_V023_finish (); | |
14041 | } | |
14042 | else | |
14043 | { | |
14044 | ffestc_V024_item (expr, ft); | |
14045 | ffestc_V024_finish (); | |
14046 | } | |
14047 | } | |
14048 | return (ffelexHandler) ffesta_zero (t); | |
14049 | ||
14050 | default: | |
14051 | break; | |
14052 | } | |
14053 | ||
14054 | if (!ffesta_is_inhibited ()) | |
14055 | if (ffesta_first_kw == FFESTR_firstENCODE) | |
14056 | ffestc_V023_finish (); | |
14057 | else | |
14058 | ffestc_V024_finish (); | |
14059 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.vxtcode.badname, t); | |
14060 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14061 | } | |
14062 | ||
14063 | #endif | |
14064 | /* ffestb_R904 -- Parse an OPEN statement | |
14065 | ||
14066 | return ffestb_R904; // to lexer | |
14067 | ||
14068 | Make sure the statement has a valid form for an OPEN statement. | |
14069 | If it does, implement the statement. */ | |
14070 | ||
14071 | ffelexHandler | |
14072 | ffestb_R904 (ffelexToken t) | |
14073 | { | |
14074 | ffestpOpenIx ix; | |
14075 | ||
14076 | switch (ffelex_token_type (ffesta_tokens[0])) | |
14077 | { | |
14078 | case FFELEX_typeNAME: | |
14079 | if (ffesta_first_kw != FFESTR_firstOPEN) | |
14080 | goto bad_0; /* :::::::::::::::::::: */ | |
14081 | break; | |
14082 | ||
14083 | case FFELEX_typeNAMES: | |
14084 | if (ffesta_first_kw != FFESTR_firstOPEN) | |
14085 | goto bad_0; /* :::::::::::::::::::: */ | |
14086 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlOPEN) | |
14087 | goto bad_0; /* :::::::::::::::::::: */ | |
14088 | break; | |
14089 | ||
14090 | default: | |
14091 | goto bad_0; /* :::::::::::::::::::: */ | |
14092 | } | |
14093 | ||
14094 | switch (ffelex_token_type (t)) | |
14095 | { | |
14096 | case FFELEX_typeOPEN_PAREN: | |
14097 | break; | |
14098 | ||
14099 | case FFELEX_typeEOS: | |
14100 | case FFELEX_typeSEMICOLON: | |
14101 | case FFELEX_typeCOMMA: | |
14102 | case FFELEX_typeCOLONCOLON: | |
14103 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
14104 | goto bad_1; /* :::::::::::::::::::: */ | |
14105 | ||
14106 | default: | |
14107 | goto bad_1; /* :::::::::::::::::::: */ | |
14108 | } | |
14109 | ||
14110 | for (ix = 0; ix < FFESTP_openix; ++ix) | |
14111 | ffestp_file.open.open_spec[ix].kw_or_val_present = FALSE; | |
14112 | ||
14113 | return (ffelexHandler) ffestb_R9041_; | |
14114 | ||
14115 | bad_0: /* :::::::::::::::::::: */ | |
14116 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", ffesta_tokens[0]); | |
14117 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14118 | ||
14119 | bad_1: /* :::::::::::::::::::: */ | |
14120 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t); | |
14121 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
14122 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
14123 | } | |
14124 | ||
14125 | /* ffestb_R9041_ -- "OPEN" OPEN_PAREN | |
14126 | ||
14127 | return ffestb_R9041_; // to lexer | |
14128 | ||
14129 | Handle expr construct (not NAME=expr construct) here. */ | |
14130 | ||
14131 | static ffelexHandler | |
14132 | ffestb_R9041_ (ffelexToken t) | |
14133 | { | |
14134 | switch (ffelex_token_type (t)) | |
14135 | { | |
14136 | case FFELEX_typeNAME: | |
14137 | ffesta_tokens[1] = ffelex_token_use (t); | |
14138 | return (ffelexHandler) ffestb_R9042_; | |
14139 | ||
14140 | default: | |
14141 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
14142 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9043_))) | |
14143 | (t); | |
14144 | } | |
14145 | } | |
14146 | ||
14147 | /* ffestb_R9042_ -- "OPEN" OPEN_PAREN NAME | |
14148 | ||
14149 | return ffestb_R9042_; // to lexer | |
14150 | ||
14151 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
14152 | token thru expression handler. */ | |
14153 | ||
14154 | static ffelexHandler | |
14155 | ffestb_R9042_ (ffelexToken t) | |
14156 | { | |
14157 | ffelexHandler next; | |
14158 | ffelexToken nt; | |
14159 | ||
14160 | switch (ffelex_token_type (t)) | |
14161 | { | |
14162 | case FFELEX_typeEQUALS: | |
14163 | nt = ffesta_tokens[1]; | |
14164 | next = (ffelexHandler) ffestb_R9044_ (nt); | |
14165 | ffelex_token_kill (nt); | |
14166 | return (ffelexHandler) (*next) (t); | |
14167 | ||
14168 | default: | |
14169 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
14170 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9043_))) | |
14171 | (ffesta_tokens[1]); | |
14172 | ffelex_token_kill (ffesta_tokens[1]); | |
14173 | return (ffelexHandler) (*next) (t); | |
14174 | } | |
14175 | } | |
14176 | ||
14177 | /* ffestb_R9043_ -- "OPEN" OPEN_PAREN expr | |
14178 | ||
14179 | (ffestb_R9043_) // to expression handler | |
14180 | ||
14181 | Handle COMMA or CLOSE_PAREN here. */ | |
14182 | ||
14183 | static ffelexHandler | |
14184 | ffestb_R9043_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
14185 | { | |
14186 | switch (ffelex_token_type (t)) | |
14187 | { | |
14188 | case FFELEX_typeCOMMA: | |
14189 | case FFELEX_typeCLOSE_PAREN: | |
14190 | if (expr == NULL) | |
14191 | break; | |
14192 | ffestp_file.open.open_spec[FFESTP_openixUNIT].kw_or_val_present | |
14193 | = TRUE; | |
14194 | ffestp_file.open.open_spec[FFESTP_openixUNIT].kw_present = FALSE; | |
14195 | ffestp_file.open.open_spec[FFESTP_openixUNIT].value_present = TRUE; | |
14196 | ffestp_file.open.open_spec[FFESTP_openixUNIT].value_is_label | |
14197 | = FALSE; | |
14198 | ffestp_file.open.open_spec[FFESTP_openixUNIT].value | |
14199 | = ffelex_token_use (ft); | |
14200 | ffestp_file.open.open_spec[FFESTP_openixUNIT].u.expr = expr; | |
14201 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
14202 | return (ffelexHandler) ffestb_R9044_; | |
14203 | return (ffelexHandler) ffestb_R9049_; | |
14204 | ||
14205 | default: | |
14206 | break; | |
14207 | } | |
14208 | ||
14209 | ffestb_subr_kill_open_ (); | |
14210 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t); | |
14211 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14212 | } | |
14213 | ||
14214 | /* ffestb_R9044_ -- "OPEN" OPEN_PAREN [external-file-unit COMMA] | |
14215 | ||
14216 | return ffestb_R9044_; // to lexer | |
14217 | ||
14218 | Handle expr construct (not NAME=expr construct) here. */ | |
14219 | ||
14220 | static ffelexHandler | |
14221 | ffestb_R9044_ (ffelexToken t) | |
14222 | { | |
14223 | ffestrOpen kw; | |
14224 | ||
14225 | ffestb_local_.open.label = FALSE; | |
14226 | ||
14227 | switch (ffelex_token_type (t)) | |
14228 | { | |
14229 | case FFELEX_typeNAME: | |
14230 | kw = ffestr_open (t); | |
14231 | switch (kw) | |
14232 | { | |
14233 | case FFESTR_openACCESS: | |
14234 | ffestb_local_.open.ix = FFESTP_openixACCESS; | |
14235 | ffestb_local_.open.left = FALSE; | |
14236 | ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR; | |
14237 | break; | |
14238 | ||
14239 | case FFESTR_openACTION: | |
14240 | ffestb_local_.open.ix = FFESTP_openixACTION; | |
14241 | ffestb_local_.open.left = FALSE; | |
14242 | ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR; | |
14243 | break; | |
14244 | ||
14245 | case FFESTR_openASSOCIATEVARIABLE: | |
14246 | ffestb_local_.open.ix = FFESTP_openixASSOCIATEVARIABLE; | |
14247 | ffestb_local_.open.left = TRUE; | |
14248 | ffestb_local_.open.context = FFEEXPR_contextFILEASSOC; | |
14249 | break; | |
14250 | ||
14251 | case FFESTR_openBLANK: | |
14252 | ffestb_local_.open.ix = FFESTP_openixBLANK; | |
14253 | ffestb_local_.open.left = FALSE; | |
14254 | ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR; | |
14255 | break; | |
14256 | ||
14257 | case FFESTR_openBLOCKSIZE: | |
14258 | ffestb_local_.open.ix = FFESTP_openixBLOCKSIZE; | |
14259 | ffestb_local_.open.left = FALSE; | |
14260 | ffestb_local_.open.context = FFEEXPR_contextFILENUM; | |
14261 | break; | |
14262 | ||
14263 | case FFESTR_openBUFFERCOUNT: | |
14264 | ffestb_local_.open.ix = FFESTP_openixBUFFERCOUNT; | |
14265 | ffestb_local_.open.left = FALSE; | |
14266 | ffestb_local_.open.context = FFEEXPR_contextFILENUM; | |
14267 | break; | |
14268 | ||
14269 | case FFESTR_openCARRIAGECONTROL: | |
14270 | ffestb_local_.open.ix = FFESTP_openixCARRIAGECONTROL; | |
14271 | ffestb_local_.open.left = FALSE; | |
14272 | ffestb_local_.open.context = FFEEXPR_contextFILECHAR; | |
14273 | break; | |
14274 | ||
14275 | case FFESTR_openDEFAULTFILE: | |
14276 | ffestb_local_.open.ix = FFESTP_openixDEFAULTFILE; | |
14277 | ffestb_local_.open.left = FALSE; | |
14278 | ffestb_local_.open.context = FFEEXPR_contextFILECHAR; | |
14279 | break; | |
14280 | ||
14281 | case FFESTR_openDELIM: | |
14282 | ffestb_local_.open.ix = FFESTP_openixDELIM; | |
14283 | ffestb_local_.open.left = FALSE; | |
14284 | ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR; | |
14285 | break; | |
14286 | ||
14287 | case FFESTR_openDISP: | |
14288 | case FFESTR_openDISPOSE: | |
14289 | ffestb_local_.open.ix = FFESTP_openixDISPOSE; | |
14290 | ffestb_local_.open.left = FALSE; | |
14291 | ffestb_local_.open.context = FFEEXPR_contextFILECHAR; | |
14292 | break; | |
14293 | ||
14294 | case FFESTR_openERR: | |
14295 | ffestb_local_.open.ix = FFESTP_openixERR; | |
14296 | ffestb_local_.open.label = TRUE; | |
14297 | break; | |
14298 | ||
14299 | case FFESTR_openEXTENDSIZE: | |
14300 | ffestb_local_.open.ix = FFESTP_openixEXTENDSIZE; | |
14301 | ffestb_local_.open.left = FALSE; | |
14302 | ffestb_local_.open.context = FFEEXPR_contextFILENUM; | |
14303 | break; | |
14304 | ||
14305 | case FFESTR_openFILE: | |
14306 | case FFESTR_openNAME: | |
14307 | ffestb_local_.open.ix = FFESTP_openixFILE; | |
14308 | ffestb_local_.open.left = FALSE; | |
14309 | ffestb_local_.open.context = FFEEXPR_contextFILECHAR; | |
14310 | break; | |
14311 | ||
14312 | case FFESTR_openFORM: | |
14313 | ffestb_local_.open.ix = FFESTP_openixFORM; | |
14314 | ffestb_local_.open.left = FALSE; | |
14315 | ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR; | |
14316 | break; | |
14317 | ||
14318 | case FFESTR_openINITIALSIZE: | |
14319 | ffestb_local_.open.ix = FFESTP_openixINITIALSIZE; | |
14320 | ffestb_local_.open.left = FALSE; | |
14321 | ffestb_local_.open.context = FFEEXPR_contextFILENUM; | |
14322 | break; | |
14323 | ||
14324 | case FFESTR_openIOSTAT: | |
14325 | ffestb_local_.open.ix = FFESTP_openixIOSTAT; | |
14326 | ffestb_local_.open.left = TRUE; | |
14327 | ffestb_local_.open.context = FFEEXPR_contextFILEINT; | |
14328 | break; | |
14329 | ||
14330 | #if 0 /* Haven't added support for expression | |
14331 | context yet (though easy). */ | |
14332 | case FFESTR_openKEY: | |
14333 | ffestb_local_.open.ix = FFESTP_openixKEY; | |
14334 | ffestb_local_.open.left = FALSE; | |
14335 | ffestb_local_.open.context = FFEEXPR_contextFILEKEY; | |
14336 | break; | |
14337 | #endif | |
14338 | ||
14339 | case FFESTR_openMAXREC: | |
14340 | ffestb_local_.open.ix = FFESTP_openixMAXREC; | |
14341 | ffestb_local_.open.left = FALSE; | |
14342 | ffestb_local_.open.context = FFEEXPR_contextFILENUM; | |
14343 | break; | |
14344 | ||
14345 | case FFESTR_openNOSPANBLOCKS: | |
14346 | if (ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS] | |
14347 | .kw_or_val_present) | |
14348 | goto bad; /* :::::::::::::::::::: */ | |
14349 | ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS] | |
14350 | .kw_or_val_present = TRUE; | |
14351 | ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS] | |
14352 | .kw_present = TRUE; | |
14353 | ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS] | |
14354 | .value_present = FALSE; | |
14355 | ffestp_file.open.open_spec[FFESTP_openixNOSPANBLOCKS].kw | |
14356 | = ffelex_token_use (t); | |
14357 | return (ffelexHandler) ffestb_R9048_; | |
14358 | ||
14359 | case FFESTR_openORGANIZATION: | |
14360 | ffestb_local_.open.ix = FFESTP_openixORGANIZATION; | |
14361 | ffestb_local_.open.left = FALSE; | |
14362 | ffestb_local_.open.context = FFEEXPR_contextFILECHAR; | |
14363 | break; | |
14364 | ||
14365 | case FFESTR_openPAD: | |
14366 | ffestb_local_.open.ix = FFESTP_openixPAD; | |
14367 | ffestb_local_.open.left = FALSE; | |
14368 | ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR; | |
14369 | break; | |
14370 | ||
14371 | case FFESTR_openPOSITION: | |
14372 | ffestb_local_.open.ix = FFESTP_openixPOSITION; | |
14373 | ffestb_local_.open.left = FALSE; | |
14374 | ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR; | |
14375 | break; | |
14376 | ||
14377 | case FFESTR_openREADONLY: | |
14378 | if (ffestp_file.open.open_spec[FFESTP_openixREADONLY] | |
14379 | .kw_or_val_present) | |
14380 | goto bad; /* :::::::::::::::::::: */ | |
14381 | ffestp_file.open.open_spec[FFESTP_openixREADONLY] | |
14382 | .kw_or_val_present = TRUE; | |
14383 | ffestp_file.open.open_spec[FFESTP_openixREADONLY] | |
14384 | .kw_present = TRUE; | |
14385 | ffestp_file.open.open_spec[FFESTP_openixREADONLY] | |
14386 | .value_present = FALSE; | |
14387 | ffestp_file.open.open_spec[FFESTP_openixREADONLY].kw | |
14388 | = ffelex_token_use (t); | |
14389 | return (ffelexHandler) ffestb_R9048_; | |
14390 | ||
14391 | case FFESTR_openRECL: | |
14392 | case FFESTR_openRECORDSIZE: | |
14393 | ffestb_local_.open.ix = FFESTP_openixRECL; | |
14394 | ffestb_local_.open.left = FALSE; | |
14395 | ffestb_local_.open.context = FFEEXPR_contextFILENUM; | |
14396 | break; | |
14397 | ||
14398 | case FFESTR_openRECORDTYPE: | |
14399 | ffestb_local_.open.ix = FFESTP_openixRECORDTYPE; | |
14400 | ffestb_local_.open.left = FALSE; | |
14401 | ffestb_local_.open.context = FFEEXPR_contextFILECHAR; | |
14402 | break; | |
14403 | ||
14404 | case FFESTR_openSHARED: | |
14405 | if (ffestp_file.open.open_spec[FFESTP_openixSHARED] | |
14406 | .kw_or_val_present) | |
14407 | goto bad; /* :::::::::::::::::::: */ | |
14408 | ffestp_file.open.open_spec[FFESTP_openixSHARED] | |
14409 | .kw_or_val_present = TRUE; | |
14410 | ffestp_file.open.open_spec[FFESTP_openixSHARED] | |
14411 | .kw_present = TRUE; | |
14412 | ffestp_file.open.open_spec[FFESTP_openixSHARED] | |
14413 | .value_present = FALSE; | |
14414 | ffestp_file.open.open_spec[FFESTP_openixSHARED].kw | |
14415 | = ffelex_token_use (t); | |
14416 | return (ffelexHandler) ffestb_R9048_; | |
14417 | ||
14418 | case FFESTR_openSTATUS: | |
14419 | case FFESTR_openTYPE: | |
14420 | ffestb_local_.open.ix = FFESTP_openixSTATUS; | |
14421 | ffestb_local_.open.left = FALSE; | |
14422 | ffestb_local_.open.context = FFEEXPR_contextFILEDFCHAR; | |
14423 | break; | |
14424 | ||
14425 | case FFESTR_openUNIT: | |
14426 | ffestb_local_.open.ix = FFESTP_openixUNIT; | |
14427 | ffestb_local_.open.left = FALSE; | |
14428 | ffestb_local_.open.context = FFEEXPR_contextFILENUM; | |
14429 | break; | |
14430 | ||
14431 | case FFESTR_openUSEROPEN: | |
14432 | ffestb_local_.open.ix = FFESTP_openixUSEROPEN; | |
14433 | ffestb_local_.open.left = TRUE; | |
14434 | ffestb_local_.open.context = FFEEXPR_contextFILEEXTFUNC; | |
14435 | break; | |
14436 | ||
14437 | default: | |
14438 | goto bad; /* :::::::::::::::::::: */ | |
14439 | } | |
14440 | if (ffestp_file.open.open_spec[ffestb_local_.open.ix] | |
14441 | .kw_or_val_present) | |
14442 | break; /* Can't specify a keyword twice! */ | |
14443 | ffestp_file.open.open_spec[ffestb_local_.open.ix] | |
14444 | .kw_or_val_present = TRUE; | |
14445 | ffestp_file.open.open_spec[ffestb_local_.open.ix] | |
14446 | .kw_present = TRUE; | |
14447 | ffestp_file.open.open_spec[ffestb_local_.open.ix] | |
14448 | .value_present = FALSE; | |
14449 | ffestp_file.open.open_spec[ffestb_local_.open.ix].value_is_label | |
14450 | = ffestb_local_.open.label; | |
14451 | ffestp_file.open.open_spec[ffestb_local_.open.ix].kw | |
14452 | = ffelex_token_use (t); | |
14453 | return (ffelexHandler) ffestb_R9045_; | |
14454 | ||
14455 | default: | |
14456 | break; | |
14457 | } | |
14458 | ||
14459 | bad: /* :::::::::::::::::::: */ | |
14460 | ffestb_subr_kill_open_ (); | |
14461 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t); | |
14462 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14463 | } | |
14464 | ||
14465 | /* ffestb_R9045_ -- "OPEN" OPEN_PAREN [external-file-unit COMMA] NAME | |
14466 | ||
14467 | return ffestb_R9045_; // to lexer | |
14468 | ||
14469 | Make sure EQUALS here, send next token to expression handler. */ | |
14470 | ||
14471 | static ffelexHandler | |
14472 | ffestb_R9045_ (ffelexToken t) | |
14473 | { | |
14474 | switch (ffelex_token_type (t)) | |
14475 | { | |
14476 | case FFELEX_typeEQUALS: | |
14477 | ffesta_confirmed (); | |
14478 | if (ffestb_local_.open.label) | |
14479 | return (ffelexHandler) ffestb_R9047_; | |
14480 | if (ffestb_local_.open.left) | |
14481 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
14482 | ffestb_local_.open.context, | |
14483 | (ffeexprCallback) ffestb_R9046_); | |
14484 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
14485 | ffestb_local_.open.context, | |
14486 | (ffeexprCallback) ffestb_R9046_); | |
14487 | ||
14488 | default: | |
14489 | break; | |
14490 | } | |
14491 | ||
14492 | ffestb_subr_kill_open_ (); | |
14493 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t); | |
14494 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14495 | } | |
14496 | ||
14497 | /* ffestb_R9046_ -- "OPEN" OPEN_PAREN ... NAME EQUALS expr | |
14498 | ||
14499 | (ffestb_R9046_) // to expression handler | |
14500 | ||
14501 | Handle COMMA or CLOSE_PAREN here. */ | |
14502 | ||
14503 | static ffelexHandler | |
14504 | ffestb_R9046_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
14505 | { | |
14506 | switch (ffelex_token_type (t)) | |
14507 | { | |
14508 | case FFELEX_typeCOMMA: | |
14509 | case FFELEX_typeCLOSE_PAREN: | |
14510 | if (expr == NULL) | |
14511 | break; | |
14512 | ffestp_file.open.open_spec[ffestb_local_.open.ix].value_present | |
14513 | = TRUE; | |
14514 | ffestp_file.open.open_spec[ffestb_local_.open.ix].value | |
14515 | = ffelex_token_use (ft); | |
14516 | ffestp_file.open.open_spec[ffestb_local_.open.ix].u.expr = expr; | |
14517 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
14518 | return (ffelexHandler) ffestb_R9044_; | |
14519 | return (ffelexHandler) ffestb_R9049_; | |
14520 | ||
14521 | default: | |
14522 | break; | |
14523 | } | |
14524 | ||
14525 | ffestb_subr_kill_open_ (); | |
14526 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t); | |
14527 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14528 | } | |
14529 | ||
14530 | /* ffestb_R9047_ -- "OPEN" OPEN_PAREN ... NAME EQUALS | |
14531 | ||
14532 | return ffestb_R9047_; // to lexer | |
14533 | ||
14534 | Handle NUMBER for label here. */ | |
14535 | ||
14536 | static ffelexHandler | |
14537 | ffestb_R9047_ (ffelexToken t) | |
14538 | { | |
14539 | switch (ffelex_token_type (t)) | |
14540 | { | |
14541 | case FFELEX_typeNUMBER: | |
14542 | ffestp_file.open.open_spec[ffestb_local_.open.ix].value_present | |
14543 | = TRUE; | |
14544 | ffestp_file.open.open_spec[ffestb_local_.open.ix].value | |
14545 | = ffelex_token_use (t); | |
14546 | return (ffelexHandler) ffestb_R9048_; | |
14547 | ||
14548 | default: | |
14549 | break; | |
14550 | } | |
14551 | ||
14552 | ffestb_subr_kill_open_ (); | |
14553 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t); | |
14554 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14555 | } | |
14556 | ||
14557 | /* ffestb_R9048_ -- "OPEN" OPEN_PAREN ... NAME EQUALS NUMBER | |
14558 | ||
14559 | return ffestb_R9048_; // to lexer | |
14560 | ||
14561 | Handle COMMA or CLOSE_PAREN here. */ | |
14562 | ||
14563 | static ffelexHandler | |
14564 | ffestb_R9048_ (ffelexToken t) | |
14565 | { | |
14566 | switch (ffelex_token_type (t)) | |
14567 | { | |
14568 | case FFELEX_typeCOMMA: | |
14569 | return (ffelexHandler) ffestb_R9044_; | |
14570 | ||
14571 | case FFELEX_typeCLOSE_PAREN: | |
14572 | return (ffelexHandler) ffestb_R9049_; | |
14573 | ||
14574 | default: | |
14575 | break; | |
14576 | } | |
14577 | ||
14578 | ffestb_subr_kill_open_ (); | |
14579 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t); | |
14580 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14581 | } | |
14582 | ||
14583 | /* ffestb_R9049_ -- "OPEN" OPEN_PAREN ... CLOSE_PAREN | |
14584 | ||
14585 | return ffestb_R9049_; // to lexer | |
14586 | ||
14587 | Handle EOS or SEMICOLON here. */ | |
14588 | ||
14589 | static ffelexHandler | |
14590 | ffestb_R9049_ (ffelexToken t) | |
14591 | { | |
14592 | switch (ffelex_token_type (t)) | |
14593 | { | |
14594 | case FFELEX_typeEOS: | |
14595 | case FFELEX_typeSEMICOLON: | |
14596 | ffesta_confirmed (); | |
14597 | if (!ffesta_is_inhibited ()) | |
14598 | ffestc_R904 (); | |
14599 | ffestb_subr_kill_open_ (); | |
14600 | return (ffelexHandler) ffesta_zero (t); | |
14601 | ||
14602 | default: | |
14603 | break; | |
14604 | } | |
14605 | ||
14606 | ffestb_subr_kill_open_ (); | |
14607 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "OPEN", t); | |
14608 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14609 | } | |
14610 | ||
14611 | /* ffestb_R907 -- Parse a CLOSE statement | |
14612 | ||
14613 | return ffestb_R907; // to lexer | |
14614 | ||
14615 | Make sure the statement has a valid form for a CLOSE statement. | |
14616 | If it does, implement the statement. */ | |
14617 | ||
14618 | ffelexHandler | |
14619 | ffestb_R907 (ffelexToken t) | |
14620 | { | |
14621 | ffestpCloseIx ix; | |
14622 | ||
14623 | switch (ffelex_token_type (ffesta_tokens[0])) | |
14624 | { | |
14625 | case FFELEX_typeNAME: | |
14626 | if (ffesta_first_kw != FFESTR_firstCLOSE) | |
14627 | goto bad_0; /* :::::::::::::::::::: */ | |
14628 | break; | |
14629 | ||
14630 | case FFELEX_typeNAMES: | |
14631 | if (ffesta_first_kw != FFESTR_firstCLOSE) | |
14632 | goto bad_0; /* :::::::::::::::::::: */ | |
14633 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlCLOSE) | |
14634 | goto bad_0; /* :::::::::::::::::::: */ | |
14635 | break; | |
14636 | ||
14637 | default: | |
14638 | goto bad_0; /* :::::::::::::::::::: */ | |
14639 | } | |
14640 | ||
14641 | switch (ffelex_token_type (t)) | |
14642 | { | |
14643 | case FFELEX_typeOPEN_PAREN: | |
14644 | break; | |
14645 | ||
14646 | case FFELEX_typeEOS: | |
14647 | case FFELEX_typeSEMICOLON: | |
14648 | case FFELEX_typeCOMMA: | |
14649 | case FFELEX_typeCOLONCOLON: | |
14650 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
14651 | goto bad_1; /* :::::::::::::::::::: */ | |
14652 | ||
14653 | default: | |
14654 | goto bad_1; /* :::::::::::::::::::: */ | |
14655 | } | |
14656 | ||
14657 | for (ix = 0; ix < FFESTP_closeix; ++ix) | |
14658 | ffestp_file.close.close_spec[ix].kw_or_val_present = FALSE; | |
14659 | ||
14660 | return (ffelexHandler) ffestb_R9071_; | |
14661 | ||
14662 | bad_0: /* :::::::::::::::::::: */ | |
14663 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", ffesta_tokens[0]); | |
14664 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14665 | ||
14666 | bad_1: /* :::::::::::::::::::: */ | |
14667 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t); | |
14668 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
14669 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
14670 | } | |
14671 | ||
14672 | /* ffestb_R9071_ -- "CLOSE" OPEN_PAREN | |
14673 | ||
14674 | return ffestb_R9071_; // to lexer | |
14675 | ||
14676 | Handle expr construct (not NAME=expr construct) here. */ | |
14677 | ||
14678 | static ffelexHandler | |
14679 | ffestb_R9071_ (ffelexToken t) | |
14680 | { | |
14681 | switch (ffelex_token_type (t)) | |
14682 | { | |
14683 | case FFELEX_typeNAME: | |
14684 | ffesta_tokens[1] = ffelex_token_use (t); | |
14685 | return (ffelexHandler) ffestb_R9072_; | |
14686 | ||
14687 | default: | |
14688 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
14689 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9073_))) | |
14690 | (t); | |
14691 | } | |
14692 | } | |
14693 | ||
14694 | /* ffestb_R9072_ -- "CLOSE" OPEN_PAREN NAME | |
14695 | ||
14696 | return ffestb_R9072_; // to lexer | |
14697 | ||
14698 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
14699 | token thru expression handler. */ | |
14700 | ||
14701 | static ffelexHandler | |
14702 | ffestb_R9072_ (ffelexToken t) | |
14703 | { | |
14704 | ffelexHandler next; | |
14705 | ffelexToken nt; | |
14706 | ||
14707 | switch (ffelex_token_type (t)) | |
14708 | { | |
14709 | case FFELEX_typeEQUALS: | |
14710 | nt = ffesta_tokens[1]; | |
14711 | next = (ffelexHandler) ffestb_R9074_ (nt); | |
14712 | ffelex_token_kill (nt); | |
14713 | return (ffelexHandler) (*next) (t); | |
14714 | ||
14715 | default: | |
14716 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
14717 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9073_))) | |
14718 | (ffesta_tokens[1]); | |
14719 | ffelex_token_kill (ffesta_tokens[1]); | |
14720 | return (ffelexHandler) (*next) (t); | |
14721 | } | |
14722 | } | |
14723 | ||
14724 | /* ffestb_R9073_ -- "CLOSE" OPEN_PAREN expr | |
14725 | ||
14726 | (ffestb_R9073_) // to expression handler | |
14727 | ||
14728 | Handle COMMA or CLOSE_PAREN here. */ | |
14729 | ||
14730 | static ffelexHandler | |
14731 | ffestb_R9073_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
14732 | { | |
14733 | switch (ffelex_token_type (t)) | |
14734 | { | |
14735 | case FFELEX_typeCOMMA: | |
14736 | case FFELEX_typeCLOSE_PAREN: | |
14737 | if (expr == NULL) | |
14738 | break; | |
14739 | ffestp_file.close.close_spec[FFESTP_closeixUNIT].kw_or_val_present | |
14740 | = TRUE; | |
14741 | ffestp_file.close.close_spec[FFESTP_closeixUNIT].kw_present = FALSE; | |
14742 | ffestp_file.close.close_spec[FFESTP_closeixUNIT].value_present = TRUE; | |
14743 | ffestp_file.close.close_spec[FFESTP_closeixUNIT].value_is_label | |
14744 | = FALSE; | |
14745 | ffestp_file.close.close_spec[FFESTP_closeixUNIT].value | |
14746 | = ffelex_token_use (ft); | |
14747 | ffestp_file.close.close_spec[FFESTP_closeixUNIT].u.expr = expr; | |
14748 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
14749 | return (ffelexHandler) ffestb_R9074_; | |
14750 | return (ffelexHandler) ffestb_R9079_; | |
14751 | ||
14752 | default: | |
14753 | break; | |
14754 | } | |
14755 | ||
14756 | ffestb_subr_kill_close_ (); | |
14757 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t); | |
14758 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14759 | } | |
14760 | ||
14761 | /* ffestb_R9074_ -- "CLOSE" OPEN_PAREN [external-file-unit COMMA] | |
14762 | ||
14763 | return ffestb_R9074_; // to lexer | |
14764 | ||
14765 | Handle expr construct (not NAME=expr construct) here. */ | |
14766 | ||
14767 | static ffelexHandler | |
14768 | ffestb_R9074_ (ffelexToken t) | |
14769 | { | |
14770 | ffestrGenio kw; | |
14771 | ||
14772 | ffestb_local_.close.label = FALSE; | |
14773 | ||
14774 | switch (ffelex_token_type (t)) | |
14775 | { | |
14776 | case FFELEX_typeNAME: | |
14777 | kw = ffestr_genio (t); | |
14778 | switch (kw) | |
14779 | { | |
14780 | case FFESTR_genioERR: | |
14781 | ffestb_local_.close.ix = FFESTP_closeixERR; | |
14782 | ffestb_local_.close.label = TRUE; | |
14783 | break; | |
14784 | ||
14785 | case FFESTR_genioIOSTAT: | |
14786 | ffestb_local_.close.ix = FFESTP_closeixIOSTAT; | |
14787 | ffestb_local_.close.left = TRUE; | |
14788 | ffestb_local_.close.context = FFEEXPR_contextFILEINT; | |
14789 | break; | |
14790 | ||
14791 | case FFESTR_genioSTATUS: | |
14792 | case FFESTR_genioDISP: | |
14793 | case FFESTR_genioDISPOSE: | |
14794 | ffestb_local_.close.ix = FFESTP_closeixSTATUS; | |
14795 | ffestb_local_.close.left = FALSE; | |
14796 | ffestb_local_.close.context = FFEEXPR_contextFILEDFCHAR; | |
14797 | break; | |
14798 | ||
14799 | case FFESTR_genioUNIT: | |
14800 | ffestb_local_.close.ix = FFESTP_closeixUNIT; | |
14801 | ffestb_local_.close.left = FALSE; | |
14802 | ffestb_local_.close.context = FFEEXPR_contextFILENUM; | |
14803 | break; | |
14804 | ||
14805 | default: | |
14806 | goto bad; /* :::::::::::::::::::: */ | |
14807 | } | |
14808 | if (ffestp_file.close.close_spec[ffestb_local_.close.ix] | |
14809 | .kw_or_val_present) | |
14810 | break; /* Can't specify a keyword twice! */ | |
14811 | ffestp_file.close.close_spec[ffestb_local_.close.ix] | |
14812 | .kw_or_val_present = TRUE; | |
14813 | ffestp_file.close.close_spec[ffestb_local_.close.ix] | |
14814 | .kw_present = TRUE; | |
14815 | ffestp_file.close.close_spec[ffestb_local_.close.ix] | |
14816 | .value_present = FALSE; | |
14817 | ffestp_file.close.close_spec[ffestb_local_.close.ix].value_is_label | |
14818 | = ffestb_local_.close.label; | |
14819 | ffestp_file.close.close_spec[ffestb_local_.close.ix].kw | |
14820 | = ffelex_token_use (t); | |
14821 | return (ffelexHandler) ffestb_R9075_; | |
14822 | ||
14823 | default: | |
14824 | break; | |
14825 | } | |
14826 | ||
14827 | bad: /* :::::::::::::::::::: */ | |
14828 | ffestb_subr_kill_close_ (); | |
14829 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t); | |
14830 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14831 | } | |
14832 | ||
14833 | /* ffestb_R9075_ -- "CLOSE" OPEN_PAREN [external-file-unit COMMA] NAME | |
14834 | ||
14835 | return ffestb_R9075_; // to lexer | |
14836 | ||
14837 | Make sure EQUALS here, send next token to expression handler. */ | |
14838 | ||
14839 | static ffelexHandler | |
14840 | ffestb_R9075_ (ffelexToken t) | |
14841 | { | |
14842 | switch (ffelex_token_type (t)) | |
14843 | { | |
14844 | case FFELEX_typeEQUALS: | |
14845 | ffesta_confirmed (); | |
14846 | if (ffestb_local_.close.label) | |
14847 | return (ffelexHandler) ffestb_R9077_; | |
14848 | if (ffestb_local_.close.left) | |
14849 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
14850 | ffestb_local_.close.context, | |
14851 | (ffeexprCallback) ffestb_R9076_); | |
14852 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
14853 | ffestb_local_.close.context, | |
14854 | (ffeexprCallback) ffestb_R9076_); | |
14855 | ||
14856 | default: | |
14857 | break; | |
14858 | } | |
14859 | ||
14860 | ffestb_subr_kill_close_ (); | |
14861 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t); | |
14862 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14863 | } | |
14864 | ||
14865 | /* ffestb_R9076_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS expr | |
14866 | ||
14867 | (ffestb_R9076_) // to expression handler | |
14868 | ||
14869 | Handle COMMA or CLOSE_PAREN here. */ | |
14870 | ||
14871 | static ffelexHandler | |
14872 | ffestb_R9076_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
14873 | { | |
14874 | switch (ffelex_token_type (t)) | |
14875 | { | |
14876 | case FFELEX_typeCOMMA: | |
14877 | case FFELEX_typeCLOSE_PAREN: | |
14878 | if (expr == NULL) | |
14879 | break; | |
14880 | ffestp_file.close.close_spec[ffestb_local_.close.ix].value_present | |
14881 | = TRUE; | |
14882 | ffestp_file.close.close_spec[ffestb_local_.close.ix].value | |
14883 | = ffelex_token_use (ft); | |
14884 | ffestp_file.close.close_spec[ffestb_local_.close.ix].u.expr = expr; | |
14885 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
14886 | return (ffelexHandler) ffestb_R9074_; | |
14887 | return (ffelexHandler) ffestb_R9079_; | |
14888 | ||
14889 | default: | |
14890 | break; | |
14891 | } | |
14892 | ||
14893 | ffestb_subr_kill_close_ (); | |
14894 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t); | |
14895 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14896 | } | |
14897 | ||
14898 | /* ffestb_R9077_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS | |
14899 | ||
14900 | return ffestb_R9077_; // to lexer | |
14901 | ||
14902 | Handle NUMBER for label here. */ | |
14903 | ||
14904 | static ffelexHandler | |
14905 | ffestb_R9077_ (ffelexToken t) | |
14906 | { | |
14907 | switch (ffelex_token_type (t)) | |
14908 | { | |
14909 | case FFELEX_typeNUMBER: | |
14910 | ffestp_file.close.close_spec[ffestb_local_.close.ix].value_present | |
14911 | = TRUE; | |
14912 | ffestp_file.close.close_spec[ffestb_local_.close.ix].value | |
14913 | = ffelex_token_use (t); | |
14914 | return (ffelexHandler) ffestb_R9078_; | |
14915 | ||
14916 | default: | |
14917 | break; | |
14918 | } | |
14919 | ||
14920 | ffestb_subr_kill_close_ (); | |
14921 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t); | |
14922 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14923 | } | |
14924 | ||
14925 | /* ffestb_R9078_ -- "CLOSE" OPEN_PAREN ... NAME EQUALS NUMBER | |
14926 | ||
14927 | return ffestb_R9078_; // to lexer | |
14928 | ||
14929 | Handle COMMA or CLOSE_PAREN here. */ | |
14930 | ||
14931 | static ffelexHandler | |
14932 | ffestb_R9078_ (ffelexToken t) | |
14933 | { | |
14934 | switch (ffelex_token_type (t)) | |
14935 | { | |
14936 | case FFELEX_typeCOMMA: | |
14937 | return (ffelexHandler) ffestb_R9074_; | |
14938 | ||
14939 | case FFELEX_typeCLOSE_PAREN: | |
14940 | return (ffelexHandler) ffestb_R9079_; | |
14941 | ||
14942 | default: | |
14943 | break; | |
14944 | } | |
14945 | ||
14946 | ffestb_subr_kill_close_ (); | |
14947 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t); | |
14948 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14949 | } | |
14950 | ||
14951 | /* ffestb_R9079_ -- "CLOSE" OPEN_PAREN ... CLOSE_PAREN | |
14952 | ||
14953 | return ffestb_R9079_; // to lexer | |
14954 | ||
14955 | Handle EOS or SEMICOLON here. */ | |
14956 | ||
14957 | static ffelexHandler | |
14958 | ffestb_R9079_ (ffelexToken t) | |
14959 | { | |
14960 | switch (ffelex_token_type (t)) | |
14961 | { | |
14962 | case FFELEX_typeEOS: | |
14963 | case FFELEX_typeSEMICOLON: | |
14964 | ffesta_confirmed (); | |
14965 | if (!ffesta_is_inhibited ()) | |
14966 | ffestc_R907 (); | |
14967 | ffestb_subr_kill_close_ (); | |
14968 | return (ffelexHandler) ffesta_zero (t); | |
14969 | ||
14970 | default: | |
14971 | break; | |
14972 | } | |
14973 | ||
14974 | ffestb_subr_kill_close_ (); | |
14975 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "CLOSE", t); | |
14976 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
14977 | } | |
14978 | ||
14979 | /* ffestb_R909 -- Parse the READ statement | |
14980 | ||
14981 | return ffestb_R909; // to lexer | |
14982 | ||
14983 | Make sure the statement has a valid form for the READ | |
14984 | statement. If it does, implement the statement. */ | |
14985 | ||
14986 | ffelexHandler | |
14987 | ffestb_R909 (ffelexToken t) | |
14988 | { | |
14989 | ffelexHandler next; | |
14990 | ffestpReadIx ix; | |
14991 | ||
14992 | switch (ffelex_token_type (ffesta_tokens[0])) | |
14993 | { | |
14994 | case FFELEX_typeNAME: | |
14995 | if (ffesta_first_kw != FFESTR_firstREAD) | |
14996 | goto bad_0; /* :::::::::::::::::::: */ | |
14997 | switch (ffelex_token_type (t)) | |
14998 | { | |
14999 | case FFELEX_typeCOMMA: | |
15000 | case FFELEX_typeCOLONCOLON: | |
15001 | case FFELEX_typeEOS: | |
15002 | case FFELEX_typeSEMICOLON: | |
15003 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
15004 | goto bad_1; /* :::::::::::::::::::: */ | |
15005 | ||
15006 | case FFELEX_typeEQUALS: | |
15007 | case FFELEX_typePOINTS: | |
15008 | case FFELEX_typeCOLON: | |
15009 | goto bad_1; /* :::::::::::::::::::: */ | |
15010 | ||
15011 | case FFELEX_typeNAME: | |
15012 | case FFELEX_typeNUMBER: | |
15013 | ffesta_confirmed (); | |
15014 | break; | |
15015 | ||
15016 | case FFELEX_typeOPEN_PAREN: | |
15017 | for (ix = 0; ix < FFESTP_readix; ++ix) | |
15018 | ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE; | |
15019 | ffesta_tokens[1] = ffelex_token_use (t); | |
15020 | return (ffelexHandler) ffestb_R9092_; | |
15021 | ||
15022 | default: | |
15023 | break; | |
15024 | } | |
15025 | ||
15026 | for (ix = 0; ix < FFESTP_readix; ++ix) | |
15027 | ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE; | |
15028 | return (ffelexHandler) (*((ffelexHandler) | |
15029 | ffeexpr_rhs (ffesta_output_pool, | |
15030 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9091_))) | |
15031 | (t); | |
15032 | ||
15033 | case FFELEX_typeNAMES: | |
15034 | if (ffesta_first_kw != FFESTR_firstREAD) | |
15035 | goto bad_0; /* :::::::::::::::::::: */ | |
15036 | switch (ffelex_token_type (t)) | |
15037 | { | |
15038 | case FFELEX_typeEOS: | |
15039 | case FFELEX_typeSEMICOLON: | |
15040 | case FFELEX_typeCOMMA: | |
15041 | ffesta_confirmed (); | |
15042 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREAD) | |
15043 | break; | |
15044 | goto bad_1; /* :::::::::::::::::::: */ | |
15045 | ||
15046 | case FFELEX_typeCOLONCOLON: | |
15047 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
15048 | goto bad_1; /* :::::::::::::::::::: */ | |
15049 | ||
15050 | case FFELEX_typeEQUALS: | |
15051 | case FFELEX_typePOINTS: | |
15052 | case FFELEX_typeCOLON: | |
15053 | goto bad_1; /* :::::::::::::::::::: */ | |
15054 | ||
15055 | case FFELEX_typeOPEN_PAREN: | |
15056 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREAD) | |
15057 | break; | |
15058 | ||
15059 | for (ix = 0; ix < FFESTP_readix; ++ix) | |
15060 | ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE; | |
15061 | ffesta_tokens[1] = ffelex_token_use (t); | |
15062 | return (ffelexHandler) ffestb_R9092_; | |
15063 | ||
15064 | default: | |
15065 | break; | |
15066 | } | |
15067 | for (ix = 0; ix < FFESTP_readix; ++ix) | |
15068 | ffestp_file.read.read_spec[ix].kw_or_val_present = FALSE; | |
15069 | next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15070 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9091_); | |
15071 | next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0], | |
15072 | FFESTR_firstlREAD); | |
15073 | if (next == NULL) | |
15074 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
15075 | (ffelexHandler) ffesta_zero); | |
15076 | return (ffelexHandler) (*next) (t); | |
15077 | ||
15078 | default: | |
15079 | goto bad_0; /* :::::::::::::::::::: */ | |
15080 | } | |
15081 | ||
15082 | bad_0: /* :::::::::::::::::::: */ | |
15083 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", ffesta_tokens[0]); | |
15084 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15085 | ||
15086 | bad_1: /* :::::::::::::::::::: */ | |
15087 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15088 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
15089 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
15090 | } | |
15091 | ||
15092 | /* ffestb_R9091_ -- "READ" expr | |
15093 | ||
15094 | (ffestb_R9091_) // to expression handler | |
15095 | ||
15096 | Make sure the next token is a COMMA or EOS/SEMICOLON. */ | |
15097 | ||
15098 | static ffelexHandler | |
15099 | ffestb_R9091_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
15100 | { | |
15101 | switch (ffelex_token_type (t)) | |
15102 | { | |
15103 | case FFELEX_typeEOS: | |
15104 | case FFELEX_typeSEMICOLON: | |
15105 | case FFELEX_typeCOMMA: | |
15106 | ffesta_confirmed (); | |
15107 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present | |
15108 | = TRUE; | |
15109 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE; | |
15110 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE; | |
15111 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label | |
15112 | = (expr == NULL); | |
15113 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value | |
15114 | = ffelex_token_use (ft); | |
15115 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr; | |
15116 | if (!ffesta_is_inhibited ()) | |
15117 | ffestc_R909_start (TRUE); | |
15118 | ffestb_subr_kill_read_ (); | |
15119 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
15120 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
15121 | ffestc_context_iolist (), | |
15122 | (ffeexprCallback) ffestb_R90915_); | |
15123 | if (!ffesta_is_inhibited ()) | |
15124 | ffestc_R909_finish (); | |
15125 | return (ffelexHandler) ffesta_zero (t); | |
15126 | ||
15127 | default: | |
15128 | break; | |
15129 | } | |
15130 | ||
15131 | ffestb_subr_kill_read_ (); | |
15132 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15133 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15134 | } | |
15135 | ||
15136 | /* ffestb_R9092_ -- "READ" OPEN_PAREN | |
15137 | ||
15138 | return ffestb_R9092_; // to lexer | |
15139 | ||
15140 | Handle expr construct (not NAME=expr construct) here. */ | |
15141 | ||
15142 | static ffelexHandler | |
15143 | ffestb_R9092_ (ffelexToken t) | |
15144 | { | |
15145 | ffelexToken nt; | |
15146 | ffelexHandler next; | |
15147 | ||
15148 | switch (ffelex_token_type (t)) | |
15149 | { | |
15150 | case FFELEX_typeNAME: | |
15151 | ffesta_tokens[2] = ffelex_token_use (t); | |
15152 | return (ffelexHandler) ffestb_R9093_; | |
15153 | ||
15154 | default: | |
15155 | nt = ffesta_tokens[1]; | |
15156 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15157 | FFEEXPR_contextFILEUNITAMBIG, (ffeexprCallback) ffestb_R9094_))) | |
15158 | (nt); | |
15159 | ffelex_token_kill (nt); | |
15160 | return (ffelexHandler) (*next) (t); | |
15161 | } | |
15162 | } | |
15163 | ||
15164 | /* ffestb_R9093_ -- "READ" OPEN_PAREN NAME | |
15165 | ||
15166 | return ffestb_R9093_; // to lexer | |
15167 | ||
15168 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
15169 | token thru expression handler. */ | |
15170 | ||
15171 | static ffelexHandler | |
15172 | ffestb_R9093_ (ffelexToken t) | |
15173 | { | |
15174 | ffelexHandler next; | |
15175 | ffelexToken nt; | |
15176 | ffelexToken ot; | |
15177 | ||
15178 | switch (ffelex_token_type (t)) | |
15179 | { | |
15180 | case FFELEX_typeEQUALS: | |
15181 | ffelex_token_kill (ffesta_tokens[1]); | |
15182 | nt = ffesta_tokens[2]; | |
15183 | next = (ffelexHandler) ffestb_R9098_ (nt); | |
15184 | ffelex_token_kill (nt); | |
15185 | return (ffelexHandler) (*next) (t); | |
15186 | ||
15187 | default: | |
15188 | nt = ffesta_tokens[1]; | |
15189 | ot = ffesta_tokens[2]; | |
15190 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15191 | FFEEXPR_contextFILEUNITAMBIG, (ffeexprCallback) ffestb_R9094_))) | |
15192 | (nt); | |
15193 | ffelex_token_kill (nt); | |
15194 | next = (ffelexHandler) (*next) (ot); | |
15195 | ffelex_token_kill (ot); | |
15196 | return (ffelexHandler) (*next) (t); | |
15197 | } | |
15198 | } | |
15199 | ||
15200 | /* ffestb_R9094_ -- "READ" OPEN_PAREN expr [CLOSE_PAREN] | |
15201 | ||
15202 | (ffestb_R9094_) // to expression handler | |
15203 | ||
15204 | Handle COMMA or EOS/SEMICOLON here. | |
15205 | ||
15206 | 15-Feb-91 JCB 1.1 | |
15207 | Use new ffeexpr mechanism whereby the expr is encased in an opITEM if | |
15208 | ffeexpr decided it was an item in a control list (hence a unit | |
15209 | specifier), or a format specifier otherwise. */ | |
15210 | ||
15211 | static ffelexHandler | |
15212 | ffestb_R9094_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
15213 | { | |
15214 | if (expr == NULL) | |
15215 | goto bad; /* :::::::::::::::::::: */ | |
15216 | ||
15217 | if (ffebld_op (expr) != FFEBLD_opITEM) | |
15218 | { | |
15219 | switch (ffelex_token_type (t)) | |
15220 | { | |
15221 | case FFELEX_typeCOMMA: | |
15222 | case FFELEX_typeEOS: | |
15223 | case FFELEX_typeSEMICOLON: | |
15224 | ffesta_confirmed (); | |
15225 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present | |
15226 | = TRUE; | |
15227 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE; | |
15228 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE; | |
15229 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label | |
15230 | = FALSE; | |
15231 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value | |
15232 | = ffelex_token_use (ft); | |
15233 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr; | |
15234 | if (!ffesta_is_inhibited ()) | |
15235 | ffestc_R909_start (TRUE); | |
15236 | ffestb_subr_kill_read_ (); | |
15237 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
15238 | return (ffelexHandler) | |
15239 | ffeexpr_lhs (ffesta_output_pool, | |
15240 | ffestc_context_iolist (), | |
15241 | (ffeexprCallback) ffestb_R90915_); | |
15242 | if (!ffesta_is_inhibited ()) | |
15243 | ffestc_R909_finish (); | |
15244 | return (ffelexHandler) ffesta_zero (t); | |
15245 | ||
15246 | default: | |
15247 | goto bad; /* :::::::::::::::::::: */ | |
15248 | } | |
15249 | } | |
15250 | ||
15251 | expr = ffebld_head (expr); | |
15252 | ||
15253 | if (expr == NULL) | |
15254 | goto bad; /* :::::::::::::::::::: */ | |
15255 | ||
15256 | switch (ffelex_token_type (t)) | |
15257 | { | |
15258 | case FFELEX_typeCOMMA: | |
15259 | case FFELEX_typeCLOSE_PAREN: | |
15260 | ffestp_file.read.read_spec[FFESTP_readixUNIT].kw_or_val_present | |
15261 | = TRUE; | |
15262 | ffestp_file.read.read_spec[FFESTP_readixUNIT].kw_present = FALSE; | |
15263 | ffestp_file.read.read_spec[FFESTP_readixUNIT].value_present = TRUE; | |
15264 | ffestp_file.read.read_spec[FFESTP_readixUNIT].value_is_label | |
15265 | = FALSE; | |
15266 | ffestp_file.read.read_spec[FFESTP_readixUNIT].value | |
15267 | = ffelex_token_use (ft); | |
15268 | ffestp_file.read.read_spec[FFESTP_readixUNIT].u.expr = expr; | |
15269 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
15270 | return (ffelexHandler) ffestb_R9095_; | |
15271 | return (ffelexHandler) ffestb_R90913_; | |
15272 | ||
15273 | default: | |
15274 | break; | |
15275 | } | |
15276 | ||
15277 | bad: /* :::::::::::::::::::: */ | |
15278 | ffestb_subr_kill_read_ (); | |
15279 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15280 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15281 | } | |
15282 | ||
15283 | /* ffestb_R9095_ -- "READ" OPEN_PAREN expr COMMA | |
15284 | ||
15285 | return ffestb_R9095_; // to lexer | |
15286 | ||
15287 | Handle expr construct (not NAME=expr construct) here. */ | |
15288 | ||
15289 | static ffelexHandler | |
15290 | ffestb_R9095_ (ffelexToken t) | |
15291 | { | |
15292 | switch (ffelex_token_type (t)) | |
15293 | { | |
15294 | case FFELEX_typeNAME: | |
15295 | ffesta_tokens[1] = ffelex_token_use (t); | |
15296 | return (ffelexHandler) ffestb_R9096_; | |
15297 | ||
15298 | default: | |
15299 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15300 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9097_))) | |
15301 | (t); | |
15302 | } | |
15303 | } | |
15304 | ||
15305 | /* ffestb_R9096_ -- "READ" OPEN_PAREN expr COMMA NAME | |
15306 | ||
15307 | return ffestb_R9096_; // to lexer | |
15308 | ||
15309 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
15310 | token thru expression handler. */ | |
15311 | ||
15312 | static ffelexHandler | |
15313 | ffestb_R9096_ (ffelexToken t) | |
15314 | { | |
15315 | ffelexHandler next; | |
15316 | ffelexToken nt; | |
15317 | ||
15318 | switch (ffelex_token_type (t)) | |
15319 | { | |
15320 | case FFELEX_typeEQUALS: | |
15321 | nt = ffesta_tokens[1]; | |
15322 | next = (ffelexHandler) ffestb_R9098_ (nt); | |
15323 | ffelex_token_kill (nt); | |
15324 | return (ffelexHandler) (*next) (t); | |
15325 | ||
15326 | default: | |
15327 | nt = ffesta_tokens[1]; | |
15328 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15329 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9097_))) | |
15330 | (nt); | |
15331 | ffelex_token_kill (nt); | |
15332 | return (ffelexHandler) (*next) (t); | |
15333 | } | |
15334 | } | |
15335 | ||
15336 | /* ffestb_R9097_ -- "READ" OPEN_PAREN expr COMMA expr | |
15337 | ||
15338 | (ffestb_R9097_) // to expression handler | |
15339 | ||
15340 | Handle COMMA or CLOSE_PAREN here. */ | |
15341 | ||
15342 | static ffelexHandler | |
15343 | ffestb_R9097_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
15344 | { | |
15345 | switch (ffelex_token_type (t)) | |
15346 | { | |
15347 | case FFELEX_typeCOMMA: | |
15348 | case FFELEX_typeCLOSE_PAREN: | |
15349 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_or_val_present | |
15350 | = TRUE; | |
15351 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].kw_present = FALSE; | |
15352 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_present = TRUE; | |
15353 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value_is_label | |
15354 | = (expr == NULL); | |
15355 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].value | |
15356 | = ffelex_token_use (ft); | |
15357 | ffestp_file.read.read_spec[FFESTP_readixFORMAT].u.expr = expr; | |
15358 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
15359 | return (ffelexHandler) ffestb_R9098_; | |
15360 | return (ffelexHandler) ffestb_R90913_; | |
15361 | ||
15362 | default: | |
15363 | break; | |
15364 | } | |
15365 | ||
15366 | ffestb_subr_kill_read_ (); | |
15367 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15368 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15369 | } | |
15370 | ||
15371 | /* ffestb_R9098_ -- "READ" OPEN_PAREN [external-file-unit COMMA [format | |
15372 | COMMA]] | |
15373 | ||
15374 | return ffestb_R9098_; // to lexer | |
15375 | ||
15376 | Handle expr construct (not NAME=expr construct) here. */ | |
15377 | ||
15378 | static ffelexHandler | |
15379 | ffestb_R9098_ (ffelexToken t) | |
15380 | { | |
15381 | ffestrGenio kw; | |
15382 | ||
15383 | ffestb_local_.read.label = FALSE; | |
15384 | ||
15385 | switch (ffelex_token_type (t)) | |
15386 | { | |
15387 | case FFELEX_typeNAME: | |
15388 | kw = ffestr_genio (t); | |
15389 | switch (kw) | |
15390 | { | |
15391 | case FFESTR_genioADVANCE: | |
15392 | ffestb_local_.read.ix = FFESTP_readixADVANCE; | |
15393 | ffestb_local_.read.left = FALSE; | |
15394 | ffestb_local_.read.context = FFEEXPR_contextFILEDFCHAR; | |
15395 | break; | |
15396 | ||
15397 | case FFESTR_genioEOR: | |
15398 | ffestb_local_.read.ix = FFESTP_readixEOR; | |
15399 | ffestb_local_.read.label = TRUE; | |
15400 | break; | |
15401 | ||
15402 | case FFESTR_genioERR: | |
15403 | ffestb_local_.read.ix = FFESTP_readixERR; | |
15404 | ffestb_local_.read.label = TRUE; | |
15405 | break; | |
15406 | ||
15407 | case FFESTR_genioEND: | |
15408 | ffestb_local_.read.ix = FFESTP_readixEND; | |
15409 | ffestb_local_.read.label = TRUE; | |
15410 | break; | |
15411 | ||
15412 | case FFESTR_genioFMT: | |
15413 | ffestb_local_.read.ix = FFESTP_readixFORMAT; | |
15414 | ffestb_local_.read.left = FALSE; | |
15415 | ffestb_local_.read.context = FFEEXPR_contextFILEFORMAT; | |
15416 | break; | |
15417 | ||
15418 | case FFESTR_genioIOSTAT: | |
15419 | ffestb_local_.read.ix = FFESTP_readixIOSTAT; | |
15420 | ffestb_local_.read.left = TRUE; | |
15421 | ffestb_local_.read.context = FFEEXPR_contextFILEINT; | |
15422 | break; | |
15423 | ||
15424 | case FFESTR_genioKEY: | |
15425 | case FFESTR_genioKEYEQ: | |
15426 | ffestb_local_.read.ix = FFESTP_readixKEYEQ; | |
15427 | ffestb_local_.read.left = FALSE; | |
15428 | ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR; | |
15429 | break; | |
15430 | ||
15431 | case FFESTR_genioKEYGE: | |
15432 | ffestb_local_.read.ix = FFESTP_readixKEYGE; | |
15433 | ffestb_local_.read.left = FALSE; | |
15434 | ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR; | |
15435 | break; | |
15436 | ||
15437 | case FFESTR_genioKEYGT: | |
15438 | ffestb_local_.read.ix = FFESTP_readixKEYGT; | |
15439 | ffestb_local_.read.left = FALSE; | |
15440 | ffestb_local_.read.context = FFEEXPR_contextFILENUMCHAR; | |
15441 | break; | |
15442 | ||
15443 | case FFESTR_genioKEYID: | |
15444 | ffestb_local_.read.ix = FFESTP_readixKEYID; | |
15445 | ffestb_local_.read.left = FALSE; | |
15446 | ffestb_local_.read.context = FFEEXPR_contextFILENUM; | |
15447 | break; | |
15448 | ||
15449 | case FFESTR_genioNML: | |
15450 | ffestb_local_.read.ix = FFESTP_readixFORMAT; | |
15451 | ffestb_local_.read.left = TRUE; | |
15452 | ffestb_local_.read.context = FFEEXPR_contextFILENAMELIST; | |
15453 | break; | |
15454 | ||
15455 | case FFESTR_genioNULLS: | |
15456 | ffestb_local_.read.ix = FFESTP_readixNULLS; | |
15457 | ffestb_local_.read.left = TRUE; | |
15458 | ffestb_local_.read.context = FFEEXPR_contextFILEINT; | |
15459 | break; | |
15460 | ||
15461 | case FFESTR_genioREC: | |
15462 | ffestb_local_.read.ix = FFESTP_readixREC; | |
15463 | ffestb_local_.read.left = FALSE; | |
15464 | ffestb_local_.read.context = FFEEXPR_contextFILENUM; | |
15465 | break; | |
15466 | ||
15467 | case FFESTR_genioSIZE: | |
15468 | ffestb_local_.read.ix = FFESTP_readixSIZE; | |
15469 | ffestb_local_.read.left = TRUE; | |
15470 | ffestb_local_.read.context = FFEEXPR_contextFILEINT; | |
15471 | break; | |
15472 | ||
15473 | case FFESTR_genioUNIT: | |
15474 | ffestb_local_.read.ix = FFESTP_readixUNIT; | |
15475 | ffestb_local_.read.left = FALSE; | |
15476 | ffestb_local_.read.context = FFEEXPR_contextFILEUNIT; | |
15477 | break; | |
15478 | ||
15479 | default: | |
15480 | goto bad; /* :::::::::::::::::::: */ | |
15481 | } | |
15482 | if (ffestp_file.read.read_spec[ffestb_local_.read.ix] | |
15483 | .kw_or_val_present) | |
15484 | break; /* Can't specify a keyword twice! */ | |
15485 | ffestp_file.read.read_spec[ffestb_local_.read.ix] | |
15486 | .kw_or_val_present = TRUE; | |
15487 | ffestp_file.read.read_spec[ffestb_local_.read.ix] | |
15488 | .kw_present = TRUE; | |
15489 | ffestp_file.read.read_spec[ffestb_local_.read.ix] | |
15490 | .value_present = FALSE; | |
15491 | ffestp_file.read.read_spec[ffestb_local_.read.ix].value_is_label | |
15492 | = ffestb_local_.read.label; | |
15493 | ffestp_file.read.read_spec[ffestb_local_.read.ix].kw | |
15494 | = ffelex_token_use (t); | |
15495 | return (ffelexHandler) ffestb_R9099_; | |
15496 | ||
15497 | default: | |
15498 | break; | |
15499 | } | |
15500 | ||
15501 | bad: /* :::::::::::::::::::: */ | |
15502 | ffestb_subr_kill_read_ (); | |
15503 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15504 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15505 | } | |
15506 | ||
15507 | /* ffestb_R9099_ -- "READ" OPEN_PAREN [external-file-unit COMMA [format | |
15508 | COMMA]] NAME | |
15509 | ||
15510 | return ffestb_R9099_; // to lexer | |
15511 | ||
15512 | Make sure EQUALS here, send next token to expression handler. */ | |
15513 | ||
15514 | static ffelexHandler | |
15515 | ffestb_R9099_ (ffelexToken t) | |
15516 | { | |
15517 | switch (ffelex_token_type (t)) | |
15518 | { | |
15519 | case FFELEX_typeEQUALS: | |
15520 | ffesta_confirmed (); | |
15521 | if (ffestb_local_.read.label) | |
15522 | return (ffelexHandler) ffestb_R90911_; | |
15523 | if (ffestb_local_.read.left) | |
15524 | return (ffelexHandler) | |
15525 | ffeexpr_lhs (ffesta_output_pool, | |
15526 | ffestb_local_.read.context, | |
15527 | (ffeexprCallback) ffestb_R90910_); | |
15528 | return (ffelexHandler) | |
15529 | ffeexpr_rhs (ffesta_output_pool, | |
15530 | ffestb_local_.read.context, | |
15531 | (ffeexprCallback) ffestb_R90910_); | |
15532 | ||
15533 | default: | |
15534 | break; | |
15535 | } | |
15536 | ||
15537 | ffestb_subr_kill_read_ (); | |
15538 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15539 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15540 | } | |
15541 | ||
15542 | /* ffestb_R90910_ -- "READ" OPEN_PAREN ... NAME EQUALS expr | |
15543 | ||
15544 | (ffestb_R90910_) // to expression handler | |
15545 | ||
15546 | Handle COMMA or CLOSE_PAREN here. */ | |
15547 | ||
15548 | static ffelexHandler | |
15549 | ffestb_R90910_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
15550 | { | |
15551 | switch (ffelex_token_type (t)) | |
15552 | { | |
15553 | case FFELEX_typeCOMMA: | |
15554 | case FFELEX_typeCLOSE_PAREN: | |
15555 | if (expr == NULL) | |
15556 | if (ffestb_local_.read.context == FFEEXPR_contextFILEFORMAT) | |
15557 | ffestp_file.read.read_spec[ffestb_local_.read.ix] | |
15558 | .value_is_label = TRUE; | |
15559 | else | |
15560 | break; | |
15561 | ffestp_file.read.read_spec[ffestb_local_.read.ix].value_present | |
15562 | = TRUE; | |
15563 | ffestp_file.read.read_spec[ffestb_local_.read.ix].value | |
15564 | = ffelex_token_use (ft); | |
15565 | ffestp_file.read.read_spec[ffestb_local_.read.ix].u.expr = expr; | |
15566 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
15567 | return (ffelexHandler) ffestb_R9098_; | |
15568 | return (ffelexHandler) ffestb_R90913_; | |
15569 | ||
15570 | default: | |
15571 | break; | |
15572 | } | |
15573 | ||
15574 | ffestb_subr_kill_read_ (); | |
15575 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15576 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15577 | } | |
15578 | ||
15579 | /* ffestb_R90911_ -- "READ" OPEN_PAREN ... NAME EQUALS | |
15580 | ||
15581 | return ffestb_R90911_; // to lexer | |
15582 | ||
15583 | Handle NUMBER for label here. */ | |
15584 | ||
15585 | static ffelexHandler | |
15586 | ffestb_R90911_ (ffelexToken t) | |
15587 | { | |
15588 | switch (ffelex_token_type (t)) | |
15589 | { | |
15590 | case FFELEX_typeNUMBER: | |
15591 | ffestp_file.read.read_spec[ffestb_local_.read.ix].value_present | |
15592 | = TRUE; | |
15593 | ffestp_file.read.read_spec[ffestb_local_.read.ix].value | |
15594 | = ffelex_token_use (t); | |
15595 | return (ffelexHandler) ffestb_R90912_; | |
15596 | ||
15597 | default: | |
15598 | break; | |
15599 | } | |
15600 | ||
15601 | ffestb_subr_kill_read_ (); | |
15602 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15603 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15604 | } | |
15605 | ||
15606 | /* ffestb_R90912_ -- "READ" OPEN_PAREN ... NAME EQUALS NUMBER | |
15607 | ||
15608 | return ffestb_R90912_; // to lexer | |
15609 | ||
15610 | Handle COMMA or CLOSE_PAREN here. */ | |
15611 | ||
15612 | static ffelexHandler | |
15613 | ffestb_R90912_ (ffelexToken t) | |
15614 | { | |
15615 | switch (ffelex_token_type (t)) | |
15616 | { | |
15617 | case FFELEX_typeCOMMA: | |
15618 | return (ffelexHandler) ffestb_R9098_; | |
15619 | ||
15620 | case FFELEX_typeCLOSE_PAREN: | |
15621 | return (ffelexHandler) ffestb_R90913_; | |
15622 | ||
15623 | default: | |
15624 | break; | |
15625 | } | |
15626 | ||
15627 | ffestb_subr_kill_read_ (); | |
15628 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15629 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15630 | } | |
15631 | ||
15632 | /* ffestb_R90913_ -- "READ" OPEN_PAREN ... CLOSE_PAREN | |
15633 | ||
15634 | return ffestb_R90913_; // to lexer | |
15635 | ||
15636 | Handle EOS or SEMICOLON here. | |
15637 | ||
15638 | 15-Feb-91 JCB 1.1 | |
15639 | Fix to allow implied-DO construct here (OPEN_PAREN) -- actually, | |
15640 | don't presume knowledge of what an initial token in an lhs context | |
15641 | is going to be, let ffeexpr_lhs handle that as much as possible. */ | |
15642 | ||
15643 | static ffelexHandler | |
15644 | ffestb_R90913_ (ffelexToken t) | |
15645 | { | |
15646 | switch (ffelex_token_type (t)) | |
15647 | { | |
15648 | case FFELEX_typeEOS: | |
15649 | case FFELEX_typeSEMICOLON: | |
15650 | ffesta_confirmed (); | |
15651 | if (!ffesta_is_inhibited ()) | |
15652 | { | |
15653 | ffestc_R909_start (FALSE); | |
15654 | ffestc_R909_finish (); | |
15655 | } | |
15656 | ffestb_subr_kill_read_ (); | |
15657 | return (ffelexHandler) ffesta_zero (t); | |
15658 | ||
15659 | default: | |
15660 | ffesta_confirmed (); | |
15661 | /* Fall through. */ | |
15662 | case FFELEX_typeOPEN_PAREN: /* Could still be assignment!! */ | |
15663 | break; | |
15664 | } | |
15665 | ||
15666 | /* If token isn't NAME or OPEN_PAREN, ffeexpr_lhs will ultimately whine | |
15667 | about it, so leave it up to that code. */ | |
15668 | ||
15669 | /* EXTENSION: Allow an optional preceding COMMA here if not pedantic. (f2c | |
15670 | provides this extension, as do other compilers, supposedly.) */ | |
15671 | ||
15672 | if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA)) | |
15673 | return (ffelexHandler) | |
15674 | ffeexpr_lhs (ffesta_output_pool, | |
15675 | ffestc_context_iolist (), | |
15676 | (ffeexprCallback) ffestb_R90914_); | |
15677 | ||
15678 | return (ffelexHandler) (*((ffelexHandler) | |
15679 | ffeexpr_lhs (ffesta_output_pool, | |
15680 | ffestc_context_iolist (), | |
15681 | (ffeexprCallback) ffestb_R90914_))) | |
15682 | (t); | |
15683 | } | |
15684 | ||
15685 | /* ffestb_R90914_ -- "READ(...)" expr | |
15686 | ||
15687 | (ffestb_R90914_) // to expression handler | |
15688 | ||
15689 | Handle COMMA or EOS/SEMICOLON here. */ | |
15690 | ||
15691 | static ffelexHandler | |
15692 | ffestb_R90914_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
15693 | { | |
15694 | switch (ffelex_token_type (t)) | |
15695 | { | |
15696 | case FFELEX_typeCOMMA: | |
15697 | if (expr == NULL) | |
15698 | break; | |
15699 | ||
15700 | ffesta_confirmed (); | |
15701 | if (!ffesta_is_inhibited ()) | |
15702 | ffestc_R909_start (FALSE); | |
15703 | ffestb_subr_kill_read_ (); | |
15704 | ||
15705 | if (!ffesta_is_inhibited ()) | |
15706 | ffestc_R909_item (expr, ft); | |
15707 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
15708 | ffestc_context_iolist (), | |
15709 | (ffeexprCallback) ffestb_R90915_); | |
15710 | ||
15711 | case FFELEX_typeEOS: | |
15712 | case FFELEX_typeSEMICOLON: | |
15713 | if (expr == NULL) | |
15714 | break; | |
15715 | ||
15716 | ffesta_confirmed (); | |
15717 | if (!ffesta_is_inhibited ()) | |
15718 | ffestc_R909_start (FALSE); | |
15719 | ffestb_subr_kill_read_ (); | |
15720 | ||
15721 | if (!ffesta_is_inhibited ()) | |
15722 | { | |
15723 | ffestc_R909_item (expr, ft); | |
15724 | ffestc_R909_finish (); | |
15725 | } | |
15726 | return (ffelexHandler) ffesta_zero (t); | |
15727 | ||
15728 | default: | |
15729 | break; | |
15730 | } | |
15731 | ||
15732 | ffestb_subr_kill_read_ (); | |
15733 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15734 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15735 | } | |
15736 | ||
15737 | /* ffestb_R90915_ -- "READ(...)" expr COMMA expr | |
15738 | ||
15739 | (ffestb_R90915_) // to expression handler | |
15740 | ||
15741 | Handle COMMA or EOS/SEMICOLON here. */ | |
15742 | ||
15743 | static ffelexHandler | |
15744 | ffestb_R90915_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
15745 | { | |
15746 | switch (ffelex_token_type (t)) | |
15747 | { | |
15748 | case FFELEX_typeCOMMA: | |
15749 | if (expr == NULL) | |
15750 | break; | |
15751 | if (!ffesta_is_inhibited ()) | |
15752 | ffestc_R909_item (expr, ft); | |
15753 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
15754 | ffestc_context_iolist (), | |
15755 | (ffeexprCallback) ffestb_R90915_); | |
15756 | ||
15757 | case FFELEX_typeEOS: | |
15758 | case FFELEX_typeSEMICOLON: | |
15759 | if (expr == NULL) | |
15760 | break; | |
15761 | if (!ffesta_is_inhibited ()) | |
15762 | { | |
15763 | ffestc_R909_item (expr, ft); | |
15764 | ffestc_R909_finish (); | |
15765 | } | |
15766 | return (ffelexHandler) ffesta_zero (t); | |
15767 | ||
15768 | default: | |
15769 | break; | |
15770 | } | |
15771 | ||
15772 | if (!ffesta_is_inhibited ()) | |
15773 | ffestc_R909_finish (); | |
15774 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "READ", t); | |
15775 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15776 | } | |
15777 | ||
15778 | /* ffestb_R910 -- Parse the WRITE statement | |
15779 | ||
15780 | return ffestb_R910; // to lexer | |
15781 | ||
15782 | Make sure the statement has a valid form for the WRITE | |
15783 | statement. If it does, implement the statement. */ | |
15784 | ||
15785 | ffelexHandler | |
15786 | ffestb_R910 (ffelexToken t) | |
15787 | { | |
15788 | ffestpWriteIx ix; | |
15789 | ||
15790 | switch (ffelex_token_type (ffesta_tokens[0])) | |
15791 | { | |
15792 | case FFELEX_typeNAME: | |
15793 | if (ffesta_first_kw != FFESTR_firstWRITE) | |
15794 | goto bad_0; /* :::::::::::::::::::: */ | |
15795 | switch (ffelex_token_type (t)) | |
15796 | { | |
15797 | case FFELEX_typeCOMMA: | |
15798 | case FFELEX_typeCOLONCOLON: | |
15799 | case FFELEX_typeEOS: | |
15800 | case FFELEX_typeSEMICOLON: | |
15801 | case FFELEX_typeNAME: | |
15802 | case FFELEX_typeNUMBER: | |
15803 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
15804 | goto bad_1; /* :::::::::::::::::::: */ | |
15805 | ||
15806 | default: | |
15807 | goto bad_1; /* :::::::::::::::::::: */ | |
15808 | ||
15809 | case FFELEX_typeOPEN_PAREN: | |
15810 | for (ix = 0; ix < FFESTP_writeix; ++ix) | |
15811 | ffestp_file.write.write_spec[ix].kw_or_val_present = FALSE; | |
15812 | return (ffelexHandler) ffestb_R9101_; | |
15813 | } | |
15814 | ||
15815 | case FFELEX_typeNAMES: | |
15816 | if (ffesta_first_kw != FFESTR_firstWRITE) | |
15817 | goto bad_0; /* :::::::::::::::::::: */ | |
15818 | switch (ffelex_token_type (t)) | |
15819 | { | |
15820 | case FFELEX_typeEOS: | |
15821 | case FFELEX_typeSEMICOLON: | |
15822 | case FFELEX_typeCOMMA: | |
15823 | case FFELEX_typeCOLONCOLON: | |
15824 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
15825 | goto bad_1; /* :::::::::::::::::::: */ | |
15826 | ||
15827 | default: | |
15828 | goto bad_1; /* :::::::::::::::::::: */ | |
15829 | ||
15830 | case FFELEX_typeOPEN_PAREN: | |
15831 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlWRITE) | |
15832 | goto bad_0; /* :::::::::::::::::::: */ | |
15833 | ||
15834 | for (ix = 0; ix < FFESTP_writeix; ++ix) | |
15835 | ffestp_file.write.write_spec[ix].kw_or_val_present = FALSE; | |
15836 | return (ffelexHandler) ffestb_R9101_; | |
15837 | } | |
15838 | ||
15839 | default: | |
15840 | goto bad_0; /* :::::::::::::::::::: */ | |
15841 | } | |
15842 | ||
15843 | bad_0: /* :::::::::::::::::::: */ | |
15844 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", ffesta_tokens[0]); | |
15845 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15846 | ||
15847 | bad_1: /* :::::::::::::::::::: */ | |
15848 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
15849 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
15850 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
15851 | } | |
15852 | ||
15853 | /* ffestb_R9101_ -- "WRITE" OPEN_PAREN | |
15854 | ||
15855 | return ffestb_R9101_; // to lexer | |
15856 | ||
15857 | Handle expr construct (not NAME=expr construct) here. */ | |
15858 | ||
15859 | static ffelexHandler | |
15860 | ffestb_R9101_ (ffelexToken t) | |
15861 | { | |
15862 | switch (ffelex_token_type (t)) | |
15863 | { | |
15864 | case FFELEX_typeNAME: | |
15865 | ffesta_tokens[1] = ffelex_token_use (t); | |
15866 | return (ffelexHandler) ffestb_R9102_; | |
15867 | ||
15868 | default: | |
15869 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15870 | FFEEXPR_contextFILEUNIT, (ffeexprCallback) ffestb_R9103_))) | |
15871 | (t); | |
15872 | } | |
15873 | } | |
15874 | ||
15875 | /* ffestb_R9102_ -- "WRITE" OPEN_PAREN NAME | |
15876 | ||
15877 | return ffestb_R9102_; // to lexer | |
15878 | ||
15879 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
15880 | token thru expression handler. */ | |
15881 | ||
15882 | static ffelexHandler | |
15883 | ffestb_R9102_ (ffelexToken t) | |
15884 | { | |
15885 | ffelexHandler next; | |
15886 | ffelexToken nt; | |
15887 | ||
15888 | switch (ffelex_token_type (t)) | |
15889 | { | |
15890 | case FFELEX_typeEQUALS: | |
15891 | nt = ffesta_tokens[1]; | |
15892 | next = (ffelexHandler) ffestb_R9107_ (nt); | |
15893 | ffelex_token_kill (nt); | |
15894 | return (ffelexHandler) (*next) (t); | |
15895 | ||
15896 | default: | |
15897 | nt = ffesta_tokens[1]; | |
15898 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15899 | FFEEXPR_contextFILEUNIT, (ffeexprCallback) ffestb_R9103_))) | |
15900 | (nt); | |
15901 | ffelex_token_kill (nt); | |
15902 | return (ffelexHandler) (*next) (t); | |
15903 | } | |
15904 | } | |
15905 | ||
15906 | /* ffestb_R9103_ -- "WRITE" OPEN_PAREN expr [CLOSE_PAREN] | |
15907 | ||
15908 | (ffestb_R9103_) // to expression handler | |
15909 | ||
15910 | Handle COMMA or EOS/SEMICOLON here. */ | |
15911 | ||
15912 | static ffelexHandler | |
15913 | ffestb_R9103_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
15914 | { | |
15915 | switch (ffelex_token_type (t)) | |
15916 | { | |
15917 | case FFELEX_typeCOMMA: | |
15918 | case FFELEX_typeCLOSE_PAREN: | |
15919 | if (expr == NULL) | |
15920 | break; | |
15921 | ffestp_file.write.write_spec[FFESTP_writeixUNIT].kw_or_val_present | |
15922 | = TRUE; | |
15923 | ffestp_file.write.write_spec[FFESTP_writeixUNIT].kw_present = FALSE; | |
15924 | ffestp_file.write.write_spec[FFESTP_writeixUNIT].value_present = TRUE; | |
15925 | ffestp_file.write.write_spec[FFESTP_writeixUNIT].value_is_label | |
15926 | = FALSE; | |
15927 | ffestp_file.write.write_spec[FFESTP_writeixUNIT].value | |
15928 | = ffelex_token_use (ft); | |
15929 | ffestp_file.write.write_spec[FFESTP_writeixUNIT].u.expr = expr; | |
15930 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
15931 | return (ffelexHandler) ffestb_R9104_; | |
15932 | return (ffelexHandler) ffestb_R91012_; | |
15933 | ||
15934 | default: | |
15935 | break; | |
15936 | } | |
15937 | ||
15938 | ffestb_subr_kill_write_ (); | |
15939 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
15940 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
15941 | } | |
15942 | ||
15943 | /* ffestb_R9104_ -- "WRITE" OPEN_PAREN expr COMMA | |
15944 | ||
15945 | return ffestb_R9104_; // to lexer | |
15946 | ||
15947 | Handle expr construct (not NAME=expr construct) here. */ | |
15948 | ||
15949 | static ffelexHandler | |
15950 | ffestb_R9104_ (ffelexToken t) | |
15951 | { | |
15952 | switch (ffelex_token_type (t)) | |
15953 | { | |
15954 | case FFELEX_typeNAME: | |
15955 | ffesta_tokens[1] = ffelex_token_use (t); | |
15956 | return (ffelexHandler) ffestb_R9105_; | |
15957 | ||
15958 | default: | |
15959 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15960 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9106_))) | |
15961 | (t); | |
15962 | } | |
15963 | } | |
15964 | ||
15965 | /* ffestb_R9105_ -- "WRITE" OPEN_PAREN expr COMMA NAME | |
15966 | ||
15967 | return ffestb_R9105_; // to lexer | |
15968 | ||
15969 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
15970 | token thru expression handler. */ | |
15971 | ||
15972 | static ffelexHandler | |
15973 | ffestb_R9105_ (ffelexToken t) | |
15974 | { | |
15975 | ffelexHandler next; | |
15976 | ffelexToken nt; | |
15977 | ||
15978 | switch (ffelex_token_type (t)) | |
15979 | { | |
15980 | case FFELEX_typeEQUALS: | |
15981 | nt = ffesta_tokens[1]; | |
15982 | next = (ffelexHandler) ffestb_R9107_ (nt); | |
15983 | ffelex_token_kill (nt); | |
15984 | return (ffelexHandler) (*next) (t); | |
15985 | ||
15986 | default: | |
15987 | nt = ffesta_tokens[1]; | |
15988 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
15989 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9106_))) | |
15990 | (nt); | |
15991 | ffelex_token_kill (nt); | |
15992 | return (ffelexHandler) (*next) (t); | |
15993 | } | |
15994 | } | |
15995 | ||
15996 | /* ffestb_R9106_ -- "WRITE" OPEN_PAREN expr COMMA expr | |
15997 | ||
15998 | (ffestb_R9106_) // to expression handler | |
15999 | ||
16000 | Handle COMMA or CLOSE_PAREN here. */ | |
16001 | ||
16002 | static ffelexHandler | |
16003 | ffestb_R9106_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
16004 | { | |
16005 | switch (ffelex_token_type (t)) | |
16006 | { | |
16007 | case FFELEX_typeCOMMA: | |
16008 | case FFELEX_typeCLOSE_PAREN: | |
16009 | ffestp_file.write.write_spec[FFESTP_writeixFORMAT].kw_or_val_present | |
16010 | = TRUE; | |
16011 | ffestp_file.write.write_spec[FFESTP_writeixFORMAT].kw_present = FALSE; | |
16012 | ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value_present = TRUE; | |
16013 | ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value_is_label | |
16014 | = (expr == NULL); | |
16015 | ffestp_file.write.write_spec[FFESTP_writeixFORMAT].value | |
16016 | = ffelex_token_use (ft); | |
16017 | ffestp_file.write.write_spec[FFESTP_writeixFORMAT].u.expr = expr; | |
16018 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
16019 | return (ffelexHandler) ffestb_R9107_; | |
16020 | return (ffelexHandler) ffestb_R91012_; | |
16021 | ||
16022 | default: | |
16023 | break; | |
16024 | } | |
16025 | ||
16026 | ffestb_subr_kill_write_ (); | |
16027 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16028 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16029 | } | |
16030 | ||
16031 | /* ffestb_R9107_ -- "WRITE" OPEN_PAREN [external-file-unit COMMA [format | |
16032 | COMMA]] | |
16033 | ||
16034 | return ffestb_R9107_; // to lexer | |
16035 | ||
16036 | Handle expr construct (not NAME=expr construct) here. */ | |
16037 | ||
16038 | static ffelexHandler | |
16039 | ffestb_R9107_ (ffelexToken t) | |
16040 | { | |
16041 | ffestrGenio kw; | |
16042 | ||
16043 | ffestb_local_.write.label = FALSE; | |
16044 | ||
16045 | switch (ffelex_token_type (t)) | |
16046 | { | |
16047 | case FFELEX_typeNAME: | |
16048 | kw = ffestr_genio (t); | |
16049 | switch (kw) | |
16050 | { | |
16051 | case FFESTR_genioADVANCE: | |
16052 | ffestb_local_.write.ix = FFESTP_writeixADVANCE; | |
16053 | ffestb_local_.write.left = FALSE; | |
16054 | ffestb_local_.write.context = FFEEXPR_contextFILEDFCHAR; | |
16055 | break; | |
16056 | ||
16057 | case FFESTR_genioEOR: | |
16058 | ffestb_local_.write.ix = FFESTP_writeixEOR; | |
16059 | ffestb_local_.write.label = TRUE; | |
16060 | break; | |
16061 | ||
16062 | case FFESTR_genioERR: | |
16063 | ffestb_local_.write.ix = FFESTP_writeixERR; | |
16064 | ffestb_local_.write.label = TRUE; | |
16065 | break; | |
16066 | ||
16067 | case FFESTR_genioFMT: | |
16068 | ffestb_local_.write.ix = FFESTP_writeixFORMAT; | |
16069 | ffestb_local_.write.left = FALSE; | |
16070 | ffestb_local_.write.context = FFEEXPR_contextFILEFORMAT; | |
16071 | break; | |
16072 | ||
16073 | case FFESTR_genioIOSTAT: | |
16074 | ffestb_local_.write.ix = FFESTP_writeixIOSTAT; | |
16075 | ffestb_local_.write.left = TRUE; | |
16076 | ffestb_local_.write.context = FFEEXPR_contextFILEINT; | |
16077 | break; | |
16078 | ||
16079 | case FFESTR_genioNML: | |
16080 | ffestb_local_.write.ix = FFESTP_writeixFORMAT; | |
16081 | ffestb_local_.write.left = TRUE; | |
16082 | ffestb_local_.write.context = FFEEXPR_contextFILENAMELIST; | |
16083 | break; | |
16084 | ||
16085 | case FFESTR_genioREC: | |
16086 | ffestb_local_.write.ix = FFESTP_writeixREC; | |
16087 | ffestb_local_.write.left = FALSE; | |
16088 | ffestb_local_.write.context = FFEEXPR_contextFILENUM; | |
16089 | break; | |
16090 | ||
16091 | case FFESTR_genioUNIT: | |
16092 | ffestb_local_.write.ix = FFESTP_writeixUNIT; | |
16093 | ffestb_local_.write.left = FALSE; | |
16094 | ffestb_local_.write.context = FFEEXPR_contextFILEUNIT; | |
16095 | break; | |
16096 | ||
16097 | default: | |
16098 | goto bad; /* :::::::::::::::::::: */ | |
16099 | } | |
16100 | if (ffestp_file.write.write_spec[ffestb_local_.write.ix] | |
16101 | .kw_or_val_present) | |
16102 | break; /* Can't specify a keyword twice! */ | |
16103 | ffestp_file.write.write_spec[ffestb_local_.write.ix] | |
16104 | .kw_or_val_present = TRUE; | |
16105 | ffestp_file.write.write_spec[ffestb_local_.write.ix] | |
16106 | .kw_present = TRUE; | |
16107 | ffestp_file.write.write_spec[ffestb_local_.write.ix] | |
16108 | .value_present = FALSE; | |
16109 | ffestp_file.write.write_spec[ffestb_local_.write.ix].value_is_label | |
16110 | = ffestb_local_.write.label; | |
16111 | ffestp_file.write.write_spec[ffestb_local_.write.ix].kw | |
16112 | = ffelex_token_use (t); | |
16113 | return (ffelexHandler) ffestb_R9108_; | |
16114 | ||
16115 | default: | |
16116 | break; | |
16117 | } | |
16118 | ||
16119 | bad: /* :::::::::::::::::::: */ | |
16120 | ffestb_subr_kill_write_ (); | |
16121 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16122 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16123 | } | |
16124 | ||
16125 | /* ffestb_R9108_ -- "WRITE" OPEN_PAREN [external-file-unit COMMA [format | |
16126 | COMMA]] NAME | |
16127 | ||
16128 | return ffestb_R9108_; // to lexer | |
16129 | ||
16130 | Make sure EQUALS here, send next token to expression handler. */ | |
16131 | ||
16132 | static ffelexHandler | |
16133 | ffestb_R9108_ (ffelexToken t) | |
16134 | { | |
16135 | switch (ffelex_token_type (t)) | |
16136 | { | |
16137 | case FFELEX_typeEQUALS: | |
16138 | ffesta_confirmed (); | |
16139 | if (ffestb_local_.write.label) | |
16140 | return (ffelexHandler) ffestb_R91010_; | |
16141 | if (ffestb_local_.write.left) | |
16142 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
16143 | ffestb_local_.write.context, | |
16144 | (ffeexprCallback) ffestb_R9109_); | |
16145 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16146 | ffestb_local_.write.context, | |
16147 | (ffeexprCallback) ffestb_R9109_); | |
16148 | ||
16149 | default: | |
16150 | break; | |
16151 | } | |
16152 | ||
16153 | ffestb_subr_kill_write_ (); | |
16154 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16155 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16156 | } | |
16157 | ||
16158 | /* ffestb_R9109_ -- "WRITE" OPEN_PAREN ... NAME EQUALS expr | |
16159 | ||
16160 | (ffestb_R9109_) // to expression handler | |
16161 | ||
16162 | Handle COMMA or CLOSE_PAREN here. */ | |
16163 | ||
16164 | static ffelexHandler | |
16165 | ffestb_R9109_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
16166 | { | |
16167 | switch (ffelex_token_type (t)) | |
16168 | { | |
16169 | case FFELEX_typeCOMMA: | |
16170 | case FFELEX_typeCLOSE_PAREN: | |
16171 | if (expr == NULL) | |
16172 | if (ffestb_local_.write.context == FFEEXPR_contextFILEFORMAT) | |
16173 | ffestp_file.write.write_spec[ffestb_local_.write.ix] | |
16174 | .value_is_label = TRUE; | |
16175 | else | |
16176 | break; | |
16177 | ffestp_file.write.write_spec[ffestb_local_.write.ix].value_present | |
16178 | = TRUE; | |
16179 | ffestp_file.write.write_spec[ffestb_local_.write.ix].value | |
16180 | = ffelex_token_use (ft); | |
16181 | ffestp_file.write.write_spec[ffestb_local_.write.ix].u.expr = expr; | |
16182 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
16183 | return (ffelexHandler) ffestb_R9107_; | |
16184 | return (ffelexHandler) ffestb_R91012_; | |
16185 | ||
16186 | default: | |
16187 | break; | |
16188 | } | |
16189 | ||
16190 | ffestb_subr_kill_write_ (); | |
16191 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16192 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16193 | } | |
16194 | ||
16195 | /* ffestb_R91010_ -- "WRITE" OPEN_PAREN ... NAME EQUALS | |
16196 | ||
16197 | return ffestb_R91010_; // to lexer | |
16198 | ||
16199 | Handle NUMBER for label here. */ | |
16200 | ||
16201 | static ffelexHandler | |
16202 | ffestb_R91010_ (ffelexToken t) | |
16203 | { | |
16204 | switch (ffelex_token_type (t)) | |
16205 | { | |
16206 | case FFELEX_typeNUMBER: | |
16207 | ffestp_file.write.write_spec[ffestb_local_.write.ix].value_present | |
16208 | = TRUE; | |
16209 | ffestp_file.write.write_spec[ffestb_local_.write.ix].value | |
16210 | = ffelex_token_use (t); | |
16211 | return (ffelexHandler) ffestb_R91011_; | |
16212 | ||
16213 | default: | |
16214 | break; | |
16215 | } | |
16216 | ||
16217 | ffestb_subr_kill_write_ (); | |
16218 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16219 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16220 | } | |
16221 | ||
16222 | /* ffestb_R91011_ -- "WRITE" OPEN_PAREN ... NAME EQUALS NUMBER | |
16223 | ||
16224 | return ffestb_R91011_; // to lexer | |
16225 | ||
16226 | Handle COMMA or CLOSE_PAREN here. */ | |
16227 | ||
16228 | static ffelexHandler | |
16229 | ffestb_R91011_ (ffelexToken t) | |
16230 | { | |
16231 | switch (ffelex_token_type (t)) | |
16232 | { | |
16233 | case FFELEX_typeCOMMA: | |
16234 | return (ffelexHandler) ffestb_R9107_; | |
16235 | ||
16236 | case FFELEX_typeCLOSE_PAREN: | |
16237 | return (ffelexHandler) ffestb_R91012_; | |
16238 | ||
16239 | default: | |
16240 | break; | |
16241 | } | |
16242 | ||
16243 | ffestb_subr_kill_write_ (); | |
16244 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16245 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16246 | } | |
16247 | ||
16248 | /* ffestb_R91012_ -- "WRITE" OPEN_PAREN ... CLOSE_PAREN | |
16249 | ||
16250 | return ffestb_R91012_; // to lexer | |
16251 | ||
16252 | Handle EOS or SEMICOLON here. */ | |
16253 | ||
16254 | static ffelexHandler | |
16255 | ffestb_R91012_ (ffelexToken t) | |
16256 | { | |
16257 | switch (ffelex_token_type (t)) | |
16258 | { | |
16259 | case FFELEX_typeEOS: | |
16260 | case FFELEX_typeSEMICOLON: | |
16261 | ffesta_confirmed (); | |
16262 | if (!ffesta_is_inhibited ()) | |
16263 | { | |
16264 | ffestc_R910_start (); | |
16265 | ffestc_R910_finish (); | |
16266 | } | |
16267 | ffestb_subr_kill_write_ (); | |
16268 | return (ffelexHandler) ffesta_zero (t); | |
16269 | ||
16270 | default: | |
16271 | ffesta_confirmed (); | |
16272 | /* Fall through. */ | |
16273 | case FFELEX_typeOPEN_PAREN: /* Could still be assignment!! */ | |
16274 | ||
16275 | /* EXTENSION: Allow an optional preceding COMMA here if not pedantic. | |
16276 | (f2c provides this extension, as do other compilers, supposedly.) */ | |
16277 | ||
16278 | if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA)) | |
16279 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16280 | ffestc_context_iolist (), (ffeexprCallback) ffestb_R91013_); | |
16281 | ||
16282 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16283 | ffestc_context_iolist (), (ffeexprCallback) ffestb_R91013_))) | |
16284 | (t); | |
16285 | ||
16286 | case FFELEX_typeEQUALS: | |
16287 | case FFELEX_typePOINTS: | |
16288 | break; | |
16289 | } | |
16290 | ||
16291 | ffestb_subr_kill_write_ (); | |
16292 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16293 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16294 | } | |
16295 | ||
16296 | /* ffestb_R91013_ -- "WRITE(...)" expr | |
16297 | ||
16298 | (ffestb_R91013_) // to expression handler | |
16299 | ||
16300 | Handle COMMA or EOS/SEMICOLON here. */ | |
16301 | ||
16302 | static ffelexHandler | |
16303 | ffestb_R91013_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
16304 | { | |
16305 | switch (ffelex_token_type (t)) | |
16306 | { | |
16307 | case FFELEX_typeCOMMA: | |
16308 | if (expr == NULL) | |
16309 | break; | |
16310 | ||
16311 | ffesta_confirmed (); | |
16312 | if (!ffesta_is_inhibited ()) | |
16313 | ffestc_R910_start (); | |
16314 | ffestb_subr_kill_write_ (); | |
16315 | ||
16316 | if (!ffesta_is_inhibited ()) | |
16317 | ffestc_R910_item (expr, ft); | |
16318 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16319 | ffestc_context_iolist (), (ffeexprCallback) ffestb_R91014_); | |
16320 | ||
16321 | case FFELEX_typeEOS: | |
16322 | case FFELEX_typeSEMICOLON: | |
16323 | if (expr == NULL) | |
16324 | break; | |
16325 | ||
16326 | ffesta_confirmed (); | |
16327 | if (!ffesta_is_inhibited ()) | |
16328 | ffestc_R910_start (); | |
16329 | ffestb_subr_kill_write_ (); | |
16330 | ||
16331 | if (!ffesta_is_inhibited ()) | |
16332 | { | |
16333 | ffestc_R910_item (expr, ft); | |
16334 | ffestc_R910_finish (); | |
16335 | } | |
16336 | return (ffelexHandler) ffesta_zero (t); | |
16337 | ||
16338 | default: | |
16339 | break; | |
16340 | } | |
16341 | ||
16342 | ffestb_subr_kill_write_ (); | |
16343 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16344 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16345 | } | |
16346 | ||
16347 | /* ffestb_R91014_ -- "WRITE(...)" expr COMMA expr | |
16348 | ||
16349 | (ffestb_R91014_) // to expression handler | |
16350 | ||
16351 | Handle COMMA or EOS/SEMICOLON here. */ | |
16352 | ||
16353 | static ffelexHandler | |
16354 | ffestb_R91014_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
16355 | { | |
16356 | switch (ffelex_token_type (t)) | |
16357 | { | |
16358 | case FFELEX_typeCOMMA: | |
16359 | if (expr == NULL) | |
16360 | break; | |
16361 | if (!ffesta_is_inhibited ()) | |
16362 | ffestc_R910_item (expr, ft); | |
16363 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16364 | ffestc_context_iolist (), (ffeexprCallback) ffestb_R91014_); | |
16365 | ||
16366 | case FFELEX_typeEOS: | |
16367 | case FFELEX_typeSEMICOLON: | |
16368 | if (expr == NULL) | |
16369 | break; | |
16370 | if (!ffesta_is_inhibited ()) | |
16371 | { | |
16372 | ffestc_R910_item (expr, ft); | |
16373 | ffestc_R910_finish (); | |
16374 | } | |
16375 | return (ffelexHandler) ffesta_zero (t); | |
16376 | ||
16377 | default: | |
16378 | break; | |
16379 | } | |
16380 | ||
16381 | if (!ffesta_is_inhibited ()) | |
16382 | ffestc_R910_finish (); | |
16383 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "WRITE", t); | |
16384 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16385 | } | |
16386 | ||
16387 | /* ffestb_R911 -- Parse the PRINT statement | |
16388 | ||
16389 | return ffestb_R911; // to lexer | |
16390 | ||
16391 | Make sure the statement has a valid form for the PRINT | |
16392 | statement. If it does, implement the statement. */ | |
16393 | ||
16394 | ffelexHandler | |
16395 | ffestb_R911 (ffelexToken t) | |
16396 | { | |
16397 | ffelexHandler next; | |
16398 | ffestpPrintIx ix; | |
16399 | ||
16400 | switch (ffelex_token_type (ffesta_tokens[0])) | |
16401 | { | |
16402 | case FFELEX_typeNAME: | |
16403 | if (ffesta_first_kw != FFESTR_firstPRINT) | |
16404 | goto bad_0; /* :::::::::::::::::::: */ | |
16405 | switch (ffelex_token_type (t)) | |
16406 | { | |
16407 | case FFELEX_typeCOMMA: | |
16408 | case FFELEX_typeCOLONCOLON: | |
16409 | case FFELEX_typeEOS: | |
16410 | case FFELEX_typeSEMICOLON: | |
16411 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
16412 | goto bad_1; /* :::::::::::::::::::: */ | |
16413 | ||
16414 | case FFELEX_typeEQUALS: | |
16415 | case FFELEX_typePOINTS: | |
16416 | case FFELEX_typeCOLON: | |
16417 | goto bad_1; /* :::::::::::::::::::: */ | |
16418 | ||
16419 | case FFELEX_typeNAME: | |
16420 | case FFELEX_typeNUMBER: | |
16421 | ffesta_confirmed (); | |
16422 | break; | |
16423 | ||
16424 | default: | |
16425 | break; | |
16426 | } | |
16427 | ||
16428 | for (ix = 0; ix < FFESTP_printix; ++ix) | |
16429 | ffestp_file.print.print_spec[ix].kw_or_val_present = FALSE; | |
16430 | return (ffelexHandler) (*((ffelexHandler) | |
16431 | ffeexpr_rhs (ffesta_output_pool, | |
16432 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9111_))) | |
16433 | (t); | |
16434 | ||
16435 | case FFELEX_typeNAMES: | |
16436 | if (ffesta_first_kw != FFESTR_firstPRINT) | |
16437 | goto bad_0; /* :::::::::::::::::::: */ | |
16438 | switch (ffelex_token_type (t)) | |
16439 | { | |
16440 | case FFELEX_typeEOS: | |
16441 | case FFELEX_typeSEMICOLON: | |
16442 | case FFELEX_typeCOMMA: | |
16443 | ffesta_confirmed (); | |
16444 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlPRINT) | |
16445 | break; | |
16446 | goto bad_1; /* :::::::::::::::::::: */ | |
16447 | ||
16448 | case FFELEX_typeCOLONCOLON: | |
16449 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
16450 | goto bad_1; /* :::::::::::::::::::: */ | |
16451 | ||
16452 | case FFELEX_typeEQUALS: | |
16453 | case FFELEX_typePOINTS: | |
16454 | case FFELEX_typeCOLON: | |
16455 | goto bad_1; /* :::::::::::::::::::: */ | |
16456 | ||
16457 | default: | |
16458 | break; | |
16459 | } | |
16460 | for (ix = 0; ix < FFESTP_printix; ++ix) | |
16461 | ffestp_file.print.print_spec[ix].kw_or_val_present = FALSE; | |
16462 | next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16463 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_R9111_); | |
16464 | next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0], | |
16465 | FFESTR_firstlPRINT); | |
16466 | if (next == NULL) | |
16467 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
16468 | (ffelexHandler) ffesta_zero); | |
16469 | return (ffelexHandler) (*next) (t); | |
16470 | ||
16471 | default: | |
16472 | goto bad_0; /* :::::::::::::::::::: */ | |
16473 | } | |
16474 | ||
16475 | bad_0: /* :::::::::::::::::::: */ | |
16476 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", ffesta_tokens[0]); | |
16477 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16478 | ||
16479 | bad_1: /* :::::::::::::::::::: */ | |
16480 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t); | |
16481 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
16482 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
16483 | } | |
16484 | ||
16485 | /* ffestb_R9111_ -- "PRINT" expr | |
16486 | ||
16487 | (ffestb_R9111_) // to expression handler | |
16488 | ||
16489 | Make sure the next token is a COMMA or EOS/SEMICOLON. */ | |
16490 | ||
16491 | static ffelexHandler | |
16492 | ffestb_R9111_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
16493 | { | |
16494 | switch (ffelex_token_type (t)) | |
16495 | { | |
16496 | case FFELEX_typeEOS: | |
16497 | case FFELEX_typeSEMICOLON: | |
16498 | case FFELEX_typeCOMMA: | |
16499 | ffesta_confirmed (); | |
16500 | ffestp_file.print.print_spec[FFESTP_printixFORMAT].kw_or_val_present | |
16501 | = TRUE; | |
16502 | ffestp_file.print.print_spec[FFESTP_printixFORMAT].kw_present = FALSE; | |
16503 | ffestp_file.print.print_spec[FFESTP_printixFORMAT].value_present = TRUE; | |
16504 | ffestp_file.print.print_spec[FFESTP_printixFORMAT].value_is_label | |
16505 | = (expr == NULL); | |
16506 | ffestp_file.print.print_spec[FFESTP_printixFORMAT].value | |
16507 | = ffelex_token_use (ft); | |
16508 | ffestp_file.print.print_spec[FFESTP_printixFORMAT].u.expr = expr; | |
16509 | if (!ffesta_is_inhibited ()) | |
16510 | ffestc_R911_start (); | |
16511 | ffestb_subr_kill_print_ (); | |
16512 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
16513 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16514 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R9112_); | |
16515 | if (!ffesta_is_inhibited ()) | |
16516 | ffestc_R911_finish (); | |
16517 | return (ffelexHandler) ffesta_zero (t); | |
16518 | ||
16519 | default: | |
16520 | break; | |
16521 | } | |
16522 | ||
16523 | ffestb_subr_kill_print_ (); | |
16524 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t); | |
16525 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16526 | } | |
16527 | ||
16528 | /* ffestb_R9112_ -- "PRINT" expr COMMA expr | |
16529 | ||
16530 | (ffestb_R9112_) // to expression handler | |
16531 | ||
16532 | Handle COMMA or EOS/SEMICOLON here. */ | |
16533 | ||
16534 | static ffelexHandler | |
16535 | ffestb_R9112_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
16536 | { | |
16537 | switch (ffelex_token_type (t)) | |
16538 | { | |
16539 | case FFELEX_typeCOMMA: | |
16540 | if (expr == NULL) | |
16541 | break; | |
16542 | if (!ffesta_is_inhibited ()) | |
16543 | ffestc_R911_item (expr, ft); | |
16544 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16545 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R9112_); | |
16546 | ||
16547 | case FFELEX_typeEOS: | |
16548 | case FFELEX_typeSEMICOLON: | |
16549 | if (expr == NULL) | |
16550 | break; | |
16551 | if (!ffesta_is_inhibited ()) | |
16552 | { | |
16553 | ffestc_R911_item (expr, ft); | |
16554 | ffestc_R911_finish (); | |
16555 | } | |
16556 | return (ffelexHandler) ffesta_zero (t); | |
16557 | ||
16558 | default: | |
16559 | break; | |
16560 | } | |
16561 | ||
16562 | if (!ffesta_is_inhibited ()) | |
16563 | ffestc_R911_finish (); | |
16564 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PRINT", t); | |
16565 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16566 | } | |
16567 | ||
16568 | /* ffestb_R923 -- Parse an INQUIRE statement | |
16569 | ||
16570 | return ffestb_R923; // to lexer | |
16571 | ||
16572 | Make sure the statement has a valid form for an INQUIRE statement. | |
16573 | If it does, implement the statement. */ | |
16574 | ||
16575 | ffelexHandler | |
16576 | ffestb_R923 (ffelexToken t) | |
16577 | { | |
16578 | ffestpInquireIx ix; | |
16579 | ||
16580 | switch (ffelex_token_type (ffesta_tokens[0])) | |
16581 | { | |
16582 | case FFELEX_typeNAME: | |
16583 | if (ffesta_first_kw != FFESTR_firstINQUIRE) | |
16584 | goto bad_0; /* :::::::::::::::::::: */ | |
16585 | break; | |
16586 | ||
16587 | case FFELEX_typeNAMES: | |
16588 | if (ffesta_first_kw != FFESTR_firstINQUIRE) | |
16589 | goto bad_0; /* :::::::::::::::::::: */ | |
16590 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlINQUIRE) | |
16591 | goto bad_0; /* :::::::::::::::::::: */ | |
16592 | break; | |
16593 | ||
16594 | default: | |
16595 | goto bad_0; /* :::::::::::::::::::: */ | |
16596 | } | |
16597 | ||
16598 | switch (ffelex_token_type (t)) | |
16599 | { | |
16600 | case FFELEX_typeOPEN_PAREN: | |
16601 | break; | |
16602 | ||
16603 | case FFELEX_typeEOS: | |
16604 | case FFELEX_typeSEMICOLON: | |
16605 | case FFELEX_typeCOMMA: | |
16606 | case FFELEX_typeCOLONCOLON: | |
16607 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
16608 | goto bad_1; /* :::::::::::::::::::: */ | |
16609 | ||
16610 | default: | |
16611 | goto bad_1; /* :::::::::::::::::::: */ | |
16612 | } | |
16613 | ||
16614 | for (ix = 0; ix < FFESTP_inquireix; ++ix) | |
16615 | ffestp_file.inquire.inquire_spec[ix].kw_or_val_present = FALSE; | |
16616 | ||
16617 | ffestb_local_.inquire.may_be_iolength = TRUE; | |
16618 | return (ffelexHandler) ffestb_R9231_; | |
16619 | ||
16620 | bad_0: /* :::::::::::::::::::: */ | |
16621 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", ffesta_tokens[0]); | |
16622 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16623 | ||
16624 | bad_1: /* :::::::::::::::::::: */ | |
16625 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
16626 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
16627 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
16628 | } | |
16629 | ||
16630 | /* ffestb_R9231_ -- "INQUIRE" OPEN_PAREN | |
16631 | ||
16632 | return ffestb_R9231_; // to lexer | |
16633 | ||
16634 | Handle expr construct (not NAME=expr construct) here. */ | |
16635 | ||
16636 | static ffelexHandler | |
16637 | ffestb_R9231_ (ffelexToken t) | |
16638 | { | |
16639 | switch (ffelex_token_type (t)) | |
16640 | { | |
16641 | case FFELEX_typeNAME: | |
16642 | ffesta_tokens[1] = ffelex_token_use (t); | |
16643 | return (ffelexHandler) ffestb_R9232_; | |
16644 | ||
16645 | default: | |
16646 | ffestb_local_.inquire.may_be_iolength = FALSE; | |
16647 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16648 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9233_))) | |
16649 | (t); | |
16650 | } | |
16651 | } | |
16652 | ||
16653 | /* ffestb_R9232_ -- "INQUIRE" OPEN_PAREN NAME | |
16654 | ||
16655 | return ffestb_R9232_; // to lexer | |
16656 | ||
16657 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
16658 | token thru expression handler. */ | |
16659 | ||
16660 | static ffelexHandler | |
16661 | ffestb_R9232_ (ffelexToken t) | |
16662 | { | |
16663 | ffelexHandler next; | |
16664 | ffelexToken nt; | |
16665 | ||
16666 | switch (ffelex_token_type (t)) | |
16667 | { | |
16668 | case FFELEX_typeEQUALS: | |
16669 | nt = ffesta_tokens[1]; | |
16670 | next = (ffelexHandler) ffestb_R9234_ (nt); | |
16671 | ffelex_token_kill (nt); | |
16672 | return (ffelexHandler) (*next) (t); | |
16673 | ||
16674 | default: | |
16675 | ffestb_local_.inquire.may_be_iolength = FALSE; | |
16676 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16677 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_R9233_))) | |
16678 | (ffesta_tokens[1]); | |
16679 | ffelex_token_kill (ffesta_tokens[1]); | |
16680 | return (ffelexHandler) (*next) (t); | |
16681 | } | |
16682 | } | |
16683 | ||
16684 | /* ffestb_R9233_ -- "INQUIRE" OPEN_PAREN expr | |
16685 | ||
16686 | (ffestb_R9233_) // to expression handler | |
16687 | ||
16688 | Handle COMMA or CLOSE_PAREN here. */ | |
16689 | ||
16690 | static ffelexHandler | |
16691 | ffestb_R9233_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
16692 | { | |
16693 | switch (ffelex_token_type (t)) | |
16694 | { | |
16695 | case FFELEX_typeCOMMA: | |
16696 | case FFELEX_typeCLOSE_PAREN: | |
16697 | if (expr == NULL) | |
16698 | break; | |
16699 | ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].kw_or_val_present | |
16700 | = TRUE; | |
16701 | ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].kw_present = FALSE; | |
16702 | ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value_present = TRUE; | |
16703 | ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value_is_label | |
16704 | = FALSE; | |
16705 | ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].value | |
16706 | = ffelex_token_use (ft); | |
16707 | ffestp_file.inquire.inquire_spec[FFESTP_inquireixUNIT].u.expr = expr; | |
16708 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
16709 | return (ffelexHandler) ffestb_R9234_; | |
16710 | return (ffelexHandler) ffestb_R9239_; | |
16711 | ||
16712 | default: | |
16713 | break; | |
16714 | } | |
16715 | ||
16716 | ffestb_subr_kill_inquire_ (); | |
16717 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
16718 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16719 | } | |
16720 | ||
16721 | /* ffestb_R9234_ -- "INQUIRE" OPEN_PAREN [external-file-unit COMMA] | |
16722 | ||
16723 | return ffestb_R9234_; // to lexer | |
16724 | ||
16725 | Handle expr construct (not NAME=expr construct) here. */ | |
16726 | ||
16727 | static ffelexHandler | |
16728 | ffestb_R9234_ (ffelexToken t) | |
16729 | { | |
16730 | ffestrInquire kw; | |
16731 | ||
16732 | ffestb_local_.inquire.label = FALSE; | |
16733 | ||
16734 | switch (ffelex_token_type (t)) | |
16735 | { | |
16736 | case FFELEX_typeNAME: | |
16737 | kw = ffestr_inquire (t); | |
16738 | if (kw != FFESTR_inquireIOLENGTH) | |
16739 | ffestb_local_.inquire.may_be_iolength = FALSE; | |
16740 | switch (kw) | |
16741 | { | |
16742 | case FFESTR_inquireACCESS: | |
16743 | ffestb_local_.inquire.ix = FFESTP_inquireixACCESS; | |
16744 | ffestb_local_.inquire.left = TRUE; | |
16745 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16746 | break; | |
16747 | ||
16748 | case FFESTR_inquireACTION: | |
16749 | ffestb_local_.inquire.ix = FFESTP_inquireixACTION; | |
16750 | ffestb_local_.inquire.left = TRUE; | |
16751 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16752 | break; | |
16753 | ||
16754 | case FFESTR_inquireBLANK: | |
16755 | ffestb_local_.inquire.ix = FFESTP_inquireixBLANK; | |
16756 | ffestb_local_.inquire.left = TRUE; | |
16757 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16758 | break; | |
16759 | ||
16760 | case FFESTR_inquireCARRIAGECONTROL: | |
16761 | ffestb_local_.inquire.ix = FFESTP_inquireixCARRIAGECONTROL; | |
16762 | ffestb_local_.inquire.left = TRUE; | |
16763 | ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR; | |
16764 | break; | |
16765 | ||
16766 | case FFESTR_inquireDEFAULTFILE: | |
16767 | ffestb_local_.inquire.ix = FFESTP_inquireixDEFAULTFILE; | |
16768 | ffestb_local_.inquire.left = FALSE; | |
16769 | ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR; | |
16770 | break; | |
16771 | ||
16772 | case FFESTR_inquireDELIM: | |
16773 | ffestb_local_.inquire.ix = FFESTP_inquireixDELIM; | |
16774 | ffestb_local_.inquire.left = TRUE; | |
16775 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16776 | break; | |
16777 | ||
16778 | case FFESTR_inquireDIRECT: | |
16779 | ffestb_local_.inquire.ix = FFESTP_inquireixDIRECT; | |
16780 | ffestb_local_.inquire.left = TRUE; | |
16781 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16782 | break; | |
16783 | ||
16784 | case FFESTR_inquireERR: | |
16785 | ffestb_local_.inquire.ix = FFESTP_inquireixERR; | |
16786 | ffestb_local_.inquire.label = TRUE; | |
16787 | break; | |
16788 | ||
16789 | case FFESTR_inquireEXIST: | |
16790 | ffestb_local_.inquire.ix = FFESTP_inquireixEXIST; | |
16791 | ffestb_local_.inquire.left = TRUE; | |
16792 | ffestb_local_.inquire.context = FFEEXPR_contextFILELOG; | |
16793 | break; | |
16794 | ||
16795 | case FFESTR_inquireFILE: | |
16796 | ffestb_local_.inquire.ix = FFESTP_inquireixFILE; | |
16797 | ffestb_local_.inquire.left = FALSE; | |
16798 | ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR; | |
16799 | break; | |
16800 | ||
16801 | case FFESTR_inquireFORM: | |
16802 | ffestb_local_.inquire.ix = FFESTP_inquireixFORM; | |
16803 | ffestb_local_.inquire.left = TRUE; | |
16804 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16805 | break; | |
16806 | ||
16807 | case FFESTR_inquireFORMATTED: | |
16808 | ffestb_local_.inquire.ix = FFESTP_inquireixFORMATTED; | |
16809 | ffestb_local_.inquire.left = TRUE; | |
16810 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16811 | break; | |
16812 | ||
16813 | case FFESTR_inquireIOLENGTH: | |
16814 | if (!ffestb_local_.inquire.may_be_iolength) | |
16815 | goto bad; /* :::::::::::::::::::: */ | |
16816 | ffestb_local_.inquire.ix = FFESTP_inquireixIOLENGTH; | |
16817 | ffestb_local_.inquire.left = TRUE; | |
16818 | ffestb_local_.inquire.context = FFEEXPR_contextFILEINT; | |
16819 | break; | |
16820 | ||
16821 | case FFESTR_inquireIOSTAT: | |
16822 | ffestb_local_.inquire.ix = FFESTP_inquireixIOSTAT; | |
16823 | ffestb_local_.inquire.left = TRUE; | |
16824 | ffestb_local_.inquire.context = FFEEXPR_contextFILEINT; | |
16825 | break; | |
16826 | ||
16827 | case FFESTR_inquireKEYED: | |
16828 | ffestb_local_.inquire.ix = FFESTP_inquireixKEYED; | |
16829 | ffestb_local_.inquire.left = TRUE; | |
16830 | ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR; | |
16831 | break; | |
16832 | ||
16833 | case FFESTR_inquireNAME: | |
16834 | ffestb_local_.inquire.ix = FFESTP_inquireixNAME; | |
16835 | ffestb_local_.inquire.left = TRUE; | |
16836 | ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR; | |
16837 | break; | |
16838 | ||
16839 | case FFESTR_inquireNAMED: | |
16840 | ffestb_local_.inquire.ix = FFESTP_inquireixNAMED; | |
16841 | ffestb_local_.inquire.left = TRUE; | |
16842 | ffestb_local_.inquire.context = FFEEXPR_contextFILELOG; | |
16843 | break; | |
16844 | ||
16845 | case FFESTR_inquireNEXTREC: | |
16846 | ffestb_local_.inquire.ix = FFESTP_inquireixNEXTREC; | |
16847 | ffestb_local_.inquire.left = TRUE; | |
16848 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFINT; | |
16849 | break; | |
16850 | ||
16851 | case FFESTR_inquireNUMBER: | |
16852 | ffestb_local_.inquire.ix = FFESTP_inquireixNUMBER; | |
16853 | ffestb_local_.inquire.left = TRUE; | |
16854 | ffestb_local_.inquire.context = FFEEXPR_contextFILEINT; | |
16855 | break; | |
16856 | ||
16857 | case FFESTR_inquireOPENED: | |
16858 | ffestb_local_.inquire.ix = FFESTP_inquireixOPENED; | |
16859 | ffestb_local_.inquire.left = TRUE; | |
16860 | ffestb_local_.inquire.context = FFEEXPR_contextFILELOG; | |
16861 | break; | |
16862 | ||
16863 | case FFESTR_inquireORGANIZATION: | |
16864 | ffestb_local_.inquire.ix = FFESTP_inquireixORGANIZATION; | |
16865 | ffestb_local_.inquire.left = TRUE; | |
16866 | ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR; | |
16867 | break; | |
16868 | ||
16869 | case FFESTR_inquirePAD: | |
16870 | ffestb_local_.inquire.ix = FFESTP_inquireixPAD; | |
16871 | ffestb_local_.inquire.left = TRUE; | |
16872 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16873 | break; | |
16874 | ||
16875 | case FFESTR_inquirePOSITION: | |
16876 | ffestb_local_.inquire.ix = FFESTP_inquireixPOSITION; | |
16877 | ffestb_local_.inquire.left = TRUE; | |
16878 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16879 | break; | |
16880 | ||
16881 | case FFESTR_inquireREAD: | |
16882 | ffestb_local_.inquire.ix = FFESTP_inquireixREAD; | |
16883 | ffestb_local_.inquire.left = TRUE; | |
16884 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16885 | break; | |
16886 | ||
16887 | case FFESTR_inquireREADWRITE: | |
16888 | ffestb_local_.inquire.ix = FFESTP_inquireixREADWRITE; | |
16889 | ffestb_local_.inquire.left = TRUE; | |
16890 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16891 | break; | |
16892 | ||
16893 | case FFESTR_inquireRECL: | |
16894 | ffestb_local_.inquire.ix = FFESTP_inquireixRECL; | |
16895 | ffestb_local_.inquire.left = TRUE; | |
16896 | ffestb_local_.inquire.context = FFEEXPR_contextFILEINT; | |
16897 | break; | |
16898 | ||
16899 | case FFESTR_inquireRECORDTYPE: | |
16900 | ffestb_local_.inquire.ix = FFESTP_inquireixRECORDTYPE; | |
16901 | ffestb_local_.inquire.left = TRUE; | |
16902 | ffestb_local_.inquire.context = FFEEXPR_contextFILECHAR; | |
16903 | break; | |
16904 | ||
16905 | case FFESTR_inquireSEQUENTIAL: | |
16906 | ffestb_local_.inquire.ix = FFESTP_inquireixSEQUENTIAL; | |
16907 | ffestb_local_.inquire.left = TRUE; | |
16908 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16909 | break; | |
16910 | ||
16911 | case FFESTR_inquireUNFORMATTED: | |
16912 | ffestb_local_.inquire.ix = FFESTP_inquireixUNFORMATTED; | |
16913 | ffestb_local_.inquire.left = TRUE; | |
16914 | ffestb_local_.inquire.context = FFEEXPR_contextFILEDFCHAR; | |
16915 | break; | |
16916 | ||
16917 | case FFESTR_inquireUNIT: | |
16918 | ffestb_local_.inquire.ix = FFESTP_inquireixUNIT; | |
16919 | ffestb_local_.inquire.left = FALSE; | |
16920 | ffestb_local_.inquire.context = FFEEXPR_contextFILENUM; | |
16921 | break; | |
16922 | ||
16923 | default: | |
16924 | goto bad; /* :::::::::::::::::::: */ | |
16925 | } | |
16926 | if (ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix] | |
16927 | .kw_or_val_present) | |
16928 | break; /* Can't specify a keyword twice! */ | |
16929 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix] | |
16930 | .kw_or_val_present = TRUE; | |
16931 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix] | |
16932 | .kw_present = TRUE; | |
16933 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix] | |
16934 | .value_present = FALSE; | |
16935 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_is_label | |
16936 | = ffestb_local_.inquire.label; | |
16937 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].kw | |
16938 | = ffelex_token_use (t); | |
16939 | return (ffelexHandler) ffestb_R9235_; | |
16940 | ||
16941 | default: | |
16942 | break; | |
16943 | } | |
16944 | ||
16945 | bad: /* :::::::::::::::::::: */ | |
16946 | ffestb_subr_kill_inquire_ (); | |
16947 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
16948 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16949 | } | |
16950 | ||
16951 | /* ffestb_R9235_ -- "INQUIRE" OPEN_PAREN [external-file-unit COMMA] NAME | |
16952 | ||
16953 | return ffestb_R9235_; // to lexer | |
16954 | ||
16955 | Make sure EQUALS here, send next token to expression handler. */ | |
16956 | ||
16957 | static ffelexHandler | |
16958 | ffestb_R9235_ (ffelexToken t) | |
16959 | { | |
16960 | switch (ffelex_token_type (t)) | |
16961 | { | |
16962 | case FFELEX_typeEQUALS: | |
16963 | ffesta_confirmed (); | |
16964 | if (ffestb_local_.inquire.label) | |
16965 | return (ffelexHandler) ffestb_R9237_; | |
16966 | if (ffestb_local_.inquire.left) | |
16967 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
16968 | ffestb_local_.inquire.context, | |
16969 | (ffeexprCallback) ffestb_R9236_); | |
16970 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
16971 | ffestb_local_.inquire.context, | |
16972 | (ffeexprCallback) ffestb_R9236_); | |
16973 | ||
16974 | default: | |
16975 | break; | |
16976 | } | |
16977 | ||
16978 | ffestb_subr_kill_inquire_ (); | |
16979 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
16980 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
16981 | } | |
16982 | ||
16983 | /* ffestb_R9236_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS expr | |
16984 | ||
16985 | (ffestb_R9236_) // to expression handler | |
16986 | ||
16987 | Handle COMMA or CLOSE_PAREN here. */ | |
16988 | ||
16989 | static ffelexHandler | |
16990 | ffestb_R9236_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
16991 | { | |
16992 | switch (ffelex_token_type (t)) | |
16993 | { | |
16994 | case FFELEX_typeCOMMA: | |
16995 | if (ffestb_local_.inquire.ix == FFESTP_inquireixIOLENGTH) | |
16996 | break; /* IOLENGTH=expr must be followed by | |
16997 | CLOSE_PAREN. */ | |
16998 | /* Fall through. */ | |
16999 | case FFELEX_typeCLOSE_PAREN: | |
17000 | if (expr == NULL) | |
17001 | break; | |
17002 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_present | |
17003 | = TRUE; | |
17004 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value | |
17005 | = ffelex_token_use (ft); | |
17006 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].u.expr = expr; | |
17007 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
17008 | return (ffelexHandler) ffestb_R9234_; | |
17009 | if (ffestb_local_.inquire.ix == FFESTP_inquireixIOLENGTH) | |
17010 | return (ffelexHandler) ffestb_R92310_; | |
17011 | return (ffelexHandler) ffestb_R9239_; | |
17012 | ||
17013 | default: | |
17014 | break; | |
17015 | } | |
17016 | ||
17017 | ffestb_subr_kill_inquire_ (); | |
17018 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
17019 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17020 | } | |
17021 | ||
17022 | /* ffestb_R9237_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS | |
17023 | ||
17024 | return ffestb_R9237_; // to lexer | |
17025 | ||
17026 | Handle NUMBER for label here. */ | |
17027 | ||
17028 | static ffelexHandler | |
17029 | ffestb_R9237_ (ffelexToken t) | |
17030 | { | |
17031 | switch (ffelex_token_type (t)) | |
17032 | { | |
17033 | case FFELEX_typeNUMBER: | |
17034 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value_present | |
17035 | = TRUE; | |
17036 | ffestp_file.inquire.inquire_spec[ffestb_local_.inquire.ix].value | |
17037 | = ffelex_token_use (t); | |
17038 | return (ffelexHandler) ffestb_R9238_; | |
17039 | ||
17040 | default: | |
17041 | break; | |
17042 | } | |
17043 | ||
17044 | ffestb_subr_kill_inquire_ (); | |
17045 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
17046 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17047 | } | |
17048 | ||
17049 | /* ffestb_R9238_ -- "INQUIRE" OPEN_PAREN ... NAME EQUALS NUMBER | |
17050 | ||
17051 | return ffestb_R9238_; // to lexer | |
17052 | ||
17053 | Handle COMMA or CLOSE_PAREN here. */ | |
17054 | ||
17055 | static ffelexHandler | |
17056 | ffestb_R9238_ (ffelexToken t) | |
17057 | { | |
17058 | switch (ffelex_token_type (t)) | |
17059 | { | |
17060 | case FFELEX_typeCOMMA: | |
17061 | return (ffelexHandler) ffestb_R9234_; | |
17062 | ||
17063 | case FFELEX_typeCLOSE_PAREN: | |
17064 | return (ffelexHandler) ffestb_R9239_; | |
17065 | ||
17066 | default: | |
17067 | break; | |
17068 | } | |
17069 | ||
17070 | ffestb_subr_kill_inquire_ (); | |
17071 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
17072 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17073 | } | |
17074 | ||
17075 | /* ffestb_R9239_ -- "INQUIRE" OPEN_PAREN ... CLOSE_PAREN | |
17076 | ||
17077 | return ffestb_R9239_; // to lexer | |
17078 | ||
17079 | Handle EOS or SEMICOLON here. */ | |
17080 | ||
17081 | static ffelexHandler | |
17082 | ffestb_R9239_ (ffelexToken t) | |
17083 | { | |
17084 | switch (ffelex_token_type (t)) | |
17085 | { | |
17086 | case FFELEX_typeEOS: | |
17087 | case FFELEX_typeSEMICOLON: | |
17088 | ffesta_confirmed (); | |
17089 | if (!ffesta_is_inhibited ()) | |
17090 | ffestc_R923A (); | |
17091 | ffestb_subr_kill_inquire_ (); | |
17092 | return (ffelexHandler) ffesta_zero (t); | |
17093 | ||
17094 | default: | |
17095 | break; | |
17096 | } | |
17097 | ||
17098 | ffestb_subr_kill_inquire_ (); | |
17099 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
17100 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17101 | } | |
17102 | ||
17103 | /* ffestb_R92310_ -- "INQUIRE(IOLENGTH=expr)" | |
17104 | ||
17105 | return ffestb_R92310_; // to lexer | |
17106 | ||
17107 | Make sure EOS or SEMICOLON not here; begin R923B processing and expect | |
17108 | output IO list. */ | |
17109 | ||
17110 | static ffelexHandler | |
17111 | ffestb_R92310_ (ffelexToken t) | |
17112 | { | |
17113 | switch (ffelex_token_type (t)) | |
17114 | { | |
17115 | case FFELEX_typeEOS: | |
17116 | case FFELEX_typeSEMICOLON: | |
17117 | break; | |
17118 | ||
17119 | default: | |
17120 | ffesta_confirmed (); | |
17121 | if (!ffesta_is_inhibited ()) | |
17122 | ffestc_R923B_start (); | |
17123 | ffestb_subr_kill_inquire_ (); | |
17124 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17125 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R92311_))) | |
17126 | (t); | |
17127 | } | |
17128 | ||
17129 | ffestb_subr_kill_inquire_ (); | |
17130 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
17131 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17132 | } | |
17133 | ||
17134 | /* ffestb_R92311_ -- "INQUIRE(IOLENGTH=expr)" expr | |
17135 | ||
17136 | (ffestb_R92311_) // to expression handler | |
17137 | ||
17138 | Handle COMMA or EOS/SEMICOLON here. */ | |
17139 | ||
17140 | static ffelexHandler | |
17141 | ffestb_R92311_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
17142 | { | |
17143 | switch (ffelex_token_type (t)) | |
17144 | { | |
17145 | case FFELEX_typeCOMMA: | |
17146 | if (expr == NULL) | |
17147 | break; | |
17148 | if (!ffesta_is_inhibited ()) | |
17149 | ffestc_R923B_item (expr, ft); | |
17150 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17151 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_R92311_); | |
17152 | ||
17153 | case FFELEX_typeEOS: | |
17154 | case FFELEX_typeSEMICOLON: | |
17155 | if (expr == NULL) | |
17156 | break; | |
17157 | if (!ffesta_is_inhibited ()) | |
17158 | { | |
17159 | ffestc_R923B_item (expr, ft); | |
17160 | ffestc_R923B_finish (); | |
17161 | } | |
17162 | return (ffelexHandler) ffesta_zero (t); | |
17163 | ||
17164 | default: | |
17165 | break; | |
17166 | } | |
17167 | ||
17168 | if (!ffesta_is_inhibited ()) | |
17169 | ffestc_R923B_finish (); | |
17170 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "INQUIRE", t); | |
17171 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17172 | } | |
17173 | ||
17174 | /* ffestb_V018 -- Parse the REWRITE statement | |
17175 | ||
17176 | return ffestb_V018; // to lexer | |
17177 | ||
17178 | Make sure the statement has a valid form for the REWRITE | |
17179 | statement. If it does, implement the statement. */ | |
17180 | ||
17181 | #if FFESTR_VXT | |
17182 | ffelexHandler | |
17183 | ffestb_V018 (ffelexToken t) | |
17184 | { | |
17185 | ffestpRewriteIx ix; | |
17186 | ||
17187 | switch (ffelex_token_type (ffesta_tokens[0])) | |
17188 | { | |
17189 | case FFELEX_typeNAME: | |
17190 | if (ffesta_first_kw != FFESTR_firstREWRITE) | |
17191 | goto bad_0; /* :::::::::::::::::::: */ | |
17192 | switch (ffelex_token_type (t)) | |
17193 | { | |
17194 | case FFELEX_typeCOMMA: | |
17195 | case FFELEX_typeCOLONCOLON: | |
17196 | case FFELEX_typeEOS: | |
17197 | case FFELEX_typeSEMICOLON: | |
17198 | case FFELEX_typeNAME: | |
17199 | case FFELEX_typeNUMBER: | |
17200 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
17201 | goto bad_1; /* :::::::::::::::::::: */ | |
17202 | ||
17203 | default: | |
17204 | goto bad_1; /* :::::::::::::::::::: */ | |
17205 | ||
17206 | case FFELEX_typeOPEN_PAREN: | |
17207 | for (ix = 0; ix < FFESTP_rewriteix; ++ix) | |
17208 | ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present = FALSE; | |
17209 | return (ffelexHandler) ffestb_V0181_; | |
17210 | } | |
17211 | ||
17212 | case FFELEX_typeNAMES: | |
17213 | if (ffesta_first_kw != FFESTR_firstREWRITE) | |
17214 | goto bad_0; /* :::::::::::::::::::: */ | |
17215 | switch (ffelex_token_type (t)) | |
17216 | { | |
17217 | case FFELEX_typeEOS: | |
17218 | case FFELEX_typeSEMICOLON: | |
17219 | case FFELEX_typeCOMMA: | |
17220 | case FFELEX_typeCOLONCOLON: | |
17221 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
17222 | goto bad_1; /* :::::::::::::::::::: */ | |
17223 | ||
17224 | default: | |
17225 | goto bad_1; /* :::::::::::::::::::: */ | |
17226 | ||
17227 | case FFELEX_typeOPEN_PAREN: | |
17228 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlREWRITE) | |
17229 | goto bad_0; /* :::::::::::::::::::: */ | |
17230 | ||
17231 | for (ix = 0; ix < FFESTP_rewriteix; ++ix) | |
17232 | ffestp_file.rewrite.rewrite_spec[ix].kw_or_val_present = FALSE; | |
17233 | return (ffelexHandler) ffestb_V0181_; | |
17234 | } | |
17235 | ||
17236 | default: | |
17237 | goto bad_0; /* :::::::::::::::::::: */ | |
17238 | } | |
17239 | ||
17240 | bad_0: /* :::::::::::::::::::: */ | |
17241 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", ffesta_tokens[0]); | |
17242 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17243 | ||
17244 | bad_1: /* :::::::::::::::::::: */ | |
17245 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17246 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
17247 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
17248 | } | |
17249 | ||
17250 | /* ffestb_V0181_ -- "REWRITE" OPEN_PAREN | |
17251 | ||
17252 | return ffestb_V0181_; // to lexer | |
17253 | ||
17254 | Handle expr construct (not NAME=expr construct) here. */ | |
17255 | ||
17256 | static ffelexHandler | |
17257 | ffestb_V0181_ (ffelexToken t) | |
17258 | { | |
17259 | switch (ffelex_token_type (t)) | |
17260 | { | |
17261 | case FFELEX_typeNAME: | |
17262 | ffesta_tokens[1] = ffelex_token_use (t); | |
17263 | return (ffelexHandler) ffestb_V0182_; | |
17264 | ||
17265 | default: | |
17266 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17267 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0183_))) | |
17268 | (t); | |
17269 | } | |
17270 | } | |
17271 | ||
17272 | /* ffestb_V0182_ -- "REWRITE" OPEN_PAREN NAME | |
17273 | ||
17274 | return ffestb_V0182_; // to lexer | |
17275 | ||
17276 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
17277 | token thru expression handler. */ | |
17278 | ||
17279 | static ffelexHandler | |
17280 | ffestb_V0182_ (ffelexToken t) | |
17281 | { | |
17282 | ffelexHandler next; | |
17283 | ffelexToken nt; | |
17284 | ||
17285 | switch (ffelex_token_type (t)) | |
17286 | { | |
17287 | case FFELEX_typeEQUALS: | |
17288 | nt = ffesta_tokens[1]; | |
17289 | next = (ffelexHandler) ffestb_V0187_ (nt); | |
17290 | ffelex_token_kill (nt); | |
17291 | return (ffelexHandler) (*next) (t); | |
17292 | ||
17293 | default: | |
17294 | nt = ffesta_tokens[1]; | |
17295 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17296 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0183_))) | |
17297 | (nt); | |
17298 | ffelex_token_kill (nt); | |
17299 | return (ffelexHandler) (*next) (t); | |
17300 | } | |
17301 | } | |
17302 | ||
17303 | /* ffestb_V0183_ -- "REWRITE" OPEN_PAREN expr [CLOSE_PAREN] | |
17304 | ||
17305 | (ffestb_V0183_) // to expression handler | |
17306 | ||
17307 | Handle COMMA or EOS/SEMICOLON here. */ | |
17308 | ||
17309 | static ffelexHandler | |
17310 | ffestb_V0183_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
17311 | { | |
17312 | switch (ffelex_token_type (t)) | |
17313 | { | |
17314 | case FFELEX_typeCOMMA: | |
17315 | case FFELEX_typeCLOSE_PAREN: | |
17316 | if (expr == NULL) | |
17317 | break; | |
17318 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].kw_or_val_present | |
17319 | = TRUE; | |
17320 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].kw_present = FALSE; | |
17321 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value_present = TRUE; | |
17322 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value_is_label | |
17323 | = FALSE; | |
17324 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].value | |
17325 | = ffelex_token_use (ft); | |
17326 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixUNIT].u.expr = expr; | |
17327 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
17328 | return (ffelexHandler) ffestb_V0184_; | |
17329 | return (ffelexHandler) ffestb_V01812_; | |
17330 | ||
17331 | default: | |
17332 | break; | |
17333 | } | |
17334 | ||
17335 | ffestb_subr_kill_rewrite_ (); | |
17336 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17337 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17338 | } | |
17339 | ||
17340 | /* ffestb_V0184_ -- "REWRITE" OPEN_PAREN expr COMMA | |
17341 | ||
17342 | return ffestb_V0184_; // to lexer | |
17343 | ||
17344 | Handle expr construct (not NAME=expr construct) here. */ | |
17345 | ||
17346 | static ffelexHandler | |
17347 | ffestb_V0184_ (ffelexToken t) | |
17348 | { | |
17349 | switch (ffelex_token_type (t)) | |
17350 | { | |
17351 | case FFELEX_typeNAME: | |
17352 | ffesta_tokens[1] = ffelex_token_use (t); | |
17353 | return (ffelexHandler) ffestb_V0185_; | |
17354 | ||
17355 | default: | |
17356 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17357 | FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_V0186_))) | |
17358 | (t); | |
17359 | } | |
17360 | } | |
17361 | ||
17362 | /* ffestb_V0185_ -- "REWRITE" OPEN_PAREN expr COMMA NAME | |
17363 | ||
17364 | return ffestb_V0185_; // to lexer | |
17365 | ||
17366 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
17367 | token thru expression handler. */ | |
17368 | ||
17369 | static ffelexHandler | |
17370 | ffestb_V0185_ (ffelexToken t) | |
17371 | { | |
17372 | ffelexHandler next; | |
17373 | ffelexToken nt; | |
17374 | ||
17375 | switch (ffelex_token_type (t)) | |
17376 | { | |
17377 | case FFELEX_typeEQUALS: | |
17378 | nt = ffesta_tokens[1]; | |
17379 | next = (ffelexHandler) ffestb_V0187_ (nt); | |
17380 | ffelex_token_kill (nt); | |
17381 | return (ffelexHandler) (*next) (t); | |
17382 | ||
17383 | default: | |
17384 | nt = ffesta_tokens[1]; | |
17385 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17386 | FFEEXPR_contextFILEFORMAT, (ffeexprCallback) ffestb_V0186_))) | |
17387 | (nt); | |
17388 | ffelex_token_kill (nt); | |
17389 | return (ffelexHandler) (*next) (t); | |
17390 | } | |
17391 | } | |
17392 | ||
17393 | /* ffestb_V0186_ -- "REWRITE" OPEN_PAREN expr COMMA expr | |
17394 | ||
17395 | (ffestb_V0186_) // to expression handler | |
17396 | ||
17397 | Handle COMMA or CLOSE_PAREN here. */ | |
17398 | ||
17399 | static ffelexHandler | |
17400 | ffestb_V0186_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
17401 | { | |
17402 | switch (ffelex_token_type (t)) | |
17403 | { | |
17404 | case FFELEX_typeCOMMA: | |
17405 | case FFELEX_typeCLOSE_PAREN: | |
17406 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].kw_or_val_present | |
17407 | = TRUE; | |
17408 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].kw_present = FALSE; | |
17409 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value_present = TRUE; | |
17410 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value_is_label | |
17411 | = (expr == NULL); | |
17412 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].value | |
17413 | = ffelex_token_use (ft); | |
17414 | ffestp_file.rewrite.rewrite_spec[FFESTP_rewriteixFMT].u.expr = expr; | |
17415 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
17416 | return (ffelexHandler) ffestb_V0187_; | |
17417 | return (ffelexHandler) ffestb_V01812_; | |
17418 | ||
17419 | default: | |
17420 | break; | |
17421 | } | |
17422 | ||
17423 | ffestb_subr_kill_rewrite_ (); | |
17424 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17425 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17426 | } | |
17427 | ||
17428 | /* ffestb_V0187_ -- "REWRITE" OPEN_PAREN [external-file-unit COMMA [format | |
17429 | COMMA]] | |
17430 | ||
17431 | return ffestb_V0187_; // to lexer | |
17432 | ||
17433 | Handle expr construct (not NAME=expr construct) here. */ | |
17434 | ||
17435 | static ffelexHandler | |
17436 | ffestb_V0187_ (ffelexToken t) | |
17437 | { | |
17438 | ffestrGenio kw; | |
17439 | ||
17440 | ffestb_local_.rewrite.label = FALSE; | |
17441 | ||
17442 | switch (ffelex_token_type (t)) | |
17443 | { | |
17444 | case FFELEX_typeNAME: | |
17445 | kw = ffestr_genio (t); | |
17446 | switch (kw) | |
17447 | { | |
17448 | case FFESTR_genioERR: | |
17449 | ffestb_local_.rewrite.ix = FFESTP_rewriteixERR; | |
17450 | ffestb_local_.rewrite.label = TRUE; | |
17451 | break; | |
17452 | ||
17453 | case FFESTR_genioFMT: | |
17454 | ffestb_local_.rewrite.ix = FFESTP_rewriteixFMT; | |
17455 | ffestb_local_.rewrite.left = FALSE; | |
17456 | ffestb_local_.rewrite.context = FFEEXPR_contextFILEFORMAT; | |
17457 | break; | |
17458 | ||
17459 | case FFESTR_genioIOSTAT: | |
17460 | ffestb_local_.rewrite.ix = FFESTP_rewriteixIOSTAT; | |
17461 | ffestb_local_.rewrite.left = TRUE; | |
17462 | ffestb_local_.rewrite.context = FFEEXPR_contextFILEINT; | |
17463 | break; | |
17464 | ||
17465 | case FFESTR_genioUNIT: | |
17466 | ffestb_local_.rewrite.ix = FFESTP_rewriteixUNIT; | |
17467 | ffestb_local_.rewrite.left = FALSE; | |
17468 | ffestb_local_.rewrite.context = FFEEXPR_contextFILENUM; | |
17469 | break; | |
17470 | ||
17471 | default: | |
17472 | goto bad; /* :::::::::::::::::::: */ | |
17473 | } | |
17474 | if (ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix] | |
17475 | .kw_or_val_present) | |
17476 | break; /* Can't specify a keyword twice! */ | |
17477 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix] | |
17478 | .kw_or_val_present = TRUE; | |
17479 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix] | |
17480 | .kw_present = TRUE; | |
17481 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix] | |
17482 | .value_present = FALSE; | |
17483 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_is_label | |
17484 | = ffestb_local_.rewrite.label; | |
17485 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].kw | |
17486 | = ffelex_token_use (t); | |
17487 | return (ffelexHandler) ffestb_V0188_; | |
17488 | ||
17489 | default: | |
17490 | break; | |
17491 | } | |
17492 | ||
17493 | bad: /* :::::::::::::::::::: */ | |
17494 | ffestb_subr_kill_rewrite_ (); | |
17495 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17496 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17497 | } | |
17498 | ||
17499 | /* ffestb_V0188_ -- "REWRITE" OPEN_PAREN [external-file-unit COMMA [format | |
17500 | COMMA]] NAME | |
17501 | ||
17502 | return ffestb_V0188_; // to lexer | |
17503 | ||
17504 | Make sure EQUALS here, send next token to expression handler. */ | |
17505 | ||
17506 | static ffelexHandler | |
17507 | ffestb_V0188_ (ffelexToken t) | |
17508 | { | |
17509 | switch (ffelex_token_type (t)) | |
17510 | { | |
17511 | case FFELEX_typeEQUALS: | |
17512 | ffesta_confirmed (); | |
17513 | if (ffestb_local_.rewrite.label) | |
17514 | return (ffelexHandler) ffestb_V01810_; | |
17515 | if (ffestb_local_.rewrite.left) | |
17516 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
17517 | ffestb_local_.rewrite.context, | |
17518 | (ffeexprCallback) ffestb_V0189_); | |
17519 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17520 | ffestb_local_.rewrite.context, | |
17521 | (ffeexprCallback) ffestb_V0189_); | |
17522 | ||
17523 | default: | |
17524 | break; | |
17525 | } | |
17526 | ||
17527 | ffestb_subr_kill_rewrite_ (); | |
17528 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17529 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17530 | } | |
17531 | ||
17532 | /* ffestb_V0189_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS expr | |
17533 | ||
17534 | (ffestb_V0189_) // to expression handler | |
17535 | ||
17536 | Handle COMMA or CLOSE_PAREN here. */ | |
17537 | ||
17538 | static ffelexHandler | |
17539 | ffestb_V0189_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
17540 | { | |
17541 | switch (ffelex_token_type (t)) | |
17542 | { | |
17543 | case FFELEX_typeCOMMA: | |
17544 | case FFELEX_typeCLOSE_PAREN: | |
17545 | if (expr == NULL) | |
17546 | if (ffestb_local_.rewrite.context == FFEEXPR_contextFILEFORMAT) | |
17547 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix] | |
17548 | .value_is_label = TRUE; | |
17549 | else | |
17550 | break; | |
17551 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_present | |
17552 | = TRUE; | |
17553 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value | |
17554 | = ffelex_token_use (ft); | |
17555 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].u.expr = expr; | |
17556 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
17557 | return (ffelexHandler) ffestb_V0187_; | |
17558 | return (ffelexHandler) ffestb_V01812_; | |
17559 | ||
17560 | default: | |
17561 | break; | |
17562 | } | |
17563 | ||
17564 | ffestb_subr_kill_rewrite_ (); | |
17565 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17566 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17567 | } | |
17568 | ||
17569 | /* ffestb_V01810_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS | |
17570 | ||
17571 | return ffestb_V01810_; // to lexer | |
17572 | ||
17573 | Handle NUMBER for label here. */ | |
17574 | ||
17575 | static ffelexHandler | |
17576 | ffestb_V01810_ (ffelexToken t) | |
17577 | { | |
17578 | switch (ffelex_token_type (t)) | |
17579 | { | |
17580 | case FFELEX_typeNUMBER: | |
17581 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value_present | |
17582 | = TRUE; | |
17583 | ffestp_file.rewrite.rewrite_spec[ffestb_local_.rewrite.ix].value | |
17584 | = ffelex_token_use (t); | |
17585 | return (ffelexHandler) ffestb_V01811_; | |
17586 | ||
17587 | default: | |
17588 | break; | |
17589 | } | |
17590 | ||
17591 | ffestb_subr_kill_rewrite_ (); | |
17592 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17593 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17594 | } | |
17595 | ||
17596 | /* ffestb_V01811_ -- "REWRITE" OPEN_PAREN ... NAME EQUALS NUMBER | |
17597 | ||
17598 | return ffestb_V01811_; // to lexer | |
17599 | ||
17600 | Handle COMMA or CLOSE_PAREN here. */ | |
17601 | ||
17602 | static ffelexHandler | |
17603 | ffestb_V01811_ (ffelexToken t) | |
17604 | { | |
17605 | switch (ffelex_token_type (t)) | |
17606 | { | |
17607 | case FFELEX_typeCOMMA: | |
17608 | return (ffelexHandler) ffestb_V0187_; | |
17609 | ||
17610 | case FFELEX_typeCLOSE_PAREN: | |
17611 | return (ffelexHandler) ffestb_V01812_; | |
17612 | ||
17613 | default: | |
17614 | break; | |
17615 | } | |
17616 | ||
17617 | ffestb_subr_kill_rewrite_ (); | |
17618 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17619 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17620 | } | |
17621 | ||
17622 | /* ffestb_V01812_ -- "REWRITE" OPEN_PAREN ... CLOSE_PAREN | |
17623 | ||
17624 | return ffestb_V01812_; // to lexer | |
17625 | ||
17626 | Handle EOS or SEMICOLON here. */ | |
17627 | ||
17628 | static ffelexHandler | |
17629 | ffestb_V01812_ (ffelexToken t) | |
17630 | { | |
17631 | switch (ffelex_token_type (t)) | |
17632 | { | |
17633 | case FFELEX_typeEOS: | |
17634 | case FFELEX_typeSEMICOLON: | |
17635 | ffesta_confirmed (); | |
17636 | if (!ffesta_is_inhibited ()) | |
17637 | { | |
17638 | ffestc_V018_start (); | |
17639 | ffestc_V018_finish (); | |
17640 | } | |
17641 | ffestb_subr_kill_rewrite_ (); | |
17642 | return (ffelexHandler) ffesta_zero (t); | |
17643 | ||
17644 | case FFELEX_typeNAME: | |
17645 | case FFELEX_typeOPEN_PAREN: | |
17646 | case FFELEX_typeCOMMA: | |
17647 | ffesta_confirmed (); | |
17648 | if (!ffesta_is_inhibited ()) | |
17649 | ffestc_V018_start (); | |
17650 | ffestb_subr_kill_rewrite_ (); | |
17651 | ||
17652 | /* EXTENSION: Allow an optional preceding COMMA here if not pedantic. | |
17653 | (f2c provides this extension, as do other compilers, supposedly.) */ | |
17654 | ||
17655 | if (!ffe_is_pedantic () && (ffelex_token_type (t) == FFELEX_typeCOMMA)) | |
17656 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17657 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_); | |
17658 | ||
17659 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17660 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_))) | |
17661 | (t); | |
17662 | ||
17663 | default: | |
17664 | break; | |
17665 | } | |
17666 | ||
17667 | ffestb_subr_kill_rewrite_ (); | |
17668 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17669 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17670 | } | |
17671 | ||
17672 | /* ffestb_V01813_ -- "REWRITE(...)" expr | |
17673 | ||
17674 | (ffestb_V01813_) // to expression handler | |
17675 | ||
17676 | Handle COMMA or EOS/SEMICOLON here. */ | |
17677 | ||
17678 | static ffelexHandler | |
17679 | ffestb_V01813_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
17680 | { | |
17681 | switch (ffelex_token_type (t)) | |
17682 | { | |
17683 | case FFELEX_typeCOMMA: | |
17684 | if (expr == NULL) | |
17685 | break; | |
17686 | if (!ffesta_is_inhibited ()) | |
17687 | ffestc_V018_item (expr, ft); | |
17688 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17689 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V01813_); | |
17690 | ||
17691 | case FFELEX_typeEOS: | |
17692 | case FFELEX_typeSEMICOLON: | |
17693 | if (expr == NULL) | |
17694 | break; | |
17695 | if (!ffesta_is_inhibited ()) | |
17696 | { | |
17697 | ffestc_V018_item (expr, ft); | |
17698 | ffestc_V018_finish (); | |
17699 | } | |
17700 | return (ffelexHandler) ffesta_zero (t); | |
17701 | ||
17702 | default: | |
17703 | break; | |
17704 | } | |
17705 | ||
17706 | if (!ffesta_is_inhibited ()) | |
17707 | ffestc_V018_finish (); | |
17708 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "REWRITE", t); | |
17709 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17710 | } | |
17711 | ||
17712 | /* ffestb_V019 -- Parse the ACCEPT statement | |
17713 | ||
17714 | return ffestb_V019; // to lexer | |
17715 | ||
17716 | Make sure the statement has a valid form for the ACCEPT | |
17717 | statement. If it does, implement the statement. */ | |
17718 | ||
17719 | ffelexHandler | |
17720 | ffestb_V019 (ffelexToken t) | |
17721 | { | |
17722 | ffelexHandler next; | |
17723 | ffestpAcceptIx ix; | |
17724 | ||
17725 | switch (ffelex_token_type (ffesta_tokens[0])) | |
17726 | { | |
17727 | case FFELEX_typeNAME: | |
17728 | if (ffesta_first_kw != FFESTR_firstACCEPT) | |
17729 | goto bad_0; /* :::::::::::::::::::: */ | |
17730 | switch (ffelex_token_type (t)) | |
17731 | { | |
17732 | case FFELEX_typeCOMMA: | |
17733 | case FFELEX_typeCOLONCOLON: | |
17734 | case FFELEX_typeEOS: | |
17735 | case FFELEX_typeSEMICOLON: | |
17736 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
17737 | goto bad_1; /* :::::::::::::::::::: */ | |
17738 | ||
17739 | case FFELEX_typeEQUALS: | |
17740 | case FFELEX_typePOINTS: | |
17741 | case FFELEX_typeCOLON: | |
17742 | goto bad_1; /* :::::::::::::::::::: */ | |
17743 | ||
17744 | case FFELEX_typeNAME: | |
17745 | case FFELEX_typeNUMBER: | |
17746 | ffesta_confirmed (); | |
17747 | break; | |
17748 | ||
17749 | default: | |
17750 | break; | |
17751 | } | |
17752 | ||
17753 | for (ix = 0; ix < FFESTP_acceptix; ++ix) | |
17754 | ffestp_file.accept.accept_spec[ix].kw_or_val_present = FALSE; | |
17755 | return (ffelexHandler) (*((ffelexHandler) | |
17756 | ffeexpr_rhs (ffesta_output_pool, | |
17757 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0191_))) | |
17758 | (t); | |
17759 | ||
17760 | case FFELEX_typeNAMES: | |
17761 | if (ffesta_first_kw != FFESTR_firstACCEPT) | |
17762 | goto bad_0; /* :::::::::::::::::::: */ | |
17763 | switch (ffelex_token_type (t)) | |
17764 | { | |
17765 | case FFELEX_typeEOS: | |
17766 | case FFELEX_typeSEMICOLON: | |
17767 | case FFELEX_typeCOMMA: | |
17768 | ffesta_confirmed (); | |
17769 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlACCEPT) | |
17770 | break; | |
17771 | goto bad_1; /* :::::::::::::::::::: */ | |
17772 | ||
17773 | case FFELEX_typeCOLONCOLON: | |
17774 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
17775 | goto bad_1; /* :::::::::::::::::::: */ | |
17776 | ||
17777 | case FFELEX_typeEQUALS: | |
17778 | case FFELEX_typePOINTS: | |
17779 | case FFELEX_typeCOLON: | |
17780 | goto bad_1; /* :::::::::::::::::::: */ | |
17781 | ||
17782 | default: | |
17783 | break; | |
17784 | } | |
17785 | for (ix = 0; ix < FFESTP_acceptix; ++ix) | |
17786 | ffestp_file.accept.accept_spec[ix].kw_or_val_present = FALSE; | |
17787 | next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17788 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0191_); | |
17789 | next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0], | |
17790 | FFESTR_firstlACCEPT); | |
17791 | if (next == NULL) | |
17792 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
17793 | (ffelexHandler) ffesta_zero); | |
17794 | return (ffelexHandler) (*next) (t); | |
17795 | ||
17796 | default: | |
17797 | goto bad_0; /* :::::::::::::::::::: */ | |
17798 | } | |
17799 | ||
17800 | bad_0: /* :::::::::::::::::::: */ | |
17801 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", ffesta_tokens[0]); | |
17802 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17803 | ||
17804 | bad_1: /* :::::::::::::::::::: */ | |
17805 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t); | |
17806 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
17807 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
17808 | } | |
17809 | ||
17810 | /* ffestb_V0191_ -- "ACCEPT" expr | |
17811 | ||
17812 | (ffestb_V0191_) // to expression handler | |
17813 | ||
17814 | Make sure the next token is a COMMA or EOS/SEMICOLON. */ | |
17815 | ||
17816 | static ffelexHandler | |
17817 | ffestb_V0191_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
17818 | { | |
17819 | switch (ffelex_token_type (t)) | |
17820 | { | |
17821 | case FFELEX_typeEOS: | |
17822 | case FFELEX_typeSEMICOLON: | |
17823 | case FFELEX_typeCOMMA: | |
17824 | ffesta_confirmed (); | |
17825 | ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].kw_or_val_present | |
17826 | = TRUE; | |
17827 | ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].kw_present = FALSE; | |
17828 | ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value_present = TRUE; | |
17829 | ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value_is_label | |
17830 | = (expr == NULL); | |
17831 | ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].value | |
17832 | = ffelex_token_use (ft); | |
17833 | ffestp_file.accept.accept_spec[FFESTP_acceptixFORMAT].u.expr = expr; | |
17834 | if (!ffesta_is_inhibited ()) | |
17835 | ffestc_V019_start (); | |
17836 | ffestb_subr_kill_accept_ (); | |
17837 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
17838 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
17839 | FFEEXPR_contextIOLIST, | |
17840 | (ffeexprCallback) ffestb_V0192_); | |
17841 | if (!ffesta_is_inhibited ()) | |
17842 | ffestc_V019_finish (); | |
17843 | return (ffelexHandler) ffesta_zero (t); | |
17844 | ||
17845 | default: | |
17846 | break; | |
17847 | } | |
17848 | ||
17849 | ffestb_subr_kill_accept_ (); | |
17850 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t); | |
17851 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17852 | } | |
17853 | ||
17854 | /* ffestb_V0192_ -- "ACCEPT" expr COMMA expr | |
17855 | ||
17856 | (ffestb_V0192_) // to expression handler | |
17857 | ||
17858 | Handle COMMA or EOS/SEMICOLON here. */ | |
17859 | ||
17860 | static ffelexHandler | |
17861 | ffestb_V0192_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
17862 | { | |
17863 | switch (ffelex_token_type (t)) | |
17864 | { | |
17865 | case FFELEX_typeCOMMA: | |
17866 | if (expr == NULL) | |
17867 | break; | |
17868 | if (!ffesta_is_inhibited ()) | |
17869 | ffestc_V019_item (expr, ft); | |
17870 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
17871 | FFEEXPR_contextIOLIST, | |
17872 | (ffeexprCallback) ffestb_V0192_); | |
17873 | ||
17874 | case FFELEX_typeEOS: | |
17875 | case FFELEX_typeSEMICOLON: | |
17876 | if (expr == NULL) | |
17877 | break; | |
17878 | if (!ffesta_is_inhibited ()) | |
17879 | { | |
17880 | ffestc_V019_item (expr, ft); | |
17881 | ffestc_V019_finish (); | |
17882 | } | |
17883 | return (ffelexHandler) ffesta_zero (t); | |
17884 | ||
17885 | default: | |
17886 | break; | |
17887 | } | |
17888 | ||
17889 | if (!ffesta_is_inhibited ()) | |
17890 | ffestc_V019_finish (); | |
17891 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "ACCEPT", t); | |
17892 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17893 | } | |
17894 | ||
17895 | #endif | |
17896 | /* ffestb_V020 -- Parse the TYPE statement | |
17897 | ||
17898 | return ffestb_V020; // to lexer | |
17899 | ||
17900 | Make sure the statement has a valid form for the TYPE | |
17901 | statement. If it does, implement the statement. */ | |
17902 | ||
17903 | ffelexHandler | |
17904 | ffestb_V020 (ffelexToken t) | |
17905 | { | |
17906 | ffeTokenLength i; | |
17907 | char *p; | |
17908 | ffelexHandler next; | |
17909 | ffestpTypeIx ix; | |
17910 | ||
17911 | switch (ffelex_token_type (ffesta_tokens[0])) | |
17912 | { | |
17913 | case FFELEX_typeNAME: | |
17914 | if (ffesta_first_kw != FFESTR_firstTYPE) | |
17915 | goto bad_0; /* :::::::::::::::::::: */ | |
17916 | switch (ffelex_token_type (t)) | |
17917 | { | |
17918 | case FFELEX_typeCOLONCOLON: | |
17919 | case FFELEX_typeEOS: | |
17920 | case FFELEX_typeSEMICOLON: | |
17921 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
17922 | goto bad_1; /* :::::::::::::::::::: */ | |
17923 | ||
17924 | case FFELEX_typeEQUALS: | |
17925 | case FFELEX_typePOINTS: | |
17926 | case FFELEX_typeCOLON: | |
17927 | case FFELEX_typeCOMMA: /* Because "TYPE,PUBLIC::A" is ambiguous with | |
17928 | '90. */ | |
17929 | goto bad_1; /* :::::::::::::::::::: */ | |
17930 | ||
17931 | case FFELEX_typeNUMBER: | |
17932 | ffesta_confirmed (); | |
17933 | break; | |
17934 | ||
17935 | case FFELEX_typeNAME: /* Because TYPE A is ambiguous with '90. */ | |
17936 | default: | |
17937 | break; | |
17938 | } | |
17939 | ||
17940 | for (ix = 0; ix < FFESTP_typeix; ++ix) | |
17941 | ffestp_file.type.type_spec[ix].kw_or_val_present = FALSE; | |
17942 | return (ffelexHandler) (*((ffelexHandler) | |
17943 | ffeexpr_rhs (ffesta_output_pool, | |
17944 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0201_))) | |
17945 | (t); | |
17946 | ||
17947 | case FFELEX_typeNAMES: | |
17948 | if (ffesta_first_kw != FFESTR_firstTYPE) | |
17949 | goto bad_0; /* :::::::::::::::::::: */ | |
17950 | switch (ffelex_token_type (t)) | |
17951 | { | |
17952 | case FFELEX_typeEOS: | |
17953 | case FFELEX_typeSEMICOLON: | |
17954 | case FFELEX_typeCOMMA: | |
17955 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlTYPE) | |
17956 | break; | |
17957 | goto bad_1; /* :::::::::::::::::::: */ | |
17958 | ||
17959 | case FFELEX_typeCOLONCOLON: | |
17960 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
17961 | goto bad_1; /* :::::::::::::::::::: */ | |
17962 | ||
17963 | case FFELEX_typeOPEN_PAREN: | |
17964 | if (ffelex_token_length (ffesta_tokens[0]) == FFESTR_firstlTYPE) | |
17965 | break; /* Else might be assignment/stmtfuncdef. */ | |
17966 | goto bad_1; /* :::::::::::::::::::: */ | |
17967 | ||
17968 | case FFELEX_typeEQUALS: | |
17969 | case FFELEX_typePOINTS: | |
17970 | case FFELEX_typeCOLON: | |
17971 | goto bad_1; /* :::::::::::::::::::: */ | |
17972 | ||
17973 | default: | |
17974 | break; | |
17975 | } | |
17976 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlTYPE); | |
17977 | if (isdigit (*p)) | |
17978 | ffesta_confirmed (); /* Else might be '90 TYPE statement. */ | |
17979 | for (ix = 0; ix < FFESTP_typeix; ++ix) | |
17980 | ffestp_file.type.type_spec[ix].kw_or_val_present = FALSE; | |
17981 | next = (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
17982 | FFEEXPR_contextFILEFORMATNML, (ffeexprCallback) ffestb_V0201_); | |
17983 | next = (ffelexHandler) ffelex_splice_tokens (next, ffesta_tokens[0], | |
17984 | FFESTR_firstlTYPE); | |
17985 | if (next == NULL) | |
17986 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
17987 | (ffelexHandler) ffesta_zero); | |
17988 | return (ffelexHandler) (*next) (t); | |
17989 | ||
17990 | default: | |
17991 | goto bad_0; /* :::::::::::::::::::: */ | |
17992 | } | |
17993 | ||
17994 | bad_0: /* :::::::::::::::::::: */ | |
17995 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", ffesta_tokens[0]); | |
17996 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
17997 | ||
17998 | bad_1: /* :::::::::::::::::::: */ | |
17999 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t); | |
18000 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
18001 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
18002 | } | |
18003 | ||
18004 | /* ffestb_V0201_ -- "TYPE" expr | |
18005 | ||
18006 | (ffestb_V0201_) // to expression handler | |
18007 | ||
18008 | Make sure the next token is a COMMA or EOS/SEMICOLON. */ | |
18009 | ||
18010 | static ffelexHandler | |
18011 | ffestb_V0201_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
18012 | { | |
18013 | bool comma = TRUE; | |
18014 | ||
18015 | switch (ffelex_token_type (t)) | |
18016 | { | |
18017 | case FFELEX_typeEOS: | |
18018 | case FFELEX_typeSEMICOLON: | |
18019 | if (!ffe_is_vxt () && (expr != NULL) | |
18020 | && (ffebld_op (expr) == FFEBLD_opSYMTER)) | |
18021 | break; | |
18022 | comma = FALSE; | |
18023 | /* Fall through. */ | |
18024 | case FFELEX_typeCOMMA: | |
18025 | if (!ffe_is_vxt () && comma && (expr != NULL) | |
18026 | && (ffebld_op (expr) == FFEBLD_opPAREN) | |
18027 | && (ffebld_op (ffebld_left (expr)) == FFEBLD_opSYMTER)) | |
18028 | break; | |
18029 | ffesta_confirmed (); | |
18030 | ffestp_file.type.type_spec[FFESTP_typeixFORMAT].kw_or_val_present | |
18031 | = TRUE; | |
18032 | ffestp_file.type.type_spec[FFESTP_typeixFORMAT].kw_present = FALSE; | |
18033 | ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value_present = TRUE; | |
18034 | ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value_is_label | |
18035 | = (expr == NULL); | |
18036 | ffestp_file.type.type_spec[FFESTP_typeixFORMAT].value | |
18037 | = ffelex_token_use (ft); | |
18038 | ffestp_file.type.type_spec[FFESTP_typeixFORMAT].u.expr = expr; | |
18039 | if (!ffesta_is_inhibited ()) | |
18040 | ffestc_V020_start (); | |
18041 | ffestb_subr_kill_type_ (); | |
18042 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
18043 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
18044 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V0202_); | |
18045 | if (!ffesta_is_inhibited ()) | |
18046 | ffestc_V020_finish (); | |
18047 | return (ffelexHandler) ffesta_zero (t); | |
18048 | ||
18049 | default: | |
18050 | break; | |
18051 | } | |
18052 | ||
18053 | ffestb_subr_kill_type_ (); | |
18054 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t); | |
18055 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18056 | } | |
18057 | ||
18058 | /* ffestb_V0202_ -- "TYPE" expr COMMA expr | |
18059 | ||
18060 | (ffestb_V0202_) // to expression handler | |
18061 | ||
18062 | Handle COMMA or EOS/SEMICOLON here. */ | |
18063 | ||
18064 | static ffelexHandler | |
18065 | ffestb_V0202_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
18066 | { | |
18067 | switch (ffelex_token_type (t)) | |
18068 | { | |
18069 | case FFELEX_typeCOMMA: | |
18070 | if (expr == NULL) | |
18071 | break; | |
18072 | if (!ffesta_is_inhibited ()) | |
18073 | ffestc_V020_item (expr, ft); | |
18074 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
18075 | FFEEXPR_contextIOLIST, (ffeexprCallback) ffestb_V0202_); | |
18076 | ||
18077 | case FFELEX_typeEOS: | |
18078 | case FFELEX_typeSEMICOLON: | |
18079 | if (expr == NULL) | |
18080 | break; | |
18081 | if (!ffesta_is_inhibited ()) | |
18082 | { | |
18083 | ffestc_V020_item (expr, ft); | |
18084 | ffestc_V020_finish (); | |
18085 | } | |
18086 | return (ffelexHandler) ffesta_zero (t); | |
18087 | ||
18088 | default: | |
18089 | break; | |
18090 | } | |
18091 | ||
18092 | if (!ffesta_is_inhibited ()) | |
18093 | ffestc_V020_finish (); | |
18094 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "TYPE I/O", t); | |
18095 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18096 | } | |
18097 | ||
18098 | /* ffestb_V021 -- Parse a DELETE statement | |
18099 | ||
18100 | return ffestb_V021; // to lexer | |
18101 | ||
18102 | Make sure the statement has a valid form for a DELETE statement. | |
18103 | If it does, implement the statement. */ | |
18104 | ||
18105 | #if FFESTR_VXT | |
18106 | ffelexHandler | |
18107 | ffestb_V021 (ffelexToken t) | |
18108 | { | |
18109 | ffestpDeleteIx ix; | |
18110 | ||
18111 | switch (ffelex_token_type (ffesta_tokens[0])) | |
18112 | { | |
18113 | case FFELEX_typeNAME: | |
18114 | if (ffesta_first_kw != FFESTR_firstDELETE) | |
18115 | goto bad_0; /* :::::::::::::::::::: */ | |
18116 | break; | |
18117 | ||
18118 | case FFELEX_typeNAMES: | |
18119 | if (ffesta_first_kw != FFESTR_firstDELETE) | |
18120 | goto bad_0; /* :::::::::::::::::::: */ | |
18121 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlDELETE) | |
18122 | goto bad_0; /* :::::::::::::::::::: */ | |
18123 | break; | |
18124 | ||
18125 | default: | |
18126 | goto bad_0; /* :::::::::::::::::::: */ | |
18127 | } | |
18128 | ||
18129 | switch (ffelex_token_type (t)) | |
18130 | { | |
18131 | case FFELEX_typeOPEN_PAREN: | |
18132 | break; | |
18133 | ||
18134 | case FFELEX_typeEOS: | |
18135 | case FFELEX_typeSEMICOLON: | |
18136 | case FFELEX_typeCOMMA: | |
18137 | case FFELEX_typeCOLONCOLON: | |
18138 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
18139 | goto bad_1; /* :::::::::::::::::::: */ | |
18140 | ||
18141 | default: | |
18142 | goto bad_1; /* :::::::::::::::::::: */ | |
18143 | } | |
18144 | ||
18145 | for (ix = 0; ix < FFESTP_deleteix; ++ix) | |
18146 | ffestp_file.delete.delete_spec[ix].kw_or_val_present = FALSE; | |
18147 | ||
18148 | return (ffelexHandler) ffestb_V0211_; | |
18149 | ||
18150 | bad_0: /* :::::::::::::::::::: */ | |
18151 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", ffesta_tokens[0]); | |
18152 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18153 | ||
18154 | bad_1: /* :::::::::::::::::::: */ | |
18155 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t); | |
18156 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
18157 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
18158 | } | |
18159 | ||
18160 | /* ffestb_V0211_ -- "DELETE" OPEN_PAREN | |
18161 | ||
18162 | return ffestb_V0211_; // to lexer | |
18163 | ||
18164 | Handle expr construct (not NAME=expr construct) here. */ | |
18165 | ||
18166 | static ffelexHandler | |
18167 | ffestb_V0211_ (ffelexToken t) | |
18168 | { | |
18169 | switch (ffelex_token_type (t)) | |
18170 | { | |
18171 | case FFELEX_typeNAME: | |
18172 | ffesta_tokens[1] = ffelex_token_use (t); | |
18173 | return (ffelexHandler) ffestb_V0212_; | |
18174 | ||
18175 | default: | |
18176 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
18177 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0213_))) | |
18178 | (t); | |
18179 | } | |
18180 | } | |
18181 | ||
18182 | /* ffestb_V0212_ -- "DELETE" OPEN_PAREN NAME | |
18183 | ||
18184 | return ffestb_V0212_; // to lexer | |
18185 | ||
18186 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
18187 | token thru expression handler. */ | |
18188 | ||
18189 | static ffelexHandler | |
18190 | ffestb_V0212_ (ffelexToken t) | |
18191 | { | |
18192 | ffelexHandler next; | |
18193 | ffelexToken nt; | |
18194 | ||
18195 | switch (ffelex_token_type (t)) | |
18196 | { | |
18197 | case FFELEX_typeEQUALS: | |
18198 | nt = ffesta_tokens[1]; | |
18199 | next = (ffelexHandler) ffestb_V0214_ (nt); | |
18200 | ffelex_token_kill (nt); | |
18201 | return (ffelexHandler) (*next) (t); | |
18202 | ||
18203 | default: | |
18204 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
18205 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0213_))) | |
18206 | (ffesta_tokens[1]); | |
18207 | ffelex_token_kill (ffesta_tokens[1]); | |
18208 | return (ffelexHandler) (*next) (t); | |
18209 | } | |
18210 | } | |
18211 | ||
18212 | /* ffestb_V0213_ -- "DELETE" OPEN_PAREN expr | |
18213 | ||
18214 | (ffestb_V0213_) // to expression handler | |
18215 | ||
18216 | Handle COMMA or DELETE_PAREN here. */ | |
18217 | ||
18218 | static ffelexHandler | |
18219 | ffestb_V0213_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
18220 | { | |
18221 | switch (ffelex_token_type (t)) | |
18222 | { | |
18223 | case FFELEX_typeCOMMA: | |
18224 | case FFELEX_typeCLOSE_PAREN: | |
18225 | if (expr == NULL) | |
18226 | break; | |
18227 | ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].kw_or_val_present | |
18228 | = TRUE; | |
18229 | ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].kw_present = FALSE; | |
18230 | ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value_present = TRUE; | |
18231 | ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value_is_label | |
18232 | = FALSE; | |
18233 | ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].value | |
18234 | = ffelex_token_use (ft); | |
18235 | ffestp_file.delete.delete_spec[FFESTP_deleteixUNIT].u.expr = expr; | |
18236 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
18237 | return (ffelexHandler) ffestb_V0214_; | |
18238 | return (ffelexHandler) ffestb_V0219_; | |
18239 | ||
18240 | default: | |
18241 | break; | |
18242 | } | |
18243 | ||
18244 | ffestb_subr_kill_delete_ (); | |
18245 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t); | |
18246 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18247 | } | |
18248 | ||
18249 | /* ffestb_V0214_ -- "DELETE" OPEN_PAREN [external-file-unit COMMA] | |
18250 | ||
18251 | return ffestb_V0214_; // to lexer | |
18252 | ||
18253 | Handle expr construct (not NAME=expr construct) here. */ | |
18254 | ||
18255 | static ffelexHandler | |
18256 | ffestb_V0214_ (ffelexToken t) | |
18257 | { | |
18258 | ffestrGenio kw; | |
18259 | ||
18260 | ffestb_local_.delete.label = FALSE; | |
18261 | ||
18262 | switch (ffelex_token_type (t)) | |
18263 | { | |
18264 | case FFELEX_typeNAME: | |
18265 | kw = ffestr_genio (t); | |
18266 | switch (kw) | |
18267 | { | |
18268 | case FFESTR_genioERR: | |
18269 | ffestb_local_.delete.ix = FFESTP_deleteixERR; | |
18270 | ffestb_local_.delete.label = TRUE; | |
18271 | break; | |
18272 | ||
18273 | case FFESTR_genioIOSTAT: | |
18274 | ffestb_local_.delete.ix = FFESTP_deleteixIOSTAT; | |
18275 | ffestb_local_.delete.left = TRUE; | |
18276 | ffestb_local_.delete.context = FFEEXPR_contextFILEINT; | |
18277 | break; | |
18278 | ||
18279 | case FFESTR_genioREC: | |
18280 | ffestb_local_.delete.ix = FFESTP_deleteixREC; | |
18281 | ffestb_local_.delete.left = FALSE; | |
18282 | ffestb_local_.delete.context = FFEEXPR_contextFILENUM; | |
18283 | break; | |
18284 | ||
18285 | case FFESTR_genioUNIT: | |
18286 | ffestb_local_.delete.ix = FFESTP_deleteixUNIT; | |
18287 | ffestb_local_.delete.left = FALSE; | |
18288 | ffestb_local_.delete.context = FFEEXPR_contextFILENUM; | |
18289 | break; | |
18290 | ||
18291 | default: | |
18292 | goto bad; /* :::::::::::::::::::: */ | |
18293 | } | |
18294 | if (ffestp_file.delete.delete_spec[ffestb_local_.delete.ix] | |
18295 | .kw_or_val_present) | |
18296 | break; /* Can't specify a keyword twice! */ | |
18297 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix] | |
18298 | .kw_or_val_present = TRUE; | |
18299 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix] | |
18300 | .kw_present = TRUE; | |
18301 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix] | |
18302 | .value_present = FALSE; | |
18303 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_is_label | |
18304 | = ffestb_local_.delete.label; | |
18305 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].kw | |
18306 | = ffelex_token_use (t); | |
18307 | return (ffelexHandler) ffestb_V0215_; | |
18308 | ||
18309 | default: | |
18310 | break; | |
18311 | } | |
18312 | ||
18313 | bad: /* :::::::::::::::::::: */ | |
18314 | ffestb_subr_kill_delete_ (); | |
18315 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t); | |
18316 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18317 | } | |
18318 | ||
18319 | /* ffestb_V0215_ -- "DELETE" OPEN_PAREN [external-file-unit COMMA] NAME | |
18320 | ||
18321 | return ffestb_V0215_; // to lexer | |
18322 | ||
18323 | Make sure EQUALS here, send next token to expression handler. */ | |
18324 | ||
18325 | static ffelexHandler | |
18326 | ffestb_V0215_ (ffelexToken t) | |
18327 | { | |
18328 | switch (ffelex_token_type (t)) | |
18329 | { | |
18330 | case FFELEX_typeEQUALS: | |
18331 | ffesta_confirmed (); | |
18332 | if (ffestb_local_.delete.label) | |
18333 | return (ffelexHandler) ffestb_V0217_; | |
18334 | if (ffestb_local_.delete.left) | |
18335 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
18336 | ffestb_local_.delete.context, | |
18337 | (ffeexprCallback) ffestb_V0216_); | |
18338 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
18339 | ffestb_local_.delete.context, (ffeexprCallback) ffestb_V0216_); | |
18340 | ||
18341 | default: | |
18342 | break; | |
18343 | } | |
18344 | ||
18345 | ffestb_subr_kill_delete_ (); | |
18346 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t); | |
18347 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18348 | } | |
18349 | ||
18350 | /* ffestb_V0216_ -- "DELETE" OPEN_PAREN ... NAME EQUALS expr | |
18351 | ||
18352 | (ffestb_V0216_) // to expression handler | |
18353 | ||
18354 | Handle COMMA or CLOSE_PAREN here. */ | |
18355 | ||
18356 | static ffelexHandler | |
18357 | ffestb_V0216_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
18358 | { | |
18359 | switch (ffelex_token_type (t)) | |
18360 | { | |
18361 | case FFELEX_typeCOMMA: | |
18362 | case FFELEX_typeCLOSE_PAREN: | |
18363 | if (expr == NULL) | |
18364 | break; | |
18365 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_present | |
18366 | = TRUE; | |
18367 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value | |
18368 | = ffelex_token_use (ft); | |
18369 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].u.expr = expr; | |
18370 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
18371 | return (ffelexHandler) ffestb_V0214_; | |
18372 | return (ffelexHandler) ffestb_V0219_; | |
18373 | ||
18374 | default: | |
18375 | break; | |
18376 | } | |
18377 | ||
18378 | ffestb_subr_kill_delete_ (); | |
18379 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t); | |
18380 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18381 | } | |
18382 | ||
18383 | /* ffestb_V0217_ -- "DELETE" OPEN_PAREN ... NAME EQUALS | |
18384 | ||
18385 | return ffestb_V0217_; // to lexer | |
18386 | ||
18387 | Handle NUMBER for label here. */ | |
18388 | ||
18389 | static ffelexHandler | |
18390 | ffestb_V0217_ (ffelexToken t) | |
18391 | { | |
18392 | switch (ffelex_token_type (t)) | |
18393 | { | |
18394 | case FFELEX_typeNUMBER: | |
18395 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value_present | |
18396 | = TRUE; | |
18397 | ffestp_file.delete.delete_spec[ffestb_local_.delete.ix].value | |
18398 | = ffelex_token_use (t); | |
18399 | return (ffelexHandler) ffestb_V0218_; | |
18400 | ||
18401 | default: | |
18402 | break; | |
18403 | } | |
18404 | ||
18405 | ffestb_subr_kill_delete_ (); | |
18406 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t); | |
18407 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18408 | } | |
18409 | ||
18410 | /* ffestb_V0218_ -- "DELETE" OPEN_PAREN ... NAME EQUALS NUMBER | |
18411 | ||
18412 | return ffestb_V0218_; // to lexer | |
18413 | ||
18414 | Handle COMMA or CLOSE_PAREN here. */ | |
18415 | ||
18416 | static ffelexHandler | |
18417 | ffestb_V0218_ (ffelexToken t) | |
18418 | { | |
18419 | switch (ffelex_token_type (t)) | |
18420 | { | |
18421 | case FFELEX_typeCOMMA: | |
18422 | return (ffelexHandler) ffestb_V0214_; | |
18423 | ||
18424 | case FFELEX_typeCLOSE_PAREN: | |
18425 | return (ffelexHandler) ffestb_V0219_; | |
18426 | ||
18427 | default: | |
18428 | break; | |
18429 | } | |
18430 | ||
18431 | ffestb_subr_kill_delete_ (); | |
18432 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t); | |
18433 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18434 | } | |
18435 | ||
18436 | /* ffestb_V0219_ -- "DELETE" OPEN_PAREN ... CLOSE_PAREN | |
18437 | ||
18438 | return ffestb_V0219_; // to lexer | |
18439 | ||
18440 | Handle EOS or SEMICOLON here. */ | |
18441 | ||
18442 | static ffelexHandler | |
18443 | ffestb_V0219_ (ffelexToken t) | |
18444 | { | |
18445 | switch (ffelex_token_type (t)) | |
18446 | { | |
18447 | case FFELEX_typeEOS: | |
18448 | case FFELEX_typeSEMICOLON: | |
18449 | ffesta_confirmed (); | |
18450 | if (!ffesta_is_inhibited ()) | |
18451 | ffestc_V021 (); | |
18452 | ffestb_subr_kill_delete_ (); | |
18453 | return (ffelexHandler) ffesta_zero (t); | |
18454 | ||
18455 | default: | |
18456 | break; | |
18457 | } | |
18458 | ||
18459 | ffestb_subr_kill_delete_ (); | |
18460 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "DELETE", t); | |
18461 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18462 | } | |
18463 | ||
18464 | /* ffestb_V026 -- Parse a FIND statement | |
18465 | ||
18466 | return ffestb_V026; // to lexer | |
18467 | ||
18468 | Make sure the statement has a valid form for a FIND statement. | |
18469 | If it does, implement the statement. */ | |
18470 | ||
18471 | ffelexHandler | |
18472 | ffestb_V026 (ffelexToken t) | |
18473 | { | |
18474 | ffestpFindIx ix; | |
18475 | ||
18476 | switch (ffelex_token_type (ffesta_tokens[0])) | |
18477 | { | |
18478 | case FFELEX_typeNAME: | |
18479 | if (ffesta_first_kw != FFESTR_firstFIND) | |
18480 | goto bad_0; /* :::::::::::::::::::: */ | |
18481 | break; | |
18482 | ||
18483 | case FFELEX_typeNAMES: | |
18484 | if (ffesta_first_kw != FFESTR_firstFIND) | |
18485 | goto bad_0; /* :::::::::::::::::::: */ | |
18486 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlFIND) | |
18487 | goto bad_0; /* :::::::::::::::::::: */ | |
18488 | break; | |
18489 | ||
18490 | default: | |
18491 | goto bad_0; /* :::::::::::::::::::: */ | |
18492 | } | |
18493 | ||
18494 | switch (ffelex_token_type (t)) | |
18495 | { | |
18496 | case FFELEX_typeOPEN_PAREN: | |
18497 | break; | |
18498 | ||
18499 | case FFELEX_typeEOS: | |
18500 | case FFELEX_typeSEMICOLON: | |
18501 | case FFELEX_typeCOMMA: | |
18502 | case FFELEX_typeCOLONCOLON: | |
18503 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
18504 | goto bad_1; /* :::::::::::::::::::: */ | |
18505 | ||
18506 | default: | |
18507 | goto bad_1; /* :::::::::::::::::::: */ | |
18508 | } | |
18509 | ||
18510 | for (ix = 0; ix < FFESTP_findix; ++ix) | |
18511 | ffestp_file.find.find_spec[ix].kw_or_val_present = FALSE; | |
18512 | ||
18513 | return (ffelexHandler) ffestb_V0261_; | |
18514 | ||
18515 | bad_0: /* :::::::::::::::::::: */ | |
18516 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", ffesta_tokens[0]); | |
18517 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18518 | ||
18519 | bad_1: /* :::::::::::::::::::: */ | |
18520 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t); | |
18521 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
18522 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
18523 | } | |
18524 | ||
18525 | /* ffestb_V0261_ -- "FIND" OPEN_PAREN | |
18526 | ||
18527 | return ffestb_V0261_; // to lexer | |
18528 | ||
18529 | Handle expr construct (not NAME=expr construct) here. */ | |
18530 | ||
18531 | static ffelexHandler | |
18532 | ffestb_V0261_ (ffelexToken t) | |
18533 | { | |
18534 | switch (ffelex_token_type (t)) | |
18535 | { | |
18536 | case FFELEX_typeNAME: | |
18537 | ffesta_tokens[1] = ffelex_token_use (t); | |
18538 | return (ffelexHandler) ffestb_V0262_; | |
18539 | ||
18540 | default: | |
18541 | return (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
18542 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0263_))) | |
18543 | (t); | |
18544 | } | |
18545 | } | |
18546 | ||
18547 | /* ffestb_V0262_ -- "FIND" OPEN_PAREN NAME | |
18548 | ||
18549 | return ffestb_V0262_; // to lexer | |
18550 | ||
18551 | If EQUALS here, go to states that handle it. Else, send NAME and this | |
18552 | token thru expression handler. */ | |
18553 | ||
18554 | static ffelexHandler | |
18555 | ffestb_V0262_ (ffelexToken t) | |
18556 | { | |
18557 | ffelexHandler next; | |
18558 | ffelexToken nt; | |
18559 | ||
18560 | switch (ffelex_token_type (t)) | |
18561 | { | |
18562 | case FFELEX_typeEQUALS: | |
18563 | nt = ffesta_tokens[1]; | |
18564 | next = (ffelexHandler) ffestb_V0264_ (nt); | |
18565 | ffelex_token_kill (nt); | |
18566 | return (ffelexHandler) (*next) (t); | |
18567 | ||
18568 | default: | |
18569 | next = (ffelexHandler) (*((ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
18570 | FFEEXPR_contextFILENUM, (ffeexprCallback) ffestb_V0263_))) | |
18571 | (ffesta_tokens[1]); | |
18572 | ffelex_token_kill (ffesta_tokens[1]); | |
18573 | return (ffelexHandler) (*next) (t); | |
18574 | } | |
18575 | } | |
18576 | ||
18577 | /* ffestb_V0263_ -- "FIND" OPEN_PAREN expr | |
18578 | ||
18579 | (ffestb_V0263_) // to expression handler | |
18580 | ||
18581 | Handle COMMA or FIND_PAREN here. */ | |
18582 | ||
18583 | static ffelexHandler | |
18584 | ffestb_V0263_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
18585 | { | |
18586 | switch (ffelex_token_type (t)) | |
18587 | { | |
18588 | case FFELEX_typeCOMMA: | |
18589 | case FFELEX_typeCLOSE_PAREN: | |
18590 | if (expr == NULL) | |
18591 | break; | |
18592 | ffestp_file.find.find_spec[FFESTP_findixUNIT].kw_or_val_present | |
18593 | = TRUE; | |
18594 | ffestp_file.find.find_spec[FFESTP_findixUNIT].kw_present = FALSE; | |
18595 | ffestp_file.find.find_spec[FFESTP_findixUNIT].value_present = TRUE; | |
18596 | ffestp_file.find.find_spec[FFESTP_findixUNIT].value_is_label | |
18597 | = FALSE; | |
18598 | ffestp_file.find.find_spec[FFESTP_findixUNIT].value | |
18599 | = ffelex_token_use (ft); | |
18600 | ffestp_file.find.find_spec[FFESTP_findixUNIT].u.expr = expr; | |
18601 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
18602 | return (ffelexHandler) ffestb_V0264_; | |
18603 | return (ffelexHandler) ffestb_V0269_; | |
18604 | ||
18605 | default: | |
18606 | break; | |
18607 | } | |
18608 | ||
18609 | ffestb_subr_kill_find_ (); | |
18610 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t); | |
18611 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18612 | } | |
18613 | ||
18614 | /* ffestb_V0264_ -- "FIND" OPEN_PAREN [external-file-unit COMMA] | |
18615 | ||
18616 | return ffestb_V0264_; // to lexer | |
18617 | ||
18618 | Handle expr construct (not NAME=expr construct) here. */ | |
18619 | ||
18620 | static ffelexHandler | |
18621 | ffestb_V0264_ (ffelexToken t) | |
18622 | { | |
18623 | ffestrGenio kw; | |
18624 | ||
18625 | ffestb_local_.find.label = FALSE; | |
18626 | ||
18627 | switch (ffelex_token_type (t)) | |
18628 | { | |
18629 | case FFELEX_typeNAME: | |
18630 | kw = ffestr_genio (t); | |
18631 | switch (kw) | |
18632 | { | |
18633 | case FFESTR_genioERR: | |
18634 | ffestb_local_.find.ix = FFESTP_findixERR; | |
18635 | ffestb_local_.find.label = TRUE; | |
18636 | break; | |
18637 | ||
18638 | case FFESTR_genioIOSTAT: | |
18639 | ffestb_local_.find.ix = FFESTP_findixIOSTAT; | |
18640 | ffestb_local_.find.left = TRUE; | |
18641 | ffestb_local_.find.context = FFEEXPR_contextFILEINT; | |
18642 | break; | |
18643 | ||
18644 | case FFESTR_genioREC: | |
18645 | ffestb_local_.find.ix = FFESTP_findixREC; | |
18646 | ffestb_local_.find.left = FALSE; | |
18647 | ffestb_local_.find.context = FFEEXPR_contextFILENUM; | |
18648 | break; | |
18649 | ||
18650 | case FFESTR_genioUNIT: | |
18651 | ffestb_local_.find.ix = FFESTP_findixUNIT; | |
18652 | ffestb_local_.find.left = FALSE; | |
18653 | ffestb_local_.find.context = FFEEXPR_contextFILENUM; | |
18654 | break; | |
18655 | ||
18656 | default: | |
18657 | goto bad; /* :::::::::::::::::::: */ | |
18658 | } | |
18659 | if (ffestp_file.find.find_spec[ffestb_local_.find.ix] | |
18660 | .kw_or_val_present) | |
18661 | break; /* Can't specify a keyword twice! */ | |
18662 | ffestp_file.find.find_spec[ffestb_local_.find.ix] | |
18663 | .kw_or_val_present = TRUE; | |
18664 | ffestp_file.find.find_spec[ffestb_local_.find.ix] | |
18665 | .kw_present = TRUE; | |
18666 | ffestp_file.find.find_spec[ffestb_local_.find.ix] | |
18667 | .value_present = FALSE; | |
18668 | ffestp_file.find.find_spec[ffestb_local_.find.ix].value_is_label | |
18669 | = ffestb_local_.find.label; | |
18670 | ffestp_file.find.find_spec[ffestb_local_.find.ix].kw | |
18671 | = ffelex_token_use (t); | |
18672 | return (ffelexHandler) ffestb_V0265_; | |
18673 | ||
18674 | default: | |
18675 | break; | |
18676 | } | |
18677 | ||
18678 | bad: /* :::::::::::::::::::: */ | |
18679 | ffestb_subr_kill_find_ (); | |
18680 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t); | |
18681 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18682 | } | |
18683 | ||
18684 | /* ffestb_V0265_ -- "FIND" OPEN_PAREN [external-file-unit COMMA] NAME | |
18685 | ||
18686 | return ffestb_V0265_; // to lexer | |
18687 | ||
18688 | Make sure EQUALS here, send next token to expression handler. */ | |
18689 | ||
18690 | static ffelexHandler | |
18691 | ffestb_V0265_ (ffelexToken t) | |
18692 | { | |
18693 | switch (ffelex_token_type (t)) | |
18694 | { | |
18695 | case FFELEX_typeEQUALS: | |
18696 | ffesta_confirmed (); | |
18697 | if (ffestb_local_.find.label) | |
18698 | return (ffelexHandler) ffestb_V0267_; | |
18699 | if (ffestb_local_.find.left) | |
18700 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
18701 | ffestb_local_.find.context, | |
18702 | (ffeexprCallback) ffestb_V0266_); | |
18703 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
18704 | ffestb_local_.find.context, | |
18705 | (ffeexprCallback) ffestb_V0266_); | |
18706 | ||
18707 | default: | |
18708 | break; | |
18709 | } | |
18710 | ||
18711 | ffestb_subr_kill_find_ (); | |
18712 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t); | |
18713 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18714 | } | |
18715 | ||
18716 | /* ffestb_V0266_ -- "FIND" OPEN_PAREN ... NAME EQUALS expr | |
18717 | ||
18718 | (ffestb_V0266_) // to expression handler | |
18719 | ||
18720 | Handle COMMA or CLOSE_PAREN here. */ | |
18721 | ||
18722 | static ffelexHandler | |
18723 | ffestb_V0266_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
18724 | { | |
18725 | switch (ffelex_token_type (t)) | |
18726 | { | |
18727 | case FFELEX_typeCOMMA: | |
18728 | case FFELEX_typeCLOSE_PAREN: | |
18729 | if (expr == NULL) | |
18730 | break; | |
18731 | ffestp_file.find.find_spec[ffestb_local_.find.ix].value_present | |
18732 | = TRUE; | |
18733 | ffestp_file.find.find_spec[ffestb_local_.find.ix].value | |
18734 | = ffelex_token_use (ft); | |
18735 | ffestp_file.find.find_spec[ffestb_local_.find.ix].u.expr = expr; | |
18736 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
18737 | return (ffelexHandler) ffestb_V0264_; | |
18738 | return (ffelexHandler) ffestb_V0269_; | |
18739 | ||
18740 | default: | |
18741 | break; | |
18742 | } | |
18743 | ||
18744 | ffestb_subr_kill_find_ (); | |
18745 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t); | |
18746 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18747 | } | |
18748 | ||
18749 | /* ffestb_V0267_ -- "FIND" OPEN_PAREN ... NAME EQUALS | |
18750 | ||
18751 | return ffestb_V0267_; // to lexer | |
18752 | ||
18753 | Handle NUMBER for label here. */ | |
18754 | ||
18755 | static ffelexHandler | |
18756 | ffestb_V0267_ (ffelexToken t) | |
18757 | { | |
18758 | switch (ffelex_token_type (t)) | |
18759 | { | |
18760 | case FFELEX_typeNUMBER: | |
18761 | ffestp_file.find.find_spec[ffestb_local_.find.ix].value_present | |
18762 | = TRUE; | |
18763 | ffestp_file.find.find_spec[ffestb_local_.find.ix].value | |
18764 | = ffelex_token_use (t); | |
18765 | return (ffelexHandler) ffestb_V0268_; | |
18766 | ||
18767 | default: | |
18768 | break; | |
18769 | } | |
18770 | ||
18771 | ffestb_subr_kill_find_ (); | |
18772 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t); | |
18773 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18774 | } | |
18775 | ||
18776 | /* ffestb_V0268_ -- "FIND" OPEN_PAREN ... NAME EQUALS NUMBER | |
18777 | ||
18778 | return ffestb_V0268_; // to lexer | |
18779 | ||
18780 | Handle COMMA or CLOSE_PAREN here. */ | |
18781 | ||
18782 | static ffelexHandler | |
18783 | ffestb_V0268_ (ffelexToken t) | |
18784 | { | |
18785 | switch (ffelex_token_type (t)) | |
18786 | { | |
18787 | case FFELEX_typeCOMMA: | |
18788 | return (ffelexHandler) ffestb_V0264_; | |
18789 | ||
18790 | case FFELEX_typeCLOSE_PAREN: | |
18791 | return (ffelexHandler) ffestb_V0269_; | |
18792 | ||
18793 | default: | |
18794 | break; | |
18795 | } | |
18796 | ||
18797 | ffestb_subr_kill_find_ (); | |
18798 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t); | |
18799 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18800 | } | |
18801 | ||
18802 | /* ffestb_V0269_ -- "FIND" OPEN_PAREN ... CLOSE_PAREN | |
18803 | ||
18804 | return ffestb_V0269_; // to lexer | |
18805 | ||
18806 | Handle EOS or SEMICOLON here. */ | |
18807 | ||
18808 | static ffelexHandler | |
18809 | ffestb_V0269_ (ffelexToken t) | |
18810 | { | |
18811 | switch (ffelex_token_type (t)) | |
18812 | { | |
18813 | case FFELEX_typeEOS: | |
18814 | case FFELEX_typeSEMICOLON: | |
18815 | ffesta_confirmed (); | |
18816 | if (!ffesta_is_inhibited ()) | |
18817 | ffestc_V026 (); | |
18818 | ffestb_subr_kill_find_ (); | |
18819 | return (ffelexHandler) ffesta_zero (t); | |
18820 | ||
18821 | default: | |
18822 | break; | |
18823 | } | |
18824 | ||
18825 | ffestb_subr_kill_find_ (); | |
18826 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FIND", t); | |
18827 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18828 | } | |
18829 | ||
18830 | #endif | |
18831 | /* ffestb_dimlist -- Parse the ALLOCATABLE/POINTER/TARGET statement | |
18832 | ||
18833 | return ffestb_dimlist; // to lexer | |
18834 | ||
18835 | Make sure the statement has a valid form for the ALLOCATABLE/POINTER/ | |
18836 | TARGET statement. If it does, implement the statement. */ | |
18837 | ||
18838 | #if FFESTR_F90 | |
18839 | ffelexHandler | |
18840 | ffestb_dimlist (ffelexToken t) | |
18841 | { | |
18842 | ffeTokenLength i; | |
18843 | char *p; | |
18844 | ffelexToken nt; | |
18845 | ffelexHandler next; | |
18846 | ||
18847 | switch (ffelex_token_type (ffesta_tokens[0])) | |
18848 | { | |
18849 | case FFELEX_typeNAME: | |
18850 | switch (ffelex_token_type (t)) | |
18851 | { | |
18852 | case FFELEX_typeCOMMA: | |
18853 | case FFELEX_typeEOS: | |
18854 | case FFELEX_typeSEMICOLON: | |
18855 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
18856 | goto bad_1; /* :::::::::::::::::::: */ | |
18857 | ||
18858 | default: | |
18859 | goto bad_1; /* :::::::::::::::::::: */ | |
18860 | ||
18861 | case FFELEX_typeCOLONCOLON: | |
18862 | ffesta_confirmed (); | |
18863 | if (!ffesta_is_inhibited ()) | |
18864 | { | |
18865 | switch (ffesta_first_kw) | |
18866 | { | |
18867 | case FFESTR_firstALLOCATABLE: | |
18868 | ffestc_R525_start (); | |
18869 | break; | |
18870 | ||
18871 | case FFESTR_firstPOINTER: | |
18872 | ffestc_R526_start (); | |
18873 | break; | |
18874 | ||
18875 | case FFESTR_firstTARGET: | |
18876 | ffestc_R527_start (); | |
18877 | break; | |
18878 | ||
18879 | default: | |
18880 | assert (FALSE); | |
18881 | } | |
18882 | } | |
18883 | ffestb_local_.dimlist.started = TRUE; | |
18884 | return (ffelexHandler) ffestb_dimlist1_; | |
18885 | ||
18886 | case FFELEX_typeNAME: | |
18887 | ffesta_confirmed (); | |
18888 | if (!ffesta_is_inhibited ()) | |
18889 | { | |
18890 | switch (ffesta_first_kw) | |
18891 | { | |
18892 | case FFESTR_firstALLOCATABLE: | |
18893 | ffestc_R525_start (); | |
18894 | break; | |
18895 | ||
18896 | case FFESTR_firstPOINTER: | |
18897 | ffestc_R526_start (); | |
18898 | break; | |
18899 | ||
18900 | case FFESTR_firstTARGET: | |
18901 | ffestc_R527_start (); | |
18902 | break; | |
18903 | ||
18904 | default: | |
18905 | assert (FALSE); | |
18906 | } | |
18907 | } | |
18908 | ffestb_local_.dimlist.started = TRUE; | |
18909 | return (ffelexHandler) ffestb_dimlist1_ (t); | |
18910 | } | |
18911 | ||
18912 | case FFELEX_typeNAMES: | |
18913 | p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.dimlist.len); | |
18914 | switch (ffelex_token_type (t)) | |
18915 | { | |
18916 | default: | |
18917 | goto bad_1; /* :::::::::::::::::::: */ | |
18918 | ||
18919 | case FFELEX_typeEOS: | |
18920 | case FFELEX_typeSEMICOLON: | |
18921 | case FFELEX_typeCOMMA: | |
18922 | ffesta_confirmed (); | |
18923 | if (!ffesrc_is_name_init (*p)) | |
18924 | goto bad_i; /* :::::::::::::::::::: */ | |
18925 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
18926 | if (!ffesta_is_inhibited ()) | |
18927 | { | |
18928 | switch (ffesta_first_kw) | |
18929 | { | |
18930 | case FFESTR_firstALLOCATABLE: | |
18931 | ffestc_R525_start (); | |
18932 | break; | |
18933 | ||
18934 | case FFESTR_firstPOINTER: | |
18935 | ffestc_R526_start (); | |
18936 | break; | |
18937 | ||
18938 | case FFESTR_firstTARGET: | |
18939 | ffestc_R527_start (); | |
18940 | break; | |
18941 | ||
18942 | default: | |
18943 | assert (FALSE); | |
18944 | } | |
18945 | } | |
18946 | ffestb_local_.dimlist.started = TRUE; | |
18947 | next = (ffelexHandler) ffestb_dimlist1_ (nt); | |
18948 | ffelex_token_kill (nt); | |
18949 | return (ffelexHandler) (*next) (t); | |
18950 | ||
18951 | case FFELEX_typeCOLONCOLON: | |
18952 | ffesta_confirmed (); | |
18953 | if (*p != '\0') | |
18954 | goto bad_i; /* :::::::::::::::::::: */ | |
18955 | if (!ffesta_is_inhibited ()) | |
18956 | { | |
18957 | switch (ffesta_first_kw) | |
18958 | { | |
18959 | case FFESTR_firstALLOCATABLE: | |
18960 | ffestc_R525_start (); | |
18961 | break; | |
18962 | ||
18963 | case FFESTR_firstPOINTER: | |
18964 | ffestc_R526_start (); | |
18965 | break; | |
18966 | ||
18967 | case FFESTR_firstTARGET: | |
18968 | ffestc_R527_start (); | |
18969 | break; | |
18970 | ||
18971 | default: | |
18972 | assert (FALSE); | |
18973 | } | |
18974 | } | |
18975 | ffestb_local_.dimlist.started = TRUE; | |
18976 | return (ffelexHandler) ffestb_dimlist1_; | |
18977 | ||
18978 | case FFELEX_typeOPEN_PAREN: | |
18979 | if (!ffesrc_is_name_init (*p)) | |
18980 | goto bad_i; /* :::::::::::::::::::: */ | |
18981 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
18982 | ffestb_local_.dimlist.started = FALSE; | |
18983 | next = (ffelexHandler) ffestb_dimlist1_ (nt); | |
18984 | ffelex_token_kill (nt); | |
18985 | return (ffelexHandler) (*next) (t); | |
18986 | } | |
18987 | ||
18988 | default: | |
18989 | goto bad_0; /* :::::::::::::::::::: */ | |
18990 | } | |
18991 | ||
18992 | bad_0: /* :::::::::::::::::::: */ | |
18993 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, ffesta_tokens[0]); | |
18994 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
18995 | ||
18996 | bad_1: /* :::::::::::::::::::: */ | |
18997 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t); | |
18998 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
18999 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
19000 | ||
19001 | bad_i: /* :::::::::::::::::::: */ | |
19002 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, ffesta_tokens[0], i, t); | |
19003 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19004 | } | |
19005 | ||
19006 | /* ffestb_dimlist1_ -- "ALLOCATABLE/POINTER/TARGET" [COLONCOLON] | |
19007 | ||
19008 | return ffestb_dimlist1_; // to lexer | |
19009 | ||
19010 | Handle NAME. */ | |
19011 | ||
19012 | static ffelexHandler | |
19013 | ffestb_dimlist1_ (ffelexToken t) | |
19014 | { | |
19015 | switch (ffelex_token_type (t)) | |
19016 | { | |
19017 | case FFELEX_typeNAME: | |
19018 | ffesta_tokens[1] = ffelex_token_use (t); | |
19019 | return (ffelexHandler) ffestb_dimlist2_; | |
19020 | ||
19021 | default: | |
19022 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t); | |
19023 | break; | |
19024 | } | |
19025 | ||
19026 | if (!ffesta_is_inhibited ()) | |
19027 | { | |
19028 | switch (ffesta_first_kw) | |
19029 | { | |
19030 | case FFESTR_firstALLOCATABLE: | |
19031 | ffestc_R525_finish (); | |
19032 | break; | |
19033 | ||
19034 | case FFESTR_firstPOINTER: | |
19035 | ffestc_R526_finish (); | |
19036 | break; | |
19037 | ||
19038 | case FFESTR_firstTARGET: | |
19039 | ffestc_R527_finish (); | |
19040 | break; | |
19041 | ||
19042 | default: | |
19043 | assert (FALSE); | |
19044 | } | |
19045 | } | |
19046 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19047 | } | |
19048 | ||
19049 | /* ffestb_dimlist2_ -- "ALLOCATABLE/POINTER/TARGET" ... NAME | |
19050 | ||
19051 | return ffestb_dimlist2_; // to lexer | |
19052 | ||
19053 | Handle OPEN_PAREN. */ | |
19054 | ||
19055 | static ffelexHandler | |
19056 | ffestb_dimlist2_ (ffelexToken t) | |
19057 | { | |
19058 | switch (ffelex_token_type (t)) | |
19059 | { | |
19060 | case FFELEX_typeOPEN_PAREN: | |
19061 | ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create (); | |
19062 | ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_dimlist3_; | |
19063 | ffestb_subrargs_.dim_list.pool = ffesta_output_pool; | |
19064 | ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLIST; | |
19065 | #ifdef FFECOM_dimensionsMAX | |
19066 | ffestb_subrargs_.dim_list.ndims = 0; | |
19067 | #endif | |
19068 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
19069 | FFEEXPR_contextDIMLIST, (ffeexprCallback) ffestb_subr_dimlist_); | |
19070 | ||
19071 | case FFELEX_typeCOMMA: | |
19072 | ffesta_confirmed (); | |
19073 | if (!ffesta_is_inhibited ()) | |
19074 | { | |
19075 | if (!ffestb_local_.dimlist.started) | |
19076 | { | |
19077 | switch (ffesta_first_kw) | |
19078 | { | |
19079 | case FFESTR_firstALLOCATABLE: | |
19080 | ffestc_R525_start (); | |
19081 | break; | |
19082 | ||
19083 | case FFESTR_firstPOINTER: | |
19084 | ffestc_R526_start (); | |
19085 | break; | |
19086 | ||
19087 | case FFESTR_firstTARGET: | |
19088 | ffestc_R527_start (); | |
19089 | break; | |
19090 | ||
19091 | default: | |
19092 | assert (FALSE); | |
19093 | } | |
19094 | ffestb_local_.dimlist.started = TRUE; | |
19095 | } | |
19096 | switch (ffesta_first_kw) | |
19097 | { | |
19098 | case FFESTR_firstALLOCATABLE: | |
19099 | ffestc_R525_item (ffesta_tokens[1], NULL); | |
19100 | break; | |
19101 | ||
19102 | case FFESTR_firstPOINTER: | |
19103 | ffestc_R526_item (ffesta_tokens[1], NULL); | |
19104 | break; | |
19105 | ||
19106 | case FFESTR_firstTARGET: | |
19107 | ffestc_R527_item (ffesta_tokens[1], NULL); | |
19108 | break; | |
19109 | ||
19110 | default: | |
19111 | assert (FALSE); | |
19112 | } | |
19113 | } | |
19114 | ffelex_token_kill (ffesta_tokens[1]); | |
19115 | return (ffelexHandler) ffestb_dimlist4_; | |
19116 | ||
19117 | case FFELEX_typeEOS: | |
19118 | case FFELEX_typeSEMICOLON: | |
19119 | ffesta_confirmed (); | |
19120 | if (!ffesta_is_inhibited ()) | |
19121 | { | |
19122 | if (!ffestb_local_.dimlist.started) | |
19123 | { | |
19124 | switch (ffesta_first_kw) | |
19125 | { | |
19126 | case FFESTR_firstALLOCATABLE: | |
19127 | ffestc_R525_start (); | |
19128 | break; | |
19129 | ||
19130 | case FFESTR_firstPOINTER: | |
19131 | ffestc_R526_start (); | |
19132 | break; | |
19133 | ||
19134 | case FFESTR_firstTARGET: | |
19135 | ffestc_R527_start (); | |
19136 | break; | |
19137 | ||
19138 | default: | |
19139 | assert (FALSE); | |
19140 | } | |
19141 | } | |
19142 | switch (ffesta_first_kw) | |
19143 | { | |
19144 | case FFESTR_firstALLOCATABLE: | |
19145 | ffestc_R525_item (ffesta_tokens[1], NULL); | |
19146 | ffestc_R525_finish (); | |
19147 | break; | |
19148 | ||
19149 | case FFESTR_firstPOINTER: | |
19150 | ffestc_R526_item (ffesta_tokens[1], NULL); | |
19151 | ffestc_R526_finish (); | |
19152 | break; | |
19153 | ||
19154 | case FFESTR_firstTARGET: | |
19155 | ffestc_R527_item (ffesta_tokens[1], NULL); | |
19156 | ffestc_R527_finish (); | |
19157 | break; | |
19158 | ||
19159 | default: | |
19160 | assert (FALSE); | |
19161 | } | |
19162 | } | |
19163 | ffelex_token_kill (ffesta_tokens[1]); | |
19164 | return (ffelexHandler) ffesta_zero (t); | |
19165 | ||
19166 | default: | |
19167 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t); | |
19168 | break; | |
19169 | } | |
19170 | ||
19171 | if (!ffesta_is_inhibited ()) | |
19172 | { | |
19173 | switch (ffesta_first_kw) | |
19174 | { | |
19175 | case FFESTR_firstALLOCATABLE: | |
19176 | ffestc_R525_finish (); | |
19177 | break; | |
19178 | ||
19179 | case FFESTR_firstPOINTER: | |
19180 | ffestc_R526_finish (); | |
19181 | break; | |
19182 | ||
19183 | case FFESTR_firstTARGET: | |
19184 | ffestc_R527_finish (); | |
19185 | break; | |
19186 | ||
19187 | default: | |
19188 | assert (FALSE); | |
19189 | } | |
19190 | } | |
19191 | ffelex_token_kill (ffesta_tokens[1]); | |
19192 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19193 | } | |
19194 | ||
19195 | /* ffestb_dimlist3_ -- "ALLOCATABLE/POINTER/TARGET" ... NAME OPEN_PAREN | |
19196 | dimlist CLOSE_PAREN | |
19197 | ||
19198 | return ffestb_dimlist3_; // to lexer | |
19199 | ||
19200 | Handle COMMA or EOS/SEMICOLON. */ | |
19201 | ||
19202 | static ffelexHandler | |
19203 | ffestb_dimlist3_ (ffelexToken t) | |
19204 | { | |
19205 | if (!ffestb_subrargs_.dim_list.ok) | |
19206 | goto bad; /* :::::::::::::::::::: */ | |
19207 | ||
19208 | switch (ffelex_token_type (t)) | |
19209 | { | |
19210 | case FFELEX_typeCOMMA: | |
19211 | ffesta_confirmed (); | |
19212 | if (!ffesta_is_inhibited ()) | |
19213 | { | |
19214 | if (!ffestb_local_.dimlist.started) | |
19215 | { | |
19216 | switch (ffesta_first_kw) | |
19217 | { | |
19218 | case FFESTR_firstALLOCATABLE: | |
19219 | ffestc_R525_start (); | |
19220 | break; | |
19221 | ||
19222 | case FFESTR_firstPOINTER: | |
19223 | ffestc_R526_start (); | |
19224 | break; | |
19225 | ||
19226 | case FFESTR_firstTARGET: | |
19227 | ffestc_R527_start (); | |
19228 | break; | |
19229 | ||
19230 | default: | |
19231 | assert (FALSE); | |
19232 | } | |
19233 | ffestb_local_.dimlist.started = TRUE; | |
19234 | } | |
19235 | switch (ffesta_first_kw) | |
19236 | { | |
19237 | case FFESTR_firstALLOCATABLE: | |
19238 | ffestc_R525_item (ffesta_tokens[1], | |
19239 | ffestb_subrargs_.dim_list.dims); | |
19240 | break; | |
19241 | ||
19242 | case FFESTR_firstPOINTER: | |
19243 | ffestc_R526_item (ffesta_tokens[1], | |
19244 | ffestb_subrargs_.dim_list.dims); | |
19245 | break; | |
19246 | ||
19247 | case FFESTR_firstTARGET: | |
19248 | ffestc_R527_item (ffesta_tokens[1], | |
19249 | ffestb_subrargs_.dim_list.dims); | |
19250 | break; | |
19251 | ||
19252 | default: | |
19253 | assert (FALSE); | |
19254 | } | |
19255 | } | |
19256 | ffelex_token_kill (ffesta_tokens[1]); | |
19257 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
19258 | return (ffelexHandler) ffestb_dimlist4_; | |
19259 | ||
19260 | case FFELEX_typeEOS: | |
19261 | case FFELEX_typeSEMICOLON: | |
19262 | ffesta_confirmed (); | |
19263 | if (!ffesta_is_inhibited ()) | |
19264 | { | |
19265 | if (!ffestb_local_.dimlist.started) | |
19266 | { | |
19267 | switch (ffesta_first_kw) | |
19268 | { | |
19269 | case FFESTR_firstALLOCATABLE: | |
19270 | ffestc_R525_start (); | |
19271 | break; | |
19272 | ||
19273 | case FFESTR_firstPOINTER: | |
19274 | ffestc_R526_start (); | |
19275 | break; | |
19276 | ||
19277 | case FFESTR_firstTARGET: | |
19278 | ffestc_R527_start (); | |
19279 | break; | |
19280 | ||
19281 | default: | |
19282 | assert (FALSE); | |
19283 | } | |
19284 | } | |
19285 | switch (ffesta_first_kw) | |
19286 | { | |
19287 | case FFESTR_firstALLOCATABLE: | |
19288 | ffestc_R525_item (ffesta_tokens[1], | |
19289 | ffestb_subrargs_.dim_list.dims); | |
19290 | ffestc_R525_finish (); | |
19291 | break; | |
19292 | ||
19293 | case FFESTR_firstPOINTER: | |
19294 | ffestc_R526_item (ffesta_tokens[1], | |
19295 | ffestb_subrargs_.dim_list.dims); | |
19296 | ffestc_R526_finish (); | |
19297 | break; | |
19298 | ||
19299 | case FFESTR_firstTARGET: | |
19300 | ffestc_R527_item (ffesta_tokens[1], | |
19301 | ffestb_subrargs_.dim_list.dims); | |
19302 | ffestc_R527_finish (); | |
19303 | break; | |
19304 | ||
19305 | default: | |
19306 | assert (FALSE); | |
19307 | } | |
19308 | } | |
19309 | ffelex_token_kill (ffesta_tokens[1]); | |
19310 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
19311 | return (ffelexHandler) ffesta_zero (t); | |
19312 | ||
19313 | default: | |
19314 | break; | |
19315 | } | |
19316 | ||
19317 | bad: /* :::::::::::::::::::: */ | |
19318 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t); | |
19319 | if (ffestb_local_.dimlist.started && !ffesta_is_inhibited ()) | |
19320 | { | |
19321 | switch (ffesta_first_kw) | |
19322 | { | |
19323 | case FFESTR_firstALLOCATABLE: | |
19324 | ffestc_R525_finish (); | |
19325 | break; | |
19326 | ||
19327 | case FFESTR_firstPOINTER: | |
19328 | ffestc_R526_finish (); | |
19329 | break; | |
19330 | ||
19331 | case FFESTR_firstTARGET: | |
19332 | ffestc_R527_finish (); | |
19333 | break; | |
19334 | ||
19335 | default: | |
19336 | assert (FALSE); | |
19337 | } | |
19338 | } | |
19339 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
19340 | ffelex_token_kill (ffesta_tokens[1]); | |
19341 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19342 | } | |
19343 | ||
19344 | /* ffestb_dimlist4_ -- "ALLOCATABLE/POINTER/TARGET" ... COMMA | |
19345 | ||
19346 | return ffestb_dimlist4_; // to lexer | |
19347 | ||
19348 | Make sure we don't have EOS or SEMICOLON. */ | |
19349 | ||
19350 | static ffelexHandler | |
19351 | ffestb_dimlist4_ (ffelexToken t) | |
19352 | { | |
19353 | switch (ffelex_token_type (t)) | |
19354 | { | |
19355 | case FFELEX_typeEOS: | |
19356 | case FFELEX_typeSEMICOLON: | |
19357 | if (!ffesta_is_inhibited ()) | |
19358 | { | |
19359 | switch (ffesta_first_kw) | |
19360 | { | |
19361 | case FFESTR_firstALLOCATABLE: | |
19362 | ffestc_R525_finish (); | |
19363 | break; | |
19364 | ||
19365 | case FFESTR_firstPOINTER: | |
19366 | ffestc_R526_finish (); | |
19367 | break; | |
19368 | ||
19369 | case FFESTR_firstTARGET: | |
19370 | ffestc_R527_finish (); | |
19371 | break; | |
19372 | ||
19373 | default: | |
19374 | assert (FALSE); | |
19375 | } | |
19376 | } | |
19377 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dimlist.badname, t); | |
19378 | return (ffelexHandler) ffesta_zero (t); | |
19379 | ||
19380 | default: | |
19381 | return (ffelexHandler) ffestb_dimlist1_ (t); | |
19382 | } | |
19383 | } | |
19384 | ||
19385 | #endif | |
19386 | /* ffestb_dummy -- Parse an ENTRY/FUNCTION/SUBROUTINE statement | |
19387 | ||
19388 | return ffestb_dummy; // to lexer | |
19389 | ||
19390 | Make sure the statement has a valid form for an ENTRY/FUNCTION/SUBROUTINE | |
19391 | statement. If it does, implement the statement. */ | |
19392 | ||
19393 | ffelexHandler | |
19394 | ffestb_dummy (ffelexToken t) | |
19395 | { | |
19396 | ffeTokenLength i; | |
19397 | char *p; | |
19398 | ||
19399 | switch (ffelex_token_type (ffesta_tokens[0])) | |
19400 | { | |
19401 | case FFELEX_typeNAME: | |
19402 | switch (ffelex_token_type (t)) | |
19403 | { | |
19404 | case FFELEX_typeEOS: | |
19405 | case FFELEX_typeSEMICOLON: | |
19406 | case FFELEX_typeCOMMA: | |
19407 | case FFELEX_typeCOLONCOLON: | |
19408 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
19409 | goto bad_1; /* :::::::::::::::::::: */ | |
19410 | ||
19411 | default: | |
19412 | goto bad_1; /* :::::::::::::::::::: */ | |
19413 | ||
19414 | case FFELEX_typeNAME: | |
19415 | break; | |
19416 | } | |
19417 | ||
19418 | ffesta_confirmed (); | |
19419 | ffesta_tokens[1] = ffelex_token_use (t); | |
19420 | ffestb_local_.decl.recursive = NULL; | |
19421 | ffestb_local_.dummy.badname = ffestb_args.dummy.badname; | |
19422 | ffestb_local_.dummy.is_subr = ffestb_args.dummy.is_subr; | |
19423 | ffestb_local_.dummy.first_kw = ffesta_first_kw; | |
19424 | return (ffelexHandler) ffestb_dummy1_; | |
19425 | ||
19426 | case FFELEX_typeNAMES: | |
19427 | switch (ffelex_token_type (t)) | |
19428 | { | |
19429 | case FFELEX_typeCOMMA: | |
19430 | case FFELEX_typeCOLONCOLON: | |
19431 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
19432 | goto bad_1; /* :::::::::::::::::::: */ | |
19433 | ||
19434 | default: | |
19435 | goto bad_1; /* :::::::::::::::::::: */ | |
19436 | ||
19437 | case FFELEX_typeEOS: | |
19438 | case FFELEX_typeSEMICOLON: | |
19439 | ffesta_confirmed (); | |
19440 | break; | |
19441 | ||
19442 | case FFELEX_typeOPEN_PAREN: | |
19443 | break; | |
19444 | } | |
19445 | p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.dummy.len); | |
19446 | if (!ffesrc_is_name_init (*p)) | |
19447 | goto bad_i; /* :::::::::::::::::::: */ | |
19448 | ffesta_tokens[1] | |
19449 | = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
19450 | ffestb_local_.decl.recursive = NULL; | |
19451 | ffestb_local_.dummy.badname = ffestb_args.dummy.badname; | |
19452 | ffestb_local_.dummy.is_subr = ffestb_args.dummy.is_subr; | |
19453 | ffestb_local_.dummy.first_kw = ffesta_first_kw; | |
19454 | return (ffelexHandler) ffestb_dummy1_ (t); | |
19455 | ||
19456 | default: | |
19457 | goto bad_0; /* :::::::::::::::::::: */ | |
19458 | } | |
19459 | ||
19460 | bad_0: /* :::::::::::::::::::: */ | |
19461 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, ffesta_tokens[0]); | |
19462 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19463 | ||
19464 | bad_1: /* :::::::::::::::::::: */ | |
19465 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, t); | |
19466 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
19467 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
19468 | ||
19469 | bad_i: /* :::::::::::::::::::: */ | |
19470 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.dummy.badname, ffesta_tokens[0], i, t); | |
19471 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19472 | } | |
19473 | ||
19474 | /* ffestb_dummy1_ -- "ENTRY/FUNCTION/SUBROUTINE" NAME | |
19475 | ||
19476 | return ffestb_dummy1_; // to lexer | |
19477 | ||
19478 | Make sure the next token is an EOS, SEMICOLON, or OPEN_PAREN. In the | |
19479 | former case, just implement a null arg list, else get the arg list and | |
19480 | then implement. */ | |
19481 | ||
19482 | static ffelexHandler | |
19483 | ffestb_dummy1_ (ffelexToken t) | |
19484 | { | |
19485 | switch (ffelex_token_type (t)) | |
19486 | { | |
19487 | case FFELEX_typeEOS: | |
19488 | case FFELEX_typeSEMICOLON: | |
19489 | if (ffestb_local_.dummy.first_kw == FFESTR_firstFUNCTION) | |
19490 | { | |
19491 | ffesta_confirmed (); /* Later, not if typename w/o RECURSIVE. */ | |
19492 | break; /* Produce an error message, need that open | |
19493 | paren. */ | |
19494 | } | |
19495 | ffesta_confirmed (); | |
19496 | if (!ffesta_is_inhibited ()) | |
19497 | { /* Pretend as though we got a truly NULL | |
19498 | list. */ | |
19499 | ffestb_subrargs_.name_list.args = NULL; | |
19500 | ffestb_subrargs_.name_list.ok = TRUE; | |
19501 | ffestb_subrargs_.name_list.close_paren = ffelex_token_use (t); | |
19502 | return (ffelexHandler) ffestb_dummy2_ (t); | |
19503 | } | |
19504 | if (ffestb_local_.decl.recursive != NULL) | |
19505 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
19506 | ffelex_token_kill (ffesta_tokens[1]); | |
19507 | return (ffelexHandler) ffesta_zero (t); | |
19508 | ||
19509 | case FFELEX_typeOPEN_PAREN: | |
19510 | ffestb_subrargs_.name_list.args = ffestt_tokenlist_create (); | |
19511 | ffestb_subrargs_.name_list.handler = (ffelexHandler) ffestb_dummy2_; | |
19512 | ffestb_subrargs_.name_list.is_subr = ffestb_local_.dummy.is_subr; | |
19513 | ffestb_subrargs_.name_list.names = FALSE; | |
19514 | return (ffelexHandler) ffestb_subr_name_list_; | |
19515 | ||
19516 | default: | |
19517 | break; | |
19518 | } | |
19519 | ||
19520 | if (ffestb_local_.decl.recursive != NULL) | |
19521 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
19522 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_local_.dummy.badname, t); | |
19523 | ffelex_token_kill (ffesta_tokens[1]); | |
19524 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19525 | } | |
19526 | ||
19527 | /* ffestb_dummy2_ -- <dummy-keyword> NAME OPEN_PAREN arg-list CLOSE_PAREN | |
19528 | ||
19529 | return ffestb_dummy2_; // to lexer | |
19530 | ||
19531 | Make sure the statement has a valid form for a dummy-def statement. If it | |
19532 | does, implement the statement. */ | |
19533 | ||
19534 | static ffelexHandler | |
19535 | ffestb_dummy2_ (ffelexToken t) | |
19536 | { | |
19537 | if (!ffestb_subrargs_.name_list.ok) | |
19538 | goto bad; /* :::::::::::::::::::: */ | |
19539 | ||
19540 | switch (ffelex_token_type (t)) | |
19541 | { | |
19542 | case FFELEX_typeEOS: | |
19543 | case FFELEX_typeSEMICOLON: | |
19544 | ffesta_confirmed (); | |
19545 | if (!ffesta_is_inhibited ()) | |
19546 | { | |
19547 | switch (ffestb_local_.dummy.first_kw) | |
19548 | { | |
19549 | case FFESTR_firstFUNCTION: | |
19550 | ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args, | |
19551 | ffestb_subrargs_.name_list.close_paren, FFESTP_typeNone, | |
19552 | NULL, NULL, NULL, NULL, ffestb_local_.decl.recursive, NULL); | |
19553 | break; | |
19554 | ||
19555 | case FFESTR_firstSUBROUTINE: | |
19556 | ffestc_R1223 (ffesta_tokens[1], ffestb_subrargs_.name_list.args, | |
19557 | ffestb_subrargs_.name_list.close_paren, | |
19558 | ffestb_local_.decl.recursive); | |
19559 | break; | |
19560 | ||
19561 | case FFESTR_firstENTRY: | |
19562 | ffestc_R1226 (ffesta_tokens[1], ffestb_subrargs_.name_list.args, | |
19563 | ffestb_subrargs_.name_list.close_paren); | |
19564 | break; | |
19565 | ||
19566 | default: | |
19567 | assert (FALSE); | |
19568 | } | |
19569 | } | |
19570 | ffelex_token_kill (ffesta_tokens[1]); | |
19571 | if (ffestb_local_.decl.recursive != NULL) | |
19572 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
19573 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
19574 | if (ffestb_subrargs_.name_list.args != NULL) | |
19575 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
19576 | return (ffelexHandler) ffesta_zero (t); | |
19577 | ||
19578 | case FFELEX_typeNAME: | |
19579 | ffesta_confirmed (); | |
19580 | if ((ffestb_local_.dummy.first_kw != FFESTR_firstFUNCTION) | |
19581 | || (ffestr_other (t) != FFESTR_otherRESULT)) | |
19582 | break; | |
19583 | ffestb_local_.decl.type = FFESTP_typeNone; | |
19584 | ffestb_local_.decl.kind = NULL; | |
19585 | ffestb_local_.decl.kindt = NULL; | |
19586 | ffestb_local_.decl.len = NULL; | |
19587 | ffestb_local_.decl.lent = NULL; | |
19588 | return (ffelexHandler) ffestb_decl_funcname_6_; | |
19589 | ||
19590 | default: | |
19591 | break; | |
19592 | } | |
19593 | ||
19594 | bad: /* :::::::::::::::::::: */ | |
19595 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_local_.dummy.badname, t); | |
19596 | ffelex_token_kill (ffesta_tokens[1]); | |
19597 | if (ffestb_local_.decl.recursive != NULL) | |
19598 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
19599 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
19600 | if (ffestb_subrargs_.name_list.args != NULL) | |
19601 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
19602 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19603 | } | |
19604 | ||
19605 | /* ffestb_R524 -- Parse the DIMENSION statement | |
19606 | ||
19607 | return ffestb_R524; // to lexer | |
19608 | ||
19609 | Make sure the statement has a valid form for the DIMENSION statement. If | |
19610 | it does, implement the statement. */ | |
19611 | ||
19612 | ffelexHandler | |
19613 | ffestb_R524 (ffelexToken t) | |
19614 | { | |
19615 | ffeTokenLength i; | |
19616 | char *p; | |
19617 | ffelexToken nt; | |
19618 | ffelexHandler next; | |
19619 | ||
19620 | switch (ffelex_token_type (ffesta_tokens[0])) | |
19621 | { | |
19622 | case FFELEX_typeNAME: | |
19623 | switch (ffelex_token_type (t)) | |
19624 | { | |
19625 | case FFELEX_typeCOMMA: | |
19626 | case FFELEX_typeCOLONCOLON: | |
19627 | case FFELEX_typeEOS: | |
19628 | case FFELEX_typeSEMICOLON: | |
19629 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
19630 | goto bad_1; /* :::::::::::::::::::: */ | |
19631 | ||
19632 | default: | |
19633 | goto bad_1; /* :::::::::::::::::::: */ | |
19634 | ||
19635 | case FFELEX_typeNAME: | |
19636 | ffesta_confirmed (); | |
19637 | if (!ffesta_is_inhibited ()) | |
19638 | ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL); | |
19639 | ffestb_local_.dimension.started = TRUE; | |
19640 | return (ffelexHandler) ffestb_R5241_ (t); | |
19641 | } | |
19642 | ||
19643 | case FFELEX_typeNAMES: | |
19644 | p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.R524.len); | |
19645 | switch (ffelex_token_type (t)) | |
19646 | { | |
19647 | default: | |
19648 | goto bad_1; /* :::::::::::::::::::: */ | |
19649 | ||
19650 | case FFELEX_typeEOS: | |
19651 | case FFELEX_typeSEMICOLON: | |
19652 | case FFELEX_typeCOMMA: | |
19653 | case FFELEX_typeCOLONCOLON: | |
19654 | ffesta_confirmed (); | |
19655 | goto bad_1; /* :::::::::::::::::::: */ | |
19656 | ||
19657 | case FFELEX_typeOPEN_PAREN: | |
19658 | break; | |
19659 | } | |
19660 | ||
19661 | /* Here, we have at least one char after "DIMENSION" and t is | |
19662 | OPEN_PAREN. */ | |
19663 | ||
19664 | if (!ffesrc_is_name_init (*p)) | |
19665 | goto bad_i; /* :::::::::::::::::::: */ | |
19666 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
19667 | ffestb_local_.dimension.started = FALSE; | |
19668 | next = (ffelexHandler) ffestb_R5241_ (nt); | |
19669 | ffelex_token_kill (nt); | |
19670 | return (ffelexHandler) (*next) (t); | |
19671 | ||
19672 | default: | |
19673 | goto bad_0; /* :::::::::::::::::::: */ | |
19674 | } | |
19675 | ||
19676 | bad_0: /* :::::::::::::::::::: */ | |
19677 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, ffesta_tokens[0]); | |
19678 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19679 | ||
19680 | bad_1: /* :::::::::::::::::::: */ | |
19681 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t); | |
19682 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
19683 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
19684 | ||
19685 | bad_i: /* :::::::::::::::::::: */ | |
19686 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, ffesta_tokens[0], i, t); | |
19687 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19688 | } | |
19689 | ||
19690 | /* ffestb_R5241_ -- "DIMENSION" | |
19691 | ||
19692 | return ffestb_R5241_; // to lexer | |
19693 | ||
19694 | Handle NAME. */ | |
19695 | ||
19696 | static ffelexHandler | |
19697 | ffestb_R5241_ (ffelexToken t) | |
19698 | { | |
19699 | switch (ffelex_token_type (t)) | |
19700 | { | |
19701 | case FFELEX_typeNAME: | |
19702 | ffesta_tokens[1] = ffelex_token_use (t); | |
19703 | return (ffelexHandler) ffestb_R5242_; | |
19704 | ||
19705 | default: | |
19706 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t); | |
19707 | break; | |
19708 | } | |
19709 | ||
19710 | if (!ffesta_is_inhibited ()) | |
19711 | ffestc_R524_finish (); | |
19712 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19713 | } | |
19714 | ||
19715 | /* ffestb_R5242_ -- "DIMENSION" ... NAME | |
19716 | ||
19717 | return ffestb_R5242_; // to lexer | |
19718 | ||
19719 | Handle OPEN_PAREN. */ | |
19720 | ||
19721 | static ffelexHandler | |
19722 | ffestb_R5242_ (ffelexToken t) | |
19723 | { | |
19724 | switch (ffelex_token_type (t)) | |
19725 | { | |
19726 | case FFELEX_typeOPEN_PAREN: | |
19727 | ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create (); | |
19728 | ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_R5243_; | |
19729 | ffestb_subrargs_.dim_list.pool = ffesta_output_pool; | |
19730 | ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid | |
19731 | ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON; | |
19732 | #ifdef FFECOM_dimensionsMAX | |
19733 | ffestb_subrargs_.dim_list.ndims = 0; | |
19734 | #endif | |
19735 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
19736 | ffestb_subrargs_.dim_list.ctx, | |
19737 | (ffeexprCallback) ffestb_subr_dimlist_); | |
19738 | ||
19739 | default: | |
19740 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t); | |
19741 | break; | |
19742 | } | |
19743 | ||
19744 | if (!ffesta_is_inhibited ()) | |
19745 | ffestc_R524_finish (); | |
19746 | ffelex_token_kill (ffesta_tokens[1]); | |
19747 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19748 | } | |
19749 | ||
19750 | /* ffestb_R5243_ -- "DIMENSION" ... NAME OPEN_PAREN dimlist CLOSE_PAREN | |
19751 | ||
19752 | return ffestb_R5243_; // to lexer | |
19753 | ||
19754 | Handle COMMA or EOS/SEMICOLON. */ | |
19755 | ||
19756 | static ffelexHandler | |
19757 | ffestb_R5243_ (ffelexToken t) | |
19758 | { | |
19759 | if (!ffestb_subrargs_.dim_list.ok) | |
19760 | goto bad; /* :::::::::::::::::::: */ | |
19761 | ||
19762 | switch (ffelex_token_type (t)) | |
19763 | { | |
19764 | case FFELEX_typeCOMMA: | |
19765 | ffesta_confirmed (); | |
19766 | if (!ffesta_is_inhibited ()) | |
19767 | { | |
19768 | if (!ffestb_local_.dimension.started) | |
19769 | { | |
19770 | ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL); | |
19771 | ffestb_local_.dimension.started = TRUE; | |
19772 | } | |
19773 | ffestc_R524_item (ffesta_tokens[1], | |
19774 | ffestb_subrargs_.dim_list.dims); | |
19775 | } | |
19776 | ffelex_token_kill (ffesta_tokens[1]); | |
19777 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
19778 | return (ffelexHandler) ffestb_R5244_; | |
19779 | ||
19780 | case FFELEX_typeEOS: | |
19781 | case FFELEX_typeSEMICOLON: | |
19782 | ffesta_confirmed (); | |
19783 | if (!ffesta_is_inhibited ()) | |
19784 | { | |
19785 | if (!ffestb_local_.dimension.started) | |
19786 | { | |
19787 | ffestc_R524_start (ffesta_first_kw == FFESTR_firstVIRTUAL); | |
19788 | ffestb_local_.dimension.started = TRUE; | |
19789 | } | |
19790 | ffestc_R524_item (ffesta_tokens[1], | |
19791 | ffestb_subrargs_.dim_list.dims); | |
19792 | ffestc_R524_finish (); | |
19793 | } | |
19794 | ffelex_token_kill (ffesta_tokens[1]); | |
19795 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
19796 | return (ffelexHandler) ffesta_zero (t); | |
19797 | ||
19798 | default: | |
19799 | break; | |
19800 | } | |
19801 | ||
19802 | bad: /* :::::::::::::::::::: */ | |
19803 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t); | |
19804 | if (ffestb_local_.dimension.started && !ffesta_is_inhibited ()) | |
19805 | ffestc_R524_finish (); | |
19806 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
19807 | ffelex_token_kill (ffesta_tokens[1]); | |
19808 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19809 | } | |
19810 | ||
19811 | /* ffestb_R5244_ -- "DIMENSION" ... COMMA | |
19812 | ||
19813 | return ffestb_R5244_; // to lexer | |
19814 | ||
19815 | Make sure we don't have EOS or SEMICOLON. */ | |
19816 | ||
19817 | static ffelexHandler | |
19818 | ffestb_R5244_ (ffelexToken t) | |
19819 | { | |
19820 | switch (ffelex_token_type (t)) | |
19821 | { | |
19822 | case FFELEX_typeEOS: | |
19823 | case FFELEX_typeSEMICOLON: | |
19824 | if (!ffesta_is_inhibited ()) | |
19825 | ffestc_R524_finish (); | |
19826 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, ffestb_args.R524.badname, t); | |
19827 | return (ffelexHandler) ffesta_zero (t); | |
19828 | ||
19829 | default: | |
19830 | return (ffelexHandler) ffestb_R5241_ (t); | |
19831 | } | |
19832 | } | |
19833 | ||
19834 | /* ffestb_R547 -- Parse the COMMON statement | |
19835 | ||
19836 | return ffestb_R547; // to lexer | |
19837 | ||
19838 | Make sure the statement has a valid form for the COMMON statement. If it | |
19839 | does, implement the statement. */ | |
19840 | ||
19841 | ffelexHandler | |
19842 | ffestb_R547 (ffelexToken t) | |
19843 | { | |
19844 | ffeTokenLength i; | |
19845 | char *p; | |
19846 | ffelexToken nt; | |
19847 | ffelexHandler next; | |
19848 | ||
19849 | switch (ffelex_token_type (ffesta_tokens[0])) | |
19850 | { | |
19851 | case FFELEX_typeNAME: | |
19852 | if (ffesta_first_kw != FFESTR_firstCOMMON) | |
19853 | goto bad_0; /* :::::::::::::::::::: */ | |
19854 | switch (ffelex_token_type (t)) | |
19855 | { | |
19856 | case FFELEX_typeCOMMA: | |
19857 | case FFELEX_typeCOLONCOLON: | |
19858 | case FFELEX_typeEOS: | |
19859 | case FFELEX_typeSEMICOLON: | |
19860 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
19861 | goto bad_1; /* :::::::::::::::::::: */ | |
19862 | ||
19863 | default: | |
19864 | goto bad_1; /* :::::::::::::::::::: */ | |
19865 | ||
19866 | case FFELEX_typeNAME: | |
19867 | case FFELEX_typeSLASH: | |
19868 | case FFELEX_typeCONCAT: | |
19869 | ffesta_confirmed (); | |
19870 | if (!ffesta_is_inhibited ()) | |
19871 | ffestc_R547_start (); | |
19872 | ffestb_local_.common.started = TRUE; | |
19873 | return (ffelexHandler) ffestb_R5471_ (t); | |
19874 | } | |
19875 | ||
19876 | case FFELEX_typeNAMES: | |
19877 | if (ffesta_first_kw != FFESTR_firstCOMMON) | |
19878 | goto bad_0; /* :::::::::::::::::::: */ | |
19879 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCOMMON); | |
19880 | switch (ffelex_token_type (t)) | |
19881 | { | |
19882 | default: | |
19883 | goto bad_1; /* :::::::::::::::::::: */ | |
19884 | ||
19885 | case FFELEX_typeEOS: | |
19886 | case FFELEX_typeSEMICOLON: | |
19887 | case FFELEX_typeCOMMA: | |
19888 | case FFELEX_typeCOLONCOLON: | |
19889 | ffesta_confirmed (); | |
19890 | break; | |
19891 | ||
19892 | case FFELEX_typeSLASH: | |
19893 | case FFELEX_typeCONCAT: | |
19894 | ffesta_confirmed (); | |
19895 | if (*p != '\0') | |
19896 | break; | |
19897 | if (!ffesta_is_inhibited ()) | |
19898 | ffestc_R547_start (); | |
19899 | ffestb_local_.common.started = TRUE; | |
19900 | return (ffelexHandler) ffestb_R5471_ (t); | |
19901 | ||
19902 | case FFELEX_typeOPEN_PAREN: | |
19903 | break; | |
19904 | } | |
19905 | ||
19906 | /* Here, we have at least one char after "COMMON" and t is COMMA, | |
19907 | EOS/SEMICOLON, OPEN_PAREN, SLASH, or CONCAT. */ | |
19908 | ||
19909 | if (!ffesrc_is_name_init (*p)) | |
19910 | goto bad_i; /* :::::::::::::::::::: */ | |
19911 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
19912 | if (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN) | |
19913 | ffestb_local_.common.started = FALSE; | |
19914 | else | |
19915 | { | |
19916 | if (!ffesta_is_inhibited ()) | |
19917 | ffestc_R547_start (); | |
19918 | ffestb_local_.common.started = TRUE; | |
19919 | } | |
19920 | next = (ffelexHandler) ffestb_R5471_ (nt); | |
19921 | ffelex_token_kill (nt); | |
19922 | return (ffelexHandler) (*next) (t); | |
19923 | ||
19924 | default: | |
19925 | goto bad_0; /* :::::::::::::::::::: */ | |
19926 | } | |
19927 | ||
19928 | bad_0: /* :::::::::::::::::::: */ | |
19929 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", ffesta_tokens[0]); | |
19930 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19931 | ||
19932 | bad_1: /* :::::::::::::::::::: */ | |
19933 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t); | |
19934 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
19935 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
19936 | ||
19937 | bad_i: /* :::::::::::::::::::: */ | |
19938 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "COMMON", ffesta_tokens[0], i, t); | |
19939 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19940 | } | |
19941 | ||
19942 | /* ffestb_R5471_ -- "COMMON" | |
19943 | ||
19944 | return ffestb_R5471_; // to lexer | |
19945 | ||
19946 | Handle NAME, SLASH, or CONCAT. */ | |
19947 | ||
19948 | static ffelexHandler | |
19949 | ffestb_R5471_ (ffelexToken t) | |
19950 | { | |
19951 | switch (ffelex_token_type (t)) | |
19952 | { | |
19953 | case FFELEX_typeNAME: | |
19954 | return (ffelexHandler) ffestb_R5474_ (t); | |
19955 | ||
19956 | case FFELEX_typeSLASH: | |
19957 | return (ffelexHandler) ffestb_R5472_; | |
19958 | ||
19959 | case FFELEX_typeCONCAT: | |
19960 | if (!ffesta_is_inhibited ()) | |
19961 | ffestc_R547_item_cblock (NULL); | |
19962 | return (ffelexHandler) ffestb_R5474_; | |
19963 | ||
19964 | default: | |
19965 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t); | |
19966 | break; | |
19967 | } | |
19968 | ||
19969 | if (!ffesta_is_inhibited ()) | |
19970 | ffestc_R547_finish (); | |
19971 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
19972 | } | |
19973 | ||
19974 | /* ffestb_R5472_ -- "COMMON" SLASH | |
19975 | ||
19976 | return ffestb_R5472_; // to lexer | |
19977 | ||
19978 | Handle NAME. */ | |
19979 | ||
19980 | static ffelexHandler | |
19981 | ffestb_R5472_ (ffelexToken t) | |
19982 | { | |
19983 | switch (ffelex_token_type (t)) | |
19984 | { | |
19985 | case FFELEX_typeNAME: | |
19986 | ffesta_tokens[1] = ffelex_token_use (t); | |
19987 | return (ffelexHandler) ffestb_R5473_; | |
19988 | ||
19989 | case FFELEX_typeSLASH: | |
19990 | if (!ffesta_is_inhibited ()) | |
19991 | ffestc_R547_item_cblock (NULL); | |
19992 | return (ffelexHandler) ffestb_R5474_; | |
19993 | ||
19994 | default: | |
19995 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t); | |
19996 | break; | |
19997 | } | |
19998 | ||
19999 | if (!ffesta_is_inhibited ()) | |
20000 | ffestc_R547_finish (); | |
20001 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20002 | } | |
20003 | ||
20004 | /* ffestb_R5473_ -- "COMMON" SLASH NAME | |
20005 | ||
20006 | return ffestb_R5473_; // to lexer | |
20007 | ||
20008 | Handle SLASH. */ | |
20009 | ||
20010 | static ffelexHandler | |
20011 | ffestb_R5473_ (ffelexToken t) | |
20012 | { | |
20013 | switch (ffelex_token_type (t)) | |
20014 | { | |
20015 | case FFELEX_typeSLASH: | |
20016 | if (!ffesta_is_inhibited ()) | |
20017 | ffestc_R547_item_cblock (ffesta_tokens[1]); | |
20018 | ffelex_token_kill (ffesta_tokens[1]); | |
20019 | return (ffelexHandler) ffestb_R5474_; | |
20020 | ||
20021 | default: | |
20022 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t); | |
20023 | break; | |
20024 | } | |
20025 | ||
20026 | if (!ffesta_is_inhibited ()) | |
20027 | ffestc_R547_finish (); | |
20028 | ffelex_token_kill (ffesta_tokens[1]); | |
20029 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20030 | } | |
20031 | ||
20032 | /* ffestb_R5474_ -- "COMMON" [SLASH NAME SLASH] or "COMMON" CONCAT | |
20033 | ||
20034 | return ffestb_R5474_; // to lexer | |
20035 | ||
20036 | Handle NAME. */ | |
20037 | ||
20038 | static ffelexHandler | |
20039 | ffestb_R5474_ (ffelexToken t) | |
20040 | { | |
20041 | switch (ffelex_token_type (t)) | |
20042 | { | |
20043 | case FFELEX_typeNAME: | |
20044 | ffesta_tokens[1] = ffelex_token_use (t); | |
20045 | return (ffelexHandler) ffestb_R5475_; | |
20046 | ||
20047 | default: | |
20048 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t); | |
20049 | break; | |
20050 | } | |
20051 | ||
20052 | if (!ffesta_is_inhibited ()) | |
20053 | ffestc_R547_finish (); | |
20054 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20055 | } | |
20056 | ||
20057 | /* ffestb_R5475_ -- "COMMON" ... NAME | |
20058 | ||
20059 | return ffestb_R5475_; // to lexer | |
20060 | ||
20061 | Handle OPEN_PAREN. */ | |
20062 | ||
20063 | static ffelexHandler | |
20064 | ffestb_R5475_ (ffelexToken t) | |
20065 | { | |
20066 | switch (ffelex_token_type (t)) | |
20067 | { | |
20068 | case FFELEX_typeOPEN_PAREN: | |
20069 | ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create (); | |
20070 | ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_R5476_; | |
20071 | ffestb_subrargs_.dim_list.pool = ffesta_output_pool; | |
20072 | ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON; | |
20073 | #ifdef FFECOM_dimensionsMAX | |
20074 | ffestb_subrargs_.dim_list.ndims = 0; | |
20075 | #endif | |
20076 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
20077 | FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_); | |
20078 | ||
20079 | case FFELEX_typeCOMMA: | |
20080 | if (!ffesta_is_inhibited ()) | |
20081 | ffestc_R547_item_object (ffesta_tokens[1], NULL); | |
20082 | ffelex_token_kill (ffesta_tokens[1]); | |
20083 | return (ffelexHandler) ffestb_R5477_; | |
20084 | ||
20085 | case FFELEX_typeSLASH: | |
20086 | case FFELEX_typeCONCAT: | |
20087 | if (!ffesta_is_inhibited ()) | |
20088 | ffestc_R547_item_object (ffesta_tokens[1], NULL); | |
20089 | ffelex_token_kill (ffesta_tokens[1]); | |
20090 | return (ffelexHandler) ffestb_R5471_ (t); | |
20091 | ||
20092 | case FFELEX_typeEOS: | |
20093 | case FFELEX_typeSEMICOLON: | |
20094 | if (!ffesta_is_inhibited ()) | |
20095 | { | |
20096 | ffestc_R547_item_object (ffesta_tokens[1], NULL); | |
20097 | ffestc_R547_finish (); | |
20098 | } | |
20099 | ffelex_token_kill (ffesta_tokens[1]); | |
20100 | return (ffelexHandler) ffesta_zero (t); | |
20101 | ||
20102 | default: | |
20103 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t); | |
20104 | break; | |
20105 | } | |
20106 | ||
20107 | if (!ffesta_is_inhibited ()) | |
20108 | ffestc_R547_finish (); | |
20109 | ffelex_token_kill (ffesta_tokens[1]); | |
20110 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20111 | } | |
20112 | ||
20113 | /* ffestb_R5476_ -- "COMMON" ... NAME OPEN_PAREN dimlist CLOSE_PAREN | |
20114 | ||
20115 | return ffestb_R5476_; // to lexer | |
20116 | ||
20117 | Handle COMMA, SLASH, CONCAT, EOS/SEMICOLON. */ | |
20118 | ||
20119 | static ffelexHandler | |
20120 | ffestb_R5476_ (ffelexToken t) | |
20121 | { | |
20122 | if (!ffestb_subrargs_.dim_list.ok) | |
20123 | goto bad; /* :::::::::::::::::::: */ | |
20124 | ||
20125 | switch (ffelex_token_type (t)) | |
20126 | { | |
20127 | case FFELEX_typeCOMMA: | |
20128 | ffesta_confirmed (); | |
20129 | if (!ffesta_is_inhibited ()) | |
20130 | { | |
20131 | if (!ffestb_local_.common.started) | |
20132 | { | |
20133 | ffestc_R547_start (); | |
20134 | ffestb_local_.common.started = TRUE; | |
20135 | } | |
20136 | ffestc_R547_item_object (ffesta_tokens[1], | |
20137 | ffestb_subrargs_.dim_list.dims); | |
20138 | } | |
20139 | ffelex_token_kill (ffesta_tokens[1]); | |
20140 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
20141 | return (ffelexHandler) ffestb_R5477_; | |
20142 | ||
20143 | case FFELEX_typeSLASH: | |
20144 | case FFELEX_typeCONCAT: | |
20145 | ffesta_confirmed (); | |
20146 | if (!ffesta_is_inhibited ()) | |
20147 | { | |
20148 | if (!ffestb_local_.common.started) | |
20149 | { | |
20150 | ffestc_R547_start (); | |
20151 | ffestb_local_.common.started = TRUE; | |
20152 | } | |
20153 | ffestc_R547_item_object (ffesta_tokens[1], | |
20154 | ffestb_subrargs_.dim_list.dims); | |
20155 | } | |
20156 | ffelex_token_kill (ffesta_tokens[1]); | |
20157 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
20158 | return (ffelexHandler) ffestb_R5471_ (t); | |
20159 | ||
20160 | case FFELEX_typeEOS: | |
20161 | case FFELEX_typeSEMICOLON: | |
20162 | ffesta_confirmed (); | |
20163 | if (!ffesta_is_inhibited ()) | |
20164 | { | |
20165 | if (!ffestb_local_.common.started) | |
20166 | ffestc_R547_start (); | |
20167 | ffestc_R547_item_object (ffesta_tokens[1], | |
20168 | ffestb_subrargs_.dim_list.dims); | |
20169 | ffestc_R547_finish (); | |
20170 | } | |
20171 | ffelex_token_kill (ffesta_tokens[1]); | |
20172 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
20173 | return (ffelexHandler) ffesta_zero (t); | |
20174 | ||
20175 | default: | |
20176 | break; | |
20177 | } | |
20178 | ||
20179 | bad: /* :::::::::::::::::::: */ | |
20180 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t); | |
20181 | if (ffestb_local_.common.started && !ffesta_is_inhibited ()) | |
20182 | ffestc_R547_finish (); | |
20183 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
20184 | ffelex_token_kill (ffesta_tokens[1]); | |
20185 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20186 | } | |
20187 | ||
20188 | /* ffestb_R5477_ -- "COMMON" ... COMMA | |
20189 | ||
20190 | return ffestb_R5477_; // to lexer | |
20191 | ||
20192 | Make sure we don't have EOS or SEMICOLON. */ | |
20193 | ||
20194 | static ffelexHandler | |
20195 | ffestb_R5477_ (ffelexToken t) | |
20196 | { | |
20197 | switch (ffelex_token_type (t)) | |
20198 | { | |
20199 | case FFELEX_typeEOS: | |
20200 | case FFELEX_typeSEMICOLON: | |
20201 | if (!ffesta_is_inhibited ()) | |
20202 | ffestc_R547_finish (); | |
20203 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "COMMON", t); | |
20204 | return (ffelexHandler) ffesta_zero (t); | |
20205 | ||
20206 | default: | |
20207 | return (ffelexHandler) ffestb_R5471_ (t); | |
20208 | } | |
20209 | } | |
20210 | ||
20211 | /* ffestb_R624 -- Parse a NULLIFY statement | |
20212 | ||
20213 | return ffestb_R624; // to lexer | |
20214 | ||
20215 | Make sure the statement has a valid form for a NULLIFY | |
20216 | statement. If it does, implement the statement. | |
20217 | ||
20218 | 31-May-90 JCB 2.0 | |
20219 | Rewrite to produce a list of expressions rather than just names; this | |
20220 | eases semantic checking, putting it in expression handling where that | |
20221 | kind of thing gets done anyway, and makes it easier to support more | |
20222 | flexible extensions to Fortran 90 like NULLIFY(FOO%BAR). */ | |
20223 | ||
20224 | #if FFESTR_F90 | |
20225 | ffelexHandler | |
20226 | ffestb_R624 (ffelexToken t) | |
20227 | { | |
20228 | switch (ffelex_token_type (ffesta_tokens[0])) | |
20229 | { | |
20230 | case FFELEX_typeNAME: | |
20231 | if (ffesta_first_kw != FFESTR_firstNULLIFY) | |
20232 | goto bad_0; /* :::::::::::::::::::: */ | |
20233 | break; | |
20234 | ||
20235 | case FFELEX_typeNAMES: | |
20236 | if (ffesta_first_kw != FFESTR_firstNULLIFY) | |
20237 | goto bad_0; /* :::::::::::::::::::: */ | |
20238 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlNULLIFY) | |
20239 | goto bad_0; /* :::::::::::::::::::: */ | |
20240 | break; | |
20241 | ||
20242 | default: | |
20243 | goto bad_0; /* :::::::::::::::::::: */ | |
20244 | } | |
20245 | ||
20246 | switch (ffelex_token_type (t)) | |
20247 | { | |
20248 | case FFELEX_typeOPEN_PAREN: | |
20249 | break; | |
20250 | ||
20251 | case FFELEX_typeEOS: | |
20252 | case FFELEX_typeSEMICOLON: | |
20253 | case FFELEX_typeCOMMA: | |
20254 | case FFELEX_typeCOLONCOLON: | |
20255 | case FFELEX_typeNAME: | |
20256 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
20257 | goto bad_1; /* :::::::::::::::::::: */ | |
20258 | ||
20259 | default: | |
20260 | goto bad_1; /* :::::::::::::::::::: */ | |
20261 | } | |
20262 | ||
20263 | ffestb_local_.R624.exprs = ffestt_exprlist_create (); | |
20264 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
20265 | FFEEXPR_contextNULLIFY, | |
20266 | (ffeexprCallback) ffestb_R6241_); | |
20267 | ||
20268 | bad_0: /* :::::::::::::::::::: */ | |
20269 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", ffesta_tokens[0]); | |
20270 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20271 | ||
20272 | bad_1: /* :::::::::::::::::::: */ | |
20273 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t); | |
20274 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
20275 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
20276 | } | |
20277 | ||
20278 | /* ffestb_R6241_ -- "NULLIFY" OPEN_PAREN expr | |
20279 | ||
20280 | return ffestb_R6241_; // to lexer | |
20281 | ||
20282 | Make sure the statement has a valid form for a NULLIFY statement. If it | |
20283 | does, implement the statement. | |
20284 | ||
20285 | 31-May-90 JCB 2.0 | |
20286 | Rewrite to produce a list of expressions rather than just names; this | |
20287 | eases semantic checking, putting it in expression handling where that | |
20288 | kind of thing gets done anyway, and makes it easier to support more | |
20289 | flexible extensions to Fortran 90 like NULLIFY(FOO%BAR). */ | |
20290 | ||
20291 | static ffelexHandler | |
20292 | ffestb_R6241_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
20293 | { | |
20294 | switch (ffelex_token_type (t)) | |
20295 | { | |
20296 | case FFELEX_typeCLOSE_PAREN: | |
20297 | if (expr == NULL) | |
20298 | break; | |
20299 | ffestt_exprlist_append (ffestb_local_.R624.exprs, expr, | |
20300 | ffelex_token_use (t)); | |
20301 | return (ffelexHandler) ffestb_R6242_; | |
20302 | ||
20303 | case FFELEX_typeCOMMA: | |
20304 | if (expr == NULL) | |
20305 | break; | |
20306 | ffestt_exprlist_append (ffestb_local_.R624.exprs, expr, | |
20307 | ffelex_token_use (t)); | |
20308 | return (ffelexHandler) ffeexpr_lhs (ffesta_output_pool, | |
20309 | FFEEXPR_contextNULLIFY, | |
20310 | (ffeexprCallback) ffestb_R6241_); | |
20311 | ||
20312 | default: | |
20313 | break; | |
20314 | } | |
20315 | ||
20316 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t); | |
20317 | ffestt_exprlist_kill (ffestb_local_.R624.exprs); | |
20318 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20319 | } | |
20320 | ||
20321 | /* ffestb_R6242_ -- "NULLIFY" OPEN_PAREN expr-list CLOSE_PAREN | |
20322 | ||
20323 | return ffestb_R6242_; // to lexer | |
20324 | ||
20325 | Make sure the statement has a valid form for a NULLIFY statement. If it | |
20326 | does, implement the statement. */ | |
20327 | ||
20328 | static ffelexHandler | |
20329 | ffestb_R6242_ (ffelexToken t) | |
20330 | { | |
20331 | switch (ffelex_token_type (t)) | |
20332 | { | |
20333 | case FFELEX_typeEOS: | |
20334 | case FFELEX_typeSEMICOLON: | |
20335 | ffesta_confirmed (); | |
20336 | if (!ffesta_is_inhibited ()) | |
20337 | ffestc_R624 (ffestb_local_.R624.exprs); | |
20338 | ffestt_exprlist_kill (ffestb_local_.R624.exprs); | |
20339 | return (ffelexHandler) ffesta_zero (t); | |
20340 | ||
20341 | default: | |
20342 | break; | |
20343 | } | |
20344 | ||
20345 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "NULLIFY", t); | |
20346 | ffestt_exprlist_kill (ffestb_local_.R624.exprs); | |
20347 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20348 | } | |
20349 | ||
20350 | #endif | |
20351 | /* ffestb_R1229 -- Parse a STMTFUNCTION statement | |
20352 | ||
20353 | return ffestb_R1229; // to lexer | |
20354 | ||
20355 | Make sure the statement has a valid form for a STMTFUNCTION | |
20356 | statement. If it does, implement the statement. */ | |
20357 | ||
20358 | ffelexHandler | |
20359 | ffestb_R1229 (ffelexToken t) | |
20360 | { | |
20361 | switch (ffelex_token_type (ffesta_tokens[0])) | |
20362 | { | |
20363 | case FFELEX_typeNAME: | |
20364 | case FFELEX_typeNAMES: | |
20365 | break; | |
20366 | ||
20367 | default: | |
20368 | goto bad_0; /* :::::::::::::::::::: */ | |
20369 | } | |
20370 | ||
20371 | switch (ffelex_token_type (t)) | |
20372 | { | |
20373 | case FFELEX_typeOPEN_PAREN: | |
20374 | break; | |
20375 | ||
20376 | case FFELEX_typeEOS: | |
20377 | case FFELEX_typeSEMICOLON: | |
20378 | case FFELEX_typeCOMMA: | |
20379 | case FFELEX_typeCOLONCOLON: | |
20380 | case FFELEX_typeNAME: | |
20381 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
20382 | goto bad_1; /* :::::::::::::::::::: */ | |
20383 | ||
20384 | default: | |
20385 | goto bad_1; /* :::::::::::::::::::: */ | |
20386 | } | |
20387 | ||
20388 | ffestb_subrargs_.name_list.args = ffestt_tokenlist_create (); | |
20389 | ffestb_subrargs_.name_list.handler = (ffelexHandler) ffestb_R12291_; | |
20390 | ffestb_subrargs_.name_list.is_subr = FALSE; /* No "*" items in list! */ | |
20391 | ffestb_subrargs_.name_list.names = TRUE; /* In case "IF(FOO)CALL | |
20392 | FOO...". */ | |
20393 | return (ffelexHandler) ffestb_subr_name_list_; | |
20394 | ||
20395 | bad_0: /* :::::::::::::::::::: */ | |
20396 | bad_1: /* :::::::::::::::::::: */ | |
20397 | ffesta_ffebad_2t (FFEBAD_UNREC_STMT, ffesta_tokens[0], t); | |
20398 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20399 | } | |
20400 | ||
20401 | /* ffestb_R12291_ -- "STMTFUNCTION" OPEN_PAREN dummy-name-list CLOSE_PAREN | |
20402 | ||
20403 | return ffestb_R12291_; // to lexer | |
20404 | ||
20405 | Make sure the statement has a valid form for a STMTFUNCTION statement. If | |
20406 | it does, implement the statement. */ | |
20407 | ||
20408 | static ffelexHandler | |
20409 | ffestb_R12291_ (ffelexToken t) | |
20410 | { | |
20411 | ffelex_set_names (FALSE); | |
20412 | ||
20413 | if (!ffestb_subrargs_.name_list.ok) | |
20414 | goto bad; /* :::::::::::::::::::: */ | |
20415 | ||
20416 | switch (ffelex_token_type (t)) | |
20417 | { | |
20418 | case FFELEX_typeEQUALS: | |
20419 | ffesta_confirmed (); | |
20420 | if (!ffesta_is_inhibited ()) | |
20421 | ffestc_R1229_start (ffesta_tokens[0], | |
20422 | ffestb_subrargs_.name_list.args, | |
20423 | ffestb_subrargs_.name_list.close_paren); | |
20424 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
20425 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
20426 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
20427 | FFEEXPR_contextSFUNCDEF, (ffeexprCallback) ffestb_R12292_); | |
20428 | ||
20429 | default: | |
20430 | break; | |
20431 | } | |
20432 | ||
20433 | bad: /* :::::::::::::::::::: */ | |
20434 | ffesta_ffebad_2t (FFEBAD_UNREC_STMT, ffesta_tokens[0], t); | |
20435 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
20436 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
20437 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20438 | } | |
20439 | ||
20440 | /* ffestb_R12292_ -- "STMTFUNCTION" OPEN_PAREN dummy-name-list CLOSE_PAREN | |
20441 | EQUALS expr | |
20442 | ||
20443 | (ffestb_R12292_) // to expression handler | |
20444 | ||
20445 | Make sure the statement has a valid form for a STMTFUNCTION statement. If | |
20446 | it does, implement the statement. */ | |
20447 | ||
20448 | static ffelexHandler | |
20449 | ffestb_R12292_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
20450 | { | |
20451 | if (expr == NULL) | |
20452 | goto bad; /* :::::::::::::::::::: */ | |
20453 | ||
20454 | switch (ffelex_token_type (t)) | |
20455 | { | |
20456 | case FFELEX_typeEOS: | |
20457 | case FFELEX_typeSEMICOLON: | |
20458 | if (!ffesta_is_inhibited ()) | |
20459 | ffestc_R1229_finish (expr, ft); | |
20460 | return (ffelexHandler) ffesta_zero (t); | |
20461 | ||
20462 | default: | |
20463 | break; | |
20464 | } | |
20465 | ||
20466 | bad: /* :::::::::::::::::::: */ | |
20467 | ffestc_R1229_finish (NULL, NULL); | |
20468 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "statement-function-definition", t); | |
20469 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20470 | } | |
20471 | ||
20472 | /* ffestb_decl_chartype -- Parse the CHARACTER statement | |
20473 | ||
20474 | return ffestb_decl_chartype; // to lexer | |
20475 | ||
20476 | Make sure the statement has a valid form for the CHARACTER statement. If | |
20477 | it does, implement the statement. */ | |
20478 | ||
20479 | ffelexHandler | |
20480 | ffestb_decl_chartype (ffelexToken t) | |
20481 | { | |
20482 | ffeTokenLength i; | |
20483 | char *p; | |
20484 | ||
20485 | ffestb_local_.decl.type = FFESTP_typeCHARACTER; | |
20486 | ffestb_local_.decl.recursive = NULL; | |
20487 | ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */ | |
20488 | ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */ | |
20489 | ||
20490 | switch (ffelex_token_type (ffesta_tokens[0])) | |
20491 | { | |
20492 | case FFELEX_typeNAME: | |
20493 | if (ffesta_first_kw != FFESTR_firstCHRCTR) | |
20494 | goto bad_0; /* :::::::::::::::::::: */ | |
20495 | switch (ffelex_token_type (t)) | |
20496 | { | |
20497 | case FFELEX_typeEOS: | |
20498 | case FFELEX_typeSEMICOLON: | |
20499 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
20500 | goto bad_1; /* :::::::::::::::::::: */ | |
20501 | ||
20502 | default: | |
20503 | goto bad_1; /* :::::::::::::::::::: */ | |
20504 | ||
20505 | case FFELEX_typeCOMMA: | |
20506 | ffesta_confirmed (); | |
20507 | if (!ffesta_is_inhibited ()) | |
20508 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20509 | NULL, NULL, NULL, NULL); | |
20510 | return (ffelexHandler) ffestb_decl_attrs_; | |
20511 | ||
20512 | case FFELEX_typeCOLONCOLON: | |
20513 | ffestb_local_.decl.coloncolon = TRUE; | |
20514 | ffesta_confirmed (); | |
20515 | if (!ffesta_is_inhibited ()) | |
20516 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20517 | NULL, NULL, NULL, NULL); | |
20518 | return (ffelexHandler) ffestb_decl_ents_; | |
20519 | ||
20520 | case FFELEX_typeASTERISK: | |
20521 | ffesta_confirmed (); | |
20522 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_chartype1_; | |
20523 | ffestb_local_.decl.badname = "TYPEDECL"; | |
20524 | return (ffelexHandler) ffestb_decl_starlen_; | |
20525 | ||
20526 | case FFELEX_typeOPEN_PAREN: | |
20527 | ffestb_local_.decl.kind = NULL; | |
20528 | ffestb_local_.decl.kindt = NULL; | |
20529 | ffestb_local_.decl.len = NULL; | |
20530 | ffestb_local_.decl.lent = NULL; | |
20531 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_; | |
20532 | ffestb_local_.decl.badname = "_TYPEDECL"; | |
20533 | return (ffelexHandler) ffestb_decl_typeparams_; | |
20534 | ||
20535 | case FFELEX_typeNAME: | |
20536 | ffesta_confirmed (); | |
20537 | ffestb_local_.decl.kind = NULL; | |
20538 | ffestb_local_.decl.kindt = NULL; | |
20539 | ffestb_local_.decl.len = NULL; | |
20540 | ffestb_local_.decl.lent = NULL; | |
20541 | return (ffelexHandler) ffestb_decl_entsp_ (t); | |
20542 | } | |
20543 | ||
20544 | case FFELEX_typeNAMES: | |
20545 | if (ffesta_first_kw != FFESTR_firstCHRCTR) | |
20546 | goto bad_0; /* :::::::::::::::::::: */ | |
20547 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlCHRCTR); | |
20548 | switch (ffelex_token_type (t)) | |
20549 | { | |
20550 | default: | |
20551 | goto bad_1; /* :::::::::::::::::::: */ | |
20552 | ||
20553 | case FFELEX_typeEOS: | |
20554 | case FFELEX_typeSEMICOLON: | |
20555 | ffesta_confirmed (); | |
20556 | break; | |
20557 | ||
20558 | case FFELEX_typeCOMMA: | |
20559 | ffesta_confirmed (); | |
20560 | if (*p != '\0') | |
20561 | break; | |
20562 | if (!ffesta_is_inhibited ()) | |
20563 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20564 | NULL, NULL, NULL, NULL); | |
20565 | return (ffelexHandler) ffestb_decl_attrs_; | |
20566 | ||
20567 | case FFELEX_typeCOLONCOLON: | |
20568 | ffestb_local_.decl.coloncolon = TRUE; | |
20569 | ffesta_confirmed (); | |
20570 | if (*p != '\0') | |
20571 | goto bad_i; /* :::::::::::::::::::: */ | |
20572 | if (!ffesta_is_inhibited ()) | |
20573 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20574 | NULL, NULL, NULL, NULL); | |
20575 | return (ffelexHandler) ffestb_decl_ents_; | |
20576 | ||
20577 | case FFELEX_typeASTERISK: | |
20578 | ffesta_confirmed (); | |
20579 | if (*p != '\0') | |
20580 | break; | |
20581 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_chartype1_; | |
20582 | ffestb_local_.decl.badname = "TYPEDECL"; | |
20583 | return (ffelexHandler) ffestb_decl_starlen_; | |
20584 | ||
20585 | case FFELEX_typeSLASH: | |
20586 | ffesta_confirmed (); | |
20587 | if (*p != '\0') | |
20588 | break; | |
20589 | goto bad_1; /* :::::::::::::::::::: */ | |
20590 | ||
20591 | case FFELEX_typeOPEN_PAREN: | |
20592 | if (*p != '\0') | |
20593 | break; | |
20594 | ffestb_local_.decl.kind = NULL; | |
20595 | ffestb_local_.decl.kindt = NULL; | |
20596 | ffestb_local_.decl.len = NULL; | |
20597 | ffestb_local_.decl.lent = NULL; | |
20598 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_; | |
20599 | ffestb_local_.decl.badname = "TYPEDECL"; | |
20600 | return (ffelexHandler) ffestb_decl_typeparams_; | |
20601 | } | |
20602 | if (!ffesrc_is_name_init (*p)) | |
20603 | goto bad_i; /* :::::::::::::::::::: */ | |
20604 | ffestb_local_.decl.kind = NULL; | |
20605 | ffestb_local_.decl.kindt = NULL; | |
20606 | ffestb_local_.decl.len = NULL; | |
20607 | ffestb_local_.decl.lent = NULL; | |
20608 | ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0); | |
20609 | return (ffelexHandler) ffestb_decl_entsp_2_ (t); | |
20610 | ||
20611 | default: | |
20612 | goto bad_0; /* :::::::::::::::::::: */ | |
20613 | } | |
20614 | ||
20615 | bad_0: /* :::::::::::::::::::: */ | |
20616 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]); | |
20617 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20618 | ||
20619 | bad_1: /* :::::::::::::::::::: */ | |
20620 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
20621 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
20622 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
20623 | ||
20624 | bad_i: /* :::::::::::::::::::: */ | |
20625 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t); | |
20626 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20627 | } | |
20628 | ||
20629 | /* ffestb_decl_chartype1_ -- "CHARACTER" ASTERISK char-length | |
20630 | ||
20631 | return ffestb_decl_chartype1_; // to lexer | |
20632 | ||
20633 | Handle COMMA, COLONCOLON, or anything else. */ | |
20634 | ||
20635 | static ffelexHandler | |
20636 | ffestb_decl_chartype1_ (ffelexToken t) | |
20637 | { | |
20638 | ffelex_set_names (FALSE); | |
20639 | ||
20640 | switch (ffelex_token_type (t)) | |
20641 | { | |
20642 | case FFELEX_typeCOLONCOLON: | |
20643 | ffestb_local_.decl.coloncolon = TRUE; | |
20644 | /* Fall through. */ | |
20645 | case FFELEX_typeCOMMA: | |
20646 | ffesta_confirmed (); | |
20647 | if (!ffesta_is_inhibited ()) | |
20648 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20649 | NULL, NULL, ffestb_local_.decl.len, ffestb_local_.decl.lent); | |
20650 | if (ffestb_local_.decl.lent != NULL) | |
20651 | ffelex_token_kill (ffestb_local_.decl.lent); | |
20652 | return (ffelexHandler) ffestb_decl_ents_; | |
20653 | ||
20654 | default: | |
20655 | return (ffelexHandler) ffestb_decl_entsp_ (t); | |
20656 | } | |
20657 | } | |
20658 | ||
20659 | /* ffestb_decl_dbltype -- Parse the DOUBLEPRECISION/DOUBLECOMPLEX statement | |
20660 | ||
20661 | return ffestb_decl_dbltype; // to lexer | |
20662 | ||
20663 | Make sure the statement has a valid form for the DOUBLEPRECISION/ | |
20664 | DOUBLECOMPLEX statement. If it does, implement the statement. */ | |
20665 | ||
20666 | ffelexHandler | |
20667 | ffestb_decl_dbltype (ffelexToken t) | |
20668 | { | |
20669 | ffeTokenLength i; | |
20670 | char *p; | |
20671 | ||
20672 | ffestb_local_.decl.type = ffestb_args.decl.type; | |
20673 | ffestb_local_.decl.recursive = NULL; | |
20674 | ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */ | |
20675 | ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */ | |
20676 | ||
20677 | switch (ffelex_token_type (ffesta_tokens[0])) | |
20678 | { | |
20679 | case FFELEX_typeNAME: | |
20680 | switch (ffelex_token_type (t)) | |
20681 | { | |
20682 | case FFELEX_typeEOS: | |
20683 | case FFELEX_typeSEMICOLON: | |
20684 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
20685 | goto bad_1; /* :::::::::::::::::::: */ | |
20686 | ||
20687 | default: | |
20688 | goto bad_1; /* :::::::::::::::::::: */ | |
20689 | ||
20690 | case FFELEX_typeCOMMA: | |
20691 | ffesta_confirmed (); | |
20692 | if (!ffesta_is_inhibited ()) | |
20693 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20694 | NULL, NULL, NULL, NULL); | |
20695 | return (ffelexHandler) ffestb_decl_attrs_; | |
20696 | ||
20697 | case FFELEX_typeCOLONCOLON: | |
20698 | ffestb_local_.decl.coloncolon = TRUE; | |
20699 | ffesta_confirmed (); | |
20700 | if (!ffesta_is_inhibited ()) | |
20701 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20702 | NULL, NULL, NULL, NULL); | |
20703 | return (ffelexHandler) ffestb_decl_ents_; | |
20704 | ||
20705 | case FFELEX_typeNAME: | |
20706 | ffesta_confirmed (); | |
20707 | ffestb_local_.decl.kind = NULL; | |
20708 | ffestb_local_.decl.kindt = NULL; | |
20709 | ffestb_local_.decl.len = NULL; | |
20710 | ffestb_local_.decl.lent = NULL; | |
20711 | return (ffelexHandler) ffestb_decl_entsp_ (t); | |
20712 | } | |
20713 | ||
20714 | case FFELEX_typeNAMES: | |
20715 | p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.decl.len); | |
20716 | switch (ffelex_token_type (t)) | |
20717 | { | |
20718 | default: | |
20719 | goto bad_1; /* :::::::::::::::::::: */ | |
20720 | ||
20721 | case FFELEX_typeEOS: | |
20722 | case FFELEX_typeSEMICOLON: | |
20723 | ffesta_confirmed (); | |
20724 | break; | |
20725 | ||
20726 | case FFELEX_typeCOMMA: | |
20727 | ffesta_confirmed (); | |
20728 | if (*p != '\0') | |
20729 | break; | |
20730 | if (!ffesta_is_inhibited ()) | |
20731 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20732 | NULL, NULL, NULL, NULL); | |
20733 | return (ffelexHandler) ffestb_decl_attrs_; | |
20734 | ||
20735 | case FFELEX_typeCOLONCOLON: | |
20736 | ffestb_local_.decl.coloncolon = TRUE; | |
20737 | ffesta_confirmed (); | |
20738 | if (*p != '\0') | |
20739 | goto bad_i; /* :::::::::::::::::::: */ | |
20740 | if (!ffesta_is_inhibited ()) | |
20741 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20742 | NULL, NULL, NULL, NULL); | |
20743 | return (ffelexHandler) ffestb_decl_ents_; | |
20744 | ||
20745 | case FFELEX_typeSLASH: | |
20746 | ffesta_confirmed (); | |
20747 | if (*p != '\0') | |
20748 | break; | |
20749 | goto bad_1; /* :::::::::::::::::::: */ | |
20750 | ||
20751 | case FFELEX_typeOPEN_PAREN: | |
20752 | if (*p != '\0') | |
20753 | break; | |
20754 | goto bad_1; /* :::::::::::::::::::: */ | |
20755 | } | |
20756 | if (!ffesrc_is_name_init (*p)) | |
20757 | goto bad_i; /* :::::::::::::::::::: */ | |
20758 | ffestb_local_.decl.kind = NULL; | |
20759 | ffestb_local_.decl.kindt = NULL; | |
20760 | ffestb_local_.decl.len = NULL; | |
20761 | ffestb_local_.decl.lent = NULL; | |
20762 | ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0); | |
20763 | return (ffelexHandler) ffestb_decl_entsp_2_ (t); | |
20764 | ||
20765 | default: | |
20766 | goto bad_0; /* :::::::::::::::::::: */ | |
20767 | } | |
20768 | ||
20769 | bad_0: /* :::::::::::::::::::: */ | |
20770 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]); | |
20771 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20772 | ||
20773 | bad_1: /* :::::::::::::::::::: */ | |
20774 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
20775 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
20776 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
20777 | ||
20778 | bad_i: /* :::::::::::::::::::: */ | |
20779 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t); | |
20780 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20781 | } | |
20782 | ||
20783 | /* ffestb_decl_double -- Parse the DOUBLE PRECISION/DOUBLE COMPLEX statement | |
20784 | ||
20785 | return ffestb_decl_double; // to lexer | |
20786 | ||
20787 | Make sure the statement has a valid form for the DOUBLE PRECISION/ | |
20788 | DOUBLE COMPLEX statement. If it does, implement the statement. */ | |
20789 | ||
20790 | ffelexHandler | |
20791 | ffestb_decl_double (ffelexToken t) | |
20792 | { | |
20793 | ffestb_local_.decl.recursive = NULL; | |
20794 | ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */ | |
20795 | ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */ | |
20796 | ||
20797 | switch (ffelex_token_type (ffesta_tokens[0])) | |
20798 | { | |
20799 | case FFELEX_typeNAME: | |
20800 | if (ffesta_first_kw != FFESTR_firstDBL) | |
20801 | goto bad_0; /* :::::::::::::::::::: */ | |
20802 | switch (ffelex_token_type (t)) | |
20803 | { | |
20804 | case FFELEX_typeEOS: | |
20805 | case FFELEX_typeSEMICOLON: | |
20806 | case FFELEX_typeCOMMA: | |
20807 | case FFELEX_typeCOLONCOLON: | |
20808 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
20809 | goto bad_1; /* :::::::::::::::::::: */ | |
20810 | ||
20811 | default: | |
20812 | goto bad_1; /* :::::::::::::::::::: */ | |
20813 | ||
20814 | case FFELEX_typeNAME: | |
20815 | ffesta_confirmed (); | |
20816 | switch (ffestr_second (t)) | |
20817 | { | |
20818 | case FFESTR_secondCOMPLEX: | |
20819 | ffestb_local_.decl.type = FFESTP_typeDBLCMPLX; | |
20820 | break; | |
20821 | ||
20822 | case FFESTR_secondPRECISION: | |
20823 | ffestb_local_.decl.type = FFESTP_typeDBLPRCSN; | |
20824 | break; | |
20825 | ||
20826 | default: | |
20827 | goto bad_1; /* :::::::::::::::::::: */ | |
20828 | } | |
20829 | ffestb_local_.decl.kind = NULL; | |
20830 | ffestb_local_.decl.kindt = NULL; | |
20831 | ffestb_local_.decl.len = NULL; | |
20832 | ffestb_local_.decl.lent = NULL; | |
20833 | return (ffelexHandler) ffestb_decl_attrsp_; | |
20834 | } | |
20835 | ||
20836 | default: | |
20837 | goto bad_0; /* :::::::::::::::::::: */ | |
20838 | } | |
20839 | ||
20840 | bad_0: /* :::::::::::::::::::: */ | |
20841 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]); | |
20842 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20843 | ||
20844 | bad_1: /* :::::::::::::::::::: */ | |
20845 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
20846 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
20847 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
20848 | } | |
20849 | ||
20850 | /* ffestb_decl_gentype -- Parse the INTEGER/REAL/COMPLEX/LOGICAL statement | |
20851 | ||
20852 | return ffestb_decl_gentype; // to lexer | |
20853 | ||
20854 | Make sure the statement has a valid form for the INTEGER/REAL/COMPLEX/ | |
20855 | LOGICAL statement. If it does, implement the statement. */ | |
20856 | ||
20857 | ffelexHandler | |
20858 | ffestb_decl_gentype (ffelexToken t) | |
20859 | { | |
20860 | ffeTokenLength i; | |
20861 | char *p; | |
20862 | ||
20863 | ffestb_local_.decl.type = ffestb_args.decl.type; | |
20864 | ffestb_local_.decl.recursive = NULL; | |
20865 | ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */ | |
20866 | ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */ | |
20867 | ||
20868 | switch (ffelex_token_type (ffesta_tokens[0])) | |
20869 | { | |
20870 | case FFELEX_typeNAME: | |
20871 | switch (ffelex_token_type (t)) | |
20872 | { | |
20873 | case FFELEX_typeEOS: | |
20874 | case FFELEX_typeSEMICOLON: | |
20875 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
20876 | goto bad_1; /* :::::::::::::::::::: */ | |
20877 | ||
20878 | default: | |
20879 | goto bad_1; /* :::::::::::::::::::: */ | |
20880 | ||
20881 | case FFELEX_typeCOMMA: | |
20882 | ffesta_confirmed (); | |
20883 | if (!ffesta_is_inhibited ()) | |
20884 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20885 | NULL, NULL, NULL, NULL); | |
20886 | return (ffelexHandler) ffestb_decl_attrs_; | |
20887 | ||
20888 | case FFELEX_typeCOLONCOLON: | |
20889 | ffestb_local_.decl.coloncolon = TRUE; | |
20890 | ffesta_confirmed (); | |
20891 | if (!ffesta_is_inhibited ()) | |
20892 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20893 | NULL, NULL, NULL, NULL); | |
20894 | return (ffelexHandler) ffestb_decl_ents_; | |
20895 | ||
20896 | case FFELEX_typeASTERISK: | |
20897 | ffesta_confirmed (); | |
20898 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_; | |
20899 | ffestb_local_.decl.badname = "TYPEDECL"; | |
20900 | return (ffelexHandler) ffestb_decl_starkind_; | |
20901 | ||
20902 | case FFELEX_typeOPEN_PAREN: | |
20903 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_; | |
20904 | ffestb_local_.decl.badname = "TYPEDECL"; | |
20905 | return (ffelexHandler) ffestb_decl_kindparam_; | |
20906 | ||
20907 | case FFELEX_typeNAME: | |
20908 | ffesta_confirmed (); | |
20909 | ffestb_local_.decl.kind = NULL; | |
20910 | ffestb_local_.decl.kindt = NULL; | |
20911 | ffestb_local_.decl.len = NULL; | |
20912 | ffestb_local_.decl.lent = NULL; | |
20913 | return (ffelexHandler) ffestb_decl_entsp_ (t); | |
20914 | } | |
20915 | ||
20916 | case FFELEX_typeNAMES: | |
20917 | p = ffelex_token_text (ffesta_tokens[0]) + (i = ffestb_args.decl.len); | |
20918 | switch (ffelex_token_type (t)) | |
20919 | { | |
20920 | default: | |
20921 | goto bad_1; /* :::::::::::::::::::: */ | |
20922 | ||
20923 | case FFELEX_typeEOS: | |
20924 | case FFELEX_typeSEMICOLON: | |
20925 | ffesta_confirmed (); | |
20926 | break; | |
20927 | ||
20928 | case FFELEX_typeCOMMA: | |
20929 | ffesta_confirmed (); | |
20930 | if (*p != '\0') | |
20931 | break; | |
20932 | if (!ffesta_is_inhibited ()) | |
20933 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20934 | NULL, NULL, NULL, NULL); | |
20935 | return (ffelexHandler) ffestb_decl_attrs_; | |
20936 | ||
20937 | case FFELEX_typeCOLONCOLON: | |
20938 | ffestb_local_.decl.coloncolon = TRUE; | |
20939 | ffesta_confirmed (); | |
20940 | if (*p != '\0') | |
20941 | goto bad_i; /* :::::::::::::::::::: */ | |
20942 | if (!ffesta_is_inhibited ()) | |
20943 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
20944 | NULL, NULL, NULL, NULL); | |
20945 | return (ffelexHandler) ffestb_decl_ents_; | |
20946 | ||
20947 | case FFELEX_typeSLASH: | |
20948 | ffesta_confirmed (); | |
20949 | if (*p != '\0') | |
20950 | break; | |
20951 | goto bad_1; /* :::::::::::::::::::: */ | |
20952 | ||
20953 | case FFELEX_typeASTERISK: | |
20954 | ffesta_confirmed (); | |
20955 | if (*p != '\0') | |
20956 | break; | |
20957 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_; | |
20958 | ffestb_local_.decl.badname = "TYPEDECL"; | |
20959 | return (ffelexHandler) ffestb_decl_starkind_; | |
20960 | ||
20961 | case FFELEX_typeOPEN_PAREN: | |
20962 | if (*p != '\0') | |
20963 | break; | |
20964 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_; | |
20965 | ffestb_local_.decl.badname = "TYPEDECL"; | |
20966 | return (ffelexHandler) ffestb_decl_kindparam_; | |
20967 | } | |
20968 | if (!ffesrc_is_name_init (*p)) | |
20969 | goto bad_i; /* :::::::::::::::::::: */ | |
20970 | ffestb_local_.decl.kind = NULL; | |
20971 | ffestb_local_.decl.kindt = NULL; | |
20972 | ffestb_local_.decl.len = NULL; | |
20973 | ffestb_local_.decl.lent = NULL; | |
20974 | ffesta_tokens[1] = ffelex_token_names_from_names (ffesta_tokens[0], i, 0); | |
20975 | return (ffelexHandler) ffestb_decl_entsp_2_ (t); | |
20976 | ||
20977 | default: | |
20978 | goto bad_0; /* :::::::::::::::::::: */ | |
20979 | } | |
20980 | ||
20981 | bad_0: /* :::::::::::::::::::: */ | |
20982 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]); | |
20983 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20984 | ||
20985 | bad_1: /* :::::::::::::::::::: */ | |
20986 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
20987 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
20988 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
20989 | ||
20990 | bad_i: /* :::::::::::::::::::: */ | |
20991 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0], i, t); | |
20992 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
20993 | } | |
20994 | ||
20995 | /* ffestb_decl_recursive -- Parse the RECURSIVE FUNCTION statement | |
20996 | ||
20997 | return ffestb_decl_recursive; // to lexer | |
20998 | ||
20999 | Make sure the statement has a valid form for the RECURSIVE FUNCTION | |
21000 | statement. If it does, implement the statement. */ | |
21001 | ||
21002 | #if FFESTR_F90 | |
21003 | ffelexHandler | |
21004 | ffestb_decl_recursive (ffelexToken t) | |
21005 | { | |
21006 | ffeTokenLength i; | |
21007 | char *p; | |
21008 | ffelexToken nt; | |
21009 | ffelexToken ot; | |
21010 | ffelexHandler next; | |
21011 | bool needfunc; | |
21012 | ||
21013 | switch (ffelex_token_type (ffesta_tokens[0])) | |
21014 | { | |
21015 | case FFELEX_typeNAME: | |
21016 | if (ffesta_first_kw != FFESTR_firstRECURSIVE) | |
21017 | goto bad_0; /* :::::::::::::::::::: */ | |
21018 | switch (ffelex_token_type (t)) | |
21019 | { | |
21020 | case FFELEX_typeEOS: | |
21021 | case FFELEX_typeSEMICOLON: | |
21022 | case FFELEX_typeCOMMA: | |
21023 | case FFELEX_typeCOLONCOLON: | |
21024 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
21025 | goto bad_1; /* :::::::::::::::::::: */ | |
21026 | ||
21027 | default: | |
21028 | goto bad_1; /* :::::::::::::::::::: */ | |
21029 | ||
21030 | case FFELEX_typeNAME: | |
21031 | break; | |
21032 | } | |
21033 | ffesta_confirmed (); | |
21034 | ffestb_local_.decl.recursive = ffelex_token_use (ffesta_tokens[0]); | |
21035 | switch (ffesta_second_kw) | |
21036 | { | |
21037 | case FFESTR_secondINTEGER: | |
21038 | ffestb_local_.decl.type = FFESTP_typeINTEGER; | |
21039 | return (ffelexHandler) ffestb_decl_recursive1_; | |
21040 | ||
21041 | case FFESTR_secondBYTE: | |
21042 | ffestb_local_.decl.type = FFESTP_typeBYTE; | |
21043 | return (ffelexHandler) ffestb_decl_recursive1_; | |
21044 | ||
21045 | case FFESTR_secondWORD: | |
21046 | ffestb_local_.decl.type = FFESTP_typeWORD; | |
21047 | return (ffelexHandler) ffestb_decl_recursive1_; | |
21048 | ||
21049 | case FFESTR_secondREAL: | |
21050 | ffestb_local_.decl.type = FFESTP_typeREAL; | |
21051 | return (ffelexHandler) ffestb_decl_recursive1_; | |
21052 | ||
21053 | case FFESTR_secondCOMPLEX: | |
21054 | ffestb_local_.decl.type = FFESTP_typeCOMPLEX; | |
21055 | return (ffelexHandler) ffestb_decl_recursive1_; | |
21056 | ||
21057 | case FFESTR_secondLOGICAL: | |
21058 | ffestb_local_.decl.type = FFESTP_typeLOGICAL; | |
21059 | return (ffelexHandler) ffestb_decl_recursive1_; | |
21060 | ||
21061 | case FFESTR_secondCHARACTER: | |
21062 | ffestb_local_.decl.type = FFESTP_typeCHARACTER; | |
21063 | return (ffelexHandler) ffestb_decl_recursive1_; | |
21064 | ||
21065 | case FFESTR_secondDOUBLE: | |
21066 | return (ffelexHandler) ffestb_decl_recursive2_; | |
21067 | ||
21068 | case FFESTR_secondDOUBLEPRECISION: | |
21069 | ffestb_local_.decl.type = FFESTP_typeDBLPRCSN; | |
21070 | ffestb_local_.decl.kind = NULL; | |
21071 | ffestb_local_.decl.kindt = NULL; | |
21072 | ffestb_local_.decl.len = NULL; | |
21073 | ffestb_local_.decl.lent = NULL; | |
21074 | return (ffelexHandler) ffestb_decl_func_; | |
21075 | ||
21076 | case FFESTR_secondDOUBLECOMPLEX: | |
21077 | ffestb_local_.decl.type = FFESTP_typeDBLCMPLX; | |
21078 | ffestb_local_.decl.kind = NULL; | |
21079 | ffestb_local_.decl.kindt = NULL; | |
21080 | ffestb_local_.decl.len = NULL; | |
21081 | ffestb_local_.decl.lent = NULL; | |
21082 | return (ffelexHandler) ffestb_decl_func_; | |
21083 | ||
21084 | case FFESTR_secondTYPE: | |
21085 | ffestb_local_.decl.type = FFESTP_typeTYPE; | |
21086 | return (ffelexHandler) ffestb_decl_recursive3_; | |
21087 | ||
21088 | case FFESTR_secondFUNCTION: | |
21089 | ffestb_local_.dummy.first_kw = FFESTR_firstFUNCTION; | |
21090 | ffestb_local_.dummy.badname = "FUNCTION"; | |
21091 | ffestb_local_.dummy.is_subr = FALSE; | |
21092 | return (ffelexHandler) ffestb_decl_recursive4_; | |
21093 | ||
21094 | case FFESTR_secondSUBROUTINE: | |
21095 | ffestb_local_.dummy.first_kw = FFESTR_firstSUBROUTINE; | |
21096 | ffestb_local_.dummy.badname = "SUBROUTINE"; | |
21097 | ffestb_local_.dummy.is_subr = TRUE; | |
21098 | return (ffelexHandler) ffestb_decl_recursive4_; | |
21099 | ||
21100 | default: | |
21101 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21102 | goto bad_1; /* :::::::::::::::::::: */ | |
21103 | } | |
21104 | ||
21105 | case FFELEX_typeNAMES: | |
21106 | if (ffesta_first_kw != FFESTR_firstRECURSIVE) | |
21107 | goto bad_0; /* :::::::::::::::::::: */ | |
21108 | switch (ffelex_token_type (t)) | |
21109 | { | |
21110 | case FFELEX_typeCOMMA: | |
21111 | case FFELEX_typeCOLONCOLON: | |
21112 | case FFELEX_typeASTERISK: | |
21113 | case FFELEX_typeSEMICOLON: | |
21114 | case FFELEX_typeEOS: | |
21115 | ffesta_confirmed (); | |
21116 | break; | |
21117 | ||
21118 | default: | |
21119 | break; | |
21120 | } | |
21121 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlRECURSIVE); | |
21122 | if (!ffesrc_is_name_init (*p)) | |
21123 | goto bad_0; /* :::::::::::::::::::: */ | |
21124 | ffestb_local_.decl.recursive | |
21125 | = ffelex_token_name_from_names (ffesta_tokens[0], 0, | |
21126 | FFESTR_firstlRECURSIVE); | |
21127 | nt = ffelex_token_names_from_names (ffesta_tokens[0], | |
21128 | FFESTR_firstlRECURSIVE, 0); | |
21129 | switch (ffestr_first (nt)) | |
21130 | { | |
21131 | case FFESTR_firstINTGR: | |
21132 | p = ffelex_token_text (nt) + (i = FFESTR_firstlINTGR); | |
21133 | ffestb_local_.decl.type = FFESTP_typeINTEGER; | |
21134 | needfunc = FALSE; | |
21135 | goto typefunc; /* :::::::::::::::::::: */ | |
21136 | ||
21137 | case FFESTR_firstBYTE: | |
21138 | p = ffelex_token_text (nt) + (i = FFESTR_firstlBYTE); | |
21139 | ffestb_local_.decl.type = FFESTP_typeBYTE; | |
21140 | needfunc = FALSE; | |
21141 | goto typefunc; /* :::::::::::::::::::: */ | |
21142 | ||
21143 | case FFESTR_firstWORD: | |
21144 | p = ffelex_token_text (nt) + (i = FFESTR_firstlWORD); | |
21145 | ffestb_local_.decl.type = FFESTP_typeWORD; | |
21146 | needfunc = FALSE; | |
21147 | goto typefunc; /* :::::::::::::::::::: */ | |
21148 | ||
21149 | case FFESTR_firstREAL: | |
21150 | p = ffelex_token_text (nt) + (i = FFESTR_firstlREAL); | |
21151 | ffestb_local_.decl.type = FFESTP_typeREAL; | |
21152 | needfunc = FALSE; | |
21153 | goto typefunc; /* :::::::::::::::::::: */ | |
21154 | ||
21155 | case FFESTR_firstCMPLX: | |
21156 | p = ffelex_token_text (nt) + (i = FFESTR_firstlCMPLX); | |
21157 | ffestb_local_.decl.type = FFESTP_typeCOMPLEX; | |
21158 | needfunc = FALSE; | |
21159 | goto typefunc; /* :::::::::::::::::::: */ | |
21160 | ||
21161 | case FFESTR_firstLGCL: | |
21162 | p = ffelex_token_text (nt) + (i = FFESTR_firstlLGCL); | |
21163 | ffestb_local_.decl.type = FFESTP_typeLOGICAL; | |
21164 | needfunc = FALSE; | |
21165 | goto typefunc; /* :::::::::::::::::::: */ | |
21166 | ||
21167 | case FFESTR_firstCHRCTR: | |
21168 | p = ffelex_token_text (nt) + (i = FFESTR_firstlCHRCTR); | |
21169 | ffestb_local_.decl.type = FFESTP_typeCHARACTER; | |
21170 | needfunc = FALSE; | |
21171 | goto typefunc; /* :::::::::::::::::::: */ | |
21172 | ||
21173 | case FFESTR_firstDBLPRCSN: | |
21174 | p = ffelex_token_text (nt) + (i = FFESTR_firstlDBLPRCSN); | |
21175 | ffestb_local_.decl.type = FFESTP_typeDBLPRCSN; | |
21176 | needfunc = TRUE; | |
21177 | goto typefunc; /* :::::::::::::::::::: */ | |
21178 | ||
21179 | case FFESTR_firstDBLCMPLX: | |
21180 | p = ffelex_token_text (nt) + (i = FFESTR_firstlDBLCMPLX); | |
21181 | ffestb_local_.decl.type = FFESTP_typeDBLCMPLX; | |
21182 | needfunc = TRUE; | |
21183 | goto typefunc; /* :::::::::::::::::::: */ | |
21184 | ||
21185 | case FFESTR_firstTYPE: | |
21186 | p = ffelex_token_text (nt) + (i = FFESTR_firstlTYPE); | |
21187 | ffestb_local_.decl.type = FFESTP_typeTYPE; | |
21188 | next = (ffelexHandler) ffestb_decl_recursive3_; | |
21189 | break; | |
21190 | ||
21191 | case FFESTR_firstFUNCTION: | |
21192 | p = ffelex_token_text (nt) + (i = FFESTR_firstlFUNCTION); | |
21193 | ffestb_local_.dummy.first_kw = FFESTR_firstFUNCTION; | |
21194 | ffestb_local_.dummy.badname = "FUNCTION"; | |
21195 | ffestb_local_.dummy.is_subr = FALSE; | |
21196 | next = (ffelexHandler) ffestb_decl_recursive4_; | |
21197 | break; | |
21198 | ||
21199 | case FFESTR_firstSUBROUTINE: | |
21200 | p = ffelex_token_text (nt) + (i = FFESTR_firstlSUBROUTINE); | |
21201 | ffestb_local_.dummy.first_kw = FFESTR_firstSUBROUTINE; | |
21202 | ffestb_local_.dummy.badname = "SUBROUTINE"; | |
21203 | ffestb_local_.dummy.is_subr = TRUE; | |
21204 | next = (ffelexHandler) ffestb_decl_recursive4_; | |
21205 | break; | |
21206 | ||
21207 | default: | |
21208 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21209 | ffelex_token_kill (nt); | |
21210 | goto bad_1; /* :::::::::::::::::::: */ | |
21211 | } | |
21212 | if (*p == '\0') | |
21213 | { | |
21214 | ffelex_token_kill (nt); | |
21215 | return (ffelexHandler) (*next) (t); | |
21216 | } | |
21217 | if (!ffesrc_is_name_init (*p)) | |
21218 | goto bad_i; /* :::::::::::::::::::: */ | |
21219 | ot = ffelex_token_name_from_names (nt, i, 0); | |
21220 | ffelex_token_kill (nt); | |
21221 | next = (ffelexHandler) (*next) (ot); | |
21222 | ffelex_token_kill (ot); | |
21223 | return (ffelexHandler) (*next) (t); | |
21224 | ||
21225 | default: | |
21226 | goto bad_0; /* :::::::::::::::::::: */ | |
21227 | } | |
21228 | ||
21229 | typefunc: /* :::::::::::::::::::: */ | |
21230 | if (*p == '\0') | |
21231 | { | |
21232 | ffelex_token_kill (nt); | |
21233 | if (needfunc) /* DOUBLE PRECISION or DOUBLE COMPLEX? */ | |
21234 | { | |
21235 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21236 | goto bad_1; /* :::::::::::::::::::: */ | |
21237 | } | |
21238 | return (ffelexHandler) ffestb_decl_recursive1_ (t); | |
21239 | } | |
21240 | if (!ffesrc_is_name_init (*p)) | |
21241 | goto bad_i; /* :::::::::::::::::::: */ | |
21242 | ot = ffelex_token_names_from_names (nt, i, 0); | |
21243 | ffelex_token_kill (nt); | |
21244 | if (ffestr_first (ot) != FFESTR_firstFUNCTION) | |
21245 | goto bad_o; /* :::::::::::::::::::: */ | |
21246 | p = ffelex_token_text (ot) + (i = FFESTR_firstlFUNCTION); | |
21247 | if (!ffesrc_is_name_init (*p)) | |
21248 | goto bad_i; /* :::::::::::::::::::: */ | |
21249 | ffesta_tokens[1] = ffelex_token_name_from_names (ot, i, 0); | |
21250 | ffelex_token_kill (ot); | |
21251 | ffestb_local_.decl.kind = NULL; | |
21252 | ffestb_local_.decl.kindt = NULL; | |
21253 | ffestb_local_.decl.len = NULL; | |
21254 | ffestb_local_.decl.lent = NULL; | |
21255 | return (ffelexHandler) ffestb_decl_funcname_1_ (t); | |
21256 | ||
21257 | bad_0: /* :::::::::::::::::::: */ | |
21258 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ffesta_tokens[0]); | |
21259 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21260 | ||
21261 | bad_1: /* :::::::::::::::::::: */ | |
21262 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
21263 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
21264 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
21265 | ||
21266 | bad_i: /* :::::::::::::::::::: */ | |
21267 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21268 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "type-declaration", nt, i, t); | |
21269 | ffelex_token_kill (nt); | |
21270 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21271 | ||
21272 | bad_o: /* :::::::::::::::::::: */ | |
21273 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21274 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ot); | |
21275 | ffelex_token_kill (ot); | |
21276 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21277 | } | |
21278 | ||
21279 | /* ffestb_decl_recursive1_ -- "RECURSIVE" generic-type | |
21280 | ||
21281 | return ffestb_decl_recursive1_; // to lexer | |
21282 | ||
21283 | Handle ASTERISK, OPEN_PAREN, or NAME. */ | |
21284 | ||
21285 | static ffelexHandler | |
21286 | ffestb_decl_recursive1_ (ffelexToken t) | |
21287 | { | |
21288 | switch (ffelex_token_type (t)) | |
21289 | { | |
21290 | case FFELEX_typeASTERISK: | |
21291 | ffesta_confirmed (); | |
21292 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_; | |
21293 | ffestb_local_.decl.badname = "TYPEFUNC"; | |
21294 | if (ffestb_local_.decl.type == FFESTP_typeCHARACTER) | |
21295 | return (ffelexHandler) ffestb_decl_starlen_; | |
21296 | return (ffelexHandler) ffestb_decl_starkind_; | |
21297 | ||
21298 | case FFELEX_typeOPEN_PAREN: | |
21299 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_; | |
21300 | ffestb_local_.decl.badname = "TYPEFUNC"; | |
21301 | if (ffestb_local_.decl.type == FFESTP_typeCHARACTER) | |
21302 | { | |
21303 | ffestb_local_.decl.kind = NULL; | |
21304 | ffestb_local_.decl.kindt = NULL; | |
21305 | ffestb_local_.decl.len = NULL; | |
21306 | ffestb_local_.decl.lent = NULL; | |
21307 | return (ffelexHandler) ffestb_decl_typeparams_; | |
21308 | } | |
21309 | return (ffelexHandler) ffestb_decl_kindparam_; | |
21310 | ||
21311 | case FFELEX_typeNAME: | |
21312 | ffestb_local_.decl.kind = NULL; | |
21313 | ffestb_local_.decl.kindt = NULL; | |
21314 | ffestb_local_.decl.len = NULL; | |
21315 | ffestb_local_.decl.lent = NULL; | |
21316 | return (ffelexHandler) ffestb_decl_func_ (t); | |
21317 | ||
21318 | default: | |
21319 | break; | |
21320 | } | |
21321 | ||
21322 | if (ffestb_local_.decl.recursive != NULL) | |
21323 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21324 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
21325 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21326 | } | |
21327 | ||
21328 | /* ffestb_decl_recursive2_ -- "RECURSIVE" "DOUBLE" | |
21329 | ||
21330 | return ffestb_decl_recursive2_; // to lexer | |
21331 | ||
21332 | Handle NAME. */ | |
21333 | ||
21334 | static ffelexHandler | |
21335 | ffestb_decl_recursive2_ (ffelexToken t) | |
21336 | { | |
21337 | switch (ffelex_token_type (t)) | |
21338 | { | |
21339 | case FFELEX_typeNAME: | |
21340 | switch (ffestr_second (t)) | |
21341 | { | |
21342 | case FFESTR_secondPRECISION: | |
21343 | ffestb_local_.decl.type = FFESTP_typeDBLPRCSN; | |
21344 | break; | |
21345 | ||
21346 | case FFESTR_secondCOMPLEX: | |
21347 | ffestb_local_.decl.type = FFESTP_typeDBLCMPLX; | |
21348 | break; | |
21349 | ||
21350 | default: | |
21351 | goto bad; /* :::::::::::::::::::: */ | |
21352 | } | |
21353 | ffestb_local_.decl.kind = NULL; | |
21354 | ffestb_local_.decl.kindt = NULL; | |
21355 | ffestb_local_.decl.len = NULL; | |
21356 | ffestb_local_.decl.lent = NULL; | |
21357 | return (ffelexHandler) ffestb_decl_func_; | |
21358 | ||
21359 | default: | |
21360 | break; | |
21361 | } | |
21362 | ||
21363 | bad: /* :::::::::::::::::::: */ | |
21364 | if (ffestb_local_.decl.recursive != NULL) | |
21365 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21366 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
21367 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21368 | } | |
21369 | ||
21370 | /* ffestb_decl_recursive3_ -- "RECURSIVE" "TYPE" | |
21371 | ||
21372 | return ffestb_decl_recursive3_; // to lexer | |
21373 | ||
21374 | Handle OPEN_PAREN. */ | |
21375 | ||
21376 | static ffelexHandler | |
21377 | ffestb_decl_recursive3_ (ffelexToken t) | |
21378 | { | |
21379 | switch (ffelex_token_type (t)) | |
21380 | { | |
21381 | case FFELEX_typeOPEN_PAREN: | |
21382 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_func_; | |
21383 | ffestb_local_.decl.badname = "TYPEFUNC"; | |
21384 | return (ffelexHandler) ffestb_decl_typetype1_; | |
21385 | ||
21386 | default: | |
21387 | break; | |
21388 | } | |
21389 | ||
21390 | if (ffestb_local_.decl.recursive != NULL) | |
21391 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21392 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
21393 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21394 | } | |
21395 | ||
21396 | /* ffestb_decl_recursive4_ -- "RECURSIVE" "FUNCTION/SUBROUTINE" | |
21397 | ||
21398 | return ffestb_decl_recursive4_; // to lexer | |
21399 | ||
21400 | Handle OPEN_PAREN. */ | |
21401 | ||
21402 | static ffelexHandler | |
21403 | ffestb_decl_recursive4_ (ffelexToken t) | |
21404 | { | |
21405 | switch (ffelex_token_type (t)) | |
21406 | { | |
21407 | case FFELEX_typeNAME: | |
21408 | ffesta_tokens[1] = ffelex_token_use (t); | |
21409 | return (ffelexHandler) ffestb_dummy1_; | |
21410 | ||
21411 | default: | |
21412 | break; | |
21413 | } | |
21414 | ||
21415 | if (ffestb_local_.decl.recursive != NULL) | |
21416 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
21417 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
21418 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21419 | } | |
21420 | ||
21421 | #endif | |
21422 | /* ffestb_decl_typetype -- Parse the R426/R501/R1219 TYPE statement | |
21423 | ||
21424 | return ffestb_decl_typetype; // to lexer | |
21425 | ||
21426 | Make sure the statement has a valid form for the TYPE statement. If it | |
21427 | does, implement the statement. */ | |
21428 | ||
21429 | #if FFESTR_F90 | |
21430 | ffelexHandler | |
21431 | ffestb_decl_typetype (ffelexToken t) | |
21432 | { | |
21433 | switch (ffelex_token_type (ffesta_tokens[0])) | |
21434 | { | |
21435 | case FFELEX_typeNAME: | |
21436 | if (ffesta_first_kw != FFESTR_firstTYPE) | |
21437 | goto bad_0; /* :::::::::::::::::::: */ | |
21438 | break; | |
21439 | ||
21440 | case FFELEX_typeNAMES: | |
21441 | if (ffesta_first_kw != FFESTR_firstTYPE) | |
21442 | goto bad_0; /* :::::::::::::::::::: */ | |
21443 | if (ffelex_token_length (ffesta_tokens[0]) != FFESTR_firstlTYPE) | |
21444 | goto bad_0; /* :::::::::::::::::::: */ | |
21445 | break; | |
21446 | ||
21447 | default: | |
21448 | goto bad_0; /* :::::::::::::::::::: */ | |
21449 | } | |
21450 | ||
21451 | switch (ffelex_token_type (t)) | |
21452 | { | |
21453 | case FFELEX_typeOPEN_PAREN: | |
21454 | break; | |
21455 | ||
21456 | case FFELEX_typeEOS: | |
21457 | case FFELEX_typeSEMICOLON: | |
21458 | case FFELEX_typeCOLONCOLON:/* Not COMMA: R424 "TYPE,PUBLIC::A". */ | |
21459 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
21460 | goto bad_1; /* :::::::::::::::::::: */ | |
21461 | ||
21462 | default: | |
21463 | goto bad_1; /* :::::::::::::::::::: */ | |
21464 | } | |
21465 | ||
21466 | ffestb_local_.decl.recursive = NULL; | |
21467 | ffestb_local_.decl.parameter = FALSE; /* No PARAMETER attribute seen. */ | |
21468 | ffestb_local_.decl.coloncolon = FALSE; /* No COLONCOLON seen. */ | |
21469 | ||
21470 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_attrsp_; | |
21471 | ffestb_local_.decl.badname = "type-declaration"; | |
21472 | return (ffelexHandler) ffestb_decl_typetype1_; | |
21473 | ||
21474 | bad_0: /* :::::::::::::::::::: */ | |
21475 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", ffesta_tokens[0]); | |
21476 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21477 | ||
21478 | bad_1: /* :::::::::::::::::::: */ | |
21479 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21480 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
21481 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
21482 | } | |
21483 | ||
21484 | #endif | |
21485 | /* ffestb_decl_attrs_ -- "type" [type parameters] COMMA | |
21486 | ||
21487 | return ffestb_decl_attrs_; // to lexer | |
21488 | ||
21489 | Handle NAME of an attribute. */ | |
21490 | ||
21491 | static ffelexHandler | |
21492 | ffestb_decl_attrs_ (ffelexToken t) | |
21493 | { | |
21494 | switch (ffelex_token_type (t)) | |
21495 | { | |
21496 | case FFELEX_typeNAME: | |
21497 | switch (ffestr_first (t)) | |
21498 | { | |
21499 | #if FFESTR_F90 | |
21500 | case FFESTR_firstALLOCATABLE: | |
21501 | if (!ffesta_is_inhibited ()) | |
21502 | ffestc_decl_attrib (FFESTP_attribALLOCATABLE, t, | |
21503 | FFESTR_otherNone, NULL); | |
21504 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21505 | #endif | |
21506 | ||
21507 | case FFESTR_firstDIMENSION: | |
21508 | ffesta_tokens[1] = ffelex_token_use (t); | |
21509 | return (ffelexHandler) ffestb_decl_attrs_1_; | |
21510 | ||
21511 | case FFESTR_firstEXTERNAL: | |
21512 | if (!ffesta_is_inhibited ()) | |
21513 | ffestc_decl_attrib (FFESTP_attribEXTERNAL, t, | |
21514 | FFESTR_otherNone, NULL); | |
21515 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21516 | ||
21517 | #if FFESTR_F90 | |
21518 | case FFESTR_firstINTENT: | |
21519 | ffesta_tokens[1] = ffelex_token_use (t); | |
21520 | return (ffelexHandler) ffestb_decl_attrs_3_; | |
21521 | #endif | |
21522 | ||
21523 | case FFESTR_firstINTRINSIC: | |
21524 | if (!ffesta_is_inhibited ()) | |
21525 | ffestc_decl_attrib (FFESTP_attribINTRINSIC, t, | |
21526 | FFESTR_otherNone, NULL); | |
21527 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21528 | ||
21529 | #if FFESTR_F90 | |
21530 | case FFESTR_firstOPTIONAL: | |
21531 | if (!ffesta_is_inhibited ()) | |
21532 | ffestc_decl_attrib (FFESTP_attribOPTIONAL, t, | |
21533 | FFESTR_otherNone, NULL); | |
21534 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21535 | #endif | |
21536 | ||
21537 | case FFESTR_firstPARAMETER: | |
21538 | ffestb_local_.decl.parameter = TRUE; | |
21539 | if (!ffesta_is_inhibited ()) | |
21540 | ffestc_decl_attrib (FFESTP_attribPARAMETER, t, | |
21541 | FFESTR_otherNone, NULL); | |
21542 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21543 | ||
21544 | #if FFESTR_F90 | |
21545 | case FFESTR_firstPOINTER: | |
21546 | if (!ffesta_is_inhibited ()) | |
21547 | ffestc_decl_attrib (FFESTP_attribPOINTER, t, | |
21548 | FFESTR_otherNone, NULL); | |
21549 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21550 | #endif | |
21551 | ||
21552 | #if FFESTR_F90 | |
21553 | case FFESTR_firstPRIVATE: | |
21554 | if (!ffesta_is_inhibited ()) | |
21555 | ffestc_decl_attrib (FFESTP_attribPRIVATE, t, | |
21556 | FFESTR_otherNone, NULL); | |
21557 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21558 | ||
21559 | case FFESTR_firstPUBLIC: | |
21560 | if (!ffesta_is_inhibited ()) | |
21561 | ffestc_decl_attrib (FFESTP_attribPUBLIC, t, | |
21562 | FFESTR_otherNone, NULL); | |
21563 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21564 | #endif | |
21565 | ||
21566 | case FFESTR_firstSAVE: | |
21567 | if (!ffesta_is_inhibited ()) | |
21568 | ffestc_decl_attrib (FFESTP_attribSAVE, t, | |
21569 | FFESTR_otherNone, NULL); | |
21570 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21571 | ||
21572 | #if FFESTR_F90 | |
21573 | case FFESTR_firstTARGET: | |
21574 | if (!ffesta_is_inhibited ()) | |
21575 | ffestc_decl_attrib (FFESTP_attribTARGET, t, | |
21576 | FFESTR_otherNone, NULL); | |
21577 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21578 | #endif | |
21579 | ||
21580 | default: | |
21581 | ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t); | |
21582 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21583 | } | |
21584 | break; | |
21585 | ||
21586 | default: | |
21587 | break; | |
21588 | } | |
21589 | ||
21590 | if (!ffesta_is_inhibited ()) | |
21591 | ffestc_decl_finish (); | |
21592 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21593 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21594 | } | |
21595 | ||
21596 | /* ffestb_decl_attrs_1_ -- "type" [type parameters] ",DIMENSION" | |
21597 | ||
21598 | return ffestb_decl_attrs_1_; // to lexer | |
21599 | ||
21600 | Handle OPEN_PAREN. */ | |
21601 | ||
21602 | static ffelexHandler | |
21603 | ffestb_decl_attrs_1_ (ffelexToken t) | |
21604 | { | |
21605 | switch (ffelex_token_type (t)) | |
21606 | { | |
21607 | case FFELEX_typeOPEN_PAREN: | |
21608 | ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create (); | |
21609 | ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_decl_attrs_2_; | |
21610 | ffestb_subrargs_.dim_list.pool = ffesta_scratch_pool; | |
21611 | ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid | |
21612 | ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON; | |
21613 | #ifdef FFECOM_dimensionsMAX | |
21614 | ffestb_subrargs_.dim_list.ndims = 0; | |
21615 | #endif | |
21616 | return (ffelexHandler) ffeexpr_rhs (ffesta_scratch_pool, | |
21617 | ffestb_subrargs_.dim_list.ctx, | |
21618 | (ffeexprCallback) ffestb_subr_dimlist_); | |
21619 | ||
21620 | case FFELEX_typeCOMMA: | |
21621 | case FFELEX_typeCOLONCOLON: | |
21622 | ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, ffesta_tokens[1]); | |
21623 | ffelex_token_kill (ffesta_tokens[1]); | |
21624 | return (ffelexHandler) ffestb_decl_attrs_7_ (t); | |
21625 | ||
21626 | default: | |
21627 | break; | |
21628 | } | |
21629 | ||
21630 | if (!ffesta_is_inhibited ()) | |
21631 | ffestc_decl_finish (); | |
21632 | ffelex_token_kill (ffesta_tokens[1]); | |
21633 | ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t); | |
21634 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21635 | } | |
21636 | ||
21637 | /* ffestb_decl_attrs_2_ -- "type" [type parameters] ",DIMENSION" OPEN_PAREN | |
21638 | dimlist CLOSE_PAREN | |
21639 | ||
21640 | return ffestb_decl_attrs_2_; // to lexer | |
21641 | ||
21642 | Handle COMMA or COLONCOLON. */ | |
21643 | ||
21644 | static ffelexHandler | |
21645 | ffestb_decl_attrs_2_ (ffelexToken t) | |
21646 | { | |
21647 | if (!ffestb_subrargs_.dim_list.ok) | |
21648 | goto bad; /* :::::::::::::::::::: */ | |
21649 | ||
21650 | switch (ffelex_token_type (t)) | |
21651 | { | |
21652 | case FFELEX_typeCOMMA: | |
21653 | case FFELEX_typeCOLONCOLON: | |
21654 | if (!ffesta_is_inhibited ()) | |
21655 | ffestc_decl_attrib (FFESTP_attribDIMENSION, ffesta_tokens[1], | |
21656 | FFESTR_otherNone, ffestb_subrargs_.dim_list.dims); | |
21657 | ffelex_token_kill (ffesta_tokens[1]); | |
21658 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
21659 | return (ffelexHandler) ffestb_decl_attrs_7_ (t); | |
21660 | ||
21661 | default: | |
21662 | break; | |
21663 | } | |
21664 | ||
21665 | bad: /* :::::::::::::::::::: */ | |
21666 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21667 | if (!ffesta_is_inhibited ()) | |
21668 | ffestc_decl_finish (); | |
21669 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
21670 | ffelex_token_kill (ffesta_tokens[1]); | |
21671 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21672 | } | |
21673 | ||
21674 | /* ffestb_decl_attrs_3_ -- "type" [type parameters] ",INTENT" | |
21675 | ||
21676 | return ffestb_decl_attrs_3_; // to lexer | |
21677 | ||
21678 | Handle OPEN_PAREN. */ | |
21679 | ||
21680 | #if FFESTR_F90 | |
21681 | static ffelexHandler | |
21682 | ffestb_decl_attrs_3_ (ffelexToken t) | |
21683 | { | |
21684 | switch (ffelex_token_type (t)) | |
21685 | { | |
21686 | case FFELEX_typeOPEN_PAREN: | |
21687 | return (ffelexHandler) ffestb_decl_attrs_4_; | |
21688 | ||
21689 | case FFELEX_typeCOMMA: | |
21690 | case FFELEX_typeCOLONCOLON: | |
21691 | ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, ffesta_tokens[1]); | |
21692 | ffelex_token_kill (ffesta_tokens[1]); | |
21693 | return (ffelexHandler) ffestb_decl_attrs_7_ (t); | |
21694 | ||
21695 | default: | |
21696 | break; | |
21697 | } | |
21698 | ||
21699 | if (!ffesta_is_inhibited ()) | |
21700 | ffestc_decl_finish (); | |
21701 | ffelex_token_kill (ffesta_tokens[1]); | |
21702 | ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t); | |
21703 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21704 | } | |
21705 | ||
21706 | /* ffestb_decl_attrs_4_ -- "type" [type parameters] ",INTENT" OPEN_PAREN | |
21707 | ||
21708 | return ffestb_decl_attrs_4_; // to lexer | |
21709 | ||
21710 | Handle NAME. */ | |
21711 | ||
21712 | static ffelexHandler | |
21713 | ffestb_decl_attrs_4_ (ffelexToken t) | |
21714 | { | |
21715 | switch (ffelex_token_type (t)) | |
21716 | { | |
21717 | case FFELEX_typeNAME: | |
21718 | ffestb_local_.decl.kw = ffestr_other (t); | |
21719 | switch (ffestb_local_.decl.kw) | |
21720 | { | |
21721 | case FFESTR_otherIN: | |
21722 | return (ffelexHandler) ffestb_decl_attrs_5_; | |
21723 | ||
21724 | case FFESTR_otherINOUT: | |
21725 | return (ffelexHandler) ffestb_decl_attrs_6_; | |
21726 | ||
21727 | case FFESTR_otherOUT: | |
21728 | return (ffelexHandler) ffestb_decl_attrs_6_; | |
21729 | ||
21730 | default: | |
21731 | ffestb_local_.decl.kw = FFESTR_otherNone; | |
21732 | ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t); | |
21733 | return (ffelexHandler) ffestb_decl_attrs_5_; | |
21734 | } | |
21735 | break; | |
21736 | ||
21737 | default: | |
21738 | break; | |
21739 | } | |
21740 | ||
21741 | if (!ffesta_is_inhibited ()) | |
21742 | ffestc_decl_finish (); | |
21743 | ffelex_token_kill (ffesta_tokens[1]); | |
21744 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21745 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21746 | } | |
21747 | ||
21748 | /* ffestb_decl_attrs_5_ -- "type" [type parameters] ",INTENT" OPEN_PAREN "IN" | |
21749 | ||
21750 | return ffestb_decl_attrs_5_; // to lexer | |
21751 | ||
21752 | Handle NAME or CLOSE_PAREN. */ | |
21753 | ||
21754 | static ffelexHandler | |
21755 | ffestb_decl_attrs_5_ (ffelexToken t) | |
21756 | { | |
21757 | switch (ffelex_token_type (t)) | |
21758 | { | |
21759 | case FFELEX_typeNAME: | |
21760 | switch (ffestr_other (t)) | |
21761 | { | |
21762 | case FFESTR_otherOUT: | |
21763 | if (ffestb_local_.decl.kw != FFESTR_otherNone) | |
21764 | ffestb_local_.decl.kw = FFESTR_otherINOUT; | |
21765 | return (ffelexHandler) ffestb_decl_attrs_6_; | |
21766 | ||
21767 | default: | |
21768 | if (ffestb_local_.decl.kw != FFESTR_otherNone) | |
21769 | { | |
21770 | ffestb_local_.decl.kw = FFESTR_otherNone; | |
21771 | ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_ATTR, t); | |
21772 | } | |
21773 | return (ffelexHandler) ffestb_decl_attrs_5_; | |
21774 | } | |
21775 | break; | |
21776 | ||
21777 | case FFELEX_typeCLOSE_PAREN: | |
21778 | return (ffelexHandler) ffestb_decl_attrs_6_ (t); | |
21779 | ||
21780 | default: | |
21781 | break; | |
21782 | } | |
21783 | ||
21784 | if (!ffesta_is_inhibited ()) | |
21785 | ffestc_decl_finish (); | |
21786 | ffelex_token_kill (ffesta_tokens[1]); | |
21787 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21788 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21789 | } | |
21790 | ||
21791 | /* ffestb_decl_attrs_6_ -- "type" [type parameters] ",INTENT" OPEN_PAREN "IN" | |
21792 | ["OUT"] | |
21793 | ||
21794 | return ffestb_decl_attrs_6_; // to lexer | |
21795 | ||
21796 | Handle CLOSE_PAREN. */ | |
21797 | ||
21798 | static ffelexHandler | |
21799 | ffestb_decl_attrs_6_ (ffelexToken t) | |
21800 | { | |
21801 | switch (ffelex_token_type (t)) | |
21802 | { | |
21803 | case FFELEX_typeCLOSE_PAREN: | |
21804 | if ((ffestb_local_.decl.kw != FFESTR_otherNone) | |
21805 | && !ffesta_is_inhibited ()) | |
21806 | ffestc_decl_attrib (FFESTP_attribINTENT, ffesta_tokens[1], | |
21807 | ffestb_local_.decl.kw, NULL); | |
21808 | ffelex_token_kill (ffesta_tokens[1]); | |
21809 | return (ffelexHandler) ffestb_decl_attrs_7_; | |
21810 | ||
21811 | default: | |
21812 | break; | |
21813 | } | |
21814 | ||
21815 | if (!ffesta_is_inhibited ()) | |
21816 | ffestc_decl_finish (); | |
21817 | ffelex_token_kill (ffesta_tokens[1]); | |
21818 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21819 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21820 | } | |
21821 | ||
21822 | #endif | |
21823 | /* ffestb_decl_attrs_7_ -- "type" [type parameters] attribute | |
21824 | ||
21825 | return ffestb_decl_attrs_7_; // to lexer | |
21826 | ||
21827 | Handle COMMA (another attribute) or COLONCOLON (entities). */ | |
21828 | ||
21829 | static ffelexHandler | |
21830 | ffestb_decl_attrs_7_ (ffelexToken t) | |
21831 | { | |
21832 | switch (ffelex_token_type (t)) | |
21833 | { | |
21834 | case FFELEX_typeCOMMA: | |
21835 | return (ffelexHandler) ffestb_decl_attrs_; | |
21836 | ||
21837 | case FFELEX_typeCOLONCOLON: | |
21838 | ffestb_local_.decl.coloncolon = TRUE; | |
21839 | return (ffelexHandler) ffestb_decl_ents_; | |
21840 | ||
21841 | default: | |
21842 | break; | |
21843 | } | |
21844 | ||
21845 | if (!ffesta_is_inhibited ()) | |
21846 | ffestc_decl_finish (); | |
21847 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21848 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21849 | } | |
21850 | ||
21851 | /* ffestb_decl_attrsp_ -- "type" [type parameters] | |
21852 | ||
21853 | return ffestb_decl_attrsp_; // to lexer | |
21854 | ||
21855 | Handle COMMA (meaning we have attributes), COLONCOLON (meaning we have | |
21856 | no attributes but entities), or go to entsp to see about functions or | |
21857 | entities. */ | |
21858 | ||
21859 | static ffelexHandler | |
21860 | ffestb_decl_attrsp_ (ffelexToken t) | |
21861 | { | |
21862 | ffelex_set_names (FALSE); | |
21863 | ||
21864 | switch (ffelex_token_type (t)) | |
21865 | { | |
21866 | case FFELEX_typeCOMMA: | |
21867 | ffesta_confirmed (); | |
21868 | if (!ffesta_is_inhibited ()) | |
21869 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
21870 | ffestb_local_.decl.kind, ffestb_local_.decl.kindt, | |
21871 | ffestb_local_.decl.len, ffestb_local_.decl.lent); | |
21872 | if (ffestb_local_.decl.kindt != NULL) | |
21873 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
21874 | if (ffestb_local_.decl.lent != NULL) | |
21875 | ffelex_token_kill (ffestb_local_.decl.lent); | |
21876 | return (ffelexHandler) ffestb_decl_attrs_; | |
21877 | ||
21878 | case FFELEX_typeCOLONCOLON: | |
21879 | ffestb_local_.decl.coloncolon = TRUE; | |
21880 | ffesta_confirmed (); | |
21881 | if (!ffesta_is_inhibited ()) | |
21882 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
21883 | ffestb_local_.decl.kind, ffestb_local_.decl.kindt, | |
21884 | ffestb_local_.decl.len, ffestb_local_.decl.lent); | |
21885 | if (ffestb_local_.decl.kindt != NULL) | |
21886 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
21887 | if (ffestb_local_.decl.lent != NULL) | |
21888 | ffelex_token_kill (ffestb_local_.decl.lent); | |
21889 | return (ffelexHandler) ffestb_decl_ents_; | |
21890 | ||
21891 | default: | |
21892 | return (ffelexHandler) ffestb_decl_entsp_ (t); | |
21893 | } | |
21894 | } | |
21895 | ||
21896 | /* ffestb_decl_ents_ -- "type" [type parameters] [attributes "::"] | |
21897 | ||
21898 | return ffestb_decl_ents_; // to lexer | |
21899 | ||
21900 | Handle NAME of an entity. */ | |
21901 | ||
21902 | static ffelexHandler | |
21903 | ffestb_decl_ents_ (ffelexToken t) | |
21904 | { | |
21905 | switch (ffelex_token_type (t)) | |
21906 | { | |
21907 | case FFELEX_typeNAME: | |
21908 | ffesta_tokens[1] = ffelex_token_use (t); | |
21909 | return (ffelexHandler) ffestb_decl_ents_1_; | |
21910 | ||
21911 | default: | |
21912 | break; | |
21913 | } | |
21914 | ||
21915 | if (!ffesta_is_inhibited ()) | |
21916 | ffestc_decl_finish (); | |
21917 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21918 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21919 | } | |
21920 | ||
21921 | /* ffestb_decl_ents_1_ -- "type" [type parameters] [attributes "::"] NAME | |
21922 | ||
21923 | return ffestb_decl_ents_1_; // to lexer | |
21924 | ||
21925 | Handle ASTERISK, OPEN_PAREN, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */ | |
21926 | ||
21927 | static ffelexHandler | |
21928 | ffestb_decl_ents_1_ (ffelexToken t) | |
21929 | { | |
21930 | switch (ffelex_token_type (t)) | |
21931 | { | |
21932 | case FFELEX_typeCOMMA: | |
21933 | if (!ffesta_is_inhibited ()) | |
21934 | ffestc_decl_item (ffesta_tokens[1], NULL, NULL, NULL, NULL, NULL, NULL, | |
21935 | NULL, FALSE); | |
21936 | ffelex_token_kill (ffesta_tokens[1]); | |
21937 | return (ffelexHandler) ffestb_decl_ents_; | |
21938 | ||
21939 | case FFELEX_typeEOS: | |
21940 | case FFELEX_typeSEMICOLON: | |
21941 | if (!ffesta_is_inhibited ()) | |
21942 | { | |
21943 | ffestc_decl_item (ffesta_tokens[1], NULL, NULL, NULL, NULL, NULL, NULL, | |
21944 | NULL, FALSE); | |
21945 | ffestc_decl_finish (); | |
21946 | } | |
21947 | ffelex_token_kill (ffesta_tokens[1]); | |
21948 | return (ffelexHandler) ffesta_zero (t); | |
21949 | ||
21950 | case FFELEX_typeASTERISK: | |
21951 | ffestb_local_.decl.len = NULL; | |
21952 | ffestb_local_.decl.lent = NULL; | |
21953 | return (ffelexHandler) ffestb_decl_ents_2_; | |
21954 | ||
21955 | case FFELEX_typeOPEN_PAREN: | |
21956 | ffestb_local_.decl.kind = NULL; | |
21957 | ffestb_local_.decl.kindt = NULL; | |
21958 | ffestb_local_.decl.len = NULL; | |
21959 | ffestb_local_.decl.lent = NULL; | |
21960 | return (ffelexHandler) ffestb_decl_ents_3_ (t); | |
21961 | ||
21962 | case FFELEX_typeEQUALS: | |
21963 | case FFELEX_typeSLASH: | |
21964 | ffestb_local_.decl.kind = NULL; | |
21965 | ffestb_local_.decl.kindt = NULL; | |
21966 | ffestb_subrargs_.dim_list.dims = NULL; | |
21967 | ffestb_local_.decl.len = NULL; | |
21968 | ffestb_local_.decl.lent = NULL; | |
21969 | return (ffelexHandler) ffestb_decl_ents_7_ (t); | |
21970 | ||
21971 | default: | |
21972 | break; | |
21973 | } | |
21974 | ||
21975 | if (!ffesta_is_inhibited ()) | |
21976 | ffestc_decl_finish (); | |
21977 | ffelex_token_kill (ffesta_tokens[1]); | |
21978 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
21979 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
21980 | } | |
21981 | ||
21982 | /* ffestb_decl_ents_2_ -- "type" [type parameters] [attributes "::"] NAME | |
21983 | ASTERISK | |
21984 | ||
21985 | return ffestb_decl_ents_2_; // to lexer | |
21986 | ||
21987 | Handle NUMBER or OPEN_PAREN. */ | |
21988 | ||
21989 | static ffelexHandler | |
21990 | ffestb_decl_ents_2_ (ffelexToken t) | |
21991 | { | |
21992 | switch (ffelex_token_type (t)) | |
21993 | { | |
21994 | case FFELEX_typeNUMBER: | |
21995 | if (ffestb_local_.decl.type != FFESTP_typeCHARACTER) | |
21996 | { | |
21997 | ffestb_local_.decl.kind = NULL; | |
21998 | ffestb_local_.decl.kindt = ffelex_token_use (t); | |
21999 | return (ffelexHandler) ffestb_decl_ents_3_; | |
22000 | } | |
22001 | /* Fall through. *//* (CHARACTER's *n is always a len spec. */ | |
22002 | case FFELEX_typeOPEN_PAREN:/* "*(" is after the (omitted) | |
22003 | "(array-spec)". */ | |
22004 | ffestb_local_.decl.kind = NULL; | |
22005 | ffestb_local_.decl.kindt = NULL; | |
22006 | ffestb_subrargs_.dim_list.dims = NULL; | |
22007 | return (ffelexHandler) ffestb_decl_ents_5_ (t); | |
22008 | ||
22009 | default: | |
22010 | break; | |
22011 | } | |
22012 | ||
22013 | if (!ffesta_is_inhibited ()) | |
22014 | ffestc_decl_finish (); | |
22015 | ffelex_token_kill (ffesta_tokens[1]); | |
22016 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22017 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22018 | } | |
22019 | ||
22020 | /* ffestb_decl_ents_3_ -- "type" [type parameters] [attributes "::"] NAME | |
22021 | [ASTERISK NUMBER] | |
22022 | ||
22023 | return ffestb_decl_ents_3_; // to lexer | |
22024 | ||
22025 | Handle ASTERISK, OPEN_PAREN, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */ | |
22026 | ||
22027 | static ffelexHandler | |
22028 | ffestb_decl_ents_3_ (ffelexToken t) | |
22029 | { | |
22030 | switch (ffelex_token_type (t)) | |
22031 | { | |
22032 | case FFELEX_typeCOMMA: | |
22033 | if (!ffesta_is_inhibited ()) | |
22034 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22035 | ffestb_local_.decl.kindt, NULL, NULL, NULL, NULL, NULL, FALSE); | |
22036 | ffelex_token_kill (ffesta_tokens[1]); | |
22037 | if (ffestb_local_.decl.kindt != NULL) | |
22038 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22039 | return (ffelexHandler) ffestb_decl_ents_; | |
22040 | ||
22041 | case FFELEX_typeEOS: | |
22042 | case FFELEX_typeSEMICOLON: | |
22043 | if (!ffesta_is_inhibited ()) | |
22044 | { | |
22045 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22046 | ffestb_local_.decl.kindt, NULL, NULL, NULL, NULL, NULL, FALSE); | |
22047 | ffestc_decl_finish (); | |
22048 | } | |
22049 | ffelex_token_kill (ffesta_tokens[1]); | |
22050 | if (ffestb_local_.decl.kindt != NULL) | |
22051 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22052 | return (ffelexHandler) ffesta_zero (t); | |
22053 | ||
22054 | case FFELEX_typeASTERISK: | |
22055 | ffestb_subrargs_.dim_list.dims = NULL; | |
22056 | return (ffelexHandler) ffestb_decl_ents_5_; | |
22057 | ||
22058 | case FFELEX_typeOPEN_PAREN: | |
22059 | ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create (); | |
22060 | ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_decl_ents_4_; | |
22061 | ffestb_subrargs_.dim_list.pool = ffesta_output_pool; | |
22062 | ffestb_subrargs_.dim_list.ctx = ffesta_is_entry_valid | |
22063 | ? FFEEXPR_contextDIMLIST : FFEEXPR_contextDIMLISTCOMMON; | |
22064 | #ifdef FFECOM_dimensionsMAX | |
22065 | ffestb_subrargs_.dim_list.ndims = 0; | |
22066 | #endif | |
22067 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
22068 | ffestb_subrargs_.dim_list.ctx, | |
22069 | (ffeexprCallback) ffestb_subr_dimlist_); | |
22070 | ||
22071 | case FFELEX_typeEQUALS: | |
22072 | case FFELEX_typeSLASH: | |
22073 | ffestb_local_.decl.kind = NULL; | |
22074 | ffestb_local_.decl.kindt = NULL; | |
22075 | ffestb_subrargs_.dim_list.dims = NULL; | |
22076 | ffestb_local_.decl.len = NULL; | |
22077 | ffestb_local_.decl.lent = NULL; | |
22078 | return (ffelexHandler) ffestb_decl_ents_7_ (t); | |
22079 | ||
22080 | default: | |
22081 | break; | |
22082 | } | |
22083 | ||
22084 | if (!ffesta_is_inhibited ()) | |
22085 | ffestc_decl_finish (); | |
22086 | ffelex_token_kill (ffesta_tokens[1]); | |
22087 | if (ffestb_local_.decl.kindt != NULL) | |
22088 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22089 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22090 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22091 | } | |
22092 | ||
22093 | /* ffestb_decl_ents_4_ -- "type" [type parameters] [attributes "::"] NAME | |
22094 | [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN] | |
22095 | ||
22096 | return ffestb_decl_ents_4_; // to lexer | |
22097 | ||
22098 | Handle ASTERISK, EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */ | |
22099 | ||
22100 | static ffelexHandler | |
22101 | ffestb_decl_ents_4_ (ffelexToken t) | |
22102 | { | |
22103 | ffelexToken nt; | |
22104 | ||
22105 | if (!ffestb_subrargs_.dim_list.ok) | |
22106 | goto bad; /* :::::::::::::::::::: */ | |
22107 | ||
22108 | if (ffelex_token_type (ffesta_tokens[1]) == FFELEX_typeNAMES) | |
22109 | { | |
22110 | switch (ffelex_token_type (t)) | |
22111 | { | |
22112 | case FFELEX_typeCOMMA: | |
22113 | case FFELEX_typeEOS: | |
22114 | case FFELEX_typeSEMICOLON: | |
22115 | case FFELEX_typeASTERISK: | |
22116 | case FFELEX_typeSLASH: /* But NOT FFELEX_typeEQUALS. */ | |
22117 | case FFELEX_typeCOLONCOLON: /* Actually an error. */ | |
22118 | break; /* Confirm and handle. */ | |
22119 | ||
22120 | default: /* Perhaps EQUALS, as in | |
22121 | INTEGERFUNCTIONX(A)=B. */ | |
22122 | goto bad; /* :::::::::::::::::::: */ | |
22123 | } | |
22124 | ffesta_confirmed (); | |
22125 | if (!ffesta_is_inhibited ()) | |
22126 | { | |
22127 | nt = ffelex_token_name_from_names (ffesta_tokens[1], 0, 0); | |
22128 | ffelex_token_kill (ffesta_tokens[1]); | |
22129 | ffesta_tokens[1] = nt; | |
22130 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
22131 | NULL, NULL, NULL, NULL); | |
22132 | } | |
22133 | } | |
22134 | ||
22135 | switch (ffelex_token_type (t)) | |
22136 | { | |
22137 | case FFELEX_typeCOMMA: | |
22138 | if (!ffesta_is_inhibited ()) | |
22139 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22140 | ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims, | |
22141 | ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL, | |
22142 | FALSE); | |
22143 | ffelex_token_kill (ffesta_tokens[1]); | |
22144 | if (ffestb_local_.decl.kindt != NULL) | |
22145 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22146 | if (ffestb_local_.decl.lent != NULL) | |
22147 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22148 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22149 | return (ffelexHandler) ffestb_decl_ents_; | |
22150 | ||
22151 | case FFELEX_typeEOS: | |
22152 | case FFELEX_typeSEMICOLON: | |
22153 | if (!ffesta_is_inhibited ()) | |
22154 | { | |
22155 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22156 | ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims, | |
22157 | ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL, | |
22158 | FALSE); | |
22159 | ffestc_decl_finish (); | |
22160 | } | |
22161 | ffelex_token_kill (ffesta_tokens[1]); | |
22162 | if (ffestb_local_.decl.kindt != NULL) | |
22163 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22164 | if (ffestb_local_.decl.lent != NULL) | |
22165 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22166 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22167 | return (ffelexHandler) ffesta_zero (t); | |
22168 | ||
22169 | case FFELEX_typeASTERISK: | |
22170 | if (ffestb_local_.decl.lent != NULL) | |
22171 | break; /* Can't specify "*length" twice. */ | |
22172 | return (ffelexHandler) ffestb_decl_ents_5_; | |
22173 | ||
22174 | case FFELEX_typeEQUALS: | |
22175 | case FFELEX_typeSLASH: | |
22176 | return (ffelexHandler) ffestb_decl_ents_7_ (t); | |
22177 | ||
22178 | default: | |
22179 | break; | |
22180 | } | |
22181 | ||
22182 | bad: /* :::::::::::::::::::: */ | |
22183 | if ((ffelex_token_type (ffesta_tokens[1]) != FFELEX_typeNAMES) | |
22184 | && !ffesta_is_inhibited ()) | |
22185 | ffestc_decl_finish (); | |
22186 | ffelex_token_kill (ffesta_tokens[1]); | |
22187 | if (ffestb_local_.decl.kindt != NULL) | |
22188 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22189 | if (ffestb_local_.decl.lent != NULL) | |
22190 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22191 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22192 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22193 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22194 | } | |
22195 | ||
22196 | /* ffestb_decl_ents_5_ -- "type" [type parameters] [attributes "::"] NAME | |
22197 | [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN] | |
22198 | ASTERISK | |
22199 | ||
22200 | return ffestb_decl_ents_5_; // to lexer | |
22201 | ||
22202 | Handle NUMBER or OPEN_PAREN. */ | |
22203 | ||
22204 | static ffelexHandler | |
22205 | ffestb_decl_ents_5_ (ffelexToken t) | |
22206 | { | |
22207 | switch (ffelex_token_type (t)) | |
22208 | { | |
22209 | case FFELEX_typeNUMBER: | |
22210 | ffestb_local_.decl.len = NULL; | |
22211 | ffestb_local_.decl.lent = ffelex_token_use (t); | |
22212 | return (ffelexHandler) ffestb_decl_ents_7_; | |
22213 | ||
22214 | case FFELEX_typeOPEN_PAREN: | |
22215 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
22216 | FFEEXPR_contextCHARACTERSIZE, (ffeexprCallback) ffestb_decl_ents_6_); | |
22217 | ||
22218 | default: | |
22219 | break; | |
22220 | } | |
22221 | ||
22222 | if (!ffesta_is_inhibited ()) | |
22223 | ffestc_decl_finish (); | |
22224 | ffelex_token_kill (ffesta_tokens[1]); | |
22225 | if (ffestb_local_.decl.kindt != NULL) | |
22226 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22227 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22228 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22229 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22230 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22231 | } | |
22232 | ||
22233 | /* ffestb_decl_ents_6_ -- "type" [type parameters] [attributes "::"] NAME | |
22234 | [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN] | |
22235 | ASTERISK OPEN_PAREN expr | |
22236 | ||
22237 | (ffestb_decl_ents_6_) // to expression handler | |
22238 | ||
22239 | Handle CLOSE_PAREN. */ | |
22240 | ||
22241 | static ffelexHandler | |
22242 | ffestb_decl_ents_6_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
22243 | { | |
22244 | switch (ffelex_token_type (t)) | |
22245 | { | |
22246 | case FFELEX_typeCLOSE_PAREN: | |
22247 | if (expr == NULL) | |
22248 | break; | |
22249 | ffestb_local_.decl.len = expr; | |
22250 | ffestb_local_.decl.lent = ffelex_token_use (ft); | |
22251 | return (ffelexHandler) ffestb_decl_ents_7_; | |
22252 | ||
22253 | default: | |
22254 | break; | |
22255 | } | |
22256 | ||
22257 | if (!ffesta_is_inhibited ()) | |
22258 | ffestc_decl_finish (); | |
22259 | ffelex_token_kill (ffesta_tokens[1]); | |
22260 | if (ffestb_local_.decl.kindt != NULL) | |
22261 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22262 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22263 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22264 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22265 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22266 | } | |
22267 | ||
22268 | /* ffestb_decl_ents_7_ -- "type" [type parameters] [attributes "::"] NAME | |
22269 | [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN] | |
22270 | [ASTERISK charlength] | |
22271 | ||
22272 | return ffestb_decl_ents_7_; // to lexer | |
22273 | ||
22274 | Handle EQUALS, SLASH, COMMA, or EOS/SEMICOLON. */ | |
22275 | ||
22276 | static ffelexHandler | |
22277 | ffestb_decl_ents_7_ (ffelexToken t) | |
22278 | { | |
22279 | switch (ffelex_token_type (t)) | |
22280 | { | |
22281 | case FFELEX_typeCOMMA: | |
22282 | if (!ffesta_is_inhibited ()) | |
22283 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22284 | ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims, | |
22285 | ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL, | |
22286 | FALSE); | |
22287 | ffelex_token_kill (ffesta_tokens[1]); | |
22288 | if (ffestb_local_.decl.kindt != NULL) | |
22289 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22290 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22291 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22292 | if (ffestb_local_.decl.lent != NULL) | |
22293 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22294 | return (ffelexHandler) ffestb_decl_ents_; | |
22295 | ||
22296 | case FFELEX_typeEOS: | |
22297 | case FFELEX_typeSEMICOLON: | |
22298 | if (!ffesta_is_inhibited ()) | |
22299 | { | |
22300 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22301 | ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims, | |
22302 | ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL, | |
22303 | FALSE); | |
22304 | ffestc_decl_finish (); | |
22305 | } | |
22306 | ffelex_token_kill (ffesta_tokens[1]); | |
22307 | if (ffestb_local_.decl.kindt != NULL) | |
22308 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22309 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22310 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22311 | if (ffestb_local_.decl.lent != NULL) | |
22312 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22313 | return (ffelexHandler) ffesta_zero (t); | |
22314 | ||
22315 | case FFELEX_typeEQUALS: | |
22316 | if (!ffestb_local_.decl.coloncolon) | |
22317 | ffesta_ffebad_1t (FFEBAD_INVALID_TYPEDECL_INIT, t); | |
22318 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
22319 | ffestb_local_.decl.parameter ? FFEEXPR_contextPARAMETER | |
22320 | : FFEEXPR_contextINITVAL, (ffeexprCallback) ffestb_decl_ents_8_); | |
22321 | ||
22322 | case FFELEX_typeSLASH: | |
22323 | if (!ffesta_is_inhibited ()) | |
22324 | { | |
22325 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22326 | ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims, | |
22327 | ffestb_local_.decl.len, ffestb_local_.decl.lent, NULL, NULL, | |
22328 | TRUE); | |
22329 | ffestc_decl_itemstartvals (); | |
22330 | } | |
22331 | ffelex_token_kill (ffesta_tokens[1]); | |
22332 | if (ffestb_local_.decl.kindt != NULL) | |
22333 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22334 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22335 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22336 | if (ffestb_local_.decl.lent != NULL) | |
22337 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22338 | return (ffelexHandler) ffeexpr_rhs | |
22339 | (ffesta_output_pool, FFEEXPR_contextDATA, | |
22340 | (ffeexprCallback) ffestb_decl_ents_9_); | |
22341 | ||
22342 | default: | |
22343 | break; | |
22344 | } | |
22345 | ||
22346 | if (!ffesta_is_inhibited ()) | |
22347 | ffestc_decl_finish (); | |
22348 | ffelex_token_kill (ffesta_tokens[1]); | |
22349 | if (ffestb_local_.decl.kindt != NULL) | |
22350 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22351 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22352 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22353 | if (ffestb_local_.decl.lent != NULL) | |
22354 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22355 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22356 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22357 | } | |
22358 | ||
22359 | /* ffestb_decl_ents_8_ -- "type" [type parameters] [attributes "::"] NAME | |
22360 | [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN] | |
22361 | [ASTERISK charlength] EQUALS expr | |
22362 | ||
22363 | (ffestb_decl_ents_8_) // to expression handler | |
22364 | ||
22365 | Handle COMMA or EOS/SEMICOLON. */ | |
22366 | ||
22367 | static ffelexHandler | |
22368 | ffestb_decl_ents_8_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
22369 | { | |
22370 | switch (ffelex_token_type (t)) | |
22371 | { | |
22372 | case FFELEX_typeCOMMA: | |
22373 | if (expr == NULL) | |
22374 | break; | |
22375 | if (!ffesta_is_inhibited ()) | |
22376 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22377 | ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims, | |
22378 | ffestb_local_.decl.len, ffestb_local_.decl.lent, expr, ft, | |
22379 | FALSE); | |
22380 | ffelex_token_kill (ffesta_tokens[1]); | |
22381 | if (ffestb_local_.decl.kindt != NULL) | |
22382 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22383 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22384 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22385 | if (ffestb_local_.decl.lent != NULL) | |
22386 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22387 | return (ffelexHandler) ffestb_decl_ents_; | |
22388 | ||
22389 | case FFELEX_typeEOS: | |
22390 | case FFELEX_typeSEMICOLON: | |
22391 | if (!ffesta_is_inhibited ()) | |
22392 | { | |
22393 | ffestc_decl_item (ffesta_tokens[1], ffestb_local_.decl.kind, | |
22394 | ffestb_local_.decl.kindt, ffestb_subrargs_.dim_list.dims, | |
22395 | ffestb_local_.decl.len, ffestb_local_.decl.lent, expr, ft, | |
22396 | FALSE); | |
22397 | ffestc_decl_finish (); | |
22398 | } | |
22399 | ffelex_token_kill (ffesta_tokens[1]); | |
22400 | if (ffestb_local_.decl.kindt != NULL) | |
22401 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22402 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22403 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22404 | if (ffestb_local_.decl.lent != NULL) | |
22405 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22406 | return (ffelexHandler) ffesta_zero (t); | |
22407 | ||
22408 | default: | |
22409 | break; | |
22410 | } | |
22411 | ||
22412 | if (!ffesta_is_inhibited ()) | |
22413 | ffestc_decl_finish (); | |
22414 | ffelex_token_kill (ffesta_tokens[1]); | |
22415 | if (ffestb_local_.decl.kindt != NULL) | |
22416 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22417 | if (ffestb_subrargs_.dim_list.dims != NULL) | |
22418 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
22419 | if (ffestb_local_.decl.lent != NULL) | |
22420 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22421 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22422 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22423 | } | |
22424 | ||
22425 | /* ffestb_decl_ents_9_ -- "type" ... SLASH expr | |
22426 | ||
22427 | (ffestb_decl_ents_9_) // to expression handler | |
22428 | ||
22429 | Handle ASTERISK, COMMA, or SLASH. */ | |
22430 | ||
22431 | static ffelexHandler | |
22432 | ffestb_decl_ents_9_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
22433 | { | |
22434 | switch (ffelex_token_type (t)) | |
22435 | { | |
22436 | case FFELEX_typeCOMMA: | |
22437 | if (expr == NULL) | |
22438 | break; | |
22439 | if (!ffesta_is_inhibited ()) | |
22440 | ffestc_decl_itemvalue (NULL, NULL, expr, ft); | |
22441 | return (ffelexHandler) ffeexpr_rhs | |
22442 | (ffesta_output_pool, FFEEXPR_contextDATA, | |
22443 | (ffeexprCallback) ffestb_decl_ents_9_); | |
22444 | ||
22445 | case FFELEX_typeASTERISK: | |
22446 | if (expr == NULL) | |
22447 | break; | |
22448 | ffestb_local_.decl.expr = expr; | |
22449 | ffesta_tokens[1] = ffelex_token_use (ft); | |
22450 | return (ffelexHandler) ffeexpr_rhs | |
22451 | (ffesta_output_pool, FFEEXPR_contextDATA, | |
22452 | (ffeexprCallback) ffestb_decl_ents_10_); | |
22453 | ||
22454 | case FFELEX_typeSLASH: | |
22455 | if (expr == NULL) | |
22456 | break; | |
22457 | if (!ffesta_is_inhibited ()) | |
22458 | { | |
22459 | ffestc_decl_itemvalue (NULL, NULL, expr, ft); | |
22460 | ffestc_decl_itemendvals (t); | |
22461 | } | |
22462 | return (ffelexHandler) ffestb_decl_ents_11_; | |
22463 | ||
22464 | default: | |
22465 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22466 | break; | |
22467 | } | |
22468 | ||
22469 | if (!ffesta_is_inhibited ()) | |
22470 | { | |
22471 | ffestc_decl_itemendvals (t); | |
22472 | ffestc_decl_finish (); | |
22473 | } | |
22474 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22475 | } | |
22476 | ||
22477 | /* ffestb_decl_ents_10_ -- "type" ... SLASH expr ASTERISK expr | |
22478 | ||
22479 | (ffestb_decl_ents_10_) // to expression handler | |
22480 | ||
22481 | Handle COMMA or SLASH. */ | |
22482 | ||
22483 | static ffelexHandler | |
22484 | ffestb_decl_ents_10_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
22485 | { | |
22486 | switch (ffelex_token_type (t)) | |
22487 | { | |
22488 | case FFELEX_typeCOMMA: | |
22489 | if (expr == NULL) | |
22490 | break; | |
22491 | if (!ffesta_is_inhibited ()) | |
22492 | ffestc_decl_itemvalue (ffestb_local_.decl.expr, ffesta_tokens[1], | |
22493 | expr, ft); | |
22494 | ffelex_token_kill (ffesta_tokens[1]); | |
22495 | return (ffelexHandler) ffeexpr_rhs | |
22496 | (ffesta_output_pool, FFEEXPR_contextDATA, | |
22497 | (ffeexprCallback) ffestb_decl_ents_9_); | |
22498 | ||
22499 | case FFELEX_typeSLASH: | |
22500 | if (expr == NULL) | |
22501 | break; | |
22502 | if (!ffesta_is_inhibited ()) | |
22503 | { | |
22504 | ffestc_decl_itemvalue (ffestb_local_.decl.expr, ffesta_tokens[1], | |
22505 | expr, ft); | |
22506 | ffestc_decl_itemendvals (t); | |
22507 | } | |
22508 | ffelex_token_kill (ffesta_tokens[1]); | |
22509 | return (ffelexHandler) ffestb_decl_ents_11_; | |
22510 | ||
22511 | default: | |
22512 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22513 | break; | |
22514 | } | |
22515 | ||
22516 | if (!ffesta_is_inhibited ()) | |
22517 | { | |
22518 | ffestc_decl_itemendvals (t); | |
22519 | ffestc_decl_finish (); | |
22520 | } | |
22521 | ffelex_token_kill (ffesta_tokens[1]); | |
22522 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22523 | } | |
22524 | ||
22525 | /* ffestb_decl_ents_11_ -- "type" [type parameters] [attributes "::"] NAME | |
22526 | [ASTERISK NUMBER] [OPEN_PAREN dimlist CLOSE_PAREN] | |
22527 | [ASTERISK charlength] SLASH initvals SLASH | |
22528 | ||
22529 | return ffestb_decl_ents_11_; // to lexer | |
22530 | ||
22531 | Handle COMMA or EOS/SEMICOLON. */ | |
22532 | ||
22533 | static ffelexHandler | |
22534 | ffestb_decl_ents_11_ (ffelexToken t) | |
22535 | { | |
22536 | switch (ffelex_token_type (t)) | |
22537 | { | |
22538 | case FFELEX_typeCOMMA: | |
22539 | return (ffelexHandler) ffestb_decl_ents_; | |
22540 | ||
22541 | case FFELEX_typeEOS: | |
22542 | case FFELEX_typeSEMICOLON: | |
22543 | if (!ffesta_is_inhibited ()) | |
22544 | ffestc_decl_finish (); | |
22545 | return (ffelexHandler) ffesta_zero (t); | |
22546 | ||
22547 | default: | |
22548 | break; | |
22549 | } | |
22550 | ||
22551 | if (!ffesta_is_inhibited ()) | |
22552 | ffestc_decl_finish (); | |
22553 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22554 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22555 | } | |
22556 | ||
22557 | /* ffestb_decl_entsp_ -- "type" [type parameters] | |
22558 | ||
22559 | return ffestb_decl_entsp_; // to lexer | |
22560 | ||
22561 | Handle NAME or NAMES beginning either an entity (object) declaration or | |
22562 | a function definition.. */ | |
22563 | ||
22564 | static ffelexHandler | |
22565 | ffestb_decl_entsp_ (ffelexToken t) | |
22566 | { | |
22567 | switch (ffelex_token_type (t)) | |
22568 | { | |
22569 | case FFELEX_typeNAME: | |
22570 | ffesta_confirmed (); | |
22571 | ffesta_tokens[1] = ffelex_token_use (t); | |
22572 | return (ffelexHandler) ffestb_decl_entsp_1_; | |
22573 | ||
22574 | case FFELEX_typeNAMES: | |
22575 | ffesta_confirmed (); | |
22576 | ffesta_tokens[1] = ffelex_token_use (t); | |
22577 | return (ffelexHandler) ffestb_decl_entsp_2_; | |
22578 | ||
22579 | default: | |
22580 | break; | |
22581 | } | |
22582 | ||
22583 | if (ffestb_local_.decl.kindt != NULL) | |
22584 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22585 | if (ffestb_local_.decl.lent != NULL) | |
22586 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22587 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "type-declaration", t); | |
22588 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22589 | } | |
22590 | ||
22591 | /* ffestb_decl_entsp_1_ -- "type" [type parameters] NAME | |
22592 | ||
22593 | return ffestb_decl_entsp_1_; // to lexer | |
22594 | ||
22595 | If we get another NAME token here, then the previous one must be | |
22596 | "RECURSIVE" or "FUNCTION" and we handle it accordingly. Otherwise, | |
22597 | we send the previous and current token through to _ents_. */ | |
22598 | ||
22599 | static ffelexHandler | |
22600 | ffestb_decl_entsp_1_ (ffelexToken t) | |
22601 | { | |
22602 | switch (ffelex_token_type (t)) | |
22603 | { | |
22604 | case FFELEX_typeNAME: | |
22605 | switch (ffestr_first (ffesta_tokens[1])) | |
22606 | { | |
22607 | #if FFESTR_F90 | |
22608 | case FFESTR_firstRECURSIVE: | |
22609 | if (ffestr_first (t) != FFESTR_firstFUNCTION) | |
22610 | { | |
22611 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
22612 | break; | |
22613 | } | |
22614 | ffestb_local_.decl.recursive = ffesta_tokens[1]; | |
22615 | return (ffelexHandler) ffestb_decl_funcname_; | |
22616 | #endif | |
22617 | ||
22618 | case FFESTR_firstFUNCTION: | |
22619 | ffelex_token_kill (ffesta_tokens[1]); | |
22620 | return (ffelexHandler) ffestb_decl_funcname_ (t); | |
22621 | ||
22622 | default: | |
22623 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", ffesta_tokens[1]); | |
22624 | break; | |
22625 | } | |
22626 | break; | |
22627 | ||
22628 | default: | |
22629 | if ((ffelex_token_type (ffesta_tokens[1]) != FFELEX_typeNAMES) | |
22630 | && !ffesta_is_inhibited ()) | |
22631 | ffestc_decl_start (ffestb_local_.decl.type, ffesta_tokens[0], | |
22632 | ffestb_local_.decl.kind, ffestb_local_.decl.kindt, | |
22633 | ffestb_local_.decl.len, ffestb_local_.decl.lent); | |
22634 | if (ffestb_local_.decl.kindt != NULL) | |
22635 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22636 | if (ffestb_local_.decl.lent != NULL) | |
22637 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22638 | /* NAME/NAMES token already in ffesta_tokens[1]. */ | |
22639 | return (ffelexHandler) ffestb_decl_ents_1_ (t); | |
22640 | } | |
22641 | ||
22642 | if (ffestb_local_.decl.kindt != NULL) | |
22643 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22644 | if (ffestb_local_.decl.lent != NULL) | |
22645 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22646 | ffelex_token_kill (ffesta_tokens[1]); | |
22647 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22648 | } | |
22649 | ||
22650 | /* ffestb_decl_entsp_2_ -- "type" [type parameters] NAMES | |
22651 | ||
22652 | return ffestb_decl_entsp_2_; // to lexer | |
22653 | ||
22654 | If we get an ASTERISK or OPEN_PAREN here, then if the previous NAMES | |
22655 | begins with "FUNCTION" or "RECURSIVEFUNCTION" and is followed by a | |
22656 | first-name-char, we have a possible syntactically ambiguous situation. | |
22657 | Otherwise, we have a straightforward situation just as if we went | |
22658 | through _entsp_1_ instead of here. */ | |
22659 | ||
22660 | static ffelexHandler | |
22661 | ffestb_decl_entsp_2_ (ffelexToken t) | |
22662 | { | |
22663 | ffelexToken nt; | |
22664 | bool asterisk_ok; | |
22665 | char *p; | |
22666 | ffeTokenLength i; | |
22667 | ||
22668 | switch (ffelex_token_type (t)) | |
22669 | { | |
22670 | case FFELEX_typeASTERISK: | |
22671 | ffesta_confirmed (); | |
22672 | switch (ffestb_local_.decl.type) | |
22673 | { | |
22674 | case FFESTP_typeINTEGER: | |
22675 | case FFESTP_typeREAL: | |
22676 | case FFESTP_typeCOMPLEX: | |
22677 | case FFESTP_typeLOGICAL: | |
22678 | asterisk_ok = (ffestb_local_.decl.kindt == NULL); | |
22679 | break; | |
22680 | ||
22681 | case FFESTP_typeCHARACTER: | |
22682 | asterisk_ok = (ffestb_local_.decl.lent == NULL); | |
22683 | break; | |
22684 | ||
22685 | case FFESTP_typeBYTE: | |
22686 | case FFESTP_typeWORD: | |
22687 | default: | |
22688 | asterisk_ok = FALSE; | |
22689 | break; | |
22690 | } | |
22691 | switch (ffestr_first (ffesta_tokens[1])) | |
22692 | { | |
22693 | #if FFESTR_F90 | |
22694 | case FFESTR_firstRECURSIVEFNCTN: | |
22695 | if (!asterisk_ok) | |
22696 | break; /* For our own convenience, treat as non-FN | |
22697 | stmt. */ | |
22698 | p = ffelex_token_text (ffesta_tokens[1]) | |
22699 | + (i = FFESTR_firstlRECURSIVEFNCTN); | |
22700 | if (!ffesrc_is_name_init (*p)) | |
22701 | break; | |
22702 | ffestb_local_.decl.recursive | |
22703 | = ffelex_token_name_from_names (ffesta_tokens[1], 0, | |
22704 | FFESTR_firstlRECURSIVEFNCTN); | |
22705 | ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1], | |
22706 | FFESTR_firstlRECURSIVEFNCTN, 0); | |
22707 | return (ffelexHandler) ffestb_decl_entsp_3_; | |
22708 | #endif | |
22709 | ||
22710 | case FFESTR_firstFUNCTION: | |
22711 | if (!asterisk_ok) | |
22712 | break; /* For our own convenience, treat as non-FN | |
22713 | stmt. */ | |
22714 | p = ffelex_token_text (ffesta_tokens[1]) | |
22715 | + (i = FFESTR_firstlFUNCTION); | |
22716 | if (!ffesrc_is_name_init (*p)) | |
22717 | break; | |
22718 | ffestb_local_.decl.recursive = NULL; | |
22719 | ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1], | |
22720 | FFESTR_firstlFUNCTION, 0); | |
22721 | return (ffelexHandler) ffestb_decl_entsp_3_; | |
22722 | ||
22723 | default: | |
22724 | break; | |
22725 | } | |
22726 | break; | |
22727 | ||
22728 | case FFELEX_typeOPEN_PAREN: | |
22729 | ffestb_local_.decl.aster_after = FALSE; | |
22730 | switch (ffestr_first (ffesta_tokens[1])) | |
22731 | { | |
22732 | #if FFESTR_F90 | |
22733 | case FFESTR_firstRECURSIVEFNCTN: | |
22734 | p = ffelex_token_text (ffesta_tokens[1]) | |
22735 | + (i = FFESTR_firstlRECURSIVEFNCTN); | |
22736 | if (!ffesrc_is_name_init (*p)) | |
22737 | break; | |
22738 | ffestb_local_.decl.recursive | |
22739 | = ffelex_token_name_from_names (ffesta_tokens[1], 0, | |
22740 | FFESTR_firstlRECURSIVEFNCTN); | |
22741 | ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1], | |
22742 | FFESTR_firstlRECURSIVEFNCTN, 0); | |
22743 | return (ffelexHandler) ffestb_decl_entsp_5_ (t); | |
22744 | #endif | |
22745 | ||
22746 | case FFESTR_firstFUNCTION: | |
22747 | p = ffelex_token_text (ffesta_tokens[1]) | |
22748 | + (i = FFESTR_firstlFUNCTION); | |
22749 | if (!ffesrc_is_name_init (*p)) | |
22750 | break; | |
22751 | ffestb_local_.decl.recursive = NULL; | |
22752 | ffesta_tokens[2] = ffelex_token_name_from_names (ffesta_tokens[1], | |
22753 | FFESTR_firstlFUNCTION, 0); | |
22754 | return (ffelexHandler) ffestb_decl_entsp_5_ (t); | |
22755 | ||
22756 | default: | |
22757 | break; | |
22758 | } | |
22759 | if ((ffestb_local_.decl.kindt != NULL) | |
22760 | || (ffestb_local_.decl.lent != NULL)) | |
22761 | break; /* Have kind/len type param, definitely not | |
22762 | assignment stmt. */ | |
22763 | return (ffelexHandler) ffestb_decl_entsp_1_ (t); | |
22764 | ||
22765 | default: | |
22766 | break; | |
22767 | } | |
22768 | ||
22769 | nt = ffelex_token_name_from_names (ffesta_tokens[1], 0, 0); | |
22770 | ffelex_token_kill (ffesta_tokens[1]); | |
22771 | ffesta_tokens[1] = nt; /* Change NAMES to NAME. */ | |
22772 | return (ffelexHandler) ffestb_decl_entsp_1_ (t); | |
22773 | } | |
22774 | ||
22775 | /* ffestb_decl_entsp_3_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
22776 | NAME ASTERISK | |
22777 | ||
22778 | return ffestb_decl_entsp_3_; // to lexer | |
22779 | ||
22780 | Handle NUMBER or OPEN_PAREN. */ | |
22781 | ||
22782 | static ffelexHandler | |
22783 | ffestb_decl_entsp_3_ (ffelexToken t) | |
22784 | { | |
22785 | ffestb_local_.decl.aster_after = TRUE; | |
22786 | ||
22787 | switch (ffelex_token_type (t)) | |
22788 | { | |
22789 | case FFELEX_typeNUMBER: | |
22790 | switch (ffestb_local_.decl.type) | |
22791 | { | |
22792 | case FFESTP_typeINTEGER: | |
22793 | case FFESTP_typeREAL: | |
22794 | case FFESTP_typeCOMPLEX: | |
22795 | case FFESTP_typeLOGICAL: | |
22796 | ffestb_local_.decl.kindt = ffelex_token_use (t); | |
22797 | break; | |
22798 | ||
22799 | case FFESTP_typeCHARACTER: | |
22800 | ffestb_local_.decl.lent = ffelex_token_use (t); | |
22801 | break; | |
22802 | ||
22803 | case FFESTP_typeBYTE: | |
22804 | case FFESTP_typeWORD: | |
22805 | default: | |
22806 | assert (FALSE); | |
22807 | } | |
22808 | return (ffelexHandler) ffestb_decl_entsp_5_; | |
22809 | ||
22810 | case FFELEX_typeOPEN_PAREN: | |
22811 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
22812 | FFEEXPR_contextCHARACTERSIZE, | |
22813 | (ffeexprCallback) ffestb_decl_entsp_4_); | |
22814 | ||
22815 | default: | |
22816 | break; | |
22817 | } | |
22818 | ||
22819 | if (ffestb_local_.decl.recursive != NULL) | |
22820 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
22821 | if (ffestb_local_.decl.kindt != NULL) | |
22822 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22823 | if (ffestb_local_.decl.lent != NULL) | |
22824 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22825 | ffelex_token_kill (ffesta_tokens[1]); | |
22826 | ffelex_token_kill (ffesta_tokens[2]); | |
22827 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
22828 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22829 | } | |
22830 | ||
22831 | /* ffestb_decl_entsp_4_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
22832 | NAME ASTERISK OPEN_PAREN expr | |
22833 | ||
22834 | (ffestb_decl_entsp_4_) // to expression handler | |
22835 | ||
22836 | Allow only CLOSE_PAREN; and deal with character-length expression. */ | |
22837 | ||
22838 | static ffelexHandler | |
22839 | ffestb_decl_entsp_4_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
22840 | { | |
22841 | switch (ffelex_token_type (t)) | |
22842 | { | |
22843 | case FFELEX_typeCLOSE_PAREN: | |
22844 | if (expr == NULL) | |
22845 | break; | |
22846 | switch (ffestb_local_.decl.type) | |
22847 | { | |
22848 | case FFESTP_typeCHARACTER: | |
22849 | ffestb_local_.decl.len = expr; | |
22850 | ffestb_local_.decl.lent = ffelex_token_use (ft); | |
22851 | break; | |
22852 | ||
22853 | default: | |
22854 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
22855 | break; | |
22856 | } | |
22857 | return (ffelexHandler) ffestb_decl_entsp_5_; | |
22858 | ||
22859 | default: | |
22860 | break; | |
22861 | } | |
22862 | ||
22863 | if (ffestb_local_.decl.recursive != NULL) | |
22864 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
22865 | if (ffestb_local_.decl.kindt != NULL) | |
22866 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
22867 | if (ffestb_local_.decl.lent != NULL) | |
22868 | ffelex_token_kill (ffestb_local_.decl.lent); | |
22869 | ffelex_token_kill (ffesta_tokens[1]); | |
22870 | ffelex_token_kill (ffesta_tokens[2]); | |
22871 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
22872 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
22873 | } | |
22874 | ||
22875 | /* ffestb_decl_entsp_5_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
22876 | NAME [type parameter] | |
22877 | ||
22878 | return ffestb_decl_entsp_5_; // to lexer | |
22879 | ||
22880 | Make sure the next token is an OPEN_PAREN. Get the arg list or dimension | |
22881 | list. If it can't be an arg list, or if the CLOSE_PAREN is followed by | |
22882 | something other than EOS/SEMICOLON or NAME, then treat as dimension list | |
22883 | and handle statement as an R426/R501. If it can't be a dimension list, or | |
22884 | if the CLOSE_PAREN is followed by NAME, treat as an arg list and handle | |
22885 | statement as an R1219. If it can be either an arg list or a dimension | |
22886 | list and if the CLOSE_PAREN is followed by EOS/SEMICOLON, ask FFESTC | |
22887 | whether to treat the statement as an R426/R501 or an R1219 and act | |
22888 | accordingly. */ | |
22889 | ||
22890 | static ffelexHandler | |
22891 | ffestb_decl_entsp_5_ (ffelexToken t) | |
22892 | { | |
22893 | switch (ffelex_token_type (t)) | |
22894 | { | |
22895 | case FFELEX_typeOPEN_PAREN: | |
22896 | if (ffestb_local_.decl.aster_after && (ffestb_local_.decl.len != NULL)) | |
22897 | { /* "CHARACTER[RECURSIVE]FUNCTIONxyz*(len-expr) | |
22898 | (..." must be a function-stmt, since the | |
22899 | (len-expr) cannot precede (array-spec) in | |
22900 | an object declaration but can precede | |
22901 | (name-list) in a function stmt. */ | |
22902 | ffelex_token_kill (ffesta_tokens[1]); | |
22903 | ffesta_tokens[1] = ffesta_tokens[2]; | |
22904 | return (ffelexHandler) ffestb_decl_funcname_4_ (t); | |
22905 | } | |
22906 | ffestb_local_.decl.toklist = ffestt_tokenlist_create (); | |
22907 | ffestb_local_.decl.empty = TRUE; | |
22908 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
22909 | return (ffelexHandler) ffestb_decl_entsp_6_; | |
22910 | ||
22911 | default: | |
22912 | break; | |
22913 | } | |
22914 | ||
22915 | assert (ffestb_local_.decl.aster_after); | |
22916 | ffesta_confirmed (); /* We've seen an ASTERISK, so even EQUALS | |
22917 | confirmed. */ | |
22918 | ffestb_subr_ambig_to_ents_ (); | |
22919 | ffestb_subrargs_.dim_list.dims = NULL; | |
22920 | return (ffelexHandler) ffestb_decl_ents_7_ (t); | |
22921 | } | |
22922 | ||
22923 | /* ffestb_decl_entsp_6_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
22924 | NAME [type parameter] OPEN_PAREN | |
22925 | ||
22926 | return ffestb_decl_entsp_6_; // to lexer | |
22927 | ||
22928 | If CLOSE_PAREN, we definitely have an R1219 function-stmt, since | |
22929 | the notation "name()" is invalid for a declaration. */ | |
22930 | ||
22931 | static ffelexHandler | |
22932 | ffestb_decl_entsp_6_ (ffelexToken t) | |
22933 | { | |
22934 | ffelexHandler next; | |
22935 | ||
22936 | switch (ffelex_token_type (t)) | |
22937 | { | |
22938 | case FFELEX_typeCLOSE_PAREN: | |
22939 | if (!ffestb_local_.decl.empty) | |
22940 | { /* Trailing comma, just a warning for | |
22941 | stmt func def, so allow ambiguity. */ | |
22942 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, | |
22943 | ffelex_token_use (t)); | |
22944 | return (ffelexHandler) ffestb_decl_entsp_8_; | |
22945 | } | |
22946 | ffelex_token_kill (ffesta_tokens[1]); | |
22947 | ffesta_tokens[1] = ffesta_tokens[2]; | |
22948 | next = (ffelexHandler) ffestt_tokenlist_handle | |
22949 | (ffestb_local_.decl.toklist, (ffelexHandler) ffestb_decl_funcname_4_); | |
22950 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
22951 | return (ffelexHandler) (*next) (t); | |
22952 | ||
22953 | case FFELEX_typeNAME: | |
22954 | ffestb_local_.decl.empty = FALSE; | |
22955 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
22956 | return (ffelexHandler) ffestb_decl_entsp_7_; | |
22957 | ||
22958 | case FFELEX_typeEQUALS: | |
22959 | case FFELEX_typePOINTS: | |
22960 | case FFELEX_typePERCENT: | |
22961 | case FFELEX_typePERIOD: | |
22962 | case FFELEX_typeOPEN_PAREN: | |
22963 | if ((ffestb_local_.decl.kindt != NULL) | |
22964 | || (ffestb_local_.decl.lent != NULL)) | |
22965 | break; /* type(params)name or type*val name, either | |
22966 | way confirmed. */ | |
22967 | return (ffelexHandler) ffestb_subr_ambig_nope_ (t); | |
22968 | ||
22969 | default: | |
22970 | break; | |
22971 | } | |
22972 | ||
22973 | ffesta_confirmed (); | |
22974 | ffestb_subr_ambig_to_ents_ (); | |
22975 | next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist, | |
22976 | (ffelexHandler) ffestb_decl_ents_3_); | |
22977 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
22978 | return (ffelexHandler) (*next) (t); | |
22979 | } | |
22980 | ||
22981 | /* ffestb_decl_entsp_7_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
22982 | NAME [type parameter] OPEN_PAREN NAME | |
22983 | ||
22984 | return ffestb_decl_entsp_7_; // to lexer | |
22985 | ||
22986 | Expect COMMA or CLOSE_PAREN to remain ambiguous, else not an R1219 | |
22987 | function-stmt. */ | |
22988 | ||
22989 | static ffelexHandler | |
22990 | ffestb_decl_entsp_7_ (ffelexToken t) | |
22991 | { | |
22992 | ffelexHandler next; | |
22993 | ||
22994 | switch (ffelex_token_type (t)) | |
22995 | { | |
22996 | case FFELEX_typeCLOSE_PAREN: | |
22997 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
22998 | return (ffelexHandler) ffestb_decl_entsp_8_; | |
22999 | ||
23000 | case FFELEX_typeCOMMA: | |
23001 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
23002 | return (ffelexHandler) ffestb_decl_entsp_6_; | |
23003 | ||
23004 | case FFELEX_typeEQUALS: | |
23005 | case FFELEX_typePOINTS: | |
23006 | case FFELEX_typePERCENT: | |
23007 | case FFELEX_typePERIOD: | |
23008 | case FFELEX_typeOPEN_PAREN: | |
23009 | if ((ffestb_local_.decl.kindt != NULL) | |
23010 | || (ffestb_local_.decl.lent != NULL)) | |
23011 | break; /* type(params)name or type*val name, either | |
23012 | way confirmed. */ | |
23013 | return (ffelexHandler) ffestb_subr_ambig_nope_ (t); | |
23014 | ||
23015 | default: | |
23016 | break; | |
23017 | } | |
23018 | ||
23019 | ffesta_confirmed (); | |
23020 | ffestb_subr_ambig_to_ents_ (); | |
23021 | next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist, | |
23022 | (ffelexHandler) ffestb_decl_ents_3_); | |
23023 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
23024 | return (ffelexHandler) (*next) (t); | |
23025 | } | |
23026 | ||
23027 | /* ffestb_decl_entsp_8_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23028 | NAME [type parameter] OPEN_PAREN name-list | |
23029 | CLOSE_PAREN | |
23030 | ||
23031 | return ffestb_decl_entsp_8_; // to lexer | |
23032 | ||
23033 | If EOS/SEMICOLON, situation remains ambiguous, ask FFESTC to resolve | |
23034 | it. If NAME (must be "RESULT", but that is checked later on), | |
23035 | definitely an R1219 function-stmt. Anything else, handle as entity decl. */ | |
23036 | ||
23037 | static ffelexHandler | |
23038 | ffestb_decl_entsp_8_ (ffelexToken t) | |
23039 | { | |
23040 | ffelexHandler next; | |
23041 | ||
23042 | switch (ffelex_token_type (t)) | |
23043 | { | |
23044 | case FFELEX_typeEOS: | |
23045 | case FFELEX_typeSEMICOLON: | |
23046 | ffesta_confirmed (); | |
23047 | if (ffestc_is_decl_not_R1219 ()) | |
23048 | break; | |
23049 | /* Fall through. */ | |
23050 | case FFELEX_typeNAME: | |
23051 | ffesta_confirmed (); | |
23052 | ffelex_token_kill (ffesta_tokens[1]); | |
23053 | ffesta_tokens[1] = ffesta_tokens[2]; | |
23054 | next = (ffelexHandler) ffestt_tokenlist_handle | |
23055 | (ffestb_local_.decl.toklist, (ffelexHandler) ffestb_decl_funcname_4_); | |
23056 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
23057 | return (ffelexHandler) (*next) (t); | |
23058 | ||
23059 | case FFELEX_typeEQUALS: | |
23060 | case FFELEX_typePOINTS: | |
23061 | case FFELEX_typePERCENT: | |
23062 | case FFELEX_typePERIOD: | |
23063 | case FFELEX_typeOPEN_PAREN: | |
23064 | if ((ffestb_local_.decl.kindt != NULL) | |
23065 | || (ffestb_local_.decl.lent != NULL)) | |
23066 | break; /* type(params)name or type*val name, either | |
23067 | way confirmed. */ | |
23068 | return (ffelexHandler) ffestb_subr_ambig_nope_ (t); | |
23069 | ||
23070 | default: | |
23071 | break; | |
23072 | } | |
23073 | ||
23074 | ffesta_confirmed (); | |
23075 | ffestb_subr_ambig_to_ents_ (); | |
23076 | next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist, | |
23077 | (ffelexHandler) ffestb_decl_ents_3_); | |
23078 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
23079 | return (ffelexHandler) (*next) (t); | |
23080 | } | |
23081 | ||
23082 | /* ffestb_decl_func_ -- ["type" [type parameters]] RECURSIVE | |
23083 | ||
23084 | return ffestb_decl_func_; // to lexer | |
23085 | ||
23086 | Handle "FUNCTION". */ | |
23087 | ||
23088 | #if FFESTR_F90 | |
23089 | static ffelexHandler | |
23090 | ffestb_decl_func_ (ffelexToken t) | |
23091 | { | |
23092 | char *p; | |
23093 | ffeTokenLength i; | |
23094 | ||
23095 | ffelex_set_names (FALSE); | |
23096 | ||
23097 | switch (ffelex_token_type (t)) | |
23098 | { | |
23099 | case FFELEX_typeNAME: | |
23100 | if (ffestr_first (t) != FFESTR_firstFUNCTION) | |
23101 | break; | |
23102 | return (ffelexHandler) ffestb_decl_funcname_; | |
23103 | ||
23104 | case FFELEX_typeNAMES: | |
23105 | ffesta_confirmed (); | |
23106 | if (ffestr_first (t) != FFESTR_firstFUNCTION) | |
23107 | break; | |
23108 | p = ffelex_token_text (t) + (i = FFESTR_firstlFUNCTION); | |
23109 | if (*p == '\0') | |
23110 | break; | |
23111 | if (!ffesrc_is_name_init (*p)) | |
23112 | goto bad_i; /* :::::::::::::::::::: */ | |
23113 | ffesta_tokens[1] = ffelex_token_name_from_names (t, i, 0); | |
23114 | return (ffelexHandler) ffestb_decl_funcname_1_; | |
23115 | ||
23116 | default: | |
23117 | break; | |
23118 | } | |
23119 | ||
23120 | if (ffestb_local_.decl.recursive != NULL) | |
23121 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23122 | if (ffestb_local_.decl.kindt != NULL) | |
23123 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23124 | if (ffestb_local_.decl.lent != NULL) | |
23125 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23126 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23127 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23128 | ||
23129 | bad_i: /* :::::::::::::::::::: */ | |
23130 | if (ffestb_local_.decl.recursive != NULL) | |
23131 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23132 | if (ffestb_local_.decl.kindt != NULL) | |
23133 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23134 | if (ffestb_local_.decl.lent != NULL) | |
23135 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23136 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t, i, NULL); | |
23137 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23138 | } | |
23139 | ||
23140 | #endif | |
23141 | /* ffestb_decl_funcname_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23142 | ||
23143 | return ffestb_decl_funcname_; // to lexer | |
23144 | ||
23145 | Handle NAME of a function. */ | |
23146 | ||
23147 | static ffelexHandler | |
23148 | ffestb_decl_funcname_ (ffelexToken t) | |
23149 | { | |
23150 | switch (ffelex_token_type (t)) | |
23151 | { | |
23152 | case FFELEX_typeNAME: | |
23153 | ffesta_tokens[1] = ffelex_token_use (t); | |
23154 | return (ffelexHandler) ffestb_decl_funcname_1_; | |
23155 | ||
23156 | default: | |
23157 | break; | |
23158 | } | |
23159 | ||
23160 | if (ffestb_local_.decl.recursive != NULL) | |
23161 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23162 | if (ffestb_local_.decl.kindt != NULL) | |
23163 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23164 | if (ffestb_local_.decl.lent != NULL) | |
23165 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23166 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23167 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23168 | } | |
23169 | ||
23170 | /* ffestb_decl_funcname_1_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23171 | NAME | |
23172 | ||
23173 | return ffestb_decl_funcname_1_; // to lexer | |
23174 | ||
23175 | Handle ASTERISK or OPEN_PAREN. */ | |
23176 | ||
23177 | static ffelexHandler | |
23178 | ffestb_decl_funcname_1_ (ffelexToken t) | |
23179 | { | |
23180 | switch (ffelex_token_type (t)) | |
23181 | { | |
23182 | case FFELEX_typeASTERISK: | |
23183 | return (ffelexHandler) ffestb_decl_funcname_2_; | |
23184 | ||
23185 | case FFELEX_typeOPEN_PAREN: | |
23186 | return (ffelexHandler) ffestb_decl_funcname_4_ (t); | |
23187 | ||
23188 | default: | |
23189 | break; | |
23190 | } | |
23191 | ||
23192 | if (ffestb_local_.decl.recursive != NULL) | |
23193 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23194 | if (ffestb_local_.decl.kindt != NULL) | |
23195 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23196 | if (ffestb_local_.decl.lent != NULL) | |
23197 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23198 | ffelex_token_kill (ffesta_tokens[1]); | |
23199 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23200 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23201 | } | |
23202 | ||
23203 | /* ffestb_decl_funcname_2_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23204 | NAME ASTERISK | |
23205 | ||
23206 | return ffestb_decl_funcname_2_; // to lexer | |
23207 | ||
23208 | Handle NUMBER or OPEN_PAREN. */ | |
23209 | ||
23210 | static ffelexHandler | |
23211 | ffestb_decl_funcname_2_ (ffelexToken t) | |
23212 | { | |
23213 | switch (ffelex_token_type (t)) | |
23214 | { | |
23215 | case FFELEX_typeNUMBER: | |
23216 | switch (ffestb_local_.decl.type) | |
23217 | { | |
23218 | case FFESTP_typeINTEGER: | |
23219 | case FFESTP_typeREAL: | |
23220 | case FFESTP_typeCOMPLEX: | |
23221 | case FFESTP_typeLOGICAL: | |
23222 | if (ffestb_local_.decl.kindt == NULL) | |
23223 | ffestb_local_.decl.kindt = ffelex_token_use (t); | |
23224 | else | |
23225 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23226 | break; | |
23227 | ||
23228 | case FFESTP_typeCHARACTER: | |
23229 | if (ffestb_local_.decl.lent == NULL) | |
23230 | ffestb_local_.decl.lent = ffelex_token_use (t); | |
23231 | else | |
23232 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23233 | break; | |
23234 | ||
23235 | case FFESTP_typeBYTE: | |
23236 | case FFESTP_typeWORD: | |
23237 | default: | |
23238 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23239 | break; | |
23240 | } | |
23241 | return (ffelexHandler) ffestb_decl_funcname_4_; | |
23242 | ||
23243 | case FFELEX_typeOPEN_PAREN: | |
23244 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
23245 | FFEEXPR_contextCHARACTERSIZE, | |
23246 | (ffeexprCallback) ffestb_decl_funcname_3_); | |
23247 | ||
23248 | default: | |
23249 | break; | |
23250 | } | |
23251 | ||
23252 | if (ffestb_local_.decl.recursive != NULL) | |
23253 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23254 | if (ffestb_local_.decl.kindt != NULL) | |
23255 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23256 | if (ffestb_local_.decl.lent != NULL) | |
23257 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23258 | ffelex_token_kill (ffesta_tokens[1]); | |
23259 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23260 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23261 | } | |
23262 | ||
23263 | /* ffestb_decl_funcname_3_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23264 | NAME ASTERISK OPEN_PAREN expr | |
23265 | ||
23266 | (ffestb_decl_funcname_3_) // to expression handler | |
23267 | ||
23268 | Allow only CLOSE_PAREN; and deal with character-length expression. */ | |
23269 | ||
23270 | static ffelexHandler | |
23271 | ffestb_decl_funcname_3_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
23272 | { | |
23273 | switch (ffelex_token_type (t)) | |
23274 | { | |
23275 | case FFELEX_typeCLOSE_PAREN: | |
23276 | if (expr == NULL) | |
23277 | break; | |
23278 | switch (ffestb_local_.decl.type) | |
23279 | { | |
23280 | case FFESTP_typeCHARACTER: | |
23281 | if (ffestb_local_.decl.lent == NULL) | |
23282 | { | |
23283 | ffestb_local_.decl.len = expr; | |
23284 | ffestb_local_.decl.lent = ffelex_token_use (ft); | |
23285 | } | |
23286 | else | |
23287 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23288 | break; | |
23289 | ||
23290 | default: | |
23291 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23292 | break; | |
23293 | } | |
23294 | return (ffelexHandler) ffestb_decl_funcname_4_; | |
23295 | ||
23296 | default: | |
23297 | break; | |
23298 | } | |
23299 | ||
23300 | if (ffestb_local_.decl.recursive != NULL) | |
23301 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23302 | if (ffestb_local_.decl.kindt != NULL) | |
23303 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23304 | if (ffestb_local_.decl.lent != NULL) | |
23305 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23306 | ffelex_token_kill (ffesta_tokens[1]); | |
23307 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23308 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23309 | } | |
23310 | ||
23311 | /* ffestb_decl_funcname_4_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23312 | NAME [type parameter] | |
23313 | ||
23314 | return ffestb_decl_funcname_4_; // to lexer | |
23315 | ||
23316 | Make sure the next token is an OPEN_PAREN. Get the arg list and | |
23317 | then implement. */ | |
23318 | ||
23319 | static ffelexHandler | |
23320 | ffestb_decl_funcname_4_ (ffelexToken t) | |
23321 | { | |
23322 | switch (ffelex_token_type (t)) | |
23323 | { | |
23324 | case FFELEX_typeOPEN_PAREN: | |
23325 | ffestb_subrargs_.name_list.args = ffestt_tokenlist_create (); | |
23326 | ffestb_subrargs_.name_list.handler | |
23327 | = (ffelexHandler) ffestb_decl_funcname_5_; | |
23328 | ffestb_subrargs_.name_list.is_subr = FALSE; | |
23329 | ffestb_subrargs_.name_list.names = FALSE; | |
23330 | return (ffelexHandler) ffestb_subr_name_list_; | |
23331 | ||
23332 | default: | |
23333 | break; | |
23334 | } | |
23335 | ||
23336 | if (ffestb_local_.decl.recursive != NULL) | |
23337 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23338 | if (ffestb_local_.decl.kindt != NULL) | |
23339 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23340 | if (ffestb_local_.decl.lent != NULL) | |
23341 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23342 | ffelex_token_kill (ffesta_tokens[1]); | |
23343 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23344 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23345 | } | |
23346 | ||
23347 | /* ffestb_decl_funcname_5_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23348 | NAME [type parameter] OPEN_PAREN arg-list | |
23349 | CLOSE_PAREN | |
23350 | ||
23351 | return ffestb_decl_funcname_5_; // to lexer | |
23352 | ||
23353 | Must have EOS/SEMICOLON or "RESULT" here. */ | |
23354 | ||
23355 | static ffelexHandler | |
23356 | ffestb_decl_funcname_5_ (ffelexToken t) | |
23357 | { | |
23358 | if (!ffestb_subrargs_.name_list.ok) | |
23359 | goto bad; /* :::::::::::::::::::: */ | |
23360 | ||
23361 | switch (ffelex_token_type (t)) | |
23362 | { | |
23363 | case FFELEX_typeEOS: | |
23364 | case FFELEX_typeSEMICOLON: | |
23365 | ffesta_confirmed (); | |
23366 | if (!ffesta_is_inhibited ()) | |
23367 | ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args, | |
23368 | ffestb_subrargs_.name_list.close_paren, ffestb_local_.decl.type, | |
23369 | ffestb_local_.decl.kind, ffestb_local_.decl.kindt, | |
23370 | ffestb_local_.decl.len, ffestb_local_.decl.lent, | |
23371 | ffestb_local_.decl.recursive, NULL); | |
23372 | if (ffestb_local_.decl.recursive != NULL) | |
23373 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23374 | if (ffestb_local_.decl.kindt != NULL) | |
23375 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23376 | if (ffestb_local_.decl.lent != NULL) | |
23377 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23378 | ffelex_token_kill (ffesta_tokens[1]); | |
23379 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
23380 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
23381 | return (ffelexHandler) ffesta_zero (t); | |
23382 | ||
23383 | case FFELEX_typeNAME: | |
23384 | if (ffestr_other (t) != FFESTR_otherRESULT) | |
23385 | break; | |
23386 | return (ffelexHandler) ffestb_decl_funcname_6_; | |
23387 | ||
23388 | default: | |
23389 | break; | |
23390 | } | |
23391 | ||
23392 | bad: /* :::::::::::::::::::: */ | |
23393 | if (ffestb_local_.decl.recursive != NULL) | |
23394 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23395 | if (ffestb_local_.decl.kindt != NULL) | |
23396 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23397 | if (ffestb_local_.decl.lent != NULL) | |
23398 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23399 | ffelex_token_kill (ffesta_tokens[1]); | |
23400 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
23401 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
23402 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23403 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23404 | } | |
23405 | ||
23406 | /* ffestb_decl_funcname_6_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23407 | NAME [type parameter] OPEN_PAREN arglist | |
23408 | CLOSE_PAREN "RESULT" | |
23409 | ||
23410 | return ffestb_decl_funcname_6_; // to lexer | |
23411 | ||
23412 | Make sure the next token is an OPEN_PAREN. */ | |
23413 | ||
23414 | static ffelexHandler | |
23415 | ffestb_decl_funcname_6_ (ffelexToken t) | |
23416 | { | |
23417 | switch (ffelex_token_type (t)) | |
23418 | { | |
23419 | case FFELEX_typeOPEN_PAREN: | |
23420 | return (ffelexHandler) ffestb_decl_funcname_7_; | |
23421 | ||
23422 | default: | |
23423 | break; | |
23424 | } | |
23425 | ||
23426 | if (ffestb_local_.decl.recursive != NULL) | |
23427 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23428 | if (ffestb_local_.decl.kindt != NULL) | |
23429 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23430 | if (ffestb_local_.decl.lent != NULL) | |
23431 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23432 | ffelex_token_kill (ffesta_tokens[1]); | |
23433 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
23434 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
23435 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23436 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23437 | } | |
23438 | ||
23439 | /* ffestb_decl_funcname_7_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23440 | NAME [type parameter] OPEN_PAREN arglist | |
23441 | CLOSE_PAREN "RESULT" OPEN_PAREN | |
23442 | ||
23443 | return ffestb_decl_funcname_7_; // to lexer | |
23444 | ||
23445 | Make sure the next token is a NAME. */ | |
23446 | ||
23447 | static ffelexHandler | |
23448 | ffestb_decl_funcname_7_ (ffelexToken t) | |
23449 | { | |
23450 | switch (ffelex_token_type (t)) | |
23451 | { | |
23452 | case FFELEX_typeNAME: | |
23453 | ffesta_tokens[2] = ffelex_token_use (t); | |
23454 | return (ffelexHandler) ffestb_decl_funcname_8_; | |
23455 | ||
23456 | default: | |
23457 | break; | |
23458 | } | |
23459 | ||
23460 | if (ffestb_local_.decl.recursive != NULL) | |
23461 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23462 | if (ffestb_local_.decl.kindt != NULL) | |
23463 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23464 | if (ffestb_local_.decl.lent != NULL) | |
23465 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23466 | ffelex_token_kill (ffesta_tokens[1]); | |
23467 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
23468 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
23469 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23470 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23471 | } | |
23472 | ||
23473 | /* ffestb_decl_funcname_8_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23474 | NAME [type parameter] OPEN_PAREN arglist | |
23475 | CLOSE_PAREN "RESULT" OPEN_PAREN NAME | |
23476 | ||
23477 | return ffestb_decl_funcname_8_; // to lexer | |
23478 | ||
23479 | Make sure the next token is a CLOSE_PAREN. */ | |
23480 | ||
23481 | static ffelexHandler | |
23482 | ffestb_decl_funcname_8_ (ffelexToken t) | |
23483 | { | |
23484 | switch (ffelex_token_type (t)) | |
23485 | { | |
23486 | case FFELEX_typeCLOSE_PAREN: | |
23487 | return (ffelexHandler) ffestb_decl_funcname_9_; | |
23488 | ||
23489 | default: | |
23490 | break; | |
23491 | } | |
23492 | ||
23493 | if (ffestb_local_.decl.recursive != NULL) | |
23494 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23495 | if (ffestb_local_.decl.kindt != NULL) | |
23496 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23497 | if (ffestb_local_.decl.lent != NULL) | |
23498 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23499 | ffelex_token_kill (ffesta_tokens[1]); | |
23500 | ffelex_token_kill (ffesta_tokens[2]); | |
23501 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
23502 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
23503 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23504 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23505 | } | |
23506 | ||
23507 | /* ffestb_decl_funcname_9_ -- "type" [type parameters] [RECURSIVE] FUNCTION | |
23508 | NAME [type parameter] OPEN_PAREN arg-list | |
23509 | CLOSE_PAREN "RESULT" OPEN_PAREN NAME CLOSE_PAREN | |
23510 | ||
23511 | return ffestb_decl_funcname_9_; // to lexer | |
23512 | ||
23513 | Must have EOS/SEMICOLON here. */ | |
23514 | ||
23515 | static ffelexHandler | |
23516 | ffestb_decl_funcname_9_ (ffelexToken t) | |
23517 | { | |
23518 | switch (ffelex_token_type (t)) | |
23519 | { | |
23520 | case FFELEX_typeEOS: | |
23521 | case FFELEX_typeSEMICOLON: | |
23522 | if (!ffesta_is_inhibited ()) | |
23523 | ffestc_R1219 (ffesta_tokens[1], ffestb_subrargs_.name_list.args, | |
23524 | ffestb_subrargs_.name_list.close_paren, ffestb_local_.decl.type, | |
23525 | ffestb_local_.decl.kind, ffestb_local_.decl.kindt, | |
23526 | ffestb_local_.decl.len, ffestb_local_.decl.lent, | |
23527 | ffestb_local_.decl.recursive, ffesta_tokens[2]); | |
23528 | if (ffestb_local_.decl.recursive != NULL) | |
23529 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23530 | if (ffestb_local_.decl.kindt != NULL) | |
23531 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23532 | if (ffestb_local_.decl.lent != NULL) | |
23533 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23534 | ffelex_token_kill (ffesta_tokens[1]); | |
23535 | ffelex_token_kill (ffesta_tokens[2]); | |
23536 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
23537 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
23538 | return (ffelexHandler) ffesta_zero (t); | |
23539 | ||
23540 | default: | |
23541 | break; | |
23542 | } | |
23543 | ||
23544 | if (ffestb_local_.decl.recursive != NULL) | |
23545 | ffelex_token_kill (ffestb_local_.decl.recursive); | |
23546 | if (ffestb_local_.decl.kindt != NULL) | |
23547 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
23548 | if (ffestb_local_.decl.lent != NULL) | |
23549 | ffelex_token_kill (ffestb_local_.decl.lent); | |
23550 | ffelex_token_kill (ffesta_tokens[1]); | |
23551 | ffelex_token_kill (ffesta_tokens[2]); | |
23552 | ffelex_token_kill (ffestb_subrargs_.name_list.close_paren); | |
23553 | ffestt_tokenlist_kill (ffestb_subrargs_.name_list.args); | |
23554 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "FUNCTION", t); | |
23555 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23556 | } | |
23557 | ||
23558 | /* ffestb_V003 -- Parse the STRUCTURE statement | |
23559 | ||
23560 | return ffestb_V003; // to lexer | |
23561 | ||
23562 | Make sure the statement has a valid form for the STRUCTURE statement. | |
23563 | If it does, implement the statement. */ | |
23564 | ||
23565 | #if FFESTR_VXT | |
23566 | ffelexHandler | |
23567 | ffestb_V003 (ffelexToken t) | |
23568 | { | |
23569 | ffeTokenLength i; | |
23570 | char *p; | |
23571 | ffelexToken nt; | |
23572 | ffelexHandler next; | |
23573 | ||
23574 | switch (ffelex_token_type (ffesta_tokens[0])) | |
23575 | { | |
23576 | case FFELEX_typeNAME: | |
23577 | if (ffesta_first_kw != FFESTR_firstSTRUCTURE) | |
23578 | goto bad_0; /* :::::::::::::::::::: */ | |
23579 | switch (ffelex_token_type (t)) | |
23580 | { | |
23581 | case FFELEX_typeCOMMA: | |
23582 | case FFELEX_typeCOLONCOLON: | |
23583 | case FFELEX_typeEOS: | |
23584 | case FFELEX_typeSEMICOLON: | |
23585 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
23586 | goto bad_1; /* :::::::::::::::::::: */ | |
23587 | ||
23588 | default: | |
23589 | goto bad_1; /* :::::::::::::::::::: */ | |
23590 | ||
23591 | case FFELEX_typeNAME: | |
23592 | ffesta_confirmed (); | |
23593 | if (!ffesta_is_inhibited ()) | |
23594 | ffestc_V003_start (NULL); | |
23595 | ffestb_local_.structure.started = TRUE; | |
23596 | return (ffelexHandler) ffestb_V0034_ (t); | |
23597 | ||
23598 | case FFELEX_typeSLASH: | |
23599 | ffesta_confirmed (); | |
23600 | return (ffelexHandler) ffestb_V0031_; | |
23601 | } | |
23602 | ||
23603 | case FFELEX_typeNAMES: | |
23604 | if (ffesta_first_kw != FFESTR_firstSTRUCTURE) | |
23605 | goto bad_0; /* :::::::::::::::::::: */ | |
23606 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlSTRUCTURE); | |
23607 | switch (ffelex_token_type (t)) | |
23608 | { | |
23609 | default: | |
23610 | goto bad_1; /* :::::::::::::::::::: */ | |
23611 | ||
23612 | case FFELEX_typeEOS: | |
23613 | case FFELEX_typeSEMICOLON: | |
23614 | case FFELEX_typeCOMMA: | |
23615 | case FFELEX_typeCOLONCOLON: | |
23616 | ffesta_confirmed (); | |
23617 | break; | |
23618 | ||
23619 | case FFELEX_typeSLASH: | |
23620 | ffesta_confirmed (); | |
23621 | if (*p != '\0') | |
23622 | goto bad_1; /* :::::::::::::::::::: */ | |
23623 | return (ffelexHandler) ffestb_V0031_; | |
23624 | ||
23625 | case FFELEX_typeOPEN_PAREN: | |
23626 | break; | |
23627 | } | |
23628 | ||
23629 | /* Here, we have at least one char after "STRUCTURE" and t is COMMA, | |
23630 | EOS/SEMICOLON, or OPEN_PAREN. */ | |
23631 | ||
23632 | if (!ffesrc_is_name_init (*p)) | |
23633 | goto bad_i; /* :::::::::::::::::::: */ | |
23634 | nt = ffelex_token_name_from_names (ffesta_tokens[0], i, 0); | |
23635 | if (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN) | |
23636 | ffestb_local_.structure.started = FALSE; | |
23637 | else | |
23638 | { | |
23639 | if (!ffesta_is_inhibited ()) | |
23640 | ffestc_V003_start (NULL); | |
23641 | ffestb_local_.structure.started = TRUE; | |
23642 | } | |
23643 | next = (ffelexHandler) ffestb_V0034_ (nt); | |
23644 | ffelex_token_kill (nt); | |
23645 | return (ffelexHandler) (*next) (t); | |
23646 | ||
23647 | default: | |
23648 | goto bad_0; /* :::::::::::::::::::: */ | |
23649 | } | |
23650 | ||
23651 | bad_0: /* :::::::::::::::::::: */ | |
23652 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", ffesta_tokens[0]); | |
23653 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23654 | ||
23655 | bad_1: /* :::::::::::::::::::: */ | |
23656 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t); | |
23657 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
23658 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
23659 | ||
23660 | bad_i: /* :::::::::::::::::::: */ | |
23661 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", ffesta_tokens[0], i, t); | |
23662 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23663 | } | |
23664 | ||
23665 | /* ffestb_V0031_ -- "STRUCTURE" SLASH | |
23666 | ||
23667 | return ffestb_V0031_; // to lexer | |
23668 | ||
23669 | Handle NAME. */ | |
23670 | ||
23671 | static ffelexHandler | |
23672 | ffestb_V0031_ (ffelexToken t) | |
23673 | { | |
23674 | switch (ffelex_token_type (t)) | |
23675 | { | |
23676 | case FFELEX_typeNAME: | |
23677 | ffesta_tokens[1] = ffelex_token_use (t); | |
23678 | return (ffelexHandler) ffestb_V0032_; | |
23679 | ||
23680 | default: | |
23681 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t); | |
23682 | break; | |
23683 | } | |
23684 | ||
23685 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23686 | } | |
23687 | ||
23688 | /* ffestb_V0032_ -- "STRUCTURE" SLASH NAME | |
23689 | ||
23690 | return ffestb_V0032_; // to lexer | |
23691 | ||
23692 | Handle SLASH. */ | |
23693 | ||
23694 | static ffelexHandler | |
23695 | ffestb_V0032_ (ffelexToken t) | |
23696 | { | |
23697 | switch (ffelex_token_type (t)) | |
23698 | { | |
23699 | case FFELEX_typeSLASH: | |
23700 | if (!ffesta_is_inhibited ()) | |
23701 | ffestc_V003_start (ffesta_tokens[1]); | |
23702 | ffestb_local_.structure.started = TRUE; | |
23703 | ffelex_token_kill (ffesta_tokens[1]); | |
23704 | return (ffelexHandler) ffestb_V0033_; | |
23705 | ||
23706 | default: | |
23707 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t); | |
23708 | break; | |
23709 | } | |
23710 | ||
23711 | ffelex_token_kill (ffesta_tokens[1]); | |
23712 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23713 | } | |
23714 | ||
23715 | /* ffestb_V0033_ -- "STRUCTURE" SLASH NAME SLASH | |
23716 | ||
23717 | return ffestb_V0033_; // to lexer | |
23718 | ||
23719 | Handle NAME or EOS/SEMICOLON. */ | |
23720 | ||
23721 | static ffelexHandler | |
23722 | ffestb_V0033_ (ffelexToken t) | |
23723 | { | |
23724 | switch (ffelex_token_type (t)) | |
23725 | { | |
23726 | case FFELEX_typeNAME: | |
23727 | return (ffelexHandler) ffestb_V0034_ (t); | |
23728 | ||
23729 | case FFELEX_typeEOS: | |
23730 | case FFELEX_typeSEMICOLON: | |
23731 | if (!ffesta_is_inhibited ()) | |
23732 | ffestc_V003_finish (); | |
23733 | return (ffelexHandler) ffesta_zero (t); | |
23734 | ||
23735 | default: | |
23736 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t); | |
23737 | break; | |
23738 | } | |
23739 | ||
23740 | ffelex_token_kill (ffesta_tokens[1]); | |
23741 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23742 | } | |
23743 | ||
23744 | /* ffestb_V0034_ -- "STRUCTURE" [SLASH NAME SLASH] | |
23745 | ||
23746 | return ffestb_V0034_; // to lexer | |
23747 | ||
23748 | Handle NAME. */ | |
23749 | ||
23750 | static ffelexHandler | |
23751 | ffestb_V0034_ (ffelexToken t) | |
23752 | { | |
23753 | switch (ffelex_token_type (t)) | |
23754 | { | |
23755 | case FFELEX_typeNAME: | |
23756 | ffesta_tokens[1] = ffelex_token_use (t); | |
23757 | return (ffelexHandler) ffestb_V0035_; | |
23758 | ||
23759 | default: | |
23760 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t); | |
23761 | break; | |
23762 | } | |
23763 | ||
23764 | if (!ffesta_is_inhibited ()) | |
23765 | ffestc_V003_finish (); | |
23766 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23767 | } | |
23768 | ||
23769 | /* ffestb_V0035_ -- "STRUCTURE" ... NAME | |
23770 | ||
23771 | return ffestb_V0035_; // to lexer | |
23772 | ||
23773 | Handle OPEN_PAREN. */ | |
23774 | ||
23775 | static ffelexHandler | |
23776 | ffestb_V0035_ (ffelexToken t) | |
23777 | { | |
23778 | switch (ffelex_token_type (t)) | |
23779 | { | |
23780 | case FFELEX_typeOPEN_PAREN: | |
23781 | ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create (); | |
23782 | ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_V0036_; | |
23783 | ffestb_subrargs_.dim_list.pool = ffesta_output_pool; | |
23784 | ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON; | |
23785 | #ifdef FFECOM_dimensionsMAX | |
23786 | ffestb_subrargs_.dim_list.ndims = 0; | |
23787 | #endif | |
23788 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
23789 | FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_); | |
23790 | ||
23791 | case FFELEX_typeCOMMA: | |
23792 | if (!ffesta_is_inhibited ()) | |
23793 | ffestc_V003_item (ffesta_tokens[1], NULL); | |
23794 | ffelex_token_kill (ffesta_tokens[1]); | |
23795 | return (ffelexHandler) ffestb_V0034_; | |
23796 | ||
23797 | case FFELEX_typeEOS: | |
23798 | case FFELEX_typeSEMICOLON: | |
23799 | if (!ffesta_is_inhibited ()) | |
23800 | { | |
23801 | ffestc_V003_item (ffesta_tokens[1], NULL); | |
23802 | ffestc_V003_finish (); | |
23803 | } | |
23804 | ffelex_token_kill (ffesta_tokens[1]); | |
23805 | return (ffelexHandler) ffesta_zero (t); | |
23806 | ||
23807 | default: | |
23808 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t); | |
23809 | break; | |
23810 | } | |
23811 | ||
23812 | if (!ffesta_is_inhibited ()) | |
23813 | ffestc_V003_finish (); | |
23814 | ffelex_token_kill (ffesta_tokens[1]); | |
23815 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23816 | } | |
23817 | ||
23818 | /* ffestb_V0036_ -- "STRUCTURE" ... NAME OPEN_PAREN dimlist CLOSE_PAREN | |
23819 | ||
23820 | return ffestb_V0036_; // to lexer | |
23821 | ||
23822 | Handle COMMA or EOS/SEMICOLON. */ | |
23823 | ||
23824 | static ffelexHandler | |
23825 | ffestb_V0036_ (ffelexToken t) | |
23826 | { | |
23827 | if (!ffestb_subrargs_.dim_list.ok) | |
23828 | goto bad; /* :::::::::::::::::::: */ | |
23829 | ||
23830 | switch (ffelex_token_type (t)) | |
23831 | { | |
23832 | case FFELEX_typeCOMMA: | |
23833 | ffesta_confirmed (); | |
23834 | if (!ffesta_is_inhibited ()) | |
23835 | { | |
23836 | if (!ffestb_local_.structure.started) | |
23837 | { | |
23838 | ffestc_V003_start (NULL); | |
23839 | ffestb_local_.structure.started = TRUE; | |
23840 | } | |
23841 | ffestc_V003_item (ffesta_tokens[1], | |
23842 | ffestb_subrargs_.dim_list.dims); | |
23843 | } | |
23844 | ffelex_token_kill (ffesta_tokens[1]); | |
23845 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
23846 | return (ffelexHandler) ffestb_V0034_; | |
23847 | ||
23848 | case FFELEX_typeEOS: | |
23849 | case FFELEX_typeSEMICOLON: | |
23850 | ffesta_confirmed (); | |
23851 | if (!ffesta_is_inhibited ()) | |
23852 | { | |
23853 | if (!ffestb_local_.structure.started) | |
23854 | ffestc_V003_start (NULL); | |
23855 | ffestc_V003_item (ffesta_tokens[1], | |
23856 | ffestb_subrargs_.dim_list.dims); | |
23857 | ffestc_V003_finish (); | |
23858 | } | |
23859 | ffelex_token_kill (ffesta_tokens[1]); | |
23860 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
23861 | return (ffelexHandler) ffesta_zero (t); | |
23862 | ||
23863 | default: | |
23864 | break; | |
23865 | } | |
23866 | ||
23867 | bad: /* :::::::::::::::::::: */ | |
23868 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "STRUCTURE", t); | |
23869 | if (ffestb_local_.structure.started && !ffesta_is_inhibited ()) | |
23870 | ffestc_V003_finish (); | |
23871 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
23872 | ffelex_token_kill (ffesta_tokens[1]); | |
23873 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23874 | } | |
23875 | ||
23876 | /* ffestb_V016 -- Parse the RECORD statement | |
23877 | ||
23878 | return ffestb_V016; // to lexer | |
23879 | ||
23880 | Make sure the statement has a valid form for the RECORD statement. If it | |
23881 | does, implement the statement. */ | |
23882 | ||
23883 | ffelexHandler | |
23884 | ffestb_V016 (ffelexToken t) | |
23885 | { | |
23886 | char *p; | |
23887 | ffeTokenLength i; | |
23888 | ||
23889 | switch (ffelex_token_type (ffesta_tokens[0])) | |
23890 | { | |
23891 | case FFELEX_typeNAME: | |
23892 | if (ffesta_first_kw != FFESTR_firstRECORD) | |
23893 | goto bad_0; /* :::::::::::::::::::: */ | |
23894 | break; | |
23895 | ||
23896 | case FFELEX_typeNAMES: | |
23897 | if (ffesta_first_kw != FFESTR_firstRECORD) | |
23898 | goto bad_0; /* :::::::::::::::::::: */ | |
23899 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlRECORD); | |
23900 | if (*p != '\0') | |
23901 | goto bad_i; /* :::::::::::::::::::: */ | |
23902 | break; | |
23903 | ||
23904 | default: | |
23905 | goto bad_0; /* :::::::::::::::::::: */ | |
23906 | } | |
23907 | ||
23908 | switch (ffelex_token_type (t)) | |
23909 | { | |
23910 | case FFELEX_typeCOMMA: | |
23911 | case FFELEX_typeEOS: | |
23912 | case FFELEX_typeSEMICOLON: | |
23913 | case FFELEX_typeCOLONCOLON: | |
23914 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
23915 | goto bad_1; /* :::::::::::::::::::: */ | |
23916 | ||
23917 | default: | |
23918 | goto bad_1; /* :::::::::::::::::::: */ | |
23919 | ||
23920 | case FFELEX_typeSLASH: | |
23921 | break; | |
23922 | } | |
23923 | ||
23924 | ffesta_confirmed (); | |
23925 | if (!ffesta_is_inhibited ()) | |
23926 | ffestc_V016_start (); | |
23927 | return (ffelexHandler) ffestb_V0161_; | |
23928 | ||
23929 | bad_0: /* :::::::::::::::::::: */ | |
23930 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", ffesta_tokens[0]); | |
23931 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23932 | ||
23933 | bad_1: /* :::::::::::::::::::: */ | |
23934 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t); | |
23935 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
23936 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
23937 | ||
23938 | bad_i: /* :::::::::::::::::::: */ | |
23939 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "RECORD", ffesta_tokens[0], i, t); | |
23940 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23941 | } | |
23942 | ||
23943 | /* ffestb_V0161_ -- "RECORD" SLASH | |
23944 | ||
23945 | return ffestb_V0161_; // to lexer | |
23946 | ||
23947 | Handle NAME. */ | |
23948 | ||
23949 | static ffelexHandler | |
23950 | ffestb_V0161_ (ffelexToken t) | |
23951 | { | |
23952 | switch (ffelex_token_type (t)) | |
23953 | { | |
23954 | case FFELEX_typeNAME: | |
23955 | if (!ffesta_is_inhibited ()) | |
23956 | ffestc_V016_item_structure (t); | |
23957 | return (ffelexHandler) ffestb_V0162_; | |
23958 | ||
23959 | default: | |
23960 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t); | |
23961 | break; | |
23962 | } | |
23963 | ||
23964 | if (!ffesta_is_inhibited ()) | |
23965 | ffestc_V016_finish (); | |
23966 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23967 | } | |
23968 | ||
23969 | /* ffestb_V0162_ -- "RECORD" SLASH NAME | |
23970 | ||
23971 | return ffestb_V0162_; // to lexer | |
23972 | ||
23973 | Handle SLASH. */ | |
23974 | ||
23975 | static ffelexHandler | |
23976 | ffestb_V0162_ (ffelexToken t) | |
23977 | { | |
23978 | switch (ffelex_token_type (t)) | |
23979 | { | |
23980 | case FFELEX_typeSLASH: | |
23981 | return (ffelexHandler) ffestb_V0163_; | |
23982 | ||
23983 | default: | |
23984 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t); | |
23985 | break; | |
23986 | } | |
23987 | ||
23988 | if (!ffesta_is_inhibited ()) | |
23989 | ffestc_V016_finish (); | |
23990 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
23991 | } | |
23992 | ||
23993 | /* ffestb_V0163_ -- "RECORD" SLASH NAME SLASH | |
23994 | ||
23995 | return ffestb_V0163_; // to lexer | |
23996 | ||
23997 | Handle NAME. */ | |
23998 | ||
23999 | static ffelexHandler | |
24000 | ffestb_V0163_ (ffelexToken t) | |
24001 | { | |
24002 | switch (ffelex_token_type (t)) | |
24003 | { | |
24004 | case FFELEX_typeNAME: | |
24005 | ffesta_tokens[1] = ffelex_token_use (t); | |
24006 | return (ffelexHandler) ffestb_V0164_; | |
24007 | ||
24008 | default: | |
24009 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t); | |
24010 | break; | |
24011 | } | |
24012 | ||
24013 | if (!ffesta_is_inhibited ()) | |
24014 | ffestc_V016_finish (); | |
24015 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24016 | } | |
24017 | ||
24018 | /* ffestb_V0164_ -- "RECORD" ... NAME | |
24019 | ||
24020 | return ffestb_V0164_; // to lexer | |
24021 | ||
24022 | Handle OPEN_PAREN. */ | |
24023 | ||
24024 | static ffelexHandler | |
24025 | ffestb_V0164_ (ffelexToken t) | |
24026 | { | |
24027 | switch (ffelex_token_type (t)) | |
24028 | { | |
24029 | case FFELEX_typeOPEN_PAREN: | |
24030 | ffestb_subrargs_.dim_list.dims = ffestt_dimlist_create (); | |
24031 | ffestb_subrargs_.dim_list.handler = (ffelexHandler) ffestb_V0165_; | |
24032 | ffestb_subrargs_.dim_list.pool = ffesta_output_pool; | |
24033 | ffestb_subrargs_.dim_list.ctx = FFEEXPR_contextDIMLISTCOMMON; | |
24034 | #ifdef FFECOM_dimensionsMAX | |
24035 | ffestb_subrargs_.dim_list.ndims = 0; | |
24036 | #endif | |
24037 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
24038 | FFEEXPR_contextDIMLISTCOMMON, (ffeexprCallback) ffestb_subr_dimlist_); | |
24039 | ||
24040 | case FFELEX_typeCOMMA: | |
24041 | if (!ffesta_is_inhibited ()) | |
24042 | ffestc_V016_item_object (ffesta_tokens[1], NULL); | |
24043 | ffelex_token_kill (ffesta_tokens[1]); | |
24044 | return (ffelexHandler) ffestb_V0166_; | |
24045 | ||
24046 | case FFELEX_typeEOS: | |
24047 | case FFELEX_typeSEMICOLON: | |
24048 | if (!ffesta_is_inhibited ()) | |
24049 | { | |
24050 | ffestc_V016_item_object (ffesta_tokens[1], NULL); | |
24051 | ffestc_V016_finish (); | |
24052 | } | |
24053 | ffelex_token_kill (ffesta_tokens[1]); | |
24054 | return (ffelexHandler) ffesta_zero (t); | |
24055 | ||
24056 | default: | |
24057 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t); | |
24058 | break; | |
24059 | } | |
24060 | ||
24061 | if (!ffesta_is_inhibited ()) | |
24062 | ffestc_V016_finish (); | |
24063 | ffelex_token_kill (ffesta_tokens[1]); | |
24064 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24065 | } | |
24066 | ||
24067 | /* ffestb_V0165_ -- "RECORD" ... NAME OPEN_PAREN dimlist CLOSE_PAREN | |
24068 | ||
24069 | return ffestb_V0165_; // to lexer | |
24070 | ||
24071 | Handle COMMA or EOS/SEMICOLON. */ | |
24072 | ||
24073 | static ffelexHandler | |
24074 | ffestb_V0165_ (ffelexToken t) | |
24075 | { | |
24076 | if (!ffestb_subrargs_.dim_list.ok) | |
24077 | goto bad; /* :::::::::::::::::::: */ | |
24078 | ||
24079 | switch (ffelex_token_type (t)) | |
24080 | { | |
24081 | case FFELEX_typeCOMMA: | |
24082 | if (!ffesta_is_inhibited ()) | |
24083 | ffestc_V016_item_object (ffesta_tokens[1], | |
24084 | ffestb_subrargs_.dim_list.dims); | |
24085 | ffelex_token_kill (ffesta_tokens[1]); | |
24086 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
24087 | return (ffelexHandler) ffestb_V0166_; | |
24088 | ||
24089 | case FFELEX_typeEOS: | |
24090 | case FFELEX_typeSEMICOLON: | |
24091 | if (!ffesta_is_inhibited ()) | |
24092 | { | |
24093 | ffestc_V016_item_object (ffesta_tokens[1], | |
24094 | ffestb_subrargs_.dim_list.dims); | |
24095 | ffestc_V016_finish (); | |
24096 | } | |
24097 | ffelex_token_kill (ffesta_tokens[1]); | |
24098 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
24099 | return (ffelexHandler) ffesta_zero (t); | |
24100 | ||
24101 | default: | |
24102 | break; | |
24103 | } | |
24104 | ||
24105 | bad: /* :::::::::::::::::::: */ | |
24106 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t); | |
24107 | if (ffestb_local_.structure.started && !ffesta_is_inhibited ()) | |
24108 | ffestc_V016_finish (); | |
24109 | ffestt_dimlist_kill (ffestb_subrargs_.dim_list.dims); | |
24110 | ffelex_token_kill (ffesta_tokens[1]); | |
24111 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24112 | } | |
24113 | ||
24114 | /* ffestb_V0166_ -- "RECORD" SLASH NAME SLASH NAME [OPEN_PAREN dimlist | |
24115 | CLOSE_PAREN] COMMA | |
24116 | ||
24117 | return ffestb_V0166_; // to lexer | |
24118 | ||
24119 | Handle NAME or SLASH. */ | |
24120 | ||
24121 | static ffelexHandler | |
24122 | ffestb_V0166_ (ffelexToken t) | |
24123 | { | |
24124 | switch (ffelex_token_type (t)) | |
24125 | { | |
24126 | case FFELEX_typeNAME: | |
24127 | ffesta_tokens[1] = ffelex_token_use (t); | |
24128 | return (ffelexHandler) ffestb_V0164_; | |
24129 | ||
24130 | case FFELEX_typeSLASH: | |
24131 | return (ffelexHandler) ffestb_V0161_; | |
24132 | ||
24133 | default: | |
24134 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "RECORD", t); | |
24135 | break; | |
24136 | } | |
24137 | ||
24138 | if (!ffesta_is_inhibited ()) | |
24139 | ffestc_V016_finish (); | |
24140 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24141 | } | |
24142 | ||
24143 | #endif | |
24144 | /* ffestb_V027 -- Parse the VXT PARAMETER statement | |
24145 | ||
24146 | return ffestb_V027; // to lexer | |
24147 | ||
24148 | Make sure the statement has a valid form for the VXT PARAMETER statement. | |
24149 | If it does, implement the statement. */ | |
24150 | ||
24151 | ffelexHandler | |
24152 | ffestb_V027 (ffelexToken t) | |
24153 | { | |
24154 | char *p; | |
24155 | ffeTokenLength i; | |
24156 | ||
24157 | switch (ffelex_token_type (ffesta_tokens[0])) | |
24158 | { | |
24159 | case FFELEX_typeNAME: | |
24160 | if (ffesta_first_kw != FFESTR_firstPARAMETER) | |
24161 | goto bad_0; /* :::::::::::::::::::: */ | |
24162 | switch (ffelex_token_type (t)) | |
24163 | { | |
24164 | case FFELEX_typeNAME: | |
24165 | break; | |
24166 | ||
24167 | default: | |
24168 | goto bad_1; /* :::::::::::::::::::: */ | |
24169 | } | |
24170 | ffesta_confirmed (); | |
24171 | ffestb_local_.vxtparam.started = TRUE; | |
24172 | if (!ffesta_is_inhibited ()) | |
24173 | ffestc_V027_start (); | |
24174 | ffesta_tokens[1] = ffelex_token_use (t); | |
24175 | return (ffelexHandler) ffestb_V0271_; | |
24176 | ||
24177 | case FFELEX_typeNAMES: | |
24178 | if (ffesta_first_kw != FFESTR_firstPARAMETER) | |
24179 | goto bad_0; /* :::::::::::::::::::: */ | |
24180 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlPARAMETER); | |
24181 | switch (ffelex_token_type (t)) | |
24182 | { | |
24183 | case FFELEX_typeEQUALS: | |
24184 | break; | |
24185 | ||
24186 | default: | |
24187 | goto bad_1; /* :::::::::::::::::::: */ | |
24188 | } | |
24189 | if (!ffesrc_is_name_init (*p)) | |
24190 | goto bad_i; /* :::::::::::::::::::: */ | |
24191 | ffestb_local_.vxtparam.started = FALSE; | |
24192 | ffesta_tokens[1] = ffelex_token_name_from_names (ffesta_tokens[0], i, | |
24193 | 0); | |
24194 | return (ffelexHandler) ffestb_V0271_ (t); | |
24195 | ||
24196 | default: | |
24197 | goto bad_0; /* :::::::::::::::::::: */ | |
24198 | } | |
24199 | ||
24200 | bad_0: /* :::::::::::::::::::: */ | |
24201 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0]); | |
24202 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24203 | ||
24204 | bad_1: /* :::::::::::::::::::: */ | |
24205 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t); | |
24206 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
24207 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
24208 | ||
24209 | bad_i: /* :::::::::::::::::::: */ | |
24210 | ffesta_ffebad_1sp (FFEBAD_INVALID_STMT_FORM, "PARAMETER", ffesta_tokens[0], i, t); | |
24211 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24212 | } | |
24213 | ||
24214 | /* ffestb_V0271_ -- "PARAMETER" NAME | |
24215 | ||
24216 | return ffestb_V0271_; // to lexer | |
24217 | ||
24218 | Handle EQUALS. */ | |
24219 | ||
24220 | static ffelexHandler | |
24221 | ffestb_V0271_ (ffelexToken t) | |
24222 | { | |
24223 | switch (ffelex_token_type (t)) | |
24224 | { | |
24225 | case FFELEX_typeEQUALS: | |
24226 | return (ffelexHandler) ffeexpr_rhs (ffesta_output_pool, | |
24227 | FFEEXPR_contextPARAMETER, (ffeexprCallback) ffestb_V0272_); | |
24228 | ||
24229 | default: | |
24230 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t); | |
24231 | break; | |
24232 | } | |
24233 | ||
24234 | ffelex_token_kill (ffesta_tokens[1]); | |
24235 | if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ()) | |
24236 | ffestc_V027_finish (); | |
24237 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24238 | } | |
24239 | ||
24240 | /* ffestb_V0272_ -- "PARAMETER" NAME EQUALS expr | |
24241 | ||
24242 | (ffestb_V0272_) // to expression handler | |
24243 | ||
24244 | Handle COMMA or EOS/SEMICOLON. */ | |
24245 | ||
24246 | static ffelexHandler | |
24247 | ffestb_V0272_ (ffelexToken ft, ffebld expr, ffelexToken t) | |
24248 | { | |
24249 | switch (ffelex_token_type (t)) | |
24250 | { | |
24251 | case FFELEX_typeEOS: | |
24252 | case FFELEX_typeSEMICOLON: | |
24253 | if (!ffestb_local_.vxtparam.started) | |
24254 | { | |
24255 | if (ffestc_is_let_not_V027 ()) | |
24256 | break; /* Not a valid VXTPARAMETER stmt. */ | |
24257 | ffesta_confirmed (); | |
24258 | if (!ffesta_is_inhibited ()) | |
24259 | ffestc_V027_start (); | |
24260 | ffestb_local_.vxtparam.started = TRUE; | |
24261 | } | |
24262 | if (expr == NULL) | |
24263 | break; | |
24264 | if (!ffesta_is_inhibited ()) | |
24265 | { | |
24266 | ffestc_V027_item (ffesta_tokens[1], expr, ft); | |
24267 | ffestc_V027_finish (); | |
24268 | } | |
24269 | ffelex_token_kill (ffesta_tokens[1]); | |
24270 | return (ffelexHandler) ffesta_zero (t); | |
24271 | ||
24272 | case FFELEX_typeCOMMA: | |
24273 | ffesta_confirmed (); | |
24274 | if (!ffestb_local_.vxtparam.started) | |
24275 | { | |
24276 | if (!ffesta_is_inhibited ()) | |
24277 | ffestc_V027_start (); | |
24278 | ffestb_local_.vxtparam.started = TRUE; | |
24279 | } | |
24280 | if (expr == NULL) | |
24281 | break; | |
24282 | if (!ffesta_is_inhibited ()) | |
24283 | ffestc_V027_item (ffesta_tokens[1], expr, ft); | |
24284 | ffelex_token_kill (ffesta_tokens[1]); | |
24285 | return (ffelexHandler) ffestb_V0273_; | |
24286 | ||
24287 | default: | |
24288 | break; | |
24289 | } | |
24290 | ||
24291 | ffelex_token_kill (ffesta_tokens[1]); | |
24292 | if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ()) | |
24293 | ffestc_V027_finish (); | |
24294 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t); | |
24295 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24296 | } | |
24297 | ||
24298 | /* ffestb_V0273_ -- "PARAMETER" NAME EQUALS expr COMMA | |
24299 | ||
24300 | return ffestb_V0273_; // to lexer | |
24301 | ||
24302 | Handle NAME. */ | |
24303 | ||
24304 | static ffelexHandler | |
24305 | ffestb_V0273_ (ffelexToken t) | |
24306 | { | |
24307 | switch (ffelex_token_type (t)) | |
24308 | { | |
24309 | case FFELEX_typeNAME: | |
24310 | ffesta_tokens[1] = ffelex_token_use (t); | |
24311 | return (ffelexHandler) ffestb_V0271_; | |
24312 | ||
24313 | default: | |
24314 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "PARAMETER", t); | |
24315 | break; | |
24316 | } | |
24317 | ||
24318 | if (ffestb_local_.vxtparam.started && !ffesta_is_inhibited ()) | |
24319 | ffestc_V027_finish (); | |
24320 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24321 | } | |
24322 | ||
24323 | /* ffestb_decl_R539 -- Parse the IMPLICIT FUNCTION statement | |
24324 | ||
24325 | return ffestb_decl_R539; // to lexer | |
24326 | ||
24327 | Make sure the statement has a valid form for the IMPLICIT | |
24328 | statement. If it does, implement the statement. */ | |
24329 | ||
24330 | ffelexHandler | |
24331 | ffestb_decl_R539 (ffelexToken t) | |
24332 | { | |
24333 | ffeTokenLength i; | |
24334 | char *p; | |
24335 | ffelexToken nt; | |
24336 | ffestrSecond kw; | |
24337 | ||
24338 | ffestb_local_.decl.recursive = NULL; | |
24339 | ||
24340 | switch (ffelex_token_type (ffesta_tokens[0])) | |
24341 | { | |
24342 | case FFELEX_typeNAME: | |
24343 | if (ffesta_first_kw != FFESTR_firstIMPLICIT) | |
24344 | goto bad_0; /* :::::::::::::::::::: */ | |
24345 | switch (ffelex_token_type (t)) | |
24346 | { | |
24347 | case FFELEX_typeEOS: | |
24348 | case FFELEX_typeSEMICOLON: | |
24349 | case FFELEX_typeCOMMA: | |
24350 | case FFELEX_typeCOLONCOLON: | |
24351 | ffesta_confirmed (); /* Error, but clearly intended. */ | |
24352 | goto bad_1; /* :::::::::::::::::::: */ | |
24353 | ||
24354 | default: | |
24355 | goto bad_1; /* :::::::::::::::::::: */ | |
24356 | ||
24357 | case FFELEX_typeNAME: | |
24358 | break; | |
24359 | } | |
24360 | ffesta_confirmed (); | |
24361 | ffestb_local_.decl.imp_started = FALSE; | |
24362 | switch (ffesta_second_kw) | |
24363 | { | |
24364 | case FFESTR_secondINTEGER: | |
24365 | ffestb_local_.decl.type = FFESTP_typeINTEGER; | |
24366 | return (ffelexHandler) ffestb_decl_R5391_; | |
24367 | ||
24368 | case FFESTR_secondBYTE: | |
24369 | ffestb_local_.decl.type = FFESTP_typeBYTE; | |
24370 | return (ffelexHandler) ffestb_decl_R5391_; | |
24371 | ||
24372 | case FFESTR_secondWORD: | |
24373 | ffestb_local_.decl.type = FFESTP_typeWORD; | |
24374 | return (ffelexHandler) ffestb_decl_R5391_; | |
24375 | ||
24376 | case FFESTR_secondREAL: | |
24377 | ffestb_local_.decl.type = FFESTP_typeREAL; | |
24378 | return (ffelexHandler) ffestb_decl_R5391_; | |
24379 | ||
24380 | case FFESTR_secondCOMPLEX: | |
24381 | ffestb_local_.decl.type = FFESTP_typeCOMPLEX; | |
24382 | return (ffelexHandler) ffestb_decl_R5391_; | |
24383 | ||
24384 | case FFESTR_secondLOGICAL: | |
24385 | ffestb_local_.decl.type = FFESTP_typeLOGICAL; | |
24386 | return (ffelexHandler) ffestb_decl_R5391_; | |
24387 | ||
24388 | case FFESTR_secondCHARACTER: | |
24389 | ffestb_local_.decl.type = FFESTP_typeCHARACTER; | |
24390 | return (ffelexHandler) ffestb_decl_R5391_; | |
24391 | ||
24392 | case FFESTR_secondDOUBLE: | |
24393 | return (ffelexHandler) ffestb_decl_R5392_; | |
24394 | ||
24395 | case FFESTR_secondDOUBLEPRECISION: | |
24396 | ffestb_local_.decl.type = FFESTP_typeDBLPRCSN; | |
24397 | ffestb_local_.decl.kind = NULL; | |
24398 | ffestb_local_.decl.kindt = NULL; | |
24399 | ffestb_local_.decl.len = NULL; | |
24400 | ffestb_local_.decl.lent = NULL; | |
24401 | return (ffelexHandler) ffestb_decl_R539letters_; | |
24402 | ||
24403 | case FFESTR_secondDOUBLECOMPLEX: | |
24404 | ffestb_local_.decl.type = FFESTP_typeDBLCMPLX; | |
24405 | ffestb_local_.decl.kind = NULL; | |
24406 | ffestb_local_.decl.kindt = NULL; | |
24407 | ffestb_local_.decl.len = NULL; | |
24408 | ffestb_local_.decl.lent = NULL; | |
24409 | return (ffelexHandler) ffestb_decl_R539letters_; | |
24410 | ||
24411 | case FFESTR_secondNONE: | |
24412 | return (ffelexHandler) ffestb_decl_R5394_; | |
24413 | ||
24414 | #if FFESTR_F90 | |
24415 | case FFESTR_secondTYPE: | |
24416 | ffestb_local_.decl.type = FFESTP_typeTYPE; | |
24417 | return (ffelexHandler) ffestb_decl_R5393_; | |
24418 | #endif | |
24419 | ||
24420 | default: | |
24421 | goto bad_1; /* :::::::::::::::::::: */ | |
24422 | } | |
24423 | ||
24424 | case FFELEX_typeNAMES: | |
24425 | if (ffesta_first_kw != FFESTR_firstIMPLICIT) | |
24426 | goto bad_0; /* :::::::::::::::::::: */ | |
24427 | switch (ffelex_token_type (t)) | |
24428 | { | |
24429 | case FFELEX_typeCOMMA: | |
24430 | case FFELEX_typeCOLONCOLON: | |
24431 | case FFELEX_typeASTERISK: | |
24432 | case FFELEX_typeSEMICOLON: | |
24433 | case FFELEX_typeEOS: | |
24434 | ffesta_confirmed (); | |
24435 | break; | |
24436 | ||
24437 | case FFELEX_typeOPEN_PAREN: | |
24438 | break; | |
24439 | ||
24440 | default: | |
24441 | goto bad_1; /* :::::::::::::::::::: */ | |
24442 | } | |
24443 | p = ffelex_token_text (ffesta_tokens[0]) + (i = FFESTR_firstlIMPLICIT); | |
24444 | if (!ffesrc_is_name_init (*p)) | |
24445 | goto bad_0; /* :::::::::::::::::::: */ | |
24446 | ffestb_local_.decl.imp_started = FALSE; | |
24447 | nt = ffelex_token_name_from_names (ffesta_tokens[0], | |
24448 | FFESTR_firstlIMPLICIT, 0); | |
24449 | kw = ffestr_second (nt); | |
24450 | ffelex_token_kill (nt); | |
24451 | switch (kw) | |
24452 | { | |
24453 | case FFESTR_secondINTEGER: | |
24454 | ffestb_local_.decl.type = FFESTP_typeINTEGER; | |
24455 | return (ffelexHandler) ffestb_decl_R5391_ (t); | |
24456 | ||
24457 | case FFESTR_secondBYTE: | |
24458 | ffestb_local_.decl.type = FFESTP_typeBYTE; | |
24459 | return (ffelexHandler) ffestb_decl_R5391_ (t); | |
24460 | ||
24461 | case FFESTR_secondWORD: | |
24462 | ffestb_local_.decl.type = FFESTP_typeWORD; | |
24463 | return (ffelexHandler) ffestb_decl_R5391_ (t); | |
24464 | ||
24465 | case FFESTR_secondREAL: | |
24466 | ffestb_local_.decl.type = FFESTP_typeREAL; | |
24467 | return (ffelexHandler) ffestb_decl_R5391_ (t); | |
24468 | ||
24469 | case FFESTR_secondCOMPLEX: | |
24470 | ffestb_local_.decl.type = FFESTP_typeCOMPLEX; | |
24471 | return (ffelexHandler) ffestb_decl_R5391_ (t); | |
24472 | ||
24473 | case FFESTR_secondLOGICAL: | |
24474 | ffestb_local_.decl.type = FFESTP_typeLOGICAL; | |
24475 | return (ffelexHandler) ffestb_decl_R5391_ (t); | |
24476 | ||
24477 | case FFESTR_secondCHARACTER: | |
24478 | ffestb_local_.decl.type = FFESTP_typeCHARACTER; | |
24479 | return (ffelexHandler) ffestb_decl_R5391_ (t); | |
24480 | ||
24481 | case FFESTR_secondDOUBLEPRECISION: | |
24482 | ffestb_local_.decl.type = FFESTP_typeDBLPRCSN; | |
24483 | ffestb_local_.decl.kind = NULL; | |
24484 | ffestb_local_.decl.kindt = NULL; | |
24485 | ffestb_local_.decl.len = NULL; | |
24486 | ffestb_local_.decl.lent = NULL; | |
24487 | return (ffelexHandler) ffestb_decl_R539letters_ (t); | |
24488 | ||
24489 | case FFESTR_secondDOUBLECOMPLEX: | |
24490 | ffestb_local_.decl.type = FFESTP_typeDBLCMPLX; | |
24491 | ffestb_local_.decl.kind = NULL; | |
24492 | ffestb_local_.decl.kindt = NULL; | |
24493 | ffestb_local_.decl.len = NULL; | |
24494 | ffestb_local_.decl.lent = NULL; | |
24495 | return (ffelexHandler) ffestb_decl_R539letters_ (t); | |
24496 | ||
24497 | case FFESTR_secondNONE: | |
24498 | return (ffelexHandler) ffestb_decl_R5394_ (t); | |
24499 | ||
24500 | #if FFESTR_F90 | |
24501 | case FFESTR_secondTYPE: | |
24502 | ffestb_local_.decl.type = FFESTP_typeTYPE; | |
24503 | return (ffelexHandler) ffestb_decl_R5393_ (t); | |
24504 | #endif | |
24505 | ||
24506 | default: | |
24507 | goto bad_1; /* :::::::::::::::::::: */ | |
24508 | } | |
24509 | ||
24510 | default: | |
24511 | goto bad_0; /* :::::::::::::::::::: */ | |
24512 | } | |
24513 | ||
24514 | bad_0: /* :::::::::::::::::::: */ | |
24515 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", ffesta_tokens[0]); | |
24516 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24517 | ||
24518 | bad_1: /* :::::::::::::::::::: */ | |
24519 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24520 | return (ffelexHandler) ffelex_swallow_tokens (t, | |
24521 | (ffelexHandler) ffesta_zero); /* Invalid second token. */ | |
24522 | } | |
24523 | ||
24524 | /* ffestb_decl_R5391_ -- "IMPLICIT" generic-type | |
24525 | ||
24526 | return ffestb_decl_R5391_; // to lexer | |
24527 | ||
24528 | Handle ASTERISK or OPEN_PAREN. */ | |
24529 | ||
24530 | static ffelexHandler | |
24531 | ffestb_decl_R5391_ (ffelexToken t) | |
24532 | { | |
24533 | switch (ffelex_token_type (t)) | |
24534 | { | |
24535 | case FFELEX_typeASTERISK: | |
24536 | ffesta_confirmed (); | |
24537 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_; | |
24538 | ffestb_local_.decl.badname = "IMPLICIT"; | |
24539 | if (ffestb_local_.decl.type == FFESTP_typeCHARACTER) | |
24540 | return (ffelexHandler) ffestb_decl_starlen_; | |
24541 | return (ffelexHandler) ffestb_decl_starkind_; | |
24542 | ||
24543 | case FFELEX_typeOPEN_PAREN: | |
24544 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_; | |
24545 | ffestb_local_.decl.badname = "IMPLICIT"; | |
24546 | ffestb_local_.decl.kind = NULL; | |
24547 | ffestb_local_.decl.kindt = NULL; | |
24548 | ffestb_local_.decl.len = NULL; | |
24549 | ffestb_local_.decl.lent = NULL; | |
24550 | if (ffestb_local_.decl.type == FFESTP_typeCHARACTER) | |
24551 | ffestb_local_.decl.imp_handler | |
24552 | = (ffelexHandler) ffestb_decl_typeparams_; | |
24553 | else | |
24554 | ffestb_local_.decl.imp_handler | |
24555 | = (ffelexHandler) ffestb_decl_kindparam_; | |
24556 | return (ffelexHandler) ffestb_decl_R539maybe_ (t); | |
24557 | ||
24558 | default: | |
24559 | break; | |
24560 | } | |
24561 | ||
24562 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24563 | ffestc_R539finish (); | |
24564 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24565 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24566 | } | |
24567 | ||
24568 | /* ffestb_decl_R5392_ -- "IMPLICIT" "DOUBLE" | |
24569 | ||
24570 | return ffestb_decl_R5392_; // to lexer | |
24571 | ||
24572 | Handle NAME. */ | |
24573 | ||
24574 | static ffelexHandler | |
24575 | ffestb_decl_R5392_ (ffelexToken t) | |
24576 | { | |
24577 | switch (ffelex_token_type (t)) | |
24578 | { | |
24579 | case FFELEX_typeNAME: | |
24580 | switch (ffestr_second (t)) | |
24581 | { | |
24582 | case FFESTR_secondPRECISION: | |
24583 | ffestb_local_.decl.type = FFESTP_typeDBLPRCSN; | |
24584 | break; | |
24585 | ||
24586 | case FFESTR_secondCOMPLEX: | |
24587 | ffestb_local_.decl.type = FFESTP_typeDBLCMPLX; | |
24588 | break; | |
24589 | ||
24590 | default: | |
24591 | goto bad; /* :::::::::::::::::::: */ | |
24592 | } | |
24593 | ffestb_local_.decl.kind = NULL; | |
24594 | ffestb_local_.decl.kindt = NULL; | |
24595 | ffestb_local_.decl.len = NULL; | |
24596 | ffestb_local_.decl.lent = NULL; | |
24597 | return (ffelexHandler) ffestb_decl_R539letters_; | |
24598 | ||
24599 | default: | |
24600 | break; | |
24601 | } | |
24602 | ||
24603 | bad: /* :::::::::::::::::::: */ | |
24604 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24605 | ffestc_R539finish (); | |
24606 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24607 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24608 | } | |
24609 | ||
24610 | /* ffestb_decl_R5393_ -- "IMPLICIT" "TYPE" | |
24611 | ||
24612 | return ffestb_decl_R5393_; // to lexer | |
24613 | ||
24614 | Handle OPEN_PAREN. */ | |
24615 | ||
24616 | #if FFESTR_F90 | |
24617 | static ffelexHandler | |
24618 | ffestb_decl_R5393_ (ffelexToken t) | |
24619 | { | |
24620 | switch (ffelex_token_type (t)) | |
24621 | { | |
24622 | case FFELEX_typeOPEN_PAREN: | |
24623 | ffestb_local_.decl.handler = (ffelexHandler) ffestb_decl_R539letters_; | |
24624 | ffestb_local_.decl.badname = "IMPLICIT"; | |
24625 | return (ffelexHandler) ffestb_decl_typetype1_; | |
24626 | ||
24627 | default: | |
24628 | break; | |
24629 | } | |
24630 | ||
24631 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24632 | ffestc_R539finish (); | |
24633 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24634 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24635 | } | |
24636 | ||
24637 | #endif | |
24638 | /* ffestb_decl_R5394_ -- "IMPLICIT" "NONE" | |
24639 | ||
24640 | return ffestb_decl_R5394_; // to lexer | |
24641 | ||
24642 | Handle EOS/SEMICOLON. */ | |
24643 | ||
24644 | static ffelexHandler | |
24645 | ffestb_decl_R5394_ (ffelexToken t) | |
24646 | { | |
24647 | switch (ffelex_token_type (t)) | |
24648 | { | |
24649 | case FFELEX_typeEOS: | |
24650 | case FFELEX_typeSEMICOLON: | |
24651 | ffesta_confirmed (); | |
24652 | if (!ffesta_is_inhibited ()) | |
24653 | ffestc_R539 (); /* IMPLICIT NONE. */ | |
24654 | return (ffelexHandler) ffesta_zero (t); | |
24655 | ||
24656 | default: | |
24657 | break; | |
24658 | } | |
24659 | ||
24660 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24661 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24662 | } | |
24663 | ||
24664 | /* ffestb_decl_R5395_ -- "IMPLICIT" implicit-spec-list COMMA | |
24665 | ||
24666 | return ffestb_decl_R5395_; // to lexer | |
24667 | ||
24668 | Handle NAME for next type-spec. */ | |
24669 | ||
24670 | static ffelexHandler | |
24671 | ffestb_decl_R5395_ (ffelexToken t) | |
24672 | { | |
24673 | switch (ffelex_token_type (t)) | |
24674 | { | |
24675 | case FFELEX_typeNAME: | |
24676 | switch (ffestr_second (t)) | |
24677 | { | |
24678 | case FFESTR_secondINTEGER: | |
24679 | ffestb_local_.decl.type = FFESTP_typeINTEGER; | |
24680 | return (ffelexHandler) ffestb_decl_R5391_; | |
24681 | ||
24682 | case FFESTR_secondBYTE: | |
24683 | ffestb_local_.decl.type = FFESTP_typeBYTE; | |
24684 | return (ffelexHandler) ffestb_decl_R5391_; | |
24685 | ||
24686 | case FFESTR_secondWORD: | |
24687 | ffestb_local_.decl.type = FFESTP_typeWORD; | |
24688 | return (ffelexHandler) ffestb_decl_R5391_; | |
24689 | ||
24690 | case FFESTR_secondREAL: | |
24691 | ffestb_local_.decl.type = FFESTP_typeREAL; | |
24692 | return (ffelexHandler) ffestb_decl_R5391_; | |
24693 | ||
24694 | case FFESTR_secondCOMPLEX: | |
24695 | ffestb_local_.decl.type = FFESTP_typeCOMPLEX; | |
24696 | return (ffelexHandler) ffestb_decl_R5391_; | |
24697 | ||
24698 | case FFESTR_secondLOGICAL: | |
24699 | ffestb_local_.decl.type = FFESTP_typeLOGICAL; | |
24700 | return (ffelexHandler) ffestb_decl_R5391_; | |
24701 | ||
24702 | case FFESTR_secondCHARACTER: | |
24703 | ffestb_local_.decl.type = FFESTP_typeCHARACTER; | |
24704 | return (ffelexHandler) ffestb_decl_R5391_; | |
24705 | ||
24706 | case FFESTR_secondDOUBLE: | |
24707 | return (ffelexHandler) ffestb_decl_R5392_; | |
24708 | ||
24709 | case FFESTR_secondDOUBLEPRECISION: | |
24710 | ffestb_local_.decl.type = FFESTP_typeDBLPRCSN; | |
24711 | ffestb_local_.decl.kind = NULL; | |
24712 | ffestb_local_.decl.kindt = NULL; | |
24713 | ffestb_local_.decl.len = NULL; | |
24714 | ffestb_local_.decl.lent = NULL; | |
24715 | return (ffelexHandler) ffestb_decl_R539letters_; | |
24716 | ||
24717 | case FFESTR_secondDOUBLECOMPLEX: | |
24718 | ffestb_local_.decl.type = FFESTP_typeDBLCMPLX; | |
24719 | ffestb_local_.decl.kind = NULL; | |
24720 | ffestb_local_.decl.kindt = NULL; | |
24721 | ffestb_local_.decl.len = NULL; | |
24722 | ffestb_local_.decl.lent = NULL; | |
24723 | return (ffelexHandler) ffestb_decl_R539letters_; | |
24724 | ||
24725 | #if FFESTR_F90 | |
24726 | case FFESTR_secondTYPE: | |
24727 | ffestb_local_.decl.type = FFESTP_typeTYPE; | |
24728 | return (ffelexHandler) ffestb_decl_R5393_; | |
24729 | #endif | |
24730 | ||
24731 | default: | |
24732 | break; | |
24733 | } | |
24734 | break; | |
24735 | ||
24736 | default: | |
24737 | break; | |
24738 | } | |
24739 | ||
24740 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24741 | ffestc_R539finish (); | |
24742 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24743 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24744 | } | |
24745 | ||
24746 | /* ffestb_decl_R539letters_ -- "IMPLICIT" type-spec | |
24747 | ||
24748 | return ffestb_decl_R539letters_; // to lexer | |
24749 | ||
24750 | Handle OPEN_PAREN. */ | |
24751 | ||
24752 | static ffelexHandler | |
24753 | ffestb_decl_R539letters_ (ffelexToken t) | |
24754 | { | |
24755 | ffelex_set_names (FALSE); | |
24756 | ||
24757 | switch (ffelex_token_type (t)) | |
24758 | { | |
24759 | case FFELEX_typeOPEN_PAREN: | |
24760 | ffestb_local_.decl.imps = ffestt_implist_create (); | |
24761 | return (ffelexHandler) ffestb_decl_R539letters_1_; | |
24762 | ||
24763 | default: | |
24764 | break; | |
24765 | } | |
24766 | ||
24767 | if (ffestb_local_.decl.kindt != NULL) | |
24768 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
24769 | if (ffestb_local_.decl.lent != NULL) | |
24770 | ffelex_token_kill (ffestb_local_.decl.lent); | |
24771 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24772 | ffestc_R539finish (); | |
24773 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24774 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24775 | } | |
24776 | ||
24777 | /* ffestb_decl_R539letters_1_ -- "IMPLICIT" type-spec OPEN_PAREN | |
24778 | ||
24779 | return ffestb_decl_R539letters_1_; // to lexer | |
24780 | ||
24781 | Handle NAME. */ | |
24782 | ||
24783 | static ffelexHandler | |
24784 | ffestb_decl_R539letters_1_ (ffelexToken t) | |
24785 | { | |
24786 | switch (ffelex_token_type (t)) | |
24787 | { | |
24788 | case FFELEX_typeNAME: | |
24789 | if (ffelex_token_length (t) != 1) | |
24790 | break; | |
24791 | ffesta_tokens[1] = ffelex_token_use (t); | |
24792 | return (ffelexHandler) ffestb_decl_R539letters_2_; | |
24793 | ||
24794 | default: | |
24795 | break; | |
24796 | } | |
24797 | ||
24798 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
24799 | if (ffestb_local_.decl.kindt != NULL) | |
24800 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
24801 | if (ffestb_local_.decl.lent != NULL) | |
24802 | ffelex_token_kill (ffestb_local_.decl.lent); | |
24803 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24804 | ffestc_R539finish (); | |
24805 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24806 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24807 | } | |
24808 | ||
24809 | /* ffestb_decl_R539letters_2_ -- "IMPLICIT" type-spec OPEN_PAREN NAME | |
24810 | ||
24811 | return ffestb_decl_R539letters_2_; // to lexer | |
24812 | ||
24813 | Handle COMMA or MINUS. */ | |
24814 | ||
24815 | static ffelexHandler | |
24816 | ffestb_decl_R539letters_2_ (ffelexToken t) | |
24817 | { | |
24818 | switch (ffelex_token_type (t)) | |
24819 | { | |
24820 | case FFELEX_typeCOMMA: | |
24821 | ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL); | |
24822 | return (ffelexHandler) ffestb_decl_R539letters_1_; | |
24823 | ||
24824 | case FFELEX_typeCLOSE_PAREN: | |
24825 | ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL); | |
24826 | return (ffelexHandler) ffestb_decl_R539letters_5_; | |
24827 | ||
24828 | case FFELEX_typeMINUS: | |
24829 | return (ffelexHandler) ffestb_decl_R539letters_3_; | |
24830 | ||
24831 | default: | |
24832 | break; | |
24833 | } | |
24834 | ||
24835 | ffelex_token_kill (ffesta_tokens[1]); | |
24836 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
24837 | if (ffestb_local_.decl.kindt != NULL) | |
24838 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
24839 | if (ffestb_local_.decl.lent != NULL) | |
24840 | ffelex_token_kill (ffestb_local_.decl.lent); | |
24841 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24842 | ffestc_R539finish (); | |
24843 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24844 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24845 | } | |
24846 | ||
24847 | /* ffestb_decl_R539letters_3_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS | |
24848 | ||
24849 | return ffestb_decl_R539letters_3_; // to lexer | |
24850 | ||
24851 | Handle NAME. */ | |
24852 | ||
24853 | static ffelexHandler | |
24854 | ffestb_decl_R539letters_3_ (ffelexToken t) | |
24855 | { | |
24856 | switch (ffelex_token_type (t)) | |
24857 | { | |
24858 | case FFELEX_typeNAME: | |
24859 | if (ffelex_token_length (t) != 1) | |
24860 | break; | |
24861 | ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], | |
24862 | ffelex_token_use (t)); | |
24863 | return (ffelexHandler) ffestb_decl_R539letters_4_; | |
24864 | ||
24865 | default: | |
24866 | break; | |
24867 | } | |
24868 | ||
24869 | ffelex_token_kill (ffesta_tokens[1]); | |
24870 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
24871 | if (ffestb_local_.decl.kindt != NULL) | |
24872 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
24873 | if (ffestb_local_.decl.lent != NULL) | |
24874 | ffelex_token_kill (ffestb_local_.decl.lent); | |
24875 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24876 | ffestc_R539finish (); | |
24877 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24878 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24879 | } | |
24880 | ||
24881 | /* ffestb_decl_R539letters_4_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS | |
24882 | NAME | |
24883 | ||
24884 | return ffestb_decl_R539letters_4_; // to lexer | |
24885 | ||
24886 | Handle COMMA or CLOSE_PAREN. */ | |
24887 | ||
24888 | static ffelexHandler | |
24889 | ffestb_decl_R539letters_4_ (ffelexToken t) | |
24890 | { | |
24891 | switch (ffelex_token_type (t)) | |
24892 | { | |
24893 | case FFELEX_typeCOMMA: | |
24894 | return (ffelexHandler) ffestb_decl_R539letters_1_; | |
24895 | ||
24896 | case FFELEX_typeCLOSE_PAREN: | |
24897 | return (ffelexHandler) ffestb_decl_R539letters_5_; | |
24898 | ||
24899 | default: | |
24900 | break; | |
24901 | } | |
24902 | ||
24903 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
24904 | if (ffestb_local_.decl.kindt != NULL) | |
24905 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
24906 | if (ffestb_local_.decl.lent != NULL) | |
24907 | ffelex_token_kill (ffestb_local_.decl.lent); | |
24908 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24909 | ffestc_R539finish (); | |
24910 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24911 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24912 | } | |
24913 | ||
24914 | /* ffestb_decl_R539letters_5_ -- "IMPLICIT" type-spec OPEN_PAREN | |
24915 | letter-spec-list CLOSE_PAREN | |
24916 | ||
24917 | return ffestb_decl_R539letters_5_; // to lexer | |
24918 | ||
24919 | Handle COMMA or EOS/SEMICOLON. */ | |
24920 | ||
24921 | static ffelexHandler | |
24922 | ffestb_decl_R539letters_5_ (ffelexToken t) | |
24923 | { | |
24924 | switch (ffelex_token_type (t)) | |
24925 | { | |
24926 | case FFELEX_typeCOMMA: | |
24927 | case FFELEX_typeEOS: | |
24928 | case FFELEX_typeSEMICOLON: | |
24929 | if (!ffestb_local_.decl.imp_started) | |
24930 | { | |
24931 | ffestb_local_.decl.imp_started = TRUE; | |
24932 | ffesta_confirmed (); | |
24933 | if (!ffesta_is_inhibited ()) | |
24934 | ffestc_R539start (); | |
24935 | } | |
24936 | if (!ffesta_is_inhibited ()) | |
24937 | ffestc_R539item (ffestb_local_.decl.type, ffestb_local_.decl.kind, | |
24938 | ffestb_local_.decl.kindt, ffestb_local_.decl.len, | |
24939 | ffestb_local_.decl.lent, ffestb_local_.decl.imps); | |
24940 | if (ffestb_local_.decl.kindt != NULL) | |
24941 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
24942 | if (ffestb_local_.decl.lent != NULL) | |
24943 | ffelex_token_kill (ffestb_local_.decl.lent); | |
24944 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
24945 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
24946 | return (ffelexHandler) ffestb_decl_R5395_; | |
24947 | if (!ffesta_is_inhibited ()) | |
24948 | ffestc_R539finish (); | |
24949 | return (ffelexHandler) ffesta_zero (t); | |
24950 | ||
24951 | default: | |
24952 | break; | |
24953 | } | |
24954 | ||
24955 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
24956 | if (ffestb_local_.decl.kindt != NULL) | |
24957 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
24958 | if (ffestb_local_.decl.lent != NULL) | |
24959 | ffelex_token_kill (ffestb_local_.decl.lent); | |
24960 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
24961 | ffestc_R539finish (); | |
24962 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
24963 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
24964 | } | |
24965 | ||
24966 | /* ffestb_decl_R539maybe_ -- "IMPLICIT" generic-type-spec | |
24967 | ||
24968 | return ffestb_decl_R539maybe_; // to lexer | |
24969 | ||
24970 | Handle OPEN_PAREN. */ | |
24971 | ||
24972 | static ffelexHandler | |
24973 | ffestb_decl_R539maybe_ (ffelexToken t) | |
24974 | { | |
24975 | assert (ffelex_token_type (t) == FFELEX_typeOPEN_PAREN); | |
24976 | ffestb_local_.decl.imps = ffestt_implist_create (); | |
24977 | ffestb_local_.decl.toklist = ffestt_tokenlist_create (); | |
24978 | ffestb_local_.decl.imp_seen_comma | |
24979 | = (ffestb_local_.decl.type != FFESTP_typeCHARACTER); | |
24980 | return (ffelexHandler) ffestb_decl_R539maybe_1_; | |
24981 | } | |
24982 | ||
24983 | /* ffestb_decl_R539maybe_1_ -- "IMPLICIT" generic-type-spec OPEN_PAREN | |
24984 | ||
24985 | return ffestb_decl_R539maybe_1_; // to lexer | |
24986 | ||
24987 | Handle NAME. */ | |
24988 | ||
24989 | static ffelexHandler | |
24990 | ffestb_decl_R539maybe_1_ (ffelexToken t) | |
24991 | { | |
24992 | ffelexHandler next; | |
24993 | ||
24994 | switch (ffelex_token_type (t)) | |
24995 | { | |
24996 | case FFELEX_typeNAME: | |
24997 | if (ffelex_token_length (t) != 1) | |
24998 | break; | |
24999 | ffesta_tokens[1] = ffelex_token_use (t); | |
25000 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
25001 | return (ffelexHandler) ffestb_decl_R539maybe_2_; | |
25002 | ||
25003 | default: | |
25004 | break; | |
25005 | } | |
25006 | ||
25007 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
25008 | next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist, | |
25009 | (ffelexHandler) ffestb_local_.decl.imp_handler); | |
25010 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25011 | return (ffelexHandler) (*next) (t); | |
25012 | } | |
25013 | ||
25014 | /* ffestb_decl_R539maybe_2_ -- "IMPLICIT" generic-type-spec OPEN_PAREN NAME | |
25015 | ||
25016 | return ffestb_decl_R539maybe_2_; // to lexer | |
25017 | ||
25018 | Handle COMMA or MINUS. */ | |
25019 | ||
25020 | static ffelexHandler | |
25021 | ffestb_decl_R539maybe_2_ (ffelexToken t) | |
25022 | { | |
25023 | ffelexHandler next; | |
25024 | ||
25025 | switch (ffelex_token_type (t)) | |
25026 | { | |
25027 | case FFELEX_typeCOMMA: | |
25028 | ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL); | |
25029 | if (ffestb_local_.decl.imp_seen_comma) | |
25030 | { | |
25031 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25032 | return (ffelexHandler) ffestb_decl_R539letters_1_; | |
25033 | } | |
25034 | ffestb_local_.decl.imp_seen_comma = TRUE; | |
25035 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
25036 | return (ffelexHandler) ffestb_decl_R539maybe_1_; | |
25037 | ||
25038 | case FFELEX_typeCLOSE_PAREN: | |
25039 | ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], NULL); | |
25040 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
25041 | return (ffelexHandler) ffestb_decl_R539maybe_5_; | |
25042 | ||
25043 | case FFELEX_typeMINUS: | |
25044 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
25045 | return (ffelexHandler) ffestb_decl_R539maybe_3_; | |
25046 | ||
25047 | default: | |
25048 | break; | |
25049 | } | |
25050 | ||
25051 | ffelex_token_kill (ffesta_tokens[1]); | |
25052 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
25053 | next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist, | |
25054 | (ffelexHandler) ffestb_local_.decl.imp_handler); | |
25055 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25056 | return (ffelexHandler) (*next) (t); | |
25057 | } | |
25058 | ||
25059 | /* ffestb_decl_R539maybe_3_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS | |
25060 | ||
25061 | return ffestb_decl_R539maybe_3_; // to lexer | |
25062 | ||
25063 | Handle NAME. */ | |
25064 | ||
25065 | static ffelexHandler | |
25066 | ffestb_decl_R539maybe_3_ (ffelexToken t) | |
25067 | { | |
25068 | ffelexHandler next; | |
25069 | ||
25070 | switch (ffelex_token_type (t)) | |
25071 | { | |
25072 | case FFELEX_typeNAME: | |
25073 | if (ffelex_token_length (t) != 1) | |
25074 | break; | |
25075 | ffestt_implist_append (ffestb_local_.decl.imps, ffesta_tokens[1], | |
25076 | ffelex_token_use (t)); | |
25077 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
25078 | return (ffelexHandler) ffestb_decl_R539maybe_4_; | |
25079 | ||
25080 | default: | |
25081 | break; | |
25082 | } | |
25083 | ||
25084 | ffelex_token_kill (ffesta_tokens[1]); | |
25085 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
25086 | next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist, | |
25087 | (ffelexHandler) ffestb_local_.decl.imp_handler); | |
25088 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25089 | return (ffelexHandler) (*next) (t); | |
25090 | } | |
25091 | ||
25092 | /* ffestb_decl_R539maybe_4_ -- "IMPLICIT" type-spec OPEN_PAREN NAME MINUS | |
25093 | NAME | |
25094 | ||
25095 | return ffestb_decl_R539maybe_4_; // to lexer | |
25096 | ||
25097 | Handle COMMA or CLOSE_PAREN. */ | |
25098 | ||
25099 | static ffelexHandler | |
25100 | ffestb_decl_R539maybe_4_ (ffelexToken t) | |
25101 | { | |
25102 | ffelexHandler next; | |
25103 | ||
25104 | switch (ffelex_token_type (t)) | |
25105 | { | |
25106 | case FFELEX_typeCOMMA: | |
25107 | if (ffestb_local_.decl.imp_seen_comma) | |
25108 | { | |
25109 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25110 | return (ffelexHandler) ffestb_decl_R539letters_1_; | |
25111 | } | |
25112 | ffestb_local_.decl.imp_seen_comma = TRUE; | |
25113 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
25114 | return (ffelexHandler) ffestb_decl_R539maybe_1_; | |
25115 | ||
25116 | case FFELEX_typeCLOSE_PAREN: | |
25117 | ffestt_tokenlist_append (ffestb_local_.decl.toklist, ffelex_token_use (t)); | |
25118 | return (ffelexHandler) ffestb_decl_R539maybe_5_; | |
25119 | ||
25120 | default: | |
25121 | break; | |
25122 | } | |
25123 | ||
25124 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
25125 | next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist, | |
25126 | (ffelexHandler) ffestb_local_.decl.imp_handler); | |
25127 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25128 | return (ffelexHandler) (*next) (t); | |
25129 | } | |
25130 | ||
25131 | /* ffestb_decl_R539maybe_5_ -- "IMPLICIT" type-spec OPEN_PAREN | |
25132 | letter-spec-list CLOSE_PAREN | |
25133 | ||
25134 | return ffestb_decl_R539maybe_5_; // to lexer | |
25135 | ||
25136 | Handle COMMA or EOS/SEMICOLON. */ | |
25137 | ||
25138 | static ffelexHandler | |
25139 | ffestb_decl_R539maybe_5_ (ffelexToken t) | |
25140 | { | |
25141 | ffelexHandler next; | |
25142 | ||
25143 | switch (ffelex_token_type (t)) | |
25144 | { | |
25145 | case FFELEX_typeCOMMA: | |
25146 | case FFELEX_typeEOS: | |
25147 | case FFELEX_typeSEMICOLON: | |
25148 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25149 | if (!ffestb_local_.decl.imp_started) | |
25150 | { | |
25151 | ffestb_local_.decl.imp_started = TRUE; | |
25152 | ffesta_confirmed (); | |
25153 | if (!ffesta_is_inhibited ()) | |
25154 | ffestc_R539start (); | |
25155 | } | |
25156 | if (!ffesta_is_inhibited ()) | |
25157 | ffestc_R539item (ffestb_local_.decl.type, ffestb_local_.decl.kind, | |
25158 | ffestb_local_.decl.kindt, ffestb_local_.decl.len, | |
25159 | ffestb_local_.decl.lent, ffestb_local_.decl.imps); | |
25160 | if (ffestb_local_.decl.kindt != NULL) | |
25161 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
25162 | if (ffestb_local_.decl.lent != NULL) | |
25163 | ffelex_token_kill (ffestb_local_.decl.lent); | |
25164 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
25165 | if (ffelex_token_type (t) == FFELEX_typeCOMMA) | |
25166 | return (ffelexHandler) ffestb_decl_R5395_; | |
25167 | if (!ffesta_is_inhibited ()) | |
25168 | ffestc_R539finish (); | |
25169 | return (ffelexHandler) ffesta_zero (t); | |
25170 | ||
25171 | case FFELEX_typeOPEN_PAREN: | |
25172 | ffesta_confirmed (); | |
25173 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
25174 | next = (ffelexHandler) ffestt_tokenlist_handle (ffestb_local_.decl.toklist, | |
25175 | (ffelexHandler) ffestb_local_.decl.imp_handler); | |
25176 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25177 | return (ffelexHandler) (*next) (t); | |
25178 | ||
25179 | default: | |
25180 | break; | |
25181 | } | |
25182 | ||
25183 | ffestt_implist_kill (ffestb_local_.decl.imps); | |
25184 | ffestt_tokenlist_kill (ffestb_local_.decl.toklist); | |
25185 | if (ffestb_local_.decl.kindt != NULL) | |
25186 | ffelex_token_kill (ffestb_local_.decl.kindt); | |
25187 | if (ffestb_local_.decl.lent != NULL) | |
25188 | ffelex_token_kill (ffestb_local_.decl.lent); | |
25189 | if (ffestb_local_.decl.imp_started && !ffesta_is_inhibited ()) | |
25190 | ffestc_R539finish (); | |
25191 | ffesta_ffebad_1st (FFEBAD_INVALID_STMT_FORM, "IMPLICIT", t); | |
25192 | return (ffelexHandler) ffelex_swallow_tokens (t, (ffelexHandler) ffesta_zero); | |
25193 | } |