diff --git a/src/hammer.cxx b/src/hammer.cxx index 1cf38c2..e7f3cb7 100644 --- a/src/hammer.cxx +++ b/src/hammer.cxx @@ -98,12 +98,17 @@ namespace hammer { template Many Parser::many() { - return Many(this); + return Many(*this); + } + + template<> + Many Parser::many() { + return Many(*this); } template - RepeatN Parser::many(size_t n) { - return RepeatN(this, n); + RepeatN Parser::many(size_t n) { + return RepeatN(this, n); } template @@ -112,8 +117,8 @@ namespace hammer { } template - RepeatN Parser::operator[](size_t n) { - return RepeatN(this, n); + RepeatN Parser::operator[](size_t n) { + return RepeatN(this, n); } IntRange Int64::in_range(const int64_t lower, const int64_t upper) { diff --git a/src/hammer.hxx b/src/hammer.hxx index 287ca21..8f3200c 100644 --- a/src/hammer.hxx +++ b/src/hammer.hxx @@ -69,9 +69,9 @@ namespace hammer { /* forward declarations */ template class Many; - template class Many1; + class Many1; template class Optional; - template class RepeatN; + class RepeatN; template class IntRange; template @@ -81,12 +81,12 @@ namespace hammer { result_type parse(const string &input); result_type parse(const uint8_t *input, size_t length); Many many(); - RepeatN many(size_t n); + RepeatN many(size_t n); Optional optional(); - RepeatN operator[](size_t n); - const HParser* parser() { return _parser; } + RepeatN operator[](size_t n); + HParser* parser() { return _parser; } protected: - const HParser* _parser; + HParser* _parser; Parser() { } // Parser(const Parser &p) : _parser(p.parser()) { } // hopefully we don't need a copy constructor... }; @@ -105,6 +105,7 @@ namespace hammer { class Ch : public Parser { public: + friend class Parser; Ch(const uint8_t c) : _c(c) { _parser = h_ch(c); } @@ -378,24 +379,22 @@ namespace hammer { Parser _p; }; - template class Many1 : public Parser { public: - Many1(Parser &p) : _p(p) { + Many1(Parser &p) : _p(p) { _parser = h_many1(p.parser()); } private: - Parser _p; + Parser _p; }; - template class RepeatN: public Parser { public: - RepeatN(Parser &p, const size_t n) : _p(p), _n(n) { + RepeatN(Parser &p, const size_t n) : _p(p), _n(n) { _parser = h_repeat_n(p.parser(), n); } private: - Parser _p; + Parser _p; size_t _n; }; @@ -410,36 +409,31 @@ namespace hammer { Parser _p; }; - template class Ignore : public Parser { public: - Ignore(Parser &p) : _p(p) { + Ignore(Parser &p) : _p(p) { _parser = h_ignore(p.parser()); } private: - Parser _p; + Parser _p; }; - template class SepBy : public Parser { public: - SepBy(Parser &p, Parser &sep) : _p(p), _sep(sep) { + SepBy(Parser &p, Parser &sep) : _p(p), _sep(sep) { _parser = h_sepBy(p.parser(), sep.parser()); } private: - Parser _p; - Parser _sep; + Parser _p, _sep; }; - template class SepBy1 : public Parser { public: - SepBy1(Parser &p, Parser &sep) : _p(p), _sep(sep) { + SepBy1(Parser &p, Parser &sep) : _p(p), _sep(sep) { _parser = h_sepBy1(p.parser(), sep.parser()); } private: - Parser _p; - Parser _sep; + Parser _p, _sep; }; class Epsilon : public Parser { @@ -462,29 +456,28 @@ namespace hammer { /* FIXME attr_bool */ - template class And : public Parser { public: - And(Parser &p) : _p(p) { + And(Parser &p) : _p(p) { _parser = h_and(p.parser()); } private: - Parser _p; + Parser _p; }; - template class Not : public Parser { public: Not(Parser &p) : _p(p) { _parser = h_not(p.parser()); } private: - Parser _p; + Parser _p; }; template class Indirect : public Parser { public: + typedef typename T::result_type result_type; Indirect(Parser &p) : _p(p) { this->_parser = h_indirect(); h_bind_indirect(this->_parser, p.parser());