diff options
Diffstat (limited to '3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition')
-rw-r--r-- | 3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition/charset.hpp | 81 | ||||
-rw-r--r-- | 3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition/equivset.hpp | 140 |
2 files changed, 221 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition/charset.hpp b/3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition/charset.hpp new file mode 100644 index 0000000..c74dd36 --- /dev/null +++ b/3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition/charset.hpp @@ -0,0 +1,81 @@ +// charset.hpp +// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +#ifndef BOOST_LEXER_CHARSET_HPP +#define BOOST_LEXER_CHARSET_HPP + +#include <set> +#include "../size_t.hpp" +#include "../string_token.hpp" + +namespace boost +{ +namespace lexer +{ +namespace detail +{ +template<typename CharT> +struct basic_charset +{ + typedef basic_string_token<CharT> token; + typedef std::set<std::size_t> index_set; + + token _token; + index_set _index_set; + + basic_charset () + { + } + + basic_charset (const token &token_, const std::size_t index_) : + _token (token_) + { + _index_set.insert (index_); + } + + bool empty () const + { + return _token.empty () && _index_set.empty (); + } + + void intersect (basic_charset &rhs_, basic_charset &overlap_) + { + _token.intersect (rhs_._token, overlap_._token); + + if (!overlap_._token.empty ()) + { + typename index_set::const_iterator iter_ = _index_set.begin (); + typename index_set::const_iterator end_ = _index_set.end (); + + for (; iter_ != end_; ++iter_) + { + overlap_._index_set.insert (*iter_); + } + + iter_ = rhs_._index_set.begin (); + end_ = rhs_._index_set.end (); + + for (; iter_ != end_; ++iter_) + { + overlap_._index_set.insert (*iter_); + } + + if (_token.empty ()) + { + _index_set.clear (); + } + + if (rhs_._token.empty ()) + { + rhs_._index_set.clear (); + } + } + } +}; +} +} +} + +#endif diff --git a/3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition/equivset.hpp b/3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition/equivset.hpp new file mode 100644 index 0000000..b39fb15 --- /dev/null +++ b/3rdParty/Boost/src/boost/spirit/home/support/detail/lexer/partition/equivset.hpp @@ -0,0 +1,140 @@ +// equivset.hpp +// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +#ifndef BOOST_LEXER_EQUIVSET_HPP +#define BOOST_LEXER_EQUIVSET_HPP + +#include <algorithm> +#include "../parser/tree/node.hpp" +#include <set> +#include "../size_t.hpp" + +namespace boost +{ +namespace lexer +{ +namespace detail +{ +struct equivset +{ + typedef std::set<std::size_t> index_set; + typedef std::vector<std::size_t> index_vector; + // Not owner of nodes: + typedef std::vector<node *> node_vector; + + index_vector _index_vector; + bool _greedy; + std::size_t _id; + node_vector _followpos; + + equivset () : + _greedy (true), + _id (0) + { + } + + equivset (const index_set &index_set_, const bool greedy_, + const std::size_t id_, const node_vector &followpos_) : + _greedy (greedy_), + _id (id_), + _followpos (followpos_) + { + index_set::const_iterator iter_ = index_set_.begin (); + index_set::const_iterator end_ = index_set_.end (); + + for (; iter_ != end_; ++iter_) + { + _index_vector.push_back (*iter_); + } + } + + bool empty () const + { + return _index_vector.empty () && _followpos.empty (); + } + + void intersect (equivset &rhs_, equivset &overlap_) + { + intersect_indexes (rhs_._index_vector, overlap_._index_vector); + + if (!overlap_._index_vector.empty ()) + { + // Note that the LHS takes priority in order to + // respect rule ordering priority in the lex spec. + overlap_._id = _id; + overlap_._greedy = _greedy; + overlap_._followpos = _followpos; + + node_vector::const_iterator overlap_begin_ = + overlap_._followpos.begin (); + node_vector::const_iterator overlap_end_ = + overlap_._followpos.end (); + node_vector::const_iterator rhs_iter_ = + rhs_._followpos.begin (); + node_vector::const_iterator rhs_end_ = + rhs_._followpos.end (); + + for (; rhs_iter_ != rhs_end_; ++rhs_iter_) + { + node *node_ = *rhs_iter_; + + if (std::find (overlap_begin_, overlap_end_, node_) == + overlap_end_) + { + overlap_._followpos.push_back (node_); + overlap_begin_ = overlap_._followpos.begin (); + overlap_end_ = overlap_._followpos.end (); + } + } + + if (_index_vector.empty ()) + { + _followpos.clear (); + } + + if (rhs_._index_vector.empty ()) + { + rhs_._followpos.clear (); + } + } + } + +private: + void intersect_indexes (index_vector &rhs_, index_vector &overlap_) + { + index_vector::iterator iter_ = _index_vector.begin (); + index_vector::iterator end_ = _index_vector.end (); + index_vector::iterator rhs_iter_ = rhs_.begin (); + index_vector::iterator rhs_end_ = rhs_.end (); + + while (iter_ != end_ && rhs_iter_ != rhs_end_) + { + const std::size_t index_ = *iter_; + const std::size_t rhs_index_ = *rhs_iter_; + + if (index_ < rhs_index_) + { + ++iter_; + } + else if (index_ > rhs_index_) + { + ++rhs_iter_; + } + else + { + overlap_.push_back (index_); + iter_ = _index_vector.erase (iter_); + end_ = _index_vector.end (); + rhs_iter_ = rhs_.erase (rhs_iter_); + rhs_end_ = rhs_.end (); + } + } + } +}; +} +} +} + +#endif |