X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/34f98f46ee16dd3719d19e002dc27b2665a2514f..6ce2d93a9b49afbc196e764923d539bc0caa1120:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index 6de35817..63712265 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -1,8 +1,7 @@ -m4_divert(-1) - # C++ skeleton for Bison -# Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 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 @@ -21,9 +20,14 @@ m4_divert(-1) m4_include(b4_pkgdatadir/[c++.m4]) +m4_define([b4_parser_class_name], + [b4_percent_define_get([[parser_class_name]])]) +m4_define([b4_namespace], + [b4_percent_define_get([[namespace]])]) + # The header is mandatory. b4_defines_if([], - [m4_fatal(b4_skeleton[: using %defines is mandatory])]) + [b4_fatal([b4_skeleton[: using %%defines is mandatory]])]) # Backward compatibility. m4_define([b4_location_constructors]) @@ -31,9 +35,9 @@ m4_include(b4_pkgdatadir/[location.cc]) # We do want M4 expansion after # for CPP macros. m4_changecom() -m4_divert(0)dnl +m4_divert_push(0)dnl b4_defines_if( -[@output @output_header_name@ +[@output(b4_spec_defines_file@) b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++], [2002, 2003, 2004, 2005, 2006]) dnl FIXME: This is wrong, we want computed header guards. @@ -43,6 +47,8 @@ dnl FIXME: This is wrong, we want computed header guards. #ifndef PARSER_HEADER_H # define PARSER_HEADER_H +]b4_percent_code_get([[requires]])[ + #include #include #include "stack.hh" @@ -53,15 +59,7 @@ namespace ]b4_namespace[ class location; } -]m4_ifdef([b4_start_header], -[[/* Copy the %start-header blocks. */ -]b4_start_header])[]dnl - -[/* Line __line__ of lalr1.cc. */ -]b4_syncline([@oline@], [@ofile@])[ - -]dnl Include location.hh here: it might depend on headers included above. -[#include "location.hh" +#include "location.hh" /* Enabling traces. */ #ifndef YYDEBUG @@ -111,16 +109,17 @@ namespace ]b4_namespace[ #ifndef YYSTYPE ]m4_ifdef([b4_stype], [ union semantic_type -b4_stype -/* Line __line__ of lalr1.cc. */ -b4_syncline([@oline@], [@ofile@]) - ;], -[ typedef int 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_location_type[ location_type; + typedef ]b4_percent_define_get([[location_type]])[ location_type; /// Tokens. struct token { @@ -176,7 +175,7 @@ b4_error_verbose_if([, int tok])[); virtual void yy_symbol_print_ (int yytype, const semantic_type* yyvaluep, const location_type* yylocationp); -#endif /* ! YYDEBUG */ +#endif /// State numbers. @@ -253,6 +252,10 @@ b4_error_verbose_if([, int tok])[); virtual void yy_reduce_print_ (int r); /// Print the state stack on the debug stream. virtual void yystack_print_ (); + + /* Debugging. */ + int yydebug_; + std::ostream* yycdebug_; #endif /// Convert a scanner token number \a t to a symbol number. @@ -283,16 +286,11 @@ b4_error_verbose_if([, int tok])[); static const int yyntokens_; static const unsigned int yyuser_token_number_max_; static const token_number_type yyundef_token_; - - /* Debugging. */ - int yydebug_; - std::ostream* yycdebug_; - ]b4_parse_param_vars[ }; } -]m4_ifset([b4_global_tokens_and_yystype], +]b4_percent_define_flag_if([[global_tokens_and_yystype]], [b4_token_defines(b4_tokens) #ifndef YYSTYPE @@ -300,33 +298,30 @@ b4_error_verbose_if([, int tok])[); # define YYSTYPE b4_namespace::b4_parser_class_name::semantic_type #endif ]) -m4_ifdef([b4_end_header], -[[/* Copy the %end-header blocks. */ -]b4_end_header])[]dnl +b4_percent_code_get([[provides]])[]dnl [#endif /* ! defined PARSER_HEADER_H */] ])dnl -@output @output_parser_name@ +@output(b4_parser_file_name@) b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++], [2002, 2003, 2004, 2005, 2006]) +b4_percent_code_get([[top]])[]dnl m4_if(b4_prefix, [yy], [], [ // Take the name prefix into account. #define yylex b4_prefix[]lex])[ /* First part of user declarations. */ -]b4_pre_prologue +]b4_user_pre_prologue -b4_defines_if([ -#include @output_header_name@])[ +b4_defines_if([[ +#include "@basename(]b4_spec_defines_file[@)"]])[ /* User implementation prologue. */ -]b4_post_prologue[ +]b4_user_post_prologue +b4_percent_code_get[]dnl -]/* Line __line__ of lalr1.cc. */ -b4_syncline([@oline@], [@ofile@])[ - -#ifndef YY_ +[#ifndef YY_ # if YYENABLE_NLS # if ENABLE_NLS # include /* FIXME: INFRINGES ON USER NAME SPACE */ @@ -341,14 +336,12 @@ b4_syncline([@oline@], [@ofile@])[ /* Suppress unused-variable warnings by "using" E. */ #define YYUSE(e) ((void) (e)) -/* A pseudo ostream that takes yydebug_ into account. */ -# define YYCDEBUG \ - for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false) \ - (*yycdebug_) - /* Enable debugging if requested. */ #if YYDEBUG +/* A pseudo ostream that takes yydebug_ into account. */ +# define YYCDEBUG if (yydebug_) (*yycdebug_) + # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug_) \ @@ -373,6 +366,7 @@ do { \ #else /* !YYDEBUG */ +# define YYCDEBUG if (false) std::cerr # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_REDUCE_PRINT(Rule) # define YY_STACK_PRINT() @@ -427,9 +421,12 @@ namespace ]b4_namespace[ #endif /// Build a parser object. - ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[) - : yydebug_ (false), - yycdebug_ (&std::cerr)]b4_parse_param_cons[ + ]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[ { } @@ -467,7 +464,7 @@ namespace ]b4_namespace[ yy_symbol_value_print_ (yytype, yyvaluep, yylocationp); *yycdebug_ << ')'; } -#endif /* ! YYDEBUG */ +#endif void ]b4_parser_class_name[::yydestruct_ (const char* yymsg, @@ -495,6 +492,7 @@ namespace ]b4_namespace[ yylocation_stack_.pop (n); } +#if YYDEBUG std::ostream& ]b4_parser_class_name[::debug_stream () const { @@ -519,7 +517,7 @@ namespace ]b4_namespace[ { yydebug_ = l; } - +#endif int ]b4_parser_class_name[::parse () @@ -557,11 +555,9 @@ namespace ]b4_namespace[ m4_pushdef([b4_at_dollar], [yylloc])dnl m4_pushdef([b4_dollar_dollar], [yylval])dnl /* User initialization code. */ - b4_initial_action + b4_user_initial_action m4_popdef([b4_dollar_dollar])dnl -m4_popdef([b4_at_dollar])dnl - /* Line __line__ of yacc.c. */ -b4_syncline([@oline@], [@ofile@])])dnl +m4_popdef([b4_at_dollar])])dnl [ /* Initialize the stacks. The initial state will be pushed in yynewstate, since the latter expects the semantical and the @@ -577,6 +573,11 @@ b4_syncline([@oline@], [@ofile@])])dnl yynewstate: yystate_stack_.push (yystate); YYCDEBUG << "Entering state " << yystate << std::endl; + + /* Accept? */ + if (yystate == yyfinal_) + goto yyacceptlab; + goto yybackup; /* Backup. */ @@ -626,16 +627,11 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; goto yyreduce; } - /* Accept? */ - if (yyn == yyfinal_) - goto yyacceptlab; - /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - /* Discard the token being shifted unless it is eof. */ - if (yychar != yyeof_) - yychar = yyempty_; + /* Discard the token being shifted. */ + yychar = yyempty_; yysemantic_stack_.push (yylval); yylocation_stack_.push (yylloc); @@ -680,9 +676,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; YY_REDUCE_PRINT (yyn); switch (yyn) { - ]b4_actions - /* Line __line__ of lalr1.cc. */ -b4_syncline([@oline@], [@ofile@])[ + ]b4_user_actions[ default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc); @@ -792,9 +786,6 @@ b4_error_verbose_if([, yytoken])[)); YY_STACK_PRINT (); } - if (yyn == yyfinal_) - goto yyacceptlab; - yyerror_range[1] = yylloc; // Using YYLLOC is tempting, but would change the location of // the lookahead. YYLOC is available though. @@ -820,7 +811,7 @@ b4_error_verbose_if([, yytoken])[)); goto yyreturn; yyreturn: - if (yychar != yyeof_ && yychar != yyempty_) + if (yychar != yyempty_) yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc); /* Do not reclaim the symbols of the rule which action triggered @@ -1022,7 +1013,7 @@ b4_error_verbose_if([, int tok])[) int yynrhs = yyr2_[yyrule]; /* Print the symbols being reduced, and their result. */ *yycdebug_ << "Reducing stack by rule " << yyrule - 1 - << " (line " << yylno << "), "; + << " (line " << yylno << "):" << std::endl; /* The symbols being reduced. */ for (int yyi = 0; yyi < yynrhs; yyi++) YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", @@ -1064,7 +1055,7 @@ b4_error_verbose_if([, int tok])[) ]b4_epilogue dnl -@output b4_dir_prefix[]stack.hh +@output(b4_dir_prefix[]stack.hh@) b4_copyright([Stack handling for Bison parsers in C++], [2002, 2003, 2004, 2005, 2006])[ @@ -1163,4 +1154,4 @@ namespace ]b4_namespace[ } #endif // not BISON_STACK_HH] -m4_divert(-1) +m4_divert_pop(0)