]>
git.saurik.com Git - bison.git/blob - src/main.c
   1 /* Top level entry point of Bison. 
   3    Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000-2002, 2004-2015 Free 
   4    Software Foundation, Inc. 
   6    This file is part of Bison, the GNU Compiler Compiler. 
   8    This program is free software: you can redistribute it and/or modify 
   9    it under the terms of the GNU General Public License as published by 
  10    the Free Software Foundation, either version 3 of the License, or 
  11    (at your option) any later version. 
  13    This program is distributed in the hope that it will be useful, 
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  16    GNU General Public License for more details. 
  18    You should have received a copy of the GNU General Public License 
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ 
  24 #include <bitset_stats.h> 
  26 #include <configmake.h> 
  34 #include "conflicts.h" 
  41 #include "muscle-tab.h" 
  45 #include "print_graph.h" 
  46 #include "print-xml.h" 
  50 #include "scan-code.h" 
  51 #include "scan-gram.h" 
  52 #include "scan-skel.h" 
  59 main (int argc
, char *argv
[]) 
  61   set_program_name (argv
[0]); 
  62   setlocale (LC_ALL
, ""); 
  63   (void) bindtextdomain (PACKAGE
, LOCALEDIR
); 
  64   (void) bindtextdomain ("bison-runtime", LOCALEDIR
); 
  65   (void) textdomain (PACKAGE
); 
  68     char const *cp 
= getenv ("LC_CTYPE"); 
  69     if (cp 
&& STREQ (cp
, "C")) 
  70       set_custom_quoting ("e_quoting_options
, "'", "'"); 
  72       set_quoting_style ("e_quoting_options
, locale_quoting_style
); 
  75   atexit (close_stdout
); 
  83   timevar_report 
= trace_flag 
& trace_time
; 
  85   timevar_start (TV_TOTAL
); 
  87   if (trace_flag 
& trace_bitsets
) 
  88     bitset_stats_enable (); 
  90   /* Read the input.  Copy some parts of it to FGUARD, FACTION, FTABLE 
  91      and FATTRS.  In file reader.c.  The other parts are recorded in 
  92      the grammar; see gram.h.  */ 
  94   timevar_push (TV_READER
); 
  96   timevar_pop (TV_READER
); 
  98   if (complaint_status 
== status_complaint
) 
 101   /* Find useless nonterminals and productions and reduce the grammar. */ 
 102   timevar_push (TV_REDUCE
); 
 104   timevar_pop (TV_REDUCE
); 
 106   /* Record other info about the grammar.  In files derives and 
 108   timevar_push (TV_SETS
); 
 111   timevar_pop (TV_SETS
); 
 113   /* Compute LR(0) parser states.  See state.h for more info.  */ 
 114   timevar_push (TV_LR0
); 
 116   timevar_pop (TV_LR0
); 
 118   /* Add lookahead sets to parser states.  Except when LALR(1) is 
 119      requested, split states to eliminate LR(1)-relative 
 123   /* Find and record any conflicts: places where one token of 
 124      lookahead is not enough to disambiguate the parsing.  In file 
 125      conflicts.  Also resolve s/r conflicts based on precedence 
 127   timevar_push (TV_CONFLICTS
); 
 129   if (!muscle_percent_define_flag_if ("lr.keep-unreachable-state")) 
 131       state_number 
*old_to_new 
= xnmalloc (nstates
, sizeof *old_to_new
); 
 132       state_number nstates_old 
= nstates
; 
 133       state_remove_unreachable_states (old_to_new
); 
 134       lalr_update_state_numbers (old_to_new
, nstates_old
); 
 135       conflicts_update_state_numbers (old_to_new
, nstates_old
); 
 139   timevar_pop (TV_CONFLICTS
); 
 141   /* Compute the parser tables.  */ 
 142   timevar_push (TV_ACTIONS
); 
 144   timevar_pop (TV_ACTIONS
); 
 146   grammar_rules_useless_report (_("rule useless in parser due to conflicts")); 
 148   print_precedence_warnings (); 
 150   /* Output file names. */ 
 151   compute_output_file_names (); 
 153   /* Output the detailed report on the grammar.  */ 
 156       timevar_push (TV_REPORT
); 
 158       timevar_pop (TV_REPORT
); 
 161   /* Output the graph.  */ 
 164       timevar_push (TV_GRAPH
); 
 166       timevar_pop (TV_GRAPH
); 
 172       timevar_push (TV_XML
); 
 174       timevar_pop (TV_XML
); 
 177   /* Stop if there were errors, to avoid trashing previous output 
 179   if (complaint_status 
== status_complaint
) 
 182   /* Lookahead tokens are no longer needed. */ 
 183   timevar_push (TV_FREE
); 
 185   timevar_pop (TV_FREE
); 
 187   /* Output the tables and the parser to ftable.  In file output.  */ 
 188   timevar_push (TV_PARSER
); 
 190   timevar_pop (TV_PARSER
); 
 192   timevar_push (TV_FREE
); 
 200   output_file_names_free (); 
 202   /* The scanner memory cannot be released right after parsing, as it 
 203      contains things such as user actions, prologue, epilogue etc.  */ 
 204   gram_scanner_free (); 
 207   code_scanner_free (); 
 208   skel_scanner_free (); 
 210   timevar_pop (TV_FREE
); 
 212   if (trace_flag 
& trace_bitsets
) 
 213     bitset_stats_dump (stderr
); 
 217   /* Stop timing and print the times.  */ 
 218   timevar_stop (TV_TOTAL
); 
 219   timevar_print (stderr
); 
 223   return complaint_status 
? EXIT_FAILURE 
: EXIT_SUCCESS
;