X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f939fc12fea8a86862698dd07ff4d972ed99083d..473013144def14af635adc1c47d3718d41ced23e:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index 2ef527b6..1d7b2431 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -81,6 +81,39 @@ m4_define([b4_constructor], [])]) +# b4_parse_param_decl +# ------------------- +# Constructor's extra arguments. +m4_define([b4_parse_param_decl], + [m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])]) + +# b4_parse_param_cons +# ------------------- +# constructor's extra initialisations. +m4_define([b4_parse_param_cons], + [m4_ifset([b4_parse_param], + [, + b4_cc_constructor_calls(b4_parse_param)])]) +m4_define([b4_cc_constructor_calls], + [m4_map_sep([b4_cc_constructor_call], [, + ], [$@])]) +m4_define([b4_cc_constructor_call], + [$2($2)]) + +# b4_parse_param_vars +# ------------------- +# Extra instance variables. +m4_define([b4_parse_param_vars], + [m4_ifset([b4_parse_param], + [ + /* User arguments. */ +b4_cc_var_decls(b4_parse_param)])]) +m4_define([b4_cc_var_decls], + [m4_map_sep([b4_cc_var_decl], [ +], [$@])]) +m4_define([b4_cc_var_decl], + [ $1;]) + # We do want M4 expansion after # for CPP macros. m4_changecom() m4_divert(0)dnl @@ -137,7 +170,7 @@ b4_syncline([@oline@], [@ofile@])], b4_syncline([@oline@], [@ofile@])[ #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ - Current.end = Rhs[N].end; + ((Current).end = Rhs[N].end) #endif namespace yy @@ -178,14 +211,14 @@ namespace yy #if YYLSP_NEEDED ]b4_parser_class_name[ (bool debug, - LocationType initlocation][]b4_param[) : + LocationType initlocation][]b4_param[]b4_parse_param_decl[) : ]b4_constructor[][debug_ (debug), cdebug_ (std::cerr), - initlocation_ (initlocation) + initlocation_ (initlocation)]b4_parse_param_cons[ #else - ]b4_parser_class_name[ (bool debug][]b4_param[) : + ]b4_parser_class_name[ (bool debug][]b4_param[]b4_parse_param_decl[) : ]b4_constructor[][debug_ (debug), - cdebug_ (std::cerr) + cdebug_ (std::cerr)]b4_parse_param_cons[ #endif { } @@ -209,12 +242,12 @@ namespace yy /* Tables. */ static const ]b4_int_type_for([b4_pact])[ pact_[]; - static const ]b4_int_type_for([b4_pact])[ pact_ninf_; + static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ pact_ninf_; static const ]b4_int_type_for([b4_defact])[ defact_[]; static const ]b4_int_type_for([b4_pgoto])[ pgoto_[]; static const ]b4_int_type_for([b4_defgoto])[ defgoto_[]; static const ]b4_int_type_for([b4_table])[ table_[]; - static const ]b4_int_type_for([b4_table])[ table_ninf_; + static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ table_ninf_; static const ]b4_int_type_for([b4_check])[ check_[]; static const ]b4_int_type_for([b4_r1])[ r1_[]; static const ]b4_int_type_for([b4_r2])[ r2_[]; @@ -274,6 +307,7 @@ namespace yy /* Initial location. */ LocationType initlocation_; +]b4_parse_param_vars[ }; } @@ -294,7 +328,7 @@ m4_if(b4_defines_flag, 0, [], [#include @output_header_name@])[ #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 +#define YYERROR goto yyerrorlab int @@ -361,6 +395,8 @@ yy::]b4_parser_class_name[::parse () #endif } + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ n_ += ilooka_; if (n_ < 0 || last_ < n_ || check_[n_] != ilooka_) goto yydefault; @@ -405,16 +441,26 @@ yy::]b4_parser_class_name[::parse () state_ = n_; goto yynewstate; - /* Default action. */ +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ yydefault: n_ = defact_[state_]; if (n_ == 0) goto yyerrlab; goto yyreduce; - /* Reduce. */ +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: len_ = r2_[n_]; + /* 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 (len_) { yyval = semantic_stack_[len_ - 1]; @@ -432,9 +478,9 @@ yy::]b4_parser_class_name[::parse () // Short files will use "unsigned char" for line numbers, // in which case they will be output as character litterals // by "<<". - unsigned yylineno = rline_[n_]; + unsigned yylno = rline_[n_]; YYCDEBUG << "Reducing via rule " << n_ - 1 - << " (line " << yylineno << "), "; + << " (line " << yylno << "), "; for (]b4_int_type_for([b4_prhs])[ i = prhs_[n_]; 0 <= rhs_[i]; ++i) YYCDEBUG << name_[rhs_[i]] << ' '; @@ -483,7 +529,9 @@ b4_syncline([@oline@], [@ofile@])[ state_ = defgoto_[n_ - ntokens_]; goto yynewstate; - /* Report and recover from errors. This is very incomplete. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!errstatus) @@ -498,17 +546,23 @@ b4_syncline([@oline@], [@ofile@])[ message += name_[ilooka_]; { int count = 0; - for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int xbegin = n_ < 0 ? -n_ : 0; + /* Stay within bounds of both yycheck and yytname. */ + int checklim = last_ - n_; + int xend = checklim < ntokens_ ? checklim : ntokens_; + for (int x = xbegin; x < xend; ++x) if (check_[x + n_] == x && x != terror_) ++count; if (count < 5) { count = 0; - for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) - if (check_[x + n_] == x && x != terror_) + for (int x1 = xbegin; x1 < xend; ++x1) + if (check_[x1 + n_] == x1 && x1 != terror_) { message += (!count++) ? ", expecting " : " or "; - message += name_[x]; + message += name_[x1]; } } } @@ -518,32 +572,61 @@ b4_syncline([@oline@], [@ofile@])[ message = "syntax error"; error_ (); } - goto yyerrlab1; - - /*----------------------------------------------------. - | yyerrlab1 -- error raised explicitly by an action. | - `----------------------------------------------------*/ - yyerrlab1: if (errstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ /* Return failure if at end of input. */ - if (looka_ == eof_) - goto yyabortlab; + if (looka_ <= eof_) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (looka_ == eof_) + for (;;) + { + state_stack_.pop (); + semantic_stack_.pop (); + location_stack_.pop (); + if (state_stack_.height () == 1) + YYABORT; +// YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); +// FIXME: yydestruct (yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[); + } + } + else + { #if YYDEBUG - YYCDEBUG << "Discarding token " << looka_ - << " (" << name_[ilooka_] << ")." << std::endl; + YYCDEBUG << "Discarding token " << looka_ + << " (" << name_[ilooka_] << ")." << std::endl; +// yydestruct (yytoken, &yylval]b4_location_if([, &yylloc])[); #endif - looka_ = empty_; + looka_ = empty_; + } } /* Else will try to reuse lookahead token after shifting the error token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + state_stack_.pop (len_); + semantic_stack_.pop (len_); + location_stack_.pop (len_); + state_ = state_stack_[0]; + goto yyerrlab1; - errstatus = 3; +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + errstatus = 3; /* Each real token shifted decrements this. */ for (;;) { @@ -561,7 +644,7 @@ b4_syncline([@oline@], [@ofile@])[ /* Pop the current state because it cannot handle the error token. */ if (state_stack_.height () == 1) - goto yyabortlab; + YYABORT; #if YYDEBUG if (debug_) @@ -585,9 +668,10 @@ b4_syncline([@oline@], [@ofile@])[ } #endif - state_ = (state_stack_.pop (), state_stack_[0]); + state_stack_.pop (); semantic_stack_.pop (); - location_stack_.pop ();; + location_stack_.pop (); + state_ = state_stack_[0]; #if YYDEBUG if (debug_) @@ -633,7 +717,7 @@ yy::]b4_parser_class_name[::lex_ () /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -const ]b4_int_type_for([b4_pact]) yy::b4_parser_class_name::pact_ninf_ = b4_pact_ninf[; +const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) yy::b4_parser_class_name::pact_ninf_ = b4_pact_ninf[; const ]b4_int_type_for([b4_pact])[ yy::]b4_parser_class_name[::pact_[] = { @@ -666,7 +750,7 @@ yy::]b4_parser_class_name[::defgoto_[] = /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. */ -const ]b4_int_type_for([b4_table]) yy::b4_parser_class_name::table_ninf_ = b4_table_ninf[; +const ]b4_int_type(b4_table_ninf, b4_table_ninf) yy::b4_parser_class_name::table_ninf_ = b4_table_ninf[; const ]b4_int_type_for([b4_table])[ yy::]b4_parser_class_name[::table_[] = { @@ -752,12 +836,12 @@ yy::]b4_parser_class_name[::translate_ (int token) { static const TokenNumberType - translate_[] = + translate_table[] = { ]b4_translate[ }; if ((unsigned) token <= user_token_number_max_) - return translate_[token]; + return translate_table[token]; else return undef_token_; } @@ -804,16 +888,16 @@ namespace yy inline T& - operator [] (unsigned index) + operator [] (unsigned i) { - return seq_[index]; + return seq_[i]; } inline const T& - operator [] (unsigned index) const + operator [] (unsigned i) const { - return seq_[index]; + return seq_[i]; } inline @@ -859,9 +943,9 @@ namespace yy inline const T& - operator [] (unsigned index) const + operator [] (unsigned i) const { - return stack_[range_ - index]; + return stack_[range_ - i]; } private: @@ -914,20 +998,20 @@ namespace yy /** \name Line and Column related manipulators ** \{ */ public: - /** \brief (line related) Advance to the LINES next lines. */ - inline void lines (int lines = 1) + /** \brief (line related) Advance to the COUNT next lines. */ + inline void lines (int count = 1) { column = initial_column; - line += lines; + line += count; } - /** \brief (column related) Advance to the COLUMNS next columns. */ - inline void columns (int columns = 1) + /** \brief (column related) Advance to the COUNT next columns. */ + inline void columns (int count = 1) { int leftmost = initial_column; int current = column; - if (leftmost <= current + columns) - column += columns; + if (leftmost <= current + count) + column += count; else column = initial_column; } @@ -979,7 +1063,7 @@ namespace yy inline std::ostream& operator<< (std::ostream& ostr, const Position& pos) { - if (pos.filename != "") + if (!pos.filename.empty ()) ostr << pos.filename << ':'; return ostr << pos.line << '.' << pos.column; } @@ -1028,16 +1112,16 @@ namespace yy begin = end; } - /** \brief Extend the current location to the COLUMNS next columns. */ - inline void columns (unsigned columns = 1) + /** \brief Extend the current location to the COUNT next columns. */ + inline void columns (unsigned int count = 1) { - end += columns; + end += count; } - /** \brief Extend the current location to the LINES next lines. */ - inline void lines (unsigned lines = 1) + /** \brief Extend the current location to the COUNT next lines. */ + inline void lines (unsigned int count = 1) { - end.lines (lines); + end.lines (count); } /** \} */