OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
array_def.hpp
Go to the documentation of this file.
1 //
2 // Copyright & License: See Copyright.readme in src directory
3 //
4 
9 #ifndef ARRAY_DEF_HPP_
10 #define ARRAY_DEF_HPP_
11 
12 #include "array.hpp"
13 
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>
18 
19 namespace SDDS { namespace parser
20 {
21  template <typename Iterator>
23  array_parser::base_type(start)
24  {
25  using qi::on_error;
26  using qi::fail;
27  using phx::function;
28  typedef function<error_handler<Iterator> > error_handler_function;
29 
30  // qi::_1_type _1;
31  qi::_3_type _3;
32  qi::_4_type _4;
33  qi::lexeme_type lexeme;
34  qi::char_type char_;
35  qi::lit_type lit;
36  qi::long_type long_;
37  qi::short_type short_;
38  qi::alpha_type alpha;
39  qi::alnum_type alnum;
40  // qi::_val_type _val;
41  qi::_pass_type _pass;
42  qi::eps_type eps;
43 
44  quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
45  string %= quoted_string
46  | lexeme[(alpha | char_("@:#+-%._$&/")) >> *(alnum | char_("@:#+-%._$&/"))];
47  units %= lexeme[alpha >> *(alpha | '/')]
48  | lit('1');
49 
50  arraytype.add
51  ("float", ast::FLOAT)
52  ("double", ast::DOUBLE)
53  ("short", ast::SHORT)
54  ("long", ast::LONG)
55  ("character", ast::CHARACTER)
56  ("string", ast::STRING)
57  ;
58 
59  array_name = lit("mode") > '=' > string;
60  array_symbol = lit("symbol") > '=' > string;
61  array_units = lit("units") > '=' > units;
62  array_description = lit("description") > '=' > string;
63  array_format = lit("format_string") > '=' > string;
64  array_group = lit("group_name") > '=' > string;
65  array_type = lit("type") > '=' > arraytype;
66  array_field = lit("field_length") > '=' > long_;
67  array_dimensions = lit("dimensions") > '=' > long_;
68 
69  auto complainArray = phx::bind(&array::complainUnsupported<array::ARRAY>::apply);
70  auto complainName = phx::bind(&array::complainUnsupported<array::NAME>::apply);
71  auto complainSymbol= phx::bind(&array::complainUnsupported<array::SYMBOL>::apply);
72  auto complainUnits = phx::bind(&array::complainUnsupported<array::UNITS>::apply);
73  auto complainDescription = phx::bind(&array::complainUnsupported<array::DESCRIPTION>::apply);
74  auto complainFormat= phx::bind(&array::complainUnsupported<array::FORMAT_STRING>::apply);
75  auto complainGroup = phx::bind(&array::complainUnsupported<array::GROUP_NAME>::apply);
76  auto complainType = phx::bind(&array::complainUnsupported<array::TYPE>::apply);
77  auto complainField = phx::bind(&array::complainUnsupported<array::FIELD_LENGTH>::apply);
78  auto complainDimensions = phx::bind(&array::complainUnsupported<array::DIMENSIONS>::apply);
79 
81  ((',' > array_name[_pass = complainName])
82  ^ (',' > array_symbol[_pass = complainSymbol])
83  ^ (',' > array_units[_pass = complainUnits])
84  ^ (',' > array_description[_pass = complainDescription])
85  ^ (',' > array_format[_pass = complainFormat])
86  ^ (',' > array_group[_pass = complainGroup])
87  ^ (',' > array_type[_pass = complainType])
88  ^ (',' > array_field[_pass = complainField])
89  ^ (',' > array_dimensions[_pass = complainDimensions])
90  );
92  ((array_name[_pass = complainName] > ',')
93  ^ (array_symbol[_pass = complainSymbol] > ',')
94  ^ (array_units[_pass = complainUnits] > ',')
95  ^ (array_description[_pass = complainDescription] > ',')
96  ^ (array_format[_pass = complainFormat] > ',')
97  ^ (array_group[_pass = complainGroup] > ',')
98  ^ (array_type[_pass = complainType] > ',')
99  ^ (array_field[_pass = complainField] > ',')
100  ^ (array_dimensions[_pass = complainDimensions] > ',')
101  );
102 
103  start =
104  lit("&array")[_pass = complainArray]
105  > lit("&end");
106 
107  BOOST_SPIRIT_DEBUG_NODES(
108  (start)
109  )
110 
111  on_error<fail>(start,
112  error_handler_function(_error_handler)(
113  std::string("Error! Expecting "), _4, _3));
114  }
115 }}
116 #endif /* ARRAY_DEF_HPP_ */
qi::rule< Iterator, ast::nil(), skipper< Iterator > > array_unsupported_pre
Definition: array.hpp:112
qi::rule< Iterator, std::string(), skipper< Iterator > > array_symbol
Definition: array.hpp:106
array_parser(error_handler< Iterator > &_error_handler)
Definition: array_def.hpp:22
qi::rule< Iterator, array(), skipper< Iterator > > start
Definition: array.hpp:105
qi::rule< Iterator, std::string(), skipper< Iterator > > quoted_string
Definition: array.hpp:106
qi::rule< Iterator, ast::datatype, skipper< Iterator > > array_type
Definition: array.hpp:111
constexpr double alpha
The fine structure constant, no dimension.
Definition: Physics.h:79
qi::rule< Iterator, long(), skipper< Iterator > > array_dimensions
Definition: array.hpp:109
qi::symbols< char, ast::datatype > arraytype
Definition: array.hpp:114
qi::rule< Iterator, std::string(), skipper< Iterator > > string
Definition: array.hpp:106
qi::rule< Iterator, std::string(), skipper< Iterator > > array_description
Definition: array.hpp:106
qi::rule< Iterator, long(), skipper< Iterator > > array_field
Definition: array.hpp:109
qi::rule< Iterator, std::string(), skipper< Iterator > > array_units
Definition: array.hpp:106
qi::rule< Iterator, std::string(), skipper< Iterator > > array_format
Definition: array.hpp:106
qi::rule< Iterator, std::string(), skipper< Iterator > > array_group
Definition: array.hpp:106
qi::rule< Iterator, ast::nil(), skipper< Iterator > > array_unsupported_post
Definition: array.hpp:112
qi::rule< Iterator, std::string(), skipper< Iterator > > units
Definition: array.hpp:106
qi::rule< Iterator, std::string(), skipper< Iterator > > array_name
Definition: array.hpp:106