From: Dick Bridges (dbridges_at_[hidden])
Date: 2006-01-02 19:57:02


I am trying to use Xpressive for parsing string-based message buffers.

The messages start with a fixed string and end with an "empty" line

(similar in form to HTTP). There is an example in the code below.

 

Following a successful search, I'd like to be able process messages

in the buffer with something like this pseudo code:

 

  for each message

    for each name_value pair

      make_pair(name, value)

  prepend what.suffix() to the next packet

 

The examples of repeating an embedded regex I found in the

.pdf and the examples subdirectory seemed close to what I need

but I have not been able to make them work.

 

Here is code that is the closest I've been able to get:

 

#include <iostream>

#include <boost/xpressive/xpressive.hpp>

 

using namespace std;

using namespace boost::xpressive;

 

int

main(int argc, char **argv) {

      

  std::string buffer =

    "FROGGIE\r\n"

    "Volume = 1\r\n"

    "Other1= 2\r\n"

    "Channel=3\r\n"

    "Other =4\r\n"

    "\r\n"

    "FROGGIE\r\n"

    "Volume = 5\r\n"

    "Other1= 6\r\n"

    "Channel=7\r\n"

    "Other =8\r\n"

    "\r\n"

    "FROGGIE\r\n"

    "Volume = 9\r\n"

    "Other1= 0\r\n"

    "Channel=10\r\n";

 

    sregex name_value_pair_ =

      (+alnum >> *_s >> "=" >> *_s >> +_d >> *_s >> _ln);

 

    sregex message_ =

      (*_s >> "FROGGIE" >> _ln >> +name_value_pair_ >> _ln);

 

    sregex re_ = +(s1= message_);

 

    smatch what;

 

    if( regex_search( buffer, what, re_ ) ) {

            

      cout << "\n<what.size()>" << what.size() << "</what.size()>"

        << "\n<what[0]>\n" << what[0] << "</what[0]>"

      << "\n<what[1]>\n" << what[1] << "</what[1]>"

      << "\n<what[2]>\n" << what[2] << "</what[2]>"

      << "\n<what.suffix()>\n" << what.suffix() << "</what.suffix()>"

      << endl;

      }

 

} // main

 

I am not very accomplished with regular expressions but what[0] and

what.suffix() look correct and I hoped that what.size() held the

number of messages and what[1] and what[2] accessed each in turn.

I clearly did not understand.

 

<what.size()>2</what.size()>

<what[0]>

FROGGIE

Volume = 1

Other1= 2

Channel=3

Other =4

 

FROGGIE

Volume = 5

Other1= 6

Channel=7

Other =8

 

</what[0]>

<what[1]>

FROGGIE

Volume = 5

Other1= 6

Channel=7

Other =8

 

</what[1]>

<what[2]>

</what[2]>

<what.suffix()>

FROGGIE

Volume = 9

Other1= 0

Channel=10

</what.suffix()>

 

OS is Linux Core 3 2.6.9-1.667. Compiler is gcc 3.4.4-linux.

Xpressive README.txt (in the .zip) says "xpressive 0.9.8d".

 

If someone could point me in the right direction, I'd surely

appreciate it.

 

Regards,

Dick Bridges