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 ("e_quoting_options, "'", "'"); 71 else 72 set_quoting_style ("e_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