The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 1 | /* Top level entry point of Bison. |
| 2 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 3 | Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000-2002, 2004-2012 Free |
| 4 | Software Foundation, Inc. |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 5 | |
| 6 | This file is part of Bison, the GNU Compiler Compiler. |
| 7 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 8 | This program is free software: you can redistribute it and/or modify |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 9 | it under the terms of the GNU General Public License as published by |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 10 | the Free Software Foundation, either version 3 of the License, or |
| 11 | (at your option) any later version. |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 12 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 13 | This program is distributed in the hope that it will be useful, |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 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 |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 19 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 20 | |
| 21 | #include <config.h> |
| 22 | #include "system.h" |
| 23 | |
| 24 | #include <bitset_stats.h> |
| 25 | #include <bitset.h> |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 26 | #include <configmake.h> |
| 27 | #include <progname.h> |
| 28 | #include <quotearg.h> |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 29 | #include <timevar.h> |
| 30 | |
| 31 | #include "LR0.h" |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 32 | #include "closeout.h" |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 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" |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 40 | #include "ielr.h" |
| 41 | #include "muscle-tab.h" |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 42 | #include "nullable.h" |
| 43 | #include "output.h" |
| 44 | #include "print.h" |
| 45 | #include "print_graph.h" |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 46 | #include "print-xml.h" |
| 47 | #include <quote.h> |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 48 | #include "reader.h" |
| 49 | #include "reduce.h" |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 50 | #include "scan-code.h" |
| 51 | #include "scan-gram.h" |
| 52 | #include "scan-skel.h" |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 53 | #include "symtab.h" |
| 54 | #include "tables.h" |
| 55 | #include "uniqstr.h" |
| 56 | |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 57 | |
| 58 | int |
| 59 | main (int argc, char *argv[]) |
| 60 | { |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 61 | set_program_name (argv[0]); |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 62 | setlocale (LC_ALL, ""); |
| 63 | (void) bindtextdomain (PACKAGE, LOCALEDIR); |
| 64 | (void) bindtextdomain ("bison-runtime", LOCALEDIR); |
| 65 | (void) textdomain (PACKAGE); |
| 66 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 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 | |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 77 | uniqstrs_new (); |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 78 | muscle_init (); |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 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 | |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 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 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 112 | /* Compute LR(0) parser states. See state.h for more info. */ |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 113 | timevar_push (TV_LR0); |
| 114 | generate_states (); |
| 115 | timevar_pop (TV_LR0); |
| 116 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 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 (); |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 121 | |
| 122 | /* Find and record any conflicts: places where one token of |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 123 | lookahead is not enough to disambiguate the parsing. In file |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 124 | conflicts. Also resolve s/r conflicts based on precedence |
| 125 | declarations. */ |
| 126 | timevar_push (TV_CONFLICTS); |
| 127 | conflicts_solve (); |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 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 | } |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 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 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 145 | grammar_rules_useless_report |
| 146 | (_("rule useless in parser due to conflicts")); |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 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 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 159 | /* Output the graph. */ |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 160 | if (graph_flag) |
| 161 | { |
| 162 | timevar_push (TV_GRAPH); |
| 163 | print_graph (); |
| 164 | timevar_pop (TV_GRAPH); |
| 165 | } |
| 166 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 167 | /* Output xml. */ |
| 168 | if (xml_flag) |
| 169 | { |
| 170 | timevar_push (TV_XML); |
| 171 | print_xml (); |
| 172 | timevar_pop (TV_XML); |
| 173 | } |
| 174 | |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 175 | /* Stop if there were errors, to avoid trashing previous output |
| 176 | files. */ |
| 177 | if (complaint_issued) |
| 178 | goto finish; |
| 179 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 180 | /* Lookahead tokens are no longer needed. */ |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 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 (); |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 198 | output_file_names_free (); |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 199 | |
| 200 | /* The scanner memory cannot be released right after parsing, as it |
| 201 | contains things such as user actions, prologue, epilogue etc. */ |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 202 | gram_scanner_free (); |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 203 | muscle_free (); |
| 204 | uniqstrs_free (); |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 205 | code_scanner_free (); |
| 206 | skel_scanner_free (); |
| 207 | quotearg_free (); |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 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 | |
Ying Wang | 0543663 | 2013-04-05 16:01:00 -0700 | [diff] [blame] | 219 | cleanup_caret (); |
| 220 | |
The Android Open Source Project | cea198a | 2009-03-03 19:29:17 -0800 | [diff] [blame] | 221 | return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS; |
| 222 | } |