]> git.saurik.com Git - bison.git/blame - src/getargs.c
* data/yacc.c (yyparse): Pacify non-GCC compilers about yyerrorlab
[bison.git] / src / getargs.c
CommitLineData
08721544
PE
1/* Parse command line arguments for Bison.
2
6201a1a7 3 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005
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
d0829076
PE
46bool debug_flag;
47bool defines_flag;
48bool locations_flag;
49bool no_lines_flag;
50bool no_parser_flag;
273a74fa 51int report_flag = report_none;
d0829076
PE
52bool token_table_flag;
53bool yacc_flag; /* for -y */
54bool graph_flag;
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",
8dd162d3 141 "look-ahead", "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,
8dd162d3
PE
152 report_states | report_look_ahead_tokens,
153 report_states | report_look_ahead_tokens,
154 report_states | report_look_ahead_tokens,
b408954b 155 report_states | report_solved_conflicts,
ec3bc396
AD
156 report_all
157};
158
159
160static void
161report_argmatch (char *args)
162{
7223426a 163 verify (report_constraint, ARGMATCH_CONSTRAINT (report_args, report_types));
9be0c25b 164 args = strtok (args, ",");
ec3bc396
AD
165 do
166 {
167 int report = XARGMATCH ("--report", args,
168 report_args, report_types);
169 if (report == report_none)
170 report_flag = report_none;
171 else
172 report_flag |= report;
173 }
174 while ((args = strtok (NULL, ",")));
175}
176
0e575721
AD
177
178/*-------------------------------------------.
179| Display the help message and exit STATUS. |
180`-------------------------------------------*/
e79137ac 181
0df27e8b
PE
182static void usage (int) ATTRIBUTE_NORETURN;
183
4a120d45 184static void
0e575721 185usage (int status)
cbd8ffc5 186{
0e575721
AD
187 if (status != 0)
188 fprintf (stderr, _("Try `%s --help' for more information.\n"),
189 program_name);
190 else
191 {
192 /* Some efforts were made to ease the translators' task, please
193 continue. */
194 fputs (_("\
195GNU bison generates parsers for LALR(1) grammars.\n"), stdout);
196 putc ('\n', stdout);
9f306f2a 197
0e575721 198 fprintf (stdout, _("\
9f306f2a 199Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 200 putc ('\n', stdout);
9f306f2a 201
0e575721 202 fputs (_("\
9f306f2a
AD
203If a long option shows an argument as mandatory, then it is mandatory\n\
204for the equivalent short option also. Similarly for optional arguments.\n"),
0e575721
AD
205 stdout);
206 putc ('\n', stdout);
9f306f2a 207
0e575721 208 fputs (_("\
9f306f2a
AD
209Operation modes:\n\
210 -h, --help display this help and exit\n\
211 -V, --version output version information and exit\n\
0e575721
AD
212 -y, --yacc emulate POSIX yacc\n"), stdout);
213 putc ('\n', stdout);
9f306f2a 214
0e575721 215 fputs (_("\
9f306f2a 216Parser:\n\
cd5bd6ac 217 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 218 -t, --debug instrument the parser for debugging\n\
89cab50d 219 --locations enable locations computation\n\
9f306f2a
AD
220 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
221 -l, --no-lines don't generate `#line' directives\n\
222 -n, --no-parser generate the tables only\n\
9f306f2a 223 -k, --token-table include a table of token names\n\
0e575721
AD
224"), stdout);
225 putc ('\n', stdout);
9f306f2a 226
0e575721 227 fputs (_("\
9f306f2a
AD
228Output:\n\
229 -d, --defines also produce a header file\n\
ec3bc396
AD
230 -r, --report=THINGS also produce details on the automaton\n\
231 -v, --verbose same as `--report=state'\n\
9f306f2a 232 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1
AD
233 -o, --output=FILE leave output to FILE\n\
234 -g, --graph also produce a VCG description of the automaton\n\
0e575721
AD
235"), stdout);
236 putc ('\n', stdout);
86eff183 237
0e575721 238 fputs (_("\
ec3bc396
AD
239THINGS is a list of comma separated words that can include:\n\
240 `state' describe the states\n\
241 `itemset' complete the core item sets with their closure\n\
8dd162d3 242 `look-ahead' explicitly associate look-ahead tokens to items\n\
b408954b 243 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
244 `all' include all the above information\n\
245 `none' disable the report\n\
0e575721
AD
246"), stdout);
247 putc ('\n', stdout);
9f306f2a 248
0e575721
AD
249 fputs (_("\
250Report bugs to <bug-bison@gnu.org>.\n"), stdout);
251 }
252
253 exit (status);
cbd8ffc5
DM
254}
255
e79137ac
AD
256
257/*------------------------------.
258| Display the version message. |
259`------------------------------*/
260
261static void
0e575721 262version (void)
e79137ac
AD
263{
264 /* Some efforts were made to ease the translators' task, please
265 continue. */
0e575721
AD
266 printf (_("bison (GNU Bison) %s"), VERSION);
267 putc ('\n', stdout);
268 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
269 putc ('\n', stdout);
e79137ac 270
0e575721 271 fprintf (stdout,
6201a1a7 272 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2005);
e79137ac
AD
273
274 fputs (_("\
275This is free software; see the source for copying conditions. There is NO\n\
276warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
277"),
0e575721 278 stdout);
e79137ac
AD
279}
280
281
282/*----------------------.
283| Process the options. |
284`----------------------*/
285
e2aaf4c4 286/* Shorts options. */
273a74fa 287const char *short_options = "yvegdhr:ltknVo:b:p:S:T::";
e2aaf4c4 288
d0829076
PE
289/* Values for long options that do not have single-letter equivalents. */
290enum
291{
292 LOCATIONS_OPTION = CHAR_MAX + 1
293};
294
e2aaf4c4
AD
295static struct option const long_options[] =
296{
297 /* Operation modes. */
298 { "help", no_argument, 0, 'h' },
299 { "version", no_argument, 0, 'V' },
300
301 /* Parser. */
302 { "name-prefix", required_argument, 0, 'p' },
303 { "include", required_argument, 0, 'I' },
304
305 /* Output. */
306 { "file-prefix", required_argument, 0, 'b' },
307 { "output", required_argument, 0, 'o' },
308 { "output-file", required_argument, 0, 'o' },
309 { "graph", optional_argument, 0, 'g' },
310 { "report", required_argument, 0, 'r' },
311 { "verbose", no_argument, 0, 'v' },
312
313 /* Hidden. */
273a74fa 314 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 315
e2aaf4c4
AD
316 /* Output. */
317 { "defines", optional_argument, 0, 'd' },
318
319 /* Operation modes. */
320 { "fixed-output-files", no_argument, 0, 'y' },
321 { "yacc", no_argument, 0, 'y' },
322
323 /* Parser. */
324 { "debug", no_argument, 0, 't' },
d0829076 325 { "locations", no_argument, 0, LOCATIONS_OPTION },
e2aaf4c4
AD
326 { "no-lines", no_argument, 0, 'l' },
327 { "no-parser", no_argument, 0, 'n' },
328 { "raw", no_argument, 0, 0 },
329 { "skeleton", required_argument, 0, 'S' },
330 { "token-table", no_argument, 0, 'k' },
331
332 {0, 0, 0, 0}
333};
334
ae404801
AD
335/* Under DOS, there is no difference on the case. This can be
336 troublesome when looking for `.tab' etc. */
337#ifdef MSDOS
338# define AS_FILE_NAME(File) (strlwr (File), (File))
339#else
340# define AS_FILE_NAME(File) (File)
341#endif
342
3d8fc6ca 343void
d2729d44 344getargs (int argc, char *argv[])
3d8fc6ca 345{
1916f98e 346 int c;
3d8fc6ca 347
08721544
PE
348 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
349 != -1)
cd5bd6ac
AD
350 switch (c)
351 {
352 case 0:
353 /* Certain long options cause getopt_long to return 0. */
354 break;
355
356 case 'y':
d0829076 357 yacc_flag = true;
cd5bd6ac
AD
358 break;
359
360 case 'h':
0df27e8b 361 usage (EXIT_SUCCESS);
cd5bd6ac
AD
362
363 case 'V':
0e575721 364 version ();
0df27e8b 365 exit (EXIT_SUCCESS);
cd5bd6ac 366
22c2cbc0 367 case 'g':
342b8b6e 368 /* Here, the -g and --graph=FILE options are differentiated. */
d0829076 369 graph_flag = true;
fcbfa6b0
PE
370 if (optarg)
371 spec_graph_file = AS_FILE_NAME (optarg);
22c2cbc0
AD
372 break;
373
cd5bd6ac 374 case 'v':
ec3bc396 375 report_flag |= report_states;
cd5bd6ac
AD
376 break;
377
378 case 'S':
ae404801 379 skeleton = AS_FILE_NAME (optarg);
cd5bd6ac
AD
380 break;
381
f6bd5427 382 case 'I':
ae404801 383 include = AS_FILE_NAME (optarg);
f6bd5427
MA
384 break;
385
cd5bd6ac 386 case 'd':
342b8b6e 387 /* Here, the -d and --defines options are differentiated. */
d0829076 388 defines_flag = true;
ae404801
AD
389 if (optarg)
390 spec_defines_file = AS_FILE_NAME (optarg);
cd5bd6ac
AD
391 break;
392
393 case 'l':
d0829076
PE
394 no_lines_flag = true;
395 break;
396
397 case LOCATIONS_OPTION:
398 locations_flag = true;
cd5bd6ac
AD
399 break;
400
401 case 'k':
d0829076 402 token_table_flag = true;
cd5bd6ac
AD
403 break;
404
cd5bd6ac 405 case 'n':
d0829076 406 no_parser_flag = true;
cd5bd6ac
AD
407 break;
408
409 case 't':
d0829076 410 debug_flag = true;
cd5bd6ac
AD
411 break;
412
413 case 'o':
ae404801 414 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
415 break;
416
417 case 'b':
ae404801 418 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
419 break;
420
421 case 'p':
422 spec_name_prefix = optarg;
423 break;
424
ec3bc396
AD
425 case 'r':
426 report_argmatch (optarg);
427 break;
428
273a74fa
AD
429 case 'T':
430 trace_argmatch (optarg);
431 break;
432
cd5bd6ac 433 default:
0df27e8b 434 usage (EXIT_FAILURE);
cd5bd6ac 435 }
3d8fc6ca 436
a4b6efd4 437 if (argc - optind != 1)
3d8fc6ca 438 {
a4b6efd4
PE
439 if (argc - optind < 1)
440 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
441 else
442 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 443 usage (EXIT_FAILURE);
3d8fc6ca 444 }
3d8fc6ca 445
d38a11a6 446 current_file = grammar_file = uniqstr_new (argv[optind]);
3d8fc6ca 447}