]>
git.saurik.com Git - bison.git/blob - src/getargs.c
bc490a85feb5d2f9b274e69db79e8717a1fd323b
   1 /* Parse command line arguments for bison. 
   2    Copyright 1984, 1986, 1989, 1992, 2000, 2001, 2002 
   3    Free Software Foundation, Inc. 
   5    This file is part of Bison, the GNU Compiler Compiler. 
   7    Bison is free software; you can redistribute it and/or modify it 
   8    under the terms of the GNU General Public License as published by 
   9    the Free Software Foundation; either version 2, or (at your option) 
  12    Bison is distributed in the hope that it will be useful, but 
  13    WITHOUT ANY WARRANTY; without even the implied warranty of 
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
  15    General Public License for more details. 
  17    You should have received a copy of the GNU General Public License 
  18    along with Bison; see the file COPYING.  If not, write to the Free 
  19    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 
  31 int locations_flag 
= 0; 
  32 int no_lines_flag 
= 0; 
  33 int no_parser_flag 
= 0; 
  34 int report_flag 
= report_none
; 
  35 int token_table_flag 
= 0; 
  36 int yacc_flag 
= 0;      /* for -y */ 
  38 int trace_flag 
= trace_none
; 
  40 const char *skeleton 
= NULL
; 
  41 const char *include 
= NULL
; 
  43 extern char *program_name
; 
  46 /*---------------------. 
  47 | --trace's handling.  | 
  48 `---------------------*/ 
  50 static const char * const trace_args
[] = 
  52   /* In a series of synonyms, present the most meaningful first, so 
  53      that argmatch_valid be more readable.  */ 
  55   "automaton  - contruction of the automaton", 
  56   "bitsets    - use of bitsets", 
  57   "grammar    - reading, reducing of the grammar", 
  58   "resource   - time and memory (where available)", 
  59   "sets       - grammar sets: firsts, nullable etc.", 
  60   "tools      - m4 invocation and preserve the temporary file", 
  61   "all        - all of the above", 
  65 static const int trace_types
[] = 
  79 trace_argmatch (char *args
) 
  81   ARGMATCH_ASSERT (trace_args
, trace_types
); 
  84       args 
= strtok (args
, ","); 
  87           int trace 
= XARGMATCH ("--trace", args
, 
  88                                  trace_args
, trace_types
); 
  89           if (trace 
== trace_none
) 
  90             trace_flag 
= trace_none
; 
  94       while ((args 
= strtok (NULL
, ","))); 
  97     trace_flag 
= trace_all
; 
 101 /*----------------------. 
 102 | --report's handling.  | 
 103 `----------------------*/ 
 105 static const char * const report_args
[] = 
 107   /* In a series of synonyms, present the most meaningful first, so 
 108      that argmatch_valid be more readable.  */ 
 111   "itemset", "itemsets", 
 112   "lookahead", "lookaheads", 
 118 static const int report_types
[] = 
 121   report_states
, report_states
, 
 122   report_states 
| report_itemsets
, report_states 
| report_itemsets
, 
 123   report_states 
| report_lookaheads
, report_states 
| report_lookaheads
, 
 124   report_states 
| report_solved_conflicts
, 
 130 report_argmatch (char *args
) 
 132   ARGMATCH_ASSERT (report_args
, report_types
); 
 133   args 
= strtok (args
, ","); 
 136       int report 
= XARGMATCH ("--report", args
, 
 137                               report_args
, report_types
); 
 138       if (report 
== report_none
) 
 139         report_flag 
= report_none
; 
 141         report_flag 
|= report
; 
 143   while ((args 
= strtok (NULL
, ","))); 
 146 /*---------------------------. 
 147 | Display the help message.  | 
 148 `---------------------------*/ 
 153   /* Some efforts were made to ease the translators' task, please 
 156 GNU bison generates parsers for LALR(1) grammars.\n"), stream
); 
 159   fprintf (stream
, _("\ 
 160 Usage: %s [OPTION]... FILE\n"), program_name
); 
 164 If a long option shows an argument as mandatory, then it is mandatory\n\ 
 165 for the equivalent short option also.  Similarly for optional arguments.\n"), 
 171   -h, --help      display this help and exit\n\ 
 172   -V, --version   output version information and exit\n\ 
 173   -y, --yacc      emulate POSIX yacc\n"), stream
); 
 178   -S, --skeleton=FILE        specify the skeleton to use\n\ 
 179   -t, --debug                instrument the parser for debugging\n\ 
 180       --locations            enable locations computation\n\ 
 181   -p, --name-prefix=PREFIX   prepend PREFIX to the external symbols\n\ 
 182   -l, --no-lines             don't generate `#line' directives\n\ 
 183   -n, --no-parser            generate the tables only\n\ 
 184   -k, --token-table          include a table of token names\n\ 
 190   -d, --defines              also produce a header file\n\ 
 191   -r, --report=THINGS        also produce details on the automaton\n\ 
 192   -v, --verbose              same as `--report=state'\n\ 
 193   -b, --file-prefix=PREFIX   specify a PREFIX for output files\n\ 
 194   -o, --output=FILE          leave output to FILE\n\ 
 195   -g, --graph                also produce a VCG description of the automaton\n\ 
 200 THINGS is a list of comma separated words that can include:\n\ 
 201   `state'        describe the states\n\ 
 202   `itemset'      complete the core item sets with their closure\n\ 
 203   `lookahead'    explicitly associate lookaheads to items\n\ 
 204   `solved'       describe shift/reduce conflicts solving\n\ 
 205   `all'          include all the above information\n\ 
 206   `none'         disable the report\n\ 
 211 Report bugs to <bug-bison@gnu.org>.\n"), stream
); 
 215 /*------------------------------. 
 216 | Display the version message.  | 
 217 `------------------------------*/ 
 220 version (FILE *stream
) 
 222   /* Some efforts were made to ease the translators' task, please 
 224   fprintf (stream
, _("bison (GNU Bison) %s"), VERSION
); 
 226   fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stream
); 
 230            _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2002); 
 233 This is free software; see the source for copying conditions.  There is NO\n\ 
 234 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ 
 240 /*----------------------. 
 241 | Process the options.  | 
 242 `----------------------*/ 
 244 /* Shorts options.  */ 
 245 const char *short_options 
