// leaf_node.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_LEAF_NODE_HPP | |
#define BOOST_LEXER_LEAF_NODE_HPP | |
#include "../../consts.hpp" // null_token | |
#include "node.hpp" | |
#include "../../size_t.hpp" | |
namespace boost | |
{ | |
namespace lexer | |
{ | |
namespace detail | |
{ | |
class leaf_node : public node | |
{ | |
public: | |
leaf_node (const std::size_t token_, const bool greedy_) : | |
node (token_ == null_token), | |
_token (token_), | |
_set_greedy (!greedy_), | |
_greedy (greedy_) | |
{ | |
if (!_nullable) | |
{ | |
_firstpos.push_back (this); | |
_lastpos.push_back (this); | |
} | |
} | |
virtual ~leaf_node () | |
{ | |
} | |
virtual void append_followpos (const node_vector &followpos_) | |
{ | |
for (node_vector::const_iterator iter_ = followpos_.begin (), | |
end_ = followpos_.end (); iter_ != end_; ++iter_) | |
{ | |
_followpos.push_back (*iter_); | |
} | |
} | |
virtual type what_type () const | |
{ | |
return LEAF; | |
} | |
virtual bool traverse (const_node_stack &/*node_stack_*/, | |
bool_stack &/*perform_op_stack_*/) const | |
{ | |
return false; | |
} | |
virtual std::size_t token () const | |
{ | |
return _token; | |
} | |
virtual void greedy (const bool greedy_) | |
{ | |
if (!_set_greedy) | |
{ | |
_greedy = greedy_; | |
_set_greedy = true; | |
} | |
} | |
virtual bool greedy () const | |
{ | |
return _greedy; | |
} | |
virtual const node_vector &followpos () const | |
{ | |
return _followpos; | |
} | |
virtual node_vector &followpos () | |
{ | |
return _followpos; | |
} | |
private: | |
std::size_t _token; | |
bool _set_greedy; | |
bool _greedy; | |
node_vector _followpos; | |
virtual void copy_node (node_ptr_vector &node_ptr_vector_, | |
node_stack &new_node_stack_, bool_stack &/*perform_op_stack_*/, | |
bool &/*down_*/) const | |
{ | |
node_ptr_vector_->push_back (static_cast<leaf_node *>(0)); | |
node_ptr_vector_->back () = new leaf_node (_token, _greedy); | |
new_node_stack_.push (node_ptr_vector_->back ()); | |
} | |
}; | |
} | |
} | |
} | |
#endif |