Boost logo

Boost Users :

Subject: Re: [Boost-users] Xpressive, symantic actions and combination enumeration
From: Eric Niebler (eric_at_[hidden])
Date: 2009-05-05 13:11:07


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

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net