]> git.saurik.com Git - bison.git/blame - src/getargs.c
Credit Satya for the graphviz change.
[bison.git] / src / getargs.c
CommitLineData
08721544
PE
1/* Parse command line arguments for Bison.
2
e2a21b6f
PE
3 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006 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>
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;
d0829076
PE
52bool locations_flag;
53bool no_lines_flag;
54bool no_parser_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;
62bool pure_parser = false;
31c10e38 63bool push_parser = false;
916708d5 64
4e83ea15
AD
65int report_flag = report_none;
66int trace_flag = trace_none;
7b42569e 67int warnings_flag = warnings_none;
4e83ea15 68
b0ce6046 69const char *skeleton = NULL;
f6bd5427 70const char *include = NULL;
b0ce6046 71
cbd8ffc5 72extern char *program_name;
3d8fc6ca 73
273a74fa 74
7b42569e
AD
75/** Decode an option's set of keys.
76 *
77 * \param option option being decoded.
78 * \paran keys array of valid subarguments.
79 * \param values array of corresponding (int) values.
80 * \param flag the flags to update
81 * \param args colon separated list of effective subarguments to decode.
82 * If 0, then activate all the flags.
83 *
84 * The special value 0 resets the flags to 0.
85 */
80ac75bc
PE
86static void
87flags_argmatch (const char *option,
7b42569e
AD
88 const char * const keys[], const int values[],
89 int *flags, char *args)
90{
91 if (args)
92 {
93 args = strtok (args, ",");
94 do
95 {
96 int value = XARGMATCH (option, args, keys, values);
97 if (value == 0)
98 *flags = 0;
99 else
100 *flags |= value;
101 }
102 while ((args = strtok (NULL, ",")));
103 }
104 else
105 *flags = ~0;
106}
107
80ac75bc 108/** Decode a set of sub arguments.
7b42569e
AD
109 *
110 * \param FlagName the flag familly to update.
111 * \param args the effective sub arguments to decode.
112 *
113 * \arg FlagName_args the list of keys.
114 * \arg FlagName_types the list of values.
115 * \arg FlagName_flag the flag to update.
116 */
117#define FLAGS_ARGMATCH(FlagName, Args) \
118 flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \
119 &FlagName ## _flag, Args)
120
121
b8a41559
AD
122/*----------------------.
123| --report's handling. |
124`----------------------*/
125
126static const char * const report_args[] =
127{
128 /* In a series of synonyms, present the most meaningful first, so
129 that argmatch_valid be more readable. */
130 "none",
131 "state", "states",
132 "itemset", "itemsets",
133 "lookahead", "lookaheads", "look-ahead",
134 "solved",
135 "all",
136 0
137};
138
139static const int report_types[] =
140{
141 report_none,
142 report_states, report_states,
143 report_states | report_itemsets, report_states | report_itemsets,
144 report_states | report_lookahead_tokens,
145 report_states | report_lookahead_tokens,
146 report_states | report_lookahead_tokens,
147 report_states | report_solved_conflicts,
148 report_all
149};
150
151ARGMATCH_VERIFY (report_args, report_types);
152
b8a41559 153
273a74fa
AD
154/*---------------------.
155| --trace's handling. |
156`---------------------*/
157
158static const char * const trace_args[] =
159{
160 /* In a series of synonyms, present the most meaningful first, so
161 that argmatch_valid be more readable. */
b8a41559 162 "none - no traces",
c5e3e510
AD
163 "scan - grammar scanner traces",
164 "parse - grammar parser traces",
b8a41559 165 "automaton - construction of the automaton",
273a74fa 166 "bitsets - use of bitsets",
b8a41559 167 "grammar - reading, reducing the grammar",
1509d42f 168 "resource - memory consumption (where available)",
273a74fa 169 "sets - grammar sets: firsts, nullable etc.",
327afc7c
AD
170 "tools - m4 invocation",
171 "m4 - m4 traces",
c5e3e510
AD
172 "skeleton - skeleton postprocessing",
173 "time - time consumption",
273a74fa
AD
174 "all - all of the above",
175 0
176};
177
178static const int trace_types[] =
179{
180 trace_none,
473d0a75
AD
181 trace_scan,
182 trace_parse,
273a74fa
AD
183 trace_automaton,
184 trace_bitsets,
185 trace_grammar,
186 trace_resource,
187 trace_sets,
188 trace_tools,
327afc7c 189 trace_m4,
c5e3e510
AD
190 trace_skeleton,
191 trace_time,
273a74fa
AD
192 trace_all
193};
194
8a6f72f3 195ARGMATCH_VERIFY (trace_args, trace_types);
273a74fa 196
7b42569e
AD
197
198/*------------------------.
199| --warnings's handling. |
200`------------------------*/
201
202static const char * const warnings_args[] =
273a74fa 203{
7b42569e
AD
204 /* In a series of synonyms, present the most meaningful first, so
205 that argmatch_valid be more readable. */
206 "none - no warnings",
207 "error - warnings are errors",
208 "yacc - incompatibilities with POSIX YACC",
209 "all - all of the above",
210 0
211};
212
213static const int warnings_types[] =
214{
215 warnings_none,
216 warnings_error,
217 warnings_yacc,
218 warnings_all
219};
220
221ARGMATCH_VERIFY (warnings_args, warnings_types);
273a74fa
AD
222
223
0e575721
AD
224/*-------------------------------------------.
225| Display the help message and exit STATUS. |
226`-------------------------------------------*/
e79137ac 227
0df27e8b
PE
228static void usage (int) ATTRIBUTE_NORETURN;
229
4a120d45 230static void
0e575721 231usage (int status)
cbd8ffc5 232{
0e575721
AD
233 if (status != 0)
234 fprintf (stderr, _("Try `%s --help' for more information.\n"),
235 program_name);
236 else
237 {
a92be413 238 printf (_("Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 239 fputs (_("\
a92be413
PE
240Generate LALR(1) and GLR parsers.\n\
241\n\
242"), stdout);
9f306f2a 243
0e575721 244 fputs (_("\
a92be413
PE
245Mandatory arguments to long options are mandatory for short options too.\n\
246"), stdout);
9f306f2a 247
0e575721 248 fputs (_("\
a92be413 249\n\
9f306f2a 250Operation modes:\n\
f7ab6a50
PE
251 -h, --help display this help and exit\n\
252 -V, --version output version information and exit\n\
253 --print-localedir output directory containing locale-dependent data\n\
a92be413
PE
254 -y, --yacc emulate POSIX Yacc\n\
255\n\
256"), stdout);
9f306f2a 257
0e575721 258 fputs (_("\
9f306f2a 259Parser:\n\
cd5bd6ac 260 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 261 -t, --debug instrument the parser for debugging\n\
89cab50d 262 --locations enable locations computation\n\
9f306f2a
AD
263 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
264 -l, --no-lines don't generate `#line' directives\n\
265 -n, --no-parser generate the tables only\n\
9f306f2a 266 -k, --token-table include a table of token names\n\
a92be413 267\n\
0e575721 268"), stdout);
9f306f2a 269
0e575721 270 fputs (_("\
9f306f2a
AD
271Output:\n\
272 -d, --defines also produce a header file\n\
ec3bc396
AD
273 -r, --report=THINGS also produce details on the automaton\n\
274 -v, --verbose same as `--report=state'\n\
9f306f2a 275 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1 276 -o, --output=FILE leave output to FILE\n\
35fe0834 277 -g, --graph also output a graph of the automaton\n\
a92be413 278\n\
0e575721 279"), stdout);
86eff183 280
0e575721 281 fputs (_("\
ec3bc396
AD
282THINGS is a list of comma separated words that can include:\n\
283 `state' describe the states\n\
284 `itemset' complete the core item sets with their closure\n\
742e4900 285 `lookahead' explicitly associate lookahead tokens to items\n\
b408954b 286 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
287 `all' include all the above information\n\
288 `none' disable the report\n\
0e575721 289"), stdout);
9f306f2a 290
a92be413 291 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
0e575721
AD
292 }
293
294 exit (status);
cbd8ffc5
DM
295}
296
e79137ac
AD
297
298/*------------------------------.
299| Display the version message. |
300`------------------------------*/
301
302static void
0e575721 303version (void)
e79137ac
AD
304{
305 /* Some efforts were made to ease the translators' task, please
306 continue. */
0e575721
AD
307 printf (_("bison (GNU Bison) %s"), VERSION);
308 putc ('\n', stdout);
7891a7c4 309 printf ("%s", revision);
0e575721
AD
310 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
311 putc ('\n', stdout);
e79137ac 312
0e575721 313 fprintf (stdout,
e2a21b6f 314 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2006);
e79137ac
AD
315
316 fputs (_("\
317This is free software; see the source for copying conditions. There is NO\n\
318warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
319"),
0e575721 320 stdout);
e79137ac
AD
321}
322
323
324/*----------------------.
325| Process the options. |
326`----------------------*/
327
e2aaf4c4 328/* Shorts options. */
7b42569e 329static char const short_options[] = "yvegdhr:ltknVo:b:p:S:T::W";
e2aaf4c4 330
d0829076
PE
331/* Values for long options that do not have single-letter equivalents. */
332enum
333{
f7ab6a50
PE
334 LOCATIONS_OPTION = CHAR_MAX + 1,
335 PRINT_LOCALEDIR_OPTION
d0829076
PE
336};
337
e2aaf4c4
AD
338static struct option const long_options[] =
339{
340 /* Operation modes. */
7b42569e
AD
341 { "help", no_argument, 0, 'h' },
342 { "version", no_argument, 0, 'V' },
343 { "print-localedir", no_argument, 0, PRINT_LOCALEDIR_OPTION },
344 { "warnings", optional_argument, 0, 'W' },
e2aaf4c4
AD
345
346 /* Parser. */
347 { "name-prefix", required_argument, 0, 'p' },
348 { "include", required_argument, 0, 'I' },
349
350 /* Output. */
351 { "file-prefix", required_argument, 0, 'b' },
352 { "output", required_argument, 0, 'o' },
353 { "output-file", required_argument, 0, 'o' },
354 { "graph", optional_argument, 0, 'g' },
355 { "report", required_argument, 0, 'r' },
356 { "verbose", no_argument, 0, 'v' },
357
358 /* Hidden. */
273a74fa 359 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 360
e2aaf4c4
AD
361 /* Output. */
362 { "defines", optional_argument, 0, 'd' },
363
364 /* Operation modes. */
365 { "fixed-output-files", no_argument, 0, 'y' },
366 { "yacc", no_argument, 0, 'y' },
367
368 /* Parser. */
369 { "debug", no_argument, 0, 't' },
d0829076 370 { "locations", no_argument, 0, LOCATIONS_OPTION },
e2aaf4c4
AD
371 { "no-lines", no_argument, 0, 'l' },
372 { "no-parser", no_argument, 0, 'n' },
373 { "raw", no_argument, 0, 0 },
374 { "skeleton", required_argument, 0, 'S' },
375 { "token-table", no_argument, 0, 'k' },
376
377 {0, 0, 0, 0}
378};
379
ae404801
AD
380/* Under DOS, there is no difference on the case. This can be
381 troublesome when looking for `.tab' etc. */
382#ifdef MSDOS
383# define AS_FILE_NAME(File) (strlwr (File), (File))
384#else
385# define AS_FILE_NAME(File) (File)
386#endif
387
3d8fc6ca 388void
d2729d44 389getargs (int argc, char *argv[])
3d8fc6ca 390{
1916f98e 391 int c;
3d8fc6ca 392
08721544
PE
393 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
394 != -1)
cd5bd6ac
AD
395 switch (c)
396 {
397 case 0:
398 /* Certain long options cause getopt_long to return 0. */
399 break;
400
7b42569e
AD
401 case 'b':
402 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
403 break;
404
22c2cbc0 405 case 'g':
342b8b6e 406 /* Here, the -g and --graph=FILE options are differentiated. */
d0829076 407 graph_flag = true;
fcbfa6b0
PE
408 if (optarg)
409 spec_graph_file = AS_FILE_NAME (optarg);
22c2cbc0
AD
410 break;
411
7b42569e
AD
412 case 'h':
413 usage (EXIT_SUCCESS);
cd5bd6ac
AD
414
415 case 'S':
ae404801 416 skeleton = AS_FILE_NAME (optarg);
cd5bd6ac
AD
417 break;
418
f6bd5427 419 case 'I':
ae404801 420 include = AS_FILE_NAME (optarg);
f6bd5427
MA
421 break;
422
cd5bd6ac 423 case 'd':
342b8b6e 424 /* Here, the -d and --defines options are differentiated. */
d0829076 425 defines_flag = true;
ae404801
AD
426 if (optarg)
427 spec_defines_file = AS_FILE_NAME (optarg);
cd5bd6ac
AD
428 break;
429
7b42569e
AD
430 case 'k':
431 token_table_flag = true;
432 break;
433
cd5bd6ac 434 case 'l':
d0829076
PE
435 no_lines_flag = true;
436 break;
437
7b42569e
AD
438 case 'n':
439 no_parser_flag = true;
cd5bd6ac
AD
440 break;
441
7b42569e
AD
442 case 'o':
443 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
444 break;
445
7b42569e
AD
446 case 'p':
447 spec_name_prefix = optarg;
448 break;
449
450 case 'r':
451 FLAGS_ARGMATCH (report, optarg);
452 break;
453
454 case 'T':
455 FLAGS_ARGMATCH (trace, optarg);
cd5bd6ac
AD
456 break;
457
458 case 't':
d0829076 459 debug_flag = true;
cd5bd6ac
AD
460 break;
461
7b42569e
AD
462 case 'V':
463 version ();
464 exit (EXIT_SUCCESS);
cd5bd6ac 465
7b42569e
AD
466 case 'v':
467 report_flag |= report_states;
cd5bd6ac
AD
468 break;
469
7b42569e
AD
470 case 'y':
471 yacc_flag = true;
cd5bd6ac
AD
472 break;
473
7b42569e
AD
474 case 'W':
475 FLAGS_ARGMATCH (warnings, optarg);
ec3bc396
AD
476 break;
477
7b42569e
AD
478 case LOCATIONS_OPTION:
479 locations_flag = true;
273a74fa
AD
480 break;
481
7b42569e
AD
482 case PRINT_LOCALEDIR_OPTION:
483 printf ("%s\n", LOCALEDIR);
484 exit (EXIT_SUCCESS);
485
cd5bd6ac 486 default:
0df27e8b 487 usage (EXIT_FAILURE);
cd5bd6ac 488 }
3d8fc6ca 489
a4b6efd4 490 if (argc - optind != 1)
3d8fc6ca 491 {
a4b6efd4
PE
492 if (argc - optind < 1)
493 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
494 else
495 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 496 usage (EXIT_FAILURE);
3d8fc6ca 497 }
3d8fc6ca 498
d38a11a6 499 current_file = grammar_file = uniqstr_new (argv[optind]);
3d8fc6ca 500}