]>
Commit | Line | Data |
---|---|---|
54bd0db4 | 1 | /* Top level entry point of bison, |
e87b5700 | 2 | Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000 Free Software Foundation, Inc. |
54bd0db4 | 3 | |
e87b5700 | 4 | This file is part of Bison, the GNU Compiler Compiler. |
54bd0db4 | 5 | |
e87b5700 AD |
6 | Bison is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 2, or (at your option) | |
9 | any later version. | |
54bd0db4 | 10 | |
e87b5700 AD |
11 | Bison is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
54bd0db4 | 15 | |
e87b5700 AD |
16 | You should have received a copy of the GNU General Public License |
17 | along with Bison; see the file COPYING. If not, write to | |
18 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 | Boston, MA 02111-1307, USA. */ | |
54bd0db4 RS |
20 | |
21 | ||
22 | #include <stdio.h> | |
23 | #include "system.h" | |
a98ad01e | 24 | #include "machine.h" /* for MAXSHORT */ |
a0f6b076 AD |
25 | #include "files.h" |
26 | #include "complain.h" | |
54bd0db4 | 27 | |
54bd0db4 RS |
28 | extern int verboseflag; |
29 | ||
4a120d45 | 30 | #if 0 /* XXX currently unused. */ |
54bd0db4 | 31 | /* Nonzero means failure has been detected; don't write a parser file. */ |
4a120d45 JT |
32 | static int failure; |
33 | #endif | |
54bd0db4 | 34 | |
a98ad01e | 35 | /* The name this program was run with, for messages. */ |
54bd0db4 RS |
36 | char *program_name; |
37 | ||
4a120d45 JT |
38 | extern char *printable_version PARAMS((int)); |
39 | extern void berror PARAMS((const char *)); | |
d2729d44 JT |
40 | |
41 | extern void getargs PARAMS((int, char *[])); | |
42 | extern void openfiles PARAMS((void)); | |
43 | extern void reader PARAMS((void)); | |
44 | extern void reduce_grammar PARAMS((void)); | |
45 | extern void set_derives PARAMS((void)); | |
4a120d45 | 46 | extern void free_derives PARAMS((void)); |
d2729d44 | 47 | extern void set_nullable PARAMS((void)); |
8aa892b4 | 48 | extern void free_nullable PARAMS((void)); |
d2729d44 JT |
49 | extern void generate_states PARAMS((void)); |
50 | extern void lalr PARAMS((void)); | |
51 | extern void initialize_conflicts PARAMS((void)); | |
4a120d45 | 52 | extern void finalize_conflicts PARAMS((void)); |
d2729d44 JT |
53 | extern void verbose PARAMS((void)); |
54 | extern void terse PARAMS((void)); | |
55 | extern void output PARAMS((void)); | |
54bd0db4 RS |
56 | |
57 | ||
58 | /* VMS complained about using `int'. */ | |
a98ad01e | 59 | |
54bd0db4 | 60 | int |
d2729d44 | 61 | main (int argc, char *argv[]) |
54bd0db4 RS |
62 | { |
63 | program_name = argv[0]; | |
29340571 RS |
64 | setlocale (LC_ALL, ""); |
65 | bindtextdomain (PACKAGE, LOCALEDIR); | |
66 | textdomain (PACKAGE); | |
67 | ||
54bd0db4 RS |
68 | lineno = 0; |
69 | getargs(argc, argv); | |
a0f6b076 AD |
70 | |
71 | /* Be ready to clean up if we exit.*/ | |
72 | atexit (done); | |
73 | ||
54bd0db4 RS |
74 | openfiles(); |
75 | ||
76 | /* read the input. Copy some parts of it to fguard, faction, ftable and fattrs. | |
77 | In file reader.c. | |
78 | The other parts are recorded in the grammar; see gram.h. */ | |
a0f6b076 AD |
79 | reader (); |
80 | if (complain_message_count) | |
81 | exit (1); | |
54bd0db4 RS |
82 | |
83 | /* find useless nonterminals and productions and reduce the grammar. In | |
84 | file reduce.c */ | |
85 | reduce_grammar(); | |
86 | ||
87 | /* record other info about the grammar. In files derives and nullable. */ | |
88 | set_derives(); | |
89 | set_nullable(); | |
90 | ||
91 | /* convert to nondeterministic finite state machine. In file LR0. | |
92 | See state.h for more info. */ | |
93 | generate_states(); | |
94 | ||
95 | /* make it deterministic. In file lalr. */ | |
96 | lalr(); | |
97 | ||
98 | /* Find and record any conflicts: places where one token of lookahead is not | |
99 | enough to disambiguate the parsing. In file conflicts. | |
fe01694d | 100 | Also resolve s/r conflicts based on precedence declarations. */ |
54bd0db4 RS |
101 | initialize_conflicts(); |
102 | ||
103 | /* print information about results, if requested. In file print. */ | |
104 | if (verboseflag) | |
105 | verbose(); | |
106 | else | |
107 | terse(); | |
108 | ||
109 | /* output the tables and the parser to ftable. In file output. */ | |
110 | output(); | |
a0f6b076 | 111 | |
4a120d45 | 112 | finalize_conflicts(); |
8aa892b4 | 113 | free_nullable(); |
4a120d45 JT |
114 | free_derives(); |
115 | ||
a0f6b076 | 116 | exit (complain_message_count ? 1 : 0); |
54bd0db4 | 117 | } |
a98ad01e | 118 | \f |
54bd0db4 RS |
119 | /* functions to report errors which prevent a parser from being generated */ |
120 | ||
a98ad01e RS |
121 | |
122 | /* Return a string containing a printable version of C: | |
123 | either C itself, or the corresponding \DDD code. */ | |
124 | ||
125 | char * | |
d2729d44 | 126 | printable_version (int c) |
a98ad01e RS |
127 | { |
128 | static char buf[10]; | |
129 | if (c < ' ' || c >= '\177') | |
130 | sprintf(buf, "\\%o", c); | |
131 | else | |
132 | { | |
133 | buf[0] = c; | |
134 | buf[1] = '\0'; | |
135 | } | |
136 | return buf; | |
137 | } | |
138 | ||
a98ad01e | 139 | /* Abort for an internal error denoted by string S. */ |
54bd0db4 RS |
140 | |
141 | void | |
4a120d45 | 142 | berror (const char *s) |
54bd0db4 | 143 | { |
a0f6b076 | 144 | fprintf (stderr, _("%s: internal error: %s\n"), program_name, s); |
54bd0db4 RS |
145 | abort(); |
146 | } |