В итоге я реализовал свою собственную функцию unput() следующим образом:
struct unputImpl
{
template <typename Iter1T, typename Iter2T, typename StrT>
struct result {
typedef void type;
};
template <typename Iter1T, typename Iter2T, typename StrT>
typename result<Iter1T, Iter2T, StrT>::type operator()(Iter1T& start, Iter2T& end, StrT str) const {
start -= (str.length() - std::distance(start, end));
std::copy(str.begin(), str.end(), start);
end = start;
}
};
phoenix::function<unputImpl> const unput = unputImpl();
Затем это можно использовать как:
this->self += lex::token_def<lex::omit>("{SYMBOL}\\(")
[
unput(_start, _end, "(" + construct<string>(_start, _end - 1) + " "),
_pass = lex::pass_flags::pass_ignore
];
Если длина не введенной строки больше, чем длина совпадающего токена, она переопределит некоторые из ранее проанализированных входных данных. Вам нужно позаботиться о том, чтобы в самом начале входной строки было достаточно пустого места, чтобы обработать случай, когда unput() вызывается для самого первого совпадающего токена.
person
Haitham Gad
schedule
28.06.2012