X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7b42569e12a5b97dd785831d879c7423528b93d9..b2b81dae234cc710e65542d3535fe963d0d1d314:/src/getargs.c diff --git a/src/getargs.c b/src/getargs.c index 7c69d8e2..0938c698 100644 --- a/src/getargs.c +++ b/src/getargs.c @@ -1,7 +1,7 @@ /* Parse command line arguments for Bison. Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Free Software Foundation, Inc. + 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -25,6 +25,7 @@ #include "revision.h" #include +#include #include /* Hack to get to declare getopt with a prototype. */ @@ -58,55 +59,67 @@ bool error_verbose = false; bool nondeterministic_parser = false; bool glr_parser = false; +bool pull_parser = true; bool pure_parser = false; +bool push_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 } +}; + +static int skeleton_prio = 2; const char *skeleton = NULL; +static int language_prio = 2; +struct bison_language const *language = &valid_languages[0]; const char *include = NULL; -extern char *program_name; +char *program_name; /** Decode an option's set of keys. * * \param option option being decoded. - * \paran keys array of valid subarguments. + * \param keys array of valid subarguments. * \param values array of corresponding (int) values. - * \param flag the flags to update + * \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 int -flags_argmatch (const char *option, +static void +flags_argmatch (const char *option, const char * const keys[], const int values[], int *flags, char *args) { if (args) { args = strtok (args, ","); - do + while (args) { int value = XARGMATCH (option, args, keys, values); if (value == 0) *flags = 0; else *flags |= value; + args = strtok (NULL, ","); } - while ((args = strtok (NULL, ","))); } else *flags = ~0; } -/** Decode a set of sub arguments. +/** Decode a set of sub arguments. * * \param FlagName the flag familly to update. - * \param args the effective sub arguments to decode. + * \param Args the effective sub arguments to decode. * * \arg FlagName_args the list of keys. * \arg FlagName_types the list of values. @@ -201,19 +214,21 @@ 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", - "error - warnings are errors", - "yacc - incompatibilities with POSIX YACC", - "all - all of the above", + "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_error, + warnings_midrule_values, warnings_yacc, - warnings_all + warnings_all, + warnings_error }; ARGMATCH_VERIFY (warnings_args, warnings_types); @@ -233,29 +248,25 @@ usage (int status) program_name); else { - /* Some efforts were made to ease the translators' task, please - continue. */ + printf (_("Usage: %s [OPTION]... FILE\n"), program_name); fputs (_("\ -GNU bison generates LALR(1) and GLR parsers.\n"), stdout); - putc ('\n', stdout); - - fprintf (stdout, _("\ -Usage: %s [OPTION]... FILE\n"), program_name); - putc ('\n', stdout); +Generate LALR(1) and GLR parsers.\n\ +\n\ +"), stdout); fputs (_("\ -If a long option shows an argument as mandatory, then it is mandatory\n\ -for the equivalent short option also. Similarly for optional arguments.\n"), - stdout); - putc ('\n', stdout); +Mandatory arguments to long options are mandatory for short options too.\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\ - -y, --yacc emulate POSIX Yacc\n"), stdout); - putc ('\n', stdout); + -y, --yacc emulate POSIX Yacc\n\ +\n\ +"), stdout); fputs (_("\ Parser:\n\ @@ -266,8 +277,8 @@ Parser:\n\ -l, --no-lines don't generate `#line' directives\n\ -n, --no-parser generate the tables only\n\ -k, --token-table include a table of token names\n\ +\n\ "), stdout); - putc ('\n', stdout); fputs (_("\ Output:\n\ @@ -276,9 +287,9 @@ Output:\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 also produce a VCG description of the automaton\n\ + -g, --graph also output a graph of the automaton\n\ +\n\ "), stdout); - putc ('\n', stdout); fputs (_("\ THINGS is a list of comma separated words that can include:\n\ @@ -289,10 +300,8 @@ THINGS is a list of comma separated words that can include:\n\ `all' include all the above information\n\ `none' disable the report\n\ "), stdout); - putc ('\n', stdout); - fputs (_("\ -Report bugs to <" PACKAGE_BUGREPORT ">.\n"), stdout); + printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); } exit (status); @@ -325,12 +334,63 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ } +/*-------------------------------------. +| --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 (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. */ -static char const short_options[] = "yvegdhr:ltknVo:b:p:S:T::W"; +static char const short_options[] = "yvegdhr:L:ltknVo:b:p:S:T::W"; /* Values for long options that do not have single-letter equivalents. */ enum @@ -376,6 +436,7 @@ static struct option const long_options[] = { "no-parser", no_argument, 0, 'n' }, { "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} @@ -410,14 +471,18 @@ getargs (int argc, char *argv[]) /* Here, the -g and --graph=FILE options are differentiated. */ graph_flag = true; if (optarg) - spec_graph_file = AS_FILE_NAME (optarg); + spec_graph_file = xstrdup (AS_FILE_NAME (optarg)); break; case 'h': usage (EXIT_SUCCESS); + case 'L': + language_argmatch (optarg, 0, NULL); + break; + case 'S': - skeleton = AS_FILE_NAME (optarg); + skeleton_arg (AS_FILE_NAME (optarg), 0, NULL); break; case 'I': @@ -428,7 +493,7 @@ getargs (int argc, char *argv[]) /* Here, the -d and --defines options are differentiated. */ defines_flag = true; if (optarg) - spec_defines_file = AS_FILE_NAME (optarg); + spec_defines_file = xstrdup (AS_FILE_NAME (optarg)); break; case 'k': @@ -476,7 +541,10 @@ getargs (int argc, char *argv[]) break; case 'W': - FLAGS_ARGMATCH (warnings, optarg); + if (optarg) + FLAGS_ARGMATCH (warnings, optarg); + else + warnings_flag |= warnings_all; break; case LOCATIONS_OPTION: