]> git.saurik.com Git - bison.git/blame - src/getargs.c
2007-02-07 Paolo Bonzini <bonzini@gnu.org>
[bison.git] / src / getargs.c
CommitLineData
08721544
PE
1/* Parse command line arguments for Bison.
2
e2a21b6f 3 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
8405b70c 4 2005, 2006, 2007 Free Software Foundation, Inc.
3d8fc6ca 5
9f306f2a 6 This file is part of Bison, the GNU Compiler Compiler.
3d8fc6ca 7
9f306f2a
AD
8 Bison is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
3d8fc6ca 12
9f306f2a
AD
13 Bison is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
3d8fc6ca 17
9f306f2a
AD
18 You should have received a copy of the GNU General Public License
19 along with Bison; see the file COPYING. If not, write to the Free
0fb669f9
PE
20 Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA. */
3d8fc6ca 22
2cec9080 23#include <config.h>
3d8fc6ca 24#include "system.h"
7891a7c4 25#include "revision.h"
d38a11a6
PE
26
27#include <argmatch.h>
2c2b7220 28#include <c-strcase.h>
3b2942e6 29#include <configmake.h>
d38a11a6 30#include <error.h>
f47dbf6b
PE
31
32/* Hack to get <getopt.h> to declare getopt with a prototype. */
33#if lint && ! defined __GNU_LIBRARY__
34# define __GNU_LIBRARY__
35# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1
36#endif
37
d38a11a6
PE
38#include <getopt.h>
39
f47dbf6b
PE
40#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE
41# undef __GNU_LIBRARY__
42# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE
43#endif
44
b0ce6046 45#include "complain.h"
ec3bc396 46#include "files.h"
d38a11a6
PE
47#include "getargs.h"
48#include "uniqstr.h"
3d8fc6ca 49
d0829076
PE
50bool debug_flag;
51bool defines_flag;
4e83ea15 52bool graph_flag;
d0829076
PE
53bool locations_flag;
54bool no_lines_flag;
55bool no_parser_flag;
d0829076
PE
56bool token_table_flag;
57bool yacc_flag; /* for -y */
4e83ea15
AD
58
59bool error_verbose = false;
d2729d44 60
916708d5
AD
61bool nondeterministic_parser = false;
62bool glr_parser = false;
7172e23e 63bool pull_parser = true;
916708d5 64bool pure_parser = false;
31c10e38 65bool push_parser = false;
916708d5 66
4e83ea15
AD
67int report_flag = report_none;
68int trace_flag = trace_none;
7b42569e 69int warnings_flag = warnings_none;
4e83ea15 70
0e021770
PE
71static struct bison_language const valid_languages[] = {
72 { "c", "c-skel.m4", ".c", ".h", true },
73 { "c++", "c++-skel.m4", ".cc", ".hh", true },
8405b70c 74 { "java", "java-skel.m4", ".java", ".java", false },
0e021770
PE
75 { "", "", "", "", false }
76};
77
78static int skeleton_prio = 2;
b0ce6046 79const char *skeleton = NULL;
0e021770
PE
80static int language_prio = 2;
81struct bison_language const *language = &valid_languages[0];
f6bd5427 82const char *include = NULL;
b0ce6046 83
0e021770 84char *program_name;
3d8fc6ca 85
273a74fa 86
7b42569e
AD
87/** Decode an option's set of keys.
88 *
89 * \param option option being decoded.
07c39ae9 90 * \param keys array of valid subarguments.
7b42569e 91 * \param values array of corresponding (int) values.
07c39ae9 92 * \param flags the flags to update
7b42569e
AD
93 * \param args colon separated list of effective subarguments to decode.
94 * If 0, then activate all the flags.
95 *
96 * The special value 0 resets the flags to 0.
97 */
80ac75bc
PE
98static void
99flags_argmatch (const char *option,
7b42569e
AD
100 const char * const keys[], const int values[],
101 int *flags, char *args)
102{
103 if (args)
104 {
105 args = strtok (args, ",");
ba7560e2 106 while (args)
7b42569e
AD
107 {
108 int value = XARGMATCH (option, args, keys, values);
109 if (value == 0)
110 *flags = 0;
111 else
112 *flags |= value;
eb095650 113 args = strtok (NULL, ",");
7b42569e 114 }
7b42569e
AD
115 }
116 else
117 *flags = ~0;
118}
119
80ac75bc 120/** Decode a set of sub arguments.
7b42569e
AD
121 *
122 * \param FlagName the flag familly to update.
07c39ae9 123 * \param Args the effective sub arguments to decode.
7b42569e
AD
124 *
125 * \arg FlagName_args the list of keys.
126 * \arg FlagName_types the list of values.
127 * \arg FlagName_flag the flag to update.
128 */
129#define FLAGS_ARGMATCH(FlagName, Args) \
130 flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \
131 &FlagName ## _flag, Args)
132
133
b8a41559
AD
134/*----------------------.
135| --report's handling. |
136`----------------------*/
137
138static const char * const report_args[] =
139{
140 /* In a series of synonyms, present the most meaningful first, so
141 that argmatch_valid be more readable. */
142 "none",
143 "state", "states",
144 "itemset", "itemsets",
145 "lookahead", "lookaheads", "look-ahead",
146 "solved",
147 "all",
148 0
149};
150
151static const int report_types[] =
152{
153 report_none,
154 report_states, report_states,
155 report_states | report_itemsets, report_states | report_itemsets,
156 report_states | report_lookahead_tokens,
157 report_states | report_lookahead_tokens,
158 report_states | report_lookahead_tokens,
159 report_states | report_solved_conflicts,
160 report_all
161};
162
163ARGMATCH_VERIFY (report_args, report_types);
164
b8a41559 165
273a74fa
AD
166/*---------------------.
167| --trace's handling. |
168`---------------------*/
169
170static const char * const trace_args[] =
171{
172 /* In a series of synonyms, present the most meaningful first, so
173 that argmatch_valid be more readable. */
b8a41559 174 "none - no traces",
c5e3e510
AD
175 "scan - grammar scanner traces",
176 "parse - grammar parser traces",
b8a41559 177 "automaton - construction of the automaton",
273a74fa 178 "bitsets - use of bitsets",
b8a41559 179 "grammar - reading, reducing the grammar",
1509d42f 180 "resource - memory consumption (where available)",
273a74fa 181 "sets - grammar sets: firsts, nullable etc.",
327afc7c
AD
182 "tools - m4 invocation",
183 "m4 - m4 traces",
c5e3e510
AD
184 "skeleton - skeleton postprocessing",
185 "time - time consumption",
273a74fa
AD
186 "all - all of the above",
187 0
188};
189
190static const int trace_types[] =
191{
192 trace_none,
473d0a75
AD
193 trace_scan,
194 trace_parse,
273a74fa
AD
195 trace_automaton,
196 trace_bitsets,
197 trace_grammar,
198 trace_resource,
199 trace_sets,
200 trace_tools,
327afc7c 201 trace_m4,
c5e3e510
AD
202 trace_skeleton,
203 trace_time,
273a74fa
AD
204 trace_all
205};
206
8a6f72f3 207ARGMATCH_VERIFY (trace_args, trace_types);
273a74fa 208
7b42569e
AD
209
210/*------------------------.
211| --warnings's handling. |
212`------------------------*/
213
214static const char * const warnings_args[] =
273a74fa 215{
7b42569e
AD
216 /* In a series of synonyms, present the most meaningful first, so
217 that argmatch_valid be more readable. */
17bd8a73
JD
218 "none - no warnings",
219 "midrule-values - unset or unused midrule values",
220 "yacc - incompatibilities with POSIX YACC",
221 "all - all of the above",
222 "error - warnings are errors",
7b42569e
AD
223 0
224};
225
226static const int warnings_types[] =
227{
228 warnings_none,
17bd8a73 229 warnings_midrule_values,
7b42569e 230 warnings_yacc,
89eb3c76
JD
231 warnings_all,
232 warnings_error
7b42569e
AD
233};
234
235ARGMATCH_VERIFY (warnings_args, warnings_types);
273a74fa
AD
236
237
0e575721
AD
238/*-------------------------------------------.
239| Display the help message and exit STATUS. |
240`-------------------------------------------*/
e79137ac 241
0df27e8b
PE
242static void usage (int) ATTRIBUTE_NORETURN;
243
4a120d45 244static void
0e575721 245usage (int status)
cbd8ffc5 246{
0e575721
AD
247 if (status != 0)
248 fprintf (stderr, _("Try `%s --help' for more information.\n"),
249 program_name);
250 else
251 {
a92be413 252 printf (_("Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 253 fputs (_("\
a92be413
PE
254Generate LALR(1) and GLR parsers.\n\
255\n\
256"), stdout);
9f306f2a 257
0e575721 258 fputs (_("\
a92be413
PE
259Mandatory arguments to long options are mandatory for short options too.\n\
260"), stdout);
9f306f2a 261
0e575721 262 fputs (_("\
a92be413 263\n\
9f306f2a 264Operation modes:\n\
f7ab6a50
PE
265 -h, --help display this help and exit\n\
266 -V, --version output version information and exit\n\
267 --print-localedir output directory containing locale-dependent data\n\
a92be413
PE
268 -y, --yacc emulate POSIX Yacc\n\
269\n\
270"), stdout);
9f306f2a 271
0e575721 272 fputs (_("\
9f306f2a 273Parser:\n\
cd5bd6ac 274 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 275 -t, --debug instrument the parser for debugging\n\
89cab50d 276 --locations enable locations computation\n\
9f306f2a
AD
277 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
278 -l, --no-lines don't generate `#line' directives\n\
279 -n, --no-parser generate the tables only\n\
9f306f2a 280 -k, --token-table include a table of token names\n\
a92be413 281\n\
0e575721 282"), stdout);
9f306f2a 283
0e575721 284 fputs (_("\
9f306f2a
AD
285Output:\n\
286 -d, --defines also produce a header file\n\
ec3bc396
AD
287 -r, --report=THINGS also produce details on the automaton\n\
288 -v, --verbose same as `--report=state'\n\
9f306f2a 289 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1 290 -o, --output=FILE leave output to FILE\n\
35fe0834 291 -g, --graph also output a graph of the automaton\n\
a92be413 292\n\
0e575721 293"), stdout);
86eff183 294
0e575721 295 fputs (_("\
ec3bc396
AD
296THINGS is a list of comma separated words that can include:\n\
297 `state' describe the states\n\
298 `itemset' complete the core item sets with their closure\n\
742e4900 299 `lookahead' explicitly associate lookahead tokens to items\n\
b408954b 300 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
301 `all' include all the above information\n\
302 `none' disable the report\n\
0e575721 303"), stdout);
9f306f2a 304
a92be413 305 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
0e575721
AD
306 }
307
308 exit (status);
cbd8ffc5
DM
309}
310
e79137ac
AD
311
312/*------------------------------.
313| Display the version message. |
314`------------------------------*/
315
316static void
0e575721 317version (void)
e79137ac
AD
318{
319 /* Some efforts were made to ease the translators' task, please
320 continue. */
0e575721
AD
321 printf (_("bison (GNU Bison) %s"), VERSION);
322 putc ('\n', stdout);
7891a7c4 323 printf ("%s", revision);
0e575721
AD
324 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
325 putc ('\n', stdout);
e79137ac 326
0e575721 327 fprintf (stdout,
e2a21b6f 328 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2006);
e79137ac
AD
329
330 fputs (_("\
331This is free software; see the source for copying conditions. There is NO\n\
332warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
333"),
0e575721 334 stdout);
e79137ac
AD
335}
336
337
0e021770
PE
338/*-------------------------------------.
339| --skeleton and --language handling. |
340`--------------------------------------*/
341
342void
343skeleton_arg (char const *arg, int prio, location const *loc)
344{
345 if (prio < skeleton_prio)
346 {
347 skeleton_prio = prio;
348 skeleton = arg;
349 }
350 else if (prio == skeleton_prio)
351 {
352 char const *msg =
353 _("multiple skeleton declarations are invalid");
354 if (loc)
355 complain_at (*loc, msg);
356 else
357 complain (msg);
358 }
359}
360
361void
362language_argmatch (char const *arg, int prio, location const *loc)
363{
364 char const *msg;
365
366 if (prio < language_prio)
367 {
368 int i;
369 for (i = 0; valid_languages[i].language[0]; i++)
2c2b7220 370 if (c_strcasecmp (arg, valid_languages[i].language) == 0)
0e021770
PE
371 {
372 language_prio = prio;
373 language = &valid_languages[i];
374 return;
375 }
376 msg = _("invalid language `%s'");
377 }
378 else if (language_prio == prio)
379 msg = _("multiple language declarations are invalid");
380 else
381 return;
382
383 if (loc)
384 complain_at (*loc, msg, arg);
385 else
386 complain (msg, arg);
387}
388
e79137ac
AD
389/*----------------------.
390| Process the options. |
391`----------------------*/
392
e2aaf4c4 393/* Shorts options. */
0e021770 394static char const short_options[] = "yvegdhr:L:ltknVo:b:p:S:T::W";
e2aaf4c4 395
d0829076
PE
396/* Values for long options that do not have single-letter equivalents. */
397enum
398{
f7ab6a50
PE
399 LOCATIONS_OPTION = CHAR_MAX + 1,
400 PRINT_LOCALEDIR_OPTION
d0829076
PE
401};
402
e2aaf4c4
AD
403static struct option const long_options[] =
404{
405 /* Operation modes. */
7b42569e
AD
406 { "help", no_argument, 0, 'h' },
407 { "version", no_argument, 0, 'V' },
408 { "print-localedir", no_argument, 0, PRINT_LOCALEDIR_OPTION },
409 { "warnings", optional_argument, 0, 'W' },
e2aaf4c4
AD
410
411 /* Parser. */
412 { "name-prefix", required_argument, 0, 'p' },
413 { "include", required_argument, 0, 'I' },
414
415 /* Output. */
416 { "file-prefix", required_argument, 0, 'b' },
417 { "output", required_argument, 0, 'o' },
418 { "output-file", required_argument, 0, 'o' },
419 { "graph", optional_argument, 0, 'g' },
420 { "report", required_argument, 0, 'r' },
421 { "verbose", no_argument, 0, 'v' },
422
423 /* Hidden. */
273a74fa 424 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 425
e2aaf4c4
AD
426 /* Output. */
427 { "defines", optional_argument, 0, 'd' },
428
429 /* Operation modes. */
430 { "fixed-output-files", no_argument, 0, 'y' },
431 { "yacc", no_argument, 0, 'y' },
432
433 /* Parser. */
434 { "debug", no_argument, 0, 't' },
d0829076 435 { "locations", no_argument, 0, LOCATIONS_OPTION },
e2aaf4c4
AD
436 { "no-lines", no_argument, 0, 'l' },
437 { "no-parser", no_argument, 0, 'n' },
438 { "raw", no_argument, 0, 0 },
439 { "skeleton", required_argument, 0, 'S' },
0e021770 440 { "language", required_argument, 0, 'L' },
e2aaf4c4
AD
441 { "token-table", no_argument, 0, 'k' },
442
443 {0, 0, 0, 0}
444};
445
ae404801
AD
446/* Under DOS, there is no difference on the case. This can be
447 troublesome when looking for `.tab' etc. */
448#ifdef MSDOS
449# define AS_FILE_NAME(File) (strlwr (File), (File))
450#else
451# define AS_FILE_NAME(File) (File)
452#endif
453
3d8fc6ca 454void
d2729d44 455getargs (int argc, char *argv[])
3d8fc6ca 456{
1916f98e 457 int c;
3d8fc6ca 458
08721544
PE
459 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
460 != -1)
cd5bd6ac
AD
461 switch (c)
462 {
463 case 0:
464 /* Certain long options cause getopt_long to return 0. */
465 break;
466
7b42569e
AD
467 case 'b':
468 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
469 break;
470
22c2cbc0 471 case 'g':
342b8b6e 472 /* Here, the -g and --graph=FILE options are differentiated. */
d0829076 473 graph_flag = true;
fcbfa6b0 474 if (optarg)
eb095650 475 spec_graph_file = xstrdup (AS_FILE_NAME (optarg));
22c2cbc0
AD
476 break;
477
7b42569e
AD
478 case 'h':
479 usage (EXIT_SUCCESS);
cd5bd6ac 480
0e021770
PE
481 case 'L':
482 language_argmatch (optarg, 0, NULL);
483 break;
484
cd5bd6ac 485 case 'S':
0e021770 486 skeleton_arg (AS_FILE_NAME (optarg), 0, NULL);
cd5bd6ac
AD
487 break;
488
f6bd5427 489 case 'I':
ae404801 490 include = AS_FILE_NAME (optarg);
f6bd5427
MA
491 break;
492
cd5bd6ac 493 case 'd':
342b8b6e 494 /* Here, the -d and --defines options are differentiated. */
d0829076 495 defines_flag = true;
ae404801 496 if (optarg)
eb095650 497 spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
cd5bd6ac
AD
498 break;
499
7b42569e
AD
500 case 'k':
501 token_table_flag = true;
502 break;
503
cd5bd6ac 504 case 'l':
d0829076
PE
505 no_lines_flag = true;
506 break;
507
7b42569e
AD
508 case 'n':
509 no_parser_flag = true;
cd5bd6ac
AD
510 break;
511
7b42569e
AD
512 case 'o':
513 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
514 break;
515
7b42569e
AD
516 case 'p':
517 spec_name_prefix = optarg;
518 break;
519
520 case 'r':
521 FLAGS_ARGMATCH (report, optarg);
522 break;
523
524 case 'T':
525 FLAGS_ARGMATCH (trace, optarg);
cd5bd6ac
AD
526 break;
527
528 case 't':
d0829076 529 debug_flag = true;
cd5bd6ac
AD
530 break;
531
7b42569e
AD
532 case 'V':
533 version ();
534 exit (EXIT_SUCCESS);
cd5bd6ac 535
7b42569e
AD
536 case 'v':
537 report_flag |= report_states;
cd5bd6ac
AD
538 break;
539
7b42569e
AD
540 case 'y':
541 yacc_flag = true;
cd5bd6ac
AD
542 break;
543
7b42569e 544 case 'W':
89eb3c76
JD
545 if (optarg)
546 FLAGS_ARGMATCH (warnings, optarg);
547 else
548 warnings_flag |= warnings_all;
ec3bc396
AD
549 break;
550
7b42569e
AD
551 case LOCATIONS_OPTION:
552 locations_flag = true;
273a74fa
AD
553 break;
554
7b42569e
AD
555 case PRINT_LOCALEDIR_OPTION:
556 printf ("%s\n", LOCALEDIR);
557 exit (EXIT_SUCCESS);
558
cd5bd6ac 559 default:
0df27e8b 560 usage (EXIT_FAILURE);
cd5bd6ac 561 }
3d8fc6ca 562
a4b6efd4 563 if (argc - optind != 1)
3d8fc6ca 564 {
a4b6efd4
PE
565 if (argc - optind < 1)
566 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
567 else
568 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 569 usage (EXIT_FAILURE);
3d8fc6ca 570 }
3d8fc6ca 571
d38a11a6 572 current_file = grammar_file = uniqstr_new (argv[optind]);
3d8fc6ca 573}