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