bison-patches
[Top][All Lists]
Advanced

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

Re: yacc.c does not prototype yyparse in the header


From: Akim Demaille
Subject: Re: yacc.c does not prototype yyparse in the header
Date: Mon, 2 Jul 2012 15:40:47 +0200

Hi Paul,

I'd be happy to have your opinion on this.

The installed api.prefix patch does not rename YYDEBUG.
This was annoying me, I felt uncomfortable, but I expected
that people still want to be able to -DYYDEBUG et voilĂ .
I have been bitten by the approach, as detailed in the commit
message:

    The testsuite in master has shown weird errors for the "Mulitple
    Parsers" tests: the caller of "p5.parse()" received some apparently
    random value instead of 0, while tracing p5.parse() showed that the
    function was really returning 0.
    
    It turns out that were mixing several parser headers, some generated
    without %debug, others with.  In particular the C++ parser was
    generated with %debug, i.e., with:
    
      #ifndef YYDEBUG
      # define YYDEBUG 1
      #endif
    
    and compiled separatedly from the other parser.  Yet, its header was
    included after the one of another parser, this time without %debug, i.e., 
with
    
      #ifndef YYDEBUG
      # define YYDEBUG 0
      #endif
    
    in its header.  As a result, the parser was compiled with YYDEBUG set,
    but its header was used without.  Since the layout of the objects are
    then completely different, boom.

So I chose to follow the track I was initially thinking about:
rename YYDEBUG according to api.prefix, but still use YYDEBUG
as a default value.  The NEWS file provides a rather clear (well I
hope it does) demonstration of what api.prefix does, including to
YYDEBUG:

  The following examples compares both:

    %name-prefix "bar_"               | %define api.prefix "bar_"
    %token <ival> FOO                   %token <ival> FOO
    %union { int ival; }                %union { int ival; }
    %%                                  %%
    exp: 'a';                           exp: 'a';

  bison generates:

    #ifndef BAR_FOO_H                   #ifndef BAR_FOO_H
    # define BAR_FOO_H                  # define BAR_FOO_H

    /* Enabling traces.  */             /* Enabling traces.  */
    # ifndef YYDEBUG                  | # ifndef BAR_DEBUG
                                      > #  if defined YYDEBUG
                                      > #   if YYDEBUG
                                      > #    define BAR_DEBUG 1
                                      > #   else
                                      > #    define BAR_DEBUG 0
                                      > #   endif
                                      > #  else
    #  define YYDEBUG 0               | #   define BAR_DEBUG 0
                                      > #  endif
    # endif                           | # endif

    # if YYDEBUG                      | # if BAR_DEBUG
    extern int bar_debug;               extern int bar_debug;
    # endif                             # endif

    /* Tokens.  */                      /* Tokens.  */
    # ifndef YYTOKENTYPE              | # ifndef BAR_TOKENTYPE
    #  define YYTOKENTYPE             | #  define BAR_TOKENTYPE
       enum yytokentype {             |    enum bar_tokentype {
         FOO = 258                           FOO = 258
       };                                  };
    # endif                             # endif

    #if ! defined YYSTYPE \           | #if ! defined BAR_STYPE \
     && ! defined YYSTYPE_IS_DECLARED |  && ! defined BAR_STYPE_IS_DECLARED
    typedef union YYSTYPE             | typedef union BAR_STYPE
    {                                   {
     int ival;                           int ival;
    } YYSTYPE;                        | } BAR_STYPE;
    # define YYSTYPE_IS_DECLARED 1    | # define BAR_STYPE_IS_DECLARED 1
    #endif                              #endif

    extern YYSTYPE bar_lval;          | extern BAR_STYPE bar_lval;

    int bar_parse (void);               int bar_parse (void);

    #endif /* !BAR_FOO_H  */            #endif /* !BAR_FOO_H  */

Do you agree with this approach?  Instead of the lengthy

#ifndef FOO_DEBUG
# if defined YYDEBUG
#  if YYDEBUG
#   define FOO_DEBUG 1
#  else
#   define FOO_DEBUG 0
#  endif

I was considering

