X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/ba7560e26bfa2f5a340545830d46e0437fcb701a..eb1b07409f0ccad9970c8a60ded9f2a56d205b9c:/src/getargs.c?ds=sidebyside diff --git a/src/getargs.c b/src/getargs.c index 94d24329..4ff38fb1 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 #include @@ -59,6 +60,7 @@ bool error_verbose = false; bool nondeterministic_parser = false; bool glr_parser = false; +bool pull_parser = true; bool pure_parser = false; bool push_parser = false; @@ -66,18 +68,28 @@ 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. * @@ -98,7 +110,7 @@ flags_argmatch (const char *option, *flags = 0; else *flags |= value; - args = strtok (NULL, ","); + args = strtok (NULL, ","); } } else @@ -108,7 +120,7 @@ flags_argmatch (const char *option, /** 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. @@ -203,19 +215,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); @@ -321,12 +335,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 (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. */ -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 @@ -372,6 +437,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} @@ -406,14 +472,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': @@ -424,7 +494,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': @@ -472,7 +542,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: