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     obstack_sgrow (&format_obstack
, " ]b4_null["); 
 181     /* Finish table and store. */ 
 182     obstack_1grow (&format_obstack
, 0); 
 183     muscle_insert ("tname", obstack_finish (&format_obstack
)); 
 186   /* Output YYTOKNUM. */ 
 189     int *values 
= xnmalloc (ntokens
, sizeof *values
); 
 190     for (i 
= 0; i 
< ntokens
; ++i
) 
 191       values
[i
] = symbols
[i
]->user_token_number
; 
 192     muscle_insert_int_table ("toknum", values
, 
 193                              values
[0], 1, ntokens
); 
 199 /*-------------------------------------------------------------. 
 200 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, | 
 201 | rline, dprec, merger.                                        | 
 202 `-------------------------------------------------------------*/ 
 209   item_number 
*rhs 
= xnmalloc (nritems
, sizeof *rhs
); 
 210   unsigned int *prhs 
= xnmalloc (nrules
, sizeof *prhs
); 
 211   unsigned int *rline 
= xnmalloc (nrules
, sizeof *rline
); 
 212   symbol_number 
*r1 
= xnmalloc (nrules
, sizeof *r1
); 
 213   unsigned int *r2 
= xnmalloc (nrules
, sizeof *r2
); 
 214   int *dprec 
= xnmalloc (nrules
, sizeof *dprec
); 
 215   int *merger 
= xnmalloc (nrules
, sizeof *merger
); 
 217   for (r 
= 0; r 
< nrules
; ++r
) 
 219       item_number 
*rhsp 
= NULL
; 
 220       /* Index of rule R in RHS. */ 
 222       /* RHS of the rule R. */ 
 223       for (rhsp 
= rules
[r
].rhs
; *rhsp 
>= 0; ++rhsp
) 
 225       /* LHS of the rule R. */ 
 226       r1
[r
] = rules
[r
].lhs
->number
; 
 227       /* Length of rule R's RHS. */ 
 229       /* Separator in RHS. */ 
 231       /* Line where rule was defined. */ 
 232       rline
[r
] = rules
[r
].location
.start
.line
; 
 233       /* Dynamic precedence (GLR).  */ 
 234       dprec
[r
] = rules
[r
].dprec
; 
 235       /* Merger-function index (GLR).  */ 
 236       merger
[r
] = rules
[r
].merger
; 
 238   assert (i 
== nritems
); 
 240   muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
); 
 241   muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 0, nrules
); 
 242   muscle_insert_unsigned_int_table ("rline", rline
, 0, 0, nrules
); 
 243   muscle_insert_symbol_number_table ("r1", r1
, 0, 0, nrules
); 
 244   muscle_insert_unsigned_int_table ("r2", r2
, 0, 0, nrules
); 
 245   muscle_insert_int_table ("dprec", dprec
, 0, 0, nrules
); 
 246   muscle_insert_int_table ("merger", merger
, 0, 0, nrules
); 
 248   MUSCLE_INSERT_INT ("rules_number", nrules
); 
 249   MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context
); 
 260 /*--------------------------------------------. 
 261 | Prepare the muscles related to the states.  | 
 262 `--------------------------------------------*/ 
 265 prepare_states (void) 
 268   symbol_number 
*values 
= xnmalloc (nstates
, sizeof *values
); 
 269   for (i 
= 0; i 
< nstates
; ++i
) 
 270     values