#ifndef FOO_DEBUG
# if defined YYDEBUG
#  define FOO_DEBUG (!!(YYDEBUG))
# endif

If you have an opinion, I'd be happy to read about it.

Thanks!

(It is currently in the api.prefix branch).

From 07ed7083818638b61e0b0f45b916720685f6267b Mon Sep 17 00:00:00 2001
From: Akim Demaille <address@hidden>
Date: Mon, 2 Jul 2012 14:56:22 +0200
Subject: [PATCH] api.prefix: also rename YYDEBUG.

The testsuite in master has shown weird errors for the "Mulitple
Parsers" tests: the caller of p5.parse() received some apparently
random value, while tracing p5.parse() showed that the function was
consistently returning 0.

It happens when mixing several parser headers, some generated without
%debug, others with.  In particular the C++ parser was generated with
%debug, i.e., with:

  #ifndef YYDEBUG
  # define YYDEBUG 1
  #endif

and compiled separatedly.  Yet, its header was included after the one
of another parser, this time without %debug, i.e., with

  #ifndef YYDEBUG
  # define YYDEBUG 0
  #endif

in its header.  As a result, the parser was compiled with YYDEBUG set,
but its header was used without.  Since the layout of the objects are
then completely different, boom.

Therefore, do not change the value of YYDEBUG.  Rather, use it as a
default value for <API.PREFIX>DEBUG.

* data/c.m4 (b4_define_YYDEBUG): New.
* data/glr.c, data/glr.cc, data/lalr1.cc, data/yacc.c: Use it.
* NEWS: Document it.
---
 NEWS          | 17 +++++++++++++----
 data/c.m4     | 28 +++++++++++++++++++++++-----
 data/glr.c    | 22 +++++++++++-----------
 data/glr.cc   | 13 +++++--------
 data/lalr1.cc | 33 +++++++++++++++------------------
 data/yacc.c   | 18 +++++++++---------
 6 files changed, 76 insertions(+), 55 deletions(-)

diff --git a/NEWS b/NEWS
index 403265f..ec4e33a 100644
--- a/NEWS
+++ b/NEWS
@@ -94,10 +94,19 @@ GNU Bison NEWS
     # define BAR_FOO_H                  # define BAR_FOO_H
 
     /* Enabling traces.  */             /* Enabling traces.  */
-    # ifndef YYDEBUG                    # ifndef YYDEBUG
-    #  define YYDEBUG 0                 #  define YYDEBUG 0
-    # endif                             # endif
-    # if YYDEBUG                        # if YYDEBUG
+    # ifndef YYDEBUG                  | # ifndef BAR_DEBUG
+                                      > #  if defined YYDEBUG
+                                      > #   if YYDEBUG
+                                      > #    define BAR_DEBUG 1
+                                      > #   else
+                                      > #    define BAR_DEBUG 0
+                                      > #   endif
+                                      > #  else
+    #  define YYDEBUG 0               | #   define BAR_DEBUG 0
+                                      > #  endif
+    # endif                           | # endif
+
+    # if YYDEBUG                      | # if BAR_DEBUG
     extern int bar_debug;               extern int bar_debug;
     # endif                             # endif
 
diff --git a/data/c.m4 b/data/c.m4
index 0b2699a..3239c3e 100644
--- a/data/c.m4
+++ b/data/c.m4
@@ -581,14 +581,32 @@ b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE 
]b4_prefix[lval;
 ]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl
 ])
 
-# b4_declare_yydebug
+# b4_define_YYDEBUG
 # ------------------
