]> git.saurik.com Git - bison.git/commitdiff
* data/glr.cc: New.
authorAkim Demaille <akim@epita.fr>
Mon, 14 Nov 2005 08:13:07 +0000 (08:13 +0000)
committerAkim Demaille <akim@epita.fr>
Mon, 14 Nov 2005 08:13:07 +0000 (08:13 +0000)
* data/m4sugar/m4sugar.m4 (m4_prepend): New.

ChangeLog
data/Makefile.am
data/glr.cc [new file with mode: 0644]
data/m4sugar/m4sugar.m4

index fd1ae2e3b91d8cf2384bcc067dc7979e32ed6a9c..52bb6991f5fb09c125b2057cabdcbb36a4fe3cbb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,7 @@
 2005-11-14  Akim Demaille  <akim@epita.fr>
 
-       Have glr.c include its header file when created.
-       * data/glr.c (b4_shared_declarations): New.
-       Output them verbatim in the parser if !%defines, otherwise
-       output then in the header file, and include it instead.
+       * data/glr.cc: New.
+       * data/m4sugar/m4sugar.m4 (m4_prepend): New.
 
 2005-11-12  Akim Demaille  <akim@epita.fr>
 
index 2d9b033de378230caa01bcd3f6f9cbc5cbfda2d1..7c4ccf966112efcc569b11b81aca868caac8fc40 100644 (file)
@@ -17,7 +17,7 @@
 
 dist_pkgdata_DATA = README \
    c.m4 yacc.c glr.c \
-   c++.m4 location.cc lalr1.cc
+   c++.m4 location.cc lalr1.cc glr.cc
 
 m4sugardir = $(pkgdatadir)/m4sugar
 dist_m4sugar_DATA = m4sugar/m4sugar.m4
