bison-patches
[Top][All Lists]
Advanced

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

FYI: Support %define "KEY" {VALUE}


From: Akim Demaille
Subject: FYI: Support %define "KEY" {VALUE}
Date: Thu, 13 Jul 2006 10:56:49 +0200
User-agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux)

Index: ChangeLog
from  Akim Demaille  <address@hidden>

        * src/scan-code.h, src/scan-code.l (translate_action)
        (translate_rule_action, translate_symbol_action, translate_code):
        Return char *, not const char *.
        * src/parse-gram.y (declaration): Rename as...
        (prologue_declaration): this.
        (string_content): Remove this nonterminal, use STRING.
        (braceless, content, content.opt): New nonterminal.
        Use them.
        (%define): Now accept content.opt, i.e., accept also BRACED_CODE
        as value.
        * src/scan-gram.l (getargs.h): Don't include it.

Index: src/parse-gram.y
===================================================================
RCS file: /cvsroot/bison/bison/src/parse-gram.y,v
retrieving revision 1.85
diff -u -u -r1.85 parse-gram.y
--- src/parse-gram.y 9 Jul 2006 20:36:33 -0000 1.85
+++ src/parse-gram.y 13 Jul 2006 08:11:28 -0000
@@ -54,7 +54,14 @@

 static char const *char_name (char);

-static void add_param (char const *, char *, location);
+/** Add a lex-param or a parse-param.
+ *
+ * \param type  \a lex_param or \a parse_param
+ * \param decl  the formal argument
+ * \param loc   the location in the source.
+ */
+static void add_param (char const *type, char *decl, location loc);
+

 static symbol_class current_class = unknown_sym;
 static uniqstr current_type = NULL;
@@ -170,2 +177,2 @@
 %type <character> CHAR
 %printer { fputs (char_name ($$), stderr); } CHAR

-%type <chars> STRING string_content "{...}" PROLOGUE EPILOGUE
+/* braceless is not to be used for rule or symbol actions, as it
+   calls translate_code. */
+%type <chars> STRING "{...}" "%{...%}" EPILOGUE braceless content content.opt
 %printer { fputs (quotearg_style (c_quoting_style, $$), stderr); }
-         STRING string_content
-%printer { fprintf (stderr, "{\n%s\n}", $$); } "{...}" PROLOGUE EPILOGUE
+         STRING
+%printer { fprintf (stderr, "{\n%s\n}", $$); }
+         braceless content content.opt "{...}" "%{...%}" EPILOGUE

 %type <uniqstr> TYPE ID ID_COLON
 %printer { fprintf (stderr, "<%s>", $$); } TYPE
@@ -192,1 +202,1 @@
 %%

 input:
-  declarations "%%" grammar epilogue.opt
+  prologue_declarations "%%" grammar epilogue.opt
 ;


