
Eric Niebler wrote:
Lee Simpson wrote:
Hi,
First let me say. Awesome library and thanks for releasing it to the world.
Thanks!
I'm looking for a way to apply all the currently queued semantic actions _without_ turning off backtracking. So, as the manual suggests, keep manages to apply the queued actions but it also turns off backtracking.
<snip>
Any ideas?
You don't have to turn off backtracking for the whole regex. You can use keep() in a few strategic places within your regex as follows:
sregex rx = ... >> keep(nil[ /*semantic action*/ ]) >> ...;
"nil" always succeeds and consumes 0 characters. It's a way to cause the semantic action to execute immediately. Would something like that help you?
In case I wasn't clear, here is a little program that demonstrates what I was getting at: #include <string> #include <iostream> #include <boost/xpressive/xpressive_static.hpp> #include <boost/xpressive/regex_actions.hpp> using namespace boost::xpressive; int main() { std::string text = "abcd"; sregex rx = // Match some stuff and save some submatches (s1= +alpha) >> (s2= +alpha) >> eos >> // Display the submatches eagerly. keep(nil[ref(std::cout) << s1 << ", " << s2 << "\n"]) >> // Cause the fail and backtrack. ~before(nil); regex_match(text, rx); return 0; } For me, this dispays: abc, d ab, cd a, bcd HTH, -- Eric Niebler BoostPro Computing http://www.boostpro.com