= "yvegdhr:ltknVo:b:p:S:T::"; 
 247 static struct option 
const long_options
[] = 
 249   /* Operation modes. */ 
 250   { "help",          no_argument
,               0,   'h' }, 
 251   { "version",       no_argument
,               0,   'V' }, 
 254   { "name-prefix",   required_argument
,   0,   'p' }, 
 255   { "include",       required_argument
,   0,   'I' }, 
 258   { "file-prefix", required_argument
,   0,   'b' }, 
 259   { "output",      required_argument
,   0,   'o' }, 
 260   { "output-file", required_argument
,   0,   'o' }, 
 261   { "graph",       optional_argument
,   0,   'g' }, 
 262   { "report",      required_argument
,   0,   'r' }, 
 263   { "verbose",     no_argument
,         0,   'v' }, 
 266   { "trace",         optional_argument
,   0,     'T' }, 
 268   /* FIXME: semantic parsers will output an `include' of an 
 269      output file: be sure that the naem included is indeed the name of 
 270      the output file.  */ /* FIXME Should we activate this options ? 
 272   { "output",      required_argument
,     0, 'o' }, 
 273   { "file-prefix", required_argument
,     0, 'b' }, 
 274   { "name-prefix", required_argument
,     0, 'p' }, 
 277    * Percent and command line declarations. 
 281   { "defines",     optional_argument
,   0,   'd' }, 
 283   /* Operation modes.  */ 
 284   { "fixed-output-files", no_argument
,  0,   'y' }, 
 285   { "yacc",               no_argument
,  0,   'y' }, 
 288   { "debug",          no_argument
,               0,   't' }, 
 289   { "locations",      no_argument
, &locations_flag
,     1 }, 
 290   { "no-lines",       no_argument
,               0,   'l' }, 
 291   { "no-parser",      no_argument
,               0,   'n' }, 
 292   { "raw",            no_argument
,               0,     0 }, 
 293   { "skeleton",       required_argument
,         0,   'S' }, 
 294   { "token-table",    no_argument
,               0,   'k' }, 
 299 /* Under DOS, there is no difference on the case.  This can be 
 300    troublesome when looking for `.tab' etc.  */ 
 302 # define AS_FILE_NAME(File) (strlwr (File), (File)) 
 304 # define AS_FILE_NAME(File) (File) 
 308 getargs (int argc
, char *argv
[]) 
 312   while ((c 
= getopt_long (argc
, argv
, short_options
, long_options
, NULL
)) != EOF
) 
 316         /* Certain long options cause getopt_long to return 0.  */ 
 332         /* Here, the -g and --graph=FILE options are differentiated.  */ 
 334         spec_graph_file 
= AS_FILE_NAME (optarg
); 
 338         report_flag 
|= report_states
; 
 342         skeleton 
= AS_FILE_NAME (optarg
); 
 346         include 
= AS_FILE_NAME (optarg
); 
 350         /* Here, the -d and --defines options are differentiated.  */ 
 353           spec_defines_file 
= AS_FILE_NAME (optarg
); 
 361         token_table_flag 
= 1; 
 373         spec_outfile 
= AS_FILE_NAME (optarg
); 
 377         spec_file_prefix 
= AS_FILE_NAME (optarg
); 
 381         spec_name_prefix 
= optarg
; 
 385         report_argmatch (optarg
); 
 389         trace_argmatch (optarg
); 
 393         fprintf (stderr
, _("Try `%s --help' for more information.\n"), 
 400       fprintf (stderr
, _("%s: no grammar file given\n"), program_name
); 
 403   if (optind 
< argc 
- 1) 
 404     fprintf (stderr
, _("%s: extra arguments ignored after `%s'\n"), 
 405              program_name
, argv
[optind
]); 
 407   infile 
= argv
[optind
];