X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/07c39ae908c536bc00f504d9e6a7cac7c12e08ad..deee93a132f495094b24cb610d062679c6fc402d:/src/getargs.c?ds=sidebyside diff --git a/src/getargs.c b/src/getargs.c index 563cc129..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. @@ -59,6 +59,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,10 +67,20 @@ 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. @@ -323,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 @@ -374,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} @@ -414,8 +477,12 @@ getargs (int argc, char *argv[]) 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':