]> git.saurik.com Git - bison.git/blame - src/main.c
Fix push parsing memory leak reported by Brandon Lucia at
[bison.git] / src / main.c
CommitLineData
a54a1bdc
PE
1/* Top level entry point of Bison.
2
3b2942e6 3 Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002, 2004,
279cabb6 4 2005, 2006, 2007 Free Software Foundation, Inc.
54bd0db4 5
e87b5700 6 This file is part of Bison, the GNU Compiler Compiler.
54bd0db4 7
e87b5700
AD
8 Bison is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
54bd0db4 12
e87b5700
AD
13 Bison is distributed in the hope that it will be useful,
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
AD
18 You should have received a copy of the GNU General Public License
19 along with Bison; see the file COPYING. If not, write to
0fb669f9
PE
20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
54bd0db4 22
2cec9080 23#include <config.h>
54bd0db4 24#include "system.h"
17ee7397
PE
25
26#include <bitset_stats.h>
27#include <bitset.h>
3b2942e6 28#include <configmake.h>
eb095650 29#include <quotearg.h>
17ee7397
PE
30#include <timevar.h>
31
32#include "LR0.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"
17ee7397 40#include "muscle_tab.h"
3519ec76 41#include "nullable.h"
17ee7397 42#include "output.h"
07a58c13 43#include "print.h"
c4b66126 44#include "print_graph.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 ();
95612cfa 66
cc84fd5d 67 getargs (argc, argv);
a0f6b076 68
17ee7397 69 timevar_report = trace_flag & trace_time;
1509d42f
AD
70 init_timevar ();
71 timevar_start (TV_TOTAL);
72
273a74fa 73 if (trace_flag & trace_bitsets)
613f5e1a
AD
74 bitset_stats_enable ();
75
11d82f03 76 muscle_init ();
54bd0db4 77
cc84fd5d
AD
78 /* Read the input. Copy some parts of it to FGUARD, FACTION, FTABLE
79 and FATTRS. In file reader.c. The other parts are recorded in
80 the grammar; see gram.h. */
640748ee 81
1509d42f
AD
82 timevar_push (TV_READER);
83 reader ();
84 timevar_pop (TV_READER);
640748ee 85
5ca3209b 86 if (complaint_issued)
f6d0c239 87 goto finish;
54bd0db4 88
00238958 89 /* Find useless nonterminals and productions and reduce the grammar. */
1509d42f 90 timevar_push (TV_REDUCE);
cc84fd5d 91 reduce_grammar ();
1509d42f 92 timevar_pop (TV_REDUCE);
640748ee 93
7da99ede
AD
94 /* Record other info about the grammar. In files derives and
95 nullable. */
1509d42f 96 timevar_push (TV_SETS);
bb0027a9
AD
97 derives_compute ();
98 nullable_compute ();
1509d42f 99 timevar_pop (TV_SETS);
54bd0db4 100
7da99ede 101 /* Convert to nondeterministic finite state machine. In file LR0.
54bd0db4 102 See state.h for more info. */
1509d42f 103 timevar_push (TV_LR0);
cc84fd5d 104 generate_states ();
1509d42f 105 timevar_pop (TV_LR0);
54bd0db4
RS
106
107 /* make it deterministic. In file lalr. */
1509d42f 108 timevar_push (TV_LALR);
cc84fd5d 109 lalr ();
1509d42f 110 timevar_pop (TV_LALR);
54bd0db4 111
cc84fd5d 112 /* Find and record any conflicts: places where one token of
742e4900 113 lookahead is not enough to disambiguate the parsing. In file
cc84fd5d
AD
114 conflicts. Also resolve s/r conflicts based on precedence
115 declarations. */
1509d42f 116 timevar_push (TV_CONFLICTS);
b408954b 117 conflicts_solve ();
5967f0cf 118 {
9d774aff 119 state_number *old_to_new = xnmalloc (nstates, sizeof *old_to_new);
5967f0cf
JD
120 state_number nstates_old = nstates;
121 state_remove_unreachable_states (old_to_new);
122 lalr_update_state_numbers (old_to_new, nstates_old);
123 conflicts_update_state_numbers (old_to_new, nstates_old);
9d774aff 124 free (old_to_new);
5967f0cf 125 }
0df87bb6 126 conflicts_print ();
1509d42f 127 timevar_pop (TV_CONFLICTS);
342b8b6e 128
c8f002c7
AD
129 /* Compute the parser tables. */
130 timevar_push (TV_ACTIONS);
131 tables_generate ();
132 timevar_pop (TV_ACTIONS);
133
134 grammar_rules_never_reduced_report
135 (_("rule never reduced because of conflicts"));
136
342b8b6e
AD
137 /* Output file names. */
138 compute_output_file_names ();
139
b7c49edf 140 /* Output the detailed report on the grammar. */
ec3bc396 141 if (report_flag)
1509d42f
AD
142 {
143 timevar_push (TV_REPORT);
144 print_results ();
145 timevar_pop (TV_REPORT);
146 }
b7c49edf 147
35fe0834 148 /* Output the graph. */
64d15509 149 if (graph_flag)
1509d42f
AD
150 {
151 timevar_push (TV_GRAPH);
152 print_graph ();
153 timevar_pop (TV_GRAPH);
154 }
c4b66126 155
c8f002c7
AD
156 /* Stop if there were errors, to avoid trashing previous output
157 files. */
5ca3209b 158 if (complaint_issued)
f6d0c239 159 goto finish;
c6f1a33c 160
742e4900 161 /* Lookahead tokens are no longer needed. */
3325ddc4
AD
162 timevar_push (TV_FREE);
163 lalr_free ();
164 timevar_pop (TV_FREE);
165
cc84fd5d 166 /* Output the tables and the parser to ftable. In file output. */
1509d42f 167 timevar_push (TV_PARSER);
cc84fd5d 168 output ();
1509d42f 169 timevar_pop (TV_PARSER);
a0f6b076 170
1509d42f 171 timevar_push (TV_FREE);
cd08e51e
AD
172 nullable_free ();
173 derives_free ();
c6f1a33c 174 tables_free ();
c7ca99d4 175 states_free ();
337c5bd1 176 reduce_free ();
b408954b 177 conflicts_free ();
76514394 178 grammar_free ();
eb095650 179 output_file_names_free ();
4515534c
AD
180
181 /* The scanner memory cannot be released right after parsing, as it
182 contains things such as user actions, prologue, epilogue etc. */
e9071366 183 gram_scanner_free ();
592e8d4d 184 muscle_free ();
17ee7397 185 uniqstrs_free ();
eb095650 186 code_scanner_free ();
08af01c2 187 skel_scanner_free ();
eb095650 188 quotearg_free ();
1509d42f 189 timevar_pop (TV_FREE);
722c4bfe 190
273a74fa 191 if (trace_flag & trace_bitsets)
640748ee 192 bitset_stats_dump (stderr);
613f5e1a 193
f6d0c239
PE
194 finish:
195
1509d42f
AD
196 /* Stop timing and print the times. */
197 timevar_stop (TV_TOTAL);
198 timevar_print (stderr);
199
e95aed63 200 return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 201}