I am trying to parse the lines ::

 

   10.1.1.1/32      10.10.1.1       29/nolabel

   10.7.7.7/32      150.2.2.2       nolabel/30            

 

Which are space separated and putting them in a vector of strings ::

 

  sp %= lit(' ');

 

                   ip_address %=  +char_("0-9") >> char_('.') >> +char_("0-9") >> char_('.')  >> +char_("0-9") >> char_('.')  >> +char_("0-9")

                                        >> *char_("/") >> *char_("0-9");

 

                   data   %= *sp >> ( xr_special  | ip_address | +lit("/") |  +char_("0-9A-Za-z()"));

 

                    start %= +(data )  >> *sp >> eoi;

 

 

qi::rule<Iterator, void()> sp;

qi::rule<Iterator, std::string()> ip_address;

qi::rule<Iterator, std::string()> data;

qi::rule<Iterator, test::Parsed_Rec()> start;  (Parsed Rec carries a vector of strings )

 

 

Grammar is able to parse the lines but while parsing 29 in first line & 30 in last line, the attributes are incorrectly filled. The attributes are filled twice ( Debug File for this is debug_file_incorrect).

 

Snippet ::

 

  <data>

    <try>       29/nolabel</try>

    <xr_special>

      <try>29/nolabel</try>

      <fail/>

    </xr_special>

    <ip_address>

      <try>29/nolabel</try>

      <fail/>

    </ip_address>

    <success>/nolabel</success>

    <attributes>[[2, 9, 2, 9]]</attributes>

  </data>

 

 

While if I change my grammar to explicitly fill the attributes, they are filled correctly. File attached : debug_file_correct

 

                   data   = *sp >> ( xr_special  | ip_address[_val= _1] | +lit("/") |  +char_("0-9A-Za-z()")[_val+= _1]  );

 

<data>

    <try>       29/nolabel</try>

    <xr_special>

      <try>29/nolabel</try>

      <fail/>

    </xr_special>

    <ip_address>

      <try>29/nolabel</try>

      <fail/>

    </ip_address>

    <success>/nolabel</success>

    <attributes>[[2, 9]]</attributes>

  </data>

 

 

 

Thanks

Preeti