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