diff --git a/data/glr.cc b/data/glr.cc
new file mode 100644 (file)
index 0000000..824ce76
--- /dev/null
@@ -0,0 +1,324 @@
+m4_divert(-1)                                                       -*- C -*-
+
+# C++ GLR skeleton for Bison
+# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301  USA
+
+# We require a pure interface using locations.
+m4_define([b4_location_flag], [1])
+m4_define([b4_pure],          [1])
+
+m4_include(b4_pkgdatadir/[c++.m4])
+m4_include(b4_pkgdatadir/[location.cc])
+
+
+# b4_yysymprint_generate(FUNCTION-DECLARATOR)
+# -------------------------------------------
+# Generate the "yysymprint" function, which declaration is issued using
+# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
+# or "b4_c_function_def" for K&R.
+m4_define([b4_yysymprint_generate],
+[b4_c_ansi_function_decl([yyerror],
+    [static void],
+    [[yy::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
+    b4_parse_param,
+    [[const char* msg], [msg]])[
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+]$1([yysymprint],
+    [static void],
+    [[FILE *yyoutput],       [yyoutput]],
+    [[int yytype],           [yytype]],
+    [[const yy::b4_parser_class_name::semantic_type *yyvaluep],
+                             [yyvaluep]][]dnl
+b4_location_if([,
+    [[const yy::b4_parser_class_name::location_type *yylocationp],
+                             [yylocationp]]])[]dnl
+m4_ifset([b4_parse_param], [, b4_parse_param]))[
+{
+  (void) yyoutput;
+  yyparser.yysymprint_ (yytype, yyvaluep]b4_location_if([, yylocationp])[);
+}
+]])
+
+m4_prepend([b4_epilogue],
+[[
+/*------------------.
+| Report an error.  |
+`------------------*/
+
+]b4_c_ansi_function_def([yyerror],
+    [static void],
+    [[yy::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
+    b4_parse_param,
+    [[const char* msg], [msg]])[
+{
+  yyparser.error (*yylocationp, msg);
+}
+
+
+namespace yy
+{
+]dnl Restore the actual parser params.
+m4_popdef([b4_parse_param])dnl
+[
+  /// Build a parser object.
+  ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)
+    : yycdebug_ (&std::cerr)]b4_parse_param_cons[
+  {
+  }
+
+  ]b4_parser_class_name::~b4_parser_class_name[ ()
+  {
+  }
+
+  int
+  ]b4_parser_class_name[::parse ()
+  {
+    return ::yyparse (*this]b4_user_args[);
+  }
+
+#if YYDEBUG
+
+  /*--------------------------------.
+  | Print this symbol on YYOUTPUT.  |
+  `--------------------------------*/
+
+  void
+  ]b4_parser_class_name[::yysymprint_ (int yytype,
+                           const semantic_type* yyvaluep, const location_type* yylocationp)
+  {
+    /* Pacify ``unused variable'' warnings.  */
+    (void) yyvaluep;
+    (void) yylocationp;
+    /* Backward compatibility, but should be removed eventually. */
+    std::ostream& cdebug_ = *yycdebug_;
+    (void) cdebug_;
+
+    *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
+              << ' ' << yytname[yytype] << " ("
+               << *yylocationp << ": ";
+    switch (yytype)
+      {
+  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
+[        default:
+          break;
+      }
+    *yycdebug_ << ')';
+  }
+
+  std::ostream&
+  ]b4_parser_class_name[::debug_stream () const
+  {
+    return *yycdebug_;
+  }
+
+  void
+  ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
+  {
+    yycdebug_ = &o;
+  }
+
+
+  ]b4_parser_class_name[::debug_level_type
+  ]b4_parser_class_name[::debug_level () const
+  {
+    return ::yydebug;
+  }
+
+  void
+  ]b4_parser_class_name[::set_debug_level (debug_level_type l)
+  {
+    ::yydebug = l;
+  }
+
+#endif /* ! YYDEBUG */
+
+} // namespace yy
+
+]])
+
+# Let glr.c believe that the user arguments are only the parser itself.
+m4_pushdef([b4_parse_param],
+          [[yy::b4_parser_class_name& yyparser, yyparser],]
+           m4_defn([b4_parse_param]))
+m4_include(b4_pkgdatadir/[glr.c])
+@output @output_header_name@
+b4_copyright([C++ Skeleton parser for GLALR(1) parsing with Bison],
+             [2002, 2003, 2004, 2005])[
+#ifndef PARSER_HEADER_H
+# define PARSER_HEADER_H
+
+#include <string>
+#include <iostream>
+
+/* Using locations.  */
+#define YYLSP_NEEDED ]b4_locations_flag[
+
+namespace yy
+{
+  class position;
+  class location;
+}
+
+/* Copy the first part of user declarations.  */
+]b4_pre_prologue[
+
+]/* Line __line__ of glr.cc.  */
+b4_syncline([@oline@], [@ofile@])[
+
+#include "stack.hh"
+#include "location.hh"
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG ]b4_debug[
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE ]b4_error_verbose[
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE ]b4_token_table[
+#endif
+
+#if 0
+/* Copy the second part of user declarations.  */
+]b4_post_prologue[
+
+]/* Line __line__ of glr.cc.  */
+
+b4_syncline([@oline@], [@ofile@])[
+#endif
+
+/* 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
+   the previous symbol: RHS[0] (always defined).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)                               \
+    do                                                                 \
+      if (N)                                                           \
+       {                                                               \
+         (Current).begin  = YYRHSLOC (Rhs, 1).begin;                   \
+         (Current).end    = YYRHSLOC (Rhs, N).end;                     \
+       }                                                               \
+      else                                                             \
+       {                                                               \
+         (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end;      \
+       }                                                               \
+    while (/*CONSTCOND*/ 0)
+#endif
+
+namespace yy
+{
+  /// A Bison parser.
+  class ]b4_parser_class_name[
+  {
+  public:
+    /// Symbol semantic values.
+#if ! defined (YYSTYPE)
+]m4_ifdef([b4_stype],
+[b4_syncline([b4_stype_line], [b4_file_name])
+    union semantic_type b4_stype;
+/* Line __line__ of lalr1.cc.  */
+b4_syncline([@oline@], [@ofile@])],
+[    typedef int semantic_type;])[
+#else
+    typedef YYSTYPE semantic_type;
+#endif
+    /// Symbol locations.
+    typedef ]b4_location_type[ location_type;
+    /// Tokens.
+    struct token
+    {
+      ]b4_token_enums(b4_tokens)[
+    };
+
+    /// Build a parser object.
+    ]b4_parser_class_name[ (]b4_parse_param_decl[);
+    virtual ~]b4_parser_class_name[ ();
+
+    /// Parse.
+    /// \returns  0 iff parsing succeeded.
+    virtual int parse ();
+
+    /// The current debugging stream.
+    std::ostream& debug_stream () const;
+    /// Set the current debugging stream.
+    void set_debug_stream (std::ostream &);
+
+    /// Type for debugging levels.
+    typedef int debug_level_type;
+    /// The current debugging level.
+    debug_level_type debug_level () const;
+    /// Set the current debugging level.
+    void set_debug_level (debug_level_type l);
+
+  private:
+
+  public:
+    /// Report a syntax error.
+    /// \param loc    where the syntax error is found.
+    /// \param msg    a description of the syntax error.
+    virtual void error (const location_type& loc, const std::string& msg);
+  private:
+
+#if YYDEBUG
+  public:
+    /// \brief Report a symbol on the debug stream.
+    /// \param yytype       The token type.
+    /// \param yyvaluep     Its semantic value.
+    /// \param yylocationp  Its location.
+    virtual void yysymprint_ (int yytype,
+                             const semantic_type* yyvaluep,
+                             const location_type* yylocationp);
+  private:
+#endif /* ! YYDEBUG */
+
+
+    /// \brief Reclaim the memory associated to a symbol.
+    /// \param yymsg        Why this token is reclaimed.
+    /// \param yytype       The symbol type.
+    /// \param yyvaluep     Its semantic value.
+    /// \param yylocationp  Its location.
+    inline void yydestruct_ (const char* yymsg,
+                             int yytype,
+                             semantic_type* yyvaluep,
+                             location_type* yylocationp);
+
+    /* Debugging.  */
+    std::ostream* yycdebug_;
+]b4_parse_param_vars[
+  };
+
+]dnl Redirections for glr.c.
+[#define YYSTYPE yy::]b4_parser_class_name[::semantic_type
+#define YYLTYPE yy::]b4_parser_class_name[::location_type
+
+}
+
+#endif /* ! defined PARSER_HEADER_H */]
index 3e2f1769008f126f351229f18d1a2a9479cb7565..225b7c7a5494b4b1e9388e1e161833d19052a129 100644 (file)
@@ -1515,6 +1515,12 @@ m4_define([m4_append],
 [m4_define([$1],
           m4_ifdef([$1], [m4_defn([$1])$3])[$2])])
 
+# m4_prepend(MACRO-NAME, STRING, [SEPARATOR])
+# -------------------------------------------
+# Same, but prepend.
+m4_define([m4_prepend],
+[m4_define([$1],
+          [$2]m4_ifdef([$1], [$3[]m4_defn([$1])]))])
 
 # m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR])
 # -----------------------------------------------