]> git.saurik.com Git - bison.git/blame - src/getargs.c
Work around Java's ``code too large'' problem for parser tables.
[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>
9fe5a457 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"
9fe5a457 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
51365192 75int skeleton_prio = default_prio;
b0ce6046 76const char *skeleton = NULL;
51365192 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.",
5263bea9 179 "muscles - m4 definitions passed to the skeleton",
327afc7c
AD
180 "tools - m4 invocation",
181 "m4 - m4 traces",
c5e3e510
AD
182 "skeleton - skeleton postprocessing",
183 "time - time consumption",
273a74fa
AD
184 "all - all of the above",
185 0
186};
187
188static const int trace_types[] =
189{
190 trace_none,
473d0a75
AD
191 trace_scan,
192 trace_parse,
273a74fa
AD
193 trace_automaton,
194 trace_bitsets,
195 trace_grammar,
196 trace_resource,
197 trace_sets,
5263bea9 198 trace_muscles,
273a74fa 199 trace_tools,
327afc7c 200 trace_m4,
c5e3e510
AD
201 trace_skeleton,
202 trace_time,
273a74fa
AD
203 trace_all
204};
205
8a6f72f3 206ARGMATCH_VERIFY (trace_args, trace_types);
273a74fa 207
7b42569e
AD
208
209/*------------------------.
210| --warnings's handling. |
211`------------------------*/
212
213static const char * const warnings_args[] =
273a74fa 214{
7b42569e
AD
215 /* In a series of synonyms, present the most meaningful first, so
216 that argmatch_valid be more readable. */
17bd8a73
JD
217 "none - no warnings",
218 "midrule-values - unset or unused midrule values",
219 "yacc - incompatibilities with POSIX YACC",
220 "all - all of the above",
221 "error - warnings are errors",
7b42569e
AD
222 0
223};
224
225static const int warnings_types[] =
226{
227 warnings_none,
17bd8a73 228 warnings_midrule_values,
7b42569e 229 warnings_yacc,
89eb3c76
JD
230 warnings_all,
231 warnings_error
7b42569e
AD
232};
233
234ARGMATCH_VERIFY (warnings_args, warnings_types);
273a74fa
AD
235
236
0e575721
AD
237/*-------------------------------------------.
238| Display the help message and exit STATUS. |
239`-------------------------------------------*/
e79137ac 240
0df27e8b
PE
241static void usage (int) ATTRIBUTE_NORETURN;
242
4a120d45 243static void
0e575721 244usage (int status)
cbd8ffc5 245{
0e575721
AD
246 if (status != 0)
247 fprintf (stderr, _("Try `%s --help' for more information.\n"),
248 program_name);
249 else
250 {
a92be413 251 printf (_("Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 252 fputs (_("\
a92be413
PE
253Generate LALR(1) and GLR parsers.\n\
254\n\
255"), stdout);
9f306f2a 256
0e575721 257 fputs (_("\
a92be413 258Mandatory arguments to long options are mandatory for short options too.\n\
8e55b3aa
JD
259"), stdout);
260 fputs (_("\
261The same is true for optional arguments.\n\
a92be413 262"), stdout);
9f306f2a 263
0e575721 264 fputs (_("\
a92be413 265\n\
9f306f2a 266Operation modes:\n\
f7ab6a50
PE
267 -h, --help display this help and exit\n\
268 -V, --version output version information and exit\n\
269 --print-localedir output directory containing locale-dependent data\n\
d4bd2295 270 --print-datadir output directory containing skeletons and XSLT\n\
a92be413 271 -y, --yacc emulate POSIX Yacc\n\
9b9e0a7d 272 -W, --warnings[=CATEGORY] report the warnings falling in CATEGORY\n\
a92be413
PE
273\n\
274"), stdout);
9f306f2a 275
0e575721 276 fputs (_("\
9f306f2a 277Parser:\n\
59da312b 278 -L, --language=LANGUAGE specify the output programming language\n\
ed4d67dc 279 (this is an experimental feature)\n\
cd5bd6ac 280 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 281 -t, --debug instrument the parser for debugging\n\
58697c6d
AD
282 --locations enable location support\n\
283 -D, --define=NAME[=VALUE] same as `%define NAME \"VALUE\"'\n\
9f306f2a
AD
284 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
285 -l, --no-lines don't generate `#line' directives\n\
9f306f2a 286 -k, --token-table include a table of token names\n\
a92be413 287\n\
0e575721 288"), stdout);
9f306f2a 289
8e55b3aa
JD
290 /* Keep -d and --defines separate so that ../build-aux/cross-options.pl
291 * won't assume that -d also takes an argument. */
0e575721 292 fputs (_("\
9f306f2a 293Output:\n\
8e55b3aa
JD
294 --defines[=FILE] also produce a header file\n\
295 -d likewise but cannot specify FILE (for POSIX Yacc)\n\
ec3bc396 296 -r, --report=THINGS also produce details on the automaton\n\
1bb2bd75 297 --report-file=FILE write report to FILE\n\
ec3bc396 298 -v, --verbose same as `--report=state'\n\
9f306f2a 299 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1 300 -o, --output=FILE leave output to FILE\n\
6aeb9c57
AD
301 -g, --graph[=FILE] also output a graph of the automaton\n\
302 -x, --xml[=FILE] also output an XML report of the automaton\n\
59da312b 303 (the XML schema is experimental)\n\
a92be413 304\n\
0e575721 305"), stdout);
86eff183 306
6aeb9c57
AD
307 fputs (_("\
308Warning categories include:\n\
309 `midrule-values' unset or unused midrule values\n\
310 `yacc' incompatibilities with POSIX YACC\n\
311 `all' all the warnings\n\
312 `no-CATEGORY' turn off warnings in CATEGORY\n\
313 `none' turn off all the warnings\n\
314 `error' treat warnings as errors\n\
66f0441d 315\n\
6aeb9c57
AD
316"), stdout);
317
0e575721 318 fputs (_("\
ec3bc396
AD
319THINGS is a list of comma separated words that can include:\n\
320 `state' describe the states\n\
321 `itemset' complete the core item sets with their closure\n\
742e4900 322 `lookahead' explicitly associate lookahead tokens to items\n\
b408954b 323 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
324 `all' include all the above information\n\
325 `none' disable the report\n\
0e575721 326"), stdout);
9f306f2a 327
a92be413 328 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
0e575721
AD
329 }
330
331 exit (status);
cbd8ffc5
DM
332}
333
e79137ac
AD
334
335/*------------------------------.
336| Display the version message. |
337`------------------------------*/
338
339static void
0e575721 340version (void)
e79137ac
AD
341{
342 /* Some efforts were made to ease the translators' task, please
343 continue. */
0e575721
AD
344 printf (_("bison (GNU Bison) %s"), VERSION);
345 putc ('\n', stdout);
346 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
347 putc ('\n', stdout);
e79137ac 348
0e575721 349 fprintf (stdout,
a005a9c4
AD
350 _("Copyright (C) %d Free Software Foundation, Inc.\n"),
351 PACKAGE_COPYRIGHT_YEAR);
e79137ac
AD
352
353 fputs (_("\
354This is free software; see the source for copying conditions. There is NO\n\
355warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
356"),
0e575721 357 stdout);
e79137ac
AD
358}
359
360
0e021770
PE
361/*-------------------------------------.
362| --skeleton and --language handling. |
363`--------------------------------------*/
364
365void
5a893c2b 366skeleton_arg (char const *arg, int prio, location loc)
0e021770
PE
367{
368 if (prio < skeleton_prio)
369 {
370 skeleton_prio = prio;
371 skeleton = arg;
372 }
373 else if (prio == skeleton_prio)
374 {
375 char const *msg =
376 _("multiple skeleton declarations are invalid");
5a893c2b 377 complain_at (loc, msg);
0e021770
PE
378 }
379}
380
381void
5a893c2b 382language_argmatch (char const *arg, int prio, location loc)
0e021770
PE
383{
384 char const *msg;
385
386 if (prio < language_prio)
387 {
388 int i;
389 for (i = 0; valid_languages[i].language[0]; i++)
d7e0a1a7 390 if (c_strcasecmp (arg, valid_languages[i].language) == 0)
0e021770
PE
391 {
392 language_prio = prio;
393 language = &valid_languages[i];
394 return;
395 }
396 msg = _("invalid language `%s'");
397 }
398 else if (language_prio == prio)
399 msg = _("multiple language declarations are invalid");
400 else
401 return;
402
5a893c2b 403 complain_at (loc, msg, arg);
0e021770
PE
404}
405
e79137ac
AD
406/*----------------------.
407| Process the options. |
408`----------------------*/
409
7020f1e9
AD
410/* Shorts options.
411 Should be computed from long_options. */
412static char const short_options[] =
58697c6d 413 "D:"
7020f1e9
AD
414 "L:"
415 "S:"
416 "T::"
417 "V"
8e55b3aa 418 "W::"
7020f1e9
AD
419 "b:"
420 "d"
421 "e"
422 "g::"
423 "h"
424 "k"
425 "l"
426 "n"
427 "o:"
428 "p:"
429 "r:"
430 "t"
431 "v"
432 "x::"
433 "y"
434 ;
e2aaf4c4 435
d0829076
PE
436/* Values for long options that do not have single-letter equivalents. */
437enum
438{
f7ab6a50 439 LOCATIONS_OPTION = CHAR_MAX + 1,
d4bd2295 440 PRINT_LOCALEDIR_OPTION,
1bb2bd75
JD
441 PRINT_DATADIR_OPTION,
442 REPORT_FILE_OPTION
d0829076
PE
443};
444
e2aaf4c4
AD
445static struct option const long_options[] =
446{
447 /* Operation modes. */
7b42569e
AD
448 { "help", no_argument, 0, 'h' },
449 { "version", no_argument, 0, 'V' },
450 { "print-localedir", no_argument, 0, PRINT_LOCALEDIR_OPTION },
d4bd2295 451 { "print-datadir", no_argument, 0, PRINT_DATADIR_OPTION },
7b42569e 452 { "warnings", optional_argument, 0, 'W' },
e2aaf4c4
AD
453
454 /* Parser. */
455 { "name-prefix", required_argument, 0, 'p' },
456 { "include", required_argument, 0, 'I' },
457
458 /* Output. */
459 { "file-prefix", required_argument, 0, 'b' },
460 { "output", required_argument, 0, 'o' },
461 { "output-file", required_argument, 0, 'o' },
462 { "graph", optional_argument, 0, 'g' },
41d7a5f2 463 { "xml", optional_argument, 0, 'x' },
e2aaf4c4 464 { "report", required_argument, 0, 'r' },
1bb2bd75 465 { "report-file", required_argument, 0, REPORT_FILE_OPTION },
e2aaf4c4
AD
466 { "verbose", no_argument, 0, 'v' },
467
468 /* Hidden. */
273a74fa 469 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 470
e2aaf4c4
AD
471 /* Output. */
472 { "defines", optional_argument, 0, 'd' },
473
474 /* Operation modes. */
475 { "fixed-output-files", no_argument, 0, 'y' },
476 { "yacc", no_argument, 0, 'y' },
477
478 /* Parser. */
479 { "debug", no_argument, 0, 't' },
58697c6d 480 { "define", required_argument, 0, 'D' },
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
58697c6d
AD
499/* Build a location for the current command line argument. */
500static
501location
502command_line_location()
503{
504 location res;
505 /* "<command line>" is used in GCC's messages about -D. */
506 boundary_set (&res.start, uniqstr_new ("<command line>"), optind, -1);
507 res.end = res.start;
508 return res;
509}
510
511
3d8fc6ca 512void
d2729d44 513getargs (int argc, char *argv[])
3d8fc6ca 514{
1916f98e 515 int c;
3d8fc6ca 516
08721544
PE
517 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
518 != -1)
cd5bd6ac
AD
519 switch (c)
520 {
58697c6d
AD
521 /* ASCII Sorting for short options (i.e., upper case then
522 lower case), and then long-only options. */
523
cd5bd6ac
AD
524 case 0:
525 /* Certain long options cause getopt_long to return 0. */
526 break;
527
58697c6d
AD
528 case 'D': /* -DNAME[=VALUE]. */
529 {
530 char* name = optarg;
531 char* value = strchr (optarg, '=');
532 if (value)
533 *value++ = 0;
534 else
535 value = "";
536 muscle_percent_define_insert (name, command_line_location (), value);
537 }
22c2cbc0
AD
538 break;
539
8e55b3aa
JD
540 case 'I':
541 include = AS_FILE_NAME (optarg);
41d7a5f2
PE
542 break;
543
0e021770 544 case 'L':
51365192
JD
545 language_argmatch (optarg, command_line_prio,
546 command_line_location ());
0e021770
PE
547 break;
548
cd5bd6ac 549 case 'S':
51365192
JD
550 skeleton_arg (AS_FILE_NAME (optarg), command_line_prio,
551 command_line_location ());
cd5bd6ac
AD
552 break;
553
8e55b3aa
JD
554 case 'T':
555 FLAGS_ARGMATCH (trace, optarg);
f6bd5427
MA
556 break;
557
8e55b3aa
JD
558 case 'V':
559 version ();
560 exit (EXIT_SUCCESS);
561
562 case 'W':
ae404801 563 if (optarg)
8e55b3aa
JD
564 FLAGS_ARGMATCH (warnings, optarg);
565 else
566 warnings_flag |= warnings_all;
567 break;
568
569 case 'b':
570 spec_file_prefix = AS_FILE_NAME (optarg);
571 break;
572
58697c6d
AD
573 case 'd':
574 /* Here, the -d and --defines options are differentiated. */
575 defines_flag = true;
576 if (optarg)
577 spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
578 break;
579
8e55b3aa
JD
580 case 'g':
581 graph_flag = true;
582 if (optarg)
583 spec_graph_file = xstrdup (AS_FILE_NAME (optarg));
cd5bd6ac
AD
584 break;
585
8e55b3aa
JD
586 case 'h':
587 usage (EXIT_SUCCESS);
588
7b42569e
AD
589 case 'k':
590 token_table_flag = true;
591 break;
592
cd5bd6ac 593 case 'l':
d0829076
PE
594 no_lines_flag = true;
595 break;
596
7b42569e
AD
597 case 'o':
598 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
599 break;
600
7b42569e
AD
601 case 'p':
602 spec_name_prefix = optarg;
603 break;
604
605 case 'r':
606 FLAGS_ARGMATCH (report, optarg);
607 break;
608
cd5bd6ac 609 case 't':
d0829076 610 debug_flag = true;
cd5bd6ac
AD
611 break;
612
7b42569e
AD
613 case 'v':
614 report_flag |= report_states;
cd5bd6ac
AD
615 break;
616
8e55b3aa
JD
617 case 'x':
618 xml_flag = true;
619 if (optarg)
620 spec_xml_file = xstrdup (AS_FILE_NAME (optarg));
cd5bd6ac
AD
621 break;
622
8e55b3aa
JD
623 case 'y':
624 yacc_flag = true;
ec3bc396
AD
625 break;
626
7b42569e
AD
627 case LOCATIONS_OPTION:
628 locations_flag = true;
273a74fa
AD
629 break;
630
7b42569e
AD
631 case PRINT_LOCALEDIR_OPTION:
632 printf ("%s\n", LOCALEDIR);
633 exit (EXIT_SUCCESS);
634
d4bd2295
JD
635 case PRINT_DATADIR_OPTION:
636 printf ("%s\n", compute_pkgdatadir ());
637 exit (EXIT_SUCCESS);
638
8e55b3aa
JD
639 case REPORT_FILE_OPTION:
640 spec_verbose_file = xstrdup (AS_FILE_NAME (optarg));
641 break;
642
cd5bd6ac 643 default:
0df27e8b 644 usage (EXIT_FAILURE);
cd5bd6ac 645 }
3d8fc6ca 646
a4b6efd4 647 if (argc - optind != 1)
3d8fc6ca 648 {
a4b6efd4
PE
649 if (argc - optind < 1)
650 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
651 else
652 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 653 usage (EXIT_FAILURE);
3d8fc6ca 654 }
3d8fc6ca 655
d38a11a6 656 current_file = grammar_file = uniqstr_new (argv[optind]);
9fe5a457 657 MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
3d8fc6ca 658}