]>
git.saurik.com Git - bison.git/blob - src/getargs.c
94d24329d716cdd0ea167be3135f96f30a20a2ec
   1 /* Parse command line arguments for Bison. 
   3    Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 
   4    2005, 2006 Free Software Foundation, Inc. 
   6    This file is part of Bison, the GNU Compiler Compiler. 
   8    Bison is free software; you can redistribute it and/or modify it 
   9    under the terms of the GNU General Public License as published by 
  10    the Free Software Foundation; either version 2, or (at your option) 
  13    Bison is distributed in the hope that it will be useful, but 
  14    WITHOUT ANY WARRANTY; without even the implied warranty of 
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
  16    General Public License for more details. 
  18    You should have received a copy of the GNU General Public License 
  19    along with Bison; see the file COPYING.  If not, write to the Free 
  20    Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
  28 #include <configmake.h> 
  31 /* Hack to get <getopt.h> to declare getopt with a prototype.  */ 
  32 #if lint && ! defined __GNU_LIBRARY__ 
  33 # define __GNU_LIBRARY__ 
  34 # define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1 
  39 #ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE 
  40 # undef __GNU_LIBRARY__ 
  41 # undef HACK_FOR___GNU_LIBRARY___PROTOTYPE 
  55 bool token_table_flag
; 
  56 bool yacc_flag
; /* for -y */ 
  58 bool error_verbose 
= false; 
  60 bool nondeterministic_parser 
= false; 
  61 bool glr_parser 
= false; 
  62 bool pure_parser 
= false; 
  63 bool push_parser 
= false; 
  65 int report_flag 
= report_none
; 
  66 int trace_flag 
= trace_none
; 
  67 int warnings_flag 
= warnings_none
; 
  69 const char *skeleton 
= NULL
; 
  70 const char *include 
= NULL
; 
  72 extern char *program_name
; 
  75 /** Decode an option's set of keys. 
  77  *  \param option   option being decoded. 
  78  *  \paran keys     array of valid subarguments. 
  79  *  \param values   array of corresponding (int) values. 
  80  *  \param flag     the flags to update 
  81  *  \param args     colon separated list of effective subarguments to decode. 
  82  *                  If 0, then activate all the flags. 
  84  *  The special value 0 resets the flags to 0. 
  87 flags_argmatch (const char *option
, 
  88                 const char * const keys
[], const int values
[], 
  89                 int *flags
, char *args
) 
  93       args 
= strtok (args
, ","); 
  96           int value 
= XARGMATCH (option
, args
, keys
, values
); 
 101           args 
= strtok (NULL
, ","); 
 108 /** Decode a set of sub arguments. 
 110  *  \param FlagName  the flag familly to update. 
 111  *  \param args      the effective sub arguments to decode. 
 113  *  \arg FlagName_args   the list of keys. 
 114  *  \arg FlagName_types  the list of values. 
 115  *  \arg FlagName_flag   the flag to update. 
 117 #define FLAGS_ARGMATCH(FlagName, Args)                                  \ 
 118   flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \ 
 119                   &FlagName ## _flag, Args) 
 122 /*----------------------. 
 123 | --report's handling.  | 
 124 `----------------------*/ 
 126 static const char * const report_args
[] = 
 128   /* In a series of synonyms, present the most meaningful first, so 
 129      that argmatch_valid be more readable.  */ 
 132   "itemset", "itemsets", 
 133   "lookahead", "lookaheads", "look-ahead", 
 139 static const int report_types
[] = 
 142   report_states
, report_states
, 
 143   report_states 
| report_itemsets
, report_states 
| report_itemsets
, 
 144   report_states 
| report_lookahead_tokens
, 
 145   report_states 
| report_lookahead_tokens
, 
 146   report_states 
| report_lookahead_tokens
, 
 147   report_states 
| report_solved_conflicts
, 
 151 ARGMATCH_VERIFY (report_args
, report_types
); 
 154 /*---------------------. 
 155 | --trace's handling.  | 
 156 `---------------------*/ 
 158 static const char * const trace_args
