]> git.saurik.com Git - bison.git/blame - src/getargs.c
* data/yacc.c: Output the copyright notive in the header.
[bison.git] / src / getargs.c
CommitLineData
9f306f2a 1/* Parse command line arguments for bison.
06b00abc
AD
2 Copyright 1984, 1986, 1989, 1992, 2000, 2001, 2002
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"
b0ce6046 25#include "complain.h"
ceed8467 26#include "getargs.h"
ec3bc396 27#include "files.h"
3d8fc6ca 28
89cab50d
AD
29int debug_flag = 0;
30int defines_flag = 0;
31int locations_flag = 0;
32int no_lines_flag = 0;
33int no_parser_flag = 0;
ec3bc396 34int report_flag = 0;
89cab50d 35int token_table_flag = 0;
89cab50d 36int yacc_flag = 0; /* for -y */
22c2cbc0 37int graph_flag = 0;
9bfe901c 38int trace_flag = 0;
d2729d44 39
b0ce6046 40const char *skeleton = NULL;
f6bd5427 41const char *include = NULL;
b0ce6046 42
cbd8ffc5 43extern char *program_name;
3d8fc6ca 44
ec3bc396
AD
45/*----------------------.
46| --report's handling. |
47`----------------------*/
48
49static const char * const report_args[] =
50{
51 /* In a series of synonyms, present the most meaningful first, so
52 that argmatch_valid be more readable. */
53 "none",
54 "state", "states",
55 "itemset", "itemsets",
56 "lookahead", "lookaheads",
b408954b 57 "solved",
ec3bc396
AD
58 "all",
59 0
60};
61
62static const int report_types[] =
63{
64 report_none,
65 report_states, report_states,
66 report_states | report_itemsets, report_states | report_itemsets,
67 report_states | report_lookaheads, report_states | report_lookaheads,
b408954b 68 report_states | report_solved_conflicts,
ec3bc396
AD
69 report_all
70};
71
72
73static void
74report_argmatch (char *args)
75{
76 ARGMATCH_ASSERT (report_args, report_types);
9be0c25b 77 args = strtok (args, ",");
ec3bc396
AD
78 do
79 {
80 int report = XARGMATCH ("--report", args,
81 report_args, report_types);
82 if (report == report_none)
83 report_flag = report_none;
84 else
85 report_flag |= report;
86 }
87 while ((args = strtok (NULL, ",")));
88}
89
9f306f2a
AD
90/*---------------------------.
91| Display the help message. |
92`---------------------------*/
e79137ac 93
4a120d45 94static void
d2729d44 95usage (FILE *stream)
cbd8ffc5 96{
9f306f2a
AD
97 /* Some efforts were made to ease the translators' task, please
98 continue. */
a0f6b076
AD
99 fputs (_("\
100GNU bison generates parsers for LALR(1) grammars.\n"), stream);
9f306f2a
AD
101 putc ('\n', stream);
102
103 fprintf (stream, _("\
104Usage: %s [OPTION]... FILE\n"), program_name);
105 putc ('\n', stream);
106
107 fputs (_("\
108If a long option shows an argument as mandatory, then it is mandatory\n\
109for the equivalent short option also. Similarly for optional arguments.\n"),
110 stream);
111 putc ('\n', stream);
112
a0f6b076 113 fputs (_("\
9f306f2a
AD
114Operation modes:\n\
115 -h, --help display this help and exit\n\
116 -V, --version output version information and exit\n\
a0f6b076 117 -y, --yacc emulate POSIX yacc\n"), stream);
9f306f2a
AD
118 putc ('\n', stream);
119
a0f6b076 120 fputs (_("\
9f306f2a 121Parser:\n\
cd5bd6ac 122 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 123 -t, --debug instrument the parser for debugging\n\
89cab50d 124 --locations enable locations computation\n\
9f306f2a
AD
125 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
126 -l, --no-lines don't generate `#line' directives\n\
127 -n, --no-parser generate the tables only\n\
9f306f2a 128 -k, --token-table include a table of token names\n\
a0f6b076 129"), stream);
9f306f2a
AD
130 putc ('\n', stream);
131
a0f6b076 132 fputs (_("\
9f306f2a
AD
133Output:\n\
134 -d, --defines also produce a header file\n\
ec3bc396
AD
135 -r, --report=THINGS also produce details on the automaton\n\
136 -v, --verbose same as `--report=state'\n\
9f306f2a 137 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1
AD
138 -o, --output=FILE leave output to FILE\n\
139 -g, --graph also produce a VCG description of the automaton\n\
86eff183
AD
140"), stream);
141 putc ('\n', stream);
142
143 fputs (_("\
ec3bc396
AD
144THINGS is a list of comma separated words that can include:\n\
145 `state' describe the states\n\
146 `itemset' complete the core item sets with their closure\n\
147 `lookahead' explicitly associate lookaheads to items\n\
b408954b 148 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
149 `all' include all the above information\n\
150 `none' disable the report\n\
951366c1 151"), stream);
9f306f2a
AD
152 putc ('\n', stream);
153
a0f6b076
AD
154 fputs (_("\
155Report bugs to <bug-bison@gnu.org>.\n"), stream);
cbd8ffc5
DM
156}
157
e79137ac
AD
158
159/*------------------------------.
160| Display the version message. |
161`------------------------------*/
162
163static void
164version (FILE *stream)
165{
166 /* Some efforts were made to ease the translators' task, please
167 continue. */
06b00abc 168 fprintf (stream, _("bison (GNU Bison) %s"), VERSION);
e79137ac 169 putc ('\n', stream);
06b00abc 170 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stream);
e79137ac
AD
171 putc ('\n', stream);
172
06b00abc
AD
173 fprintf (stream,
174 _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2002);
e79137ac
AD
175
176 fputs (_("\
177This is free software; see the source for copying conditions. There is NO\n\
178warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
179"),
180 stream);
181}
182
183
184/*----------------------.
185| Process the options. |
186`----------------------*/
187
e2aaf4c4
AD
188/* Shorts options. */
189const char *short_options = "yvegdhr:ltknVo:b:p:S:";
190
191static struct option const long_options[] =
192{
193 /* Operation modes. */
194 { "help", no_argument, 0, 'h' },
195 { "version", no_argument, 0, 'V' },
196
197 /* Parser. */
198 { "name-prefix", required_argument, 0, 'p' },
199 { "include", required_argument, 0, 'I' },
200
201 /* Output. */
202 { "file-prefix", required_argument, 0, 'b' },
203 { "output", required_argument, 0, 'o' },
204 { "output-file", required_argument, 0, 'o' },
205 { "graph", optional_argument, 0, 'g' },
206 { "report", required_argument, 0, 'r' },
207 { "verbose", no_argument, 0, 'v' },
208
209 /* Hidden. */
210 { "trace", no_argument, &trace_flag, 1 },
211
212 /* FIXME: semantic parsers will output an `include' of an
213 output file: be sure that the naem included is indeed the name of
214 the output file. */ /* FIXME Should we activate this options ?
215 */
216 { "output", required_argument, 0, 'o' },
217 { "file-prefix", required_argument, 0, 'b' },
218 { "name-prefix", required_argument, 0, 'p' },
219
220 /*
221 * Percent and command line declarations.
222 */
223
224 /* Output. */
225 { "defines", optional_argument, 0, 'd' },
226
227 /* Operation modes. */
228 { "fixed-output-files", no_argument, 0, 'y' },
229 { "yacc", no_argument, 0, 'y' },
230
231 /* Parser. */
232 { "debug", no_argument, 0, 't' },
233 { "locations", no_argument, &locations_flag, 1 },
234 { "no-lines", no_argument, 0, 'l' },
235 { "no-parser", no_argument, 0, 'n' },
236 { "raw", no_argument, 0, 0 },
237 { "skeleton", required_argument, 0, 'S' },
238 { "token-table", no_argument, 0, 'k' },
239
240 {0, 0, 0, 0}
241};
242
ae404801
AD
243/* Under DOS, there is no difference on the case. This can be
244 troublesome when looking for `.tab' etc. */
245#ifdef MSDOS
246# define AS_FILE_NAME(File) (strlwr (File), (File))
247#else
248# define AS_FILE_NAME(File) (File)
249#endif
250
3d8fc6ca 251void
d2729d44 252getargs (int argc, char *argv[])
3d8fc6ca 253{
1916f98e 254 int c;
3d8fc6ca 255
e2aaf4c4 256 while ((c = getopt_long (argc, argv, short_options, long_options, NULL)) != EOF)
cd5bd6ac
AD
257 switch (c)
258 {
259 case 0:
260 /* Certain long options cause getopt_long to return 0. */
261 break;
262
263 case 'y':
264 yacc_flag = 1;
265 break;
266
267 case 'h':
268 usage (stdout);
269 exit (0);
270
271 case 'V':
272 version (stdout);
273 exit (0);
274
22c2cbc0 275 case 'g':
342b8b6e 276 /* Here, the -g and --graph=FILE options are differentiated. */
22c2cbc0 277 graph_flag = 1;
ae404801 278 spec_graph_file = AS_FILE_NAME (optarg);
22c2cbc0
AD
279 break;
280
cd5bd6ac 281 case 'v':
ec3bc396 282 report_flag |= report_states;
cd5bd6ac
AD
283 break;
284
285 case 'S':
ae404801 286 skeleton = AS_FILE_NAME (optarg);
cd5bd6ac
AD
287 break;
288
f6bd5427 289 case 'I':
ae404801 290 include = AS_FILE_NAME (optarg);
f6bd5427
MA
291 break;
292
cd5bd6ac 293 case 'd':
342b8b6e 294 /* Here, the -d and --defines options are differentiated. */
cd5bd6ac 295 defines_flag = 1;
ae404801
AD
296 if (optarg)
297 spec_defines_file = AS_FILE_NAME (optarg);
cd5bd6ac
AD
298 break;
299
300 case 'l':
301 no_lines_flag = 1;
302 break;
303
304 case 'k':
305 token_table_flag = 1;
306 break;
307
cd5bd6ac
AD
308 case 'n':
309 no_parser_flag = 1;
310 break;
311
312 case 't':
313 debug_flag = 1;
314 break;
315
316 case 'o':
ae404801 317 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
318 break;
319
320 case 'b':
ae404801 321 spec_file_prefix = AS_FILE_NAME (optarg);
cd5bd6ac
AD
322 break;
323
324 case 'p':
325 spec_name_prefix = optarg;
326 break;
327
ec3bc396
AD
328 case 'r':
329 report_argmatch (optarg);
330 break;
331
cd5bd6ac
AD
332 default:
333 fprintf (stderr, _("Try `%s --help' for more information.\n"),
334 program_name);
335 exit (1);
336 }
3d8fc6ca
RS
337
338 if (optind == argc)
339 {
e79137ac
AD
340 fprintf (stderr, _("%s: no grammar file given\n"), program_name);
341 exit (1);
3d8fc6ca
RS
342 }
343 if (optind < argc - 1)
e79137ac
AD
344 fprintf (stderr, _("%s: extra arguments ignored after `%s'\n"),
345 program_name, argv[optind]);
3d8fc6ca
RS
346
347 infile = argv[optind];
348}