diff --git a/data/lalr1.cc b/data/lalr1.cc index 0f470994..984be33a 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -360,7 +360,7 @@ m4_define([b4_shared_declarations], void yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym); /// Pop \a n symbols from the stack. - void yypop_ (unsigned n = 1); + void yypop_ (int n = 1); /// Constants. enum @@ -689,7 +689,7 @@ m4_if(b4_prefix, [yy], [], } void - ]b4_parser_class_name[::yypop_ (unsigned n) + ]b4_parser_class_name[::yypop_ (int n) { yystack_.pop (n); } diff --git a/data/stack.hh b/data/stack.hh index 4f712159..0f1b502e 100644 --- a/data/stack.hh +++ b/data/stack.hh @@ -49,6 +49,15 @@ m4_define([b4_stack_define], return seq_[size () - 1 - i]; } + /// Random access. + /// + /// Index 0 returns the topmost element. + T& + operator[] (int i) + { + return operator[] (size_type (i)); + } + /// Random access. /// /// Index 0 returns the topmost element. @@ -58,6 +67,15 @@ m4_define([b4_stack_define], return seq_[size () - 1 - i]; } + /// Random access. + /// + /// Index 0 returns the topmost element. + const T& + operator[] (int i) const + { + return operator[] (size_type (i)); + } + /// Steal the contents of \a t. /// /// Close to move-semantics. @@ -69,9 +87,9 @@ m4_define([b4_stack_define], } void - pop (size_type n = 1) + pop (int n = 1) { - for (; n; --n) + for (; 0 < n; --n) seq_.pop_back (); } @@ -111,21 +129,20 @@ m4_define([b4_stack_define], class slice { public: - typedef typename S::size_type size_type; - slice (const S& stack, size_type range) + slice (const S& stack, int range) : stack_ (stack) , range_ (range) {} const T& - operator[] (size_type i) const + operator[] (int i) const { return stack_[range_ - i]; } private: const S& stack_; - size_type range_; + int range_; }; ]])