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