source: trunk/contrib/bison-2.4.2/share/bison/glr.cc @ 1935

Last change on this file since 1935 was 1933, checked in by sam, 10 years ago

contrib: add Bison and Flex executables for Windows.

File size: 10.4 KB
Line 
1                                                                    -*- C -*-
2
3# C++ GLR skeleton for Bison
4# Copyright (C) 2002-2010 Free Software Foundation, Inc.
5
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, either version 3 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19
20# This skeleton produces a C++ class that encapsulates a C glr parser.
21# This is in order to reduce the maintenance burden.  The glr.c
22# skeleton is clean and pure enough so that there are no real
23# problems.  The C++ interface is the same as that of lalr1.cc.  In
24# fact, glr.c can replace yacc.c without the user noticing any
25# difference, and similarly for glr.cc replacing lalr1.cc.
26#
27# The passing of parse-params
28#
29#   The additional arguments are stored as members of the parser
30#   object, yyparser.  The C routines need to carry yyparser
31#   throughout the C parser; that easy: just let yyparser become an
32#   additional parse-param.  But because the C++ skeleton needs to
33#   know the "real" original parse-param, we save them
34#   (b4_parse_param_orig).  Note that b4_parse_param is overquoted
35#   (and c.m4 strips one level of quotes).  This is a PITA, and
36#   explains why there are so many levels of quotes.
37#
38# The locations
39#
40#   We use location.cc just like lalr1.cc, but because glr.c stores
41#   the locations in a (C++) union, the position and location classes
42#   must not have a constructor.  Therefore, contrary to lalr1.cc, we
43#   must not define "b4_location_constructors".  As a consequence the
44#   user must initialize the first positions (in particular the
45#   filename member).
46
47# We require a pure interface using locations.
48m4_define([b4_locations_flag], [1])
49m4_define([b4_pure_flag],      [1])
50
51# The header is mandatory.
52b4_defines_if([],
53              [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
54
55m4_include(b4_pkgdatadir/[c++.m4])
56m4_include(b4_pkgdatadir/[location.cc])
57
58m4_define([b4_parser_class_name],
59          [b4_percent_define_get([[parser_class_name]])])
60
61# Save the parse parameters.
62m4_define([b4_parse_param_orig], m4_defn([b4_parse_param]))
63
64
65# b4_yy_symbol_print_generate
66# ---------------------------
67# Bypass the default implementation to generate the "yy_symbol_print"
68# and "yy_symbol_value_print" functions.
69m4_define([b4_yy_symbol_print_generate],
70[[
71/*--------------------.
72| Print this symbol.  |
73`--------------------*/
74
75]b4_c_ansi_function_def([yy_symbol_print],
76    [static void],
77    [[FILE *],               []],
78    [[int yytype],           [yytype]],
79    [[const b4_namespace_ref::b4_parser_class_name::semantic_type *yyvaluep],
80                             [yyvaluep]],
81    [[const b4_namespace_ref::b4_parser_class_name::location_type *yylocationp],
82                             [yylocationp]],
83    b4_parse_param)[
84{
85]b4_parse_param_use[]dnl
86[  yyparser.yy_symbol_print_ (yytype, yyvaluep]b4_locations_if([, yylocationp])[);
87}
88]])
89
90
91# Declare yyerror.
92m4_append([b4_post_prologue],
93[b4_syncline([@oline@], [@ofile@])
94
95b4_c_ansi_function_decl([yyerror],
96    [static void],
97    [[b4_namespace_ref::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
98    b4_parse_param,
99    [[const char* msg], [msg]])])
100
101
102# Define yyerror.
103m4_append([b4_epilogue],
104[b4_syncline([@oline@], [@ofile@])[
105/*------------------.
106| Report an error.  |
107`------------------*/
108
109]b4_c_ansi_function_def([yyerror],
110    [static void],
111    [[b4_namespace_ref::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
112    b4_parse_param,
113    [[const char* msg], [msg]])[
114{
115]b4_parse_param_use[]dnl
116[  yyparser.error (*yylocationp, msg);
117}
118
119
120]b4_namespace_open[
121]dnl In this section, the parse param are the original parse_params.
122m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
123[  /// Build a parser object.
124  ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
125    :])[
126#if YYDEBUG
127    ]m4_ifset([b4_parse_param], [  ], [ :])[yydebug_ (false),
128      yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
129#endif]b4_parse_param_cons[
130  {
131  }
132
133  ]b4_parser_class_name::~b4_parser_class_name[ ()
134  {
135  }
136
137  int
138  ]b4_parser_class_name[::parse ()
139  {
140    return ::yyparse (*this]b4_user_args[);
141  }
142
143#if YYDEBUG
144  /*--------------------.
145  | Print this symbol.  |
146  `--------------------*/
147
148  inline void
149  ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
150                           const semantic_type* yyvaluep, const location_type* yylocationp)
151  {
152    /* Pacify ``unused variable'' warnings.  */
153    YYUSE (yyvaluep);
154    YYUSE (yylocationp);
155    switch (yytype)
156      {
157  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
158[        default:
159          break;
160      }
161  }
162
163
164  void
165  ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
166                           const semantic_type* yyvaluep, const location_type* yylocationp)
167  {
168    *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
169               << ' ' << yytname[yytype] << " ("
170               << *yylocationp << ": ";
171    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
172    *yycdebug_ << ')';
173  }
174
175  std::ostream&
176  ]b4_parser_class_name[::debug_stream () const
177  {
178    return *yycdebug_;
179  }
180
181  void
182  ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
183  {
184    yycdebug_ = &o;
185  }
186
187
188  ]b4_parser_class_name[::debug_level_type
189  ]b4_parser_class_name[::debug_level () const
190  {
191    return yydebug_;
192  }
193
194  void
195  ]b4_parser_class_name[::set_debug_level (debug_level_type l)
196  {
197    yydebug_ = l;
198  }
199
200#endif
201]m4_popdef([b4_parse_param])dnl
202b4_namespace_close[
203
204]])
205
206
207# Let glr.c believe that the user arguments include the parser itself.
208m4_ifset([b4_parse_param],
209[m4_pushdef([b4_parse_param],
210            m4_dquote([[[b4_namespace_ref::b4_parser_class_name& yyparser], [[yyparser]]],]
211m4_defn([b4_parse_param])))],
212[m4_pushdef([b4_parse_param],
213            [[[[b4_namespace_ref::b4_parser_class_name& yyparser], [[yyparser]]]]])
214])
215m4_include(b4_pkgdatadir/[glr.c])
216m4_popdef([b4_parse_param])
217
218m4_divert_push(0)
219@output(b4_spec_defines_file@)@
220b4_copyright([Skeleton interface for Bison GLR parsers in C++],
221             [2002-2006, 2009-2010])[
222
223/* C++ GLR parser skeleton written by Akim Demaille.  */
224
225#ifndef PARSER_HEADER_H
226# define PARSER_HEADER_H
227
228]b4_percent_code_get([[requires]])[
229
230#include <string>
231#include <iostream>
232
233/* Using locations.  */
234#define YYLSP_NEEDED ]b4_locations_flag[
235
236]b4_namespace_open[
237  class position;
238  class location;
239]b4_namespace_close[
240
241#include "location.hh"
242
243/* Enabling traces.  */
244#ifndef YYDEBUG
245# define YYDEBUG ]b4_debug_flag[
246#endif
247
248/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
249   If N is 0, then set CURRENT to the empty location which ends
250   the previous symbol: RHS[0] (always defined).  */
251
252#ifndef YYLLOC_DEFAULT
253# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
254    do                                                                  \
255      if (N)                                                            \
256        {                                                               \
257          (Current).begin  = YYRHSLOC (Rhs, 1).begin;                   \
258          (Current).end    = YYRHSLOC (Rhs, N).end;                     \
259        }                                                               \
260      else                                                              \
261        {                                                               \
262          (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end;      \
263        }                                                               \
264    while (/*CONSTCOND*/ 0)
265#endif
266
267]b4_namespace_open[
268  /// A Bison parser.
269  class ]b4_parser_class_name[
270  {
271  public:
272    /// Symbol semantic values.
273#ifndef YYSTYPE
274]m4_ifdef([b4_stype],
275[    union semantic_type
276    {
277b4_user_stype
278    };],
279[m4_if(b4_tag_seen_flag, 0,
280[[    typedef int semantic_type;]],
281[[    typedef YYSTYPE semantic_type;]])])[
282#else
283    typedef YYSTYPE semantic_type;
284#endif
285    /// Symbol locations.
286    typedef ]b4_percent_define_get([[location_type]])[ location_type;
287    /// Tokens.
288    struct token
289    {
290      ]b4_token_enums(b4_tokens)[
291    };
292    /// Token type.
293    typedef token::yytokentype token_type;
294
295    /// Build a parser object.
296    ]b4_parser_class_name[ (]b4_parse_param_decl[);
297    virtual ~]b4_parser_class_name[ ();
298
299    /// Parse.
300    /// \returns  0 iff parsing succeeded.
301    virtual int parse ();
302
303    /// The current debugging stream.
304    std::ostream& debug_stream () const;
305    /// Set the current debugging stream.
306    void set_debug_stream (std::ostream &);
307
308    /// Type for debugging levels.
309    typedef int debug_level_type;
310    /// The current debugging level.
311    debug_level_type debug_level () const;
312    /// Set the current debugging level.
313    void set_debug_level (debug_level_type l);
314
315  private:
316
317  public:
318    /// Report a syntax error.
319    /// \param loc    where the syntax error is found.
320    /// \param msg    a description of the syntax error.
321    virtual void error (const location_type& loc, const std::string& msg);
322  private:
323
324#if YYDEBUG
325  public:
326    /// \brief Report a symbol value on the debug stream.
327    /// \param yytype       The token type.
328    /// \param yyvaluep     Its semantic value.
329    /// \param yylocationp  Its location.
330    virtual void yy_symbol_value_print_ (int yytype,
331                                         const semantic_type* yyvaluep,
332                                         const location_type* yylocationp);
333    /// \brief Report a symbol on the debug stream.
334    /// \param yytype       The token type.
335    /// \param yyvaluep     Its semantic value.
336    /// \param yylocationp  Its location.
337    virtual void yy_symbol_print_ (int yytype,
338                                   const semantic_type* yyvaluep,
339                                   const location_type* yylocationp);
340  private:
341    /* Debugging.  */
342    int yydebug_;
343    std::ostream* yycdebug_;
344#endif
345
346
347    /// \brief Reclaim the memory associated to a symbol.
348    /// \param yymsg        Why this token is reclaimed.
349    /// \param yytype       The symbol type.
350    /// \param yyvaluep     Its semantic value.
351    /// \param yylocationp  Its location.
352    inline void yydestruct_ (const char* yymsg,
353                             int yytype,
354                             semantic_type* yyvaluep,
355                             location_type* yylocationp);
356
357]b4_parse_param_vars[
358  };
359
360]dnl Redirections for glr.c.
361b4_percent_define_flag_if([[global_tokens_and_yystype]],
362[b4_token_defines(b4_tokens)])
363[
364#ifndef YYSTYPE
365# define YYSTYPE ]b4_namespace_ref[::]b4_parser_class_name[::semantic_type
366#endif
367#ifndef YYLTYPE
368# define YYLTYPE ]b4_namespace_ref[::]b4_parser_class_name[::location_type
369#endif
370
371]b4_namespace_close[
372
373]b4_percent_code_get([[provides]])[]dnl
374
375[#endif /* ! defined PARSER_HEADER_H */]
376m4_divert_pop(0)
Note: See TracBrowser for help on using the repository browser.