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