1 #ifndef STAN__GM__PARSER__EXPRESSION_GRAMMAR_DEF__HPP
2 #define STAN__GM__PARSER__EXPRESSION_GRAMMAR_DEF__HPP
16 #include <boost/spirit/include/qi.hpp>
18 #include <boost/spirit/include/phoenix_core.hpp>
19 #include <boost/spirit/include/phoenix_function.hpp>
20 #include <boost/spirit/include/phoenix_fusion.hpp>
21 #include <boost/spirit/include/phoenix_object.hpp>
22 #include <boost/spirit/include/phoenix_operator.hpp>
23 #include <boost/spirit/include/phoenix_stl.hpp>
25 #include <boost/lexical_cast.hpp>
26 #include <boost/fusion/include/adapt_struct.hpp>
27 #include <boost/fusion/include/std_pair.hpp>
28 #include <boost/config/warning_disable.hpp>
29 #include <boost/spirit/include/qi.hpp>
30 #include <boost/spirit/include/qi_numeric.hpp>
31 #include <boost/spirit/include/classic_position_iterator.hpp>
32 #include <boost/spirit/include/phoenix_core.hpp>
33 #include <boost/spirit/include/phoenix_function.hpp>
34 #include <boost/spirit/include/phoenix_fusion.hpp>
35 #include <boost/spirit/include/phoenix_object.hpp>
36 #include <boost/spirit/include/phoenix_operator.hpp>
37 #include <boost/spirit/include/phoenix_stl.hpp>
38 #include <boost/spirit/include/support_multi_pass.hpp>
39 #include <boost/tuple/tuple.hpp>
40 #include <boost/variant/apply_visitor.hpp>
41 #include <boost/variant/recursive_variant.hpp>
57 template <
typename T1,
typename T2>
61 std::ostream& error_msgs)
const {
62 std::vector<expr_type> arg_types;
63 for (
size_t i = 0; i < fun.
args_.size(); ++i)
64 arg_types.push_back(fun.
args_[i].expression_type());
74 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
79 const std::string& op,
80 const std::string& fun_name,
81 std::ostream& error_msgs)
const {
84 error_msgs <<
"binary infix operator "
86 <<
" with functional interpretation "
88 <<
" requires arguments or primitive type (int or real)"
93 std::vector<expression> args;
94 args.push_back(expr1);
95 args.push_back(expr2);
105 template <
typename Iterator>
107 std::stringstream& error_msgs)
110 error_msgs_(error_msgs),
111 expression07_g(var_map,error_msgs,*this)
113 using boost::spirit::qi::_1;
114 using boost::spirit::qi::char_;
115 using boost::spirit::qi::double_;
116 using boost::spirit::qi::eps;
117 using boost::spirit::qi::int_;
118 using boost::spirit::qi::lexeme;
119 using boost::spirit::qi::lit;
120 using boost::spirit::qi::_pass;
121 using boost::spirit::qi::_val;
122 using boost::spirit::qi::labels::_r1;
126 expression_r.name(
"expression (top level, precedence 15, binary ||");
131 boost::phoenix::ref(error_msgs))]
139 boost::phoenix::ref(error_msgs))]
147 boost::phoenix::ref(error_msgs))] )
151 boost::phoenix::ref(error_msgs))] )
154 expression09_r.name(
"expression, precedence 9, binary <, <=, >, >=");
159 boost::phoenix::ref(error_msgs))] )
163 boost::phoenix::ref(error_msgs))] )
167 boost::phoenix::ref(error_msgs))] )
171 boost::phoenix::ref(error_msgs))] )
boost::phoenix::function< set_fun_type2 > set_fun_type2_f
static function_signatures & instance()
boost::phoenix::function< binary_op_expr > binary_op_f
boost::spirit::qi::rule< Iterator, expression(var_origin), whitespace_grammar< Iterator > > expression09_r
std::vector< expression > args_
expression07_grammar< Iterator > expression07_g
boost::spirit::qi::rule< Iterator, expression(var_origin), whitespace_grammar< Iterator > > expression14_r
fun operator()(fun &fun, std::ostream &error_msgs) const
boost::spirit::qi::rule< Iterator, expression(var_origin), whitespace_grammar< Iterator > > expression_r
boost::spirit::qi::rule< Iterator, expression(var_origin), whitespace_grammar< Iterator > > expression10_r
expression operator()(expression &expr1, const expression &expr2, const std::string &op, const std::string &fun_name, std::ostream &error_msgs) const
expression_grammar(variable_map &var_map, std::stringstream &error_msgs)
expr_type get_result_type(const std::string &name, const std::vector< expr_type > &args, std::ostream &error_msgs)
expr_type expression_type() const
bool is_primitive() const