14 #include <boost/spirit/include/phoenix_core.hpp>
15 #include <boost/spirit/include/phoenix_operator.hpp>
16 #include <boost/spirit/include/phoenix_fusion.hpp>
17 #include <boost/spirit/include/phoenix_bind.hpp>
19 namespace SDDS {
namespace parser
21 template <
typename Iterator>
22 data_parser<Iterator>::data_parser(error_handler<Iterator> & _error_handler):
23 data_parser::base_type(start)
28 typedef function<error_handler<Iterator> > error_handler_function;
35 qi::short_type short_;
49 data_mode = lit(
"mode") >
'=' >
datamode;
50 data_lines = lit(
"lines_per_row") >
'=' > long_;
51 data_row = lit(
"no_row_counts") >
'=' > long_;
52 data_fixed = lit(
"fixed_row_count") >
'=' > long_;
53 data_additional = lit(
"additional_header_lines") >
'=' > long_;
54 data_column = lit(
"column_major_order") >
'=' > short_;
55 data_endian = lit(
"endian") >
'=' > dataendian;
57 auto complainLines = phx::bind(&data::complainUnsupported<data::LINES_PER_ROW>::apply);
58 auto complainFixed = phx::bind(&data::complainUnsupported<data::FIXED_ROW_COUNT>::apply);
59 auto complainAdditional = phx::bind(&data::complainUnsupported<data::ADDITIONAL_HEADER_LINES>::apply);
60 auto complainColumn = phx::bind(&data::complainUnsupported<data::COLUMN_MAJOR_ORDER>::apply);
61 auto complainEndian = phx::bind(&data::complainUnsupported<data::ENDIAN>::apply);
63 data_unsupported_pre =
64 ((
',' > data_lines[_pass = complainLines])
65 ^ (
',' > data_fixed[_pass = complainFixed])
66 ^ (
',' > data_additional[_pass = complainAdditional])
67 ^ (
',' > data_column[_pass = complainColumn])
68 ^ (
',' > data_endian[_pass = complainEndian]));
69 data_unsupported_post =
70 ((data_lines[_pass = complainLines] >
',')
71 ^ (data_fixed[_pass = complainFixed] >
',')
72 ^ (data_additional[_pass = complainAdditional] >
',')
73 ^ (data_column[_pass = complainColumn] >
',')
74 ^ (data_endian[_pass = complainEndian] >
','));
78 > -data_unsupported_post
79 > ((data_mode[phx::at_c<0>(_val) = _1] >>
',' >> data_row[phx::at_c<1>(_val) = _1])
80 | (data_row[phx::at_c<1>(_val) = _1] >>
',' >> data_mode[phx::at_c<0>(_val) = _1]))
81 > -data_unsupported_pre
83 >> eps[_pass = phx::bind(&data::isASCII, _val)];
85 BOOST_SPIRIT_DEBUG_NODES(
90 error_handler_function(_error_handler)(
91 std::
string("Error! Expecting "), _4, _3));