]>
git.saurik.com Git - bison.git/blob - src/getargs.c
c68503b1b2bf661125ff4870b427666f78c3bd01
   1 /* Parse command line arguments for Bison. 
   3    Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 
   4    2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. 
   6    This file is part of Bison, the GNU Compiler Compiler. 
   8    This program is free software: you can redistribute it and/or modify 
   9    it under the terms of the GNU General Public License as published by 
  10    the Free Software Foundation, either version 3 of the License, or 
  11    (at your option) any later version. 
  13    This program is distributed in the hope that it will be useful, 
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  16    GNU General Public License for more details. 
  18    You should have received a copy of the GNU General Public License 
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ 
  26 #include <c-strcase.h> 
  27 #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 
  47 #include "muscle-tab.h" 
  54 bool token_table_flag
; 
  55 bool yacc_flag
; /* for -y */ 
  57 bool nondeterministic_parser 
= false; 
  58 bool glr_parser 
= false; 
  60 int report_flag 
= report_none
; 
  61 int trace_flag 
= trace_none
; 
  62 int warnings_flag 
= warnings_none
; 
  64 static struct bison_language 
const valid_languages
[] = { 
  65   { "c", "c-skel.m4", ".c", ".h", true }, 
  66   { "c++", "c++-skel.m4", ".cc", ".hh", true }, 
  67   { "java", "java-skel.m4", ".java", ".java", false }, 
  68   { "", "", "", "", false } 
  71 int skeleton_prio 
= default_prio
; 
  72 const char *skeleton 
= NULL
; 
  73 int language_prio 
= default_prio
; 
  74 struct bison_language 
const *language 
= &valid_languages
[0]; 
  75 const char *include 
= NULL
; 
  80 /** Decode an option's set of keys. 
  82  *  \param option   option being decoded. 
  83  *  \param keys     array of valid subarguments. 
  84  *  \param values   array of corresponding (int) values. 
  85  *  \param flags    the flags to update 
  86  *  \param args     comma separated list of effective subarguments to decode. 
  87  *                  If 0, then activate all the flags. 
  89  *  If VALUE != 0 then KEY sets flags and no-KEY clears them. 
  90  *  If VALUE == 0 then KEY clears all flags and no-KEY sets all flags. 
  91  *  Thus no-none = all and no-all = none. 
  94 flags_argmatch (const char *option
, 
  95                 const char * const keys
[], const int values
[], 
  96                 int *flags
, char *args
) 
 100       args 
= strtok (args
, ","); 
 103           int no 
= strncmp (args
, "no-", 3) == 0 ? 3 : 0; 
 104           int value 
= XARGMATCH (option
, args 
+ no
, keys
, values
); 
 115           args 
= strtok (NULL
, ","); 
 122 /** Decode a set of sub arguments. 
 124  *  \param FlagName  the flag familly to update. 
 125  *  \param Args      the effective sub arguments to decode. 
 127  *  \arg FlagName_args   the list of keys. 
 128  *  \arg FlagName_types  the list of values. 
 129  *  \arg FlagName_flag   the flag to update. 
 131 #define FLAGS_ARGMATCH(FlagName, Args)                                  \ 
 132   flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \ 
 133                   &FlagName ## _flag, Args) 
 136 /*----------------------. 
 137 | --report's handling.  | 
 138 `----------------------*/ 
 140 static const char * const report_args
[] = 
 142   /* In a series of synonyms, present the most meaningful first, so 
 143      that argmatch_valid be more readable.  */ 
 146   "itemset", "itemsets", 
 147   "lookahead", "lookaheads", "look-ahead", 
 153 static const int report_types
[] = 
 156   report_states
, report_states
, 
 157   report_states 
| report_itemsets
, report_states 
| report_itemsets
, 
 158   report_states 
| report_lookahead_tokens
, 
 159   report_states 
| report_lookahead_tokens
, 
 160   report_states 
| report_lookahead_tokens
, 
 161   report_states 
| report_solved_conflicts
, 
 165 ARGMATCH_VERIFY (report_args
, report_types
); 
 168 /*---------------------. 
 169 | --trace's handling.  | 
 170 `---------------------*/ 
 172 static const char * const trace_args
[] = 
 174   /* In a series of synonyms, present the most meaningful first, so 
 175      that argmatch_valid be more readable.  */ 
 177   "scan       - grammar scanner traces", 
 178   "parse      - grammar parser traces", 
 179   "automaton  - construction of the automaton", 
 180   "bitsets    - use of bitsets", 
 181   "grammar    - reading, reducing the grammar", 
 182   "resource   - memory consumption (where available)", 
 183   "sets       - grammar sets: firsts, nullable etc.", 
 184   "muscles    - m4 definitions passed to the skeleton", 
 185   "tools      - m4 invocation", 
 187   "skeleton   - skeleton postprocessing", 
 188   "time       - time consumption", 
 189   "all        - all of the above", 
 193 static const int trace_types
[] = 
 211 ARGMATCH_VERIFY (trace_args
, trace_types
); 
 214 /*------------------------. 
 215 | --warnings's handling.  | 
 216 `------------------------*/ 
 218 static const char * const warnings_args
[] = 
 220   /* In a series of synonyms, present the most meaningful first, so 
 221      that argmatch_valid be more readable.  */ 
 222   "none            - no warnings", 
 223   "midrule-values  - unset or unused midrule values", 
 224   "yacc            - incompatibilities with POSIX YACC", 
 225   "all             - all of the above", 
 226   "error           - warnings are errors", 
 230 static const int warnings_types
[] = 
 233   warnings_midrule_values
, 
 239 ARGMATCH_VERIFY (warnings_args
, warnings_types
); 
 242 /*-------------------------------------------. 
 243 | Display the help message and exit STATUS.  | 
 244 `-------------------------------------------*/ 
 246 static void usage (int) ATTRIBUTE_NORETURN
; 
 252     fprintf (stderr
, _("Try `%s --help' for more information.\n"), 
 256       /* For ../build-aux/cross-options.pl to work, use the format: 
 257                 ^  -S, --long[=ARGS] (whitespace) 
 258          A --long option is required. 
 259          Otherwise, add exceptions to ../build-aux/cross-options.pl.  */ 
 261       printf (_("Usage: %s [OPTION]... FILE\n"), program_name
); 
 263 Generate LALR(1) and GLR parsers.\n\ 
 268 Mandatory arguments to long options are mandatory for short options too.\n\ 
 271 The same is true for optional arguments.\n\ 
 277   -h, --help                 display this help and exit\n\ 
 278   -V, --version              output version information and exit\n\ 
 279       --print-localedir      output directory containing locale-dependent data\n\ 
 280       --print-datadir        output directory containing skeletons and XSLT\n\ 
 281   -y, --yacc                 emulate POSIX Yacc\n\ 
 282   -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n\ 
 288   -L, --language=LANGUAGE    specify the output programming language\n\ 
 289                              (this is an experimental feature)\n\ 
 290   -S, --skeleton=FILE        specify the skeleton to use\n\ 
 291   -t, --debug                instrument the parser for debugging\n\ 
 292       --locations            enable location support\n\ 
 293   -D, --define=NAME[=VALUE]  same as `%define NAME \"VALUE\"'\n\ 
 294   -p, --name-prefix=PREFIX   prepend PREFIX to the external symbols\n\ 
 295   -l, --no-lines             don't generate `#line' directives\n\ 
 296   -k, --token-table          include a table of token names\n\ 
 300       /* Keep -d and --defines separate so that ../build-aux/cross-options.pl 
 301        * won't assume that -d also takes an argument.  */ 
 304       --defines[=FILE]       also produce a header file\n\ 
 305   -d                         likewise but cannot specify FILE (for POSIX Yacc)\n\ 
 306   -r, --report=THINGS        also produce details on the automaton\n\ 
 307       --report-file=FILE     write report to FILE\n\ 
 308   -v, --verbose              same as `--report=state'\n\ 
 309   -b, --file-prefix=PREFIX   specify a PREFIX for output files\n\ 
 310   -o, --output=FILE          leave output to FILE\n\ 
 311   -g, --graph[=FILE]         also output a graph of the automaton\n\ 
 312   -x, --xml[=FILE]           also output an XML report of the automaton\n\ 
 313                              (the XML schema is experimental)\n\ 
 318 Warning categories include:\n\ 
 319   `midrule-values'  unset or unused midrule values\n\ 
 320   `yacc'            incompatibilities with POSIX YACC\n\ 
 321   `all'             all the warnings\n\ 
 322   `no-CATEGORY'     turn off warnings in CATEGORY\n\ 
 323   `none'            turn off all the warnings\n\ 
 324   `error'           treat warnings as errors\n\ 
 329 THINGS is a list of comma separated words that can include:\n\ 
 330   `state'        describe the states\n\ 
 331   `itemset'      complete the core item sets with their closure\n\ 
 332   `lookahead'    explicitly associate lookahead tokens to items\n\ 
 333   `solved'       describe shift/reduce conflicts solving\n\ 
 334   `all'          include all the above information\n\ 
 335   `none'         disable the report\n\ 
 338       printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT
); 
 345 /*------------------------------. 
 346 | Display the version message.  | 
 347 `------------------------------*/ 
 352   /* Some efforts were made to ease the translators' task, please 
 354   printf (_("bison (GNU Bison) %s"), VERSION
); 
 356   fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout
); 
 360            _("Copyright (C) %d Free Software Foundation, Inc.\n"), 
 361            PACKAGE_COPYRIGHT_YEAR
); 
 364 This is free software; see the source for copying conditions.  There is NO\n\ 
 365 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ 
 371 /*-------------------------------------. 
 372 | --skeleton and --language handling.  | 
 373 `--------------------------------------*/ 
 376 skeleton_arg (char const *arg
, int prio
, location loc
) 
 378   if (prio 
< skeleton_prio
) 
 380       skeleton_prio 
= prio
; 
 383   else if (prio 
== skeleton_prio
) 
 386         _("multiple skeleton declarations are invalid"); 
 387       complain_at (loc
, msg
); 
 392 language_argmatch (char const *arg
, int prio
, location loc
) 
 396   if (prio 
< language_prio
) 
 399       for (i 
= 0; valid_languages
[i
].language
[0]; i
++) 
 400         if (c_strcasecmp (arg
, valid_languages
[i
].language
) == 0) 
 402             language_prio 
= prio
; 
 403             language 
= &valid_languages
[i
]; 
 406       msg 
= _("invalid language `%s'"); 
 408   else if (language_prio 
== prio
) 
 409     msg 
= _("multiple language declarations are invalid"); 
 413   complain_at (loc
, msg
, arg
); 
 416 /*----------------------. 
 417 | Process the options.  | 
 418 `----------------------*/ 
 421    Should be computed from long_options.  */ 
 422 static char const short_options
[] = 
 446 /* Values for long options that do not have single-letter equivalents.  */ 
 449   LOCATIONS_OPTION 
= CHAR_MAX 
+ 1, 
 450   PRINT_LOCALEDIR_OPTION
, 
 451   PRINT_DATADIR_OPTION
, 
 455 static struct option 
const long_options
[] = 
 457   /* Operation modes. */ 
 458   { "help",            no_argument
,       0,   'h' }, 
 459   { "version",         no_argument
,       0,   'V' }, 
 460   { "print-localedir", no_argument
,       0,   PRINT_LOCALEDIR_OPTION 
}, 
 461   { "print-datadir",   no_argument
,       0,   PRINT_DATADIR_OPTION   
}, 
 462   { "warnings",        optional_argument
, 0,   'W' }, 
 465   { "name-prefix",   required_argument
,   0,   'p' }, 
 466   { "include",       required_argument
,   0,   'I' }, 
 469   { "file-prefix", required_argument
,   0,   'b' }, 
 470   { "output",      required_argument
,   0,   'o' }, 
 471   { "output-file", required_argument
,   0,   'o' }, 
 472   { "graph",       optional_argument
,   0,   'g' }, 
 473   { "xml",         optional_argument
,   0,   'x' }, 
 474   { "report",      required_argument
,   0,   'r' }, 
 475   { "report-file", required_argument
,   0,   REPORT_FILE_OPTION 
}, 
 476   { "verbose",     no_argument
,         0,   'v' }, 
 479   { "trace",         optional_argument
,   0,     'T' }, 
 482   { "defines",     optional_argument
,   0,   'd' }, 
 484   /* Operation modes.  */ 
 485   { "fixed-output-files", no_argument
,  0,   'y' }, 
 486   { "yacc",               no_argument
,  0,   'y' }, 
 489   { "debug",          no_argument
,               0,   't' }, 
 490   { "define",         required_argument
,         0,   'D' }, 
 491   { "locations",      no_argument
,               0, LOCATIONS_OPTION 
}, 
 492   { "no-lines",       no_argument
,               0,   'l' }, 
 493   { "raw",            no_argument
,               0,     0 }, 
 494   { "skeleton",       required_argument
,         0,   'S' }, 
 495   { "language",       required_argument
,         0,   'L' }, 
 496   { "token-table",    no_argument
,               0,   'k' }, 
 501 /* Under DOS, there is no difference on the case.  This can be 
 502    troublesome when looking for `.tab' etc.  */ 
 504 # define AS_FILE_NAME(File) (strlwr (File), (File)) 
 506 # define AS_FILE_NAME(File) (File) 
 509 /* Build a location for the current command line argument. */ 
 512 command_line_location (void) 
 515   /* "<command line>" is used in GCC's messages about -D. */ 
 516   boundary_set (&res
.start
, uniqstr_new ("<command line>"), optind
, -1); 
 523 getargs (int argc
, char *argv
[]) 
 527   while ((c 
= getopt_long (argc
, argv
, short_options
, long_options
, NULL
)) 
 531         /* ASCII Sorting for short options (i.e., upper case then 
 532            lower case), and then long-only options.  */ 
 535         /* Certain long options cause getopt_long to return 0.  */ 
 538       case 'D': /* -DNAME[=VALUE]. */ 
 541           char* value 
= strchr (optarg
, '='); 
 544           muscle_percent_define_insert (name
, command_line_location (), 
 550         include 
= AS_FILE_NAME (optarg
); 
 554         language_argmatch (optarg
, command_line_prio
, 
 555                            command_line_location ()); 
 559         skeleton_arg (AS_FILE_NAME (optarg
), command_line_prio
, 
 560                       command_line_location ()); 
 564         FLAGS_ARGMATCH (trace
, optarg
); 
 573           FLAGS_ARGMATCH (warnings
, optarg
); 
 575           warnings_flag 
|= warnings_all
; 
 579         spec_file_prefix 
= AS_FILE_NAME (optarg
); 
 583         /* Here, the -d and --defines options are differentiated.  */ 
 586           spec_defines_file 
= xstrdup (AS_FILE_NAME (optarg
)); 
 592           spec_graph_file 
= xstrdup (AS_FILE_NAME (optarg
)); 
 596         usage (EXIT_SUCCESS
); 
 599         token_table_flag 
= true; 
 603         no_lines_flag 
= true; 
 607         spec_outfile 
= AS_FILE_NAME (optarg
); 
 611         spec_name_prefix 
= optarg
; 
 615         FLAGS_ARGMATCH (report
, optarg
); 
 619         muscle_percent_define_insert ("debug", command_line_location (), ""); 
 623         report_flag 
|= report_states
; 
 629           spec_xml_file 
= xstrdup (AS_FILE_NAME (optarg
)); 
 636       case LOCATIONS_OPTION
: 
 637         muscle_percent_define_ensure ("locations", 
 638                                       command_line_location (), true); 
 641       case PRINT_LOCALEDIR_OPTION
: 
 642         printf ("%s\n", LOCALEDIR
); 
 645       case PRINT_DATADIR_OPTION
: 
 646         printf ("%s\n", compute_pkgdatadir ()); 
 649       case REPORT_FILE_OPTION
: 
 650         spec_verbose_file 
= xstrdup (AS_FILE_NAME (optarg
)); 
 654         usage (EXIT_FAILURE
); 
 657   if (argc 
- optind 
!= 1) 
 659       if (argc 
- optind 
< 1) 
 660         error (0, 0, _("missing operand after `%s'"), argv
[argc 
- 1]); 
 662         error (0, 0, _("extra operand `%s'"), argv
[optind 
+ 1]); 
 663       usage (EXIT_FAILURE
); 
 666   current_file 
= grammar_file 
= uniqstr_new (argv
[optind
]); 
 667   MUSCLE_INSERT_C_STRING ("file_name", grammar_file
);