@@ -200,2 +210,2 @@
        | Declarations: before the first %%.  |
        `------------------------------------*/

-declarations:
+prologue_declarations:
   /* Nothing */
-| declarations declaration
+| prologue_declarations prologue_declaration
 ;

-declaration:
+prologue_declaration:
   grammar_declaration
-| PROLOGUE
-    {
-      prologue_augment (translate_code ($1, @1), @1, union_seen);
-    }
-| "%after-header" "{...}"
-    {
-      /* Remove the '{', and replace the '}' with '\n'.  */
-      $2[strlen ($2) - 1] = '\n';
-      prologue_augment (translate_code ($2+1, @2), @2, true);
-    }
-| "%before-header" "{...}"
-    {
-      /* Remove the '{', and replace the '}' with '\n'.  */
-      $2[strlen ($2) - 1] = '\n';
-      prologue_augment (translate_code ($2+1, @2), @2, false);
-    }
-| "%debug"                                 { debug_flag = true; }
-| "%define" string_content
-    {
-      static char one[] = "1";
-      muscle_insert ($2, one);
-    }
-| "%define" string_content string_content  { muscle_insert ($2, $3); }
-| "%defines"                               { defines_flag = true; }
-| "%end-header" "{...}"
-    {
-      /* Remove the '{', and replace the '}' with '\n'.  */
-      $2[strlen ($2) - 1] = '\n';
-      muscle_code_grow ("end_header", translate_code ($2+1, @2), @2);
-    }
-| "%error-verbose"                         { error_verbose = true; }
-| "%expect" INT                            { expected_sr_conflicts = $2; }
-| "%expect-rr" INT                        { expected_rr_conflicts = $2; }
-| "%file-prefix" "=" string_content        { spec_file_prefix = $3; }
+| "%{...%}"     { prologue_augment (translate_code ($1, @1), @1, union_seen); }
+| "%after-header" braceless        { prologue_augment ($2, @2, true); }
+| "%before-header" braceless       { prologue_augment ($2, @2, false); }
+| "%debug"                         { debug_flag = true; }
+| "%define" STRING content.opt     { muscle_insert ($2, $3); }
+| "%defines"                       { defines_flag = true; }
+| "%end-header" braceless          { muscle_code_grow ("end_header", $2, @2); }
+| "%error-verbose"                 { error_verbose = true; }
+| "%expect" INT                    { expected_sr_conflicts = $2; }
+| "%expect-rr" INT                { expected_rr_conflicts = $2; }
+| "%file-prefix" "=" STRING        { spec_file_prefix = $3; }
 | "%glr-parser"
     {
       nondeterministic_parser = true;
@@ -250,24 +237,19 @@
     {
       muscle_code_grow ("initial_action", translate_symbol_action ($2, @2), 
@2);
     }
-| "%lex-param" "{...}"                    { add_param ("lex_param", $2, @2); }
-| "%locations"                             { locations_flag = true; }
-| "%name-prefix" "=" string_content        { spec_name_prefix = $3; }
-| "%no-lines"                              { no_lines_flag = true; }
-| "%nondeterministic-parser"              { nondeterministic_parser = true; }
-| "%output" "=" string_content             { spec_outfile = $3; }
-| "%parse-param" "{...}"                  { add_param ("parse_param", $2, @2); 
}
-| "%pure-parser"                           { pure_parser = true; }
-| "%require" string_content                { version_check (&@2, $2); }
-| "%skeleton" string_content               { skeleton = $2; }
-| "%start-header" "{...}"
-    {
-      /* Remove the '{', and replace the '}' with '\n'.  */
-      $2[strlen ($2) - 1] = '\n';
-      muscle_code_grow ("start_header", translate_code ($2+1, @2), @2);
-    }
-| "%token-table"                           { token_table_flag = true; }
-| "%verbose"                               { report_flag = report_states; }
-| "%yacc"                                  { yacc_flag = true; }
+| "%lex-param" "{...}"         { add_param ("lex_param", $2, @2); }
+| "%locations"                  { locations_flag = true; }
+| "%name-prefix" "=" STRING     { spec_name_prefix = $3; }
+| "%no-lines"                   { no_lines_flag = true; }
+| "%nondeterministic-parser"   { nondeterministic_parser = true; }
+| "%output" "=" STRING          { spec_outfile = $3; }
+| "%parse-param" "{...}"       { add_param ("parse_param", $2, @2); }
+| "%pure-parser"                { pure_parser = true; }
+| "%require" STRING             { version_check (&@2, $2); }
+| "%skeleton" STRING            { skeleton = $2; }
+| "%start-header" braceless     { muscle_code_grow ("start_header", $2, @2); }
+| "%token-table"                { token_table_flag = true; }
+| "%verbose"                    { report_flag = report_states; }
+| "%yacc"                       { yacc_flag = true; }
 | /*FIXME: Err?  What is this horror doing here? */ ";"
 ;

@@ -478,1 +460,1 @@
 ;


+/*-----------*
+ | content.  |
+ *-----------*/
+
+content:
+  STRING
+| braceless
+;
+
+/* Some content or "1" by default. */
+content.opt:
+  /* Nothing. */
+    {
+      static char one[] = "1";
+      $$ = one;
+    }
+| content
+;
+
+
+braceless:
+  "{...}"
+    {
+      $1[strlen ($1) - 1] = '\n';
+      $$ = translate_code ($1 + 1, @1);
+    }
+;
+
+
 /*---------------*
  | Identifiers.  |
  *---------------*/
@@ -515,2 +526,2 @@
     }
 ;

-/* A string used for its contents.  Don't quote it.  */
-string_content:
-  STRING
-    { $$ = $1; }
-;
-
-
 epilogue.opt:
   /* Nothing.  */
 | "%%" EPILOGUE
@@ -615,2 +619,2 @@
   gram_scanner_last_string_free ();
 }

+
 static void
 version_check (location const *loc, char const *version)
 {
Index: src/scan-code.h
===================================================================
RCS file: /cvsroot/bison/bison/src/scan-code.h,v
retrieving revision 1.2
diff -u -u -r1.2 scan-code.h
--- src/scan-code.h 26 Jun 2006 03:28:57 -0000 1.2
+++ src/scan-code.h 13 Jul 2006 08:11:28 -0000
@@ -35,0 +35,0 @@

 /* The action of the rule R contains $$, $1 etc. referring to the values
    of the rule R. */
-const char *translate_rule_action (symbol_list *r);
+char *translate_rule_action (symbol_list *r);

 /* The action A refers to $$ and @$ only, referring to a symbol. */
-const char *translate_symbol_action (const char *a, location l);
+char *translate_symbol_action (const char *a, location l);

 /* The action contains no special escapes, just protect M4 special
    symbols.  */
-const char *translate_code (const char *a, location l);
+char *translate_code (const char *a, location l);

 #endif /* !SCAN_CODE_H_ */
Index: src/scan-code.l
===================================================================
RCS file: /cvsroot/bison/bison/src/scan-code.l,v
retrieving revision 1.9
diff -u -u -r1.9 scan-code.l
--- src/scan-code.l 9 Jul 2006 20:36:33 -0000 1.9
+++ src/scan-code.l 13 Jul 2006 08:11:28 -0000
@@ -45,0 +45,0 @@

 /* The current calling start condition: SC_RULE_ACTION or
    SC_SYMBOL_ACTION. */
-# define YY_DECL const char *code_lex (int sc_context, symbol_list *rule)
+# define YY_DECL char *code_lex (int sc_context, symbol_list *rule)
 YY_DECL;

 #define YY_USER_ACTION  location_compute (loc, &loc->end, yytext, yyleng);
@@ -376,2 +376,2 @@
    translation is for \a rule, in the context \a sc_context
    (SC_RULE_ACTION, SC_SYMBOL_ACTION, INITIAL).  */

-static const char *
+static char *
 translate_action (int sc_context, symbol_list *rule, const char *a, location l)
 {
-  const char *res;
+  char *res;
   static bool initialized = false;
   if (!initialized)
     {
@@ -398,2 +398,2 @@
   return res;
 }

-const char *
+char *
 translate_rule_action (symbol_list *rule)
 {
   return translate_action (SC_RULE_ACTION, rule, rule->action,
                           rule->action_location);
 }

-const char *
+char *
 translate_symbol_action (const char *a, location l)
 {
   return translate_action (SC_SYMBOL_ACTION, NULL, a, l);
 }

-const char *
+char *
 translate_code (const char *a, location l)
 {
   return translate_action (INITIAL, NULL, a, l);
Index: src/scan-gram.l
===================================================================
RCS file: /cvsroot/bison/bison/src/scan-gram.l,v
retrieving revision 1.96
diff -u -u -r1.96 scan-gram.l
--- src/scan-gram.l 8 Jul 2006 00:02:04 -0000 1.96
+++ src/scan-gram.l 13 Jul 2006 08:11:28 -0000
@@ -37,0 +37,0 @@

 #include "complain.h"
 #include "files.h"
-#include "getargs.h"    /* yacc_flag */
 #include "gram.h"
 #include "quotearg.h"
 #include "reader.h"





reply via email to

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