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