Opened 6 years ago

Last modified 5 years ago

#12932 new Feature Requests

"Char >> (Literal | Sequence)" unpacking

Reported by: jetdog330@… Owned by: Joel de Guzman
Milestone: To Be Determined Component: spirit
Version: Boost 1.63.0 Severity: Problem
Keywords: unpacking Cc:

Description

This is the simplest I was able to reduce this to. What is going on here?

Requirements: -Boost 1.62 or 1.63 /w spirit v2 -C++03/C++11/C++14

Steps: g++ test.cpp && ./a.out

Expected: Success: "x" "a" "b" "c"

Result: Success: "x" "a" "" ""

#include <boost/spirit/include/qi.hpp>
 
#include <cstdlib>
#include <iostream>
#include <string>
 
int main(int argc, char * argv[]) {
    namespace qi = boost::spirit::qi;
    const std::string input("xabc");
 
    char x = 0;
    char a = 0;
    char b = 0;
    char c = 0;
 
    const int result = qi::parse(
        input.begin(),
        input.end(),
            qi::char_ >> (qi::lit("Z") | (qi::char_ >> qi::char_ >> qi::char_)),
            x, a, b, c
    );
 
    std::cout << (result ? "Success" : "Failure") << ": "
        << '"' << x << "\" \"" << a << "\" \""  << b << "\" \"" << c << '"' << std::endl;
    return result ? EXIT_SUCCESS : EXIT_FAILURE;
}

Change History (3)

comment:1 by anonymous, 6 years ago

Similarly, substituting this rule seems to generate the same result:

            qi::char_ >> ((qi::char_ >> qi::char_ >> qi::char_) - "Z"),

Am I missing something trivial here?

comment:2 by Amine, 5 years ago

The attribute of the parser (qi::char_ >> qi::char_ >> qi::char_) is boost::fusion::vector3<char, char, char> so you should write your code this way :

#include <boost/spirit/include/qi.hpp>

#include <cstdlib>
#include <iostream>
#include <string>

int main(int argc, char * argv[]) {
    namespace qi = boost::spirit::qi;
    namespace fusion = boost::fusion;
    const std::string input("xabc");

    char x = 0;
    fusion::vector3<char, char, char> v;

    const int result = qi::parse(
        input.begin(),
        input.end(),
            qi::char_ >> (qi::lit("Z") | (qi::char_ >> qi::char_ >> qi::char_)),
            x, v
    );

    std::cout << (result ? "Success" : "Failure") << ": "
        << '"' << x << "\" \"" << fusion::at_c<0>(v) << "\" \""
                               << fusion::at_c<1>(v) << "\" \""
                               << fusion::at_c<2>(v) << '"' << std::endl;
    return result ? EXIT_SUCCESS : EXIT_FAILURE;
}

comment:3 by Nikita Kniazev <nok.raven@…>, 5 years ago

Keywords: unpacking added; or sequence removed
Summary: Boost Spirit 1.63 "Char >> (Literal | Sequence)" Bug"Char >> (Literal | Sequence)" unpacking
Type: BugsFeature Requests

Amine is right here, though it is actually optional<vector3<char, char, char>>. I consider this not a bug, but feature request.

Note: See TracTickets for help on using tickets.