1 /* Output the generated parsing program for Bison. 
   3    Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 
   4    2005, 2006 Free Software Foundation, Inc. 
   6    This file is part of Bison, the GNU Compiler Compiler. 
   8    Bison is free software; you can redistribute it and/or modify it 
   9    under the terms of the GNU General Public License as published by 
  10    the Free Software Foundation; either version 2, or (at your option) 
  13    Bison is distributed in the hope that it will be useful, but 
  14    WITHOUT ANY WARRANTY; without even the implied warranty of 
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
  16    General Public License for more details. 
  18    You should have received a copy of the GNU General Public License 
  19    along with Bison; see the file COPYING.  If not, write to the Free 
  20    Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
  27 #include <get-errno.h> 
  36 #include "muscle_tab.h" 
  39 #include "scan-code.h"    /* max_left_semantic_context */ 
  40 #include "scan-skel.h" 
  45 static struct obstack format_obstack
; 
  48 /*-------------------------------------------------------------------. 
  49 | Create a function NAME which associates to the muscle NAME the     | 
  50 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of | 
  51 | TYPE), and to the muscle NAME_max, the max value of the            | 
  53 `-------------------------------------------------------------------*/ 
  56 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type)                        \ 
  59 Name (char const *name,                                                 \ 
  72   obstack_fgrow1 (&format_obstack, "%6d", first);                       \ 
  73   for (i = begin; i < end; ++i)                                         \ 
  75       obstack_1grow (&format_obstack, ',');                             \ 
  78           obstack_sgrow (&format_obstack, "\n  ");                      \ 
  83       obstack_fgrow1 (&format_obstack, "%6d", table_data[i]);           \ 
  84       if (table_data[i] < min)                                          \ 
  85         min = table_data[i];                                            \ 
  86       if (max < table_data[i])                                          \ 
  87         max = table_data[i];                                            \ 
  89   obstack_1grow (&format_obstack, 0);                                   \ 
  90   muscle_insert (name, obstack_finish (&format_obstack));               \ 
  94   /* Build `NAME_min' and `NAME_max' in the obstack. */                 \ 
  95   obstack_fgrow1 (&format_obstack, "%s_min", name);                     \ 
  96   obstack_1grow (&format_obstack, 0);                                   \ 
  97   MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin);      \ 
  98   obstack_fgrow1 (&format_obstack, "%s_max", name);                     \ 
  99   obstack_1grow (&format_obstack, 0);                                   \ 
 100   MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax);      \ 
 103 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table
, unsigned int) 
 104 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table
, int) 
 105 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table
, base_number
) 
 106 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table
, rule_number
) 
 107 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table
, symbol_number
) 
 108 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table
, item_number
) 
 109 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table
, state_number
) 
 112 /*--------------------------------------------------------------------. 
 113 | Print to OUT a representation of STRING escaped both for C and M4.  | 
 114 `--------------------------------------------------------------------*/ 
 117 escaped_output (FILE *out
, char const *string
) 
 122   for (p 
= quotearg_style (c_quoting_style
, string
); *p
; p
++) 
 125       case '$': fputs ("$][", out
); break; 
 126       case '@': fputs ("@@",  out
); break; 
 127       case '[': fputs ("@{",  out
); break; 
 128       case ']': fputs ("@}",  out
); break; 
 129       default: fputc (*p
, out
); break; 
 136 /*------------------------------------------------------------------. 
 137 | Prepare the muscles related to the symbols: translate, tname, and | 
 139 `------------------------------------------------------------------*/ 
 142 prepare_symbols (void) 
 144   MUSCLE_INSERT_BOOL ("token_table", token_table_flag
); 
 145   MUSCLE_INSERT_INT ("tokens_number", ntokens
); 
 146   MUSCLE_INSERT_INT ("nterms_number", nvars
); 
 147   MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
); 
 148   MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
); 
 150   muscle_insert_symbol_number_table ("translate", 
 152                                      token_translations
[0], 
 153                                      1, max_user_token_number 
+ 1); 
 155   /* tname -- token names.  */ 
 158     /* We assume that the table will be output starting at column 2. */ 
 160     for (i 
= 0; i 
< nsyms
; i
++) 
 162         char const *cp 
