mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
See http://www.gnu.org/prep/maintain/maintain.html#Copyright-Notices * HACKING, Makefile.am, NEWS, PACKAGING, README, README-alpha: * TODO, bootstrap, bootstrap.conf: * build-aux/update-b4-copyright, cfg.mk, configure.ac: * data/README, data/bison.m4, data/c++-skel.m4, data/c++.m4: * data/c-skel.m4, data/c.m4, data/glr.c, data/glr.cc: * data/java-skel.m4, data/java.m4, data/lalr1.cc: * data/lalr1.java, data/location.cc: * data/xslt/bison.xsl: * data/xslt/xml2dot.xsl, data/xslt/xml2text.xsl: * data/xslt/xml2xhtml.xsl, data/yacc.c, djgpp/Makefile.maint: * djgpp/README.in, djgpp/config.bat, djgpp/config.sed: * djgpp/config.site, djgpp/config_h.sed, djgpp/djunpack.bat: * djgpp/subpipe.c, djgpp/subpipe.h: * djgpp/testsuite.sed, doc/bison.texinfo: * doc/refcard.tex, etc/README, etc/bench.pl.in: * examples/calc++/Makefile.am, examples/extexi: * lib/abitset.c, lib/abitset.h: * lib/bbitset.h, lib/bitset.c, lib/bitset.h: * lib/bitset_stats.c, lib/bitset_stats.h, lib/bitsetv-print.c: * lib/bitsetv-print.h, lib/bitsetv.c, lib/bitsetv.h: * lib/ebitset.c, lib/ebitset.h, lib/get-errno.c: * lib/get-errno.h, lib/lbitset.c, lib/lbitset.h: * lib/libiberty.h, lib/main.c, lib/timevar.c: * lib/timevar.def, lib/timevar.h, lib/vbitset.c: * lib/vbitset.h, lib/yyerror.c, m4/bison-i18n.m4: * m4/c-working.m4, m4/cxx.m4, m4/subpipe.m4, m4/timevar.m4: * src/AnnotationList.c, src/AnnotationList.h: * src/InadequacyList.c, src/InadequacyList.h, src/LR0.c: * src/LR0.h, src/Sbitset.c, src/Sbitset.h, src/assoc.c: * src/assoc.h, src/closure.c, src/closure.h, src/complain.c: * src/complain.h, src/conflicts.c, src/conflicts.h: * src/derives.c, src/derives.h, src/files.c, src/files.h: * src/flex-scanner.h, src/getargs.c, src/getargs.h: * src/gram.c, src/gram.h, src/graphviz.c, src/ielr.c: * src/ielr.h, src/lalr.c, src/lalr.h: * src/location.c, src/location.h, src/main.c: * src/muscle-tab.c, src/muscle-tab.h, src/named-ref.c: * src/named-ref.h, src/nullable.c, src/nullable.h: * src/output.c, src/output.h, src/parse-gram.y: * src/print-xml.c, src/print-xml.h, src/print.c, src/print.h: * src/print_graph.c, src/print_graph.h, src/reader.c: * src/reader.h, src/reduce.c, src/reduce.h, src/relation.c: * src/relation.h, src/scan-code.h, src/scan-code.l: * src/scan-gram.h, src/scan-gram.l, src/scan-skel.h: * src/scan-skel.l, src/state.c, src/state.h, src/symlist.c: * src/symlist.h, src/symtab.c, src/symtab.h, src/system.h: * src/tables.c, src/tables.h, src/uniqstr.c, src/uniqstr.h: * tests/actions.at, tests/atlocal.in, tests/c++.at: * tests/calc.at, tests/conflicts.at, tests/cxx-type.at: * tests/existing.at, tests/glr-regression.at: * tests/headers.at, tests/input.at, tests/java.at: * tests/local.at, tests/named-refs.at: * tests/output.at, tests/push.at, tests/reduce.at: * tests/regression.at, tests/sets.at, tests/skeletons.at: * tests/synclines.at, tests/testsuite.at, tests/torture.at: * data/Makefile.am, data/location.cc, doc/Makefile.am, src/Makefile.am: * tests/Makefile.am, lib/Makefile.am, examples/Makefile.am: * etc/Makefile.am: Don't use date ranges in copyright notices. Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
376 lines
11 KiB
C++
376 lines
11 KiB
C++
-*- C -*-
|
|
|
|
# C++ GLR skeleton for Bison
|
|
|
|
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
|
# 2010 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
# This skeleton produces a C++ class that encapsulates a C glr parser.
|
|
# This is in order to reduce the maintenance burden. The glr.c
|
|
# skeleton is clean and pure enough so that there are no real
|
|
# problems. The C++ interface is the same as that of lalr1.cc. In
|
|
# fact, glr.c can replace yacc.c without the user noticing any
|
|
# difference, and similarly for glr.cc replacing lalr1.cc.
|
|
#
|
|
# The passing of parse-params
|
|
#
|
|
# The additional arguments are stored as members of the parser
|
|
# object, yyparser. The C routines need to carry yyparser
|
|
# throughout the C parser; that easy: just let yyparser become an
|
|
# additional parse-param. But because the C++ skeleton needs to
|
|
# know the "real" original parse-param, we save them
|
|
# (b4_parse_param_orig). Note that b4_parse_param is overquoted
|
|
# (and c.m4 strips one level of quotes). This is a PITA, and
|
|
# explains why there are so many levels of quotes.
|
|
#
|
|
# The locations
|
|
#
|
|
# We use location.cc just like lalr1.cc, but because glr.c stores
|
|
# the locations in a (C++) union, the position and location classes
|
|
# must not have a constructor. Therefore, contrary to lalr1.cc, we
|
|
# must not define "b4_location_constructors". As a consequence the
|
|
# user must initialize the first positions (in particular the
|
|
# filename member).
|
|
|
|
# We require a pure interface using locations.
|
|
m4_define([b4_locations_flag], [1])
|
|
m4_define([b4_pure_flag], [1])
|
|
|
|
# The header is mandatory.
|
|
b4_defines_if([],
|
|
[b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
|
|
|
|
m4_include(b4_pkgdatadir/[c++.m4])
|
|
b4_percent_define_ifdef([[location_type]], [],
|
|
[m4_include(b4_pkgdatadir/[location.cc])])
|
|
|
|
m4_define([b4_parser_class_name],
|
|
[b4_percent_define_get([[parser_class_name]])])
|
|
|
|
# Save the parse parameters.
|
|
m4_define([b4_parse_param_orig], m4_defn([b4_parse_param]))
|
|
|
|
|
|
# b4_yy_symbol_print_generate
|
|
# ---------------------------
|
|
# Bypass the default implementation to generate the "yy_symbol_print"
|
|
# and "yy_symbol_value_print" functions.
|
|
m4_define([b4_yy_symbol_print_generate],
|
|
[[
|
|
/*--------------------.
|
|
| Print this symbol. |
|
|
`--------------------*/
|
|
|
|
]b4_c_ansi_function_def([yy_symbol_print],
|
|
[static void],
|
|
[[FILE *], []],
|
|
[[int yytype], [yytype]],
|
|
[[const b4_namespace_ref::b4_parser_class_name::semantic_type *yyvaluep],
|
|
[yyvaluep]],
|
|
[[const b4_namespace_ref::b4_parser_class_name::location_type *yylocationp],
|
|
[yylocationp]],
|
|
b4_parse_param)[
|
|
{
|
|
]b4_parse_param_use[]dnl
|
|
[ yyparser.yy_symbol_print_ (yytype, yyvaluep]b4_locations_if([, yylocationp])[);
|
|
}
|
|
]])
|
|
|
|
|
|
# Declare yyerror.
|
|
m4_append([b4_post_prologue],
|
|
[b4_syncline([@oline@], [@ofile@])
|
|
|
|
b4_c_ansi_function_decl([yyerror],
|
|
[static void],
|
|
[[b4_namespace_ref::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
|
|
b4_parse_param,
|
|
[[const char* msg], [msg]])])
|
|
|
|
|
|
# Define yyerror.
|
|
m4_append([b4_epilogue],
|
|
[b4_syncline([@oline@], [@ofile@])[
|
|
/*------------------.
|
|
| Report an error. |
|
|
`------------------*/
|
|
|
|
]b4_c_ansi_function_def([yyerror],
|
|
[static void],
|
|
[[b4_namespace_ref::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
|
|
b4_parse_param,
|
|
[[const char* msg], [msg]])[
|
|
{
|
|
]b4_parse_param_use[]dnl
|
|
[ yyparser.error (*yylocationp, msg);
|
|
}
|
|
|
|
|
|
]b4_namespace_open[
|
|
]dnl In this section, the parse param are the original parse_params.
|
|
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
|
|
]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
|
|
yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
|
|
#endif]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. |
|
|
`--------------------*/
|
|
|
|
inline void
|
|
]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
|
|
const semantic_type* yyvaluep, const location_type* yylocationp)
|
|
{
|
|
/* Pacify ``unused variable'' warnings. */
|
|
YYUSE (yyvaluep);
|
|
YYUSE (yylocationp);
|
|
switch (yytype)
|
|
{
|
|
]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
|
|
[ default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
]b4_parser_class_name[::yy_symbol_print_ (int yytype,
|
|
const semantic_type* yyvaluep, const location_type* yylocationp)
|
|
{
|
|
*yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
|
|
<< ' ' << yytname[yytype] << " ("
|
|
<< *yylocationp << ": ";
|
|
yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
|
|
*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
|
|
]m4_popdef([b4_parse_param])dnl
|
|
b4_namespace_close[
|
|
|
|
]])
|
|
|
|
|
|
# Let glr.c believe that the user arguments include the parser itself.
|
|
m4_ifset([b4_parse_param],
|
|
[m4_pushdef([b4_parse_param],
|
|
m4_dquote([[[b4_namespace_ref::b4_parser_class_name& yyparser], [[yyparser]]],]
|
|
m4_defn([b4_parse_param])))],
|
|
[m4_pushdef([b4_parse_param],
|
|
[[[[b4_namespace_ref::b4_parser_class_name& yyparser], [[yyparser]]]]])
|
|
])
|
|
m4_include(b4_pkgdatadir/[glr.c])
|
|
m4_popdef([b4_parse_param])
|
|
|
|
m4_divert_push(0)
|
|
@output(b4_spec_defines_file@)@
|
|
b4_copyright([Skeleton interface for Bison GLR parsers in C++],
|
|
[2002, 2003, 2004, 2005, 2006, 2009, 2010])[
|
|
|
|
/* C++ GLR parser skeleton written by Akim Demaille. */
|
|
|
|
#ifndef PARSER_HEADER_H
|
|
# define PARSER_HEADER_H
|
|
|
|
]b4_percent_code_get([[requires]])[
|
|
|
|
#include <string>
|
|
#include <iostream>
|
|
]b4_percent_define_ifdef([[location_type]], [],
|
|
[[#include "location.hh"]])[
|
|
|
|
/* Using locations. */
|
|
#define YYLSP_NEEDED ]b4_locations_flag[
|
|
|
|
/* Enabling traces. */
|
|
#ifndef YYDEBUG
|
|
# define YYDEBUG ]b4_debug_flag[
|
|
#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
|
|
|
|
]b4_namespace_open[
|
|
/// A Bison parser.
|
|
class ]b4_parser_class_name[
|
|
{
|
|
public:
|
|
/// Symbol semantic values.
|
|
#ifndef YYSTYPE
|
|
]m4_ifdef([b4_stype],
|
|
[ union semantic_type
|
|
{
|
|
b4_user_stype
|
|
};],
|
|
[m4_if(b4_tag_seen_flag, 0,
|
|
[[ typedef int semantic_type;]],
|
|
[[ typedef YYSTYPE semantic_type;]])])[
|
|
#else
|
|
typedef YYSTYPE semantic_type;
|
|
#endif
|
|
/// Symbol locations.
|
|
typedef ]b4_percent_define_get([[location_type]],
|
|
[[location]])[ location_type;
|
|
/// Tokens.
|
|
struct token
|
|
{
|
|
]b4_token_enums(b4_tokens)[
|
|
};
|
|
/// Token type.
|
|
typedef token::yytokentype token_type;
|
|
|
|
/// 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 value on the debug stream.
|
|
/// \param yytype The token type.
|
|
/// \param yyvaluep Its semantic value.
|
|
/// \param yylocationp Its location.
|
|
virtual void yy_symbol_value_print_ (int yytype,
|
|
const semantic_type* yyvaluep,
|
|
const location_type* yylocationp);
|
|
/// \brief Report a symbol on the debug stream.
|
|
/// \param yytype The token type.
|
|
/// \param yyvaluep Its semantic value.
|
|
/// \param yylocationp Its location.
|
|
virtual void yy_symbol_print_ (int yytype,
|
|
const semantic_type* yyvaluep,
|
|
const location_type* yylocationp);
|
|
private:
|
|
/* Debugging. */
|
|
int yydebug_;
|
|
std::ostream* yycdebug_;
|
|
#endif
|
|
|
|
|
|
/// \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);
|
|
|
|
]b4_parse_param_vars[
|
|
};
|
|
|
|
]dnl Redirections for glr.c.
|
|
b4_percent_define_flag_if([[global_tokens_and_yystype]],
|
|
[b4_token_defines(b4_tokens)])
|
|
[
|
|
#ifndef YYSTYPE
|
|
# define YYSTYPE ]b4_namespace_ref[::]b4_parser_class_name[::semantic_type
|
|
#endif
|
|
#ifndef YYLTYPE
|
|
# define YYLTYPE ]b4_namespace_ref[::]b4_parser_class_name[::location_type
|
|
#endif
|
|
|
|
]b4_namespace_close[
|
|
|
|
]b4_percent_code_get([[provides]])[]dnl
|
|
|
|
[#endif /* ! defined PARSER_HEADER_H */]
|
|
m4_divert_pop(0)
|