bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Main] New options support (Forget my previous patch, this one is be


From: Pascal Bart
Subject: Re: [Main] New options support (Forget my previous patch, this one is better)
Date: Tue, 18 Sep 2001 23:14:29 +0000 (GMT)

Sorry for this permutation, but I did this patch long time ago :|, well
take care of the function option_strcmp in flex.c which is difficulte to
see.  So I'm ever waiting your comments :).

? src/options.c
? src/options.h
Index: ChangeLog
===================================================================
RCS file: /cvsroot/bison/bison/ChangeLog,v
retrieving revision 1.210
diff -u -r1.210 ChangeLog
--- ChangeLog   2001/09/07 16:50:01     1.210
+++ ChangeLog   2001/09/18 21:10:12
@@ -1,3 +1,30 @@
+2001-09-18  Pascal Bart  <address@hidden>
+
+       * src/lex.c (parse_percent_token): Change type of variable `tx', which
+       is now an option_table_struct*.
+       (option_strcmp): New function option_strcmp.
+       (parse_percent_token): Call option_strcmp.
+       * src/getargs.c (xalloc.h, options.h): Include it.
+       (getargs): Call create_long_option_table.
+       (getargs): Free longopts at the end of the function.
+       (shortopts): Move in options.c.
+       * src/options.c (create_long_option_table): New function.  Convert
+       information from option_table to option structure.
+       * src/reader.c (options.h): Include it.
+
+       * src/Makefile.am: Adjust.
+       * src/options.c (option_table): Create from longopts and percent_table.
+       * src/getargs.c (longopts): Delete.
+       * src/lex.c (struct percent_table_struct): Delete.
+       (percent_table): Delete.
+       (options.h): Include it.
+       * src/options.c: Create.
+       * src/options.h: Create.
+       Copy enum token_e from `lex.h'.
+       Declare enum opt_access_e.
+       Define struct option_table_struct.
+       * src/lex.h: Delete enum token_e.
+
 2001-09-07  Pascal Bart  <address@hidden>

        * src/output.c (output): Delete call to reader_output_yylsp.
Index: src/Makefile.am
===================================================================
RCS file: /cvsroot/bison/bison/src/Makefile.am,v
retrieving revision 1.29
diff -u -r1.29 Makefile.am
--- src/Makefile.am     2001/09/02 15:43:29     1.29
+++ src/Makefile.am     2001/09/18 21:10:13
@@ -14,7 +14,7 @@
     derives.c  \
     files.c getargs.c gram.c lalr.c lex.c main.c nullable.c \
     output.c print_graph.c \
-    muscle_tab.c       \
+    muscle_tab.c options.c \
     print.c reader.c reduce.c symtab.c warshall.c vcg.c

 EXTRA_bison_SOURCES = vmsgetargs.c
@@ -23,7 +23,7 @@
  derives.h \
  files.h getargs.h gram.h lalr.h lex.h nullable.h \
  output.h print_graph.h        \
- muscle_tab.h \
+ muscle_tab.h options.h \
  print.h reader.h reduce.h state.h symtab.h warshall.h system.h \
  types.h vcg.h vcg_defaults.h

Index: src/getargs.c
===================================================================
RCS file: /cvsroot/bison/bison/src/getargs.c,v
retrieving revision 1.24
diff -u -r1.24 getargs.c
--- src/getargs.c       2001/08/06 09:22:33     1.24
+++ src/getargs.c       2001/09/18 21:10:13
@@ -24,6 +24,8 @@
 #include "files.h"
 #include "complain.h"
 #include "getargs.h"
+#include "xalloc.h"
+#include "options.h"

 int debug_flag = 0;
 int defines_flag = 0;
@@ -39,37 +41,6 @@
 const char *skeleton = NULL;

 extern char *program_name;
-const char *shortopts = "yvgdhrltknVo:b:p:S:";
-static struct option longopts[] =
-{
-  /* Operation modes. */
-  {"help",             no_argument,    0, 'h'},
-  {"version",          no_argument,    0, 'V'},
-  {"yacc",             no_argument,    0, 'y'},
-  {"fixed-output-files",no_argument,   0, 'y'},
-
-  /* Parser. */
-  {"skeleton",         required_argument,      0, 'S'},
-  {"debug",            no_argument,            0, 'd'},
-  {"locations",                no_argument,    &locations_flag, 1},
-  /* was 'a';  apparently unused -wjh */
-  {"name-prefix",      required_argument,      0, 'p'},
-  {"no-lines",         no_argument,            0, 'l'},
-  {"no-parser",                no_argument,            0, 'n'},
-  {"raw",              no_argument,            0, 'r'},
-  {"token-table",      no_argument,            0, 'k'},
-
-  /* Output. */
-  {"defines",          no_argument,            0, 'd'},
-  {"verbose",          no_argument,            0, 'v'},
-  {"file-prefix",      required_argument,      0, 'b'},
-  {"output-file",      required_argument,      0, 'o'},
-  {"graph",            no_argument,            0, 'g'},
-
-  /* Hidden. */
-  {"statistics",       no_argument,    &statistics_flag, 1},
-  {0, 0, 0, 0}
-};

 /*---------------------------.
 | Display the help message.  |
@@ -161,6 +132,7 @@
 {
   int c;

+  create_long_option_table ();
   while ((c = getopt_long (argc, argv, shortopts, longopts, NULL)) != EOF)
     switch (c)
       {
@@ -234,6 +206,7 @@
        exit (1);
       }

+  XFREE (longopts);
   if (optind == argc)
     {
       fprintf (stderr, _("%s: no grammar file given\n"), program_name);
Index: src/lex.c
===================================================================
RCS file: /cvsroot/bison/bison/src/lex.c,v
retrieving revision 1.37
diff -u -r1.37 lex.c
--- src/lex.c   2001/08/30 00:41:37     1.37
+++ src/lex.c   2001/09/18 21:10:13
@@ -23,6 +23,7 @@
 #include "files.h"
 #include "getopt.h"            /* for optarg */
 #include "symtab.h"
+#include "options.h"
 #include "lex.h"
 #include "xalloc.h"
 #include "complain.h"
@@ -509,60 +510,23 @@
     }
 }

