5#include <State/Expression.hpp>
7#include <State/AddressParser.hpp>
8#include <State/ValueParser.hpp>
61BOOST_FUSION_ADAPT_STRUCT(
63 (State::RelationMember,
64 lhs)(ossia::expressions::comparator, op)(State::RelationMember, rhs))
69namespace qi = boost::spirit::qi;
71using boost::spirit::qi::rule;
74template <
typename Iterator>
75struct RelationMember_parser : qi::grammar<Iterator, State::RelationMember()>
77 RelationMember_parser()
78 : RelationMember_parser::base_type(start)
80 start %= (
"%" >> addracc >>
"%") | (
"%" >> addr >>
"%") | val;
83 Address_parser<Iterator> addr;
84 AddressAccessor_parser<Iterator> addracc;
85 Value_parser<Iterator> val;
86 qi::rule<
Iterator, State::RelationMember()> start;
90struct RelationOperation_map : qi::symbols<char, ossia::expressions::comparator>
92 RelationOperation_map()
94 add(
"<=", ossia::expressions::comparator::LOWER_EQUAL)(
95 ">=", ossia::expressions::comparator::GREATER_EQUAL)(
96 "<", ossia::expressions::comparator::LOWER)(
97 ">", ossia::expressions::comparator::GREATER)(
98 "!=", ossia::expressions::comparator::DIFFERENT)(
99 "==", ossia::expressions::comparator::EQUAL)(
100 "contains", ossia::expressions::comparator::CONTAINS);
104template <
typename Iterator>
105struct Relation_parser : qi::grammar<Iterator, State::Relation()>
108 : Relation_parser::base_type(start)
110 using boost::spirit::qi::skip;
111 start %= skip(boost::spirit::standard::space)[(rm_parser >> op_map >> rm2_parser)];
114 RelationMember_parser<Iterator> rm_parser;
115 RelationMember_parser<Iterator> rm2_parser;
116 RelationOperation_map op_map;
120template <
typename Iterator>
121struct Pulse_parser : qi::grammar<Iterator, State::Pulse()>
124 : Pulse_parser::base_type(start)
126 using boost::spirit::qi::lit;
127 using boost::spirit::qi::skip;
128 using boost::spirit::standard::string;
129 start %= skip(boost::spirit::standard::space)[
"%" >> addr >>
"%" >>
"impulse"]
130 | skip(boost::spirit::standard::space)
131 [lit(
'{') >> lit(
"%") >> addr >> lit(
"%") >> lit(
"impulse") >>
'}'];
134 Address_parser<Iterator> addr;
140namespace qi = boost::spirit::qi;
155typedef std::string var;
156template <
typename tag>
158template <
typename tag>
161using expr_raw = boost::variant<
163 boost::recursive_wrapper<binop<op_and>>, boost::recursive_wrapper<binop<op_xor>>,
164 boost::recursive_wrapper<binop<op_or>>>;
166template <
typename tag>
169 explicit binop(expr_raw l, expr_raw r)
170 : oper1(
std::move(l))
171 , oper2(
std::move(r))
174 expr_raw oper1, oper2;
177template <
typename tag>
180 explicit unop(expr_raw o)
181 : oper1(
std::move(o))
187template <
typename Op>
188struct ExpressionOpConstruct
191 boost::fusion::vector<expr_raw, expr_raw> x,
auto& context,
192 qi::unused_type)
const noexcept
194 boost::fusion::at_c<0>(context.attributes)
195 = binop<Op>(boost::fusion::at_c<0>(x), boost::fusion::at_c<1>(x));
197 void operator()(expr_raw x,
auto& context, qi::unused_type)
const noexcept
199 boost::fusion::at_c<0>(context.attributes) = unop<Op>(x);
203struct ExpressionOpIdent
205 void operator()(expr_raw x,
auto& context, qi::unused_type)
const noexcept
207 boost::fusion::at_c<0>(context.attributes) = x;
210template <
typename It,
typename Skipper = qi::space_type>
211struct Expression_parser : qi::grammar<It, expr_raw(), Skipper>
214 : Expression_parser::base_type(expr_)
220 namespace bsi = boost::spirit;
221 or_ = (xor_ >>
"or" >> or_)[ExpressionOpConstruct<op_or>{}]
222 | xor_[ExpressionOpIdent{}];
223 xor_ = (and_ >>
"xor" >> xor_)[ExpressionOpConstruct<op_xor>{}]
224 | and_[ExpressionOpIdent{}];
225 and_ = (not_ >>
"and" >> and_)[ExpressionOpConstruct<op_and>{}]
226 | not_[ExpressionOpIdent{}];
227 not_ = (
"not" > simple)[ExpressionOpConstruct<op_not>{}]
228 | simple[ExpressionOpIdent{}];
230 simple = ((
'{' >> expr_ >>
'}') | relation_ | pulse_);
234 Relation_parser<It> relation_;
235 Pulse_parser<It> pulse_;
236 qi::rule<It, expr_raw(), Skipper> not_, and_, xor_, or_, simple, expr_;
239struct Expression_builder : boost::static_visitor<void>
247 void operator()(
const State::Relation& rel) { m_current->emplace_back(rel,
nullptr); }
249 void operator()(
const State::Pulse& rel) { m_current->emplace_back(rel,
nullptr); }
251 void operator()(
const binop<op_and>& b)
253 rec_binop(State::BinaryOperator::AND, b.oper1, b.oper2);
255 void operator()(
const binop<op_or>& b)
257 rec_binop(State::BinaryOperator::OR, b.oper1, b.oper2);
259 void operator()(
const binop<op_xor>& b)
261 rec_binop(State::BinaryOperator::XOR, b.oper1, b.oper2);
264 void rec_binop(State::BinaryOperator binop,
const expr_raw& l,
const expr_raw& r)
266 m_current->emplace_back(binop,
nullptr);
268 auto old_expr = m_current;
269 m_current = &old_expr->children().back();
271 boost::apply_visitor(*
this, l);
272 boost::apply_visitor(*
this, r);
274 m_current = old_expr;
277 void operator()(
const unop<op_not>& u)
279 m_current->emplace_back(State::UnaryOperator::Not,
nullptr);
281 auto old_expr = m_current;
282 m_current = &old_expr->children().back();
284 boost::apply_visitor(*
this, u.oper1);
286 m_current = old_expr;
Definition lv2_atom_helpers.hpp:99
Definition Relation.hpp:71
Definition Relation.hpp:19