]> git.saurik.com Git - bison.git/blame - src/main.c
Work around Java's ``code too large'' problem for parser tables.
[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,
9fe5a457 4 2005, 2006, 2007, 2008 Free 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"
17ee7397 38#include "muscle_tab.h"
3519ec76 39#include "nullable.h"
17ee7397 40#include "output.h"
07a58c13 41#include "print.h"
c4b66126 42#include "print_graph.h"
41d7a5f2 43#include "print-xml.h"
17ee7397
PE
44#include "reader.h"
45#include "reduce.h"
eb095650 46#include "scan-code.h"
0c8e079f 47#include "scan-gram.h"
08af01c2 48#include "scan-skel.h"
17ee7397
PE
49#include "symtab.h"
50#include "tables.h"
51#include "uniqstr.h"
54bd0db4 52
caf23d24 53
caf23d24 54
54bd0db4 55int
d2729d44 56main (int argc, char *argv[])
54bd0db4
RS
57{
58 program_name = argv[0];
29340571 59 setlocale (LC_ALL, "");
04098407
PE
60 (void) bindtextdomain (PACKAGE, LOCALEDIR);
61 (void) bindtextdomain ("bison-runtime", LOCALEDIR);
62 (void) textdomain (PACKAGE);
29340571 63
17ee7397 64 uniqstrs_new ();
9fe5a457 65 muscle_init ();
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
cc84fd5d
AD
76 /* Read the input. Copy some parts of it to FGUARD, FACTION, FTABLE
77 and FATTRS. In file reader.c. The other parts are recorded in
78 the grammar; see gram.h. */
640748ee 79
1509d42f
AD
80 timevar_push (TV_READER);
81 reader ();
82 timevar_pop (TV_READER);
640748ee 83
5ca3209b 84 if (complaint_issued)
f6d0c239 85 goto finish;
54bd0db4 86
00238958 87 /* Find useless nonterminals and productions and reduce the grammar. */
1509d42f 88 timevar_push (TV_REDUCE);
cc84fd5d 89 reduce_grammar ();
1509d42f 90 timevar_pop (TV_REDUCE);
640748ee 91
7da99ede
AD
92 /* Record other info about the grammar. In files derives and
93 nullable. */
1509d42f 94 timevar_push (TV_SETS);
bb0027a9
AD
95 derives_compute ();
96 nullable_compute ();
1509d42f 97 timevar_pop (TV_SETS);
54bd0db4 98
7da99ede 99 /* Convert to nondeterministic finite state machine. In file LR0.
54bd0db4 100 See state.h for more info. */
1509d42f 101 timevar_push (TV_LR0);
cc84fd5d 102 generate_states ();
1509d42f 103 timevar_pop (TV_LR0);
54bd0db4
RS
104
105 /* make it deterministic. In file lalr. */
1509d42f 106 timevar_push (TV_LALR);
cc84fd5d 107 lalr ();
1509d42f 108 timevar_pop (TV_LALR);
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 ();
31984206
JD
116 muscle_percent_define_default ("lr.keep_unreachable_states", "false");
117 if (!muscle_percent_define_flag_if ("lr.keep_unreachable_states"))
118 {
119 state_number *old_to_new = xnmalloc (nstates, sizeof *old_to_new);
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);
124 free (old_to_new);
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
cff03fb2
JD
134 grammar_rules_useless_report
135 (_("rule useless in parser due to conflicts"));
c8f002c7 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
41d7a5f2
PE
156 /* Output xml. */
157 if (xml_flag)
158 {
159 timevar_push (TV_XML);
160 print_xml ();
161 timevar_pop (TV_XML);
162 }
163
c8f002c7
AD
164 /* Stop if there were errors, to avoid trashing previous output
165 files. */
5ca3209b 166 if (complaint_issued)
f6d0c239 167 goto finish;
c6f1a33c 168
742e4900 169 /* Lookahead tokens are no longer needed. */
3325ddc4
AD
170 timevar_push (TV_FREE);
171 lalr_free ();
172 timevar_pop (TV_FREE);
173
cc84fd5d 174 /* Output the tables and the parser to ftable. In file output. */
1509d42f 175 timevar_push (TV_PARSER);
cc84fd5d 176 output ();
1509d42f 177 timevar_pop (TV_PARSER);
a0f6b076 178
1509d42f 179 timevar_push (TV_FREE);
cd08e51e
AD
180 nullable_free ();
181 derives_free ();
c6f1a33c 182 tables_free ();
c7ca99d4 183 states_free ();
337c5bd1 184 reduce_free ();
b408954b 185 conflicts_free ();
76514394 186 grammar_free ();
eb095650 187 output_file_names_free ();
4515534c
AD
188
189 /* The scanner memory cannot be released right after parsing, as it
190 contains things such as user actions, prologue, epilogue etc. */
e9071366 191 gram_scanner_free ();
592e8d4d 192 muscle_free ();
17ee7397 193 uniqstrs_free ();
eb095650 194 code_scanner_free ();
08af01c2 195 skel_scanner_free ();
eb095650 196 quotearg_free ();
1509d42f 197 timevar_pop (TV_FREE);
722c4bfe 198
273a74fa 199 if (trace_flag & trace_bitsets)
640748ee 200 bitset_stats_dump (stderr);
613f5e1a 201
f6d0c239
PE
202 finish:
203
1509d42f
AD
204 /* Stop timing and print the times. */
205 timevar_stop (TV_TOTAL);
206 timevar_print (stderr);
207
e95aed63 208 return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 209}