]> git.saurik.com Git - bison.git/blame - src/getargs.c
Display the changes in cross-options.texi.
[bison.git] / src / getargs.c
CommitLineData
08721544
PE
1/* Parse command line arguments for Bison.
2
e2a21b6f 3 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
59da312b 4 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
3d8fc6ca 5
9f306f2a 6 This file is part of Bison, the GNU Compiler Compiler.
3d8fc6ca 7
f16b0819
PE
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
3d8fc6ca 12
f16b0819
PE
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
3d8fc6ca 17
9f306f2a 18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
3d8fc6ca 20
2cec9080 21#include <config.h>
3d8fc6ca 22#include "system.h"
d4bd2295 23#include "output.h"
d38a11a6
PE
24
25#include <argmatch.h>
d7e0a1a7 26#include <c-strcase.h>
3b2942e6 27#include <configmake.h>
d38a11a6 28#include <error.h>
9fe5a457 29#include <quotearg.h>
f47dbf6b
PE
30
31/* Hack to get <getopt.h> to declare getopt with a prototype. */
32#if lint && ! defined __GNU_LIBRARY__
33# define __GNU_LIBRARY__
34# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1
35#endif
36
d38a11a6
PE
37#include <getopt.h>
38
f47dbf6b
PE
39#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE
40# undef __GNU_LIBRARY__
41# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE
42#endif
43
b0ce6046 44#include "complain.h"
ec3bc396 45#include "files.h"
d38a11a6 46#include "getargs.h"
9fe5a457 47#include "muscle_tab.h"
d38a11a6 48#include "uniqstr.h"
3d8fc6ca 49
d0829076
PE
50bool debug_flag;
51bool defines_flag;
4e83ea15 52bool graph_flag;
41d7a5f2 53bool xml_flag;
d0829076
PE
54bool locations_flag;
55bool no_lines_flag;
d0829076
PE
56bool token_table_flag;
57bool yacc_flag; /* for -y */
4e83ea15
AD
58
59bool error_verbose = false;
d2729d44 60
916708d5
AD
61bool nondeterministic_parser = false;
62bool glr_parser = false;
916708d5 63
4e83ea15
AD
64int report_flag = report_none;
65int trace_flag = trace_none;
7b42569e 66int warnings_flag = warnings_none;
4e83ea15 67
0e021770
PE
68static struct bison_language const valid_languages[] = {
69 { "c", "c-skel.m4", ".c", ".h", true },
70 { "c++", "c++-skel.m4", ".cc", ".hh", true },
8405b70c 71 { "java", "java-skel.m4", ".java", ".java", false },
0e021770
PE
72 { "", "", "", "", false }
73};
74
51365192 75int skeleton_prio = default_prio;
b0ce6046 76const char *skeleton = NULL;
51365192 77int language_prio = default_prio;
0e021770 78struct bison_language const *language = &valid_languages[0];
f6bd5427 79const char *include = NULL;
b0ce6046 80
0e021770 81char *program_name;
3d8fc6ca 82
273a74fa 83
7b42569e
AD
84/** Decode an option's set of keys.
85 *
86 * \param option option being decoded.
07c39ae9 87 * \param keys array of valid subarguments.
7b42569e 88 * \param values array of corresponding (int) values.
07c39ae9 89 * \param flags the flags to update
7b42569e
AD
90 * \param args colon separated list of effective subarguments to decode.
91 * If 0, then activate all the flags.
92 *
93 * The special value 0 resets the flags to 0.
94 */
80ac75bc
PE
95static void
96flags_argmatch (const char *option,
7b42569e
AD
97 const char * const keys[], const int values[],
98 int *flags, char *args)
99{
100 if (args)
101 {
102 args = strtok (args, ",");
ba7560e2 103 while (args)
7b42569e
AD
104 {
105 int value = XARGMATCH (option, args, keys, values);
106 if (value == 0)
107 *flags = 0;
108 else
109 *flags |= value;
eb095650 110 args = strtok (NULL, ",");
7b42569e 111 }
7b42569e
AD
112 }
113 else
114 *flags = ~0;
115}
116
80ac75bc 117/** Decode a set of sub arguments.
7b42569e
AD
118 *
119 * \param FlagName the flag familly to update.
07c39ae9 120 * \param Args the effective sub arguments to decode.
7b42569e
AD
121 *
122 * \arg FlagName_args the list of keys.
123 * \arg FlagName_types the list of values.
124 * \arg FlagName_flag the flag to update.
125 */
126#define FLAGS_ARGMATCH(FlagName, Args) \
127 flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \
128 &FlagName ## _flag, Args)
129
130
b8a41559
AD
131/*----------------------.
132| --report's handling. |
133`----------------------*/
134
135static const char * const report_args[] =
136{
137 /* In a series of synonyms, present the most meaningful first, so
138 that argmatch_valid be more readable. */
139 "none",
140 "state", "states",
141 "itemset", "itemsets",
142 "lookahead", "lookaheads", "look-ahead",
143 "solved",
144 "all",
145 0
146};
147
148static const int report_types[] =
149{
150 report_none,
151 report_states, report_states,
152 report_states | report_itemsets, report_states | report_itemsets,
153 report_states | report_lookahead_tokens,
154 report_states | report_lookahead_tokens,
155 report_states | report_lookahead_tokens,
156 report_states | report_solved_conflicts,
157 report_all
158};
159
160ARGMATCH_VERIFY (report_args, report_types);
161
b8a41559 162
273a74fa
AD
163/*---------------------.
164| --trace's handling. |
165`---------------------*/
166
167static const char * const trace_args[] =
168{
169 /* In a series of synonyms, present the most meaningful first, so
170 that argmatch_valid be more readable. */
b8a41559 171 "none - no traces",
c5e3e510
AD
172 "scan - grammar scanner traces",
173 "parse - grammar parser traces",
b8a41559 174 "automaton - construction of the automaton",
273a74fa 175 "bitsets - use of bitsets",
b8a41559 176 "grammar - reading, reducing the grammar",
1509d42f 177 "resource - memory consumption (where available)",
273a74fa 178 "sets - grammar sets: firsts, nullable etc.",
5263bea9 179 "muscles - m4 definitions passed to the skeleton",
327afc7c
AD
180 "tools - m4 invocation",
181 "m4 - m4 traces",
c5e3e510
AD
182 "skeleton - skeleton postprocessing",
183 "time - time consumption",
273a74fa
AD
184 "all - all of the above",
185 0
186};
187
188static const int trace_types[] =
189{
190 trace_none,
473d0a75
AD
191 trace_scan,
192 trace_parse,
273a74fa
AD
193 trace_automaton,
194 trace_bitsets,
195 trace_grammar,
196 trace_resource,
197 trace_sets,
5263bea9 198 trace_muscles,
273a74fa 199 trace_tools,
327afc7c 200 trace_m4,
c5e3e510
AD
201 trace_skeleton,
202 trace_time,
273a74fa
AD
203 trace_all
204};
205
8a6f72f3 206ARGMATCH_VERIFY (trace_args, trace_types);
273a74fa 207
7b42569e
AD
208
209/*------------------------.
210| --warnings's handling. |
211`------------------------*/
212
213static const char * const warnings_args[] =
273a74fa 214{
7b42569e
AD
215 /* In a series of synonyms, present the most meaningful first, so
216 that argmatch_valid be more readable. */
17bd8a73
JD
217 "none - no warnings",
218 "midrule-values - unset or unused midrule values",
219 "yacc - incompatibilities with POSIX YACC",
220 "all - all of the above",
221 "error - warnings are errors",
7b42569e
AD
222 0
223};
224
225static const int warnings_types[] =
226{
227 warnings_none,
17bd8a73 228 warnings_midrule_values,
7b42569e 229 warnings_yacc,
89eb3c76
JD
230 warnings_all,
231 warnings_error
7b42569e
AD
232};
233
234ARGMATCH_VERIFY (warnings_args, warnings_types);
273a74fa
AD
235
236
0e575721
AD
237/*-------------------------------------------.
238| Display the help message and exit STATUS. |
239`-------------------------------------------*/
e79137ac 240
0df27e8b
PE
241static void usage (int) ATTRIBUTE_NORETURN;
242
4a120d45 243static void
0e575721 244usage (int status)
cbd8ffc5 245{
0e575721
AD
246 if (status != 0)
247 fprintf (stderr, _("Try `%s --help' for more information.\n"),
248 program_name);
249 else
250 {
a7c09cba
DJ
251 /* For ../build-aux/cross-options.pl to work, use the format:
252 ^ -S, --long[=ARGS] (whitespace)
253 A --long option is required.
254 Otherwise, add exceptions to ../build-aux/cross-options.pl. */
255
a92be413 256 printf (_("Usage: %s [OPTION]... FILE\n"), program_name);
0e575721 257 fputs (_("\
a92be413
PE
258Generate LALR(1) and GLR parsers.\n\
259\n\
260"), stdout);
9f306f2a 261
0e575721 262 fputs (_("\
a92be413 263Mandatory arguments to long options are mandatory for short options too.\n\
8e55b3aa
JD
264"), stdout);
265 fputs (_("\
266The same is true for optional arguments.\n\
a92be413 267"), stdout);
9f306f2a 268
0e575721 269 fputs (_("\
a92be413 270\n\
9f306f2a 271Operation modes:\n\
f7ab6a50
PE
272 -h, --help display this help and exit\n\
273 -V, --version output version information and exit\n\
274 --print-localedir output directory containing locale-dependent data\n\
d4bd2295 275 --print-datadir output directory containing skeletons and XSLT\n\
a92be413 276 -y, --yacc emulate POSIX Yacc\n\
9b9e0a7d 277 -W, --warnings[=CATEGORY] report the warnings falling in CATEGORY\n\
a92be413
PE
278\n\
279"), stdout);
9f306f2a 280
0e575721 281 fputs (_("\
9f306f2a 282Parser:\n\
59da312b 283 -L, --language=LANGUAGE specify the output programming language\n\
ed4d67dc 284 (this is an experimental feature)\n\
cd5bd6ac 285 -S, --skeleton=FILE specify the skeleton to use\n\
9f306f2a 286 -t, --debug instrument the parser for debugging\n\
58697c6d
AD
287 --locations enable location support\n\
288 -D, --define=NAME[=VALUE] same as `%define NAME \"VALUE\"'\n\
9f306f2a
AD
289 -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
290 -l, --no-lines don't generate `#line' directives\n\
9f306f2a 291 -k, --token-table include a table of token names\n\
a92be413 292\n\
0e575721 293"), stdout);
9f306f2a 294
8e55b3aa
JD
295 /* Keep -d and --defines separate so that ../build-aux/cross-options.pl
296 * won't assume that -d also takes an argument. */
0e575721 297 fputs (_("\
9f306f2a 298Output:\n\
8e55b3aa
JD
299 --defines[=FILE] also produce a header file\n\
300 -d likewise but cannot specify FILE (for POSIX Yacc)\n\
ec3bc396 301 -r, --report=THINGS also produce details on the automaton\n\
1bb2bd75 302 --report-file=FILE write report to FILE\n\
ec3bc396 303 -v, --verbose same as `--report=state'\n\
9f306f2a 304 -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
951366c1 305 -o, --output=FILE leave output to FILE\n\
6aeb9c57
AD
306 -g, --graph[=FILE] also output a graph of the automaton\n\
307 -x, --xml[=FILE] also output an XML report of the automaton\n\
59da312b 308 (the XML schema is experimental)\n\
a92be413 309\n\
0e575721 310"), stdout);
86eff183 311
6aeb9c57
AD
312 fputs (_("\
313Warning categories include:\n\
314 `midrule-values' unset or unused midrule values\n\
315 `yacc' incompatibilities with POSIX YACC\n\
316 `all' all the warnings\n\
317 `no-CATEGORY' turn off warnings in CATEGORY\n\
318 `none' turn off all the warnings\n\
319 `error' treat warnings as errors\n\
66f0441d 320\n\
6aeb9c57
AD
321"), stdout);
322
0e575721 323 fputs (_("\
ec3bc396
AD
324THINGS is a list of comma separated words that can include:\n\
325 `state' describe the states\n\
326 `itemset' complete the core item sets with their closure\n\
742e4900 327 `lookahead' explicitly associate lookahead tokens to items\n\
b408954b 328 `solved' describe shift/reduce conflicts solving\n\
ec3bc396
AD
329 `all' include all the above information\n\
330 `none' disable the report\n\
0e575721 331"), stdout);
9f306f2a 332
a92be413 333 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
0e575721
AD
334 }
335
336 exit (status);
cbd8ffc5
DM
337}
338
e79137ac
AD
339
340/*------------------------------.
341| Display the version message. |
342`------------------------------*/
343
344static void
0e575721 345version (void)
e79137ac
AD
346{
347 /* Some efforts were made to ease the translators' task, please
348 continue. */
0e575721
AD
349 printf (_("bison (GNU Bison) %s"), VERSION);
350 putc ('\n', stdout);
351 fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
352 putc ('\n', stdout);
e79137ac 353
0e575721 354 fprintf (stdout,
a005a9c4
AD
355 _("Copyright (C) %d Free Software Foundation, Inc.\n"),
356 PACKAGE_COPYRIGHT_YEAR);
e79137ac
AD
357
358 fputs (_("\
359This is free software; see the source for copying conditions. There is NO\n\
360warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
361"),
0e575721 362 stdout);
e79137ac
AD
363}
364
365
0e021770
PE
366/*-------------------------------------.
367| --skeleton and --language handling. |
368`--------------------------------------*/
369
370void
5a893c2b 371skeleton_arg (char const *arg, int prio, location loc)
0e021770
PE
372{
373 if (prio < skeleton_prio)
374 {
375 skeleton_prio = prio;
376 skeleton = arg;
377 }
378 else if (prio == skeleton_prio)
379 {
380 char const *msg =
381 _("multiple skeleton declarations are invalid");
5a893c2b 382 complain_at (loc, msg);
0e021770
PE
383 }
384}
385
386void
5a893c2b 387language_argmatch (char const *arg, int prio, location loc)
0e021770
PE
388{
389 char const *msg;
390
391 if (prio < language_prio)
392 {
393 int i;
394 for (i = 0; valid_languages[i].language[0]; i++)
d7e0a1a7 395 if (c_strcasecmp (arg, valid_languages[i].language) == 0)
0e021770
PE
396 {
397 language_prio = prio;
398 language = &valid_languages[i];
399 return;
400 }
401 msg = _("invalid language `%s'");
402 }
403 else if (language_prio == prio)
404 msg = _("multiple language declarations are invalid");
405 else
406 return;
407
5a893c2b 408 complain_at (loc, msg, arg);
0e021770
PE
409}
410
e79137ac
AD
411/*----------------------.
412| Process the options. |
413`----------------------*/
414
7020f1e9
AD
415/* Shorts options.
416 Should be computed from long_options. */
417static char const short_options[] =
58697c6d 418 "D:"
7020f1e9
AD
419 "L:"
420 "S:"
421 "T::"
422 "V"
8e55b3aa 423 "W::"
7020f1e9
AD
424 "b:"
425 "d"
426 "e"
427 "g::"
428 "h"
429 "k"
430 "l"
431 "n"
432 "o:"
433 "p:"
434 "r:"
435 "t"
436 "v"
437 "x::"
438 "y"
439 ;
e2aaf4c4 440
d0829076
PE
441/* Values for long options that do not have single-letter equivalents. */
442enum
443{
f7ab6a50 444 LOCATIONS_OPTION = CHAR_MAX + 1,
d4bd2295 445 PRINT_LOCALEDIR_OPTION,
1bb2bd75
JD
446 PRINT_DATADIR_OPTION,
447 REPORT_FILE_OPTION
d0829076
PE
448};
449
e2aaf4c4
AD
450static struct option const long_options[] =
451{
452 /* Operation modes. */
7b42569e
AD
453 { "help", no_argument, 0, 'h' },
454 { "version", no_argument, 0, 'V' },
455 { "print-localedir", no_argument, 0, PRINT_LOCALEDIR_OPTION },
d4bd2295 456 { "print-datadir", no_argument, 0, PRINT_DATADIR_OPTION },
7b42569e 457 { "warnings", optional_argument, 0, 'W' },
e2aaf4c4
AD
458
459 /* Parser. */
460 { "name-prefix", required_argument, 0, 'p' },
461 { "include", required_argument, 0, 'I' },
462
463 /* Output. */
464 { "file-prefix", required_argument, 0, 'b' },
465 { "output", required_argument, 0, 'o' },
466 { "output-file", required_argument, 0, 'o' },
467 { "graph", optional_argument, 0, 'g' },
41d7a5f2 468 { "xml", optional_argument, 0, 'x' },
e2aaf4c4 469 { "report", required_argument, 0, 'r' },
1bb2bd75 470 { "report-file", required_argument, 0, REPORT_FILE_OPTION },
e2aaf4c4
AD
471 { "verbose", no_argument, 0, 'v' },
472
473 /* Hidden. */
273a74fa 474 { "trace", optional_argument, 0, 'T' },
e2aaf4c4 475
e2aaf4c4
AD
476 /* Output. */
477 { "defines", optional_argument, 0, 'd' },
478
479 /* Operation modes. */
480 { "fixed-output-files", no_argument, 0, 'y' },
481 { "yacc", no_argument, 0, 'y' },
482
483 /* Parser. */
484 { "debug", no_argument, 0, 't' },
58697c6d 485 { "define", required_argument, 0, 'D' },
d0829076 486 { "locations", no_argument, 0, LOCATIONS_OPTION },
e2aaf4c4 487 { "no-lines", no_argument, 0, 'l' },
e2aaf4c4
AD
488 { "raw", no_argument, 0, 0 },
489 { "skeleton", required_argument, 0, 'S' },
0e021770 490 { "language", required_argument, 0, 'L' },
e2aaf4c4
AD
491 { "token-table", no_argument, 0, 'k' },
492
493 {0, 0, 0, 0}
494};
495
ae404801
AD
496/* Under DOS, there is no difference on the case. This can be
497 troublesome when looking for `.tab' etc. */
498#ifdef MSDOS
499# define AS_FILE_NAME(File) (strlwr (File), (File))
500#else
501# define AS_FILE_NAME(File) (File)
502#endif
503
58697c6d
AD
504/* Build a location for the current command line argument. */
505static
506location
d73e55e0 507command_line_location (void)
58697c6d
AD
508{
509 location res;
510 /* "<command line>" is used in GCC's messages about -D. */
511 boundary_set (&res.start, uniqstr_new ("<command line>"), optind, -1);
512 res.end = res.start;
513 return res;
514}
515
516
3d8fc6ca 517void
d2729d44 518getargs (int argc, char *argv[])
3d8fc6ca 519{
1916f98e 520 int c;
3d8fc6ca 521
08721544
PE
522 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
523 != -1)
cd5bd6ac
AD
524 switch (c)
525 {
58697c6d
AD
526 /* ASCII Sorting for short options (i.e., upper case then
527 lower case), and then long-only options. */
528
cd5bd6ac
AD
529 case 0:
530 /* Certain long options cause getopt_long to return 0. */
531 break;
532
58697c6d
AD
533 case 'D': /* -DNAME[=VALUE]. */
534 {
535 char* name = optarg;
536 char* value = strchr (optarg, '=');
537 if (value)
9ce405ce 538 *value++ = 0;
a8beef7e 539 muscle_percent_define_insert (name, command_line_location (),
9ce405ce 540 value ? value : "");
58697c6d 541 }
22c2cbc0
AD
542 break;
543
8e55b3aa
JD
544 case 'I':
545 include = AS_FILE_NAME (optarg);
41d7a5f2
PE
546 break;
547
0e021770 548 case 'L':
51365192
JD
549 language_argmatch (optarg, command_line_prio,
550 command_line_location ());
0e021770
PE
551 break;
552
cd5bd6ac 553 case 'S':
51365192
JD
554 skeleton_arg (AS_FILE_NAME (optarg), command_line_prio,
555 command_line_location ());
cd5bd6ac
AD
556 break;
557
8e55b3aa
JD
558 case 'T':
559 FLAGS_ARGMATCH (trace, optarg);
f6bd5427
MA
560 break;
561
8e55b3aa
JD
562 case 'V':
563 version ();
564 exit (EXIT_SUCCESS);
565
566 case 'W':
ae404801 567 if (optarg)
8e55b3aa
JD
568 FLAGS_ARGMATCH (warnings, optarg);
569 else
570 warnings_flag |= warnings_all;
571 break;
572
573 case 'b':
574 spec_file_prefix = AS_FILE_NAME (optarg);
575 break;
576
58697c6d
AD
577 case 'd':
578 /* Here, the -d and --defines options are differentiated. */
579 defines_flag = true;
580 if (optarg)
581 spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
582 break;
583
8e55b3aa
JD
584 case 'g':
585 graph_flag = true;
586 if (optarg)
587 spec_graph_file = xstrdup (AS_FILE_NAME (optarg));
cd5bd6ac
AD
588 break;
589
8e55b3aa
JD
590 case 'h':
591 usage (EXIT_SUCCESS);
592
7b42569e
AD
593 case 'k':
594 token_table_flag = true;
595 break;
596
cd5bd6ac 597 case 'l':
d0829076
PE
598 no_lines_flag = true;
599 break;
600
7b42569e
AD
601 case 'o':
602 spec_outfile = AS_FILE_NAME (optarg);
cd5bd6ac
AD
603 break;
604
7b42569e
AD
605 case 'p':
606 spec_name_prefix = optarg;
607 break;
608
609 case 'r':
610 FLAGS_ARGMATCH (report, optarg);
611 break;
612
cd5bd6ac 613 case 't':
d0829076 614 debug_flag = true;
cd5bd6ac
AD
615 break;
616
7b42569e
AD
617 case 'v':
618 report_flag |= report_states;
cd5bd6ac
AD
619 break;
620
8e55b3aa
JD
621 case 'x':
622 xml_flag = true;
623 if (optarg)
624 spec_xml_file = xstrdup (AS_FILE_NAME (optarg));
cd5bd6ac
AD
625 break;
626
8e55b3aa
JD
627 case 'y':
628 yacc_flag = true;
ec3bc396
AD
629 break;
630
7b42569e
AD
631 case LOCATIONS_OPTION:
632 locations_flag = true;
273a74fa
AD
633 break;
634
7b42569e
AD
635 case PRINT_LOCALEDIR_OPTION:
636 printf ("%s\n", LOCALEDIR);
637 exit (EXIT_SUCCESS);
638
d4bd2295
JD
639 case PRINT_DATADIR_OPTION:
640 printf ("%s\n", compute_pkgdatadir ());
641 exit (EXIT_SUCCESS);
642
8e55b3aa
JD
643 case REPORT_FILE_OPTION:
644 spec_verbose_file = xstrdup (AS_FILE_NAME (optarg));
645 break;
646
cd5bd6ac 647 default:
0df27e8b 648 usage (EXIT_FAILURE);
cd5bd6ac 649 }
3d8fc6ca 650
a4b6efd4 651 if (argc - optind != 1)
3d8fc6ca 652 {
a4b6efd4
PE
653 if (argc - optind < 1)
654 error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
655 else
656 error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
0e575721 657 usage (EXIT_FAILURE);
3d8fc6ca 658 }
3d8fc6ca 659
d38a11a6 660 current_file = grammar_file = uniqstr_new (argv[optind]);
9fe5a457 661 MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
3d8fc6ca 662}