| 1 | /* Top level entry point of Bison. |
| 2 | |
| 3 | Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000-2002, 2004-2011 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 <quotearg.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 "ielr.h" |
| 39 | #include "muscle-tab.h" |
| 40 | #include "nullable.h" |
| 41 | #include "output.h" |
| 42 | #include "print.h" |
| 43 | #include "print_graph.h" |
| 44 | #include "print-xml.h" |
| 45 | #include "reader.h" |
| 46 | #include "reduce.h" |
| 47 | #include "scan-code.h" |
| 48 | #include "scan-gram.h" |
| 49 | #include "scan-skel.h" |
| 50 | #include "symtab.h" |
| 51 | #include "tables.h" |
| 52 | #include "uniqstr.h" |
| 53 | |
| 54 | |
| 55 | |
| 56 | int |
| 57 | main (int argc, char *argv[]) |
| 58 | { |
| 59 | program_name = argv[0]; |
| 60 | setlocale (LC_ALL, ""); |
| 61 | (void) bindtextdomain (PACKAGE, LOCALEDIR); |
| 62 | (void) bindtextdomain ("bison-runtime", LOCALEDIR); |
| 63 | (void) textdomain (PACKAGE); |
| 64 | |
| 65 | uniqstrs_new (); |
| 66 | muscle_init (); |
| 67 | |
| 68 | getargs (argc, argv); |
| 69 | |
| 70 | timevar_report = trace_flag & trace_time; |
| 71 | init_timevar (); |
| 72 | timevar_start (TV_TOTAL); |
| 73 | |
| 74 | if (trace_flag & trace_bitsets) |
| 75 | bitset_stats_enable (); |
| 76 | |
| 77 | /* Read the input. Copy some parts of it to FGUARD, FACTION, FTABLE |
| 78 | and FATTRS. In file reader.c. The other parts are recorded in |
| 79 | the grammar; see gram.h. */ |
| 80 | |
| 81 | timevar_push (TV_READER); |
| 82 | reader (); |
| 83 | timevar_pop (TV_READER); |
| 84 | |
| 85 | if (complaint_issued) |
| 86 | goto finish; |
| 87 | |
| 88 | /* Find useless nonterminals and productions and reduce the grammar. */ |
| 89 | timevar_push (TV_REDUCE); |
| 90 | reduce_grammar (); |
| 91 | timevar_pop (TV_REDUCE); |
| 92 | |
| 93 | /* Record other info about the grammar. In files derives and |
| 94 | nullable. */ |
| 95 | timevar_push (TV_SETS); |
| 96 | derives_compute (); |
| 97 | nullable_compute (); |
| 98 | timevar_pop (TV_SETS); |
| 99 | |
| 100 | /* Compute LR(0) parser states. See state.h for more info. */ |
| 101 | timevar_push (TV_LR0); |
| 102 | generate_states (); |
| 103 | timevar_pop (TV_LR0); |
| 104 | |
| 105 | /* Add lookahead sets to parser states. Except when LALR(1) is |
| 106 | requested, split states to eliminate LR(1)-relative |
| 107 | inadequacies. */ |
| 108 | ielr (); |
| 109 | |
| 110 | /* Find and record any conflicts: places where one token of |
| 111 | lookahead 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 | if (!muscle_percent_define_flag_if ("lr.keep-unreachable-states")) |
| 117 | { |
| 118 | state_number *old_to_new = xnmalloc (nstates, sizeof *old_to_new); |
| 119 | state_number nstates_old = nstates; |
| 120 | state_remove_unreachable_states (old_to_new); |
| 121 | lalr_update_state_numbers (old_to_new, nstates_old); |
| 122 | conflicts_update_state_numbers (old_to_new, nstates_old); |
| 123 | free (old_to_new); |
| 124 | } |
| 125 | conflicts_print (); |
| 126 | timevar_pop (TV_CONFLICTS); |
| 127 | |
| 128 | /* Compute the parser tables. */ |
| 129 | timevar_push (TV_ACTIONS); |
| 130 | tables_generate (); |
| 131 | timevar_pop (TV_ACTIONS); |
| 132 | |
| 133 | grammar_rules_useless_report |
| 134 | (_("rule useless in parser due to conflicts")); |
| 135 | |
| 136 | /* Output file names. */ |
| 137 | compute_output_file_names (); |
| 138 | |
| 139 | /* Output the detailed report on the grammar. */ |
| 140 | if (report_flag) |
| 141 | { |
| 142 | timevar_push (TV_REPORT); |
| 143 | print_results (); |
| 144 | timevar_pop (TV_REPORT); |
| 145 | } |
| 146 | |
| 147 | /* Output the graph. */ |
| 148 | if (graph_flag) |
| 149 | { |
| 150 | timevar_push (TV_GRAPH); |
| 151 | print_graph (); |
| 152 | timevar_pop (TV_GRAPH); |
| 153 | } |
| 154 | |
| 155 | /* Output xml. */ |
| 156 | if (xml_flag) |
| 157 | { |
| 158 | timevar_push (TV_XML); |
| 159 | print_xml (); |
| 160 | timevar_pop (TV_XML); |
| 161 | } |
| 162 | |
| 163 | /* Stop if there were errors, to avoid trashing previous output |
| 164 | files. */ |
| 165 | if (complaint_issued) |
| 166 | goto finish; |
| 167 | |
| 168 | /* Lookahead tokens are no longer needed. */ |
| 169 | timevar_push (TV_FREE); |
| 170 | lalr_free (); |
| 171 | timevar_pop (TV_FREE); |
| 172 | |
| 173 | /* Output the tables and the parser to ftable. In file output. */ |
| 174 | timevar_push (TV_PARSER); |
| 175 | output (); |
| 176 | timevar_pop (TV_PARSER); |
| 177 | |
| 178 | timevar_push (TV_FREE); |
| 179 | nullable_free (); |
| 180 | derives_free (); |
| 181 | tables_free (); |
| 182 | states_free (); |
| 183 | reduce_free (); |
| 184 | conflicts_free (); |
| 185 | grammar_free (); |
| 186 | output_file_names_free (); |
| 187 | |
| 188 | /* The scanner memory cannot be released right after parsing, as it |
| 189 | contains things such as user actions, prologue, epilogue etc. */ |
| 190 | gram_scanner_free (); |
| 191 | muscle_free (); |
| 192 | uniqstrs_free (); |
| 193 | code_scanner_free (); |
| 194 | skel_scanner_free (); |
| 195 | quotearg_free (); |
| 196 | timevar_pop (TV_FREE); |
| 197 | |
| 198 | if (trace_flag & trace_bitsets) |
| 199 | bitset_stats_dump (stderr); |
| 200 | |
| 201 | finish: |
| 202 | |
| 203 | /* Stop timing and print the times. */ |
| 204 | timevar_stop (TV_TOTAL); |
| 205 | timevar_print (stderr); |
| 206 | |
| 207 | return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS; |
| 208 | } |