Home | History | Annotate | Download | only in src
      1 /* Top level entry point of Bison.
      2 
      3    Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002, 2004, 2005
      4    Free Software Foundation, Inc.
      5 
      6    This file is part of Bison, the GNU Compiler Compiler.
      7 
      8    Bison 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 2, or (at your option)
     11    any later version.
     12 
     13    Bison 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 Bison; see the file COPYING.  If not, write to
     20    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     21    Boston, MA 02110-1301, USA.  */
     22 
     23 #include <config.h>
     24 #include "system.h"
     25 
     26 #include <bitset_stats.h>
     27 #include <bitset.h>
     28 #include <timevar.h>
     29 
     30 #include "LR0.h"
     31 #include "complain.h"
     32 #include "conflicts.h"
     33 #include "derives.h"
     34 #include "files.h"
     35 #include "getargs.h"
     36 #include "gram.h"
     37 #include "lalr.h"
     38 #include "muscle_tab.h"
     39 #include "nullable.h"
     40 #include "output.h"
     41 #include "print.h"
     42 #include "print_graph.h"
     43 #include "reader.h"
     44 #include "reduce.h"
     45 #include "symtab.h"
     46 #include "tables.h"
     47 #include "uniqstr.h"
     48 
     49 /* The name this program was run with, for messages.  */
     50 char *program_name;
     51 
     52 
     53 
     54 int
     55 main (int argc, char *argv[])
     56 {
     57   program_name = argv[0];
     58   setlocale (LC_ALL, "");
     59   (void) bindtextdomain (PACKAGE, LOCALEDIR);
     60   (void) bindtextdomain ("bison-runtime", LOCALEDIR);
     61   (void) textdomain (PACKAGE);
     62 
     63   uniqstrs_new ();
     64 
     65   getargs (argc, argv);
     66 
     67   timevar_report = trace_flag & trace_time;
     68   init_timevar ();
     69   timevar_start (TV_TOTAL);
     70 
     71   if (trace_flag & trace_bitsets)
     72     bitset_stats_enable ();
     73 
     74   muscle_init ();
     75 
     76   /* Read the input.  Copy some parts of it to FGUARD, FACTION, FTABLE
     77      and FATTRS.  In file reader.c.  The other parts are recorded in
     78      the grammar; see gram.h.  */
     79 
     80   timevar_push (TV_READER);
     81   reader ();
     82   timevar_pop (TV_READER);
     83 
     84   if (complaint_issued)
     85     goto finish;
     86 
     87   /* Find useless nonterminals and productions and reduce the grammar. */
     88   timevar_push (TV_REDUCE);
     89   reduce_grammar ();
     90   timevar_pop (TV_REDUCE);
     91 
     92   /* Record other info about the grammar.  In files derives and
     93      nullable.  */
     94   timevar_push (TV_SETS);
     95   derives_compute ();
     96   nullable_compute ();
     97   timevar_pop (TV_SETS);
     98 
     99   /* Convert to nondeterministic finite state machine.  In file LR0.
    100      See state.h for more info.  */
    101   timevar_push (TV_LR0);
    102   generate_states ();
    103   timevar_pop (TV_LR0);
    104 
    105   /* make it deterministic.  In file lalr.  */
    106   timevar_push (TV_LALR);
    107   lalr ();
    108   timevar_pop (TV_LALR);
    109 
    110   /* Find and record any conflicts: places where one token of
    111      look-ahead is not enough to disambiguate the parsing.  In file
    112      conflicts.  Also resolve s/r conflicts based on precedence
    113      declarations.  */
    114   timevar_push (TV_CONFLICTS);
    115   conflicts_solve ();
    116   conflicts_print ();
    117   timevar_pop (TV_CONFLICTS);
    118 
    119   /* Compute the parser tables.  */
    120   timevar_push (TV_ACTIONS);
    121   tables_generate ();
    122   timevar_pop (TV_ACTIONS);
    123 
    124   grammar_rules_never_reduced_report
    125     (_("rule never reduced because of conflicts"));
    126 
    127   /* Output file names. */
    128   compute_output_file_names ();
    129 
    130   /* Output the detailed report on the grammar.  */
    131   if (report_flag)
    132     {
    133       timevar_push (TV_REPORT);
    134       print_results ();
    135       timevar_pop (TV_REPORT);
    136     }
    137 
    138   /* Output the VCG graph.  */
    139   if (graph_flag)
    140     {
    141       timevar_push (TV_GRAPH);
    142       print_graph ();
    143       timevar_pop (TV_GRAPH);
    144     }
    145 
    146   /* Stop if there were errors, to avoid trashing previous output
    147      files.  */
    148   if (complaint_issued)
    149     goto finish;
    150 
    151   /* Look-ahead tokens are no longer needed. */
    152   timevar_push (TV_FREE);
    153   lalr_free ();
    154   timevar_pop (TV_FREE);
    155 
    156   /* Output the tables and the parser to ftable.  In file output.  */
    157   timevar_push (TV_PARSER);
    158   output ();
    159   timevar_pop (TV_PARSER);
    160 
    161   timevar_push (TV_FREE);
    162   nullable_free ();
    163   derives_free ();
    164   tables_free ();
    165   states_free ();
    166   reduce_free ();
    167   conflicts_free ();
    168   grammar_free ();
    169 
    170   /* The scanner memory cannot be released right after parsing, as it
    171      contains things such as user actions, prologue, epilogue etc.  */
    172   scanner_free ();
    173   muscle_free ();
    174   uniqstrs_free ();
    175   timevar_pop (TV_FREE);
    176 
    177   if (trace_flag & trace_bitsets)
    178     bitset_stats_dump (stderr);
    179 
    180  finish:
    181 
    182   /* Stop timing and print the times.  */
    183   timevar_stop (TV_TOTAL);
    184   timevar_print (stderr);
    185 
    186   return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
    187 }
    188