]> git.saurik.com Git - bison.git/blobdiff - src/getargs.c
* tests/actions.at (Actions after errors): New test case.
[bison.git] / src / getargs.c
index 0cec1a03ede3ce861a2017355a81ab2f10333276..92e9ef4ea3bd701c2e1178c8699adfc02db12d33 100644 (file)
@@ -1,5 +1,5 @@
 /* Parse command line arguments for bison.
 /* Parse command line arguments for bison.
-   Copyright 1984, 1986, 1989, 1992, 2000, 2001, 2002
+   Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -22,7 +22,9 @@
 #include "system.h"
 #include "getopt.h"
 #include "argmatch.h"
 #include "system.h"
 #include "getopt.h"
 #include "argmatch.h"
+#include "error.h"
 #include "complain.h"
 #include "complain.h"
+#include "struniq.h"
 #include "getargs.h"
 #include "files.h"
 
 #include "getargs.h"
 #include "files.h"
 
@@ -31,17 +33,79 @@ int defines_flag = 0;
 int locations_flag = 0;
 int no_lines_flag = 0;
 int no_parser_flag = 0;
 int locations_flag = 0;
 int no_lines_flag = 0;
 int no_parser_flag = 0;
-int report_flag = 0;
+int report_flag = report_none;
 int token_table_flag = 0;
 int yacc_flag = 0;     /* for -y */
 int graph_flag = 0;
 int token_table_flag = 0;
 int yacc_flag = 0;     /* for -y */
 int graph_flag = 0;
-int trace_flag = 0;
+int trace_flag = trace_none;
 
 const char *skeleton = NULL;
 const char *include = NULL;
 
 extern char *program_name;
 
 
 const char *skeleton = NULL;
 const char *include = NULL;
 
 extern char *program_name;
 
+
+/*---------------------.
+| --trace's handling.  |
+`---------------------*/
+
+static const char * const trace_args[] =
+{
+  /* In a series of synonyms, present the most meaningful first, so
+     that argmatch_valid be more readable.  */
+  "none       - no report",
+  "scan       - scanner traces",
+  "parse      - parser traces",
+  "automaton  - contruction of the automaton",
+  "bitsets    - use of bitsets",
+  "grammar    - reading, reducing of the grammar",
+  "resource   - memory consumption (where available)",
+  "sets       - grammar sets: firsts, nullable etc.",
+  "time       - time consumption",
+  "tools      - m4 invocation and preserve the temporary file",
+  "all        - all of the above",
+  0
+};
+
+static const int trace_types[] =
+{
+  trace_none,
+  trace_scan,
+  trace_parse,
+  trace_automaton,
+  trace_bitsets,
+  trace_grammar,
+  trace_resource,
+  trace_sets,
+  trace_time,
+  trace_tools,
+  trace_all
+};
+
+
+static void
+trace_argmatch (char *args)
+{
+  ARGMATCH_ASSERT (trace_args, trace_types);
+  if (args)
+    {
+      args = strtok (args, ",");
+      do
+       {
+         int trace = XARGMATCH ("--trace", args,
+                                trace_args, trace_types);
+         if (trace == trace_none)
+           trace_flag = trace_none;
+         else
+           trace_flag |= trace;
+       }
+      while ((args = strtok (NULL, ",")));
+    }
+  else
+    trace_flag = trace_all;
+}
+
+
 /*----------------------.
 | --report's handling.  |
 `----------------------*/
 /*----------------------.
 | --report's handling.  |
 `----------------------*/
@@ -87,37 +151,45 @@ report_argmatch (char *args)
   while ((args = strtok (NULL, ",")));
 }
 
   while ((args = strtok (NULL, ",")));
 }
 
-/*---------------------------.
-| Display the help message.  |
-`---------------------------*/
+
+/*-------------------------------------------.
+| Display the help message and exit STATUS.  |
+`-------------------------------------------*/
+
+static void usage (int) ATTRIBUTE_NORETURN;
 
 static void
 
 static void