= quotearg_style (c_quoting_style
, symbols
[i
]->tag
); 
 163         /* Width of the next token, including the two quotes, the 
 164            comma and the space.  */ 
 165         int width 
= strlen (cp
) + 2; 
 169             obstack_sgrow (&format_obstack
, "\n "); 
 174           obstack_1grow (&format_obstack
, ' '); 
 175         MUSCLE_OBSTACK_SGROW (&format_obstack
, cp
); 
 176         obstack_1grow (&format_obstack
, ','); 
 179     /* Add a NULL entry to list of tokens (well, 0, as NULL might not be 
 181     obstack_sgrow (&format_obstack
, " 0"); 
 183     /* Finish table and store. */ 
 184     obstack_1grow (&format_obstack
, 0); 
 185     muscle_insert ("tname", obstack_finish (&format_obstack
)); 
 188   /* Output YYTOKNUM. */ 
 191     int *values 
= xnmalloc (ntokens
, sizeof *values
); 
 192     for (i 
= 0; i 
< ntokens
; ++i
) 
 193       values
[i
] = symbols
[i
]->user_token_number
; 
 194     muscle_insert_int_table ("toknum", values
, 
 195                              values
[0], 1, ntokens
); 
 201 /*-------------------------------------------------------------. 
 202 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, | 
 203 | rline, dprec, merger.                                        | 
 204 `-------------------------------------------------------------*/ 
 211   item_number 
*rhs 
= xnmalloc (nritems
, sizeof *rhs
); 
 212   unsigned int *prhs 
= xnmalloc (nrules
, sizeof *prhs
); 
 213   unsigned int *rline 
= xnmalloc (nrules
, sizeof *rline
); 
 214   symbol_number 
*r1 
= xnmalloc (nrules
, sizeof *r1
); 
 215   unsigned int *r2 
= xnmalloc (nrules
, sizeof *r2
); 
 216   int *dprec 
= xnmalloc (nrules
, sizeof *dprec
); 
 217   int *merger 
= xnmalloc (nrules
, sizeof *merger
); 
 219   for (r 
= 0; r 
< nrules
; ++r
) 
 221       item_number 
*rhsp 
= NULL
; 
 222       /* Index of rule R in RHS. */ 
 224       /* RHS of the rule R. */ 
 225       for (rhsp 
= rules
[r
].rhs
; *rhsp 
>= 0; ++rhsp
) 
 227       /* LHS of the rule R. */ 
 228       r1
[r
] = rules
[r
].lhs
->number
; 
 229       /* Length of rule R's RHS. */ 
 231       /* Separator in RHS. */ 
 233       /* Line where rule was defined. */ 
 234       rline
[r
] = rules
[r
].location
.start
.line
; 
 235       /* Dynamic precedence (GLR).  */ 
 236       dprec
[r
] = rules
[r
].dprec
; 
 237       /* Merger-function index (GLR).  */ 
 238       merger
[r
] = rules
[r
].merger
; 
 240   assert (i 
== nritems
); 
 242   muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
); 
 243   muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 0, nrules
); 
 244   muscle_insert_unsigned_int_table ("rline", rline
, 0, 0, nrules
); 
 245   muscle_insert_symbol_number_table ("r1", r1
, 0, 0, nrules
); 
 246   muscle_insert_unsigned_int_table ("r2", r2
, 0, 0, nrules
); 
 247   muscle_insert_int_table ("dprec", dprec
, 0, 0, nrules
); 
 248   muscle_insert_int_table ("merger", merger
, 0, 0, nrules
); 
 250   MUSCLE_INSERT_INT ("rules_number", nrules
); 
 251   MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context
); 
 262 /*--------------------------------------------. 
 263 | Prepare the muscles related to the states.  | 
 264 `--------------------------------------------*/ 
 267 prepare_states (void) 
 270   symbol_number 
*values 
= xnmalloc (nstates
, sizeof *values
); 
 271   for (i 
= 0; i 
< nstates
; ++i
) 
 272     values
