ef59b1f232738a574d639e62a7e1237864ad9cee
[platform/upstream/bison.git] / src / main.c
1 /* Top level entry point of Bison.
2
3    Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000-2002, 2004-2013 Free
4    Software Foundation, Inc.
5
6    This file is part of Bison, the GNU Compiler Compiler.
7
8    This program 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 3 of the License, or
11    (at your option) any later version.
12
13    This program 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.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #include <config.h>
22 #include "system.h"
23
24 #include <bitset_stats.h>
25 #include <bitset.h>
26 #include <configmake.h>
27 #include <progname.h>
28 #include <quotearg.h>
29 #include <timevar.h>
30
31 #include "LR0.h"
32 #include "closeout.h"
33 #include "complain.h"
34 #include "conflicts.h"
35 #include "derives.h"
36 #include "files.h"
37 #include "getargs.h"
38 #include "gram.h"
39 #include "lalr.h"
40 #include "ielr.h"
41 #include "muscle-tab.h"
42 #include "nullable.h"
43 #include "output.h"
44 #include "print.h"
45 #include "print_graph.h"
46 #include "print-xml.h"
47 #include <quote.h>
48 #include "reader.h"
49 #include "reduce.h"
50 #include "scan-code.h"
51 #include "scan-gram.h"
52 #include "scan-skel.h"
53 #include "symtab.h"
54 #include "tables.h"
55 #include "uniqstr.h"
56
57
58 int
59 main (int argc, char *argv[])
60 {
61   set_program_name (argv[0]);
62   setlocale (LC_ALL, "");
63   (void) bindtextdomain (PACKAGE, LOCALEDIR);
64   (void) bindtextdomain ("bison-runtime", LOCALEDIR);
65   (void) textdomain (PACKAGE);
66
67   {
68     char const *cp = getenv ("LC_CTYPE");
69     if (cp && !strcmp (cp, "C"))
70       set_custom_quoting (&quote_quoting_options, "'", "'");
71     else
72       set_quoting_style (&quote_quoting_options, locale_quoting_style);
73   }
74
75   atexit (close_stdout);
76
77   uniqstrs_new ();
78   muscle_init ();
79
80   getargs (argc, argv);
81
82   timevar_report = trace_flag & trace_time;
83   init_timevar ();
84   timevar_start (TV_TOTAL);
85
86   if (trace_flag & trace_bitsets)
87     bitset_stats_enable ();
88
89   /* Read the input.  Copy some parts of it to FGUARD, FACTION, FTABLE
90      and FATTRS.  In file reader.c.  The other parts are recorded in
91      the grammar; see gram.h.  */
92
93   timevar_push (TV_READER);
94   reader ();
95   timevar_pop (TV_READER);
96
97   if (complaint_issued)
98     goto finish;
99
100   /* Find useless nonterminals and productions and reduce the grammar. */
101   timevar_push (TV_REDUCE);
102   reduce_grammar ();
103   timevar_pop (TV_REDUCE);
104
105   /* Record other info about the grammar.  In files derives and
106      nullable.  */
107   timevar_push (TV_SETS);
108   derives_compute ();
109   nullable_compute ();
110   timevar_pop (TV_SETS);
111
112   /* Compute LR(0) parser states.  See state.h for more info.  */
113   timevar_push (TV_LR0);
114   generate_states ();
115   timevar_pop (TV_LR0);
116
117   /* Add lookahead sets to parser states.  Except when LALR(1) is
118      requested, split states to eliminate LR(1)-relative
119      inadequacies.  */
120   ielr ();
121
122   /* Find and record any conflicts: places where one token of
123      lookahead is not enough to disambiguate the parsing.  In file
124      conflicts.  Also resolve s/r conflicts based on precedence
125      declarations.  */
126   timevar_push (TV_CONFLICTS);
127   conflicts_solve ();
128   if (!muscle_percent_define_flag_if ("lr.keep-unreachable-states"))
129     {
130       state_number *old_to_new = xnmalloc (nstates, sizeof *old_to_new);
131       state_number nstates_old = nstates;
132       state_remove_unreachable_states (old_to_new);
133       lalr_update_state_numbers (old_to_new, nstates_old);
134       conflicts_update_state_numbers (old_to_new, nstates_old);
135       free (old_to_new);
136     }
137   conflicts_print ();
138   timevar_pop (TV_CONFLICTS);
139
140   /* Compute the parser tables.  */
141   timevar_push (TV_ACTIONS);
142   tables_generate ();
143   timevar_pop (TV_ACTIONS);
144
145   grammar_rules_useless_report
146     (_("rule useless in parser due to conflicts"));
147
148   /* Output file names. */
149   compute_output_file_names ();
150
151   /* Output the detailed report on the grammar.  */
152   if (report_flag)
153     {
154       timevar_push (TV_REPORT);
155       print_results ();
156       timevar_pop (TV_REPORT);
157     }
158
159   /* Output the graph.  */
160   if (graph_flag)
161     {
162       timevar_push (TV_GRAPH);
163       print_graph ();
164       timevar_pop (TV_GRAPH);
165     }
166
167   /* Output xml.  */
168   if (xml_flag)
169     {
170       timevar_push (TV_XML);
171       print_xml ();
172       timevar_pop (TV_XML);
173     }
174
175   /* Stop if there were errors, to avoid trashing previous output
176      files.  */
177   if (complaint_issued)
178     goto finish;
179
180   /* Lookahead tokens are no longer needed. */
181   timevar_push (TV_FREE);
182   lalr_free ();
183   timevar_pop (TV_FREE);
184
185   /* Output the tables and the parser to ftable.  In file output.  */
186   timevar_push (TV_PARSER);
187   output ();
188   timevar_pop (TV_PARSER);
189
190   timevar_push (TV_FREE);
191   nullable_free ();
192   derives_free ();
193   tables_free ();
194   states_free ();
195   reduce_free ();
196   conflicts_free ();
197   grammar_free ();
198   output_file_names_free ();
199
200   /* The scanner memory cannot be released right after parsing, as it
201      contains things such as user actions, prologue, epilogue etc.  */
202   gram_scanner_free ();
203   muscle_free ();
204   uniqstrs_free ();
205   code_scanner_free ();
206   skel_scanner_free ();
207   quotearg_free ();
208   timevar_pop (TV_FREE);
209
210   if (trace_flag & trace_bitsets)
211     bitset_stats_dump (stderr);
212
213  finish:
214
215   /* Stop timing and print the times.  */
216   timevar_stop (TV_TOTAL);
217   timevar_print (stderr);
218
219   cleanup_caret ();
220
221   return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
222 }