| 1 | 
 | 
|---|
| 2 | #include "StringFormat.h"
 | 
|---|
| 3 | 
 | 
|---|
| 4 | #include "boost/xpressive/xpressive.hpp"
 | 
|---|
| 5 | 
 | 
|---|
| 6 | namespace ariba {
 | 
|---|
| 7 | namespace utility {
 | 
|---|
| 8 | namespace string_format {
 | 
|---|
| 9 | 
 | 
|---|
| 10 | using namespace boost::xpressive;
 | 
|---|
| 11 | 
 | 
|---|
| 12 | // regex: string
 | 
|---|
| 13 | const sregex rstring = '"' >> keep(*~(boost::xpressive::set = '"'))
 | 
|---|
| 14 |                 >> '"';
 | 
|---|
| 15 | 
 | 
|---|
| 16 | // regex: base64 encoding
 | 
|---|
| 17 | const sregex rbase64 = '!' >> +(range('a', 'z') | range('A', 'Z')
 | 
|---|
| 18 |                 | range('0', '9') | '/' | '+') >> *(boost::xpressive::set = '=');
 | 
|---|
| 19 | 
 | 
|---|
| 20 | // regex: raw alphabet
 | 
|---|
| 21 | const sregex rchars = +(range('a', 'z') | range('A', 'Z'));
 | 
|---|
| 22 | 
 | 
|---|
| 23 | // regex: integer
 | 
|---|
| 24 | const sregex rint = '0' | (range('1', '9') >> !(range('0', '9')));
 | 
|---|
| 25 | 
 | 
|---|
| 26 | // regex: binary label
 | 
|---|
| 27 | const sregex rlabel = rchars | rstring | rbase64;
 | 
|---|
| 28 | 
 | 
|---|
| 29 | // regex: dot separated identifier
 | 
|---|
| 30 | const sregex rid = rlabel >> *('.' >> rlabel) >> *('.' >> rint);
 | 
|---|
| 31 | 
 | 
|---|
| 32 | // regex: "leaf" data
 | 
|---|
| 33 | const sregex rdata = !(boost::xpressive::set = '!') >> '{'
 | 
|---|
| 34 |                 >> *(keep(+~(boost::xpressive::set = '{', '}')) | by_ref(rdata))
 | 
|---|
| 35 |                 >> '}';
 | 
|---|
| 36 | 
 | 
|---|
| 37 | // regex: fields
 | 
|---|
| 38 | const sregex rfield_label = rlabel >> '=';
 | 
|---|
| 39 | const sregex rfield = !rfield_label >> (rid | rdata);
 | 
|---|
| 40 | const sregex rfields = '(' >> rfield >> *(',' >> rfield) >> ')';
 | 
|---|
| 41 | 
 | 
|---|
| 42 | // regex objects
 | 
|---|
| 43 | const sregex robject_data = (rdata | rfields);
 | 
|---|
| 44 | const sregex robject_id = rid;
 | 
|---|
| 45 | const sregex robject = robject_id >> robject_data;
 | 
|---|
| 46 | const sregex robjects = robject >> *(',' >> robject);
 | 
|---|
| 47 | 
 | 
|---|
| 48 | }}}
 | 
|---|