]> git.saurik.com Git - bison.git/blame - src/main.c
(Torturing the Scanner): Add tests that @oline@,
[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 53 setlocale (LC_ALL, "");
c81bad89
PE
54 (void) bindtextdomain (PACKAGE, LOCALEDIR);
55 (void) textdomain (PACKAGE);
29340571 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
5ca3209b 76 if (complaint_issued)
f6d0c239 77 goto finish;
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 110
c8f002c7
AD
111 /* Compute the parser tables. */
112 timevar_push (TV_ACTIONS);
113 tables_generate ();
114 timevar_pop (TV_ACTIONS);
115
116 grammar_rules_never_reduced_report
117 (_("rule never reduced because of conflicts"));
118
342b8b6e
AD
119 /* Output file names. */
120 compute_output_file_names ();
121
b7c49edf 122 /* Output the detailed report on the grammar. */
ec3bc396 123 if (report_flag)
1509d42f
AD
124 {
125 timevar_push (TV_REPORT);
126 print_results ();
127 timevar_pop (TV_REPORT);
128 }
b7c49edf 129
e8cb70b9 130 /* Output the VCG graph. */
64d15509 131 if (graph_flag)
1509d42f
AD
132 {
133 timevar_push (TV_GRAPH);
134 print_graph ();
135 timevar_pop (TV_GRAPH);
136 }
c4b66126 137
c8f002c7
AD
138 /* Stop if there were errors, to avoid trashing previous output
139 files. */
5ca3209b 140 if (complaint_issued)
f6d0c239 141 goto finish;
c6f1a33c 142
3325ddc4
AD
143 /* Lookaheads are no longer needed. */
144 timevar_push (TV_FREE);
145 lalr_free ();
146 timevar_pop (TV_FREE);
147
cc84fd5d 148 /* Output the tables and the parser to ftable. In file output. */
1509d42f 149 timevar_push (TV_PARSER);
cc84fd5d 150 output ();
1509d42f 151 timevar_pop (TV_PARSER);
a0f6b076 152
1509d42f 153 timevar_push (TV_FREE);
cd08e51e
AD
154 nullable_free ();
155 derives_free ();
c6f1a33c 156 tables_free ();
c7ca99d4 157 states_free ();
337c5bd1 158 reduce_free ();
b408954b 159 conflicts_free ();
76514394 160 grammar_free ();
900c5db5
AD
161 /* FIXME: We are leaking all the other file names. */
162 free (infile);
4515534c
AD
163
164 /* The scanner memory cannot be released right after parsing, as it
165 contains things such as user actions, prologue, epilogue etc. */
166 scanner_free ();
592e8d4d 167 muscle_free ();
722c4bfe
AD
168 /* If using alloca.c, flush the alloca'ed memory for the benefit of
169 people running Bison as a library in IDEs. */
170#if C_ALLOCA
640748ee 171 alloca (0);
722c4bfe 172#endif
1509d42f 173 timevar_pop (TV_FREE);
722c4bfe 174
273a74fa 175 if (trace_flag & trace_bitsets)
640748ee 176 bitset_stats_dump (stderr);
613f5e1a 177
f6d0c239
PE
178 finish:
179
1509d42f
AD
180 /* Stop timing and print the times. */
181 timevar_stop (TV_TOTAL);
182 timevar_print (stderr);
183
e95aed63 184 return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
54bd0db4 185}