[i
] = states
[i
]->accessing_symbol
; 
 273   muscle_insert_symbol_number_table ("stos", values
, 
 277   MUSCLE_INSERT_INT ("last", high
); 
 278   MUSCLE_INSERT_INT ("final_state_number", final_state
->number
); 
 279   MUSCLE_INSERT_INT ("states_number", nstates
); 
 284 /*---------------------------------. 
 285 | Output the user actions to OUT.  | 
 286 `---------------------------------*/ 
 289 user_actions_output (FILE *out
) 
 293   fputs ("m4_define([b4_actions], \n[[", out
); 
 294   for (r 
= 0; r 
< nrules
; ++r
) 
 297         fprintf (out
, "  case %d:\n", r 
+ 1); 
 299         fprintf (out
, "]b4_syncline(%d, ", 
 300                  rules
[r
].action_location
.start
.line
); 
 301         escaped_output (out
, rules
[r
].action_location
.start
.file
); 
 302         fprintf (out
, ")[\n"); 
 303         fprintf (out
, "    %s\n    break;\n\n", 
 306   fputs ("]])\n\n", out
); 
 309 /*--------------------------------------. 
 310 | Output the merge functions to OUT.   | 
 311 `--------------------------------------*/ 
 314 merger_output (FILE *out
) 
 319   fputs ("m4_define([b4_mergers], \n[[", out
); 
 320   for (n 
= 1, p 
= merge_functions
; p 
!= NULL
; n 
+= 1, p 
= p
->next
) 
 322       if (p
->type
[0] == '\0') 
 323         fprintf (out
, "  case %d: *yy0 = %s (*yy0, *yy1); break;\n", 
 326         fprintf (out
, "  case %d: yy0->%s = %s (*yy0, *yy1); break;\n", 
 327                  n
, p
->type
, p
->name
); 
 329   fputs ("]])\n\n", out
); 
 332 /*--------------------------------------. 
 333 | Output the tokens definition to OUT.  | 
 334 `--------------------------------------*/ 
 337 token_definitions_output (FILE *out
) 
 340   char const *sep 
= ""; 
 342   fputs ("m4_define([b4_tokens], \n[", out
); 
 343   for (i 
= 0; i 
< ntokens
; ++i
) 
 345       symbol 
*sym 
= symbols
[i
]; 
 346       int number 
= sym
->user_token_number
; 
 348       /* At this stage, if there are literal aliases, they are part of 
 349          SYMBOLS, so we should not find symbols which are the aliases 
 351       assert (number 
!= USER_NUMBER_ALIAS
); 
 353       /* Skip error token.  */ 
 357       /* If this string has an alias, then it is necessarily the alias 
 358          which is to be output.  */ 
 362       /* Don't output literal chars or strings (when defined only as a 
 363          string).  Note that must be done after the alias resolution: 
 364          think about `%token 'f' "f"'.  */ 
 365       if (sym
->tag
[0] == '\'' || sym
->tag
[0] == '\"') 
 368       /* Don't #define nonliteral tokens whose names contain periods 
 369          or '$' (as does the default value of the EOF token).  */ 
 370       if (strchr (sym
->tag
, '.') || strchr (sym
->tag
, '$')) 
 373       fprintf (out
, "%s[[[%s]], %d]", 
 374                sep
, sym
->tag
, number
); 
 377   fputs ("])\n\n", out
); 
 381 /*---------------------------------------. 
 382 | Output the symbol destructors to OUT.  | 
 383 `---------------------------------------*/ 
 386 symbol_destructors_output (FILE *out
) 
 389   char const *sep 
= ""; 
 391   fputs ("m4_define([b4_symbol_destructors], \n[", out
); 
 392   for (i 
= 0; i 
< nsyms
; ++i
) 
 393     if (symbols
[i
]->destructor
) 
 395         symbol 
*sym 
= symbols
[i
]; 
 398            Symbol-name, Symbol-number, 
 399            destructor, optional typename.  */ 
 400         fprintf (out
, "%s[", sep
); 
 402         escaped_output (out
, sym
->destructor_location
.start
.file
); 
 403         fprintf (out
, ", %d, ", sym
->destructor_location
.start
.line
); 
 404         escaped_output (out
, sym
->tag
); 
 405         fprintf (out
, ", %d, [[%s]]", sym
->number
, sym
->destructor
); 
 407           fprintf (out
, ", [[%s]]", sym
->type_name
); 
 410   fputs ("])\n\n", out
); 
 414 /*------------------------------------. 
 415 | Output the symbol printers to OUT.  | 
 416 `------------------------------------*/ 
 419 symbol_printers_output (FILE *out
) 
 422   char const *sep 
= ""; 
 424   fputs ("m4_define([b4_symbol_printers], \n[", out
); 
 425   for (i 
= 0; i 
< nsyms
; ++i
) 
 426     if (symbols
[i
]->printer
) 
 428         symbol 
*sym 
= symbols
[i
]; 
 431            Symbol-name, Symbol-number, 
 432            printer, optional typename.  */ 
 433         fprintf (out
, "%s[", sep
); 
 435         escaped_output (out
, sym
->printer_location
.start
.file
); 
 436         fprintf (out
, ", %d, ", sym
->printer_location
.start
.line
); 
 437         escaped_output (out
, sym
->tag
); 
 438         fprintf (out
, ", %d, [[%s]]", sym
->number
, sym
->printer
); 
 440           fprintf (out
, ", [[%s]]", sym
->type_name
); 
 443   fputs ("])\n\n", out
); 
 448 prepare_actions (void) 
 450   /* Figure out the actions for the specified state, indexed by 
 451      lookahead token type.  */ 
 453   muscle_insert_rule_number_table ("defact", yydefact
, 
 454                                    yydefact
[0], 1, nstates
); 
 456   /* Figure out what to do after reducing with each rule, depending on 
 457      the saved state from before the beginning of parsing the data 
 458      that matched this rule.  */ 
 459   muscle_insert_state_number_table ("defgoto", yydefgoto
, 
 460                                     yydefgoto
[0], 1, nsyms 
- ntokens
); 
 464   muscle_insert_base_table ("pact", base
, 
 465                              base
[0], 1, nstates
); 
 466   MUSCLE_INSERT_INT ("pact_ninf", base_ninf
); 
 469   muscle_insert_base_table ("pgoto", base
, 
 470                              base
[nstates
], nstates 
+ 1, nvectors
); 
 472   muscle_insert_base_table ("table", table
, 
 473                             table
[0], 1, high 
+ 1); 
 474   MUSCLE_INSERT_INT ("table_ninf", table_ninf
); 
 476   muscle_insert_base_table ("check", check
, 
 477                             check
[0], 1, high 
+ 1); 
 479   /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus 
 480      YYPACT) so that in states with unresolved conflicts, the default 
 481      reduction is not used in the conflicted entries, so that there is 
 482      a place to put a conflict pointer. 
 484      This means that YYCONFLP and YYCONFL are nonsense for a non-GLR 
 485      parser, so we could avoid accidents by not writing them out in 
 486      that case.  Nevertheless, it seems even better to be able to use 
 487      the GLR skeletons even without the non-deterministic tables.  */ 
 488   muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
, 
 489                                     conflict_table
[0], 1, high 
+ 1); 
 490   muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
, 
 491                                     0, 1, conflict_list_cnt
); 
 495 /*---------------------------. 
 496 | Call the skeleton parser.  | 
 497 `---------------------------*/ 
 500 output_skeleton (void) 
 508   /* Compute the names of the package data dir and skeleton file. 
 509      Test whether m4sugar.m4 is readable, to check for proper 
 510      installation.  A faulty installation can cause deadlock, so a 
 511      cheap sanity check is worthwhile.  */ 
 512   char const m4sugar
