X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/34136e65fc7bd6babcfedcbfcfdca3b9feb10f1d..7aaaad6c6dc0fae412d608dcf20a3977d8902cd1:/data/lalr1.cc?ds=inline diff --git a/data/lalr1.cc b/data/lalr1.cc index 8afabc21..7ad30e5c 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -126,8 +126,8 @@ b4_defines_if([], b4_locations_if([b4_percent_define_ifdef([[location_type]], [], [# Backward compatibility. - m4_define([b4_location_constructors]) - m4_include(b4_pkgdatadir/[location.cc])])]) + m4_define([b4_location_constructors]) + m4_include(b4_pkgdatadir/[location.cc])])]) m4_include(b4_pkgdatadir/[stack.hh]) b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])]) @@ -136,12 +136,15 @@ m4_changecom() m4_divert_push(0)dnl @output(b4_spec_defines_file@)@ b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++]) -dnl FIXME: This is wrong, we want computed header guards. [ +/** + ** \file ]b4_spec_defines_file[ + ** Define the ]b4_namespace_ref[::parser class. + */ + /* C++ LALR(1) parser skeleton written by Akim Demaille. */ -#ifndef PARSER_HEADER_H -# define PARSER_HEADER_H +]b4_cpp_guard_open([b4_spec_defines_file])[ ]b4_percent_code_get([[requires]])[ @@ -157,24 +160,13 @@ dnl FIXME: This is wrong, we want computed header guards. b4_variant_define b4_namespace_close])[ +]b4_null_define[ + /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG ]b4_parse_trace_if([1], [0])[ #endif -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE ]b4_token_table[ -#endif - ]b4_namespace_open[ /// A Bison parser. @@ -209,6 +201,9 @@ b4_namespace_close])[ /// \param msg a description of the syntax error. virtual void error (]b4_locations_if([const location_type& loc, ])[const std::string& msg); + /// Report a syntax error. + void error (const syntax_error& err); + private: /// State numbers. typedef int state_type; @@ -236,18 +231,16 @@ b4_namespace_close])[ static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_; static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_; - /* Tables. */ -]b4_parser_tables_declare[ - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE - /// For a symbol, its name in clear. - static const char* const yytname_[]; -#endif]b4_error_verbose_if([ + // Tables. +]b4_parser_tables_declare[]b4_error_verbose_if([ /// Convert the symbol name \a n to a form suitable for a diagnostic. static std::string yytnamerr_ (const char *n);])[ -#if YYDEBUG +]b4_token_table_if([], [[#if YYDEBUG]])[ + /// For a symbol, its name in clear. + static const char* const yytname_[]; +]b4_token_table_if([[#if YYDEBUG]])[ ]b4_integral_parser_table_declare([rline], [b4_rline], [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[ /// Report on the debug stream that the rule \a r is going to be reduced. @@ -255,10 +248,10 @@ b4_namespace_close])[ /// Print the state stack on the debug stream. virtual void yystack_print_ (); - /* Debugging. */ + // Debugging. int yydebug_; std::ostream* yycdebug_; -#endif +#endif // YYDEBUG /// Convert a scanner token number \a t to a symbol number. static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t); @@ -353,10 +346,9 @@ b4_public_types_define])[ /* Redirection for backward compatibility. */ # define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type #endif -]) -b4_percent_code_get([[provides]])[]dnl - -[#endif /* ! defined PARSER_HEADER_H */] +])[ +]b4_percent_code_get([[provides]])[ +]b4_cpp_guard_close([b4_spec_defines_file]) @output(b4_parser_file_name@)@ b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++]) b4_percent_code_get([[top]])[]dnl @@ -441,7 +433,7 @@ b4_percent_code_get[]dnl #else /* !YYDEBUG */ # define YYCDEBUG if (false) std::cerr -# define YY_SYMBOL_PRINT(Title, Symbol) static_cast(0) +# define YY_SYMBOL_PRINT(Title, Symbol) YYUSE(Symbol) # define YY_REDUCE_PRINT(Rule) static_cast(0) # define YY_STACK_PRINT() static_cast(0) @@ -544,12 +536,11 @@ b4_percent_code_get[]dnl ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, symbol_base_type& yysym) const { - int yytype = yysym.type_get (); - YYUSE (yymsg); if (yymsg) YY_SYMBOL_PRINT (yymsg, yysym); // User destructor. + int yytype = yysym.type_get (); switch (yytype) { ]b4_symbol_foreach([b4_symbol_destructor])dnl @@ -567,6 +558,8 @@ b4_percent_code_get[]dnl ]b4_parser_class_name[::yy_print_ (std::ostream& yyo, const symbol_base_type& yysym) const { + std::ostream& yyoutput = yyo; + YYUSE (yyoutput); int yytype = yysym.type_get (); yyo << (yytype < yyntokens_ ? "token" : "nterm") << ' ' << yytname_[yytype] << " ("]b4_locations_if([ @@ -646,7 +639,7 @@ b4_percent_code_get[]dnl { yydebug_ = l; } -#endif +#endif // YYDEBUG inline ]b4_parser_class_name[::state_type ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs) @@ -711,7 +704,7 @@ m4_popdef([b4_at_dollar])])dnl location values to have been already stored, initialize these stacks with a primary value. */ yystack_ = stack_type (0); - yypush_ (0, 0, yyla); + yypush_ (YY_NULL, 0, yyla); // A new symbol was pushed on the stack. yynewstate: @@ -735,13 +728,21 @@ m4_popdef([b4_at_dollar])])dnl if (yyempty) { YYCDEBUG << "Reading a token: "; + try + { ]b4_lex_symbol_if( -[ yyla = b4_c_function_call([yylex], [symbol_type], - m4_ifdef([b4_lex_param], b4_lex_param));], -[ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int], +[ yyla = b4_c_function_call([yylex], [symbol_type], + m4_ifdef([b4_lex_param], b4_lex_param));], +[ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int], [[YYSTYPE*], [&yyla.value]][]dnl b4_locations_if([, [[location*], [&yyla.location]]])dnl m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ + } + catch (const syntax_error& yyexc) + { + error (yyexc); + goto yyerrlab1; + } yyempty = false; } YY_SYMBOL_PRINT ("Next token is", yyla); @@ -824,8 +825,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ } catch (const syntax_error& yyexc) { - error (]b4_args(b4_locations_if([yyexc.location]), - [[yyexc.what()]])[); + error (yyexc); YYERROR; } YY_SYMBOL_PRINT ("-> $$ =", yylhs); @@ -835,21 +835,21 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ // Destroy a variant which value may have been swapped with // yylhs.value (for instance if the action was "std::swap($$, // $1)"). The value of yylhs.value (hence possibly one of these - // rhs symbols) depends on the default contruction for this + // rhs symbols) depends on the default construction for this // type. In the case of pointers for instance, no // initialization is done, so the value is junk. Therefore do // not try to report the value of symbols about to be destroyed // in the debug trace, it's possibly junk. Hence yymsg = 0. // Besides, that keeps exactly the same traces as with the other // Bison skeletons. - yy_destroy_ (0, yystack_[i]);]])[ + yy_destroy_ (YY_NULL, yystack_[i]);]])[ yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); /* Shift the result of the reduction. */ - yypush_ (0, yylhs); + yypush_ (YY_NULL, yylhs); goto yynewstate; /*--------------------------------------. @@ -972,6 +972,13 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ return yyresult; } + void + ]b4_parser_class_name[::error (const syntax_error& yyexc) + { + error (]b4_args(b4_locations_if([yyexc.location]), + [[yyexc.what()]])[); + } + // Generate an error message. std::string ]b4_parser_class_name[::yysyntax_error_ (]dnl @@ -1040,7 +1047,7 @@ b4_error_verbose_if([state_type yystate, int yytoken], } } - char const* yyformat = 0; + char const* yyformat = YY_NULL; switch (yycount) { #define YYCASE_(N, S) \ @@ -1077,7 +1084,7 @@ b4_error_verbose_if([state_type yystate, int yytoken], ]b4_parser_tables_define[ -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +]b4_token_table_if([], [[#if YYDEBUG]])[ /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at \a yyntokens_, nonterminals. */ const char* @@ -1085,9 +1092,8 @@ b4_error_verbose_if([state_type yystate, int yytoken], { ]b4_tname[ }; -#endif -#if YYDEBUG +]b4_token_table_if([[#if YYDEBUG]])[ ]b4_integral_parser_table_define([rline], [b4_rline])[ // Print the state stack on the debug stream.