X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/0ce615753edfd7d1f8f1fe8670d4354b3d59d049..bf0e44e87c31bbab569c76e94ced6f4230e69f1f:/src/getargs.c diff --git a/src/getargs.c b/src/getargs.c index 7a67878a..a15dd24c 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, 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 1984, 1986, 1989, 1992, 2000-2011 Free Software + Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -44,13 +44,12 @@ #include "complain.h" #include "files.h" #include "getargs.h" -#include "muscle_tab.h" +#include "muscle-tab.h" #include "uniqstr.h" 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 */ @@ -83,18 +82,19 @@ char *program_name; * \param option option being decoded. * \param keys array of valid subarguments. * \param values array of corresponding (int) values. + * \param all the all value. * \param flags the flags to update * \param args comma separated list of effective subarguments to decode. * If 0, then activate all the flags. * * If VALUE != 0 then KEY sets flags and no-KEY clears them. - * If VALUE == 0 then KEY clears all flags and no-KEY sets all flags. - * Thus no-none = all and no-all = none. + * If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all + * flags from \c all. Thus no-none = all and no-all = none. */ static void flags_argmatch (const char *option, const char * const keys[], const int values[], - int *flags, char *args) + int all, int *flags, char *args) { if (args) { @@ -104,20 +104,24 @@ flags_argmatch (const char *option, int no = strncmp (args, "no-", 3) == 0 ? 3 : 0; int value = XARGMATCH (option, args + no, keys, values); if (value == 0) - if (no) - *flags = ~0; - else - *flags = 0; + { + if (no) + *flags |= all; + else + *flags &= ~all; + } else - if (no) - *flags &= ~value; - else - *flags |= value; + { + if (no) + *flags &= ~value; + else + *flags |= value; + } args = strtok (NULL, ","); } } else - *flags = ~0; + *flags |= all; } /** Decode a set of sub arguments. @@ -127,11 +131,12 @@ flags_argmatch (const char *option, * * \arg FlagName_args the list of keys. * \arg FlagName_types the list of values. + * \arg FlagName_all the all value. * \arg FlagName_flag the flag to update. */ #define FLAGS_ARGMATCH(FlagName, Args) \ flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \ - &FlagName ## _flag, Args) + FlagName ## _all, &FlagName ## _flag, Args) /*----------------------. @@ -187,6 +192,7 @@ static const char * const trace_args[] = "m4 - m4 traces", "skeleton - skeleton postprocessing", "time - time consumption", + "ielr - IELR conversion", "all - all of the above", 0 }; @@ -206,6 +212,7 @@ static const int trace_types[] = trace_m4, trace_skeleton, trace_time, + trace_ielr, trace_all }; @@ -222,7 +229,7 @@ static const char * const warnings_args[] = that argmatch_valid be more readable. */ "none - no warnings", "midrule-values - unset or unused midrule values", - "yacc - incompatibilities with POSIX YACC", + "yacc - incompatibilities with POSIX Yacc", "all - all of the above", "error - warnings are errors", 0 @@ -261,7 +268,9 @@ usage (int status) printf (_("Usage: %s [OPTION]... FILE\n"), program_name); fputs (_("\ -Generate LALR(1) and GLR parsers.\n\ +Generate a deterministic LR or generalized LR (GLR) parser employing\n\ +LALR(1), IELR(1), or canonical LR(1) parser tables. IELR(1) and\n\ +canonical LR(1) support is experimental.\n\ \n\ "), stdout); @@ -286,15 +295,17 @@ Operation modes:\n\ 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 location support\n\ - -D, --define=NAME[=VALUE] same as `%define NAME \"VALUE\"'\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\ + -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 tracing\n\ + same as `-Dparse.trace'\n\ + --locations enable location support\n\ + -D, --define=NAME[=VALUE] similar to `%define NAME \"VALUE\"'\n\ + -F, --force-define=NAME[=VALUE] override `%define NAME \"VALUE\"'\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); @@ -318,7 +329,7 @@ Output:\n\ fputs (_("\ Warning categories include:\n\ `midrule-values' unset or unused midrule values\n\ - `yacc' incompatibilities with POSIX YACC\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\ @@ -382,11 +393,7 @@ skeleton_arg (char const *arg, int prio, location loc) skeleton = arg; } else if (prio == skeleton_prio) - { - char const *msg = - _("multiple skeleton declarations are invalid"); - complain_at (loc, msg); - } + complain_at (loc, _("multiple skeleton declarations are invalid")); } void @@ -422,6 +429,7 @@ language_argmatch (char const *arg, int prio, location loc) Should be computed from long_options. */ static char const short_options[] = "D:" + "F:" "L:" "S:" "T::" @@ -489,6 +497,7 @@ static struct option const long_options[] = /* Parser. */ { "debug", no_argument, 0, 't' }, { "define", required_argument, 0, 'D' }, + { "force-define", required_argument, 0, 'F' }, { "locations", no_argument, 0, LOCATIONS_OPTION }, { "no-lines", no_argument, 0, 'l' }, { "raw", no_argument, 0, 0 }, @@ -537,13 +546,16 @@ getargs (int argc, char *argv[]) break; case 'D': /* -DNAME[=VALUE]. */ + case 'F': /* -FNAME[=VALUE]. */ { char* name = optarg; char* value = strchr (optarg, '='); if (value) *value++ = 0; muscle_percent_define_insert (name, command_line_location (), - value ? value : ""); + value ? value : "", + c == 'D' ? MUSCLE_PERCENT_DEFINE_D + : MUSCLE_PERCENT_DEFINE_F); } break; @@ -570,10 +582,7 @@ getargs (int argc, char *argv[]) exit (EXIT_SUCCESS); case 'W': - if (optarg) - FLAGS_ARGMATCH (warnings, optarg); - else - warnings_flag |= warnings_all; + FLAGS_ARGMATCH (warnings, optarg); break; case 'b': @@ -617,7 +626,9 @@ getargs (int argc, char *argv[]) break; case 't': - muscle_percent_define_insert ("debug", command_line_location (), ""); + muscle_percent_define_insert ("parse.trace", + command_line_location (), "", + MUSCLE_PERCENT_DEFINE_D); break; case 'v': @@ -635,7 +646,8 @@ getargs (int argc, char *argv[]) break; case LOCATIONS_OPTION: - locations_flag = true; + muscle_percent_define_ensure ("locations", + command_line_location (), true); break; case PRINT_LOCALEDIR_OPTION: @@ -666,3 +678,11 @@ getargs (int argc, char *argv[]) current_file = grammar_file = uniqstr_new (argv[optind]); MUSCLE_INSERT_C_STRING ("file_name", grammar_file); } + +void +tr (char *s, char from, char to) +{ + for (; *s; s++) + if (*s == from) + *s = to; +}