]> git.saurik.com Git - bison.git/blobdiff - data/bison.simple
* data/m4sugar/m4sugar.m4 (m4_map): Recognize when the list of
[bison.git] / data / bison.simple
index 1beb5ed779f37b6a3cb2119efd81d6a08fef0416..80314c0c584acc497cd2b8119da03696e3a20ca5 100644 (file)
@@ -68,6 +68,10 @@ m4_define_default([b4_header_guard],
                                 [[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]], [_])])
 
 
+## ------------------------- ##
+## Assigning token numbers.  ##
+## ------------------------- ##
+
 # b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
 # -----------------------------------------
 # Output the definition of this token as #define.
@@ -175,6 +179,8 @@ m4_if(b4_prefix[], [yy], [],
 /* Copy the first part of user declarations.  */
 b4_pre_prologue
 
+b4_token_defines(b4_tokens)
+
 /* Enabling traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG b4_debug
@@ -189,10 +195,12 @@ b4_pre_prologue
 #endif
 
 #ifndef YYSTYPE
-m4_ifdef([b4_stype_line],
+m4_ifdef([b4_stype],
 [#line b4_stype_line "b4_filename"
-])dnl
-typedef b4_stype yystype;
+typedef union b4_stype yystype;
+/* Line __line__ of __file__.  */
+#line __oline__ "__ofile__"],
+[typedef int yystype;])
 # define YYSTYPE yystype
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
@@ -312,8 +320,6 @@ union yyalloc
 
 #endif
 
-b4_token_defines(b4_tokens)
-
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  b4_final
 #define YYFLAG  b4_flag
@@ -430,14 +436,12 @@ static const short yycheck[[]] =
   b4_check
 };
 
-#if YYDEBUG
 /* YYSTOS[[STATE-NUM]] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const b4_uint_type(b4_stos_max) yystos[[]] =
 {
   b4_stos
 };
-#endif
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
 # define YYSIZE_T __SIZE_TYPE__
@@ -647,6 +651,7 @@ int yyparse (void *);
 int yyparse (void);
 # endif
 #endif
+static void yydestructor (int symbol_type, YYSTYPE symbol_value);
 
 /* YY_DECL_VARIABLES -- depending whether we use a pure parser,
    variables are global, or local to YYPARSE.  */
@@ -1121,6 +1126,7 @@ yyerrlab1:
        YYABORT;
       YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
                  yychar, yytname[yychar1]));
+      yydestructor (yychar1, yylval);
       yychar = YYEMPTY;
     }
 
@@ -1167,6 +1173,7 @@ yyerrlab1:
        }
 #endif
 
+      yydestructor (yystos[yystate], *yyvsp);
       yyvsp--;
       yystate = *--yyssp;
 #if YYLSP_NEEDED
@@ -1229,6 +1236,39 @@ yyreturn:
   return yyresult;
 ]}
 
+/* Release the memory associated to SYMBOL-NUMBER. */
+m4_divert_push([KILL])# M4 code.
+# b4_eval
+# -------
+# FIXME: This is really wrong, we no longer guarantee we don't evaluate
+# the user's input.  This demonstrates that decoding actions (BRACED_CODE)
+# ought to be done when output, not when read.
+m4_define([b4_eval],
+[$*])
+
+# b4_symbol_destructor(SYMBOL-NUMBER, DESTRUCTOR, TYPE-NAME)
+# ----------------------------------------------------------
+m4_define([b4_symbol_destructor],
+[m4_pushdef([b4_dollar_dollar], [symbol_value.$3])dnl
+      case $1:
+        b4_eval($2);
+        break;
+m4_popdef([b4_dollar_dollar])])
+
+m4_divert_pop([KILL])dnl# End of M4 code.
+static void
+yydestructor (int symbol_type, YYSTYPE symbol_value)
+{
+  switch (symbol_type)
+    {
+m4_map([b4_symbol_destructor], m4_defn([b4_symbol_destructors]))dnl
+      default:
+        YYDPRINTF ((stderr, "yydestructor: unknown symbol type: %s\n",
+                   yytname[[symbol_type]]));
+        break;
+    }
+}
+
 b4_epilogue
 m4_if(b4_defines_flag, 0, [],
 [#output "b4_output_header_name"
@@ -1238,11 +1278,12 @@ m4_if(b4_defines_flag, 0, [],
 b4_token_defines(b4_tokens)
 
 #ifndef YYSTYPE
-m4_ifdef([b4_stype_line],
+m4_ifdef([b4_stype],
 [#line b4_stype_line "b4_filename"
-])dnl
-typedef b4_stype
-yystype;
+typedef union b4_stype yystype;
+/* Line __line__ of __file__.  */
+#line __oline__ "__ofile__"],
+[typedef int yystype;])
 # define YYSTYPE yystype
 #endif