X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f479c6c61e4a2dc71196b413324faa6609120123..b50d2359d7608270561abd5c3cbf6e84834c2019:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index bc1bec12..c00de055 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -20,6 +20,7 @@ m4_divert(-1) # 02110-1301 USA m4_include(b4_pkgdatadir/[c++.m4]) +m4_include(b4_pkgdatadir/[location.cc]) # We do want M4 expansion after # for CPP macros. m4_changecom() @@ -27,17 +28,16 @@ m4_divert(0)dnl m4_if(b4_defines_flag, 0, [], [@output @output_header_name@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], - [2002, 2003, 2004, 2005])[ -/* FIXME: This is wrong, we want computed header guards. - I don't know why the macros are missing now. :( */ + [2002, 2003, 2004, 2005]) +dnl FIXME: This is wrong, we want computed header guards. +dnl FIXME: I don\'t know why the macros are missing now. :( +[ #ifndef PARSER_HEADER_H # define PARSER_HEADER_H #include #include - -/* Using locations. */ -#define YYLSP_NEEDED ]b4_locations_flag[ +#include "stack.hh" namespace yy { @@ -45,16 +45,14 @@ namespace yy class location; } -]b4_token_enums(b4_tokens)[ - -/* Copy the first part of user declarations. */ +/* First part of user declarations. */ ]b4_pre_prologue[ ]/* Line __line__ of lalr1.cc. */ b4_syncline([@oline@], [@ofile@])[ -#include "stack.hh" -#include "location.hh" +]dnl Include location.hh here: it might depend on headers included above. +[#include "location.hh" /* Enabling traces. */ #ifndef YYDEBUG @@ -69,34 +67,11 @@ b4_syncline([@oline@], [@ofile@])[ # define YYERROR_VERBOSE ]b4_error_verbose[ #endif -#if YYERROR_VERBOSE -# define YYERROR_VERBOSE_IF(x) x -#else -# define YYERROR_VERBOSE_IF(x) /* empty */ -#endif - /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE ]b4_token_table[ #endif -#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -]m4_ifdef([b4_stype], -[b4_syncline([b4_stype_line], [b4_file_name]) -union YYSTYPE b4_stype; -/* Line __line__ of lalr1.cc. */ -b4_syncline([@oline@], [@ofile@])], -[typedef int YYSTYPE;])[ -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - -/* Copy the second part of user declarations. */ -]b4_post_prologue[ - -]/* Line __line__ of lalr1.cc. */ -b4_syncline([@oline@], [@ofile@])[ /* 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). */ @@ -122,12 +97,26 @@ namespace yy /// A Bison parser. class ]b4_parser_class_name[ { + public: /// Symbol semantic values. +#if ! defined (YYSTYPE) +]m4_ifdef([b4_stype], +[b4_syncline([b4_stype_line], [b4_file_name]) + union semantic_type b4_stype; +/* Line __line__ of lalr1.cc. */ +b4_syncline([@oline@], [@ofile@])], +[ typedef int semantic_type;])[ +#else typedef YYSTYPE semantic_type; +#endif /// Symbol locations. typedef ]b4_location_type[ location_type; + /// Tokens. + struct token + { + ]b4_token_enums(b4_tokens)[ + }; - public: /// Build a parser object. ]b4_parser_class_name[ (]b4_parse_param_decl[) : yydebug_ (false), @@ -162,8 +151,10 @@ namespace yy virtual void error (const location_type& loc, const std::string& msg); /// Generate an error message. - /// \param tok the look-ahead token. - virtual std::string yysyntax_error_ (YYERROR_VERBOSE_IF (int tok)); + /// \param state the state where the error occurred. + /// \param tok the look-ahead token. + virtual std::string yysyntax_error_ (int yystate]dnl +b4_error_verbose_if([, int tok])[); #if YYDEBUG /// \brief Report a symbol on the debug stream. @@ -281,15 +272,6 @@ namespace yy static const unsigned int yyuser_token_number_max_; static const token_number_type yyundef_token_; - /* State. */ - int yyn_; - int yylen_; - int yystate_; - - /* Error handling. */ - int yynerrs_; - int yyerrstatus_; - /* Debugging. */ int yydebug_; std::ostream* yycdebug_; @@ -298,6 +280,14 @@ namespace yy }; } +]m4_ifset([b4_global_tokens_and_yystype], +[b4_token_defines(b4_tokens) + +#ifndef YYSTYPE + /* Redirection for backward compatibility. */ +# define YYSTYPE yy::b4_parser_class_name::semantic_type +#endif +])[ #endif /* ! defined PARSER_HEADER_H */] ])dnl @output @output_parser_name@ @@ -311,6 +301,12 @@ m4_if(b4_defines_flag, 0, [], [ #include @output_header_name@])[ +/* User implementation prologue. */ +]b4_post_prologue[ + +]/* Line __line__ of lalr1.cc. */ +b4_syncline([@oline@], [@ofile@])[ + #ifndef YY_ # if YYENABLE_NLS # if ENABLE_NLS @@ -492,8 +488,17 @@ int yy::]b4_parser_class_name[::parse () { /// Look-ahead and look-ahead in internal form. - int yychar; - int yytoken; + int yychar = yyempty_; + int yytoken = 0; + + /* State. */ + int yyn; + int yylen; + int yystate = 0; + + /* Error handling. */ + int yynerrs_ = 0; + int yyerrstatus_ = 0; /// Semantic value of the look-ahead. semantic_type yylval; @@ -507,17 +512,10 @@ yy::]b4_parser_class_name[::parse () /// @@$. location_type yyloc; - int yyresult_; + int yyresult; YYCDEBUG << "Starting parse" << std::endl; - yynerrs_ = 0; - yyerrstatus_ = 0; - - /* Start. */ - yystate_ = 0; - yychar = yyempty_; - ]m4_ifdef([b4_initial_action], [ m4_pushdef([b4_at_dollar], [yylloc])dnl m4_pushdef([b4_dollar_dollar], [yylval])dnl @@ -540,16 +538,16 @@ b4_syncline([@oline@], [@ofile@])])dnl /* New state. */ yynewstate: - yystate_stack_.push (yystate_); - YYCDEBUG << "Entering state " << yystate_ << std::endl; + yystate_stack_.push (yystate); + YYCDEBUG << "Entering state " << yystate << std::endl; goto yybackup; /* Backup. */ yybackup: /* Try to take a decision without look-ahead. */ - yyn_ = yypact_[yystate_]; - if (yyn_ == yypact_ninf_) + yyn = yypact_[yystate]; + if (yyn == yypact_ninf_) goto yydefault; /* Read a look-ahead token. */ @@ -575,29 +573,24 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } - /* If the proper action on seeing token ILOOKA_ is to reduce or to + /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ - yyn_ += yytoken; - if (yyn_ < 0 || yylast_ < yyn_ || yycheck_[yyn_] != yytoken) + yyn += yytoken; + if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken) goto yydefault; /* Reduce or error. */ - yyn_ = yytable_[yyn_]; - if (yyn_ < 0) + yyn = yytable_[yyn]; + if (yyn <= 0) { - if (yyn_ == yytable_ninf_) + if (yyn == 0 || yyn == yytable_ninf_) goto yyerrlab; - else - { - yyn_ = -yyn_; - goto yyreduce; - } + yyn = -yyn; + goto yyreduce; } - else if (yyn_ == 0) - goto yyerrlab; /* Accept? */ - if (yyn_ == yyfinal_) + if (yyn == yyfinal_) goto yyacceptlab; /* Shift the look-ahead token. */ @@ -615,15 +608,15 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; if (yyerrstatus_) --yyerrstatus_; - yystate_ = yyn_; + yystate = yyn; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: - yyn_ = yydefact_[yystate_]; - if (yyn_ == 0) + yyn = yydefact_[yystate]; + if (yyn == 0) goto yyerrlab; goto yyreduce; @@ -631,24 +624,24 @@ yydefault: | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: - yylen_ = yyr2_[yyn_]; + yylen = yyr2_[yyn]; /* If LEN_ is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, use the top of the stack. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. */ - if (yylen_) - yyval = yysemantic_stack_[yylen_ - 1]; + if (yylen) + yyval = yysemantic_stack_[yylen - 1]; else yyval = yysemantic_stack_[0]; { - slice slice (yylocation_stack_, yylen_); - YYLLOC_DEFAULT (yyloc, slice, yylen_); + slice slice (yylocation_stack_, yylen); + YYLLOC_DEFAULT (yyloc, slice, yylen); } - YY_REDUCE_PRINT (yyn_); - switch (yyn_) + YY_REDUCE_PRINT (yyn); + switch (yyn) { ]b4_actions[ default: break; @@ -657,7 +650,7 @@ yyreduce: ]/* Line __line__ of lalr1.cc. */ b4_syncline([@oline@], [@ofile@])[ - yypop_ (yylen_); + yypop_ (yylen); YY_STACK_PRINT (); @@ -665,13 +658,13 @@ b4_syncline([@oline@], [@ofile@])[ yylocation_stack_.push (yyloc); /* Shift the result of the reduction. */ - yyn_ = yyr1_[yyn_]; - yystate_ = yypgoto_[yyn_ - yyntokens_] + yystate_stack_[0]; - if (0 <= yystate_ && yystate_ <= yylast_ - && yycheck_[yystate_] == yystate_stack_[0]) - yystate_ = yytable_[yystate_]; + yyn = yyr1_[yyn]; + yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0]; + if (0 <= yystate && yystate <= yylast_ + && yycheck_[yystate] == yystate_stack_[0]) + yystate = yytable_[yystate]; else - yystate_ = yydefgoto_[yyn_ - yyntokens_]; + yystate = yydefgoto_[yyn - yyntokens_]; goto yynewstate; /*------------------------------------. @@ -682,7 +675,8 @@ yyerrlab: if (!yyerrstatus_) { ++yynerrs_; - error (yylloc, yysyntax_error_ (YYERROR_VERBOSE_IF (yytoken))); + error (yylloc, yysyntax_error_ (yystate]dnl +b4_error_verbose_if([, yytoken])[)); } yyerror_range[0] = yylloc; @@ -720,9 +714,9 @@ yyerrorlab: if (false) goto yyerrorlab; - yyerror_range[0] = yylocation_stack_[yylen_ - 1]; - yypop_ (yylen_); - yystate_ = yystate_stack_[0]; + yyerror_range[0] = yylocation_stack_[yylen - 1]; + yypop_ (yylen); + yystate = yystate_stack_[0]; goto yyerrlab1; /*-------------------------------------------------------------. @@ -733,14 +727,14 @@ yyerrlab1: for (;;) { - yyn_ = yypact_[yystate_]; - if (yyn_ != yypact_ninf_) + yyn = yypact_[yystate]; + if (yyn != yypact_ninf_) { - yyn_ += yyterror_; - if (0 <= yyn_ && yyn_ <= yylast_ && yycheck_[yyn_] == yyterror_) + yyn += yyterror_; + if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) { - yyn_ = yytable_[yyn_]; - if (0 < yyn_) + yyn = yytable_[yyn]; + if (0 < yyn) break; } } @@ -751,14 +745,14 @@ yyerrlab1: yyerror_range[0] = yylocation_stack_[0]; yydestruct_ ("Error: popping", - yystos_[yystate_], + yystos_[yystate], &yysemantic_stack_[0], &yylocation_stack_[0]); yypop_ (); - yystate_ = yystate_stack_[0]; + yystate = yystate_stack_[0]; YY_STACK_PRINT (); } - if (yyn_ == yyfinal_) + if (yyn == yyfinal_) goto yyacceptlab; yyerror_range[1] = yylloc; @@ -769,20 +763,20 @@ yyerrlab1: yylocation_stack_.push (yyloc); /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos_[yyn_], + YY_SYMBOL_PRINT ("Shifting", yystos_[yyn], &yysemantic_stack_[0], &yylocation_stack_[0]); - yystate_ = yyn_; + yystate = yyn; goto yynewstate; /* Accept. */ yyacceptlab: - yyresult_ = 0; + yyresult = 0; goto yyreturn; /* Abort. */ yyabortlab: - yyresult_ = 1; + yyresult = 1; goto yyreturn; yyreturn: @@ -798,28 +792,29 @@ yyreturn: yypop_ (); } - return yyresult_; + return yyresult; } // Generate an error message. std::string -yy::]b4_parser_class_name[::yysyntax_error_ (YYERROR_VERBOSE_IF (int tok)) +yy::]b4_parser_class_name[::yysyntax_error_ (int yystate]dnl +b4_error_verbose_if([, int tok])[) { std::string res; #if YYERROR_VERBOSE - yyn_ = yypact_[yystate_]; - if (yypact_ninf_ < yyn_ && yyn_ < yylast_) + int yyn = yypact_[yystate]; + if (yypact_ninf_ < yyn && yyn < yylast_) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ - int yyxbegin = yyn_ < 0 ? -yyn_ : 0; + int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = yylast_ - yyn_; + int yychecklim = yylast_ - yyn; int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; int count = 0; for (int x = yyxbegin; x < yyxend; ++x) - if (yycheck_[x + yyn_] == x && x != yyterror_) + if (yycheck_[x + yyn] == x && x != yyterror_) ++count; // FIXME: This method of building the message is not compatible @@ -836,7 +831,7 @@ yy::]b4_parser_class_name[::yysyntax_error_ (YYERROR_VERBOSE_IF (int tok)) { count = 0; for (int x = yyxbegin; x < yyxend; ++x) - if (yycheck_[x + yyn_] == x && x != yyterror_) + if (yycheck_[x + yyn] == x && x != yyterror_) { res += (!count++) ? ", expecting " : " or "; res += yytnamerr_ (yytname_[x]); @@ -981,12 +976,12 @@ yy::]b4_parser_class_name[::yyreduce_print_ (int yyrule) { unsigned int yylno = yyrline_[yyrule]; /* Print the symbols being reduced, and their result. */ - *yycdebug_ << "Reducing stack by rule " << yyn_ - 1 + *yycdebug_ << "Reducing stack by rule " << yyrule - 1 << " (line " << yylno << "), "; - for (]b4_int_type_for([b4_prhs])[ i = yyprhs_[yyn_]; + for (]b4_int_type_for([b4_prhs])[ i = yyprhs_[yyrule]; 0 <= yyrhs_[i]; ++i) *yycdebug_ << yytname_[yyrhs_[i]] << ' '; - *yycdebug_ << "-> " << yytname_[yyr1_[yyn_]] << std::endl; + *yycdebug_ << "-> " << yytname_[yyr1_[yyrule]] << std::endl; } #endif // YYDEBUG @@ -1020,7 +1015,7 @@ const yy::]b4_parser_class_name[::token_number_type yy::]b4_parser_class_name[:: ]b4_epilogue dnl -@output stack.hh +@output b4_dir_prefix[]stack.hh b4_copyright([stack handling for Bison C++ parsers], [2002, 2003, 2004, 2005])[ #ifndef BISON_STACK_HH @@ -1118,227 +1113,4 @@ namespace yy } #endif // not BISON_STACK_HH] -dnl -@output position.hh -b4_copyright([Position class for Bison C++ parsers], [2002, 2003, 2004, 2005])[ - -/** - ** \file position.hh - ** Define the position class. - */ - -#ifndef BISON_POSITION_HH -# define BISON_POSITION_HH - -# include -# include - -namespace yy -{ - /// Abstract a position. - class position - { - public: - /// Initial column number. - static const unsigned int initial_column = 0; - /// Initial line number. - static const unsigned int initial_line = 1; - - /** \name Ctor & dtor. - ** \{ */ - public: - /// Construct a position. - position () : - filename (0), - line (initial_line), - column (initial_column) - { - } - /** \} */ - - - /** \name Line and Column related manipulators - ** \{ */ - public: - /// (line related) Advance to the COUNT next lines. - inline void lines (int count = 1) - { - column = initial_column; - line += count; - } - - /// (column related) Advance to the COUNT next columns. - inline void columns (int count = 1) - { - int leftmost = initial_column; - int current = column; - if (leftmost <= current + count) - column += count; - else - column = initial_column; - } - /** \} */ - - public: - /// File name to which this position refers. - ]b4_filename_type[* filename; - /// Current line number. - unsigned int line; - /// Current column number. - unsigned int column; - }; - - /// Add and assign a position. - inline const position& - operator+= (position& res, const int width) - { - res.columns (width); - return res; - } - - /// Add two position objects. - inline const position - operator+ (const position& begin, const int width) - { - position res = begin; - return res += width; - } - - /// Add and assign a position. - inline const position& - operator-= (position& res, const int width) - { - return res += -width; - } - - /// Add two position objects. - inline const position - operator- (const position& begin, const int width) - { - return begin + -width; - } - - /** \brief Intercept output stream redirection. - ** \param ostr the destination output stream - ** \param pos a reference to the position to redirect - */ - inline std::ostream& - operator<< (std::ostream& ostr, const position& pos) - { - if (pos.filename) - ostr << *pos.filename << ':'; - return ostr << pos.line << '.' << pos.column; - } - -} -#endif // not BISON_POSITION_HH] -@output location.hh -b4_copyright([Location class for Bison C++ parsers], [2002, 2003, 2004, 2005])[ - -/** - ** \file location.hh - ** Define the location class. - */ - -#ifndef BISON_LOCATION_HH -# define BISON_LOCATION_HH - -# include -# include -# include "position.hh" - -namespace yy -{ - - /// Abstract a location. - class location - { - /** \name Ctor & dtor. - ** \{ */ - public: - /// Construct a location. - location () : - begin (), - end () - { - } - /** \} */ - - - /** \name Line and Column related manipulators - ** \{ */ - public: - /// Reset initial location to final location. - inline void step () - { - begin = end; - } - - /// Extend the current location to the COUNT next columns. - inline void columns (unsigned int count = 1) - { - end += count; - } - - /// Extend the current location to the COUNT next lines. - inline void lines (unsigned int count = 1) - { - end.lines (count); - } - /** \} */ - - - public: - /// Beginning of the located region. - position begin; - /// End of the located region. - position end; - }; - - /// Join two location objects to create a location. - inline const location operator+ (const location& begin, const location& end) - { - location res = begin; - res.end = end.end; - return res; - } - - /// Add two location objects. - inline const location operator+ (const location& begin, unsigned int width) - { - location res = begin; - res.columns (width); - return res; - } - - /// Add and assign a location. - inline location& operator+= (location& res, unsigned int width) - { - res.columns (width); - return res; - } - - /** \brief Intercept output stream redirection. - ** \param ostr the destination output stream - ** \param loc a reference to the location to redirect - ** - ** Avoid duplicate information. - */ - inline std::ostream& operator<< (std::ostream& ostr, const location& loc) - { - position last = loc.end - 1; - ostr << loc.begin; - if (last.filename - && (!loc.begin.filename - || *loc.begin.filename != *last.filename)) - ostr << '-' << last; - else if (loc.begin.line != last.line) - ostr << '-' << last.line << '.' << last.column; - else if (loc.begin.column != last.column) - ostr << '-' << last.column; - return ostr; - } - -} - -#endif // not BISON_LOCATION_HH] +m4_divert(-1)