[i
] = states
[i
]->accessing_symbol
; 
 271   muscle_insert_symbol_number_table ("stos", values
, 
 275   MUSCLE_INSERT_INT ("last", high
); 
 276   MUSCLE_INSERT_INT ("final_state_number", final_state
->number
); 
 277   MUSCLE_INSERT_INT ("states_number", nstates
); 
 282 /*---------------------------------. 
 283 | Output the user actions to OUT.  | 
 284 `---------------------------------*/ 
 287 user_actions_output (FILE *out
) 
 291   fputs ("m4_define([b4_actions], \n[", out
); 
 292   for (r 
= 0; r 
< nrules
; ++r
) 
 295         fprintf (out
, "b4_case(%d, [b4_syncline(%d, ", r 
+ 1, 
 296                  rules
[r
].action_location
.start
.line
); 
 297         escaped_output (out
, rules
[r
].action_location
.start
.file
); 
 298         fprintf (out
, ")\n[    %s]])\n\n", rules
[r
].action
); 
 300   fputs ("])\n\n", out
); 
 303 /*--------------------------------------. 
 304 | Output the merge functions to OUT.   | 
 305 `--------------------------------------*/ 
 308 merger_output (FILE *out
) 
 313   fputs ("m4_define([b4_mergers], \n[[", out
); 
 314   for (n 
= 1, p 
= merge_functions
; p 
!= NULL
; n 
+= 1, p 
= p
->next
) 
 316       if (p
->type
[0] == '\0') 
 317         fprintf (out
, "  case %d: *yy0 = %s (*yy0, *yy1); break;\n", 
 320         fprintf (out
, "  case %d: yy0->%s = %s (*yy0, *yy1); break;\n", 
 321                  n
, p
->type
, p
->name
); 
 323   fputs ("]])\n\n", out
); 
 326 /*--------------------------------------. 
 327 | Output the tokens definition to OUT.  | 
 328 `--------------------------------------*/ 
 331 token_definitions_output (FILE *out
) 
 334   char const *sep 
= ""; 
 336   fputs ("m4_define([b4_tokens], \n[", out
); 
 337   for (i 
= 0; i 
< ntokens
; ++i
) 
 339       symbol 
*sym 
= symbols
[i
]; 
 340       int number 
= sym
->user_token_number
; 
 342       /* At this stage, if there are literal aliases, they are part of 
 343          SYMBOLS, so we should not find symbols which are the aliases 
 345       assert (number 
!= USER_NUMBER_ALIAS
); 
 347       /* Skip error token.  */ 
 351       /* If this string has an alias, then it is necessarily the alias 
 352          which is to be output.  */ 
 356       /* Don't output literal chars or strings (when defined only as a 
 357          string).  Note that must be done after the alias resolution: 
 358          think about `%token 'f' "f"'.  */ 
 359       if (sym
->tag
[0] == '\'' || sym
->tag
[0] == '\"') 
 362       /* Don't #define nonliteral tokens whose names contain periods 
 363          or '$' (as does the default value of the EOF token).  */ 
 364       if (strchr (sym
->tag
, '.') || strchr (sym
->tag
, '$')) 
 367       fprintf (out
, "%s[[[%s]], %d]", 
 368                sep
, sym
->tag
, number
); 
 371   fputs ("])\n\n", out
); 
 375 /*---------------------------------------. 
 376 | Output the symbol destructors to OUT.  | 
 377 `---------------------------------------*/ 
 380 symbol_destructors_output (FILE *out
) 
 383   char const *sep 
= ""; 
 385   fputs ("m4_define([b4_symbol_destructors], \n[", out
); 
 386   for (i 
= 0; i 
< nsyms
; ++i
) 
 387     if (symbol_destructor_get (symbols
[i
])) 
 389         symbol 
*sym 
= symbols
[i
]; 
 392            Symbol-name, Symbol-number, 
 393            destructor, optional typename.  */ 
 394         fprintf (out
, "%s[", sep
); 
 396         escaped_output (out
, symbol_destructor_location_get (sym
).start
.file
); 
 397         fprintf (out
, ", %d, ", 
 398                  symbol_destructor_location_get (sym
).start
.line
); 
 399         escaped_output (out
, sym
->tag
); 
 400         fprintf (out
, ", %d, [[%s]]", sym
->number
, 
 401                  symbol_destructor_get (sym
)); 
 403           fprintf (out
, ", [[%s]]", sym
->type_name
); 
 406   fputs ("])\n\n", out
); 
 410 /*------------------------------------. 
 411 | Output the symbol printers to OUT.  | 
 412 `------------------------------------*/ 
 415 symbol_printers_output (FILE *out
) 
 418   char const *sep 
= ""; 
 420   fputs ("m4_define([b4_symbol_printers], \n[", out
); 
 421   for (i 
= 0; i 
< nsyms
; ++i
) 
 422     if (symbol_printer_get (symbols
[i
])) 
 424         symbol 
*sym 
= symbols
[i
]; 
 427            Symbol-name, Symbol-number, 
 428            printer, optional typename.  */ 
 429         fprintf (out
, "%s[", sep
); 
 431         escaped_output (out
, symbol_printer_location_get (sym
).start
.file
); 
 432         fprintf (out
, ", %d, ", symbol_printer_location_get (sym
).start
.line
); 
 433         escaped_output (out
, sym
->tag
); 
 434         fprintf (out
, ", %d, [[%s]]", sym
->number
, symbol_printer_get (sym
)); 
 436           fprintf (out
, ", [[%s]]", sym
->type_name
); 
 439   fputs ("])\n\n", out
); 
 444 prepare_actions (void) 
 446   /* Figure out the actions for the specified state, indexed by 
 447      lookahead token type.  */ 
 449   muscle_insert_rule_number_table ("defact", yydefact
, 
 450                                    yydefact
[0], 1, nstates
); 
 452   /* Figure out what to do after reducing with each rule, depending on 
 453      the saved state from before the beginning of parsing the data 
 454      that matched this rule.  */ 
 455   muscle_insert_state_number_table ("defgoto", yydefgoto
, 
 456                                     yydefgoto
[0], 1, nsyms 
- ntokens
); 
 460   muscle_insert_base_table ("pact", base
, 
 461                              base
[0], 1, nstates
); 
 462   MUSCLE_INSERT_INT ("pact_ninf", base_ninf
); 
 465   muscle_insert_base_table ("pgoto", base
, 
 466                              base
[nstates
], nstates 
+ 1, nvectors
); 
 468   muscle_insert_base_table ("table", table
, 
 469                             table
[0], 1, high 
+ 1); 
 470   MUSCLE_INSERT_INT ("table_ninf", table_ninf
); 
 472   muscle_insert_base_table ("check", check
, 
 473                             check
[0], 1, high 
+ 1); 
 475   /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus 
 476      YYPACT) so that in states with unresolved conflicts, the default 
 477      reduction is not used in the conflicted entries, so that there is 
 478      a place to put a conflict pointer. 
 480      This means that YYCONFLP and YYCONFL are nonsense for a non-GLR 
 481      parser, so we could avoid accidents by not writing them out in 
 482      that case.  Nevertheless, it seems even better to be able to use 
 483      the GLR skeletons even without the non-deterministic tables.  */ 
 484   muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
, 
 485                                     conflict_table
[0], 1, high 
+ 1); 
 486   muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
