| Index: bison/src/bison/2.4.1/bison-2.4.1-src/src/getargs.c
|
| ===================================================================
|
| --- bison/src/bison/2.4.1/bison-2.4.1-src/src/getargs.c (revision 0)
|
| +++ bison/src/bison/2.4.1/bison-2.4.1-src/src/getargs.c (revision 0)
|
| @@ -0,0 +1,624 @@
|
| +/* Parse command line arguments for Bison.
|
| +
|
| + Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
|
| + 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
| +
|
| + This file is part of Bison, the GNU Compiler Compiler.
|
| +
|
| + This program is free software: you can redistribute it and/or modify
|
| + it under the terms of the GNU General Public License as published by
|
| + the Free Software Foundation, either version 3 of the License, or
|
| + (at your option) any later version.
|
| +
|
| + This program is distributed in the hope that it will be useful,
|
| + but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| + GNU General Public License for more details.
|
| +
|
| + You should have received a copy of the GNU General Public License
|
| + along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
| +
|
| +#include <config.h>
|
| +#include "system.h"
|
| +#include "output.h"
|
| +
|
| +#include <argmatch.h>
|
| +#include <c-strcase.h>
|
| +#include <configmake.h>
|
| +#include <error.h>
|
| +
|
| +/* Hack to get <getopt.h> to declare getopt with a prototype. */
|
| +#if lint && ! defined __GNU_LIBRARY__
|
| +# define __GNU_LIBRARY__
|
| +# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1
|
| +#endif
|
| +
|
| +#include <getopt.h>
|
| +
|
| +#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE
|
| +# undef __GNU_LIBRARY__
|
| +# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE
|
| +#endif
|
| +
|
| +#include "complain.h"
|
| +#include "files.h"
|
| +#include "getargs.h"
|
| +#include "uniqstr.h"
|
| +
|
| +bool debug_flag;
|
| +bool defines_flag;
|
| +bool graph_flag;
|
| +bool xml_flag;
|
| +bool locations_flag;
|
| +bool no_lines_flag;
|
| +bool token_table_flag;
|
| +bool yacc_flag; /* for -y */
|
| +
|
| +bool error_verbose = false;
|
| +
|
| +bool nondeterministic_parser = false;
|
| +bool glr_parser = false;
|
| +
|
| +int report_flag = report_none;
|
| +int trace_flag = trace_none;
|
| +int warnings_flag = warnings_none;
|
| +
|
| +static struct bison_language const valid_languages[] = {
|
| + { "c", "c-skel.m4", ".c", ".h", true },
|
| + { "c++", "c++-skel.m4", ".cc", ".hh", true },
|
| + { "java", "java-skel.m4", ".java", ".java", false },
|
| + { "", "", "", "", false }
|
| +};
|
| +
|
| +int skeleton_prio = default_prio;
|
| +const char *skeleton = NULL;
|
| +int language_prio = default_prio;
|
| +struct bison_language const *language = &valid_languages[0];
|
| +const char *include = NULL;
|
| +
|
| +
|
| +/** Decode an option's set of keys.
|
| + *
|
| + * \param option option being decoded.
|
| + * \param keys array of valid subarguments.
|
| + * \param values array of corresponding (int) values.
|
| + * \param flags the flags to update
|
| + * \param args colon separated list of effective subarguments to decode.
|
| + * If 0, then activate all the flags.
|
| + *
|
| + * The special value 0 resets the flags to 0.
|
| + */
|
| +static void
|
| +flags_argmatch (const char *option,
|
| + const char * const keys[], const int values[],
|
| + int *flags, char *args)
|
| +{
|
| + if (args)
|
| + {
|
| + args = strtok (args, ",");
|
| + while (args)
|
| + {
|
| + int value = XARGMATCH (option, args, keys, values);
|
| + if (value == 0)
|
| + *flags = 0;
|
| + else
|
| + *flags |= value;
|
| + args = strtok (NULL, ",");
|
| + }
|
| + }
|
| + else
|
| + *flags = ~0;
|
| +}
|
| +
|
| +/** Decode a set of sub arguments.
|
| + *
|
| + * \param FlagName the flag familly to update.
|
| + * \param Args the effective sub arguments to decode.
|
| + *
|
| + * \arg FlagName_args the list of keys.
|
| + * \arg FlagName_types the list of values.
|
| + * \arg FlagName_flag the flag to update.
|
| + */
|
| +#define FLAGS_ARGMATCH(FlagName, Args) \
|
| + flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \
|
| + &FlagName ## _flag, Args)
|
| +
|
| +
|
| +/*----------------------.
|
| +| --report's handling. |
|
| +`----------------------*/
|
| +
|
| +static const char * const report_args[] =
|
| +{
|
| + /* In a series of synonyms, present the most meaningful first, so
|
| + that argmatch_valid be more readable. */
|
| + "none",
|
| + "state", "states",
|
| + "itemset", "itemsets",
|
| + "lookahead", "lookaheads", "look-ahead",
|
| + "solved",
|
| + "all",
|
| + 0
|
| +};
|
| +
|
| +static const int report_types[] =
|
| +{
|
| + report_none,
|
| + report_states, report_states,
|
| + report_states | report_itemsets, report_states | report_itemsets,
|
| + report_states | report_lookahead_tokens,
|
| + report_states | report_lookahead_tokens,
|
| + report_states | report_lookahead_tokens,
|
| + report_states | report_solved_conflicts,
|
| + report_all
|
| +};
|
| +
|
| +ARGMATCH_VERIFY (report_args, report_types);
|
| +
|
| +
|
| +/*---------------------.
|
| +| --trace's handling. |
|
| +`---------------------*/
|
| +
|
| +static const char * const trace_args[] =
|
| +{
|
| + /* In a series of synonyms, present the most meaningful first, so
|
| + that argmatch_valid be more readable. */
|
| + "none - no traces",
|
| + "scan - grammar scanner traces",
|
| + "parse - grammar parser traces",
|
| + "automaton - construction of the automaton",
|
| + "bitsets - use of bitsets",
|
| + "grammar - reading, reducing the grammar",
|
| + "resource - memory consumption (where available)",
|
| + "sets - grammar sets: firsts, nullable etc.",
|
| + "tools - m4 invocation",
|
| + "m4 - m4 traces",
|
| + "skeleton - skeleton postprocessing",
|
| + "time - time consumption",
|
| + "all - all of the above",
|
| + 0
|
| +};
|
| +
|
| +static const int trace_types[] =
|
| +{
|
| + trace_none,
|
| + trace_scan,
|
| + trace_parse,
|
| + trace_automaton,
|
| + trace_bitsets,
|
| + trace_grammar,
|
| + trace_resource,
|
| + trace_sets,
|
| + trace_tools,
|
| + trace_m4,
|
| + trace_skeleton,
|
| + trace_time,
|
| + trace_all
|
| +};
|
| +
|
| +ARGMATCH_VERIFY (trace_args, trace_types);
|
| +
|
| +
|
| +/*------------------------.
|
| +| --warnings's handling. |
|
| +`------------------------*/
|
| +
|
| +static const char * const warnings_args[] =
|
| +{
|
| + /* In a series of synonyms, present the most meaningful first, so
|
| + that argmatch_valid be more readable. */
|
| + "none - no warnings",
|
| + "midrule-values - unset or unused midrule values",
|
| + "yacc - incompatibilities with POSIX YACC",
|
| + "all - all of the above",
|
| + "error - warnings are errors",
|
| + 0
|
| +};
|
| +
|
| +static const int warnings_types[] =
|
| +{
|
| + warnings_none,
|
| + warnings_midrule_values,
|
| + warnings_yacc,
|
| + warnings_all,
|
| + warnings_error
|
| +};
|
| +
|
| +ARGMATCH_VERIFY (warnings_args, warnings_types);
|
| +
|
| +
|
| +/*-------------------------------------------.
|
| +| Display the help message and exit STATUS. |
|
| +`-------------------------------------------*/
|
| +
|
| +static void usage (int) ATTRIBUTE_NORETURN;
|
| +
|
| +static void
|
| +usage (int status)
|
| +{
|
| + if (status != 0)
|
| + fprintf (stderr, _("Try `%s --help' for more information.\n"),
|
| + program_name);
|
| + else
|
| + {
|
| + printf (_("Usage: %s [OPTION]... FILE\n"), program_name);
|
| + fputs (_("\
|
| +Generate LALR(1) and GLR parsers.\n\
|
| +\n\
|
| +"), stdout);
|
| +
|
| + fputs (_("\
|
| +Mandatory arguments to long options are mandatory for short options too.\n\
|
| +"), stdout);
|
| + fputs (_("\
|
| +The same is true for optional arguments.\n\
|
| +"), stdout);
|
| +
|
| + fputs (_("\
|
| +\n\
|
| +Operation modes:\n\
|
| + -h, --help display this help and exit\n\
|
| + -V, --version output version information and exit\n\
|
| + --print-localedir output directory containing locale-dependent data\n\
|
| + --print-datadir output directory containing skeletons and XSLT\n\
|
| + -y, --yacc emulate POSIX Yacc\n\
|
| + -W, --warnings=[CATEGORY] report the warnings falling in CATEGORY\n\
|
| +\n\
|
| +"), stdout);
|
| +
|
| + fputs (_("\
|
| +Parser:\n\
|
| + -L, --language=LANGUAGE specify the output programming language\n\
|
| + (this is an experimental feature)\n\
|
| + -S, --skeleton=FILE specify the skeleton to use\n\
|
| + -t, --debug instrument the parser for debugging\n\
|
| + --locations enable locations computation\n\
|
| + -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
|
| + -l, --no-lines don't generate `#line' directives\n\
|
| + -k, --token-table include a table of token names\n\
|
| +\n\
|
| +"), stdout);
|
| +
|
| + /* Keep -d and --defines separate so that ../build-aux/cross-options.pl
|
| + * won't assume that -d also takes an argument. */
|
| + fputs (_("\
|
| +Output:\n\
|
| + --defines[=FILE] also produce a header file\n\
|
| + -d likewise but cannot specify FILE (for POSIX Yacc)\n\
|
| + -r, --report=THINGS also produce details on the automaton\n\
|
| + --report-file=FILE write report to FILE\n\
|
| + -v, --verbose same as `--report=state'\n\
|
| + -b, --file-prefix=PREFIX specify a PREFIX for output files\n\
|
| + -o, --output=FILE leave output to FILE\n\
|
| + -g, --graph[=FILE] also output a graph of the automaton\n\
|
| + -x, --xml[=FILE] also output an XML report of the automaton\n\
|
| + (the XML schema is experimental)\n\
|
| +\n\
|
| +"), stdout);
|
| +
|
| + fputs (_("\
|
| +Warning categories include:\n\
|
| + `midrule-values' unset or unused midrule values\n\
|
| + `yacc' incompatibilities with POSIX YACC\n\
|
| + `all' all the warnings\n\
|
| + `no-CATEGORY' turn off warnings in CATEGORY\n\
|
| + `none' turn off all the warnings\n\
|
| + `error' treat warnings as errors\n\
|
| +\n\
|
| +"), stdout);
|
| +
|
| + fputs (_("\
|
| +THINGS is a list of comma separated words that can include:\n\
|
| + `state' describe the states\n\
|
| + `itemset' complete the core item sets with their closure\n\
|
| + `lookahead' explicitly associate lookahead tokens to items\n\
|
| + `solved' describe shift/reduce conflicts solving\n\
|
| + `all' include all the above information\n\
|
| + `none' disable the report\n\
|
| +"), stdout);
|
| +
|
| + printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
|
| + }
|
| +
|
| + exit (status);
|
| +}
|
| +
|
| +
|
| +/*------------------------------.
|
| +| Display the version message. |
|
| +`------------------------------*/
|
| +
|
| +static void
|
| +version (void)
|
| +{
|
| + /* Some efforts were made to ease the translators' task, please
|
| + continue. */
|
| + printf (_("bison (GNU Bison) %s"), VERSION);
|
| + putc ('\n', stdout);
|
| + fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
|
| + putc ('\n', stdout);
|
| +
|
| + fprintf (stdout,
|
| + _("Copyright (C) %d Free Software Foundation, Inc.\n"),
|
| + PACKAGE_COPYRIGHT_YEAR);
|
| +
|
| + fputs (_("\
|
| +This is free software; see the source for copying conditions. There is NO\n\
|
| +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
|
| +"),
|
| + stdout);
|
| +}
|
| +
|
| +
|
| +/*-------------------------------------.
|
| +| --skeleton and --language handling. |
|
| +`--------------------------------------*/
|
| +
|
| +void
|
| +skeleton_arg (char const *arg, int prio, location const *loc)
|
| +{
|
| + if (prio < skeleton_prio)
|
| + {
|
| + skeleton_prio = prio;
|
| + skeleton = arg;
|
| + }
|
| + else if (prio == skeleton_prio)
|
| + {
|
| + char const *msg =
|
| + _("multiple skeleton declarations are invalid");
|
| + if (loc)
|
| + complain_at (*loc, msg);
|
| + else
|
| + complain (msg);
|
| + }
|
| +}
|
| +
|
| +void
|
| +language_argmatch (char const *arg, int prio, location const *loc)
|
| +{
|
| + char const *msg;
|
| +
|
| + if (prio < language_prio)
|
| + {
|
| + int i;
|
| + for (i = 0; valid_languages[i].language[0]; i++)
|
| + if (c_strcasecmp (arg, valid_languages[i].language) == 0)
|
| + {
|
| + language_prio = prio;
|
| + language = &valid_languages[i];
|
| + return;
|
| + }
|
| + msg = _("invalid language `%s'");
|
| + }
|
| + else if (language_prio == prio)
|
| + msg = _("multiple language declarations are invalid");
|
| + else
|
| + return;
|
| +
|
| + if (loc)
|
| + complain_at (*loc, msg, arg);
|
| + else
|
| + complain (msg, arg);
|
| +}
|
| +
|
| +/*----------------------.
|
| +| Process the options. |
|
| +`----------------------*/
|
| +
|
| +/* Shorts options.
|
| + Should be computed from long_options. */
|
| +static char const short_options[] =
|
| + "L:"
|
| + "S:"
|
| + "T::"
|
| + "V"
|
| + "W::"
|
| + "b:"
|
| + "d"
|
| + "e"
|
| + "g::"
|
| + "h"
|
| + "k"
|
| + "l"
|
| + "n"
|
| + "o:"
|
| + "p:"
|
| + "r:"
|
| + "t"
|
| + "v"
|
| + "x::"
|
| + "y"
|
| + ;
|
| +
|
| +/* Values for long options that do not have single-letter equivalents. */
|
| +enum
|
| +{
|
| + LOCATIONS_OPTION = CHAR_MAX + 1,
|
| + PRINT_LOCALEDIR_OPTION,
|
| + PRINT_DATADIR_OPTION,
|
| + REPORT_FILE_OPTION
|
| +};
|
| +
|
| +static struct option const long_options[] =
|
| +{
|
| + /* Operation modes. */
|
| + { "help", no_argument, 0, 'h' },
|
| + { "version", no_argument, 0, 'V' },
|
| + { "print-localedir", no_argument, 0, PRINT_LOCALEDIR_OPTION },
|
| + { "print-datadir", no_argument, 0, PRINT_DATADIR_OPTION },
|
| + { "warnings", optional_argument, 0, 'W' },
|
| +
|
| + /* Parser. */
|
| + { "name-prefix", required_argument, 0, 'p' },
|
| + { "include", required_argument, 0, 'I' },
|
| +
|
| + /* Output. */
|
| + { "file-prefix", required_argument, 0, 'b' },
|
| + { "output", required_argument, 0, 'o' },
|
| + { "output-file", required_argument, 0, 'o' },
|
| + { "graph", optional_argument, 0, 'g' },
|
| + { "xml", optional_argument, 0, 'x' },
|
| + { "report", required_argument, 0, 'r' },
|
| + { "report-file", required_argument, 0, REPORT_FILE_OPTION },
|
| + { "verbose", no_argument, 0, 'v' },
|
| +
|
| + /* Hidden. */
|
| + { "trace", optional_argument, 0, 'T' },
|
| +
|
| + /* Output. */
|
| + { "defines", optional_argument, 0, 'd' },
|
| +
|
| + /* Operation modes. */
|
| + { "fixed-output-files", no_argument, 0, 'y' },
|
| + { "yacc", no_argument, 0, 'y' },
|
| +
|
| + /* Parser. */
|
| + { "debug", no_argument, 0, 't' },
|
| + { "locations", no_argument, 0, LOCATIONS_OPTION },
|
| + { "no-lines", no_argument, 0, 'l' },
|
| + { "raw", no_argument, 0, 0 },
|
| + { "skeleton", required_argument, 0, 'S' },
|
| + { "language", required_argument, 0, 'L' },
|
| + { "token-table", no_argument, 0, 'k' },
|
| +
|
| + {0, 0, 0, 0}
|
| +};
|
| +
|
| +/* Under DOS, there is no difference on the case. This can be
|
| + troublesome when looking for `.tab' etc. */
|
| +#ifdef MSDOS
|
| +# define AS_FILE_NAME(File) (strlwr (File), (File))
|
| +#else
|
| +# define AS_FILE_NAME(File) (File)
|
| +#endif
|
| +
|
| +void
|
| +getargs (int argc, char *argv[])
|
| +{
|
| + int c;
|
| +
|
| + while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
|
| + != -1)
|
| + switch (c)
|
| + {
|
| + case 0:
|
| + /* Certain long options cause getopt_long to return 0. */
|
| + break;
|
| +
|
| + case 'd':
|
| + /* Here, the -d and --defines options are differentiated. */
|
| + defines_flag = true;
|
| + if (optarg)
|
| + spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
|
| + break;
|
| +
|
| + case 'I':
|
| + include = AS_FILE_NAME (optarg);
|
| + break;
|
| +
|
| + case 'L':
|
| + language_argmatch (optarg, command_line_prio, NULL);
|
| + break;
|
| +
|
| + case 'S':
|
| + skeleton_arg (AS_FILE_NAME (optarg), command_line_prio, NULL);
|
| + break;
|
| +
|
| + case 'T':
|
| + FLAGS_ARGMATCH (trace, optarg);
|
| + break;
|
| +
|
| + case 'V':
|
| + version ();
|
| + exit (EXIT_SUCCESS);
|
| +
|
| + case 'W':
|
| + if (optarg)
|
| + FLAGS_ARGMATCH (warnings, optarg);
|
| + else
|
| + warnings_flag |= warnings_all;
|
| + break;
|
| +
|
| + case 'b':
|
| + spec_file_prefix = AS_FILE_NAME (optarg);
|
| + break;
|
| +
|
| + case 'g':
|
| + graph_flag = true;
|
| + if (optarg)
|
| + spec_graph_file = xstrdup (AS_FILE_NAME (optarg));
|
| + break;
|
| +
|
| + case 'h':
|
| + usage (EXIT_SUCCESS);
|
| +
|
| + case 'k':
|
| + token_table_flag = true;
|
| + break;
|
| +
|
| + case 'l':
|
| + no_lines_flag = true;
|
| + break;
|
| +
|
| + case 'o':
|
| + spec_outfile = AS_FILE_NAME (optarg);
|
| + break;
|
| +
|
| + case 'p':
|
| + spec_name_prefix = optarg;
|
| + break;
|
| +
|
| + case 'r':
|
| + FLAGS_ARGMATCH (report, optarg);
|
| + break;
|
| +
|
| + case 't':
|
| + debug_flag = true;
|
| + break;
|
| +
|
| + case 'v':
|
| + report_flag |= report_states;
|
| + break;
|
| +
|
| + case 'x':
|
| + xml_flag = true;
|
| + if (optarg)
|
| + spec_xml_file = xstrdup (AS_FILE_NAME (optarg));
|
| + break;
|
| +
|
| + case 'y':
|
| + yacc_flag = true;
|
| + break;
|
| +
|
| + case LOCATIONS_OPTION:
|
| + locations_flag = true;
|
| + break;
|
| +
|
| + case PRINT_LOCALEDIR_OPTION:
|
| + printf ("%s\n", LOCALEDIR);
|
| + exit (EXIT_SUCCESS);
|
| +
|
| + case PRINT_DATADIR_OPTION:
|
| + printf ("%s\n", compute_pkgdatadir ());
|
| + exit (EXIT_SUCCESS);
|
| +
|
| + case REPORT_FILE_OPTION:
|
| + spec_verbose_file = xstrdup (AS_FILE_NAME (optarg));
|
| + break;
|
| +
|
| + default:
|
| + usage (EXIT_FAILURE);
|
| + }
|
| +
|
| + if (argc - optind != 1)
|
| + {
|
| + if (argc - optind < 1)
|
| + error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
|
| + else
|
| + error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
|
| + usage (EXIT_FAILURE);
|
| + }
|
| +
|
| + current_file = grammar_file = uniqstr_new (argv[optind]);
|
| +}
|
|
|
| Property changes on: bison\src\bison\2.4.1\bison-2.4.1-src\src\getargs.c
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|