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