, 
 487                                     0, 1, conflict_list_cnt
); 
 491 /*---------------------------. 
 492 | Call the skeleton parser.  | 
 493 `---------------------------*/ 
 496 output_skeleton (void) 
 504   /* Compute the names of the package data dir and skeleton file. 
 505      Test whether m4sugar.m4 is readable, to check for proper 
 506      installation.  A faulty installation can cause deadlock, so a 
 507      cheap sanity check is worthwhile.  */ 
 508   char const m4sugar
[] = "m4sugar/m4sugar.m4"; 
 512   char const *m4 
= (p 
= getenv ("M4")) ? p 
: M4
; 
 513   char const *pkgdatadir 
= (p 
= getenv ("BISON_PKGDATADIR")) ? p 
: PKGDATADIR
; 
 514   size_t skeleton_size 
= strlen (skeleton
) + 1; 
 515   size_t pkgdatadirlen 
= strlen (pkgdatadir
); 
 516   while (pkgdatadirlen 
&& pkgdatadir
[pkgdatadirlen 
- 1] == '/') 
 518   full_skeleton 
= xmalloc (pkgdatadirlen 
+ 1 
 519                            + (skeleton_size 
< sizeof m4sugar
 
 520                               ? sizeof m4sugar 
: skeleton_size
)); 
 521   strcpy (full_skeleton
, pkgdatadir
); 
 522   full_skeleton
