]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/flex/src/gen.c
MFV: r362286
[FreeBSD/FreeBSD.git] / contrib / flex / src / gen.c
1 /* gen - actual generation (writing) of flex scanners */
2
3 /*  Copyright (c) 1990 The Regents of the University of California. */
4 /*  All rights reserved. */
5
6 /*  This code is derived from software contributed to Berkeley by */
7 /*  Vern Paxson. */
8
9 /*  The United States Government has rights in this work pursuant */
10 /*  to contract no. DE-AC03-76SF00098 between the United States */
11 /*  Department of Energy and the University of California. */
12
13 /*  This file is part of flex. */
14
15 /*  Redistribution and use in source and binary forms, with or without */
16 /*  modification, are permitted provided that the following conditions */
17 /*  are met: */
18
19 /*  1. Redistributions of source code must retain the above copyright */
20 /*     notice, this list of conditions and the following disclaimer. */
21 /*  2. Redistributions in binary form must reproduce the above copyright */
22 /*     notice, this list of conditions and the following disclaimer in the */
23 /*     documentation and/or other materials provided with the distribution. */
24
25 /*  Neither the name of the University nor the names of its contributors */
26 /*  may be used to endorse or promote products derived from this software */
27 /*  without specific prior written permission. */
28
29 /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
30 /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
31 /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
32 /*  PURPOSE. */
33
34 #include "flexdef.h"
35 #include "tables.h"
36
37
38 /* declare functions that have forward references */
39
40 void    genecs(void);
41
42
43 static int indent_level = 0;    /* each level is 8 spaces */
44
45 #define set_indent(indent_val) indent_level = indent_val
46
47 /* Almost everything is done in terms of arrays starting at 1, so provide
48  * a null entry for the zero element of all C arrays.  (The exception
49  * to this is that the fast table representation generally uses the
50  * 0 elements of its arrays, too.)
51  */
52
53 static const char *get_int16_decl (void)
54 {
55         return (gentables)
56                 ? "static const flex_int16_t %s[%d] =\n    {   0,\n"
57                 : "static const flex_int16_t * %s = 0;\n";
58 }
59
60
61 static const char *get_int32_decl (void)
62 {
63         return (gentables)
64                 ? "static const flex_int32_t %s[%d] =\n    {   0,\n"
65                 : "static const flex_int32_t * %s = 0;\n";
66 }
67
68 static const char *get_state_decl (void)
69 {
70         return (gentables)
71                 ? "static const yy_state_type %s[%d] =\n    {   0,\n"
72                 : "static const yy_state_type * %s = 0;\n";
73 }
74
75 static const char *get_yy_char_decl (void)
76 {
77         return (gentables)
78                 ? "static const YY_CHAR %s[%d] =\n    {   0,\n"
79                 : "static const YY_CHAR * %s = 0;\n";
80 }
81
82 /* Indent to the current level. */
83
84 void do_indent (void)
85 {
86         int i = indent_level * 8;
87
88         while (i >= 8) {
89                 outc ('\t');
90                 i -= 8;
91         }
92
93         while (i > 0) {
94                 outc (' ');
95                 --i;
96         }
97 }
98
99
100 /** Make the table for possible eol matches.
101  *  @return the newly allocated rule_can_match_eol table
102  */
103 static struct yytbl_data *mkeoltbl (void)
104 {
105         int     i;
106         flex_int8_t *tdata = 0;
107         struct yytbl_data *tbl;
108
109         tbl = calloc(1, sizeof (struct yytbl_data));
110         yytbl_data_init (tbl, YYTD_ID_RULE_CAN_MATCH_EOL);
111         tbl->td_flags = YYTD_DATA8;
112         tbl->td_lolen = (flex_uint32_t) (num_rules + 1);
113         tbl->td_data = tdata =
114                 calloc(tbl->td_lolen, sizeof (flex_int8_t));
115
116         for (i = 1; i <= num_rules; i++)
117                 tdata[i] = rule_has_nl[i] ? 1 : 0;
118
119         buf_prints (&yydmap_buf,
120                     "\t{YYTD_ID_RULE_CAN_MATCH_EOL, (void**)&yy_rule_can_match_eol, sizeof(%s)},\n",
121                     "flex_int32_t");
122         return tbl;
123 }
124
125 /* Generate the table for possible eol matches. */
126 static void geneoltbl (void)
127 {
128         int     i;
129
130         outn ("m4_ifdef( [[M4_YY_USE_LINENO]],[[");
131         outn ("/* Table of booleans, true if rule could match eol. */");
132         out_str_dec (get_int32_decl (), "yy_rule_can_match_eol",
133                      num_rules + 1);
134
135         if (gentables) {
136                 for (i = 1; i <= num_rules; i++) {
137                         out_dec ("%d, ", rule_has_nl[i] ? 1 : 0);
138                         /* format nicely, 20 numbers per line. */
139                         if ((i % 20) == 19)
140                                 out ("\n    ");
141                 }
142                 out ("    };\n");
143         }
144         outn ("]])");
145 }
146
147
148 /* Generate the code to keep backing-up information. */
149
150 void gen_backing_up (void)
151 {
152         if (reject || num_backing_up == 0)
153                 return;
154
155         if (fullspd)
156                 indent_puts ("if ( yy_current_state[-1].yy_nxt )");
157         else
158                 indent_puts ("if ( yy_accept[yy_current_state] )");
159
160         ++indent_level;
161         indent_puts ("{");
162         indent_puts ("YY_G(yy_last_accepting_state) = yy_current_state;");
163         indent_puts ("YY_G(yy_last_accepting_cpos) = yy_cp;");
164         indent_puts ("}");
165         --indent_level;
166 }
167
168
169 /* Generate the code to perform the backing up. */
170
171 void gen_bu_action (void)
172 {
173         if (reject || num_backing_up == 0)
174                 return;
175
176         set_indent (3);
177
178         indent_puts ("case 0: /* must back up */");
179         indent_puts ("/* undo the effects of YY_DO_BEFORE_ACTION */");
180         indent_puts ("*yy_cp = YY_G(yy_hold_char);");
181
182         if (fullspd || fulltbl)
183                 indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos) + 1;");
184         else
185                 /* Backing-up info for compressed tables is taken \after/
186                  * yy_cp has been incremented for the next state.
187                  */
188                 indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos);");
189
190         indent_puts ("yy_current_state = YY_G(yy_last_accepting_state);");
191         indent_puts ("goto yy_find_action;");
192         outc ('\n');
193
194         set_indent (0);
195 }
196
197 /** mkctbl - make full speed compressed transition table
198  * This is an array of structs; each struct a pair of integers.
199  * You should call mkssltbl() immediately after this.
200  * Then, I think, mkecstbl(). Arrrg.
201  * @return the newly allocated trans table
202  */
203
204 static struct yytbl_data *mkctbl (void)
205 {
206         int i;
207         struct yytbl_data *tbl = 0;
208         flex_int32_t *tdata = 0, curr = 0;
209         int     end_of_buffer_action = num_rules + 1;
210
211         buf_prints (&yydmap_buf,
212                     "\t{YYTD_ID_TRANSITION, (void**)&yy_transition, sizeof(%s)},\n",
213                     ((tblend + numecs + 1) >= INT16_MAX
214                      || long_align) ? "flex_int32_t" : "flex_int16_t");
215
216         tbl = calloc(1, sizeof (struct yytbl_data));
217         yytbl_data_init (tbl, YYTD_ID_TRANSITION);
218         tbl->td_flags = YYTD_DATA32 | YYTD_STRUCT;
219         tbl->td_hilen = 0;
220         tbl->td_lolen = (flex_uint32_t) (tblend + numecs + 1);  /* number of structs */
221
222         tbl->td_data = tdata =
223                 calloc(tbl->td_lolen * 2, sizeof (flex_int32_t));
224
225         /* We want the transition to be represented as the offset to the
226          * next state, not the actual state number, which is what it currently
227          * is.  The offset is base[nxt[i]] - (base of current state)].  That's
228          * just the difference between the starting points of the two involved
229          * states (to - from).
230          *
231          * First, though, we need to find some way to put in our end-of-buffer
232          * flags and states.  We do this by making a state with absolutely no
233          * transitions.  We put it at the end of the table.
234          */
235
236         /* We need to have room in nxt/chk for two more slots: One for the
237          * action and one for the end-of-buffer transition.  We now *assume*
238          * that we're guaranteed the only character we'll try to index this
239          * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure
240          * there's room for jam entries for other characters.
241          */
242
243         while (tblend + 2 >= current_max_xpairs)
244                 expand_nxt_chk ();
245
246         while (lastdfa + 1 >= current_max_dfas)
247                 increase_max_dfas ();
248
249         base[lastdfa + 1] = tblend + 2;
250         nxt[tblend + 1] = end_of_buffer_action;
251         chk[tblend + 1] = numecs + 1;
252         chk[tblend + 2] = 1;    /* anything but EOB */
253
254         /* So that "make test" won't show arb. differences. */
255         nxt[tblend + 2] = 0;
256
257         /* Make sure every state has an end-of-buffer transition and an
258          * action #.
259          */
260         for (i = 0; i <= lastdfa; ++i) {
261                 int     anum = dfaacc[i].dfaacc_state;
262                 int     offset = base[i];
263
264                 chk[offset] = EOB_POSITION;
265                 chk[offset - 1] = ACTION_POSITION;
266                 nxt[offset - 1] = anum; /* action number */
267         }
268
269         for (i = 0; i <= tblend; ++i) {
270                 if (chk[i] == EOB_POSITION) {
271                         tdata[curr++] = 0;
272                         tdata[curr++] = base[lastdfa + 1] - i;
273                 }
274
275                 else if (chk[i] == ACTION_POSITION) {
276                         tdata[curr++] = 0;
277                         tdata[curr++] = nxt[i];
278                 }
279
280                 else if (chk[i] > numecs || chk[i] == 0) {
281                         tdata[curr++] = 0;
282                         tdata[curr++] = 0;
283                 }
284                 else {          /* verify, transition */
285
286                         tdata[curr++] = chk[i];
287                         tdata[curr++] = base[nxt[i]] - (i - chk[i]);
288                 }
289         }
290
291
292         /* Here's the final, end-of-buffer state. */
293         tdata[curr++] = chk[tblend + 1];
294         tdata[curr++] = nxt[tblend + 1];
295
296         tdata[curr++] = chk[tblend + 2];
297         tdata[curr++] = nxt[tblend + 2];
298
299         return tbl;
300 }
301
302
303 /** Make start_state_list table.
304  *  @return the newly allocated start_state_list table
305  */
306 static struct yytbl_data *mkssltbl (void)
307 {
308         struct yytbl_data *tbl = 0;
309         flex_int32_t *tdata = 0;
310         flex_int32_t i;
311
312         tbl = calloc(1, sizeof (struct yytbl_data));
313         yytbl_data_init (tbl, YYTD_ID_START_STATE_LIST);
314         tbl->td_flags = YYTD_DATA32 | YYTD_PTRANS;
315         tbl->td_hilen = 0;
316         tbl->td_lolen = (flex_uint32_t) (lastsc * 2 + 1);
317
318         tbl->td_data = tdata =
319                 calloc(tbl->td_lolen, sizeof (flex_int32_t));
320
321         for (i = 0; i <= lastsc * 2; ++i)
322                 tdata[i] = base[i];
323
324         buf_prints (&yydmap_buf,
325                     "\t{YYTD_ID_START_STATE_LIST, (void**)&yy_start_state_list, sizeof(%s)},\n",
326                     "struct yy_trans_info*");
327
328         return tbl;
329 }
330
331
332
333 /* genctbl - generates full speed compressed transition table */
334
335 void genctbl (void)
336 {
337         int i;
338         int     end_of_buffer_action = num_rules + 1;
339
340         /* Table of verify for transition and offset to next state. */
341         if (gentables)
342                 out_dec ("static const struct yy_trans_info yy_transition[%d] =\n    {\n", tblend + numecs + 1);
343         else
344                 outn ("static const struct yy_trans_info *yy_transition = 0;");
345
346         /* We want the transition to be represented as the offset to the
347          * next state, not the actual state number, which is what it currently
348          * is.  The offset is base[nxt[i]] - (base of current state)].  That's
349          * just the difference between the starting points of the two involved
350          * states (to - from).
351          *
352          * First, though, we need to find some way to put in our end-of-buffer
353          * flags and states.  We do this by making a state with absolutely no
354          * transitions.  We put it at the end of the table.
355          */
356
357         /* We need to have room in nxt/chk for two more slots: One for the
358          * action and one for the end-of-buffer transition.  We now *assume*
359          * that we're guaranteed the only character we'll try to index this
360          * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure
361          * there's room for jam entries for other characters.
362          */
363
364         while (tblend + 2 >= current_max_xpairs)
365                 expand_nxt_chk ();
366
367         while (lastdfa + 1 >= current_max_dfas)
368                 increase_max_dfas ();
369
370         base[lastdfa + 1] = tblend + 2;
371         nxt[tblend + 1] = end_of_buffer_action;
372         chk[tblend + 1] = numecs + 1;
373         chk[tblend + 2] = 1;    /* anything but EOB */
374
375         /* So that "make test" won't show arb. differences. */
376         nxt[tblend + 2] = 0;
377
378         /* Make sure every state has an end-of-buffer transition and an
379          * action #.
380          */
381         for (i = 0; i <= lastdfa; ++i) {
382                 int     anum = dfaacc[i].dfaacc_state;
383                 int     offset = base[i];
384
385                 chk[offset] = EOB_POSITION;
386                 chk[offset - 1] = ACTION_POSITION;
387                 nxt[offset - 1] = anum; /* action number */
388         }
389
390         for (i = 0; i <= tblend; ++i) {
391                 if (chk[i] == EOB_POSITION)
392                         transition_struct_out (0, base[lastdfa + 1] - i);
393
394                 else if (chk[i] == ACTION_POSITION)
395                         transition_struct_out (0, nxt[i]);
396
397                 else if (chk[i] > numecs || chk[i] == 0)
398                         transition_struct_out (0, 0);   /* unused slot */
399
400                 else            /* verify, transition */
401                         transition_struct_out (chk[i],
402                                                base[nxt[i]] - (i -
403                                                                chk[i]));
404         }
405
406
407         /* Here's the final, end-of-buffer state. */
408         transition_struct_out (chk[tblend + 1], nxt[tblend + 1]);
409         transition_struct_out (chk[tblend + 2], nxt[tblend + 2]);
410
411         if (gentables)
412                 outn ("    };\n");
413
414         /* Table of pointers to start states. */
415         if (gentables)
416                 out_dec ("static const struct yy_trans_info *yy_start_state_list[%d] =\n", lastsc * 2 + 1);
417         else
418                 outn ("static const struct yy_trans_info **yy_start_state_list =0;");
419
420         if (gentables) {
421                 outn ("    {");
422
423                 for (i = 0; i <= lastsc * 2; ++i)
424                         out_dec ("    &yy_transition[%d],\n", base[i]);
425
426                 dataend ();
427         }
428
429         if (useecs)
430                 genecs ();
431 }
432
433
434 /* mkecstbl - Make equivalence-class tables.  */
435
436 static struct yytbl_data *mkecstbl (void)
437 {
438         int i;
439         struct yytbl_data *tbl = 0;
440         flex_int32_t *tdata = 0;
441
442         tbl = calloc(1, sizeof (struct yytbl_data));
443         yytbl_data_init (tbl, YYTD_ID_EC);
444         tbl->td_flags |= YYTD_DATA32;
445         tbl->td_hilen = 0;
446         tbl->td_lolen = (flex_uint32_t) csize;
447
448         tbl->td_data = tdata =
449                 calloc(tbl->td_lolen, sizeof (flex_int32_t));
450
451         for (i = 1; i < csize; ++i) {
452                 ecgroup[i] = ABS (ecgroup[i]);
453                 tdata[i] = ecgroup[i];
454         }
455
456         buf_prints (&yydmap_buf,
457                     "\t{YYTD_ID_EC, (void**)&yy_ec, sizeof(%s)},\n",
458                     "YY_CHAR");
459
460         return tbl;
461 }
462
463 /* Generate equivalence-class tables. */
464
465 void genecs (void)
466 {
467         int i, j;
468         int     numrows;
469
470         out_str_dec (get_yy_char_decl (), "yy_ec", csize);
471
472         for (i = 1; i < csize; ++i) {
473                 ecgroup[i] = ABS (ecgroup[i]);
474                 mkdata (ecgroup[i]);
475         }
476
477         dataend ();
478
479         if (trace) {
480                 fputs (_("\n\nEquivalence Classes:\n\n"), stderr);
481
482                 numrows = csize / 8;
483
484                 for (j = 0; j < numrows; ++j) {
485                         for (i = j; i < csize; i = i + numrows) {
486                                 fprintf (stderr, "%4s = %-2d",
487                                          readable_form (i), ecgroup[i]);
488
489                                 putc (' ', stderr);
490                         }
491
492                         putc ('\n', stderr);
493                 }
494         }
495 }
496
497
498 /* Generate the code to find the action number. */
499
500 void gen_find_action (void)
501 {
502         if (fullspd)
503                 indent_puts ("yy_act = yy_current_state[-1].yy_nxt;");
504
505         else if (fulltbl)
506                 indent_puts ("yy_act = yy_accept[yy_current_state];");
507
508         else if (reject) {
509                 indent_puts ("yy_current_state = *--YY_G(yy_state_ptr);");
510                 indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];");
511
512                 if (!variable_trailing_context_rules)
513                         outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[[");
514                 if(reject_really_used)
515                         outn ("find_rule: /* we branch to this label when backing up */");
516                 if (!variable_trailing_context_rules)
517                         outn ("]])\n");
518
519                 indent_puts
520                         ("for ( ; ; ) /* until we find what rule we matched */");
521
522                 ++indent_level;
523
524                 indent_puts ("{");
525
526                 indent_puts
527                         ("if ( YY_G(yy_lp) && YY_G(yy_lp) < yy_accept[yy_current_state + 1] )");
528                 ++indent_level;
529                 indent_puts ("{");
530                 indent_puts ("yy_act = yy_acclist[YY_G(yy_lp)];");
531
532                 if (variable_trailing_context_rules) {
533                         indent_puts
534                                 ("if ( yy_act & YY_TRAILING_HEAD_MASK ||");
535                         indent_puts ("     YY_G(yy_looking_for_trail_begin) )");
536                         ++indent_level;
537                         indent_puts ("{");
538
539                         indent_puts
540                                 ("if ( yy_act == YY_G(yy_looking_for_trail_begin) )");
541                         ++indent_level;
542                         indent_puts ("{");
543                         indent_puts ("YY_G(yy_looking_for_trail_begin) = 0;");
544                         indent_puts ("yy_act &= ~YY_TRAILING_HEAD_MASK;");
545                         indent_puts ("break;");
546                         indent_puts ("}");
547                         --indent_level;
548
549                         indent_puts ("}");
550                         --indent_level;
551
552                         indent_puts
553                                 ("else if ( yy_act & YY_TRAILING_MASK )");
554                         ++indent_level;
555                         indent_puts ("{");
556                         indent_puts
557                                 ("YY_G(yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;");
558                         indent_puts
559                                 ("YY_G(yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;");
560
561                         if (real_reject) {
562                                 /* Remember matched text in case we back up
563                                  * due to REJECT.
564                                  */
565                                 indent_puts
566                                         ("YY_G(yy_full_match) = yy_cp;");
567                                 indent_puts
568                                         ("YY_G(yy_full_state) = YY_G(yy_state_ptr);");
569                                 indent_puts ("YY_G(yy_full_lp) = YY_G(yy_lp);");
570                         }
571
572                         indent_puts ("}");
573                         --indent_level;
574
575                         indent_puts ("else");
576                         ++indent_level;
577                         indent_puts ("{");
578                         indent_puts ("YY_G(yy_full_match) = yy_cp;");
579                         indent_puts
580                                 ("YY_G(yy_full_state) = YY_G(yy_state_ptr);");
581                         indent_puts ("YY_G(yy_full_lp) = YY_G(yy_lp);");
582                         indent_puts ("break;");
583                         indent_puts ("}");
584                         --indent_level;
585
586                         indent_puts ("++YY_G(yy_lp);");
587                         indent_puts ("goto find_rule;");
588                 }
589
590                 else {
591                         /* Remember matched text in case we back up due to
592                          * trailing context plus REJECT.
593                          */
594                         ++indent_level;
595                         indent_puts ("{");
596                         indent_puts ("YY_G(yy_full_match) = yy_cp;");
597                         indent_puts ("break;");
598                         indent_puts ("}");
599                         --indent_level;
600                 }
601
602                 indent_puts ("}");
603                 --indent_level;
604
605                 indent_puts ("--yy_cp;");
606
607                 /* We could consolidate the following two lines with those at
608                  * the beginning, but at the cost of complaints that we're
609                  * branching inside a loop.
610                  */
611                 indent_puts ("yy_current_state = *--YY_G(yy_state_ptr);");
612                 indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];");
613
614                 indent_puts ("}");
615
616                 --indent_level;
617         }
618
619         else {                  /* compressed */
620                 indent_puts ("yy_act = yy_accept[yy_current_state];");
621
622                 if (interactive && !reject) {
623                         /* Do the guaranteed-needed backing up to figure out
624                          * the match.
625                          */
626                         indent_puts ("if ( yy_act == 0 )");
627                         ++indent_level;
628                         indent_puts ("{ /* have to back up */");
629                         indent_puts
630                                 ("yy_cp = YY_G(yy_last_accepting_cpos);");
631                         indent_puts
632                                 ("yy_current_state = YY_G(yy_last_accepting_state);");
633                         indent_puts
634                                 ("yy_act = yy_accept[yy_current_state];");
635                         indent_puts ("}");
636                         --indent_level;
637                 }
638         }
639 }
640
641 /* mkftbl - make the full table and return the struct .
642  * you should call mkecstbl() after this.
643  */
644
645 struct yytbl_data *mkftbl (void)
646 {
647         int i;
648         int     end_of_buffer_action = num_rules + 1;
649         struct yytbl_data *tbl;
650         flex_int32_t *tdata = 0;
651
652         tbl = calloc(1, sizeof (struct yytbl_data));
653         yytbl_data_init (tbl, YYTD_ID_ACCEPT);
654         tbl->td_flags |= YYTD_DATA32;
655         tbl->td_hilen = 0;      /* it's a one-dimensional array */
656         tbl->td_lolen = (flex_uint32_t) (lastdfa + 1);
657
658         tbl->td_data = tdata =
659                 calloc(tbl->td_lolen, sizeof (flex_int32_t));
660
661         dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action;
662
663         for (i = 1; i <= lastdfa; ++i) {
664                 int anum = dfaacc[i].dfaacc_state;
665
666                 tdata[i] = anum;
667
668                 if (trace && anum)
669                         fprintf (stderr, _("state # %d accepts: [%d]\n"),
670                                  i, anum);
671         }
672
673         buf_prints (&yydmap_buf,
674                     "\t{YYTD_ID_ACCEPT, (void**)&yy_accept, sizeof(%s)},\n",
675                     long_align ? "flex_int32_t" : "flex_int16_t");
676         return tbl;
677 }
678
679
680 /* genftbl - generate full transition table */
681
682 void genftbl (void)
683 {
684         int i;
685         int     end_of_buffer_action = num_rules + 1;
686
687         out_str_dec (long_align ? get_int32_decl () : get_int16_decl (),
688                      "yy_accept", lastdfa + 1);
689
690         dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action;
691
692         for (i = 1; i <= lastdfa; ++i) {
693                 int anum = dfaacc[i].dfaacc_state;
694
695                 mkdata (anum);
696
697                 if (trace && anum)
698                         fprintf (stderr, _("state # %d accepts: [%d]\n"),
699                                  i, anum);
700         }
701
702         dataend ();
703
704         if (useecs)
705                 genecs ();
706
707         /* Don't have to dump the actual full table entries - they were
708          * created on-the-fly.
709          */
710 }
711
712
713 /* Generate the code to find the next compressed-table state. */
714
715 void gen_next_compressed_state (char *char_map)
716 {
717         indent_put2s ("YY_CHAR yy_c = %s;", char_map);
718
719         /* Save the backing-up info \before/ computing the next state
720          * because we always compute one more state than needed - we
721          * always proceed until we reach a jam state
722          */
723         gen_backing_up ();
724
725         indent_puts
726                 ("while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )");
727         ++indent_level;
728         indent_puts ("{");
729         indent_puts ("yy_current_state = (int) yy_def[yy_current_state];");
730
731         if (usemecs) {
732                 /* We've arrange it so that templates are never chained
733                  * to one another.  This means we can afford to make a
734                  * very simple test to see if we need to convert to
735                  * yy_c's meta-equivalence class without worrying
736                  * about erroneously looking up the meta-equivalence
737                  * class twice
738                  */
739                 do_indent ();
740
741                 /* lastdfa + 2 is the beginning of the templates */
742                 out_dec ("if ( yy_current_state >= %d )\n", lastdfa + 2);
743
744                 ++indent_level;
745                 indent_puts ("yy_c = yy_meta[yy_c];");
746                 --indent_level;
747         }
748
749         indent_puts ("}");
750         --indent_level;
751
752         indent_puts
753                 ("yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];");
754 }
755
756
757 /* Generate the code to find the next match. */
758
759 void gen_next_match (void)
760 {
761         /* NOTE - changes in here should be reflected in gen_next_state() and
762          * gen_NUL_trans().
763          */
764         char   *char_map = useecs ?
765                 "yy_ec[YY_SC_TO_UI(*yy_cp)] " : "YY_SC_TO_UI(*yy_cp)";
766
767         char   *char_map_2 = useecs ?
768                 "yy_ec[YY_SC_TO_UI(*++yy_cp)] " : "YY_SC_TO_UI(*++yy_cp)";
769
770         if (fulltbl) {
771                 if (gentables)
772                         indent_put2s
773                                 ("while ( (yy_current_state = yy_nxt[yy_current_state][ %s ]) > 0 )",
774                                  char_map);
775                 else
776                         indent_put2s
777                                 ("while ( (yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN +  %s ]) > 0 )",
778                                  char_map);
779
780                 ++indent_level;
781
782                 if (num_backing_up > 0) {
783                         indent_puts ("{");
784                         gen_backing_up ();
785                         outc ('\n');
786                 }
787
788                 indent_puts ("++yy_cp;");
789
790                 if (num_backing_up > 0)
791
792                         indent_puts ("}");
793
794                 --indent_level;
795
796                 outc ('\n');
797                 indent_puts ("yy_current_state = -yy_current_state;");
798         }
799
800         else if (fullspd) {
801                 indent_puts ("{");
802                 indent_puts
803                         ("const struct yy_trans_info *yy_trans_info;\n");
804                 indent_puts ("YY_CHAR yy_c;\n");
805                 indent_put2s ("for ( yy_c = %s;", char_map);
806                 indent_puts
807                         ("      (yy_trans_info = &yy_current_state[yy_c])->");
808                 indent_puts ("yy_verify == yy_c;");
809                 indent_put2s ("      yy_c = %s )", char_map_2);
810
811                 ++indent_level;
812
813                 if (num_backing_up > 0)
814                         indent_puts ("{");
815
816                 indent_puts ("yy_current_state += yy_trans_info->yy_nxt;");
817
818                 if (num_backing_up > 0) {
819                         outc ('\n');
820                         gen_backing_up ();
821                         indent_puts ("}");
822                 }
823
824                 --indent_level;
825                 indent_puts ("}");
826         }
827
828         else {                  /* compressed */
829                 indent_puts ("do");
830
831                 ++indent_level;
832                 indent_puts ("{");
833
834                 gen_next_state (false);
835
836                 indent_puts ("++yy_cp;");
837
838
839                 indent_puts ("}");
840                 --indent_level;
841
842                 do_indent ();
843
844                 if (interactive)
845                         out_dec ("while ( yy_base[yy_current_state] != %d );\n", jambase);
846                 else
847                         out_dec ("while ( yy_current_state != %d );\n",
848                                  jamstate);
849
850                 if (!reject && !interactive) {
851                         /* Do the guaranteed-needed backing up to figure out
852                          * the match.
853                          */
854                         indent_puts
855                                 ("yy_cp = YY_G(yy_last_accepting_cpos);");
856                         indent_puts
857                                 ("yy_current_state = YY_G(yy_last_accepting_state);");
858                 }
859         }
860 }
861
862
863 /* Generate the code to find the next state. */
864
865 void gen_next_state (int worry_about_NULs)
866 {                               /* NOTE - changes in here should be reflected in gen_next_match() */
867         char    char_map[256];
868
869         if (worry_about_NULs && !nultrans) {
870                 if (useecs)
871                         snprintf (char_map, sizeof(char_map),
872                                         "(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : %d)",
873                                         NUL_ec);
874                 else
875             snprintf (char_map, sizeof(char_map),
876                                         "(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)",
877                                         NUL_ec);
878         }
879
880         else
881                 strcpy (char_map, useecs ?
882                         "yy_ec[YY_SC_TO_UI(*yy_cp)] " :
883                         "YY_SC_TO_UI(*yy_cp)");
884
885         if (worry_about_NULs && nultrans) {
886                 if (!fulltbl && !fullspd)
887                         /* Compressed tables back up *before* they match. */
888                         gen_backing_up ();
889
890                 indent_puts ("if ( *yy_cp )");
891                 ++indent_level;
892                 indent_puts ("{");
893         }
894
895         if (fulltbl) {
896                 if (gentables)
897                         indent_put2s
898                                 ("yy_current_state = yy_nxt[yy_current_state][%s];",
899                                  char_map);
900                 else
901                         indent_put2s
902                                 ("yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %s];",
903                                  char_map);
904         }
905
906         else if (fullspd)
907                 indent_put2s
908                         ("yy_current_state += yy_current_state[%s].yy_nxt;",
909                          char_map);
910
911         else
912                 gen_next_compressed_state (char_map);
913
914         if (worry_about_NULs && nultrans) {
915
916                 indent_puts ("}");
917                 --indent_level;
918                 indent_puts ("else");
919                 ++indent_level;
920                 indent_puts
921                         ("yy_current_state = yy_NUL_trans[yy_current_state];");
922                 --indent_level;
923         }
924
925         if (fullspd || fulltbl)
926                 gen_backing_up ();
927
928         if (reject)
929                 indent_puts ("*YY_G(yy_state_ptr)++ = yy_current_state;");
930 }
931
932
933 /* Generate the code to make a NUL transition. */
934
935 void gen_NUL_trans (void)
936 {                               /* NOTE - changes in here should be reflected in gen_next_match() */
937         /* Only generate a definition for "yy_cp" if we'll generate code
938          * that uses it.  Otherwise lint and the like complain.
939          */
940         int     need_backing_up = (num_backing_up > 0 && !reject);
941
942         if (need_backing_up && (!nultrans || fullspd || fulltbl))
943                 /* We're going to need yy_cp lying around for the call
944                  * below to gen_backing_up().
945                  */
946                 indent_puts ("char *yy_cp = YY_G(yy_c_buf_p);");
947
948         outc ('\n');
949
950         if (nultrans) {
951                 indent_puts
952                         ("yy_current_state = yy_NUL_trans[yy_current_state];");
953                 indent_puts ("yy_is_jam = (yy_current_state == 0);");
954         }
955
956         else if (fulltbl) {
957                 do_indent ();
958                 if (gentables)
959                         out_dec ("yy_current_state = yy_nxt[yy_current_state][%d];\n", NUL_ec);
960                 else
961                         out_dec ("yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %d];\n", NUL_ec);
962                 indent_puts ("yy_is_jam = (yy_current_state <= 0);");
963         }
964
965         else if (fullspd) {
966                 do_indent ();
967                 out_dec ("int yy_c = %d;\n", NUL_ec);
968
969                 indent_puts
970                         ("const struct yy_trans_info *yy_trans_info;\n");
971                 indent_puts
972                         ("yy_trans_info = &yy_current_state[(unsigned int) yy_c];");
973                 indent_puts ("yy_current_state += yy_trans_info->yy_nxt;");
974
975                 indent_puts
976                         ("yy_is_jam = (yy_trans_info->yy_verify != yy_c);");
977         }
978
979         else {
980                 char    NUL_ec_str[20];
981
982                 snprintf (NUL_ec_str, sizeof(NUL_ec_str), "%d", NUL_ec);
983                 gen_next_compressed_state (NUL_ec_str);
984
985                 do_indent ();
986                 out_dec ("yy_is_jam = (yy_current_state == %d);\n",
987                          jamstate);
988
989                 if (reject) {
990                         /* Only stack this state if it's a transition we
991                          * actually make.  If we stack it on a jam, then
992                          * the state stack and yy_c_buf_p get out of sync.
993                          */
994                         indent_puts ("if ( ! yy_is_jam )");
995                         ++indent_level;
996                         indent_puts
997                                 ("*YY_G(yy_state_ptr)++ = yy_current_state;");
998                         --indent_level;
999                 }
1000         }
1001
1002         /* If we've entered an accepting state, back up; note that
1003          * compressed tables have *already* done such backing up, so
1004          * we needn't bother with it again.
1005          */
1006         if (need_backing_up && (fullspd || fulltbl)) {
1007                 outc ('\n');
1008                 indent_puts ("if ( ! yy_is_jam )");
1009                 ++indent_level;
1010                 indent_puts ("{");
1011                 gen_backing_up ();
1012                 indent_puts ("}");
1013                 --indent_level;
1014         }
1015 }
1016
1017
1018 /* Generate the code to find the start state. */
1019
1020 void gen_start_state (void)
1021 {
1022         if (fullspd) {
1023                 if (bol_needed) {
1024                         indent_puts
1025                                 ("yy_current_state = yy_start_state_list[YY_G(yy_start) + YY_AT_BOL()];");
1026                 }
1027                 else
1028                         indent_puts
1029                                 ("yy_current_state = yy_start_state_list[YY_G(yy_start)];");
1030         }
1031
1032         else {
1033                 indent_puts ("yy_current_state = YY_G(yy_start);");
1034
1035                 if (bol_needed)
1036                         indent_puts ("yy_current_state += YY_AT_BOL();");
1037
1038                 if (reject) {
1039                         /* Set up for storing up states. */
1040                         outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[[");
1041                         indent_puts
1042                                 ("YY_G(yy_state_ptr) = YY_G(yy_state_buf);");
1043                         indent_puts
1044                                 ("*YY_G(yy_state_ptr)++ = yy_current_state;");
1045                         outn ("]])");
1046                 }
1047         }
1048 }
1049
1050
1051 /* gentabs - generate data statements for the transition tables */
1052
1053 void gentabs (void)
1054 {
1055         int     i, j, k, *accset, nacc, *acc_array, total_states;
1056         int     end_of_buffer_action = num_rules + 1;
1057         struct yytbl_data *yyacc_tbl = 0, *yymeta_tbl = 0, *yybase_tbl = 0,
1058                 *yydef_tbl = 0, *yynxt_tbl = 0, *yychk_tbl = 0, *yyacclist_tbl=0;
1059         flex_int32_t *yyacc_data = 0, *yybase_data = 0, *yydef_data = 0,
1060                 *yynxt_data = 0, *yychk_data = 0, *yyacclist_data=0;
1061         flex_int32_t yybase_curr = 0, yyacclist_curr=0,yyacc_curr=0;
1062
1063         acc_array = allocate_integer_array (current_max_dfas);
1064         nummt = 0;
1065
1066         /* The compressed table format jams by entering the "jam state",
1067          * losing information about the previous state in the process.
1068          * In order to recover the previous state, we effectively need
1069          * to keep backing-up information.
1070          */
1071         ++num_backing_up;
1072
1073         if (reject) {
1074                 /* Write out accepting list and pointer list.
1075
1076                  * First we generate the "yy_acclist" array.  In the process,
1077                  * we compute the indices that will go into the "yy_accept"
1078                  * array, and save the indices in the dfaacc array.
1079                  */
1080                 int     EOB_accepting_list[2];
1081
1082                 /* Set up accepting structures for the End Of Buffer state. */
1083                 EOB_accepting_list[0] = 0;
1084                 EOB_accepting_list[1] = end_of_buffer_action;
1085                 accsiz[end_of_buffer_state] = 1;
1086                 dfaacc[end_of_buffer_state].dfaacc_set =
1087                         EOB_accepting_list;
1088
1089                 out_str_dec (long_align ? get_int32_decl () :
1090                              get_int16_decl (), "yy_acclist", MAX (numas,
1091                                                                    1) + 1);
1092         
1093         buf_prints (&yydmap_buf,
1094                 "\t{YYTD_ID_ACCLIST, (void**)&yy_acclist, sizeof(%s)},\n",
1095                 long_align ? "flex_int32_t" : "flex_int16_t");
1096
1097         yyacclist_tbl = calloc(1,sizeof(struct yytbl_data));
1098         yytbl_data_init (yyacclist_tbl, YYTD_ID_ACCLIST);
1099         yyacclist_tbl->td_lolen  = (flex_uint32_t) (MAX(numas,1) + 1);
1100         yyacclist_tbl->td_data = yyacclist_data = 
1101             calloc(yyacclist_tbl->td_lolen, sizeof (flex_int32_t));
1102         yyacclist_curr = 1;
1103
1104                 j = 1;          /* index into "yy_acclist" array */
1105
1106                 for (i = 1; i <= lastdfa; ++i) {
1107                         acc_array[i] = j;
1108
1109                         if (accsiz[i] != 0) {
1110                                 accset = dfaacc[i].dfaacc_set;
1111                                 nacc = accsiz[i];
1112
1113                                 if (trace)
1114                                         fprintf (stderr,
1115                                                  _("state # %d accepts: "),
1116                                                  i);
1117
1118                                 for (k = 1; k <= nacc; ++k) {
1119                                         int     accnum = accset[k];
1120
1121                                         ++j;
1122
1123                                         if (variable_trailing_context_rules
1124                                             && !(accnum &
1125                                                  YY_TRAILING_HEAD_MASK)
1126                                             && accnum > 0
1127                                             && accnum <= num_rules
1128                                             && rule_type[accnum] ==
1129                                             RULE_VARIABLE) {
1130                                                 /* Special hack to flag
1131                                                  * accepting number as part
1132                                                  * of trailing context rule.
1133                                                  */
1134                                                 accnum |= YY_TRAILING_MASK;
1135                                         }
1136
1137                                         mkdata (accnum);
1138                     yyacclist_data[yyacclist_curr++] = accnum;
1139
1140                                         if (trace) {
1141                                                 fprintf (stderr, "[%d]",
1142                                                          accset[k]);
1143
1144                                                 if (k < nacc)
1145                                                         fputs (", ",
1146                                                                stderr);
1147                                                 else
1148                                                         putc ('\n',
1149                                                               stderr);
1150                                         }
1151                                 }
1152                         }
1153                 }
1154
1155                 /* add accepting number for the "jam" state */
1156                 acc_array[i] = j;
1157
1158                 dataend ();
1159         if (tablesext) {
1160             yytbl_data_compress (yyacclist_tbl);
1161             if (yytbl_data_fwrite (&tableswr, yyacclist_tbl) < 0)
1162                 flexerror (_("Could not write yyacclist_tbl"));
1163             yytbl_data_destroy (yyacclist_tbl);
1164             yyacclist_tbl = NULL;
1165         }
1166         }
1167
1168         else {
1169                 dfaacc[end_of_buffer_state].dfaacc_state =
1170                         end_of_buffer_action;
1171
1172                 for (i = 1; i <= lastdfa; ++i)
1173                         acc_array[i] = dfaacc[i].dfaacc_state;
1174
1175                 /* add accepting number for jam state */
1176                 acc_array[i] = 0;
1177         }
1178
1179         /* Begin generating yy_accept */
1180
1181         /* Spit out "yy_accept" array.  If we're doing "reject", it'll be
1182          * pointers into the "yy_acclist" array.  Otherwise it's actual
1183          * accepting numbers.  In either case, we just dump the numbers.
1184          */
1185
1186         /* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays
1187          * beginning at 0 and for "jam" state.
1188          */
1189         k = lastdfa + 2;
1190
1191         if (reject)
1192                 /* We put a "cap" on the table associating lists of accepting
1193                  * numbers with state numbers.  This is needed because we tell
1194                  * where the end of an accepting list is by looking at where
1195                  * the list for the next state starts.
1196                  */
1197                 ++k;
1198
1199         out_str_dec (long_align ? get_int32_decl () : get_int16_decl (),
1200                      "yy_accept", k);
1201
1202         buf_prints (&yydmap_buf,
1203                     "\t{YYTD_ID_ACCEPT, (void**)&yy_accept, sizeof(%s)},\n",
1204                     long_align ? "flex_int32_t" : "flex_int16_t");
1205
1206         yyacc_tbl = calloc(1, sizeof (struct yytbl_data));
1207         yytbl_data_init (yyacc_tbl, YYTD_ID_ACCEPT);
1208         yyacc_tbl->td_lolen = (flex_uint32_t) k;
1209         yyacc_tbl->td_data = yyacc_data =
1210                 calloc(yyacc_tbl->td_lolen, sizeof (flex_int32_t));
1211     yyacc_curr=1;
1212
1213         for (i = 1; i <= lastdfa; ++i) {
1214                 mkdata (acc_array[i]);
1215                 yyacc_data[yyacc_curr++] = acc_array[i];
1216
1217                 if (!reject && trace && acc_array[i])
1218                         fprintf (stderr, _("state # %d accepts: [%d]\n"),
1219                                  i, acc_array[i]);
1220         }
1221
1222         /* Add entry for "jam" state. */
1223         mkdata (acc_array[i]);
1224         yyacc_data[yyacc_curr++] = acc_array[i];
1225
1226         if (reject) {
1227                 /* Add "cap" for the list. */
1228                 mkdata (acc_array[i]);
1229                 yyacc_data[yyacc_curr++] = acc_array[i];
1230         }
1231
1232         dataend ();
1233         if (tablesext) {
1234                 yytbl_data_compress (yyacc_tbl);
1235                 if (yytbl_data_fwrite (&tableswr, yyacc_tbl) < 0)
1236                         flexerror (_("Could not write yyacc_tbl"));
1237                 yytbl_data_destroy (yyacc_tbl);
1238                 yyacc_tbl = NULL;
1239         }
1240         /* End generating yy_accept */
1241
1242         if (useecs) {
1243
1244                 genecs ();
1245                 if (tablesext) {
1246                         struct yytbl_data *tbl;
1247
1248                         tbl = mkecstbl ();
1249                         yytbl_data_compress (tbl);
1250                         if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1251                                 flexerror (_("Could not write ecstbl"));
1252                         yytbl_data_destroy (tbl);
1253                         tbl = 0;
1254                 }
1255         }
1256
1257         if (usemecs) {
1258                 /* Begin generating yy_meta */
1259                 /* Write out meta-equivalence classes (used to index
1260                  * templates with).
1261                  */
1262                 flex_int32_t *yymecs_data = 0;
1263                 yymeta_tbl = calloc(1, sizeof (struct yytbl_data));
1264                 yytbl_data_init (yymeta_tbl, YYTD_ID_META);
1265                 yymeta_tbl->td_lolen = (flex_uint32_t) (numecs + 1);
1266                 yymeta_tbl->td_data = yymecs_data =
1267                         calloc(yymeta_tbl->td_lolen,
1268                                             sizeof (flex_int32_t));
1269
1270                 if (trace)
1271                         fputs (_("\n\nMeta-Equivalence Classes:\n"),
1272                                stderr);
1273
1274                 out_str_dec (get_yy_char_decl (), "yy_meta", numecs + 1);
1275                 buf_prints (&yydmap_buf,
1276                             "\t{YYTD_ID_META, (void**)&yy_meta, sizeof(%s)},\n",
1277                             "YY_CHAR");
1278
1279                 for (i = 1; i <= numecs; ++i) {
1280                         if (trace)
1281                                 fprintf (stderr, "%d = %d\n",
1282                                          i, ABS (tecbck[i]));
1283
1284                         mkdata (ABS (tecbck[i]));
1285                         yymecs_data[i] = ABS (tecbck[i]);
1286                 }
1287
1288                 dataend ();
1289                 if (tablesext) {
1290                         yytbl_data_compress (yymeta_tbl);
1291                         if (yytbl_data_fwrite (&tableswr, yymeta_tbl) < 0)
1292                                 flexerror (_
1293                                            ("Could not write yymeta_tbl"));
1294                         yytbl_data_destroy (yymeta_tbl);
1295                         yymeta_tbl = NULL;
1296                 }
1297                 /* End generating yy_meta */
1298         }
1299
1300         total_states = lastdfa + numtemps;
1301
1302         /* Begin generating yy_base */
1303         out_str_dec ((tblend >= INT16_MAX || long_align) ?
1304                      get_int32_decl () : get_int16_decl (),
1305                      "yy_base", total_states + 1);
1306
1307         buf_prints (&yydmap_buf,
1308                     "\t{YYTD_ID_BASE, (void**)&yy_base, sizeof(%s)},\n",
1309                     (tblend >= INT16_MAX
1310                      || long_align) ? "flex_int32_t" : "flex_int16_t");
1311         yybase_tbl = calloc (1, sizeof (struct yytbl_data));
1312         yytbl_data_init (yybase_tbl, YYTD_ID_BASE);
1313         yybase_tbl->td_lolen = (flex_uint32_t) (total_states + 1);
1314         yybase_tbl->td_data = yybase_data =
1315                 calloc(yybase_tbl->td_lolen,
1316                                     sizeof (flex_int32_t));
1317         yybase_curr = 1;
1318
1319         for (i = 1; i <= lastdfa; ++i) {
1320                 int d = def[i];
1321
1322                 if (base[i] == JAMSTATE)
1323                         base[i] = jambase;
1324
1325                 if (d == JAMSTATE)
1326                         def[i] = jamstate;
1327
1328                 else if (d < 0) {
1329                         /* Template reference. */
1330                         ++tmpuses;
1331                         def[i] = lastdfa - d + 1;
1332                 }
1333
1334                 mkdata (base[i]);
1335                 yybase_data[yybase_curr++] = base[i];
1336         }
1337
1338         /* Generate jam state's base index. */
1339         mkdata (base[i]);
1340         yybase_data[yybase_curr++] = base[i];
1341
1342         for (++i /* skip jam state */ ; i <= total_states; ++i) {
1343                 mkdata (base[i]);
1344                 yybase_data[yybase_curr++] = base[i];
1345                 def[i] = jamstate;
1346         }
1347
1348         dataend ();
1349         if (tablesext) {
1350                 yytbl_data_compress (yybase_tbl);
1351                 if (yytbl_data_fwrite (&tableswr, yybase_tbl) < 0)
1352                         flexerror (_("Could not write yybase_tbl"));
1353                 yytbl_data_destroy (yybase_tbl);
1354                 yybase_tbl = NULL;
1355         }
1356         /* End generating yy_base */
1357
1358
1359         /* Begin generating yy_def */
1360         out_str_dec ((total_states >= INT16_MAX || long_align) ?
1361                      get_int32_decl () : get_int16_decl (),
1362                      "yy_def", total_states + 1);
1363
1364         buf_prints (&yydmap_buf,
1365                     "\t{YYTD_ID_DEF, (void**)&yy_def, sizeof(%s)},\n",
1366                     (total_states >= INT16_MAX
1367                      || long_align) ? "flex_int32_t" : "flex_int16_t");
1368
1369         yydef_tbl = calloc(1, sizeof (struct yytbl_data));
1370         yytbl_data_init (yydef_tbl, YYTD_ID_DEF);
1371         yydef_tbl->td_lolen = (flex_uint32_t) (total_states + 1);
1372         yydef_tbl->td_data = yydef_data =
1373                 calloc(yydef_tbl->td_lolen, sizeof (flex_int32_t));
1374
1375         for (i = 1; i <= total_states; ++i) {
1376                 mkdata (def[i]);
1377                 yydef_data[i] = def[i];
1378         }
1379
1380         dataend ();
1381         if (tablesext) {
1382                 yytbl_data_compress (yydef_tbl);
1383                 if (yytbl_data_fwrite (&tableswr, yydef_tbl) < 0)
1384                         flexerror (_("Could not write yydef_tbl"));
1385                 yytbl_data_destroy (yydef_tbl);
1386                 yydef_tbl = NULL;
1387         }
1388         /* End generating yy_def */
1389
1390
1391         /* Begin generating yy_nxt */
1392         out_str_dec ((total_states >= INT16_MAX || long_align) ?
1393                      get_int32_decl () : get_int16_decl (), "yy_nxt",
1394                      tblend + 1);
1395
1396         buf_prints (&yydmap_buf,
1397                     "\t{YYTD_ID_NXT, (void**)&yy_nxt, sizeof(%s)},\n",
1398                     (total_states >= INT16_MAX
1399                      || long_align) ? "flex_int32_t" : "flex_int16_t");
1400
1401         yynxt_tbl = calloc (1, sizeof (struct yytbl_data));
1402         yytbl_data_init (yynxt_tbl, YYTD_ID_NXT);
1403         yynxt_tbl->td_lolen = (flex_uint32_t) (tblend + 1);
1404         yynxt_tbl->td_data = yynxt_data =
1405                 calloc (yynxt_tbl->td_lolen, sizeof (flex_int32_t));
1406
1407         for (i = 1; i <= tblend; ++i) {
1408                 /* Note, the order of the following test is important.
1409                  * If chk[i] is 0, then nxt[i] is undefined.
1410                  */
1411                 if (chk[i] == 0 || nxt[i] == 0)
1412                         nxt[i] = jamstate;      /* new state is the JAM state */
1413
1414                 mkdata (nxt[i]);
1415                 yynxt_data[i] = nxt[i];
1416         }
1417
1418         dataend ();
1419         if (tablesext) {
1420                 yytbl_data_compress (yynxt_tbl);
1421                 if (yytbl_data_fwrite (&tableswr, yynxt_tbl) < 0)
1422                         flexerror (_("Could not write yynxt_tbl"));
1423                 yytbl_data_destroy (yynxt_tbl);
1424                 yynxt_tbl = NULL;
1425         }
1426         /* End generating yy_nxt */
1427
1428         /* Begin generating yy_chk */
1429         out_str_dec ((total_states >= INT16_MAX || long_align) ?
1430                      get_int32_decl () : get_int16_decl (), "yy_chk",
1431                      tblend + 1);
1432
1433         buf_prints (&yydmap_buf,
1434                     "\t{YYTD_ID_CHK, (void**)&yy_chk, sizeof(%s)},\n",
1435                     (total_states >= INT16_MAX
1436                      || long_align) ? "flex_int32_t" : "flex_int16_t");
1437
1438         yychk_tbl = calloc (1, sizeof (struct yytbl_data));
1439         yytbl_data_init (yychk_tbl, YYTD_ID_CHK);
1440         yychk_tbl->td_lolen = (flex_uint32_t) (tblend + 1);
1441         yychk_tbl->td_data = yychk_data =
1442                 calloc(yychk_tbl->td_lolen, sizeof (flex_int32_t));
1443
1444         for (i = 1; i <= tblend; ++i) {
1445                 if (chk[i] == 0)
1446                         ++nummt;
1447
1448                 mkdata (chk[i]);
1449                 yychk_data[i] = chk[i];
1450         }
1451
1452         dataend ();
1453         if (tablesext) {
1454                 yytbl_data_compress (yychk_tbl);
1455                 if (yytbl_data_fwrite (&tableswr, yychk_tbl) < 0)
1456                         flexerror (_("Could not write yychk_tbl"));
1457                 yytbl_data_destroy (yychk_tbl);
1458                 yychk_tbl = NULL;
1459         }
1460         /* End generating yy_chk */
1461
1462         free(acc_array);
1463 }
1464
1465
1466 /* Write out a formatted string (with a secondary string argument) at the
1467  * current indentation level, adding a final newline.
1468  */
1469
1470 void indent_put2s (const char *fmt, const char *arg)
1471 {
1472         do_indent ();
1473         out_str (fmt, arg);
1474         outn ("");
1475 }
1476
1477
1478 /* Write out a string at the current indentation level, adding a final
1479  * newline.
1480  */
1481
1482 void indent_puts (const char *str)
1483 {
1484         do_indent ();
1485         outn (str);
1486 }
1487
1488
1489 /* make_tables - generate transition tables and finishes generating output file
1490  */
1491
1492 void make_tables (void)
1493 {
1494         int i;
1495         int did_eof_rule = false;
1496         struct yytbl_data *yynultrans_tbl = NULL;
1497
1498
1499         skelout ();             /* %% [2.0] - break point in skel */
1500
1501         /* First, take care of YY_DO_BEFORE_ACTION depending on yymore
1502          * being used.
1503          */
1504         set_indent (1);
1505
1506         if (yymore_used && !yytext_is_array) {
1507                 indent_puts ("YY_G(yytext_ptr) -= YY_G(yy_more_len); \\");
1508                 indent_puts
1509                         ("yyleng = (int) (yy_cp - YY_G(yytext_ptr)); \\");
1510         }
1511
1512         else
1513                 indent_puts ("yyleng = (int) (yy_cp - yy_bp); \\");
1514
1515         /* Now also deal with copying yytext_ptr to yytext if needed. */
1516         skelout ();             /* %% [3.0] - break point in skel */
1517         if (yytext_is_array) {
1518                 if (yymore_used)
1519                         indent_puts
1520                                 ("if ( yyleng + YY_G(yy_more_offset) >= YYLMAX ) \\");
1521                 else
1522                         indent_puts ("if ( yyleng >= YYLMAX ) \\");
1523
1524                 ++indent_level;
1525                 indent_puts
1526                         ("YY_FATAL_ERROR( \"token too large, exceeds YYLMAX\" ); \\");
1527                 --indent_level;
1528
1529                 if (yymore_used) {
1530                         indent_puts
1531                                 ("yy_flex_strncpy( &yytext[YY_G(yy_more_offset)], YY_G(yytext_ptr), yyleng + 1 M4_YY_CALL_LAST_ARG); \\");
1532                         indent_puts ("yyleng += YY_G(yy_more_offset); \\");
1533                         indent_puts
1534                                 ("YY_G(yy_prev_more_offset) = YY_G(yy_more_offset); \\");
1535                         indent_puts ("YY_G(yy_more_offset) = 0; \\");
1536                 }
1537                 else {
1538                         indent_puts
1539                                 ("yy_flex_strncpy( yytext, YY_G(yytext_ptr), yyleng + 1 M4_YY_CALL_LAST_ARG); \\");
1540                 }
1541         }
1542
1543         set_indent (0);
1544
1545         skelout ();             /* %% [4.0] - break point in skel */
1546
1547
1548         /* This is where we REALLY begin generating the tables. */
1549
1550         out_dec ("#define YY_NUM_RULES %d\n", num_rules);
1551         out_dec ("#define YY_END_OF_BUFFER %d\n", num_rules + 1);
1552
1553         if (fullspd) {
1554                 /* Need to define the transet type as a size large
1555                  * enough to hold the biggest offset.
1556                  */
1557                 int     total_table_size = tblend + numecs + 1;
1558                 char   *trans_offset_type =
1559                         (total_table_size >= INT16_MAX || long_align) ?
1560                         "flex_int32_t" : "flex_int16_t";
1561
1562                 set_indent (0);
1563                 indent_puts ("struct yy_trans_info");
1564                 ++indent_level;
1565                 indent_puts ("{");
1566
1567                 /* We require that yy_verify and yy_nxt must be of the same size int. */
1568                 indent_put2s ("%s yy_verify;", trans_offset_type);
1569
1570                 /* In cases where its sister yy_verify *is* a "yes, there is
1571                  * a transition", yy_nxt is the offset (in records) to the
1572                  * next state.  In most cases where there is no transition,
1573                  * the value of yy_nxt is irrelevant.  If yy_nxt is the -1th
1574                  * record of a state, though, then yy_nxt is the action number
1575                  * for that state.
1576                  */
1577
1578                 indent_put2s ("%s yy_nxt;", trans_offset_type);
1579                 indent_puts ("};");
1580                 --indent_level;
1581         }
1582         else {
1583                 /* We generate a bogus 'struct yy_trans_info' data type
1584                  * so we can guarantee that it is always declared in the skel.
1585                  * This is so we can compile "sizeof(struct yy_trans_info)"
1586                  * in any scanner.
1587                  */
1588                 indent_puts
1589                         ("/* This struct is not used in this scanner,");
1590                 indent_puts ("   but its presence is necessary. */");
1591                 indent_puts ("struct yy_trans_info");
1592                 ++indent_level;
1593                 indent_puts ("{");
1594                 indent_puts ("flex_int32_t yy_verify;");
1595                 indent_puts ("flex_int32_t yy_nxt;");
1596                 indent_puts ("};");
1597                 --indent_level;
1598         }
1599
1600         if (fullspd) {
1601                 genctbl ();
1602                 if (tablesext) {
1603                         struct yytbl_data *tbl;
1604
1605                         tbl = mkctbl ();
1606                         yytbl_data_compress (tbl);
1607                         if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1608                                 flexerror (_("Could not write ftbl"));
1609                         yytbl_data_destroy (tbl);
1610
1611                         tbl = mkssltbl ();
1612                         yytbl_data_compress (tbl);
1613                         if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1614                                 flexerror (_("Could not write ssltbl"));
1615                         yytbl_data_destroy (tbl);
1616                         tbl = 0;
1617
1618                         if (useecs) {
1619                                 tbl = mkecstbl ();
1620                                 yytbl_data_compress (tbl);
1621                                 if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1622                                         flexerror (_
1623                                                    ("Could not write ecstbl"));
1624                                 yytbl_data_destroy (tbl);
1625                                 tbl = 0;
1626                         }
1627                 }
1628         }
1629         else if (fulltbl) {
1630                 genftbl ();
1631                 if (tablesext) {
1632                         struct yytbl_data *tbl;
1633
1634                         tbl = mkftbl ();
1635                         yytbl_data_compress (tbl);
1636                         if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1637                                 flexerror (_("Could not write ftbl"));
1638                         yytbl_data_destroy (tbl);
1639                         tbl = 0;
1640
1641                         if (useecs) {
1642                                 tbl = mkecstbl ();
1643                                 yytbl_data_compress (tbl);
1644                                 if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1645                                         flexerror (_
1646                                                    ("Could not write ecstbl"));
1647                                 yytbl_data_destroy (tbl);
1648                                 tbl = 0;
1649                         }
1650                 }
1651         }
1652         else
1653                 gentabs ();
1654
1655         if (do_yylineno) {
1656
1657                 geneoltbl ();
1658
1659                 if (tablesext) {
1660                         struct yytbl_data *tbl;
1661
1662                         tbl = mkeoltbl ();
1663                         yytbl_data_compress (tbl);
1664                         if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1665                                 flexerror (_("Could not write eoltbl"));
1666                         yytbl_data_destroy (tbl);
1667                         tbl = 0;
1668                 }
1669         }
1670
1671         /* Definitions for backing up.  We don't need them if REJECT
1672          * is being used because then we use an alternative backin-up
1673          * technique instead.
1674          */
1675         if (num_backing_up > 0 && !reject) {
1676                 if (!C_plus_plus && !reentrant) {
1677                         indent_puts
1678                                 ("static yy_state_type yy_last_accepting_state;");
1679                         indent_puts
1680                                 ("static char *yy_last_accepting_cpos;\n");
1681                 }
1682         }
1683
1684         if (nultrans) {
1685                 flex_int32_t *yynultrans_data = 0;
1686
1687                 /* Begin generating yy_NUL_trans */
1688                 out_str_dec (get_state_decl (), "yy_NUL_trans",
1689                              lastdfa + 1);
1690                 buf_prints (&yydmap_buf,
1691                             "\t{YYTD_ID_NUL_TRANS, (void**)&yy_NUL_trans, sizeof(%s)},\n",
1692                             (fullspd) ? "struct yy_trans_info*" :
1693                             "flex_int32_t");
1694
1695                 yynultrans_tbl = calloc(1, sizeof (struct yytbl_data));
1696                 yytbl_data_init (yynultrans_tbl, YYTD_ID_NUL_TRANS);
1697                 if (fullspd)
1698                         yynultrans_tbl->td_flags |= YYTD_PTRANS;
1699                 yynultrans_tbl->td_lolen = (flex_uint32_t) (lastdfa + 1);
1700                 yynultrans_tbl->td_data = yynultrans_data =
1701                         calloc(yynultrans_tbl->td_lolen,
1702                                             sizeof (flex_int32_t));
1703
1704                 for (i = 1; i <= lastdfa; ++i) {
1705                         if (fullspd) {
1706                                 out_dec ("    &yy_transition[%d],\n",
1707                                          base[i]);
1708                                 yynultrans_data[i] = base[i];
1709                         }
1710                         else {
1711                                 mkdata (nultrans[i]);
1712                                 yynultrans_data[i] = nultrans[i];
1713                         }
1714                 }
1715
1716                 dataend ();
1717                 if (tablesext) {
1718                         yytbl_data_compress (yynultrans_tbl);
1719                         if (yytbl_data_fwrite (&tableswr, yynultrans_tbl) <
1720                             0)
1721                                 flexerror (_
1722                                            ("Could not write yynultrans_tbl"));
1723                 }
1724
1725                 if (yynultrans_tbl != NULL) {
1726                         yytbl_data_destroy (yynultrans_tbl);
1727                         yynultrans_tbl = NULL;
1728         }
1729
1730                 /* End generating yy_NUL_trans */
1731         }
1732
1733         if (!C_plus_plus && !reentrant) {
1734                 indent_puts ("extern int yy_flex_debug;");
1735                 indent_put2s ("int yy_flex_debug = %s;\n",
1736                               ddebug ? "1" : "0");
1737         }
1738
1739         if (ddebug) {           /* Spit out table mapping rules to line numbers. */
1740                 out_str_dec (long_align ? get_int32_decl () :
1741                              get_int16_decl (), "yy_rule_linenum",
1742                              num_rules);
1743                 for (i = 1; i < num_rules; ++i)
1744                         mkdata (rule_linenum[i]);
1745                 dataend ();
1746         }
1747
1748         if (reject) {
1749                 outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[[");
1750                 /* Declare state buffer variables. */
1751                 if (!C_plus_plus && !reentrant) {
1752                         outn ("static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;");
1753                         outn ("static char *yy_full_match;");
1754                         outn ("static int yy_lp;");
1755                 }
1756
1757                 if (variable_trailing_context_rules) {
1758                         if (!C_plus_plus && !reentrant) {
1759                                 outn ("static int yy_looking_for_trail_begin = 0;");
1760                                 outn ("static int yy_full_lp;");
1761                                 outn ("static int *yy_full_state;");
1762                         }
1763
1764                         out_hex ("#define YY_TRAILING_MASK 0x%x\n",
1765                                  (unsigned int) YY_TRAILING_MASK);
1766                         out_hex ("#define YY_TRAILING_HEAD_MASK 0x%x\n",
1767                                  (unsigned int) YY_TRAILING_HEAD_MASK);
1768                 }
1769
1770                 outn ("#define REJECT \\");
1771                 outn ("{ \\");
1772                 outn ("*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */ \\");
1773                 outn ("yy_cp = YY_G(yy_full_match); /* restore poss. backed-over text */ \\");
1774
1775                 if (variable_trailing_context_rules) {
1776                         outn ("YY_G(yy_lp) = YY_G(yy_full_lp); /* restore orig. accepting pos. */ \\");
1777                         outn ("YY_G(yy_state_ptr) = YY_G(yy_full_state); /* restore orig. state */ \\");
1778                         outn ("yy_current_state = *YY_G(yy_state_ptr); /* restore curr. state */ \\");
1779                 }
1780
1781                 outn ("++YY_G(yy_lp); \\");
1782                 outn ("goto find_rule; \\");
1783
1784                 outn ("}");
1785                 outn ("]])\n");
1786         }
1787
1788         else {
1789                 outn ("/* The intent behind this definition is that it'll catch");
1790                 outn (" * any uses of REJECT which flex missed.");
1791                 outn (" */");
1792                 outn ("#define REJECT reject_used_but_not_detected");
1793         }
1794
1795         if (yymore_used) {
1796                 if (!C_plus_plus) {
1797                         if (yytext_is_array) {
1798                                 if (!reentrant){
1799                                 indent_puts ("static int yy_more_offset = 0;");
1800                     indent_puts ("static int yy_prev_more_offset = 0;");
1801                 }
1802                         }
1803                         else if (!reentrant) {
1804                                 indent_puts
1805                                         ("static int yy_more_flag = 0;");
1806                                 indent_puts
1807                                         ("static int yy_more_len = 0;");
1808                         }
1809                 }
1810
1811                 if (yytext_is_array) {
1812                         indent_puts
1813                                 ("#define yymore() (YY_G(yy_more_offset) = yy_flex_strlen( yytext M4_YY_CALL_LAST_ARG))");
1814                         indent_puts ("#define YY_NEED_STRLEN");
1815                         indent_puts ("#define YY_MORE_ADJ 0");
1816                         indent_puts
1817                                 ("#define YY_RESTORE_YY_MORE_OFFSET \\");
1818                         ++indent_level;
1819                         indent_puts ("{ \\");
1820                         indent_puts
1821                                 ("YY_G(yy_more_offset) = YY_G(yy_prev_more_offset); \\");
1822                         indent_puts ("yyleng -= YY_G(yy_more_offset); \\");
1823                         indent_puts ("}");
1824                         --indent_level;
1825                 }
1826                 else {
1827                         indent_puts
1828                                 ("#define yymore() (YY_G(yy_more_flag) = 1)");
1829                         indent_puts
1830                                 ("#define YY_MORE_ADJ YY_G(yy_more_len)");
1831                         indent_puts ("#define YY_RESTORE_YY_MORE_OFFSET");
1832                 }
1833         }
1834
1835         else {
1836                 indent_puts
1837                         ("#define yymore() yymore_used_but_not_detected");
1838                 indent_puts ("#define YY_MORE_ADJ 0");
1839                 indent_puts ("#define YY_RESTORE_YY_MORE_OFFSET");
1840         }
1841
1842         if (!C_plus_plus) {
1843                 if (yytext_is_array) {
1844                         outn ("#ifndef YYLMAX");
1845                         outn ("#define YYLMAX 8192");
1846                         outn ("#endif\n");
1847                         if (!reentrant){
1848                 outn ("char yytext[YYLMAX];");
1849                 outn ("char *yytext_ptr;");
1850             }
1851                 }
1852
1853                 else {
1854                         if(! reentrant)
1855                 outn ("char *yytext;");
1856                 }
1857         }
1858
1859         out (&action_array[defs1_offset]);
1860
1861         line_directive_out (stdout, 0);
1862
1863         skelout ();             /* %% [5.0] - break point in skel */
1864
1865         if (!C_plus_plus) {
1866                 if (use_read) {
1867                         outn ("\terrno=0; \\");
1868                         outn ("\twhile ( (result = (int) read( fileno(yyin), buf, (yy_size_t) max_size )) < 0 ) \\");
1869                         outn ("\t{ \\");
1870                         outn ("\t\tif( errno != EINTR) \\");
1871                         outn ("\t\t{ \\");
1872                         outn ("\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\");
1873                         outn ("\t\t\tbreak; \\");
1874                         outn ("\t\t} \\");
1875                         outn ("\t\terrno=0; \\");
1876                         outn ("\t\tclearerr(yyin); \\");
1877                         outn ("\t}\\");
1878                 }
1879
1880                 else {
1881                         outn ("\tif ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \\");
1882                         outn ("\t\t{ \\");
1883                         outn ("\t\tint c = '*'; \\");
1884                         outn ("\t\tint n; \\");
1885                         outn ("\t\tfor ( n = 0; n < max_size && \\");
1886                         outn ("\t\t\t     (c = getc( yyin )) != EOF && c != '\\n'; ++n ) \\");
1887                         outn ("\t\t\tbuf[n] = (char) c; \\");
1888                         outn ("\t\tif ( c == '\\n' ) \\");
1889                         outn ("\t\t\tbuf[n++] = (char) c; \\");
1890                         outn ("\t\tif ( c == EOF && ferror( yyin ) ) \\");
1891                         outn ("\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\");
1892                         outn ("\t\tresult = n; \\");
1893                         outn ("\t\t} \\");
1894                         outn ("\telse \\");
1895                         outn ("\t\t{ \\");
1896                         outn ("\t\terrno=0; \\");
1897                         outn ("\t\twhile ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \\");
1898                         outn ("\t\t\t{ \\");
1899                         outn ("\t\t\tif( errno != EINTR) \\");
1900                         outn ("\t\t\t\t{ \\");
1901                         outn ("\t\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\");
1902                         outn ("\t\t\t\tbreak; \\");
1903                         outn ("\t\t\t\t} \\");
1904                         outn ("\t\t\terrno=0; \\");
1905                         outn ("\t\t\tclearerr(yyin); \\");
1906                         outn ("\t\t\t} \\");
1907                         outn ("\t\t}\\");
1908                 }
1909         }
1910
1911         skelout ();             /* %% [6.0] - break point in skel */
1912
1913         indent_puts ("#define YY_RULE_SETUP \\");
1914         ++indent_level;
1915         if (bol_needed) {
1916                 indent_puts ("if ( yyleng > 0 ) \\");
1917                 ++indent_level;
1918                 indent_puts ("YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \\");
1919                 indent_puts ("\t\t(yytext[yyleng - 1] == '\\n'); \\");
1920                 --indent_level;
1921         }
1922         indent_puts ("YY_USER_ACTION");
1923         --indent_level;
1924
1925         skelout ();             /* %% [7.0] - break point in skel */
1926
1927         /* Copy prolog to output file. */
1928         out (&action_array[prolog_offset]);
1929
1930         line_directive_out (stdout, 0);
1931
1932         skelout ();             /* %% [8.0] - break point in skel */
1933
1934         set_indent (2);
1935
1936         if (yymore_used && !yytext_is_array) {
1937                 indent_puts ("YY_G(yy_more_len) = 0;");
1938                 indent_puts ("if ( YY_G(yy_more_flag) )");
1939                 ++indent_level;
1940                 indent_puts ("{");
1941                 indent_puts
1942                         ("YY_G(yy_more_len) = (int) (YY_G(yy_c_buf_p) - YY_G(yytext_ptr));");
1943                 indent_puts ("YY_G(yy_more_flag) = 0;");
1944                 indent_puts ("}");
1945                 --indent_level;
1946         }
1947
1948         skelout ();             /* %% [9.0] - break point in skel */
1949
1950         gen_start_state ();
1951
1952         /* Note, don't use any indentation. */
1953         outn ("yy_match:");
1954         gen_next_match ();
1955
1956         skelout ();             /* %% [10.0] - break point in skel */
1957         set_indent (2);
1958         gen_find_action ();
1959
1960         skelout ();             /* %% [11.0] - break point in skel */
1961         outn ("m4_ifdef( [[M4_YY_USE_LINENO]],[[");
1962         indent_puts
1963                 ("if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )");
1964         ++indent_level;
1965         indent_puts ("{");
1966         indent_puts ("int yyl;");
1967         do_indent ();
1968         out_str ("for ( yyl = %s; yyl < yyleng; ++yyl )\n",
1969                  yymore_used ? (yytext_is_array ? "YY_G(yy_prev_more_offset)" :
1970                                 "YY_G(yy_more_len)") : "0");
1971         ++indent_level;
1972         indent_puts ("if ( yytext[yyl] == '\\n' )");
1973         ++indent_level;
1974         indent_puts ("M4_YY_INCR_LINENO();");
1975         --indent_level;
1976         --indent_level;
1977         indent_puts ("}");
1978         --indent_level;
1979         outn ("]])");
1980
1981         skelout ();             /* %% [12.0] - break point in skel */
1982         if (ddebug) {
1983                 indent_puts ("if ( yy_flex_debug )");
1984                 ++indent_level;
1985
1986                 indent_puts ("{");
1987                 indent_puts ("if ( yy_act == 0 )");
1988                 ++indent_level;
1989                 indent_puts (C_plus_plus ?
1990                              "std::cerr << \"--scanner backing up\\n\";" :
1991                              "fprintf( stderr, \"--scanner backing up\\n\" );");
1992                 --indent_level;
1993
1994                 do_indent ();
1995                 out_dec ("else if ( yy_act < %d )\n", num_rules);
1996                 ++indent_level;
1997
1998                 if (C_plus_plus) {
1999                         indent_puts
2000                                 ("std::cerr << \"--accepting rule at line \" << yy_rule_linenum[yy_act] <<");
2001                         indent_puts
2002                                 ("         \"(\\\"\" << yytext << \"\\\")\\n\";");
2003                 }
2004                 else {
2005                         indent_puts
2006                                 ("fprintf( stderr, \"--accepting rule at line %ld (\\\"%s\\\")\\n\",");
2007
2008                         indent_puts
2009                                 ("         (long)yy_rule_linenum[yy_act], yytext );");
2010                 }
2011
2012                 --indent_level;
2013
2014                 do_indent ();
2015                 out_dec ("else if ( yy_act == %d )\n", num_rules);
2016                 ++indent_level;
2017
2018                 if (C_plus_plus) {
2019                         indent_puts
2020                                 ("std::cerr << \"--accepting default rule (\\\"\" << yytext << \"\\\")\\n\";");
2021                 }
2022                 else {
2023                         indent_puts
2024                                 ("fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\",");
2025                         indent_puts ("         yytext );");
2026                 }
2027
2028                 --indent_level;
2029
2030                 do_indent ();
2031                 out_dec ("else if ( yy_act == %d )\n", num_rules + 1);
2032                 ++indent_level;
2033
2034                 indent_puts (C_plus_plus ?
2035                              "std::cerr << \"--(end of buffer or a NUL)\\n\";" :
2036                              "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );");
2037
2038                 --indent_level;
2039
2040                 do_indent ();
2041                 outn ("else");
2042                 ++indent_level;
2043
2044                 if (C_plus_plus) {
2045                         indent_puts
2046                                 ("std::cerr << \"--EOF (start condition \" << YY_START << \")\\n\";");
2047                 }
2048                 else {
2049                         indent_puts
2050                                 ("fprintf( stderr, \"--EOF (start condition %d)\\n\", YY_START );");
2051                 }
2052
2053                 --indent_level;
2054
2055                 indent_puts ("}");
2056                 --indent_level;
2057         }
2058
2059         /* Copy actions to output file. */
2060         skelout ();             /* %% [13.0] - break point in skel */
2061         ++indent_level;
2062         gen_bu_action ();
2063         out (&action_array[action_offset]);
2064
2065         line_directive_out (stdout, 0);
2066
2067         /* generate cases for any missing EOF rules */
2068         for (i = 1; i <= lastsc; ++i)
2069                 if (!sceof[i]) {
2070                         do_indent ();
2071                         out_str ("case YY_STATE_EOF(%s):\n", scname[i]);
2072                         did_eof_rule = true;
2073                 }
2074
2075         if (did_eof_rule) {
2076                 ++indent_level;
2077                 indent_puts ("yyterminate();");
2078                 --indent_level;
2079         }
2080
2081
2082         /* Generate code for handling NUL's, if needed. */
2083
2084         /* First, deal with backing up and setting up yy_cp if the scanner
2085          * finds that it should JAM on the NUL.
2086          */
2087         skelout ();             /* %% [14.0] - break point in skel */
2088         set_indent (4);
2089
2090         if (fullspd || fulltbl)
2091                 indent_puts ("yy_cp = YY_G(yy_c_buf_p);");
2092
2093         else {                  /* compressed table */
2094                 if (!reject && !interactive) {
2095                         /* Do the guaranteed-needed backing up to figure
2096                          * out the match.
2097                          */
2098                         indent_puts
2099                                 ("yy_cp = YY_G(yy_last_accepting_cpos);");
2100                         indent_puts
2101                                 ("yy_current_state = YY_G(yy_last_accepting_state);");
2102                 }
2103
2104                 else
2105                         /* Still need to initialize yy_cp, though
2106                          * yy_current_state was set up by
2107                          * yy_get_previous_state().
2108                          */
2109                         indent_puts ("yy_cp = YY_G(yy_c_buf_p);");
2110         }
2111
2112
2113         /* Generate code for yy_get_previous_state(). */
2114         set_indent (1);
2115         skelout ();             /* %% [15.0] - break point in skel */
2116
2117         gen_start_state ();
2118
2119         set_indent (2);
2120         skelout ();             /* %% [16.0] - break point in skel */
2121         gen_next_state (true);
2122
2123         set_indent (1);
2124         skelout ();             /* %% [17.0] - break point in skel */
2125         gen_NUL_trans ();
2126
2127         skelout ();             /* %% [18.0] - break point in skel */
2128         skelout ();             /* %% [19.0] - break point in skel */
2129         /* Update BOL and yylineno inside of input(). */
2130         if (bol_needed) {
2131                 indent_puts
2132                         ("YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\\n');");
2133                 if (do_yylineno) {
2134                         indent_puts
2135                                 ("if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )");
2136                         ++indent_level;
2137                         indent_puts ("M4_YY_INCR_LINENO();");
2138                         --indent_level;
2139                 }
2140         }
2141
2142         else if (do_yylineno) {
2143                 indent_puts ("if ( c == '\\n' )");
2144                 ++indent_level;
2145                 indent_puts ("M4_YY_INCR_LINENO();");
2146                 --indent_level;
2147         }
2148
2149         skelout ();
2150
2151         /* Copy remainder of input to output. */
2152
2153         line_directive_out (stdout, 1);
2154
2155         if (sectnum == 3) {
2156                 OUT_BEGIN_CODE ();
2157                 if (!no_section3_escape)
2158                    fputs("[[", stdout);
2159                 (void) flexscan ();     /* copy remainder of input to output */
2160                 if (!no_section3_escape)
2161                    fputs("]]", stdout);
2162                 OUT_END_CODE ();
2163         }
2164 }