bool parameter() { std::size_t old_stack_size = stack_.size(); if (T::match(*this)) { reduce_stack(stack_.size() - old_stack_size); return true; } else return false; }
std::string rev_regex(const std::string &rx_, const lexertl::state_machine &sm_) { std::string str_; std::string curr_; token_stack stack_; lexertl::citerator iter_(rx_.c_str(), rx_.c_str() + rx_.length(), sm_); lexertl::citerator end_; std::size_t parens_ = 0; for (; iter_ != end_; ++iter_) { switch (iter_->id) { case eCharset: case eMacro: case eComment: stack_.push(token_pair((eToken)iter_->id, iter_->str())); break; case eString: { lexertl::citerator i_(iter_->start + 1, iter_->end - 1, sm_); lexertl::citerator e_; std::string str_; for (; i_ != e_; ++i_) { str_ = i_->str() + str_; } str_ = '"' + str_ + '"'; stack_.push(token_pair((eToken)iter_->id, str_)); break; } case eQuantifier: if (stack_.empty()) { throw std::runtime_error("Quantifier without regex."); } stack_.top().second += iter_->str(); break; case eDifference: if (stack_.empty()) { throw std::runtime_error("Difference without regex."); } stack_.top().second += iter_->str(); ++iter_; stack_.top().second += iter_->str(); break; case eBOL: // Reverse to eEOL stack_.push(token_pair(eEOL, std::string(1, '$'))); break; case eEOL: // Reverse to eBOL stack_.push(token_pair(eBOL, std::string(1, '^'))); break; case eOr: reduce_stack(stack_); stack_.push(token_pair((eToken)iter_->id, iter_->str())); break; case eOpen: stack_.push(token_pair((eToken)iter_->id, iter_->str())); ++parens_; break; case eClose: { if (parens_ < 1) { throw std::runtime_error("Unbalanced parens in regex."); } std::string str_; reduce_stack(stack_); str_ = stack_.top().second; str_ += iter_->str(); stack_.pop(); stack_.top().second += str_; stack_.top().first = eCharset; --parens_; break; } default: throw std::runtime_error("Unknown regex token."); break; } } for (; !stack_.empty(); stack_.pop()) { str_ += stack_.top().second; } return str_; }