[pkgdatadirlen
] = '/'; 
 523   strcpy (full_skeleton 
+ pkgdatadirlen 
+ 1, m4sugar
); 
 524   full_m4sugar 
= xstrdup (full_skeleton
); 
 525   strcpy (full_skeleton 
+ pkgdatadirlen 
+ 1, skeleton
); 
 526   xfclose (xfopen (full_m4sugar
, "r")); 
 528   /* Create an m4 subprocess connected to us via two pipes.  */ 
 530   if (trace_flag 
& trace_tools
) 
 531     fprintf (stderr
, "running: %s %s - %s\n", 
 532              m4
, full_m4sugar
, full_skeleton
); 
 535   argv
[1] = full_m4sugar
; 
 537   argv
[3] = full_skeleton
; 
 538   argv
[4] = trace_flag 
& trace_m4 
? "-dV" : NULL
; 
 542   pid 
= create_subpipe (argv
, filter_fd
); 
 544   free (full_skeleton
); 
 546   out 
= fdopen (filter_fd
[0], "w"); 
 548     error (EXIT_FAILURE
, get_errno (), 
 551   /* Output the definitions of all the muscles.  */ 
 552   fputs ("m4_init()\n", out
); 
 554   user_actions_output (out
); 
 556   token_definitions_output (out
); 
 557   symbol_destructors_output (out
); 
 558   symbol_printers_output (out
); 
 560   muscles_m4_output (out
); 
 562   fputs ("m4_wrap([m4_divert_pop(0)])\n", out
); 
 563   fputs ("m4_divert_push(0)dnl\n", out
); 
 566   /* Read and process m4's output.  */ 
 567   timevar_push (TV_M4
); 
 568   end_of_output_subpipe (pid
, filter_fd
); 
 569   in 
= fdopen (filter_fd
[1], "r"); 
 571     error (EXIT_FAILURE
, get_errno (), 
 575   reap_subpipe (pid
, m4
); 
 583   MUSCLE_INSERT_BOOL ("debug_flag", debug_flag
); 
 584   MUSCLE_INSERT_BOOL ("defines_flag", defines_flag
); 
 585   MUSCLE_INSERT_BOOL ("error_verbose_flag", error_verbose
); 
 586   MUSCLE_INSERT_BOOL ("locations_flag", locations_flag
); 
 587   MUSCLE_INSERT_BOOL ("pure_flag", pure_parser
); 
 588   MUSCLE_INSERT_BOOL ("push_flag", push_parser
); 
 589   MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag
); 
 590   MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen
); 
 591   MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag
); 
 594   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix 
? spec_name_prefix 
: "yy"); 
 595 #define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "") 
 597   DEFINE (parser_file_name
); 
 598   DEFINE (spec_defines_file
); 
 599   DEFINE (spec_file_prefix
); 
 600   DEFINE (spec_graph_file
); 
 601   DEFINE (spec_name_prefix
); 
 602   DEFINE (spec_outfile
); 
 603   DEFINE (spec_verbose_file
); 
 607   obstack_1grow (&pre_prologue_obstack
, 0); 
 608   obstack_1grow (&post_prologue_obstack
, 0); 
 609   muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
)); 
 610   muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
)); 
 612   /* Find the right skeleton file.  */ 
 615       if (glr_parser 
|| nondeterministic_parser
) 
 621   /* About the skeletons. */ 
 623     char const *pkgdatadir 
= getenv ("BISON_PKGDATADIR"); 
 624     MUSCLE_INSERT_STRING ("pkgdatadir", pkgdatadir 
? pkgdatadir 
: PKGDATADIR
); 
 625     MUSCLE_INSERT_C_STRING ("skeleton", skeleton
); 
 630 /*----------------------------------------------------------. 
 631 | Output the parsing tables and the parser code to ftable.  | 
 632 `----------------------------------------------------------*/ 
 637   obstack_init (&format_obstack
); 
 646   /* Process the selected skeleton file.  */ 
 649   obstack_free (&format_obstack
, NULL
); 
 650   obstack_free (&pre_prologue_obstack
, NULL
); 
 651   obstack_free (&post_prologue_obstack
, NULL
);