From 0b1ae8bd01465a47a62e20304c3692c353c1f5ea Mon Sep 17 00:00:00 2001 From: artemp Date: Wed, 7 Oct 2015 12:33:10 +0100 Subject: [PATCH] csv_grammar - implament custom (white-space only) skipper + optimise grammar --- include/mapnik/csv/csv_grammar.hpp | 54 +++++++++++++----------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/include/mapnik/csv/csv_grammar.hpp b/include/mapnik/csv/csv_grammar.hpp index 9d34fb393..f665dae87 100644 --- a/include/mapnik/csv/csv_grammar.hpp +++ b/include/mapnik/csv/csv_grammar.hpp @@ -36,16 +36,30 @@ using csv_line = std::vector; using csv_data = std::vector; template -struct csv_line_grammar : qi::grammar +struct csv_white_space_skipper : qi::grammar { - csv_line_grammar() : csv_line_grammar::base_type(line) + csv_white_space_skipper() + : csv_white_space_skipper::base_type(skip) + { + using namespace qi; + qi::lit_type lit; + skip = +lit(' ') + ; + } + qi::rule skip; +}; + +template > +struct csv_line_grammar : qi::grammar +{ + csv_line_grammar() + : csv_line_grammar::base_type(line) { using namespace qi; qi::_a_type _a; qi::_r1_type _r1; qi::_r2_type _r2; qi::lit_type lit; - //qi::eol_type eol; qi::_1_type _1; qi::char_type char_; qi::omit_type omit; @@ -62,44 +76,24 @@ struct csv_line_grammar : qi::grammar> column(_r1, _r2) % lit(_r1) ; - column = -omit[char_("\n\r")] >> quoted(_r2) | *(char_ - (lit(_r1) /*| eol*/)) + column = quoted(_r2) | *(char_ - (lit(_r1))) ; - quoted = omit[char_(_r1)[_a = _1]] > text(_a) > -lit(_a) + quoted = omit[char_(_r1)[_a = _1]] > text(_a) > -lit(_a) // support unmatched quotes or not (??) ; - text = *(unesc_char | (char_ - char_(_r1))) + text = *(unesc_char | (char_ - lit(_r1))) ; BOOST_SPIRIT_DEBUG_NODES((line)(column)(quoted)); } private: - qi::rule line; + qi::rule line; qi::rule column; // no-skip - qi::rule text; - qi::rule, csv_value(char)> quoted; + qi::rule text; // no-skip + qi::rule, csv_value(char)> quoted; //no-skip qi::symbols unesc_char; }; -template -struct csv_file_grammar : qi::grammar -{ - csv_file_grammar() : csv_file_grammar::base_type(start) - { - using namespace qi; - qi::eol_type eol; - qi::_r1_type _r1; - qi::_r2_type _r2; - start = -line(_r1, _r2) % eol - ; - BOOST_SPIRIT_DEBUG_NODES((start)); - } - private: - qi::rule start; - csv_line_grammar line; -}; - - } #endif // MAPNIK_CVS_GRAMMAR_HPP