]> git.saurik.com Git - bison.git/blame - src/main.c
Instead of attaching lookaheads and duplicating the rules being
[bison.git] / src / main.c
CommitLineData
54bd0db4 1/* Top level entry point of bison,
bb0027a9 2 Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002
ceed8467 3 Free Software Foundation, Inc.
54bd0db4 4
e87b5700 5 This file is part of Bison, the GNU Compiler Compiler.
54bd0db4 6
e87b5700
AD
7 Bison is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
54bd0db4 11
e87b5700
AD
12 Bison is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
54bd0db4 16
e87b5700
AD
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
54bd0db4
RS
21
22
54bd0db4 23#include "system.h"
613f5e1a 24#include "bitset_stats.h"
602bbf31 25#include "bitset.h"
ceed8467 26#include "getargs.h"
62a3e4f0
AD
27#include "symtab.h"
28#include "gram.h"
a0f6b076
AD
29#include "files.h"
30#include "complain.h"
cc84fd5d 31#include "derives.h"
c6f1a33c 32#include "tables.h"
6c89f1c1 33#include "output.h"
a70083a3
AD
34#include "reader.h"
35#include "lalr.h"
015acc48 36#include "reduce.h"
3519ec76 37#include "nullable.h"
07a58c13 38#include "print.h"
403b315b 39#include "LR0.h"
d7913476 40#include "conflicts.h"
c4b66126 41#include "print_graph.h"
11d82f03 42#include "muscle_tab.h"
54bd0db4 43
a98ad01e 44/* The name this program was run with, for messages. */
54bd0db4
RS
45char *program_name;
46
caf23d24 47
caf23d24 48
54bd0db4 49int
d2729d44 50main (int argc, char *argv[])
54bd0db4
RS
51{
52 program_name = argv[0];
29340571
RS
53 setlocale (LC_ALL, "");
54 bindtextdomain (PACKAGE, LOCALEDIR);
55 textdomain (PACKAGE);
56
cc84fd5d 57 getargs (argc, argv);
a0f6b076 58
1509d42f
AD
59 time_report = trace_flag & trace_time;
60 init_timevar ();
61 timevar_start (TV_TOTAL);
62
273a74fa 63 if (trace_flag & trace_bitsets)
613f5e1a
AD
64 bitset_stats_enable ();
65
11d82f03 66 muscle_init ();
54bd0db4 67
cc84fd5d
AD
68 /* Read the input. Copy some parts of it to FGUARD, FACTION, FTABLE
69 and FATTRS. In file reader.c. The other parts are recorded in
70 the grammar; see gram.h. */
640748ee 71
1509d42f
AD
72 timevar_push (TV_READER);
73 reader ();
74 timevar_pop (TV_READER);
640748ee 75
a0f6b076
AD
76 if (complain_message_count)
77 exit (1);
54bd0db4 78
00238958 79 /* Find useless nonterminals and productions and reduce the grammar. */
1509d42f 80 timevar_push (TV_REDUCE);
cc84fd5d 81 reduce_grammar ();
1509d42f 82 timevar_pop (TV_REDUCE);
640748ee 83
7da99ede
AD
84 /* Record other info about the grammar. In files derives and
85 nullable. */
1509d42f 86 timevar_push (TV_SETS);
bb0027a9
AD
87 derives_compute ();
88 nullable_compute ();
1509d42f 89 timevar_pop (TV_SETS);
54bd0db4 90
7da99ede 91 /* Convert to nondeterministic finite state machine. In file LR0.
54bd0db4 92 See state.h for more info. */
1509d42f 93 timevar_push (TV_LR0);
cc84fd5d 94 generate_states ();
1509d42f 95 timevar_pop (TV_LR0);
54bd0db4
RS
96
97 /* make it deterministic. In file lalr. */
1509d42f 98 timevar_push (TV_LALR);
cc84fd5d 99 lalr ();
1509d42f 100 timevar_pop (TV_LALR);
54bd0db4 101
cc84fd5d
AD
102 /* Find and record any conflicts: places where one token of
103 lookahead is not enough to disambiguate the parsing. In file
104 conflicts. Also resolve s/r conflicts based on precedence
105 declarations. */
1509d42f 106 timevar_push (TV_CONFLICTS);
b408954b 107 conflicts_solve ();
0df87bb6 108 conflicts_print ();
1509d42f 109 timevar_pop (TV_CONFLICTS);
342b8b6e
AD
110
111 /* Output file names. */
112 compute_output_file_names ();
113
b7c49edf 114 /* Output the detailed report on the grammar. */
ec3bc396 115 if (report_flag)
1509d42f
AD
116 {
117 timevar_push (TV_REPORT);
118 print_results ();
119 timevar_pop (TV_REPORT);
120 }
b7c49edf 121
342b8b6e
AD
122 /* Stop if there were errors, to avoid trashing previous output
123 files. */
124 if (complain_message_count)
125 exit (1);
54bd0db4 126
e8cb70b9 127 /* Output the VCG graph. */
64d15509 128 if (graph_flag)
1509d42f
AD
129 {
130 timevar_push (TV_GRAPH);
131 print_graph ();
132 timevar_pop (TV_GRAPH);
133 }
c4b66126 134
c6f1a33c
AD
135 /* Compute the parser tables. */
136 timevar_push (TV_ACTIONS);
137 tables_generate ();
138 timevar_pop (TV_ACTIONS);
139
3325ddc4
AD
140 /* Lookaheads are no longer needed. */
141 timevar_push (TV_FREE);
142 lalr_free ();
143 timevar_pop (TV_FREE);
144
cc84fd5d 145 /* Output the tables and the parser to ftable. In file output. */
1509d42f 146 timevar_push (TV_PARSER);
cc84fd5d 147 output ();
1509d42f 148 timevar_pop (TV_PARSER);
a0f6b076 149
1509d42f 150 timevar_push (TV_FREE);
cd08e51e
AD
151 nullable_free ();
152 derives_free ();
c6f1a33c 153 tables_free ();
c7ca99d4 154 states_free ();
337c5bd1 155 reduce_free ();
b408954b 156 conflicts_free ();
76514394 157 grammar_free ();
4515534c
AD
158
159 /* The scanner memory cannot be released right after parsing, as it
160 contains things such as user actions, prologue, epilogue etc. */
161 scanner_free ();
592e8d4d 162 muscle_free ();
722c4bfe
AD
163 /* If using alloca.c, flush the alloca'ed memory for the benefit of
164 people running Bison as a library in IDEs. */
165#if C_ALLOCA
640748ee 166 alloca (0);
722c4bfe 167#endif
1509d42f 168 timevar_pop (TV_FREE);
722c4bfe 169
273a74fa 170 if (trace_flag & trace_bitsets)
640748ee 171 bitset_stats_dump (stderr);
613f5e1a 172
1509d42f
AD
173 /* Stop timing and print the times. */
174 timevar_stop (TV_TOTAL);
175 timevar_print (stderr);
176
0f37a994 177 return complain_message_count ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 178}