Exemple #1
0
	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;
	}
Exemple #2
0
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_;
}