]> git.saurik.com Git - bison.git/blame - src/getargs.c
* src/scan-gram.l: Complete the scanner with the missing patterns
[bison.git] / src / getargs.c
CommitLineData
9f306f2a 1/* Parse command line arguments for bison.
06b00abc
AD
2 Copyright 1984, 1986, 1989, 1992, 2000, 2001, 2002
3 Free Software Foundation, Inc.
3d8fc6ca 4
9f306f2a 5 This file is part of Bison, the GNU Compiler Compiler.
3d8fc6ca 6
9f306f2a
AD
7 Bison is free software; you can redistribute it and/or modify it
8 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.
3d8fc6ca 11
9f306f2a
AD
12 Bison is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
3d8fc6ca 16
9f306f2a
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 the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
3d8fc6ca 21
3d8fc6ca 22#include "system.h"
ec3bc396
AD
23#include "getopt.h"
24#include "argmatch.h"
b0ce6046 25#include "complain.h"
ceed8467 26#include "getargs.h"
82b6d266 27#include "options.h"
ec3bc396 28#include "files.h"
3d8fc6ca 29
89cab50d
AD
30int debug_flag = 0;
31int defines_flag = 0;
32int locations_flag = 0;
33int no_lines_flag = 0;
34int no_parser_flag = 0;
ec3bc396 35int report_flag = 0;
89cab50d 36int token_table_flag = 0;
89cab50d 37int yacc_flag = 0; /* for -y */
22c2cbc0 38int graph_flag = 0;
9bfe901c 39int trace_flag = 0;
d2729d44 40
b0ce6046 41const char *skeleton = NULL;
f6bd5427 42const char *include = NULL;
b0ce6046 43
cbd8ffc5 44extern char *program_name;
3d8fc6ca 45
ec3bc396
AD
46/*----------------------.
47| --report's handling. |
48`----------------------*/
49
50static const char * const report_args[] =
51{
52 /* In a series of synonyms, present the most meaningful first, so
53 that argmatch_valid be more readable. */
54 "none",
55 "state", "states",
56 "itemset", "itemsets",
57 "lookahead", "lookaheads",
b408954b 58 "solved",
ec3bc396
AD
59 "all",
60 0
61};
62
63static const int report_types[] =
64{
65 report_none,
66 report_states, report_states,
67 report_states | report_itemsets, report_states | report_itemsets,
68 report_states | report_lookaheads, report_states | report_lookaheads,
b408954b 69 report_states | report_solved_conflicts,
ec3bc396
AD
70 report_all
71};
72
73
74static void
75report_argmatch (char *args)
76{
77 ARGMATCH_ASSERT (report_args, report_types);
78 do
79 {
80 int report = XARGMATCH ("--report", args,
81 report_args, report_types);
82 if (report == report_none)
83 report_flag = report_none;
84 else
85 report_flag |= report;
86 }
87 while ((args = strtok (NULL, ",")));
88}
89
9f306f2a
AD
90/*---------------------------.
91| Display the help message. |
92`---------------------------*/
e79137ac 93
4a120d45 94static void
d2729d44 95usage (FILE *stream)
cbd8ffc5 96{
9f306f2a
AD
97 /* Some efforts were made to ease the translators' task, please
98 continue. */
a0f6b076
AD
99 fputs (_("\
100GNU bison generates parsers for LALR(1) grammars.\n"), stream);
9f306f2a
AD
101 putc ('\n', stream);
102
103 fprintf (stream, _("\
104Usage: %s [OPTION]... FILE\n"), program_name);
105 putc ('\n', stream);
106
107 fputs (_("\
108If a long option shows an argument as mandatory, then it is mandatory\n\
109for the equivalent short option also. Similarly for optional arguments.\n"),
110 stream);
111 putc ('\n', stream);
112
a0f6b076 113 fputs (_("\
9f306f2a
AD
114Operation modes:\n\
115 -h, --help display this help and exit\n\
116 -V, --version output version information and exit\n\
a0f6b076 117 -y, --yacc emulate POSIX yacc\n"), stream);
9f306f2a
AD
118 putc ('\n', stream);
119
a0f6b076 120 fputs (_("\
9f306f2a 121Parser:\n\
cd5bd6ac 122 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 123 -t, --debug instrument the parser for debugging\n\
89cab50d 124 --locations enable locations computation\n\
9f306f2a
AD
125 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
126 -l, --no-lines don't generate `#line' directives\n\
127 -n, --no-parser generate the tables only\n\
9f306f2a 128 -k, --token-table include a table of token names\n\
a0f6b076 129"), stream);
9f306f2a
AD
130 putc ('\n', stream);
131
a0f6b076 132 fputs (_("\
9f306f2a
AD
133Output:\n\
134 -d, --defines also produce a header file\n\
ec3bc396
AD
135 -r, --report=THINGS also produce details on the automaton\n\
136 -v, --verbose same as `--report=state'\n\
9f306f2a 137 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1
AD
138 -o, --output=FILE leave output to FILE\n\
139 -g, --graph also produce a VCG description of the automaton\n\
86eff183
AD
140"), stream);
141 putc ('\n', stream);
142
143 fputs (_("\
ec3bc396
AD
144THINGS is a list of comma separated words that can include:\n\
145 `state' describe the states\n\
146 `itemset' complete the core item sets with their closure\n\
147 `lookahead' explicitly associate lookaheads to items\n\
b408954b 148 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
149 `all' include all the above information\n\
150 `none' disable the report\n\
951366c1 151"), stream);
9f306f2a
AD
152 putc ('\n', stream);
153
a0f6b076
AD
154 fputs (_("\
155Report bugs to <bug-bison@gnu.org>.\n"), stream);
cbd8ffc5
DM
156}
157
e79137ac
AD
158
159/*------------------------------.
160| Display the version message. |
161`------------------------------*/
162
163static void
164version (FILE *stream)
165{
166 /* Some efforts were made to ease the translators' task, please
167 continue. */
06b00abc 168 fprintf (stream, _("bison (GNU Bison) %s"), VERSION);
e79137ac 169 putc ('\n', stream);
06b00abc 170 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stream);
e79137ac
AD
171 putc ('\n', stream);
172
06b00abc
AD
173 fprintf (stream,
174 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2002);
e79137ac
AD
175
176 fputs (_("\
177This is free software; see the source for copying conditions. There is NO\n\
178warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
179"),
180 stream);
181}
182
183
184/*----------------------.
185| Process the options. |
186`----------------------*/
187
ae404801
AD
188/* Under DOS, there is no difference on the case. This can be
189 troublesome when looking for `.tab' etc. */
190#ifdef MSDOS
191# define AS_FILE_NAME(File) (strlwr (File), (File))
192#else
193# define AS_FILE_NAME(File) (File)
194#endif
195
3d8fc6ca 196void
d2729d44 197getargs (int argc, char *argv[])
3d8fc6ca 198{
1916f98e 199 int c;
3d8fc6ca 200
f51cb8ff 201 struct option *longopts = long_option_table_new ();
cd5bd6ac
AD
202 while ((c = getopt_long (argc, argv, shortopts, longopts, NULL)) != EOF)
203 switch (c)
204 {
205 case 0:
206 /* Certain long options cause getopt_long to return 0. */
207 break;
208
209 case 'y':
210 yacc_flag = 1;
211 break;
212
213 case 'h':
214 usage (stdout);
215 exit (0);
216
217 case 'V':
218 version (stdout);
219 exit (0);
220
22c2cbc0 221 case 'g':
342b8b6e 222 /* Here, the -g and --graph=FILE options are differentiated. */
22c2cbc0 223 graph_flag = 1;
ae404801 224 spec_graph_file = AS_FILE_NAME (optarg);
22c2cbc0
AD
225 break;
226
cd5bd6ac 227 case 'v':
ec3bc396 228 report_flag |= report_states;
cd5bd6ac
AD
229 break;
230
231 case 'S':
ae404801 232 skeleton = AS_FILE_NAME (optarg);
cd5bd6ac
AD
233 break;
234
f6bd5427 235 case 'I':
ae404801 236 include = AS_FILE_NAME (optarg);
f6bd5427
MA
237 break;
238
cd5bd6ac 239 case 'd':
342b8b6e 240 /* Here, the -d and --defines options are differentiated. */
cd5bd6ac 241 defines_flag = 1;
ae404801
AD
242 if (optarg)
243 spec_defines_file = AS_FILE_NAME (optarg);
cd5bd6ac
AD
244 break;
245
246 case 'l':
247 no_lines_flag = 1;
248 break;
249
250 case 'k':
251 token_table_flag = 1;
252 break;
253
cd5bd6ac
AD
254 case 'n':
255 no_parser_flag = 1;
256 break;
257
258 case 't':
259 debug_flag = 1;
260 break;
261
262 case 'o':
ae404801 263 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
264 break;
265
266 case 'b':
ae404801 267 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
268 break;
269
270 case 'p':
271 spec_name_prefix = optarg;
272 break;
273
ec3bc396
AD
274 case 'r':
275 report_argmatch (optarg);
276 break;
277
cd5bd6ac
AD
278 default:
279 fprintf (stderr, _("Try `%s --help' for more information.\n"),
280 program_name);
281 exit (1);
282 }
3d8fc6ca 283
f51cb8ff
AD
284 free (longopts);
285
3d8fc6ca
RS
286 if (optind == argc)
287 {
e79137ac
AD
288 fprintf (stderr, _("%s: no grammar file given\n"), program_name);
289 exit (1);
3d8fc6ca
RS
290 }
291 if (optind < argc - 1)
e79137ac
AD
292 fprintf (stderr, _("%s: extra arguments ignored after `%s'\n"),
293 program_name, argv[optind]);
3d8fc6ca
RS
294
295 infile = argv[optind];
296}