-m4_define([b4_declare_yydebug],
+m4_define([b4_define_YYDEBUG],
 [[/* Enabling traces.  */
-#ifndef YYDEBUG
+]m4_if(b4_api_prefix, [yy],
+[[#ifndef YYDEBUG
 # define YYDEBUG ]b4_debug_flag[
-#endif
-#if YYDEBUG
+#endif]],
+[[#ifndef ]b4_api_PREFIX[DEBUG
+# if defined YYDEBUG
+#  if YYDEBUG
+#   define ]b4_api_PREFIX[DEBUG 1
+#  else
+#   define ]b4_api_PREFIX[DEBUG 0
+#  endif
+# else /* ! defined YYDEBUG */
+#  define ]b4_api_PREFIX[DEBUG ]b4_debug_flag[
+# endif /* ! defined ]b4_api_PREFIX[DEBUG */
+#endif  /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl
+])
+
+# b4_declare_yydebug
+# ------------------
+m4_define([b4_declare_yydebug],
+[b4_define_YYDEBUG[
+#if ]b4_api_PREFIX[DEBUG
 extern int ]b4_prefix[debug;
 #endif][]dnl
 ])
diff --git a/data/glr.c b/data/glr.c
index ce61160..8dd2108 100644
--- a/data/glr.c
+++ b/data/glr.c
@@ -349,7 +349,7 @@ static const ]b4_int_type_for([b4_translate])[ 
yytranslate[] =
   ]b4_translate[
 };
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
 static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
@@ -370,7 +370,7 @@ static const ]b4_int_type_for([b4_rline])[ yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
+#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -553,7 +553,7 @@ typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
    do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; }       \
    while (YYID (0))
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
 
 # ifndef YYFPRINTF
 #  define YYFPRINTF fprintf
@@ -581,12 +581,12 @@ do {                                                      
      \
    multiple parsers can coexist.  */
 int yydebug;
 
-#else /* !YYDEBUG */
+#else /* !]b4_api_PREFIX[DEBUG */
 
 # define YYDPRINTF(Args)
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
 
-#endif /* !YYDEBUG */
+#endif /* !]b4_api_PREFIX[DEBUG */
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef YYINITDEPTH
@@ -825,7 +825,7 @@ yyMemoryExhausted (yyGLRStack* yystackp)
   YYLONGJMP (yystackp->yyexception_buffer, 2);
 }
 
-#if YYDEBUG || YYERROR_VERBOSE
+#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE
 /** A printable representation of TOKEN.  */
 static inline const char*
 yytokenName (yySymbol yytoken)
@@ -962,7 +962,7 @@ yydestroyGLRState (char const *yymsg, yyGLRState 
*yys]b4_user_formals[)
                 &yys->yysemantics.yysval]b4_locuser_args([&yys->yyloc])[);
   else
     {
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
       if (yydebug)
         {
           if (yys->yysemantics.yyfirstVal)
@@ -1391,7 +1391,7 @@ yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum 
yyrule,
     }
 }
 
-#if !YYDEBUG
+#if !]b4_api_PREFIX[DEBUG
 # define YY_REDUCE_PRINT(Args)
 #else
 # define YY_REDUCE_PRINT(Args)          \
@@ -1712,7 +1712,7 @@ yyresolveAction (yySemanticOption* yyopt, yyGLRStack* 
yystackp,
   return yyflag;
 }
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
 static void
 yyreportTree (yySemanticOption* yyx, int yyindent)
 {
@@ -1767,7 +1767,7 @@ yyreportAmbiguity (yySemanticOption* yyx0,
   YYUSE (yyx0);
   YYUSE (yyx1);
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
   YYFPRINTF (stderr, "Ambiguity detected.\n");
   YYFPRINTF (stderr, "Option 1,\n");
   yyreportTree (yyx0, 2);
@@ -2551,7 +2551,7 @@ m4_popdef([b4_at_dollar])])dnl
 }
 
 /* DEBUGGING ONLY */
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
 static void yypstack (yyGLRStack* yystackp, size_t yyk)
   __attribute__ ((__unused__));
 static void yypdumpstack (yyGLRStack* yystackp) __attribute__ ((__unused__));
diff --git a/data/glr.cc b/data/glr.cc
index 427353e..0d4e365 100644
--- a/data/glr.cc
+++ b/data/glr.cc
@@ -127,7 +127,7 @@ m4_pushdef([b4_parse_param], 
m4_defn([b4_parse_param_orig]))dnl
 [  /// Build a parser object.
   ]b4_parser_class_name::b4_parser_class_name[ 
(]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
     :])[
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
     ]m4_ifset([b4_parse_param], [  ], [ :])[yydebug_ (false),
       yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
 #endif]b4_parse_param_cons[
@@ -144,7 +144,7 @@ m4_pushdef([b4_parse_param], 
m4_defn([b4_parse_param_orig]))dnl
     return ::yyparse (*this]b4_user_args[);
   }
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
   /*--------------------.
   | Print this symbol.  |
   `--------------------*/
@@ -239,10 +239,7 @@ b4_copyright([Skeleton interface for Bison GLR parsers in 
C++],
 ]b4_percent_define_ifdef([[location_type]], [],
                          [[# include "location.hh"]])[
 
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG ]b4_debug_flag[
-#endif
+]b4_define_YYDEBUG[
 
 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
    If N is 0, then set CURRENT to the empty location which ends
@@ -321,7 +318,7 @@ b4_user_stype
     virtual void error (const location_type& loc, const std::string& msg);
   private:
 
-#if YYDEBUG
+# if ]b4_api_PREFIX[DEBUG
   public:
     /// \brief Report a symbol value on the debug stream.
     /// \param yytype       The token type.
@@ -341,7 +338,7 @@ b4_user_stype
     /* Debugging.  */
     int yydebug_;
     std::ostream* yycdebug_;
-#endif
+# endif
 
 ]b4_parse_param_vars[
   };
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 337af10..14dc706 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -57,10 +57,7 @@ b4_copyright([Skeleton interface for Bison LALR(1) parsers 
in C++],
 
 ]b4_null_define[
 
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG ]b4_debug_flag[
-#endif
+]b4_define_YYDEBUG[
 
 ]b4_namespace_open[
 
@@ -100,7 +97,7 @@ b4_user_stype
     /// \returns  0 iff parsing succeeded.
     virtual int parse ();
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
     /// The current debugging stream.
     std::ostream& debug_stream () const;
     /// Set the current debugging stream.
@@ -125,7 +122,7 @@ b4_user_stype
     /// \param tok     the lookahead token.
     virtual std::string yysyntax_error_ (int yystate, int tok);
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
     /// \brief Report a symbol value on the debug stream.
     /// \param yytype       The token type.
     /// \param yyvaluep     Its semantic value.
@@ -203,10 +200,10 @@ b4_user_stype
     /// Convert the symbol name \a n to a form suitable for a diagnostic.
     static std::string yytnamerr_ (const char *n);])[
 
-]b4_token_table_if([], [[#if YYDEBUG]])[
+]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
     /// For a symbol, its name in clear.
     static const char* const yytname_[];
-]b4_token_table_if([[#if YYDEBUG]])[
+]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
     /// A type to store symbol numbers and -1.
     typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type;
     /// A `-1'-separated list of the rules' RHS.
@@ -325,7 +322,7 @@ b4_percent_code_get[]dnl
 #define YYUSE(e) ((void) (e))
 
 /* Enable debugging if requested.  */
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
 
 /* A pseudo ostream that takes yydebug_ into account.  */
 # define YYCDEBUG if (yydebug_) (*yycdebug_)
@@ -352,14 +349,14 @@ do {                                      \
     yystack_print_ ();                 \
 } while (false)
 
-#else /* !YYDEBUG */
+#else /* !]b4_api_PREFIX[DEBUG */
 
 # define YYCDEBUG if (false) std::cerr
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
 # define YY_REDUCE_PRINT(Rule)
 # define YY_STACK_PRINT()
 
-#endif /* !YYDEBUG */
+#endif /* !]b4_api_PREFIX[DEBUG */
 
 #define yyerrok                (yyerrstatus_ = 0)
 #define yyclearin      (yychar = yyempty_)
@@ -412,7 +409,7 @@ do {                                        \
   /// Build a parser object.
   ]b4_parser_class_name::b4_parser_class_name[ 
(]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
     :])[
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
     ]m4_ifset([b4_parse_param], [  ], [ :])[yydebug_ (false),
       yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
 #endif]b4_parse_param_cons[
@@ -423,7 +420,7 @@ do {                                        \
   {
   }
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
   /*--------------------------------.
   | Print this symbol on YYOUTPUT.  |
   `--------------------------------*/
@@ -484,7 +481,7 @@ do {                                        \
     yylocation_stack_.pop (n);
   }
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
   std::ostream&
   ]b4_parser_class_name[::debug_stream () const
   {
@@ -1012,7 +1009,7 @@ b4_error_verbose_if([int yystate, int yytoken],
     ]b4_stos[
   };
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
   /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
      to YYLEX-NUM.  */
   const ]b4_int_type_for([b4_toknum])[
@@ -1036,7 +1033,7 @@ b4_error_verbose_if([int yystate, int yytoken],
     ]b4_r2[
   };
 
-]b4_token_table_if([], [[#if YYDEBUG]])[
+]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
   /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
      First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
   const char*
@@ -1045,7 +1042,7 @@ b4_error_verbose_if([int yystate, int yytoken],
     ]b4_tname[
   };
 
-]b4_token_table_if([[#if YYDEBUG]])[
+]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
   /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
   const ]b4_parser_class_name[::rhs_number_type
   ]b4_parser_class_name[::yyrhs_[] =
@@ -1095,7 +1092,7 @@ b4_error_verbose_if([int yystate, int yytoken],
                       &]b4_rhs_value(yynrhs, yyi + 1)[,
                       &]b4_rhs_location(yynrhs, yyi + 1)[);
   }
-#endif // YYDEBUG
+#endif // ]b4_api_PREFIX[DEBUG
 
   /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
   ]b4_parser_class_name[::token_number_type
diff --git a/data/yacc.c b/data/yacc.c
index 8c595f9..3a67914 100644
--- a/data/yacc.c
+++ b/data/yacc.c
@@ -589,7 +589,7 @@ static const ]b4_int_type_for([b4_translate])[ 
yytranslate[] =
   ]b4_translate[
 };
 
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
 static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
@@ -610,7 +610,7 @@ static const ]b4_int_type_for([b4_rline])[ yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
+#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -803,7 +803,7 @@ while (YYID (0))
 #endif
 
 /* Enable debugging if requested.  */
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
 
 # ifndef YYFPRINTF
 #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
@@ -890,12 +890,12 @@ do {                                      \
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
 int yydebug;
-#else /* !YYDEBUG */
+#else /* !]b4_api_PREFIX[DEBUG */
 # define YYDPRINTF(Args)
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
 # define YY_STACK_PRINT(Bottom, Top)
 # define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
+#endif /* !]b4_api_PREFIX[DEBUG */
 
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
@@ -926,7 +926,7 @@ int yydebug;
    required.  Return 1 if memory is exhausted.  */
 static int
 yy_lac_stack_realloc (YYSIZE_T *yycapacity, YYSIZE_T yyadd,
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
                       char const *yydebug_prefix,
                       char const *yydebug_suffix,
 #endif
@@ -1032,7 +1032,7 @@ do {                                                      
       \
    the parser stacks to try to find a new initial context in which the
    current lookahead is syntactically acceptable.  If it fails to find
    such a context, it discards the lookahead.  */
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
 # define YY_LAC_DISCARD(Event)                                           \
 do {                                                                     \
   if (yy_lac_established)                                                \
@@ -1135,7 +1135,7 @@ yy_lac (yytype_int16 *yyesa, yytype_int16 **yyes,
         else
           {
             if (yy_lac_stack_realloc (yyes_capacity, 1,
-#if YYDEBUG
+#if ]b4_api_PREFIX[DEBUG
                                       " (", ")",
 #endif
                                       yyes, yyesa, &yyesp, yyes_prev))
@@ -1342,7 +1342,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yysize = yysize1;
               }
         }]b4_lac_if([[
-# if YYDEBUG
+# if ]b4_api_PREFIX[DEBUG
       else if (yydebug)
         YYFPRINTF (stderr, "No expected tokens.\n");
 # endif]])[
-- 
1.7.11.1

Attachment: 0001-api.prefix-also-rename-YYDEBUG.patch
Description: Binary data



reply via email to

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