Boost logo

Boost Users :

Subject: Re: [Boost-users] [Spirit] Parser omits certain characters
From: TONGARI J (tongari95_at_[hidden])
Date: 2013-11-04 20:27:20


2013/11/5 beet <r.berlich_at_gemfony.eu>

> Dear Tongari, dear all,
>

[...]

> I have created the following rule:
>
> qi::rule<std::string::const_iterator, VARTYPE(), ascii::space_type>
> varReference =
> ( (attr(0) >> attr("empty") >> uint_)
> | (attr(1) >> identifier >> '[' >> uint_ >> ']')
> | (attr(2) >> identifier >> attr(0)) );
>
> Here, VARTYPE is a typedef for
> boost::tuple<std::size_t, std::string, std::size_t>, and "identifier"
> stands for lexeme[+char_("0-9a-zA-Z_")] as per your suggestion.
>
> The idea is to provide the user with a mode-variable to allow easy
> distinction between all three cases, and to fill unused parts of the
> tuple with some placeholder (such as "empty" or 0), with the help of
> attr(). So the first entry of the tuple represents the mode, the second
> the variable name and the third an optional index.
>
> Now, parsing a string like "MY_DPAR_02[3]" yields "emptyMY_DPAR_02" for
> the std::string component of the tuple, and "SOME_IPAR_17" results in
> "emptySOME_IPAR_17SOME_IPAR_17" . Parsing a single 0 yields the correct
> result.
>
> So the parser seems to go through all three components of varReference,
> until it finds a matching rule. However, instead of overwriting the
> std::string with the string it has found, it appears to concatenate the
> strings of all rules it has gone through.
>

Try this:
http://www.boost.org/doc/libs/1_54_0/libs/spirit/doc/html/spirit/qi/reference/directive/hold.html

> This is a bit mysterious to me and I would appreciate your help.

HTH



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