]> git.saurik.com Git - bison.git/blame - src/main.c
Don't let %prec take a nonterminal.
[bison.git] / src / main.c
CommitLineData
a54a1bdc
PE
1/* Top level entry point of Bison.
2
3b2942e6
PE
3 Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002, 2004,
4 2005, 2006 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"
17ee7397
PE
49#include "symtab.h"
50#include "tables.h"
51#include "uniqstr.h"
54bd0db4 52
a98ad01e 53/* The name this program was run with, for messages. */
54bd0db4
RS
54char *program_name;
55
caf23d24 56
caf23d24 57
54bd0db4 58int
d2729d44 59main (int argc, char *argv[])
54bd0db4
RS
60{
61 program_name = argv[0];
29340571 62 setlocale (LC_ALL, "");
04098407
PE
63 (void) bindtextdomain (PACKAGE, LOCALEDIR);
64 (void) bindtextdomain ("bison-runtime", LOCALEDIR);
65 (void) textdomain (PACKAGE);
29340571 66
17ee7397 67 uniqstrs_new ();
95612cfa 68
cc84fd5d 69 getargs (argc, argv);
a0f6b076 70
17ee7397 71 timevar_report = trace_flag & trace_time;
1509d42f
AD
72 init_timevar ();
73 timevar_start (TV_TOTAL);
74
273a74fa 75 if (trace_flag & trace_bitsets)
613f5e1a
AD
76 bitset_stats_enable ();
77
11d82f03 78 muscle_init ();
54bd0db4 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
7da99ede 103 /* Convert to nondeterministic finite state machine. In file LR0.
54bd0db4 104 See state.h for more info. */
1509d42f 105 timevar_push (TV_LR0);
cc84fd5d 106 generate_states ();
1509d42f 107 timevar_pop (TV_LR0);
54bd0db4
RS
108
109 /* make it deterministic. In file lalr. */
1509d42f 110 timevar_push (TV_LALR);
cc84fd5d 111 lalr ();
1509d42f 112 timevar_pop (TV_LALR);
54bd0db4 113
cc84fd5d 114 /* Find and record any conflicts: places where one token of
742e4900 115 lookahead is not enough to disambiguate the parsing. In file
cc84fd5d
AD
116 conflicts. Also resolve s/r conflicts based on precedence
117 declarations. */
1509d42f 118 timevar_push (TV_CONFLICTS);
b408954b 119 conflicts_solve ();
0df87bb6 120 conflicts_print ();
1509d42f 121 timevar_pop (TV_CONFLICTS);
342b8b6e 122
c8f002c7
AD
123 /* Compute the parser tables. */
124 timevar_push (TV_ACTIONS);
125 tables_generate ();
126 timevar_pop (TV_ACTIONS);
127
128 grammar_rules_never_reduced_report
129 (_("rule never reduced because of conflicts"));
130
342b8b6e
AD
131 /* Output file names. */
132 compute_output_file_names ();
133
b7c49edf 134 /* Output the detailed report on the grammar. */
ec3bc396 135 if (report_flag)
1509d42f
AD
136 {
137 timevar_push (TV_REPORT);
138 print_results ();
139 timevar_pop (TV_REPORT);
140 }
b7c49edf 141
35fe0834 142 /* Output the graph. */
64d15509 143 if (graph_flag)
1509d42f
AD
144 {
145 timevar_push (TV_GRAPH);
146 print_graph ();
147 timevar_pop (TV_GRAPH);
148 }
c4b66126 149
c8f002c7
AD
150 /* Stop if there were errors, to avoid trashing previous output
151 files. */
5ca3209b 152 if (complaint_issued)
f6d0c239 153 goto finish;
c6f1a33c 154
742e4900 155 /* Lookahead tokens are no longer needed. */
3325ddc4
AD
156 timevar_push (TV_FREE);
157 lalr_free ();
158 timevar_pop (TV_FREE);
159
cc84fd5d 160 /* Output the tables and the parser to ftable. In file output. */
1509d42f 161 timevar_push (TV_PARSER);
cc84fd5d 162 output ();
1509d42f 163 timevar_pop (TV_PARSER);
a0f6b076 164
1509d42f 165 timevar_push (TV_FREE);
cd08e51e
AD
166 nullable_free ();
167 derives_free ();
c6f1a33c 168 tables_free ();
c7ca99d4 169 states_free ();
337c5bd1 170 reduce_free ();
b408954b 171 conflicts_free ();
76514394 172 grammar_free ();
eb095650 173 output_file_names_free ();
4515534c
AD
174
175 /* The scanner memory cannot be released right after parsing, as it
176 contains things such as user actions, prologue, epilogue etc. */
e9071366 177 gram_scanner_free ();
592e8d4d 178 muscle_free ();
17ee7397 179 uniqstrs_free ();
eb095650
PE
180 code_scanner_free ();
181 quotearg_free ();
1509d42f 182 timevar_pop (TV_FREE);
722c4bfe 183
273a74fa 184 if (trace_flag & trace_bitsets)
640748ee 185 bitset_stats_dump (stderr);
613f5e1a 186
f6d0c239
PE
187 finish:
188
1509d42f
AD
189 /* Stop timing and print the times. */
190 timevar_stop (TV_TOTAL);
191 timevar_print (stderr);
192
e95aed63 193 return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 194}