1/* Top level entry point of Bison.
2
3   Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002, 2004, 2005
4   Free Software Foundation, Inc.
5
6   This file is part of Bison, the GNU Compiler Compiler.
7
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.
12
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.
17
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
20   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21   Boston, MA 02110-1301, USA.  */
22
23#include <config.h>
24#include "system.h"
25
26#include <bitset_stats.h>
27#include <bitset.h>
28#include <timevar.h>
29
30#include "LR0.h"
31#include "complain.h"
32#include "conflicts.h"
33#include "derives.h"
34#include "files.h"
35#include "getargs.h"
36#include "gram.h"
37#include "lalr.h"
38#include "muscle_tab.h"
39#include "nullable.h"
40#include "output.h"
41#include "print.h"
42#include "print_graph.h"
43#include "reader.h"
44#include "reduce.h"
45#include "symtab.h"
46#include "tables.h"
47#include "uniqstr.h"
48
49/* The name this program was run with, for messages.  */
50char *program_name;
51
52
53
54int
55main (int argc, char *argv[])
56{
57  program_name = argv[0];
58  setlocale (LC_ALL, "");
59  (void) bindtextdomain (PACKAGE, LOCALEDIR);
60  (void) bindtextdomain ("bison-runtime", LOCALEDIR);
61  (void) textdomain (PACKAGE);
62
63  uniqstrs_new ();
64
65  getargs (argc, argv);
66
67  timevar_report = trace_flag & trace_time;
68  init_timevar ();
69  timevar_start (TV_TOTAL);
70
71  if (trace_flag & trace_bitsets)
72    bitset_stats_enable ();
73
74  muscle_init ();
75
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.  */
79
80  timevar_push (TV_READER);
81  reader ();
82  timevar_pop (TV_READER);
83
84  if (complaint_issued)
85    goto finish;
86
87  /* Find useless nonterminals and productions and reduce the grammar. */
88  timevar_push (TV_REDUCE);
89  reduce_grammar ();
90  timevar_pop (TV_REDUCE);
91
92  /* Record other info about the grammar.  In files derives and
93     nullable.  */
94  timevar_push (TV_SETS);
95  derives_compute ();
96  nullable_compute ();
97  timevar_pop (TV_SETS);
98
99  /* Convert to nondeterministic finite state machine.  In file LR0.
100     See state.h for more info.  */
101  timevar_push (TV_LR0);
102  generate_states ();
103  timevar_pop (TV_LR0);
104
105  /* make it deterministic.  In file lalr.  */
106  timevar_push (TV_LALR);
107  lalr ();
108  timevar_pop (TV_LALR);
109
110  /* Find and record any conflicts: places where one token of
111     look-ahead is not enough to disambiguate the parsing.  In file
112     conflicts.  Also resolve s/r conflicts based on precedence
113     declarations.  */
114  timevar_push (TV_CONFLICTS);
115  conflicts_solve ();
116  conflicts_print ();
117  timevar_pop (TV_CONFLICTS);
118
119  /* Compute the parser tables.  */
120  timevar_push (TV_ACTIONS);
121  tables_generate ();
122  timevar_pop (TV_ACTIONS);
123
124  grammar_rules_never_reduced_report
125    (_("rule never reduced because of conflicts"));
126
127  /* Output file names. */
128  compute_output_file_names ();
129
130  /* Output the detailed report on the grammar.  */
131  if (report_flag)
132    {
133      timevar_push (TV_REPORT);
134      print_results ();
135      timevar_pop (TV_REPORT);
136    }
137
138  /* Output the VCG graph.  */
139  if (graph_flag)
140    {
141      timevar_push (TV_GRAPH);
142      print_graph ();
143      timevar_pop (TV_GRAPH);
144    }
145
146  /* Stop if there were errors, to avoid trashing previous output
147     files.  */
148  if (complaint_issued)
149    goto finish;
150
151  /* Look-ahead tokens are no longer needed. */
152  timevar_push (TV_FREE);
153  lalr_free ();
154  timevar_pop (TV_FREE);
155
156  /* Output the tables and the parser to ftable.  In file output.  */
157  timevar_push (TV_PARSER);
158  output ();
159  timevar_pop (TV_PARSER);
160
161  timevar_push (TV_FREE);
162  nullable_free ();
163  derives_free ();
164  tables_free ();
165  states_free ();
166  reduce_free ();
167  conflicts_free ();
168  grammar_free ();
169
170  /* The scanner memory cannot be released right after parsing, as it
171     contains things such as user actions, prologue, epilogue etc.  */
172  scanner_free ();
173  muscle_free ();
174  uniqstrs_free ();
175  timevar_pop (TV_FREE);
176
177  if (trace_flag & trace_bitsets)
178    bitset_stats_dump (stderr);
179
180 finish:
181
182  /* Stop timing and print the times.  */
183  timevar_stop (TV_TOTAL);
184  timevar_print (stderr);
185
186  return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
187}
188