-/* the following table dictates the action taken for the various %
-   directives.  A set_flag value causes the named flag to be set.  A
-   retval action returns the code.  */
-struct percent_table_struct
-{
-  const char *name;
-  void *set_flag;
-  int retval;
-};
+/* This function is a strcmp, which doesn't differentiate `-' and `_'
+   chars.  */

-struct percent_table_struct percent_table[] =
+static int
+option_strcmp (const char *left, const char *right)
 {
-  { "token",           NULL,                   tok_token },
-  { "term",            NULL,                   tok_token },
-  { "nterm",           NULL,                   tok_nterm },
-  { "type",            NULL,                   tok_type },
-  { "guard",           NULL,                   tok_guard },
-  { "union",           NULL,                   tok_union },
-  { "expect",          NULL,                   tok_expect },
-  { "thong",           NULL,                   tok_thong },
-  { "start",           NULL,                   tok_start },
-  { "left",            NULL,                   tok_left },
-  { "right",           NULL,                   tok_right },
-  { "nonassoc",                NULL,                   tok_nonassoc },
-  { "binary",          NULL,                   tok_nonassoc },
-  { "prec",            NULL,                   tok_prec },
-  { "locations",       &locations_flag,        tok_noop },     /* -l */
-  { "no_lines",                &no_lines_flag,         tok_noop },     /* -l */
-  { "raw",             NULL,                   tok_obsolete }, /* -r */
-  { "token_table",     &token_table_flag,      tok_noop },     /* -k */
-  { "yacc",            &yacc_flag,             tok_noop },     /* -y */
-  { "fixed_output_files",&yacc_flag,           tok_noop },     /* -y */
-  { "defines",         &defines_flag,          tok_noop },     /* -d */
-  { "no_parser",       &no_parser_flag,        tok_noop },     /* -n */
-#if 0
-  /* For the time being, this is not enabled yet, while it's possible
-     though, since we use obstacks.  The only risk is with semantic
-     parsers which will output an `include' of an output file: be sure
-     that the naem included is indeed the name of the output file.  */
-  { "output_file",     &spec_outfile,          tok_setopt },   /* -o */
-  { "file_prefix",     &spec_file_prefix,      tok_setopt },   /* -b */
-  { "name_prefix",     &spec_name_prefix,      tok_setopt },   /* -p */
-#endif
-  { "header_extension",        NULL,                   tok_hdrext },
-  { "source_extension",        NULL,                   tok_srcext },
-  { "define",          NULL,                   tok_define },
-  { "verbose",         &verbose_flag,          tok_noop },     /* -v */
-  { "debug",           &debug_flag,            tok_noop },     /* -t */
-  { "skeleton",                NULL,                   tok_skel },     /* -S */
-  { "semantic_parser", &semantic_parser,       tok_noop },
-  { "pure_parser",     &pure_parser,           tok_noop },
+    const unsigned char *l, *r;
+    int c;

-  { NULL, NULL, tok_illegal}
-};
+    assert(left != NULL && right != NULL);
+    l = (const unsigned char *)left;
+    r = (const unsigned char *)right;
+    while (((c = *l - *r++) == 0 && *l != '\0')
+          || ((*l == '-' || *l == '_') && (*r == '_' || *r == '-')))
+        l++;
+    return c;
+}

 /* Parse a token which starts with %.
    Assumes the % has already been read and discarded.  */