[] = 
 160   /* In a series of synonyms, present the most meaningful first, so 
 161      that argmatch_valid be more readable.  */ 
 163   "scan       - grammar scanner traces", 
 164   "parse      - grammar parser traces", 
 165   "automaton  - construction of the automaton", 
 166   "bitsets    - use of bitsets", 
 167   "grammar    - reading, reducing the grammar", 
 168   "resource   - memory consumption (where available)", 
 169   "sets       - grammar sets: firsts, nullable etc.", 
 170   "tools      - m4 invocation", 
 172   "skeleton   - skeleton postprocessing", 
 173   "time       - time consumption", 
 174   "all        - all of the above", 
 178 static const int trace_types
[] = 
 195 ARGMATCH_VERIFY (trace_args
, trace_types
); 
 198 /*------------------------. 
 199 | --warnings's handling.  | 
 200 `------------------------*/ 
 202 static const char * const warnings_args
[] = 
 204   /* In a series of synonyms, present the most meaningful first, so 
 205      that argmatch_valid be more readable.  */ 
 206   "none       - no warnings", 
 207   "error      - warnings are errors", 
 208   "yacc       - incompatibilities with POSIX YACC", 
 209   "all        - all of the above", 
 213 static const int warnings_types
[] = 
 221 ARGMATCH_VERIFY (warnings_args
, warnings_types
); 
 224 /*-------------------------------------------. 
 225 | Display the help message and exit STATUS.  | 
 226 `-------------------------------------------*/ 
 228 static void usage (int) ATTRIBUTE_NORETURN
