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