Home | History | Annotate | Download | only in src
      1 /* Top level entry point of Bison.
      2 
      3    Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000-2002, 2004-2012 Free
      4    Software Foundation, Inc.
      5 
      6    This file is part of Bison, the GNU Compiler Compiler.
      7 
      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.
     12 
     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.
     17 
     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/>.  */
     20 
     21 #include <config.h>
     22 #include "system.h"
     23 
     24 #include <bitset_stats.h>
     25 #include <bitset.h>
     26 #include <configmake.h>
     27 #include <progname.h>
     28 #include <quotearg.h>
     29 #include <timevar.h>
     30 
     31 #include "LR0.h"
     32 #include "closeout.h"
     33 #include "complain.h"
     34 #include "conflicts.h"
     35 #include "derives.h"
     36 #include "files.h"
     37 #include "getargs.h"
     38 #include "gram.h"
     39 #include "lalr.h"
     40 #include "ielr.h"
     41 #include "muscle-tab.h"
     42 #include "nullable.h"
     43 #include "output.h"
     44 #include "print.h"
     45 #include "print_graph.h"
     46 #include "print-xml.h"
     47 #include <quote.h>
     48 #include "reader.h"
     49 #include "reduce.h"
     50 #include "scan-code.h"
     51 #include "scan-gram.h"
     52 #include "scan-skel.h"
     53 #include "symtab.h"
     54 #include "tables.h"
     55 #include "uniqstr.h"
     56 
     57 
     58 int
     59 main (int argc, char *argv[])
     60 {
     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);
     66 
     67   {
     68     char const *cp = getenv ("LC_CTYPE");
     69     if (cp && !strcmp (cp, "C"))
     70       set_custom_quoting (&quote_quoting_options, "'", "'");
     71     else
     72       set_quoting_style (&quote_quoting_options, locale_quoting_style);
     73   }
     74 
     75   atexit (close_stdout);
     76 
     77   uniqstrs_new ();
     78   muscle_init ();
     79 
     80   getargs (argc, argv);
     81 
     82   timevar_report = trace_flag & trace_time;
     83   init_timevar ();
     84   timevar_start (TV_TOTAL);
     85 
     86   if (trace_flag & trace_bitsets)
     87     bitset_stats_enable ();
     88 
     89   /* Read the input.  Copy some parts of it to FGUARD, FACTION, FTABLE
     90      and FATTRS.  In file reader.c.  The other parts are recorded in
     91      the grammar; see gram.h.  */
     92 
     93   timevar_push (TV_READER);
     94   reader ();
     95   timevar_pop (TV_READER);
     96 
     97   if (complaint_issued)
     98     goto finish;
     99 
    100   /* Find useless nonterminals and productions and reduce the grammar. */
    101   timevar_push (TV_REDUCE);
    102   reduce_grammar ();
    103   timevar_pop (TV_REDUCE);
    104 
    105   /* Record other info about the grammar.  In files derives and
    106      nullable.  */
    107   timevar_push (TV_SETS);
    108   derives_compute ();
    109   nullable_compute ();
    110   timevar_pop (TV_SETS);
    111 
    112   /* Compute LR(0) parser states.  See state.h for more info.  */
    113   timevar_push (TV_LR0);
    114   generate_states ();
    115   timevar_pop (TV_LR0);
    116 
    117   /* Add lookahead sets to parser states.  Except when LALR(1) is
    118      requested, split states to eliminate LR(1)-relative
    119      inadequacies.  */
    120   ielr ();
    121 
    122   /* Find and record any conflicts: places where one token of
    123      lookahead is not enough to disambiguate the parsing.  In file
    124      conflicts.  Also resolve s/r conflicts based on precedence
    125      declarations.  */
    126   timevar_push (TV_CONFLICTS);
    127   conflicts_solve ();
    128   if (!muscle_percent_define_flag_if ("lr.keep-unreachable-states"))
    129     {
    130       state_number *old_to_new = xnmalloc (nstates, sizeof *old_to_new);
    131       state_number nstates_old = nstates;
    132       state_remove_unreachable_states (old_to_new);
    133       lalr_update_state_numbers (old_to_new, nstates_old);
    134       conflicts_update_state_numbers (old_to_new, nstates_old);
    135       free (old_to_new);
    136     }
    137   conflicts_print ();
    138   timevar_pop (TV_CONFLICTS);
    139 
    140   /* Compute the parser tables.  */
    141   timevar_push (TV_ACTIONS);
    142   tables_generate ();
    143   timevar_pop (TV_ACTIONS);
    144 
    145   grammar_rules_useless_report
    146     (_("rule useless in parser due to conflicts"));
    147 
    148   /* Output file names. */
    149   compute_output_file_names ();
    150 
    151   /* Output the detailed report on the grammar.  */
    152   if (report_flag)
    153     {
    154       timevar_push (TV_REPORT);
    155       print_results ();
    156       timevar_pop (TV_REPORT);
    157     }
    158 
    159   /* Output the graph.  */
    160   if (graph_flag)
    161     {
    162       timevar_push (TV_GRAPH);
    163       print_graph ();
    164       timevar_pop (TV_GRAPH);
    165     }
    166 
    167   /* Output xml.  */
    168   if (xml_flag)
    169     {
    170       timevar_push (TV_XML);
    171       print_xml ();
    172       timevar_pop (TV_XML);
    173     }
    174 
    175   /* Stop if there were errors, to avoid trashing previous output
    176      files.  */
    177   if (complaint_issued)
    178     goto finish;
    179 
    180   /* Lookahead tokens are no longer needed. */
    181   timevar_push (TV_FREE);
    182   lalr_free ();
    183   timevar_pop (TV_FREE);
    184 
    185   /* Output the tables and the parser to ftable.  In file output.  */
    186   timevar_push (TV_PARSER);
    187   output ();
    188   timevar_pop (TV_PARSER);
    189 
    190   timevar_push (TV_FREE);
    191   nullable_free ();
    192   derives_free ();
    193   tables_free ();
    194   states_free ();
    195   reduce_free ();
    196   conflicts_free ();
    197   grammar_free ();
    198   output_file_names_free ();
    199 
    200   /* The scanner memory cannot be released right after parsing, as it
    201      contains things such as user actions, prologue, epilogue etc.  */
    202   gram_scanner_free ();
    203   muscle_free ();
    204   uniqstrs_free ();
    205   code_scanner_free ();
    206   skel_scanner_free ();
    207   quotearg_free ();
    208   timevar_pop (TV_FREE);
    209 
    210   if (trace_flag & trace_bitsets)
    211     bitset_stats_dump (stderr);
    212 
    213  finish:
    214 
    215   /* Stop timing and print the times.  */
    216   timevar_stop (TV_TOTAL);
    217   timevar_print (stderr);
    218 
    219   cleanup_caret ();
    220 
    221   return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
    222 }
    223