📄 parser.hpp
字号:
{ 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 ¯omap_, 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 + -