]> git.saurik.com Git - bison.git/blame - src/getargs.c
* doc/bison.texinfo (How Can I Reset @code{yyparse}):
[bison.git] / src / getargs.c
CommitLineData
08721544
PE
1/* Parse command line arguments for Bison.
2
8522c9ed 3 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003
06b00abc 4 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
20 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
3d8fc6ca 22
3d8fc6ca 23#include "system.h"
d38a11a6
PE
24
25#include <argmatch.h>
26#include <error.h>
f47dbf6b
PE
27
28/* Hack to get <getopt.h> to declare getopt with a prototype. */
29#if lint && ! defined __GNU_LIBRARY__
30# define __GNU_LIBRARY__
31# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1
32#endif
33
d38a11a6
PE
34#include <getopt.h>
35
f47dbf6b
PE
36#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE
37# undef __GNU_LIBRARY__
38# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE
39#endif
40
b0ce6046 41#include "complain.h"
ec3bc396 42#include "files.h"
d38a11a6
PE
43#include "getargs.h"
44#include "uniqstr.h"
3d8fc6ca 45
89cab50d
AD
46int debug_flag = 0;
47int defines_flag = 0;
48int locations_flag = 0;
49int no_lines_flag = 0;
50int no_parser_flag = 0;
273a74fa 51int report_flag = report_none;
89cab50d 52int token_table_flag = 0;
89cab50d 53int yacc_flag = 0; /* for -y */
22c2cbc0 54int graph_flag = 0;
273a74fa 55int trace_flag = trace_none;
d2729d44 56
916708d5
AD
57bool nondeterministic_parser = false;
58bool glr_parser = false;
59bool pure_parser = false;
60
b0ce6046 61const char *skeleton = NULL;
f6bd5427 62const char *include = NULL;
b0ce6046 63
cbd8ffc5 64extern char *program_name;
3d8fc6ca 65
273a74fa
AD
66
67/*---------------------.
68| --trace's handling. |
69`---------------------*/
70
71static const char * const trace_args[] =
72{
73 /* In a series of synonyms, present the most meaningful first, so
74 that argmatch_valid be more readable. */
75 "none - no report",
c5e3e510
AD
76 "scan - grammar scanner traces",
77 "parse - grammar parser traces",
273a74fa
AD
78 "automaton - contruction of the automaton",
79 "bitsets - use of bitsets",
80 "grammar - reading, reducing of the grammar",
1509d42f 81 "resource - memory consumption (where available)",
273a74fa
AD
82 "sets - grammar sets: firsts, nullable etc.",
83 "tools - m4 invocation and preserve the temporary file",
c5e3e510
AD
84 "skeleton - skeleton postprocessing",
85 "time - time consumption",
273a74fa
AD
86 "all - all of the above",
87 0
88};
89
90static const int trace_types[] =
91{
92 trace_none,
473d0a75
AD
93 trace_scan,
94 trace_parse,
273a74fa
AD
95 trace_automaton,
96 trace_bitsets,
97 trace_grammar,
98 trace_resource,
99 trace_sets,
100 trace_tools,
c5e3e510
AD
101 trace_skeleton,
102 trace_time,
273a74fa
AD
103 trace_all
104};
105
106
107static void
108trace_argmatch (char *args)
109{
7223426a 110 verify (trace_constraint, ARGMATCH_CONSTRAINT (trace_args, trace_types));
273a74fa
AD
111 if (args)
112 {
113 args = strtok (args, ",");
114 do
115 {
116 int trace = XARGMATCH ("--trace", args,
117 trace_args, trace_types);
118 if (trace == trace_none)
119 trace_flag = trace_none;
120 else
121 trace_flag |= trace;
122 }
123 while ((args = strtok (NULL, ",")));
124 }
125 else
126 trace_flag = trace_all;
127}
128
129
ec3bc396
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",
b408954b 142 "solved",
ec3bc396
AD
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_lookaheads, report_states | report_lookaheads,
b408954b 153 report_states | report_solved_conflicts,
ec3bc396
AD
154 report_all
155};
156
157
158static void
159report_argmatch (char *args)
160{
7223426a 161 verify (report_constraint, ARGMATCH_CONSTRAINT (report_args, report_types));
9be0c25b 162 args = strtok (args, ",");
ec3bc396
AD
163 do
164 {
165 int report = XARGMATCH ("--report", args,
166 report_args, report_types);
167 if (report == report_none)
168 report_flag = report_none;
169 else
170 report_flag |= report;
171 }
172 while ((args = strtok (NULL, ",")));
173}
174
0e575721
AD
175
176/*-------------------------------------------.
177| Display the help message and exit STATUS. |
178`-------------------------------------------*/
e79137ac 179
0df27e8b
PE
180static void usage (int) ATTRIBUTE_NORETURN;
181
4a120d45 182static void
0e575721 183usage (int status)
cbd8ffc5 184{
0e575721
AD
185 if (status != 0)
186 fprintf (stderr, _("Try `%s --help' for more information.\n"),
187 program_name);
188 else
189 {
190 /* Some efforts were made to ease the translators' task, please
191 continue. */
192 fputs (_("\
193GNU bison generates parsers for LALR(1) grammars.\n"), stdout);
194 putc ('\n', stdout);
9f306f2a 195
0e575721 196 fprintf (stdout, _("\
9f306f2a 197Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 198 putc ('\n', stdout);
9f306f2a 199
0e575721 200 fputs (_("\
9f306f2a
AD
201If a long option shows an argument as mandatory, then it is mandatory\n\
202for the equivalent short option also. Similarly for optional arguments.\n"),
0e575721
AD
203 stdout);
204 putc ('\n', stdout);
9f306f2a 205
0e575721 206 fputs (_("\
9f306f2a
AD
207Operation modes:\n\
208 -h, --help display this help and exit\n\
209 -V, --version output version information and exit\n\
0e575721
AD
210 -y, --yacc emulate POSIX yacc\n"), stdout);
211 putc ('\n', stdout);
9f306f2a 212
0e575721 213 fputs (_("\
9f306f2a 214Parser:\n\
cd5bd6ac 215 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 216 -t, --debug instrument the parser for debugging\n\
89cab50d 217 --locations enable locations computation\n\
9f306f2a
AD
218 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
219 -l, --no-lines don't generate `#line' directives\n\
220 -n, --no-parser generate the tables only\n\
9f306f2a 221 -k, --token-table include a table of token names\n\
0e575721
AD
222"), stdout);
223 putc ('\n', stdout);
9f306f2a 224
0e575721 225 fputs (_("\
9f306f2a
AD
226Output:\n\
227 -d, --defines also produce a header file\n\
ec3bc396
AD
228 -r, --report=THINGS also produce details on the automaton\n\
229 -v, --verbose same as `--report=state'\n\
9f306f2a 230 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1
AD
231 -o, --output=FILE leave output to FILE\n\
232 -g, --graph also produce a VCG description of the automaton\n\
0e575721
AD
233"), stdout);
234 putc ('\n', stdout);
86eff183 235
0e575721 236 fputs (_("\
ec3bc396
AD
237THINGS is a list of comma separated words that can include:\n\
238 `state' describe the states\n\
239 `itemset' complete the core item sets with their closure\n\
240 `lookahead' explicitly associate lookaheads to items\n\
b408954b 241 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
242 `all' include all the above information\n\
243 `none' disable the report\n\
0e575721
AD
244"), stdout);
245 putc ('\n', stdout);
9f306f2a 246
0e575721
AD
247 fputs (_("\
248Report bugs to <bug-bison@gnu.org>.\n"), stdout);
249 }
250
251 exit (status);
cbd8ffc5
DM
252}
253
e79137ac
AD
254
255/*------------------------------.
256| Display the version message. |
257`------------------------------*/
258
259static void
0e575721 260version (void)
e79137ac
AD
261{
262 /* Some efforts were made to ease the translators' task, please
263 continue. */
0e575721
AD
264 printf (_("bison (GNU Bison) %s"), VERSION);
265 putc ('\n', stdout);
266 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
267 putc ('\n', stdout);
e79137ac 268
0e575721 269 fprintf (stdout,
8522c9ed 270 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2003);
e79137ac
AD
271
272 fputs (_("\
273This is free software; see the source for copying conditions. There is NO\n\
274warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
275"),
0e575721 276 stdout);
e79137ac
AD
277}
278
279
280/*----------------------.
281| Process the options. |
282`----------------------*/
283
e2aaf4c4 284/* Shorts options. */
273a74fa 285const char *short_options = "yvegdhr:ltknVo:b:p:S:T::";
e2aaf4c4
AD
286
287static struct option const long_options[] =
288{
289 /* Operation modes. */
290 { "help", no_argument, 0, 'h' },
291 { "version", no_argument, 0, 'V' },
292
293 /* Parser. */
294 { "name-prefix", required_argument, 0, 'p' },
295 { "include", required_argument, 0, 'I' },
296
297 /* Output. */
298 { "file-prefix", required_argument, 0, 'b' },
299 { "output", required_argument, 0, 'o' },
300 { "output-file", required_argument, 0, 'o' },
301 { "graph", optional_argument, 0, 'g' },
302 { "report", required_argument, 0, 'r' },
303 { "verbose", no_argument, 0, 'v' },
304
305 /* Hidden. */
273a74fa 306 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 307
e2aaf4c4
AD
308 /* Output. */
309 { "defines", optional_argument, 0, 'd' },
310
311 /* Operation modes. */
312 { "fixed-output-files", no_argument, 0, 'y' },
313 { "yacc", no_argument, 0, 'y' },
314
315 /* Parser. */
316 { "debug", no_argument, 0, 't' },
317 { "locations", no_argument, &locations_flag, 1 },
318 { "no-lines", no_argument, 0, 'l' },
319 { "no-parser", no_argument, 0, 'n' },
320 { "raw", no_argument, 0, 0 },
321 { "skeleton", required_argument, 0, 'S' },
322 { "token-table", no_argument, 0, 'k' },
323
324 {0, 0, 0, 0}
325};
326
ae404801
AD
327/* Under DOS, there is no difference on the case. This can be
328 troublesome when looking for `.tab' etc. */
329#ifdef MSDOS
330# define AS_FILE_NAME(File) (strlwr (File), (File))
331#else
332# define AS_FILE_NAME(File) (File)
333#endif
334
3d8fc6ca 335void
d2729d44 336getargs (int argc, char *argv[])
3d8fc6ca 337{
1916f98e 338 int c;
3d8fc6ca 339
08721544
PE
340 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
341 != -1)
cd5bd6ac
AD
342 switch (c)
343 {
344 case 0:
345 /* Certain long options cause getopt_long to return 0. */
346 break;
347
348 case 'y':
349 yacc_flag = 1;
350 break;
351
352 case 'h':
0df27e8b 353 usage (EXIT_SUCCESS);
cd5bd6ac
AD
354
355 case 'V':
0e575721 356 version ();
0df27e8b 357 exit (EXIT_SUCCESS);
cd5bd6ac 358
22c2cbc0 359 case 'g':
342b8b6e 360 /* Here, the -g and --graph=FILE options are differentiated. */
22c2cbc0 361 graph_flag = 1;
fcbfa6b0
PE
362 if (optarg)
363 spec_graph_file = AS_FILE_NAME (optarg);
22c2cbc0
AD
364 break;
365
cd5bd6ac 366 case 'v':
ec3bc396 367 report_flag |= report_states;
cd5bd6ac
AD
368 break;
369
370 case 'S':
ae404801 371 skeleton = AS_FILE_NAME (optarg);
cd5bd6ac
AD
372 break;
373
f6bd5427 374 case 'I':
ae404801 375 include = AS_FILE_NAME (optarg);
f6bd5427
MA
376 break;
377
cd5bd6ac 378 case 'd':
342b8b6e 379 /* Here, the -d and --defines options are differentiated. */
cd5bd6ac 380 defines_flag = 1;
ae404801
AD
381 if (optarg)
382 spec_defines_file = AS_FILE_NAME (optarg);
cd5bd6ac
AD
383 break;
384
385 case 'l':
386 no_lines_flag = 1;
387 break;
388
389 case 'k':
390 token_table_flag = 1;
391 break;
392
cd5bd6ac
AD
393 case 'n':
394 no_parser_flag = 1;
395 break;
396
397 case 't':
398 debug_flag = 1;
399 break;
400
401 case 'o':
ae404801 402 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
403 break;
404
405 case 'b':
ae404801 406 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
407 break;
408
409 case 'p':
410 spec_name_prefix = optarg;
411 break;
412
ec3bc396
AD
413 case 'r':
414 report_argmatch (optarg);
415 break;
416
273a74fa
AD
417 case 'T':
418 trace_argmatch (optarg);
419 break;
420
cd5bd6ac 421 default:
0df27e8b 422 usage (EXIT_FAILURE);
cd5bd6ac 423 }
3d8fc6ca 424
a4b6efd4 425 if (argc - optind != 1)
3d8fc6ca 426 {
a4b6efd4
PE
427 if (argc - optind < 1)
428 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
429 else
430 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 431 usage (EXIT_FAILURE);
3d8fc6ca 432 }
3d8fc6ca 433
d38a11a6 434 current_file = grammar_file = uniqstr_new (argv[optind]);
3d8fc6ca 435}