[] = "m4sugar/m4sugar.m4"; 
 516   char const *m4 
= (p 
= getenv ("M4")) ? p 
: M4
; 
 517   char const *pkgdatadir 
= (p 
= getenv ("BISON_PKGDATADIR")) ? p 
: PKGDATADIR
; 
 518   size_t skeleton_size 
= strlen (skeleton
) + 1; 
 519   size_t pkgdatadirlen 
= strlen (pkgdatadir
); 
 520   while (pkgdatadirlen 
&& pkgdatadir
[pkgdatadirlen 
- 1] == '/') 
 522   full_skeleton 
= xmalloc (pkgdatadirlen 
+ 1 
 523                            + (skeleton_size 
< sizeof m4sugar
 
 524                               ? sizeof m4sugar 
: skeleton_size
)); 
 525   strcpy (full_skeleton
, pkgdatadir
); 
 526   full_skeleton
[pkgdatadirlen
] = '/'; 
 527   strcpy (full_skeleton 
+ pkgdatadirlen 
+ 1, m4sugar
); 
 528   full_m4sugar 
= xstrdup (full_skeleton
); 
 529   strcpy (full_skeleton 
+ pkgdatadirlen 
+ 1, skeleton
); 
 530   xfclose (xfopen (full_m4sugar
, "r")); 
 532   /* Create an m4 subprocess connected to us via two pipes.  */ 
 534   if (trace_flag 
& trace_tools
) 
 535     fprintf (stderr
, "running: %s %s - %s\n", 
 536              m4
, full_m4sugar
, full_skeleton
); 
 539   argv