@@ -571,7 +535,7 @@
 parse_percent_token (void)
 {
   int c;
-  struct percent_table_struct *tx;
+  const struct option_table_struct *tx;

   c = getc (finput);

@@ -616,8 +580,9 @@
   token_buffer = obstack_finish (&token_obstack);

   /* table lookup % directive */
-  for (tx = percent_table; tx->name; tx++)
-    if (strcmp (token_buffer + 1, tx->name) == 0)
+  for (tx = option_table; tx->name; tx++)
+    if ((tx->access == opt_percent || tx->access == opt_both)
+       && option_strcmp (token_buffer + 1, tx->name) == 0)
       break;

   if (tx->set_flag)
@@ -626,7 +591,7 @@
       return tok_noop;
     }

-  switch (tx->retval)
+  switch (tx->ret_val)
     {
     case tok_setopt:
       *((char **) (tx->set_flag)) = optarg;
@@ -638,5 +603,5 @@
       break;
     }

-  return tx->retval;
+  return tx->ret_val;
 }
Index: src/lex.h
===================================================================
RCS file: /cvsroot/bison/bison/src/lex.h,v
retrieving revision 1.17
diff -u -r1.17 lex.h
--- src/lex.h   2001/08/30 00:41:37     1.17
+++ src/lex.h   2001/09/18 21:10:13
@@ -21,42 +21,6 @@
 #ifndef LEX_H_
 # define LEX_H_

-/* Token-type codes. */
-typedef enum token_e
-  {
-    tok_eof,
-    tok_identifier,
-    tok_comma,
-    tok_colon,
-    tok_semicolon,
-    tok_bar,
-    tok_left_curly,
-    tok_two_percents,
-    tok_percent_left_curly,
-    tok_token,
-    tok_nterm,
-    tok_guard,
-    tok_type,
-    tok_union,
-    tok_start,
-    tok_left,
-    tok_right,
-    tok_nonassoc,
-    tok_prec,
-    tok_typename,
-    tok_number,
-    tok_expect,
-    tok_thong,
-    tok_hdrext,
-    tok_srcext,
-    tok_define,
-    tok_skel,
-    tok_noop,
-    tok_setopt,
-    tok_illegal,
-    tok_obsolete
-  } token_t;
-
 extern const char *token_buffer;
 extern bucket *symval;
 extern int numval;
Index: src/reader.c
===================================================================
RCS file: /cvsroot/bison/bison/src/reader.c,v
retrieving revision 1.86
diff -u -r1.86 reader.c
--- src/reader.c        2001/09/07 16:50:01     1.86
+++ src/reader.c        2001/09/18 21:10:14
@@ -28,6 +28,7 @@
 #include "files.h"
 #include "xalloc.h"
 #include "symtab.h"
+#include "options.h"
 #include "lex.h"
 #include "gram.h"
 #include "complain.h"

Pascal Bart (address@hidden)

Attachment: options.c
Description: Text document

Attachment: options.h
Description: Text document


reply via email to

[Prev in Thread] Current Thread [Next in Thread]