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. */ 50char *program_name; 51 52 53 54int 55main (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