X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParse.cci;h=011ff9d137ae70a1c074b86f01c93a6195c60bf7;hb=456ee576285b76aa46240f8001f426757810dcc1;hp=c85fad85c1480e730860a742223d8d88eca45196;hpb=d620e7ff9b68377ea20ca266c23cc3f05781868c;p=senf.git diff --git a/Console/Parse.cci b/Console/Parse.cci index c85fad8..011ff9d 100644 --- a/Console/Parse.cci +++ b/Console/Parse.cci @@ -41,8 +41,20 @@ prefix_ std::string const & senf::console::ArgumentToken::value() return token_; } -prefix_ senf::console::ArgumentToken::ArgumentToken(std::string token) - : token_ (token) +prefix_ senf::console::ArgumentToken::TokenType senf::console::ArgumentToken::type() + const +{ + return type_; +} + +prefix_ bool senf::console::ArgumentToken::is(unsigned tokens) + const +{ + return tokens & type_; +} + +prefix_ senf::console::ArgumentToken::ArgumentToken(TokenType type, std::string token) + : type_(type), token_ (token) {} /////////////////////////////////////////////////////////////////////////// @@ -66,7 +78,8 @@ prefix_ senf::console::ParseCommandInfo::ArgumentsRange senf::console::ParseCommandInfo::arguments() const { - return boost::make_iterator_range(arguments_.begin(), arguments_.end()); + return boost::make_iterator_range( ArgumentIterator(tokens_.begin()), + ArgumentIterator(tokens_.end()) ); } prefix_ senf::console::ParseCommandInfo::TokensRange senf::console::ParseCommandInfo::tokens() @@ -83,8 +96,6 @@ prefix_ void senf::console::ParseCommandInfo::init() builtin_ = NoBuiltin; commandPath_.clear(); tokens_.clear(); - arguments_.clear(); - tempArguments_.clear(); } prefix_ void senf::console::ParseCommandInfo::setBuiltin(BuiltinCommand builtin) @@ -99,19 +110,123 @@ senf::console::ParseCommandInfo::setCommand(std::vector & commandPa commandPath_.swap(commandPath); } -prefix_ void senf::console::ParseCommandInfo::startArgument() +prefix_ void senf::console::ParseCommandInfo::addToken(ArgumentToken const & token) +{ + tokens_.push_back(token); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::console::ParseCommandInfo::ArgumentIterator + +prefix_ senf::console::ParseCommandInfo::ArgumentIterator::ArgumentIterator() +{} + +prefix_ senf::console::ParseCommandInfo::ArgumentIterator:: +ArgumentIterator(ParseCommandInfo::TokensRange::iterator i) + : b_(i), e_(i) +{} + +prefix_ senf::console::ParseCommandInfo::ArgumentIterator::reference +senf::console::ParseCommandInfo::ArgumentIterator::dereference() + const +{ + if (b_ == e_) setRange(); + return b_->is(ArgumentToken::ArgumentGroupOpen) + ? boost::make_iterator_range(boost::next(b_), boost::prior(e_)) + : boost::make_iterator_range(b_, e_); +} + +prefix_ bool +senf::console::ParseCommandInfo::ArgumentIterator::equal(ArgumentIterator const & other) + const { - tempArguments_.push_back( TempArgumentRange( tokens_.size(), tokens_.size() ) ); + return b_ == other.b_; } -prefix_ void senf::console::ParseCommandInfo::endArgument() +prefix_ void senf::console::ParseCommandInfo::ArgumentIterator::increment() { - tempArguments_.back().second = tokens_.size(); + if (b_ == e_) setRange(); + b_ = e_; } -prefix_ void senf::console::ParseCommandInfo::addToken(ArgumentToken const & token) +/////////////////////////////////////////////////////////////////////////// + +prefix_ senf::console::CheckedArgumentIteratorWrapper:: +CheckedArgumentIteratorWrapper(ParseCommandInfo::ArgumentsRange const & range, + std::string const & msg) + : i_ (range.begin()), e_ (range.end()), msg_ (msg) +{} + +prefix_ senf::console::CheckedArgumentIteratorWrapper:: +CheckedArgumentIteratorWrapper(ParseCommandInfo::TokensRange const & range, + std::string const & msg) + : i_ (range.begin()), e_ (range.end()), msg_ (msg) +{} + +prefix_ senf::console::CheckedArgumentIteratorWrapper::~CheckedArgumentIteratorWrapper() { - tokens_.push_back(token); + if (i_ != e_ && ! std::uncaught_exception()) + throw SyntaxErrorException(msg_); +} + +prefix_ senf::console::CheckedArgumentIteratorWrapper::operator ParseCommandInfo::ArgumentIterator() +{ + return i_; +} + +prefix_ bool senf::console::CheckedArgumentIteratorWrapper::boolean_test() + const +{ + return i_ != e_; +} + +prefix_ bool senf::console::CheckedArgumentIteratorWrapper::done() + const +{ + return i_ == e_; +} + +prefix_ void senf::console::CheckedArgumentIteratorWrapper::clear() +{ + i_ = e_; +} + +prefix_ senf::console::CheckedArgumentIteratorWrapper::reference +senf::console::CheckedArgumentIteratorWrapper::dereference() + const +{ + if (i_ == e_) + throw SyntaxErrorException(msg_); + return *i_; +} + +prefix_ void senf::console::CheckedArgumentIteratorWrapper::increment() +{ + if (i_ == e_) + throw SyntaxErrorException(msg_); + ++ i_; +} + +prefix_ bool senf::console::CheckedArgumentIteratorWrapper:: +operator==(ParseCommandInfo::ArgumentIterator const & other) + const +{ + return i_ == other; +} + +prefix_ bool senf::console::CheckedArgumentIteratorWrapper:: +operator!=(ParseCommandInfo::ArgumentIterator const & other) + const +{ + return i_ != other; +} + +prefix_ senf::console::ParseCommandInfo::ArgumentIterator +senf::console::CheckedArgumentIteratorWrapper::operator++(int) +{ + ParseCommandInfo::ArgumentIterator i (i_); + increment(); + return i; } ///////////////////////////////////////////////////////////////////////////