csv_line_grammar<Iterator, Skipper>::csv_line_grammar()
    : csv_line_grammar::base_type(line)
{
    qi::_r1_type _r1;
    qi::_r2_type _r2;
    qi::lit_type lit;
    qi::char_type char_;
    unesc_char.add
        ("\\a", '\a')
        ("\\b", '\b')
        ("\\f", '\f')
        ("\\n", '\n')
        ("\\r", '\r')
        ("\\t", '\t')
        ("\\v", '\v')
        ("\\\\",'\\')
        ("\\\'", '\'')
        ("\\\"", '\"')
        ("\"\"", '\"') // double quote
        ;
    line = -lit("\r") > -lit("\n") > column(_r1, _r2) % lit(_r1)
        ;
    column = quoted(_r2) | *(char_ - lit(_r1))
        ;
    quoted = lit(_r1) > text(_r1) > lit(_r1) // support unmatched quotes or not (??)
        ;
    text = *(unesc_char | (char_ - lit(_r1)))
        ;
    BOOST_SPIRIT_DEBUG_NODES((line)(column)(quoted));
}
Beispiel #2
0
int main()
{
    std::string input("d:/std/prte/type.spr#12");
    typedef std::string::const_iterator It;

    std::pair<std::string, int> p;

    qi::rule<It, std::string()> srule = *qi::char_;
    qi::rule<It, int()> irule         = qi::int_;
    BOOST_SPIRIT_DEBUG_NODES((srule)(irule))

    It iter = input.begin(), end = input.end();
    bool ok = qi::parse(iter, end,
            srule >> '#' >> irule,       // parser grammar 
            p
        );

    if (ok)
        std::cout << "Parse success\n";
    else
        std::cout << "Parse failed\n";


    if (iter != end)
        std::cout << "Remaining unparsed: '" << std::string(iter,end) << "'\n";
}