]> git.saurik.com Git - bison.git/blame - src/getargs.c
Make the ``Printers and Destructors'' test more verbose, taking
[bison.git] / src / getargs.c
CommitLineData
9f306f2a 1/* Parse command line arguments for bison.
a4b6efd4 2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
06b00abc 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"
0e575721 25#include "error.h"
b0ce6046 26#include "complain.h"
95612cfa 27#include "struniq.h"
ceed8467 28#include "getargs.h"
ec3bc396 29#include "files.h"
3d8fc6ca 30
89cab50d
AD
31int debug_flag = 0;
32int defines_flag = 0;
33int locations_flag = 0;
34int no_lines_flag = 0;
35int no_parser_flag = 0;
273a74fa 36int report_flag = report_none;
89cab50d 37int token_table_flag = 0;
89cab50d 38int yacc_flag = 0; /* for -y */
22c2cbc0 39int graph_flag = 0;
273a74fa 40int trace_flag = trace_none;
d2729d44 41
b0ce6046 42const char *skeleton = NULL;
f6bd5427 43const char *include = NULL;
b0ce6046 44
cbd8ffc5 45extern char *program_name;
3d8fc6ca 46
273a74fa
AD
47
48/*---------------------.
49| --trace's handling. |
50`---------------------*/
51
52static const char * const trace_args[] =
53{
54 /* In a series of synonyms, present the most meaningful first, so
55 that argmatch_valid be more readable. */
56 "none - no report",
473d0a75
AD
57 "scan - scanner traces",
58 "parse - parser traces",
273a74fa
AD
59 "automaton - contruction of the automaton",
60 "bitsets - use of bitsets",
61 "grammar - reading, reducing of the grammar",
1509d42f 62 "resource - memory consumption (where available)",
273a74fa 63 "sets - grammar sets: firsts, nullable etc.",
1509d42f 64 "time - time consumption",
273a74fa
AD
65 "tools - m4 invocation and preserve the temporary file",
66 "all - all of the above",
67 0
68};
69
70static const int trace_types[] =
71{
72 trace_none,
473d0a75
AD
73 trace_scan,
74 trace_parse,
273a74fa
AD
75 trace_automaton,
76 trace_bitsets,
77 trace_grammar,
78 trace_resource,
79 trace_sets,
1509d42f 80 trace_time,
273a74fa
AD
81 trace_tools,
82 trace_all
83};
84
85
86static void
87trace_argmatch (char *args)
88{
89 ARGMATCH_ASSERT (trace_args, trace_types);
90 if (args)
91 {
92 args = strtok (args, ",");
93 do
94 {
95 int trace = XARGMATCH ("--trace", args,
96 trace_args, trace_types);
97 if (trace == trace_none)
98 trace_flag = trace_none;
99 else
100 trace_flag |= trace;
101 }
102 while ((args = strtok (NULL, ",")));
103 }
104 else
105 trace_flag = trace_all;
106}
107
108
ec3bc396
AD
109/*----------------------.
110| --report's handling. |
111`----------------------*/
112
113static const char * const report_args[] =
114{
115 /* In a series of synonyms, present the most meaningful first, so
116 that argmatch_valid be more readable. */
117 "none",
118 "state", "states",
119 "itemset", "itemsets",
120 "lookahead", "lookaheads",
b408954b 121 "solved",
ec3bc396
AD
122 "all",
123 0
124};
125
126static const int report_types[] =
127{
128 report_none,
129 report_states, report_states,
130 report_states | report_itemsets, report_states | report_itemsets,
131 report_states | report_lookaheads, report_states | report_lookaheads,
b408954b 132 report_states | report_solved_conflicts,
ec3bc396
AD
133 report_all
134};
135
136
137static void
138report_argmatch (char *args)
139{
140 ARGMATCH_ASSERT (report_args, report_types);
9be0c25b 141 args = strtok (args, ",");
ec3bc396
AD
142 do
143 {
144 int report = XARGMATCH ("--report", args,
145 report_args, report_types);
146 if (report == report_none)
147 report_flag = report_none;
148 else
149 report_flag |= report;
150 }
151 while ((args = strtok (NULL, ",")));
152}
153
0e575721
AD
154
155/*-------------------------------------------.
156| Display the help message and exit STATUS. |
157`-------------------------------------------*/
e79137ac 158
0df27e8b
PE
159static void usage (int) ATTRIBUTE_NORETURN;
160
4a120d45 161static void
0e575721 162usage (int status)
cbd8ffc5 163{
0e575721
AD
164 if (status != 0)
165 fprintf (stderr, _("Try `%s --help' for more information.\n"),
166 program_name);
167 else
168 {
169 /* Some efforts were made to ease the translators' task, please
170 continue. */
171 fputs (_("\
172GNU bison generates parsers for LALR(1) grammars.\n"), stdout);
173 putc ('\n', stdout);
9f306f2a 174
0e575721 175 fprintf (stdout, _("\
9f306f2a 176Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 177 putc ('\n', stdout);
9f306f2a 178
0e575721 179 fputs (_("\
9f306f2a
AD
180If a long option shows an argument as mandatory, then it is mandatory\n\
181for the equivalent short option also. Similarly for optional arguments.\n"),
0e575721
AD
182 stdout);
183 putc ('\n', stdout);
9f306f2a 184
0e575721 185 fputs (_("\
9f306f2a
AD
186Operation modes:\n\
187 -h, --help display this help and exit\n\
188 -V, --version output version information and exit\n\
0e575721
AD
189 -y, --yacc emulate POSIX yacc\n"), stdout);
190 putc ('\n', stdout);
9f306f2a 191
0e575721 192 fputs (_("\
9f306f2a 193Parser:\n\
cd5bd6ac 194 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 195 -t, --debug instrument the parser for debugging\n\
89cab50d 196 --locations enable locations computation\n\
9f306f2a
AD
197 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
198 -l, --no-lines don't generate `#line' directives\n\
199 -n, --no-parser generate the tables only\n\
9f306f2a 200 -k, --token-table include a table of token names\n\
0e575721
AD
201"), stdout);
202 putc ('\n', stdout);
9f306f2a 203
0e575721 204 fputs (_("\
9f306f2a
AD
205Output:\n\
206 -d, --defines also produce a header file\n\
ec3bc396
AD
207 -r, --report=THINGS also produce details on the automaton\n\
208 -v, --verbose same as `--report=state'\n\
9f306f2a 209 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1
AD
210 -o, --output=FILE leave output to FILE\n\
211 -g, --graph also produce a VCG description of the automaton\n\
0e575721
AD
212"), stdout);
213 putc ('\n', stdout);
86eff183 214
0e575721 215 fputs (_("\
ec3bc396
AD
216THINGS is a list of comma separated words that can include:\n\
217 `state' describe the states\n\
218 `itemset' complete the core item sets with their closure\n\
219 `lookahead' explicitly associate lookaheads to items\n\
b408954b 220 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
221 `all' include all the above information\n\
222 `none' disable the report\n\
0e575721
AD
223"), stdout);
224 putc ('\n', stdout);
9f306f2a 225
0e575721
AD
226 fputs (_("\
227Report bugs to <bug-bison@gnu.org>.\n"), stdout);
228 }
229
230 exit (status);
cbd8ffc5
DM
231}
232
e79137ac
AD
233
234/*------------------------------.
235| Display the version message. |
236`------------------------------*/
237
238static void
0e575721 239version (void)
e79137ac
AD
240{
241 /* Some efforts were made to ease the translators' task, please
242 continue. */
0e575721
AD
243 printf (_("bison (GNU Bison) %s"), VERSION);
244 putc ('\n', stdout);
245 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
246 putc ('\n', stdout);
e79137ac 247
0e575721 248 fprintf (stdout,
06b00abc 249 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2002);
e79137ac
AD
250
251 fputs (_("\
252This is free software; see the source for copying conditions. There is NO\n\
253warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
254"),
0e575721 255 stdout);
e79137ac
AD
256}
257
258
259/*----------------------.
260| Process the options. |
261`----------------------*/
262
e2aaf4c4 263/* Shorts options. */
273a74fa 264const char *short_options = "yvegdhr:ltknVo:b:p:S:T::";
e2aaf4c4
AD
265
266static struct option const long_options[] =
267{
268 /* Operation modes. */
269 { "help", no_argument, 0, 'h' },
270 { "version", no_argument, 0, 'V' },
271
272 /* Parser. */
273 { "name-prefix", required_argument, 0, 'p' },
274 { "include", required_argument, 0, 'I' },
275
276 /* Output. */
277 { "file-prefix", required_argument, 0, 'b' },
278 { "output", required_argument, 0, 'o' },
279 { "output-file", required_argument, 0, 'o' },
280 { "graph", optional_argument, 0, 'g' },
281 { "report", required_argument, 0, 'r' },
282 { "verbose", no_argument, 0, 'v' },
283
284 /* Hidden. */
273a74fa 285 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 286
e2aaf4c4
AD
287 /* Output. */
288 { "defines", optional_argument, 0, 'd' },
289
290 /* Operation modes. */
291 { "fixed-output-files", no_argument, 0, 'y' },
292 { "yacc", no_argument, 0, 'y' },
293
294 /* Parser. */
295 { "debug", no_argument, 0, 't' },
296 { "locations", no_argument, &locations_flag, 1 },
297 { "no-lines", no_argument, 0, 'l' },
298 { "no-parser", no_argument, 0, 'n' },
299 { "raw", no_argument, 0, 0 },
300 { "skeleton", required_argument, 0, 'S' },
301 { "token-table", no_argument, 0, 'k' },
302
303 {0, 0, 0, 0}
304};
305
ae404801
AD
306/* Under DOS, there is no difference on the case. This can be
307 troublesome when looking for `.tab' etc. */
308#ifdef MSDOS
309# define AS_FILE_NAME(File) (strlwr (File), (File))
310#else
311# define AS_FILE_NAME(File) (File)
312#endif
313
3d8fc6ca 314void
d2729d44 315getargs (int argc, char *argv[])
3d8fc6ca 316{
1916f98e 317 int c;
3d8fc6ca 318
e2aaf4c4 319 while ((c = getopt_long (argc, argv, short_options, long_options, NULL)) != EOF)
cd5bd6ac
AD
320 switch (c)
321 {
322 case 0:
323 /* Certain long options cause getopt_long to return 0. */
324 break;
325
326 case 'y':
327 yacc_flag = 1;
328 break;
329
330 case 'h':
0df27e8b 331 usage (EXIT_SUCCESS);
cd5bd6ac
AD
332
333 case 'V':
0e575721 334 version ();
0df27e8b 335 exit (EXIT_SUCCESS);
cd5bd6ac 336
22c2cbc0 337 case 'g':
342b8b6e 338 /* Here, the -g and --graph=FILE options are differentiated. */
22c2cbc0 339 graph_flag = 1;
ae404801 340 spec_graph_file = AS_FILE_NAME (optarg);
22c2cbc0
AD
341 break;
342
cd5bd6ac 343 case 'v':
ec3bc396 344 report_flag |= report_states;
cd5bd6ac
AD
345 break;
346
347 case 'S':
ae404801 348 skeleton = AS_FILE_NAME (optarg);
cd5bd6ac
AD
349 break;
350
f6bd5427 351 case 'I':
ae404801 352 include = AS_FILE_NAME (optarg);
f6bd5427
MA
353 break;
354
cd5bd6ac 355 case 'd':
342b8b6e 356 /* Here, the -d and --defines options are differentiated. */
cd5bd6ac 357 defines_flag = 1;
ae404801
AD
358 if (optarg)
359 spec_defines_file = AS_FILE_NAME (optarg);
cd5bd6ac
AD
360 break;
361
362 case 'l':
363 no_lines_flag = 1;
364 break;
365
366 case 'k':
367 token_table_flag = 1;
368 break;
369
cd5bd6ac
AD
370 case 'n':
371 no_parser_flag = 1;
372 break;
373
374 case 't':
375 debug_flag = 1;
376 break;
377
378 case 'o':
ae404801 379 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
380 break;
381
382 case 'b':
ae404801 383 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
384 break;
385
386 case 'p':
387 spec_name_prefix = optarg;
388 break;
389
ec3bc396
AD
390 case 'r':
391 report_argmatch (optarg);
392 break;
393
273a74fa
AD
394 case 'T':
395 trace_argmatch (optarg);
396 break;
397
cd5bd6ac 398 default:
0df27e8b 399 usage (EXIT_FAILURE);
cd5bd6ac 400 }
3d8fc6ca 401
a4b6efd4 402 if (argc - optind != 1)
3d8fc6ca 403 {
a4b6efd4
PE
404 if (argc - optind < 1)
405 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
406 else
407 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 408 usage (EXIT_FAILURE);
3d8fc6ca 409 }
3d8fc6ca 410
95612cfa 411 current_file = grammar_file = struniq_new (argv[optind]);
3d8fc6ca 412}