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