⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 2 页
字号:
        {            handle_.pop ();            assert (handle_.top ()._type == token::EXPRESSION);            // perform join            sequence (node_ptr_vector_, tree_node_stack_);            token_stack_.push (token::SUB);        }    }    static void repeat (token_stack &handle_, token_stack &token_stack_)    {        assert (handle_.top ()._type == token::REPEAT &&            handle_.size () >= 1 && handle_.size () <= 3);        if (handle_.size () == 1)        {            token_stack_.push (token::EXPRESSION);        }        else        {            handle_.pop ();            assert (handle_.top ()._type == token::DUP);            token_stack_.push (token::REPEAT);        }    }    static void charset (token_stack &handle_, token_stack &token_stack_,        node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)    {        assert (handle_.top ()._type == token::CHARSET &&            handle_.size () == 1);        // store charset        node_ptr_vector_->push_back (0);        const size_t id_ = handle_.top ()._id;        node_ptr_vector_->back () = new leaf_node (id_, true);        tree_node_stack_.push (node_ptr_vector_->back ());        token_stack_.push (token::REPEAT);    }    static void macro (token_stack &handle_, token_stack &token_stack_,        const macro_map &macromap_, node_ptr_vector &node_ptr_vector_,        tree_node_stack &tree_node_stack_)    {        token &top_ = handle_.top ();        assert (top_._type == token::MACRO && handle_.size () == 1);        typename macro_map::const_iterator iter_ =            macromap_.find (top_._macro);        if (iter_ == macromap_.end ())        {            const CharT *name_ = top_._macro;            std::basic_stringstream<CharT> ss_;            std::ostringstream os_;            os_ << "Unknown MACRO name '";            while (*name_)            {                os_ << ss_.narrow (*name_++, ' ');            }            os_ << "'.";            throw runtime_error (os_.str ());        }        tree_node_stack_.push (iter_->second->copy (node_ptr_vector_));        token_stack_.push (token::REPEAT);    }    static void openparen (token_stack &handle_, token_stack &token_stack_)    {        assert (handle_.top ()._type == token::OPENPAREN &&            handle_.size () == 3);        handle_.pop ();        assert (handle_.top ()._type == token::REGEX);        handle_.pop ();        assert (handle_.top ()._type == token::CLOSEPAREN);        token_stack_.push (token::REPEAT);    }    static void perform_or (node_ptr_vector &node_ptr_vector_,        tree_node_stack &tree_node_stack_)    {        // perform or        node *rhs_ = tree_node_stack_.top ();        tree_node_stack_.pop ();        node *lhs_ = tree_node_stack_.top ();        node_ptr_vector_->push_back (0);        node_ptr_vector_->back () = new selection_node (lhs_, rhs_);        tree_node_stack_.top () = node_ptr_vector_->back ();    }    static void sequence (node_ptr_vector &node_ptr_vector_,        tree_node_stack &tree_node_stack_)    {        node *rhs_ = tree_node_stack_.top ();        tree_node_stack_.pop ();        node *lhs_ = tree_node_stack_.top ();        node_ptr_vector_->push_back (0);        node_ptr_vector_->back () = new sequence_node (lhs_, rhs_);        tree_node_stack_.top () = node_ptr_vector_->back ();    }    static void optional (const bool greedy_,        node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)    {        // perform ?        node *lhs_ = tree_node_stack_.top ();        // You don't know if lhs_ is a leaf_node, so get firstpos.        node::node_vector &firstpos_ = lhs_->firstpos();        for (node::node_vector::iterator iter_ = firstpos_.begin (),            end_ = firstpos_.end (); iter_ != end_; ++iter_)        {            // These are leaf_nodes!            (*iter_)->greedy (greedy_);        }        node_ptr_vector_->push_back (0);        node *rhs_ = new leaf_node (null_token, greedy_);        node_ptr_vector_->back () = rhs_;        node_ptr_vector_->push_back (0);        node_ptr_vector_->back () = new selection_node (lhs_, rhs_);        tree_node_stack_.top () = node_ptr_vector_->back ();    }    static void zero_or_more (const bool greedy_,        node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)    {        // perform *        node *ptr_ = tree_node_stack_.top ();        node_ptr_vector_->push_back (0);        node_ptr_vector_->back () = new iteration_node (ptr_, greedy_);        tree_node_stack_.top () = node_ptr_vector_->back ();    }    static void one_or_more (const bool greedy_,        node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)    {        // perform +        node *lhs_ = tree_node_stack_.top ();        node *copy_ = lhs_->copy (node_ptr_vector_);        node_ptr_vector_->push_back (0);        node *rhs_ = new iteration_node (copy_, greedy_);        node_ptr_vector_->back () = rhs_;        node_ptr_vector_->push_back (0);        node_ptr_vector_->back () = new sequence_node (lhs_, rhs_);        tree_node_stack_.top () = node_ptr_vector_->back ();    }    static void repeatn (const bool greedy_, const token &token_,        node_ptr_vector &node_ptr_vector_, tree_node_stack &tree_node_stack_)    {        // perform {n[,[m]]}        // Semantic checks have already been performed.        // {0,}  = *        // {0,1} = ?        // {1,}  = +        // therefore we do not check for these cases.        if (!(token_._min == 1 && !token_._comma))        {            const std::size_t top_ = token_._min > 0 ?                token_._min : token_._max;            if (token_._min == 0)            {                optional (greedy_, node_ptr_vector_, tree_node_stack_);            }            node *prev_ = tree_node_stack_.top ()->copy (node_ptr_vector_);            node *curr_ = 0;            for (std::size_t i_ = 2; i_ < top_; ++i_)            {                node *temp_ = prev_->copy (node_ptr_vector_);                curr_ = temp_;                tree_node_stack_.push (0);                tree_node_stack_.top () = prev_;                sequence (node_ptr_vector_, tree_node_stack_);                prev_ = curr_;            }            if (token_._comma && token_._min > 0)            {                if (token_._min > 1)                {                    node *temp_ = prev_->copy (node_ptr_vector_);                    curr_ = temp_;                    tree_node_stack_.push (0);                    tree_node_stack_.top () = prev_;                    sequence (node_ptr_vector_, tree_node_stack_);                    prev_ = curr_;                }                if (token_._comma && token_._max)                {                    tree_node_stack_.push (0);                    tree_node_stack_.top () = prev_;                    optional (greedy_, node_ptr_vector_, tree_node_stack_);                    node *temp_ = tree_node_stack_.top ();                    tree_node_stack_.pop ();                    prev_ = temp_;                    const std::size_t count_ = token_._max - token_._min;                    for (std::size_t i_ = 1; i_ < count_; ++i_)                    {                        node *temp_ = prev_->copy (node_ptr_vector_);                        curr_ = temp_;                        tree_node_stack_.push (0);                        tree_node_stack_.top () = prev_;                        sequence (node_ptr_vector_, tree_node_stack_);                        prev_ = curr_;                    }                }                else                {                    tree_node_stack_.push (0);                    tree_node_stack_.top () = prev_;                    zero_or_more (greedy_, node_ptr_vector_, tree_node_stack_);                    node *temp_ = tree_node_stack_.top ();                    prev_ = temp_;                    tree_node_stack_.pop ();                }            }            tree_node_stack_.push (0);            tree_node_stack_.top () = prev_;            sequence (node_ptr_vector_, tree_node_stack_);        }    }};}}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -