X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/99880de508cd84d0ed8fa23c24a7337c21f23059..c7a65b99a6ee5095a752be24303856e31e9429cd:/data/lalr1.cc?ds=inline diff --git a/data/lalr1.cc b/data/lalr1.cc index fbfc0b76..ed825075 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -46,6 +46,7 @@ m4_define([b4_rhs_value], [(yysemantic_stack_@{m4_eval([$1 - $2])@}m4_ifval([$3], [.$3]))]) m4_define_default([b4_location_type], [location]) +m4_define_default([b4_filename_type], [std::string]) # b4_lhs_location() # ----------------- @@ -118,15 +119,18 @@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], #ifndef PARSER_HEADER_H # define PARSER_HEADER_H -#include "stack.hh" -#include "location.hh" - #include #include /* Using locations. */ #define YYLSP_NEEDED ]b4_locations_flag[ +namespace yy +{ + class position; + class location; +} + ]b4_token_defines(b4_tokens)[ /* Copy the first part of user declarations. */ @@ -135,6 +139,9 @@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], ]/* Line __line__ of lalr1.cc. */ b4_syncline([@oline@], [@ofile@])[ +#include "stack.hh" +#include "location.hh" + /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG ]b4_debug[ @@ -206,25 +213,12 @@ namespace yy /// A Bison parser. class ]b4_parser_class_name[ { - public: - /// Internal symbol numbers. - typedef traits<]b4_parser_class_name[>::token_number_type token_number_type; - /// A type to store symbol numbers and -1. - typedef traits<]b4_parser_class_name[>::rhs_number_type rhs_number_type; - /// State numbers. - typedef traits<]b4_parser_class_name[>::state_type state_type; /// Symbol semantic values. - typedef traits<]b4_parser_class_name[>::semantic_type semantic_type; + typedef traits<]b4_parser_class_name[>::semantic_type semantic_type; /// Symbol locations. - typedef traits<]b4_parser_class_name[>::location_type location_type; - - /// State stack type. - typedef stack state_stack; - /// Semantic value stack type. - typedef stack semantic_stack; - /// location stack type. - typedef stack location_stack; + typedef traits<]b4_parser_class_name[>::location_type location_type; + public: /// Build a parser object. ]b4_parser_class_name[ (]b4_parse_param_decl[) : yydebug_ (false), @@ -276,13 +270,24 @@ namespace yy #endif /* ! YYDEBUG */ + /// State numbers. + typedef traits<]b4_parser_class_name[>::state_type state_type; + /// State stack type. + typedef stack state_stack_type; + /// Semantic value stack type. + typedef stack semantic_stack_type; + /// location stack type. + typedef stack location_stack_type; + /// The state stack. - state_stack yystate_stack_; + state_stack_type yystate_stack_; /// The semantic value stack. - semantic_stack yysemantic_stack_; + semantic_stack_type yysemantic_stack_; /// The location stack. - location_stack yylocation_stack_; + location_stack_type yylocation_stack_; + /// Internal symbol numbers. + typedef traits<]b4_parser_class_name[>::token_number_type token_number_type; /* Tables. */ /// For a state, the index in \a yytable_ of its portion. static const ]b4_int_type_for([b4_pact])[ yypact_[]; @@ -320,6 +325,8 @@ namespace yy #endif #if YYDEBUG + /// A type to store symbol numbers and -1. + typedef traits<]b4_parser_class_name[>::rhs_number_type rhs_number_type; /// A `-1'-separated list of the rules' RHS. static const rhs_number_type yyrhs_[]; /// For each rule, the index of the first RHS symbol in \a yyrhs_. @@ -484,6 +491,7 @@ yy::]b4_parser_class_name[::yydestruct_ (const char* yymsg, int yytype, semantic_type* yyvaluep, location_type* yylocationp) { /* Pacify ``unused variable'' warnings. */ + (void) yymsg; (void) yyvaluep; (void) yylocationp; @@ -557,9 +565,9 @@ b4_syncline([@oline@], [@ofile@])])dnl yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ - yystate_stack_ = state_stack (0); - yysemantic_stack_ = semantic_stack (0); - yylocation_stack_ = location_stack (0); + yystate_stack_ = state_stack_type (0); + yysemantic_stack_ = semantic_stack_type (0); + yylocation_stack_ = location_stack_type (0); yysemantic_stack_.push (yylval); yylocation_stack_.push (yylloc); @@ -662,7 +670,7 @@ yyreduce: yyval = yysemantic_stack_[0]; { - slice slice (yylocation_stack_, yylen_); + slice slice (yylocation_stack_, yylen_); YYLLOC_DEFAULT (yyloc, slice, yylen_); } YY_REDUCE_PRINT (yyn_); @@ -989,7 +997,7 @@ void yy::]b4_parser_class_name[::yystack_print_ () { *yycdebug_ << "Stack now"; - for (state_stack::const_iterator i = yystate_stack_.begin (); + for (state_stack_type::const_iterator i = yystate_stack_.begin (); i != yystate_stack_.end (); ++i) *yycdebug_ << ' ' << *i; *yycdebug_ << std::endl; @@ -1111,6 +1119,7 @@ namespace yy S seq_; }; + /// Present a slice of the top of a stack. template > class slice { @@ -1168,7 +1177,7 @@ namespace yy public: /// Construct a position. position () : - filename (), + filename (0), line (initial_line), column (initial_column) { @@ -1200,7 +1209,7 @@ namespace yy public: /// File name to which this position refers. - std::string filename; + ]b4_filename_type[* filename; /// Current line number. unsigned int line; /// Current column number. @@ -1244,8 +1253,8 @@ namespace yy inline std::ostream& operator<< (std::ostream& ostr, const position& pos) { - if (!pos.filename.empty ()) - ostr << pos.filename << ':'; + if (pos.filename) + ostr << *pos.filename << ':'; return ostr << pos.line << '.' << pos.column; } @@ -1276,7 +1285,7 @@ namespace yy ** \{ */ public: /// Construct a location. - location (void) : + location () : begin (), end () { @@ -1288,7 +1297,7 @@ namespace yy ** \{ */ public: /// Reset initial location to final location. - inline void step (void) + inline void step () { begin = end; } @@ -1347,7 +1356,9 @@ namespace yy { position last = loc.end - 1; ostr << loc.begin; - if (loc.begin.filename != last.filename) + 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;