[1] = full_m4sugar
; 
 541   argv
[3] = full_skeleton
; 
 542   argv
[4] = trace_flag 
& trace_m4 
? "-dV" : NULL
; 
 546   pid 
= create_subpipe (argv
, filter_fd
); 
 548   free (full_skeleton
); 
 550   out 
= fdopen (filter_fd
[0], "w"); 
 552     error (EXIT_FAILURE
, get_errno (), 
 555   /* Output the definitions of all the muscles.  */ 
 556   fputs ("m4_init()\n", out
); 
 558   user_actions_output (out
); 
 560   token_definitions_output (out
); 
 561   symbol_destructors_output (out
); 
 562   symbol_printers_output (out
); 
 564   muscles_m4_output (out
); 
 566   fputs ("m4_wrap([m4_divert_pop(0)])\n", out
); 
 567   fputs ("m4_divert_push(0)dnl\n", out
); 
 570   /* Read and process m4's output.  */ 
 571   timevar_push (TV_M4
); 
 572   end_of_output_subpipe (pid
, filter_fd
); 
 573   in 
= fdopen (filter_fd
[1], "r"); 
 575     error (EXIT_FAILURE
, get_errno (), 
 579   reap_subpipe (pid
, m4
); 
 587   MUSCLE_INSERT_BOOL ("debug_flag", debug_flag
); 
 588   MUSCLE_INSERT_BOOL ("defines_flag", defines_flag
); 
 589   MUSCLE_INSERT_BOOL ("error_verbose_flag", error_verbose
); 
 590   MUSCLE_INSERT_BOOL ("locations_flag", locations_flag
); 
 591   MUSCLE_INSERT_BOOL ("pure_flag", pure_parser
); 
 592   MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag
); 
 593   MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag
); 
 596   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix 
? spec_name_prefix 
: "yy"); 
 597 #define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "") 
 599   DEFINE (parser_file_name
); 
 600   DEFINE (spec_defines_file
); 
 601   DEFINE (spec_file_prefix
); 
 602   DEFINE (spec_graph_file
); 
 603   DEFINE (spec_name_prefix
); 
 604   DEFINE (spec_outfile
); 
 605   DEFINE (spec_verbose_file
); 
 609   obstack_1grow (&pre_prologue_obstack
, 0); 
 610   obstack_1grow (&post_prologue_obstack
, 0); 
 611   muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
)); 
 612   muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
)); 
 614   /* Find the right skeleton file.  */ 
 617       if (glr_parser 
|| nondeterministic_parser
) 
 623   /* About the skeletons. */ 
 625     char const *pkgdatadir 
= getenv ("BISON_PKGDATADIR"); 
 626     MUSCLE_INSERT_STRING ("pkgdatadir", pkgdatadir 
? pkgdatadir 
: PKGDATADIR
); 
 627     MUSCLE_INSERT_C_STRING ("skeleton", skeleton
); 
 632 /*----------------------------------------------------------. 
 633 | Output the parsing tables and the parser code to ftable.  | 
 634 `----------------------------------------------------------*/ 
 639   obstack_init (&format_obstack
); 
 648   /* Process the selected skeleton file.  */ 
 651   obstack_free (&format_obstack
, NULL
); 
 652   obstack_free (&pre_prologue_obstack
, NULL
); 
 653   obstack_free (&post_prologue_obstack
, NULL
);