bison-patches
[Top][All Lists]
Advanced

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

[PATCH] More %define/%code encapsulation


From: Paolo Bonzini
Subject: [PATCH] More %define/%code encapsulation
Date: Tue, 16 Jan 2007 10:50:22 +0100
User-agent: Thunderbird 1.5.0.9 (Macintosh/20061207)

This patch defines the conditional macros for %define and %code. In addition, it changes b4_percent_code_unqualified to simply b4_percent_code() since the special casing is not necessary.

I tested the macros manually, with a modified yacc.c. If you want I can try adding testcases with a specially written skeleton that exercises the new macros.

Together with a patch to gnulib to add a javaexec-script module, this is the last prerequisite to the Java skeleton.

Ok?

Paolo
2006-11-16  Paolo Bonzini  <address@hidden>

        * data/bison.m4 (b4_percent_define_ifdef, b4_percent_define_if,
        b4_percent_define_case, b4_percent_define_ifval, b4_percent_code_ifdef):
        New.
        (b4_percent_code_get): Map unqualified %code to b4_percent_code().
        * src/parse-gram.y (Unqualified %code): Change muscle name to
        b4_percent_code().

Index: src/parse-gram.y
===================================================================
RCS file: /sources/bison/bison/src/parse-gram.y,v
retrieving revision 1.114
diff -u -r1.114 parse-gram.y
--- src/parse-gram.y    16 Jan 2007 06:16:04 -0000      1.114
+++ src/parse-gram.y    16 Jan 2007 09:46:27 -0000
@@ -324,7 +324,7 @@
     }
 | "%code" braceless
     {
-      muscle_code_grow ("percent_code_unqualified", $2, @2);
+      muscle_code_grow ("percent_code()", $2, @2);
       code_scanner_last_string_free ();
     }
 | "%code" ID braceless
Index: data/bison.m4
===================================================================
RCS file: /sources/bison/bison/data/bison.m4,v
retrieving revision 1.12
diff -u -r1.12 data/bison.m4
--- data/bison.m4       16 Jan 2007 06:16:03 -0000      1.12
+++ data/bison.m4       16 Jan 2007 09:40:21 -0000
@@ -349,6 +349,46 @@
 [m4_define([b4_percent_define_skeleton_variables(]$1[)])dnl
 m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])])])
 
+# b4_percent_define_ifdef(VARIABLE, IF-TRUE, IF-FALSE)
+# ----------------------------------------------------
+# If the %define variable VARIABLE is defined, expand IF-TRUE, else expand
+# IF-EMPTY.  Also, record the skeleton's usage of VARIABLE by defining
+# b4_percent_define_skeleton_variables(VARIABLE).
+m4_define([b4_percent_define_ifdef],
+[m4_ifdef([b4_percent_define(]$1[)],
+         [m4_define([b4_percent_define_skeleton_variables(]$1[)])$2],
+         [$3])])
+
+# b4_percent_define_if(VARIABLE, IF-TRUE, IF-FALSE)
+# -------------------------------------------------
+# If the %define variable VARIABLE is defined to anything but 0, evaluate 
IF-TRUE.
+# If it is defined to 0, evaluate IF-FALSE.  If it is undefined, raise an
+# error (this macro should be preceded by b4_percent_define_default).
+# Also, record the skeleton's usage of VARIABLE by defining
+# b4_percent_define_skeleton_variables(VARIABLE).
+m4_define([b4_percent_define_if],
+[b4_percent_define_ifdef([$1],
+                        [m4_if(m4_quote(b4_percent_define_get([$1])),
+                               [0], [$3], [$2])],
+                        [m4_fatal([undefined %define variable passed to 
b4_percent_define_if: ]$1)])])
+
+# b4_percent_define_case(VARIABLE, [VALUE1, THEN1]..., ELSE)
+# ----------------------------------------------------------
+# If the %define variable VARIABLE is defined to VALUE1, evaluate THEN1, and
+# so on.  If none of the values match, expaand ELSE.  The default value is
+# empty.  Also, record the skeleton's usage of VARIABLE by defining
+# b4_percent_define_skeleton_variables(VARIABLE).
+m4_define([b4_percent_define_case],
+[m4_case(m4_quote(b4_percent_define_get([$1])), m4_shift($@))])
+
+# b4_percent_define_ifval(VARIABLE, IF-NOT-EMPTY, IF-EMPTY)
+# ---------------------------------------------------------
+# If the %define variable VARIABLE is defined and not empty, expand
+# IF-NOT-EMPTY, else expand IF-EMPTY.  Also, record the skeleton's usage of
+# VARIABLE by defining b4_percent_define_skeleton_variables(VARIABLE).
+m4_define([b4_percent_define_ifval],
+[m4_ifval(m4_quote(b4_percent_define_get([$1])), [$2], [$3])])
+
 # b4_percent_define_default(VARIABLE, DEFAULT)
 # --------------------------------------------
 # If the %define variable VARIABLE is undefined, set its value to DEFAULT.
@@ -364,9 +404,9 @@
 # --------------------------------
 # If any %code blocks for QUALIFIER are defined, emit them beginning with a
 # comment and ending with synclines and a newline.  If QUALIFIER is not
-# specified (thus, b4_percent_code_get is invoked without parens), do this for
-# the unqualified %code blocks.  Also, record the skeleton's usage of QUALIFIER
-# (if specified) by defining b4_percent_code_skeleton_qualifiers(QUALIFIER).
+# specified or empty, do this for the unqualified %code blocks.  Also, record
+# the skeleton's usage of QUALIFIER (if specified) by defining
+# b4_percent_code_skeleton_qualifiers(QUALIFIER).
 #
 # For example, to emit any unqualified %code blocks followed by any %code
 # blocks for the qualifier foo:
@@ -374,9 +414,8 @@
 #   b4_percent_code_get
 #   b4_percent_code_get([[foo]])
 m4_define([b4_percent_code_get],
-[m4_pushdef([b4_macro_name], [[b4_percent_code]]m4_if([$#], [1], [[[(]$1[)]]],
-                                                      [[[_unqualified]]]))dnl
-m4_if([$#], [1], [m4_define([b4_percent_code_skeleton_qualifiers(]$1[)])])dnl
+[m4_pushdef([b4_macro_name], [[b4_percent_code(]$1[)]])dnl
+m4_ifval([$1], [m4_define([b4_percent_code_skeleton_qualifiers(]$1[)])])dnl
 m4_ifdef(b4_macro_name,
 [b4_comment([m4_if([$#], [0], [[Unqualified %code]],
                    [[%code "]$1["]])[ blocks.]])
@@ -384,6 +423,17 @@
 ])dnl
 m4_popdef([b4_macro_name])])
 
+# b4_percent_code_ifdef(QUALIFIER, IF-TRUE, IF-FALSE)
+# ---------------------------------------------------
+# If any %code blocks for QUALIFIER (or unqualified %code blocks if
+# QUALIFIER is empty) are defined, expand IF-TRUE, else expand IF-FALSE.
+# Also, record the skeleton's usage of QUALIFIER (if specified) by defining
+# b4_percent_code_skeleton_qualifiers(QUALIFIER).
+m4_define([b4_percent_code_ifdef],
+[m4_ifdef([b4_percent_code(]$1[)],
+          [m4_ifval([$1], 
[m4_define([b4_percent_code_skeleton_qualifiers(]$1[)])])$2],
+         [$3])])
+
 
 ## --------------------------------------------------------- ##
 ## After processing the skeletons, check that all the user's ##

reply via email to

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