1 m4_divert(-1) -*- C
-*-
3 # C++ GLR skeleton for Bison
4 # Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
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 2 of the License, or
9 # (at your option) any later version.
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.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 # This skeleton produces a C++ class that encapsulates a C glr parser.
23 # This is in order to reduce the maintenance burden. The glr.c
24 # skeleton is clean and pure enough so that there are no real
25 # problems. The C++ interface is the same as that of lalr1.cc. In
26 # fact, glr.c can replace yacc.c without the user noticing any
27 # difference, and similarly for glr.cc replacing lalr1.cc.
29 # The passing of parse-params
31 # The additional arguments are stored as members of the parser
32 # object, yyparser. The C routines need to carry yyparser
33 # throughout the C parser; that easy: just let yyparser become an
34 # additional parse-param. But because the C++ skeleton needs to
35 # know the "real" original parse-param, we save them
36 # (b4_parse_param_orig). Note that b4_parse_param is overquoted
37 # (and c.m4 strips one level of quotes). This is a PITA, and
38 # explains why there are so many levels of quotes.
42 # We use location.cc just like lalr1.cc, but because glr.c stores
43 # the locations in a (C++) union, the position and location classes
44 # must not have a constructor. Therefore, contrary to lalr1.cc, we
45 # must not define "b4_location_constructors". As a consequence the
46 # user must initialize the first positions (in particular the
50 # We require a pure interface using locations.
51 m4_define([b4_location_flag
], [1])
52 m4_define([b4_pure
], [1])
54 m4_include(b4_pkgdatadir
/[c
++.m4
])
55 m4_include(b4_pkgdatadir
/[location
.cc
])
58 # Save the parse parameters.
59 m4_define([b4_parse_param_orig
], m4_defn([b4_parse_param
]))
62 # b4_yy_symbol_print_generate
63 # ---------------------------
64 # Bypass the default implementation to generate the "yy_symbol_print"
65 # and "yy_symbol_value_print" functions.
66 m4_define([b4_yy_symbol_print_generate
],
68 /*--------------------.
69 | Print this symbol. |
70 `--------------------*/
72 ]b4_c_ansi_function_def([yy_symbol_print
],
75 [[int yytype
], [yytype
]],
76 [[const b4_namespace::b4_parser_class_name::semantic_type
*yyvaluep
],
78 [[const b4_namespace::b4_parser_class_name::location_type
*yylocationp
],
82 ]b4_parse_param_use
[]dnl
83 [ yyparser
.yy_symbol_print_ (yytype
, yyvaluep
]b4_location_if([, yylocationp
])[);
89 m4_append([b4_post_prologue
],
90 [/* Line __line__ of glr.cc. */
91 b4_syncline([@oline@
], [@ofile@
])
93 b4_c_ansi_function_decl([yyerror
],
95 [[b4_namespace::b4_parser_class_name::location_type
*yylocationp
], [yylocationp
]],
97 [[const char* msg
], [msg
]])])
101 m4_append([b4_epilogue
],
102 [/* Line __line__ of glr.cc. */
103 b4_syncline([@oline@
], [@ofile@
])[
104 /*------------------.
106 `------------------*/
108 ]b4_c_ansi_function_def([yyerror
],
110 [[b4_namespace::b4_parser_class_name::location_type
*yylocationp
], [yylocationp
]],
112 [[const char* msg
], [msg
]])[
114 ]b4_parse_param_use
[]dnl
115 [ yyparser
.error (*yylocationp
, msg
);
119 namespace ]b4_namespace
[
121 ]dnl In
this section
, the parse param are the original parse_params
.
122 m4_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
[)
125 : yycdebug_ (&std::cerr
)]b4_parse_param_cons
[
129 ]b4_parser_class_name::~b4_parser_class_name
[ ()
134 ]b4_parser_class_name
[::parse ()
136 return ::yyparse (*this]b4_user_args
[);
140 /*--------------------.
141 | Print this symbol. |
142 `--------------------*/
145 ]b4_parser_class_name
[::yy_symbol_value_print_ (int yytype
,
146 const semantic_type
* yyvaluep
, const location_type
* yylocationp
)
148 /* Pacify ``unused variable'' warnings. */
153 ]m4_map([b4_symbol_actions
], m4_defn([b4_symbol_printers
]))dnl
161 ]b4_parser_class_name
[::yy_symbol_print_ (int yytype
,
162 const semantic_type
* yyvaluep
, const location_type
* yylocationp
)
164 *yycdebug_
<< (yytype
< YYNTOKENS
? "token" : "nterm")
165 << ' ' << yytname
[yytype
] << " ("
166 << *yylocationp
<< ": ";
167 yy_symbol_value_print_ (yytype
, yyvaluep
, yylocationp
);
172 ]b4_parser_class_name
[::debug_stream () const
178 ]b4_parser_class_name
[::set_debug_stream (std::ostream
& o
)
184 ]b4_parser_class_name
[::debug_level_type
185 ]b4_parser_class_name
[::debug_level () const
191 ]b4_parser_class_name
[::set_debug_level (debug_level_type l
)
196 #endif /* ! YYDEBUG */
197 ]m4_popdef([b4_parse_param
])dnl
198 [} // namespace ]b4_namespace[
203 # Let glr.c believe that the user arguments include the parser itself.
204 m4_ifset([b4_parse_param
],
205 [m4_pushdef([b4_parse_param
],
206 m4_dquote([[[b4_namespace::b4_parser_class_name
& yyparser
], [[yyparser]]],]
207 m4_defn([b4_parse_param
])))],
208 [m4_pushdef([b4_parse_param
],
209 [[[[b4_namespace::b4_parser_class_name
& yyparser
], [[yyparser]]]]])
211 m4_include(b4_pkgdatadir
/[glr
.c
])
212 m4_popdef([b4_parse_param
])
215 @output @output_header_name@
216 b4_copyright([Skeleton interface
for Bison GLR parsers in C
++],
217 [2002, 2003, 2004, 2005, 2006])
219 /* As a special exception, you may create a larger work that contains
220 part or all of the Bison parser skeleton and distribute that work
221 under terms of your choice, so long as that work isn't itself a
222 parser generator using the skeleton or a modified version thereof
223 as a parser skeleton. Alternatively, if you modify or redistribute
224 the parser skeleton itself, you may (at your option) remove this
225 special exception, which will cause the skeleton and the resulting
226 Bison output files to be licensed under the GNU General Public
227 License without this special exception.
229 This special exception was added by the Free Software Foundation in
230 version 2.2 of Bison. */
232 /* C++ GLR parser skeleton written by Akim Demaille. */
234 #ifndef PARSER_HEADER_H
235 # define PARSER_HEADER_H
240 /* Using locations. */
241 #define YYLSP_NEEDED ]b4_locations_flag[
243 namespace ]b4_namespace
[
249 /* Copy the first part of user declarations. */
252 ]/* Line __line__ of glr.cc. */
253 b4_syncline([@oline@
], [@ofile@
])[
255 #include "location.hh"
257 /* Enabling traces. */
259 # define YYDEBUG ]b4_debug[
262 /* Enabling verbose error messages. */
263 #ifdef YYERROR_VERBOSE
264 # undef YYERROR_VERBOSE
265 # define YYERROR_VERBOSE 1
267 # define YYERROR_VERBOSE ]b4_error_verbose[
270 /* Enabling the token table. */
271 #ifndef YYTOKEN_TABLE
272 # define YYTOKEN_TABLE ]b4_token_table[
275 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
276 If N is 0, then set CURRENT to the empty location which ends
277 the previous symbol: RHS[0] (always defined). */
279 #ifndef YYLLOC_DEFAULT
280 # define YYLLOC_DEFAULT(Current, Rhs, N) \
284 (Current).begin = YYRHSLOC (Rhs, 1).begin; \
285 (Current).end = YYRHSLOC (Rhs, N).end; \
289 (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \
291 while (/*CONSTCOND*/ 0)
294 namespace ]b4_namespace
[
297 class ]b4_parser_class_name
[
300 /// Symbol semantic values.
302 ]m4_ifdef([b4_stype
],
303 [ union semantic_type
305 /* Line __line__ of lalr1.cc. */
306 b4_syncline([@oline@
], [@ofile@
])
308 [ typedef int semantic_type
;])[
310 typedef YYSTYPE semantic_type
;
312 /// Symbol locations.
313 typedef ]b4_location_type
[ location_type
;
317 ]b4_token_enums(b4_tokens
)[
320 typedef token::yytokentype token_type
;
322 /// Build a parser object.
323 ]b4_parser_class_name
[ (]b4_parse_param_decl
[);
324 virtual ~]b4_parser_class_name
[ ();
327 /// \returns 0 iff parsing succeeded.
328 virtual int parse ();
330 /// The current debugging stream.
331 std::ostream
& debug_stream () const;
332 /// Set the current debugging stream.
333 void set_debug_stream (std::ostream
&);
335 /// Type for debugging levels.
336 typedef int debug_level_type
;
337 /// The current debugging level.
338 debug_level_type
debug_level () const;
339 /// Set the current debugging level.
340 void set_debug_level (debug_level_type l
);
345 /// Report a syntax error.
346 /// \param loc where the syntax error is found.
347 /// \param msg a description of the syntax error.
348 virtual void error (const location_type
& loc
, const std::string
& msg
);
353 /// \brief Report a symbol value on the debug stream.
354 /// \param yytype The token type.
355 /// \param yyvaluep Its semantic value.
356 /// \param yylocationp Its location.
357 virtual void yy_symbol_value_print_ (int yytype
,
358 const semantic_type
* yyvaluep
,
359 const location_type
* yylocationp
);
360 /// \brief Report a symbol on the debug stream.
361 /// \param yytype The token type.
362 /// \param yyvaluep Its semantic value.
363 /// \param yylocationp Its location.
364 virtual void yy_symbol_print_ (int yytype
,
365 const semantic_type
* yyvaluep
,
366 const location_type
* yylocationp
);
368 #endif /* ! YYDEBUG */
371 /// \brief Reclaim the memory associated to a symbol.
372 /// \param yymsg Why this token is reclaimed.
373 /// \param yytype The symbol type.
374 /// \param yyvaluep Its semantic value.
375 /// \param yylocationp Its location.
376 inline void yydestruct_ (const char* yymsg
,
378 semantic_type
* yyvaluep
,
379 location_type
* yylocationp
);
382 std::ostream
* yycdebug_
;
383 ]b4_parse_param_vars
[
386 ]dnl Redirections
for glr
.c
.
387 m4_ifset([b4_global_tokens_and_yystype
],
388 [b4_token_defines(b4_tokens
)])
391 # define YYSTYPE ]b4_namespace[::]b4_parser_class_name[::semantic_type
394 # define YYLTYPE ]b4_namespace[::]b4_parser_class_name[::location_type
399 #endif /* ! defined PARSER_HEADER_H */]