]> git.saurik.com Git - bison.git/blame - src/main.c
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / main.c
CommitLineData
a54a1bdc
PE
1/* Top level entry point of Bison.
2
7d6bad19 3 Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000-2002, 2004-2013 Free
575619af 4 Software Foundation, Inc.
54bd0db4 5
e87b5700 6 This file is part of Bison, the GNU Compiler Compiler.
54bd0db4 7
f16b0819 8 This program is free software: you can redistribute it and/or modify
e87b5700 9 it under the terms of the GNU General Public License as published by
f16b0819
PE
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
54bd0db4 12
f16b0819 13 This program is distributed in the hope that it will be useful,
e87b5700
AD
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.
54bd0db4 17
e87b5700 18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
54bd0db4 20
2cec9080 21#include <config.h>
54bd0db4 22#include "system.h"
17ee7397
PE
23
24#include <bitset_stats.h>
25#include <bitset.h>
3b2942e6 26#include <configmake.h>
4d699f44 27#include <progname.h>
eb095650 28#include <quotearg.h>
17ee7397
PE
29#include <timevar.h>
30
31#include "LR0.h"
acb58956 32#include "closeout.h"
a0f6b076 33#include "complain.h"
17ee7397 34#include "conflicts.h"
cc84fd5d 35#include "derives.h"
17ee7397
PE
36#include "files.h"
37#include "getargs.h"
38#include "gram.h"
a70083a3 39#include "lalr.h"
db34f798 40#include "ielr.h"
00f5d575 41#include "muscle-tab.h"
3519ec76 42#include "nullable.h"
17ee7397 43#include "output.h"
07a58c13 44#include "print.h"
c4b66126 45#include "print_graph.h"
41d7a5f2 46#include "print-xml.h"
39ac1214 47#include <quote.h>
17ee7397
PE
48#include "reader.h"
49#include "reduce.h"
eb095650 50#include "scan-code.h"
0c8e079f 51#include "scan-gram.h"
08af01c2 52#include "scan-skel.h"
17ee7397
PE
53#include "symtab.h"
54#include "tables.h"
55#include "uniqstr.h"
54bd0db4 56
caf23d24 57
54bd0db4 58int
d2729d44 59main (int argc, char *argv[])
54bd0db4 60{
4d699f44 61 set_program_name (argv[0]);
29340571 62 setlocale (LC_ALL, "");
04098407
PE
63 (void) bindtextdomain (PACKAGE, LOCALEDIR);
64 (void) bindtextdomain ("bison-runtime", LOCALEDIR);
65 (void) textdomain (PACKAGE);
29340571 66
39ac1214
AD
67 {
68 char const *cp = getenv ("LC_CTYPE");
69 if (cp && STREQ (cp, "C"))
70 set_custom_quoting (&quote_quoting_options, "'", "'");
71 else
72 set_quoting_style (&quote_quoting_options, locale_quoting_style);
73 }
74
acb58956
JM
75 atexit (close_stdout);
76
17ee7397 77 uniqstrs_new ();
9fe5a457 78 muscle_init ();
808e523d 79 complain_init ();
95612cfa 80
cc84fd5d 81 getargs (argc, argv);
a0f6b076 82
17ee7397 83 timevar_report = trace_flag & trace_time;
1509d42f
AD
84 init_timevar ();
85 timevar_start (TV_TOTAL);
86
273a74fa 87 if (trace_flag & trace_bitsets)
613f5e1a
AD
88 bitset_stats_enable ();
89
cc84fd5d
AD
90 /* Read the input. Copy some parts of it to FGUARD, FACTION, FTABLE
91 and FATTRS. In file reader.c. The other parts are recorded in
92 the grammar; see gram.h. */
640748ee 93
1509d42f
AD
94 timevar_push (TV_READER);
95 reader ();
96 timevar_pop (TV_READER);
640748ee 97
697a8022 98 if (complaint_status == status_complaint)
f6d0c239 99 goto finish;
54bd0db4 100
00238958 101 /* Find useless nonterminals and productions and reduce the grammar. */
1509d42f 102 timevar_push (TV_REDUCE);
cc84fd5d 103 reduce_grammar ();
1509d42f 104 timevar_pop (TV_REDUCE);
640748ee 105
7da99ede
AD
106 /* Record other info about the grammar. In files derives and
107 nullable. */
1509d42f 108 timevar_push (TV_SETS);
bb0027a9
AD
109 derives_compute ();
110 nullable_compute ();
1509d42f 111 timevar_pop (TV_SETS);
54bd0db4 112
fca9c5ef 113 /* Compute LR(0) parser states. See state.h for more info. */
1509d42f 114 timevar_push (TV_LR0);
cc84fd5d 115 generate_states ();
1509d42f 116 timevar_pop (TV_LR0);
54bd0db4 117
fca9c5ef
JD
118 /* Add lookahead sets to parser states. Except when LALR(1) is
119 requested, split states to eliminate LR(1)-relative
120 inadequacies. */
db34f798 121 ielr ();
54bd0db4 122
cc84fd5d 123 /* Find and record any conflicts: places where one token of
742e4900 124 lookahead is not enough to disambiguate the parsing. In file
cc84fd5d
AD
125 conflicts. Also resolve s/r conflicts based on precedence
126 declarations. */
1509d42f 127 timevar_push (TV_CONFLICTS);
b408954b 128 conflicts_solve ();
f3bc3386 129 if (!muscle_percent_define_flag_if ("lr.keep-unreachable-state"))
31984206
JD
130 {
131 state_number *old_to_new = xnmalloc (nstates, sizeof *old_to_new);
132 state_number nstates_old = nstates;
133 state_remove_unreachable_states (old_to_new);
134 lalr_update_state_numbers (old_to_new, nstates_old);
135 conflicts_update_state_numbers (old_to_new, nstates_old);
136 free (old_to_new);
137 }
0df87bb6 138 conflicts_print ();
1509d42f 139 timevar_pop (TV_CONFLICTS);
342b8b6e 140
c8f002c7
AD
141 /* Compute the parser tables. */
142 timevar_push (TV_ACTIONS);
143 tables_generate ();
144 timevar_pop (TV_ACTIONS);
145
5ff5cf67 146 grammar_rules_useless_report (_("rule useless in parser due to conflicts"));
c8f002c7 147
284bc49c
VT
148 print_precedence_warnings ();
149
342b8b6e
AD
150 /* Output file names. */
151 compute_output_file_names ();
152
b7c49edf 153 /* Output the detailed report on the grammar. */
ec3bc396 154 if (report_flag)
1509d42f
AD
155 {
156 timevar_push (TV_REPORT);
157 print_results ();
158 timevar_pop (TV_REPORT);
159 }
b7c49edf 160
35fe0834 161 /* Output the graph. */
64d15509 162 if (graph_flag)
1509d42f
AD
163 {
164 timevar_push (TV_GRAPH);
165 print_graph ();
166 timevar_pop (TV_GRAPH);
167 }
c4b66126 168
41d7a5f2
PE
169 /* Output xml. */
170 if (xml_flag)
171 {
172 timevar_push (TV_XML);
173 print_xml ();
174 timevar_pop (TV_XML);
175 }
176
c8f002c7
AD
177 /* Stop if there were errors, to avoid trashing previous output
178 files. */
697a8022 179 if (complaint_status == status_complaint)
f6d0c239 180 goto finish;
c6f1a33c 181
742e4900 182 /* Lookahead tokens are no longer needed. */
3325ddc4
AD
183 timevar_push (TV_FREE);
184 lalr_free ();
185 timevar_pop (TV_FREE);
186
cc84fd5d 187 /* Output the tables and the parser to ftable. In file output. */
1509d42f 188 timevar_push (TV_PARSER);
cc84fd5d 189 output ();
1509d42f 190 timevar_pop (TV_PARSER);
a0f6b076 191
1509d42f 192 timevar_push (TV_FREE);
cd08e51e
AD
193 nullable_free ();
194 derives_free ();
c6f1a33c 195 tables_free ();
c7ca99d4 196 states_free ();
337c5bd1 197 reduce_free ();
b408954b 198 conflicts_free ();
76514394 199 grammar_free ();
eb095650 200 output_file_names_free ();
4515534c
AD
201
202 /* The scanner memory cannot be released right after parsing, as it
203 contains things such as user actions, prologue, epilogue etc. */
e9071366 204 gram_scanner_free ();
592e8d4d 205 muscle_free ();
17ee7397 206 uniqstrs_free ();
eb095650 207 code_scanner_free ();
08af01c2 208 skel_scanner_free ();
eb095650 209 quotearg_free ();
1509d42f 210 timevar_pop (TV_FREE);
722c4bfe 211
273a74fa 212 if (trace_flag & trace_bitsets)
640748ee 213 bitset_stats_dump (stderr);
613f5e1a 214
f6d0c239
PE
215 finish:
216
1509d42f
AD
217 /* Stop timing and print the times. */
218 timevar_stop (TV_TOTAL);
219 timevar_print (stderr);
220
3f5d1b2c
TR
221 cleanup_caret ();
222
697a8022 223 return complaint_status ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 224}