]> git.saurik.com Git - bison.git/blame - src/main.c
doc: fix environment issues.
[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"
17ee7397
PE
47#include "reader.h"
48#include "reduce.h"
eb095650 49#include "scan-code.h"
0c8e079f 50#include "scan-gram.h"
08af01c2 51#include "scan-skel.h"
17ee7397
PE
52#include "symtab.h"
53#include "tables.h"
54#include "uniqstr.h"
54bd0db4 55
caf23d24 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
acb58956
JM
67 atexit (close_stdout);
68
17ee7397 69 uniqstrs_new ();
9fe5a457 70 muscle_init ();
95612cfa 71
cc84fd5d 72 getargs (argc, argv);
a0f6b076 73
17ee7397 74 timevar_report = trace_flag & trace_time;
1509d42f
AD
75 init_timevar ();
76 timevar_start (TV_TOTAL);
77
273a74fa 78 if (trace_flag & trace_bitsets)
613f5e1a
AD
79 bitset_stats_enable ();
80
cc84fd5d
AD
81 /* Read the input. Copy some parts of it to FGUARD, FACTION, FTABLE
82 and FATTRS. In file reader.c. The other parts are recorded in
83 the grammar; see gram.h. */
640748ee 84
1509d42f
AD
85 timevar_push (TV_READER);
86 reader ();
87 timevar_pop (TV_READER);
640748ee 88
5ca3209b 89 if (complaint_issued)
f6d0c239 90 goto finish;
54bd0db4 91
00238958 92 /* Find useless nonterminals and productions and reduce the grammar. */
1509d42f 93 timevar_push (TV_REDUCE);
cc84fd5d 94 reduce_grammar ();
1509d42f 95 timevar_pop (TV_REDUCE);
640748ee 96
7da99ede
AD
97 /* Record other info about the grammar. In files derives and
98 nullable. */
1509d42f 99 timevar_push (TV_SETS);
bb0027a9
AD
100 derives_compute ();
101 nullable_compute ();
1509d42f 102 timevar_pop (TV_SETS);
54bd0db4 103
fca9c5ef 104 /* Compute LR(0) parser states. See state.h for more info. */
1509d42f 105 timevar_push (TV_LR0);
cc84fd5d 106 generate_states ();
1509d42f 107 timevar_pop (TV_LR0);
54bd0db4 108
fca9c5ef
JD
109 /* Add lookahead sets to parser states. Except when LALR(1) is
110 requested, split states to eliminate LR(1)-relative
111 inadequacies. */
db34f798 112 ielr ();
54bd0db4 113
cc84fd5d 114 /* Find and record any conflicts: places where one token of
742e4900 115 lookahead is not enough to disambiguate the parsing. In file
cc84fd5d
AD
116 conflicts. Also resolve s/r conflicts based on precedence
117 declarations. */
1509d42f 118 timevar_push (TV_CONFLICTS);
b408954b 119 conflicts_solve ();
67212941 120 if (!muscle_percent_define_flag_if ("lr.keep-unreachable-states"))
31984206
JD
121 {
122 state_number *old_to_new = xnmalloc (nstates, sizeof *old_to_new);
123 state_number nstates_old = nstates;
124 state_remove_unreachable_states (old_to_new);
125 lalr_update_state_numbers (old_to_new, nstates_old);
126 conflicts_update_state_numbers (old_to_new, nstates_old);
127 free (old_to_new);
128 }
0df87bb6 129 conflicts_print ();
1509d42f 130 timevar_pop (TV_CONFLICTS);
342b8b6e 131
c8f002c7
AD
132 /* Compute the parser tables. */
133 timevar_push (TV_ACTIONS);
134 tables_generate ();
135 timevar_pop (TV_ACTIONS);
136
cff03fb2
JD
137 grammar_rules_useless_report
138 (_("rule useless in parser due to conflicts"));
c8f002c7 139
342b8b6e
AD
140 /* Output file names. */
141 compute_output_file_names ();
142
b7c49edf 143 /* Output the detailed report on the grammar. */
ec3bc396 144 if (report_flag)
1509d42f
AD
145 {
146 timevar_push (TV_REPORT);
147 print_results ();
148 timevar_pop (TV_REPORT);
149 }
b7c49edf 150
35fe0834 151 /* Output the graph. */
64d15509 152 if (graph_flag)
1509d42f
AD
153 {
154 timevar_push (TV_GRAPH);
155 print_graph ();
156 timevar_pop (TV_GRAPH);
157 }
c4b66126 158
41d7a5f2
PE
159 /* Output xml. */
160 if (xml_flag)
161 {
162 timevar_push (TV_XML);
163 print_xml ();
164 timevar_pop (TV_XML);
165 }
166
c8f002c7
AD
167 /* Stop if there were errors, to avoid trashing previous output
168 files. */
5ca3209b 169 if (complaint_issued)
f6d0c239 170 goto finish;
c6f1a33c 171
742e4900 172 /* Lookahead tokens are no longer needed. */
3325ddc4
AD
173 timevar_push (TV_FREE);
174 lalr_free ();
175 timevar_pop (TV_FREE);
176
cc84fd5d 177 /* Output the tables and the parser to ftable. In file output. */
1509d42f 178 timevar_push (TV_PARSER);
cc84fd5d 179 output ();
1509d42f 180 timevar_pop (TV_PARSER);
a0f6b076 181
1509d42f 182 timevar_push (TV_FREE);
cd08e51e
AD
183 nullable_free ();
184 derives_free ();
c6f1a33c 185 tables_free ();
c7ca99d4 186 states_free ();
337c5bd1 187 reduce_free ();
b408954b 188 conflicts_free ();
76514394 189 grammar_free ();
eb095650 190 output_file_names_free ();
4515534c
AD
191
192 /* The scanner memory cannot be released right after parsing, as it
193 contains things such as user actions, prologue, epilogue etc. */
e9071366 194 gram_scanner_free ();
592e8d4d 195 muscle_free ();
17ee7397 196 uniqstrs_free ();
eb095650 197 code_scanner_free ();
08af01c2 198 skel_scanner_free ();
eb095650 199 quotearg_free ();
1509d42f 200 timevar_pop (TV_FREE);
722c4bfe 201
273a74fa 202 if (trace_flag & trace_bitsets)
640748ee 203 bitset_stats_dump (stderr);
613f5e1a 204
f6d0c239
PE
205 finish:
206
1509d42f
AD
207 /* Stop timing and print the times. */
208 timevar_stop (TV_TOTAL);
209 timevar_print (stderr);
210
e95aed63 211 return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 212}