-usage (FILE *stream)
+usage (int status)
 {
 {
-  /* Some efforts were made to ease the translators' task, please
-     continue.  */
-  fputs (_("\
-GNU bison generates parsers for LALR(1) grammars.\n"), stream);
-  putc ('\n', stream);
+  if (status != 0)
+    fprintf (stderr, _("Try `%s --help' for more information.\n"),
+            program_name);
+  else
+    {
+      /* Some efforts were made to ease the translators' task, please
+        continue.  */
+      fputs (_("\
+GNU bison generates parsers for LALR(1) grammars.\n"), stdout);
+      putc ('\n', stdout);
 
 
-  fprintf (stream, _("\
+      fprintf (stdout, _("\
 Usage: %s [OPTION]... FILE\n"), program_name);
 Usage: %s [OPTION]... FILE\n"), program_name);
-  putc ('\n', stream);
+      putc ('\n', stdout);
 
 
-  fputs (_("\
+      fputs (_("\
 If a long option shows an argument as mandatory, then it is mandatory\n\
 for the equivalent short option also.  Similarly for optional arguments.\n"),
 If a long option shows an argument as mandatory, then it is mandatory\n\
 for the equivalent short option also.  Similarly for optional arguments.\n"),
-        stream);
-  putc ('\n', stream);
+            stdout);
+      putc ('\n', stdout);
 
 
-  fputs (_("\
+      fputs (_("\
 Operation modes:\n\
   -h, --help      display this help and exit\n\
   -V, --version   output version information and exit\n\
 Operation modes:\n\
   -h, --help      display this help and exit\n\
   -V, --version   output version information and exit\n\
-  -y, --yacc      emulate POSIX yacc\n"), stream);
-  putc ('\n', stream);
+  -y, --yacc      emulate POSIX yacc\n"), stdout);
+      putc ('\n', stdout);
 
 
-  fputs (_("\
+      fputs (_("\
 Parser:\n\
   -S, --skeleton=FILE        specify the skeleton to use\n\
   -t, --debug                instrument the parser for debugging\n\
 Parser:\n\
   -S, --skeleton=FILE        specify the skeleton to use\n\
   -t, --debug                instrument the parser for debugging\n\
@@ -126,10 +198,10 @@ Parser:\n\
   -l, --no-lines             don't generate `#line' directives\n\
   -n, --no-parser            generate the tables only\n\
   -k, --token-table          include a table of token names\n\
   -l, --no-lines             don't generate `#line' directives\n\
   -n, --no-parser            generate the tables only\n\
   -k, --token-table          include a table of token names\n\
-"), stream);
-  putc ('\n', stream);
+"), stdout);
+      putc ('\n', stdout);
 
 
-  fputs (_("\
+      fputs (_("\
 Output:\n\
   -d, --defines              also produce a header file\n\
   -r, --report=THINGS        also produce details on the automaton\n\
 Output:\n\
   -d, --defines              also produce a header file\n\
   -r, --report=THINGS        also produce details on the automaton\n\
@@ -137,10 +209,10 @@ Output:\n\
   -b, --file-prefix=PREFIX   specify a PREFIX for output files\n\
   -o, --output=FILE          leave output to FILE\n\
   -g, --graph                also produce a VCG description of the automaton\n\
   -b, --file-prefix=PREFIX   specify a PREFIX for output files\n\
   -o, --output=FILE          leave output to FILE\n\
   -g, --graph                also produce a VCG description of the automaton\n\
-"), stream);
-  putc ('\n', stream);
+"), stdout);
+      putc ('\n', stdout);
 
 
-  fputs (_("\
+      fputs (_("\
 THINGS is a list of comma separated words that can include:\n\
   `state'        describe the states\n\
   `itemset'      complete the core item sets with their closure\n\
 THINGS is a list of comma separated words that can include:\n\
   `state'        describe the states\n\
   `itemset'      complete the core item sets with their closure\n\
@@ -148,11 +220,14 @@ THINGS is a list of comma separated words that can include:\n\
   `solved'       describe shift/reduce conflicts solving\n\
   `all'          include all the above information\n\
   `none'         disable the report\n\
   `solved'       describe shift/reduce conflicts solving\n\
   `all'          include all the above information\n\
   `none'         disable the report\n\
-"), stream);
-  putc ('\n', stream);
+"), stdout);
+      putc ('\n', stdout);
 
 
-  fputs (_("\
-Report bugs to <bug-bison@gnu.org>.\n"), stream);
+      fputs (_("\
+Report bugs to <bug-bison@gnu.org>.\n"), stdout);
+    }
+
+  exit (status);
 }
 
 
 }
 
 
@@ -161,23 +236,23 @@ Report bugs to <bug-bison@gnu.org>.\n"), stream);
 `------------------------------*/
 
 static void
 `------------------------------*/
 
 static void
-version (FILE *stream)
+version (void)
 {
   /* Some efforts were made to ease the translators' task, please
      continue.  */
 {
   /* Some efforts were made to ease the translators' task, please
      continue.  */
-  fprintf (stream, _("bison (GNU Bison) %s"), VERSION);
-  putc ('\n', stream);
-  fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stream);
-  putc ('\n', stream);
+  printf (_("bison (GNU Bison) %s"), VERSION);
+  putc ('\n', stdout);
+  fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
+  putc ('\n', stdout);
 
 
-  fprintf (stream,
+  fprintf (stdout,
           _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2002);
 
   fputs (_("\
 This is free software; see the source for copying conditions.  There is NO\n\
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
 "),
           _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2002);
 
   fputs (_("\
 This is free software; see the source for copying conditions.  There is NO\n\
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
 "),
-        stream);
+        stdout);
 }
 
 
 }
 
 
@@ -186,7 +261,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
 `----------------------*/
 
 /* Shorts options.  */
 `----------------------*/
 
 /* Shorts options.  */
-const char *short_options = "yvegdhr:ltknVo:b:p:S:";
+const char *short_options = "yvegdhr:ltknVo:b:p:S:T::";
 
 static struct option const long_options[] =
 {
 
 static struct option const long_options[] =
 {
@@ -207,19 +282,7 @@ static struct option const long_options[] =
   { "verbose",    no_argument,         0,   'v' },
 
   /* Hidden. */
   { "verbose",    no_argument,         0,   'v' },
 
   /* Hidden. */
-  { "trace",         no_argument,   &trace_flag,     1 },
-
-  /* FIXME: semantic parsers will output an `include' of an
-     output file: be sure that the naem included is indeed the name of
-     the output file.  */ /* FIXME Should we activate this options ?
-     */
-  { "output",      required_argument,     0, 'o' },
-  { "file-prefix", required_argument,     0, 'b' },
-  { "name-prefix", required_argument,     0, 'p' },
-
-  /*
-   * Percent and command line declarations.
-   */
+  { "trace",         optional_argument,   0,     'T' },
 
   /* Output.  */
   { "defines",     optional_argument,   0,   'd' },
 
   /* Output.  */
   { "defines",     optional_argument,   0,   'd' },
@@ -265,12 +328,11 @@ getargs (int argc, char *argv[])
        break;
 
       case 'h':
        break;
 
       case 'h':
-       usage (stdout);
-       exit (0);
+       usage (EXIT_SUCCESS);
 
       case 'V':
 
       case 'V':
-       version (stdout);
-       exit (0);
+       version ();
+       exit (EXIT_SUCCESS);
 
       case 'g':
        /* Here, the -g and --graph=FILE options are differentiated.  */
 
       case 'g':
        /* Here, the -g and --graph=FILE options are differentiated.  */
@@ -329,20 +391,22 @@ getargs (int argc, char *argv[])
        report_argmatch (optarg);
        break;
 
        report_argmatch (optarg);
        break;
 
+      case 'T':
+       trace_argmatch (optarg);
+       break;
+
       default:
       default:
-       fprintf (stderr, _("Try `%s --help' for more information.\n"),
-                program_name);
-       exit (1);
+       usage (EXIT_FAILURE);
       }
 
       }
 
-  if (optind == argc)
+  if (argc - optind != 1)
     {
     {
-      fprintf (stderr, _("%s: no grammar file given\n"), program_name);
-      exit (1);
+      if (argc - optind < 1)
+       error (0, 0, _("missing operand after `%s'"), argv[argc - 1]);
+      else
+       error (0, 0, _("extra operand `%s'"), argv[optind + 1]);
+      usage (EXIT_FAILURE);
     }
     }
-  if (optind < argc - 1)
-    fprintf (stderr, _("%s: extra arguments ignored after `%s'\n"),
-            program_name, argv[optind]);
 
 
-  infile = argv[optind];
+  current_file = grammar_file = struniq_new (argv[optind]);
 }
 }