; 
 234     fprintf (stderr
, _("Try `%s --help' for more information.\n"), 
 238       printf (_("Usage: %s [OPTION]... FILE\n"), program_name
); 
 240 Generate LALR(1) and GLR parsers.\n\ 
 245 Mandatory arguments to long options are mandatory for short options too.\n\ 
 251   -h, --help                 display this help and exit\n\ 
 252   -V, --version              output version information and exit\n\ 
 253       --print-localedir      output directory containing locale-dependent data\n\ 
 254   -y, --yacc                 emulate POSIX Yacc\n\ 
 260   -S, --skeleton=FILE        specify the skeleton to use\n\ 
 261   -t, --debug                instrument the parser for debugging\n\ 
 262       --locations            enable locations computation\n\ 
 263   -p, --name-prefix=PREFIX   prepend PREFIX to the external symbols\n\ 
 264   -l, --no-lines             don't generate `#line' directives\n\ 
 265   -n, --no-parser            generate the tables only\n\ 
 266   -k, --token-table          include a table of token names\n\ 
 272   -d, --defines              also produce a header file\n\ 
 273   -r, --report=THINGS        also produce details on the automaton\n\ 
 274   -v, --verbose              same as `--report=state'\n\ 
 275   -b, --file-prefix=PREFIX   specify a PREFIX for output files\n\ 
 276   -o, --output=FILE          leave output to FILE\n\ 
 277   -g, --graph                also output a graph of the automaton\n\ 
 282 THINGS is a list of comma separated words that can include:\n\ 
 283   `state'        describe the states\n\ 
 284   `itemset'      complete the core item sets with their closure\n\ 
 285   `lookahead'    explicitly associate lookahead tokens to items\n\ 
 286   `solved'       describe shift/reduce conflicts solving\n\ 
 287   `all'          include all the above information\n\ 
 288   `none'         disable the report\n\ 
 291       printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT
); 
 298 /*------------------------------. 
 299 | Display the version message.  | 
 300 `------------------------------*/ 
 305   /* Some efforts were made to ease the translators' task, please 
 307   printf (_("bison (GNU Bison) %s"), VERSION
); 
 309   printf ("%s", revision
); 
 310   fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout
); 
 314            _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2006); 
 317 This is free software; see the source for copying conditions.  There is NO\n\ 
 318 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ 
 324 /*----------------------. 
 325 | Process the options.  | 
 326 `----------------------*/ 
 328 /* Shorts options.  */ 
 329 static char const short_options
[] = "yvegdhr:ltknVo:b:p:S:T::W"; 
 331 /* Values for long options that do not have single-letter equivalents.  */ 
 334   LOCATIONS_OPTION 
= CHAR_MAX 
+ 1, 
 335   PRINT_LOCALEDIR_OPTION
 
 338 static struct option 
const long_options
[] = 
 340   /* Operation modes. */ 
 341   { "help",            no_argument
,       0,   'h' }, 
 342   { "version",         no_argument
,       0,   'V' }, 
 343   { "print-localedir", no_argument
,       0,   PRINT_LOCALEDIR_OPTION 
}, 
 344   { "warnings",        optional_argument
, 0,   'W' }, 
 347   { "name-prefix",   required_argument
,   0,   'p' }, 
 348   { "include",       required_argument
,   0,   'I' }, 
 351   { "file-prefix", required_argument
,   0,   'b' }, 
 352   { "output",      required_argument
,   0,   'o' }, 
 353   { "output-file", required_argument
,   0,   'o' }, 
 354   { "graph",       optional_argument
,   0,   'g' }, 
 355   { "report",      required_argument
,   0,   'r' }, 
 356   { "verbose",     no_argument
,         0,   'v' }, 
 359   { "trace",         optional_argument
,   0,     'T' }, 
 362   { "defines",     optional_argument
,   0,   'd' }, 
 364   /* Operation modes.  */ 
 365   { "fixed-output-files", no_argument
,  0,   'y' }, 
 366   { "yacc",               no_argument
,  0,   'y' }, 
 369   { "debug",          no_argument
,               0,   't' }, 
 370   { "locations",      no_argument
,               0, LOCATIONS_OPTION 
}, 
 371   { "no-lines",       no_argument
,               0,   'l' }, 
 372   { "no-parser",      no_argument
,               0,   'n' }, 
 373   { "raw",            no_argument
,               0,     0 }, 
 374   { "skeleton",       required_argument
,         0,   'S' }, 
 375   { "token-table",    no_argument
,               0,   'k' }, 
 380 /* Under DOS, there is no difference on the case.  This can be 
 381    troublesome when looking for `.tab' etc.  */ 
 383 # define AS_FILE_NAME(File) (strlwr (File), (File)) 
 385 # define AS_FILE_NAME(File) (File) 
 389 getargs (int argc
, char *argv
[]) 
 393   while ((c 
= getopt_long (argc
, argv
, short_options
, long_options
, NULL
)) 
 398         /* Certain long options cause getopt_long to return 0.  */ 
 402         spec_file_prefix 
= AS_FILE_NAME (optarg
); 
 406         /* Here, the -g and --graph=FILE options are differentiated.  */ 
 409           spec_graph_file 
= AS_FILE_NAME (optarg
); 
 413         usage (EXIT_SUCCESS
); 
 416         skeleton 
= AS_FILE_NAME (optarg
); 
 420         include 
= AS_FILE_NAME (optarg
); 
 424         /* Here, the -d and --defines options are differentiated.  */ 
 427           spec_defines_file 
= AS_FILE_NAME (optarg
); 
 431         token_table_flag 
= true; 
 435         no_lines_flag 
= true; 
 439         no_parser_flag 
= true; 
 443         spec_outfile 
= AS_FILE_NAME (optarg
); 
 447         spec_name_prefix 
= optarg
; 
 451         FLAGS_ARGMATCH (report
, optarg
); 
 455         FLAGS_ARGMATCH (trace
, optarg
); 
 467         report_flag 
|= report_states
; 
 475         FLAGS_ARGMATCH (warnings
, optarg
); 
 478       case LOCATIONS_OPTION
: 
 479         locations_flag 
= true; 
 482       case PRINT_LOCALEDIR_OPTION
: 
 483         printf ("%s\n", LOCALEDIR
); 
 487         usage (EXIT_FAILURE
); 
 490   if (argc 
- optind 
!= 1) 
 492       if (argc 
- optind 
< 1) 
 493         error (0, 0, _("missing operand after `%s'"), argv
[argc 
- 1]); 
 495         error (0, 0, _("extra operand `%s'"), argv
[optind 
+ 1]); 
 496       usage (EXIT_FAILURE
); 
 499   current_file 
= grammar_file 
= uniqstr_new (argv
[optind
]);