]> 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
34136e65 3 Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000-2002, 2004-2012 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 ();
95612cfa 79
cc84fd5d 80 getargs (argc, argv);
a0f6b076 81
17ee7397 82 timevar_report = trace_flag & trace_time;
1509d42f
AD
83 init_timevar ();
84 timevar_start (TV_TOTAL);
85
273a74fa 86 if (trace_flag & trace_bitsets)
613f5e1a
AD
87 bitset_stats_enable ();
88
cc84fd5d
AD
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. */
640748ee 92
1509d42f
AD
93 timevar_push (TV_READER);
94 reader ();
95 timevar_pop (TV_READER);
640748ee 96
5ca3209b 97 if (complaint_issued)
f6d0c239 98 goto finish;
54bd0db4 99
00238958 100 /* Find useless nonterminals and productions and reduce the grammar. */
1509d42f 101 timevar_push (TV_REDUCE);
cc84fd5d 102 reduce_grammar ();
1509d42f 103 timevar_pop (TV_REDUCE);
640748ee 104
7da99ede
AD
105 /* Record other info about the grammar. In files derives and
106 nullable. */
1509d42f 107 timevar_push (TV_SETS);
bb0027a9
AD
108 derives_compute ();
109 nullable_compute ();
1509d42f 110 timevar_pop (TV_SETS);
54bd0db4 111
fca9c5ef 112 /* Compute LR(0) parser states. See state.h for more info. */
1509d42f 113 timevar_push (TV_LR0);
cc84fd5d 114 generate_states ();
1509d42f 115 timevar_pop (TV_LR0);
54bd0db4 116
fca9c5ef
JD
117 /* Add lookahead sets to parser states. Except when LALR(1) is
118 requested, split states to eliminate LR(1)-relative
119 inadequacies. */
db34f798 120 ielr ();
54bd0db4 121
cc84fd5d 122 /* Find and record any conflicts: places where one token of
742e4900 123 lookahead is not enough to disambiguate the parsing. In file
cc84fd5d
AD
124 conflicts. Also resolve s/r conflicts based on precedence
125 declarations. */
1509d42f 126 timevar_push (TV_CONFLICTS);
b408954b 127 conflicts_solve ();
67212941 128 if (!muscle_percent_define_flag_if ("lr.keep-unreachable-states"))
31984206
JD
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 }
0df87bb6 137 conflicts_print ();
1509d42f 138 timevar_pop (TV_CONFLICTS);
342b8b6e 139
c8f002c7
AD
140 /* Compute the parser tables. */
141 timevar_push (TV_ACTIONS);
142 tables_generate ();
143 timevar_pop (TV_ACTIONS);
144
cff03fb2
JD
145 grammar_rules_useless_report
146 (_("rule useless in parser due to conflicts"));
c8f002c7 147
342b8b6e
AD
148 /* Output file names. */
149 compute_output_file_names ();
150
b7c49edf 151 /* Output the detailed report on the grammar. */
ec3bc396 152 if (report_flag)
1509d42f
AD
153 {
154 timevar_push (TV_REPORT);
155 print_results ();
156 timevar_pop (TV_REPORT);
157 }
b7c49edf 158
35fe0834 159 /* Output the graph. */
64d15509 160 if (graph_flag)
1509d42f
AD
161 {
162 timevar_push (TV_GRAPH);
163 print_graph ();
164 timevar_pop (TV_GRAPH);
165 }
c4b66126 166
41d7a5f2
PE
167 /* Output xml. */
168 if (xml_flag)
169 {
170 timevar_push (TV_XML);
171 print_xml ();
172 timevar_pop (TV_XML);
173 }
174
c8f002c7
AD
175 /* Stop if there were errors, to avoid trashing previous output
176 files. */
5ca3209b 177 if (complaint_issued)
f6d0c239 178 goto finish;
c6f1a33c 179
742e4900 180 /* Lookahead tokens are no longer needed. */
3325ddc4
AD
181 timevar_push (TV_FREE);
182 lalr_free ();
183 timevar_pop (TV_FREE);
184
cc84fd5d 185 /* Output the tables and the parser to ftable. In file output. */
1509d42f 186 timevar_push (TV_PARSER);
cc84fd5d 187 output ();
1509d42f 188 timevar_pop (TV_PARSER);
a0f6b076 189
1509d42f 190 timevar_push (TV_FREE);
cd08e51e
AD
191 nullable_free ();
192 derives_free ();
c6f1a33c 193 tables_free ();
c7ca99d4 194 states_free ();
337c5bd1 195 reduce_free ();
b408954b 196 conflicts_free ();
76514394 197 grammar_free ();
eb095650 198 output_file_names_free ();
4515534c
AD
199
200 /* The scanner memory cannot be released right after parsing, as it
201 contains things such as user actions, prologue, epilogue etc. */
e9071366 202 gram_scanner_free ();
592e8d4d 203 muscle_free ();
17ee7397 204 uniqstrs_free ();
eb095650 205 code_scanner_free ();
08af01c2 206 skel_scanner_free ();
eb095650 207 quotearg_free ();
1509d42f 208 timevar_pop (TV_FREE);
722c4bfe 209
273a74fa 210 if (trace_flag & trace_bitsets)
640748ee 211 bitset_stats_dump (stderr);
613f5e1a 212
f6d0c239
PE
213 finish:
214
1509d42f
AD
215 /* Stop timing and print the times. */
216 timevar_stop (TV_TOTAL);
217 timevar_print (stderr);
218
e95aed63 219 return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 220}