]> 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
5ff5cf67 145 grammar_rules_useless_report (_("rule useless in parser due to conflicts"));
c8f002c7 146
342b8b6e
AD
147 /* Output file names. */
148 compute_output_file_names ();
149
b7c49edf 150 /* Output the detailed report on the grammar. */
ec3bc396 151 if (report_flag)
1509d42f
AD
152 {
153 timevar_push (TV_REPORT);
154 print_results ();
155 timevar_pop (TV_REPORT);
156 }
b7c49edf 157
35fe0834 158 /* Output the graph. */
64d15509 159 if (graph_flag)
1509d42f
AD
160 {
161 timevar_push (TV_GRAPH);
162 print_graph ();
163 timevar_pop (TV_GRAPH);
164 }
c4b66126 165
41d7a5f2
PE
166 /* Output xml. */
167 if (xml_flag)
168 {
169 timevar_push (TV_XML);
170 print_xml ();
171 timevar_pop (TV_XML);
172 }
173
c8f002c7
AD
174 /* Stop if there were errors, to avoid trashing previous output
175 files. */
5ca3209b 176 if (complaint_issued)
f6d0c239 177 goto finish;
c6f1a33c 178
742e4900 179 /* Lookahead tokens are no longer needed. */
3325ddc4
AD
180 timevar_push (TV_FREE);
181 lalr_free ();
182 timevar_pop (TV_FREE);
183
cc84fd5d 184 /* Output the tables and the parser to ftable. In file output. */
1509d42f 185 timevar_push (TV_PARSER);
cc84fd5d 186 output ();
1509d42f 187 timevar_pop (TV_PARSER);
a0f6b076 188
1509d42f 189 timevar_push (TV_FREE);
cd08e51e
AD
190 nullable_free ();
191 derives_free ();
c6f1a33c 192 tables_free ();
c7ca99d4 193 states_free ();
337c5bd1 194 reduce_free ();
b408954b 195 conflicts_free ();
76514394 196 grammar_free ();
eb095650 197 output_file_names_free ();
4515534c
AD
198
199 /* The scanner memory cannot be released right after parsing, as it
200 contains things such as user actions, prologue, epilogue etc. */
e9071366 201 gram_scanner_free ();
592e8d4d 202 muscle_free ();
17ee7397 203 uniqstrs_free ();
eb095650 204 code_scanner_free ();
08af01c2 205 skel_scanner_free ();
eb095650 206 quotearg_free ();
1509d42f 207 timevar_pop (TV_FREE);
722c4bfe 208
273a74fa 209 if (trace_flag & trace_bitsets)
640748ee 210 bitset_stats_dump (stderr);
613f5e1a 211
f6d0c239
PE
212 finish:
213
1509d42f
AD
214 /* Stop timing and print the times. */
215 timevar_stop (TV_TOTAL);
216 timevar_print (stderr);
217
e95aed63 218 return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 219}