1 #ifndef __STAN__GM__PARSER__TERM_GRAMMAR_DEF__HPP__
2 #define __STAN__GM__PARSER__TERM_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>
50 (std::vector<std::vector<stan::gm::expression> >,
55 (std::vector<stan::gm::expression>, args_) )
59 (stan::gm::expr_type,type_))
63 (stan::gm::expr_type,type_) )
74 template <
typename T1,
typename T2>
75 struct result {
typedef fun type; };
77 fun operator()(fun& fun,
78 std::ostream& error_msgs)
const {
79 std::vector<expr_type> arg_types;
80 for (
size_t i = 0; i < fun.args_.size(); ++i)
81 arg_types.push_back(fun.args_[i].expression_type());
82 fun.type_ = function_signatures::instance().get_result_type(fun.name_,
88 boost::phoenix::function<set_fun_type> set_fun_type_f;
91 struct set_fun_type_named {
92 template <
typename T1,
typename T2,
typename T3,
typename T4>
93 struct result {
typedef fun type; };
95 fun operator()(fun& fun,
98 std::ostream& error_msgs)
const {
99 std::vector<expr_type> arg_types;
100 for (
size_t i = 0; i < fun.args_.size(); ++i)
101 arg_types.push_back(fun.args_[i].expression_type());
102 fun.type_ = function_signatures::instance().get_result_type(fun.name_,
108 error_msgs <<
"random number generators only allowed in generated quantities block"
109 <<
"; found function=" << fun.name_
112 error_msgs << std::endl;
118 boost::phoenix::function<set_fun_type_named> set_fun_type_named_f;
122 struct multiplication_expr {
123 template <
typename T1,
typename T2,
typename T3>
124 struct result {
typedef expression type; };
126 expression operator()(expression& expr1,
127 const expression& expr2,
128 std::ostream& error_msgs)
const {
130 if (expr1.expression_type().is_primitive()
131 && expr2.expression_type().is_primitive()) {
132 return expr1 *= expr2;
134 std::vector<expression> args;
135 args.push_back(expr1);
136 args.push_back(expr2);
138 fun f(
"multiply",args);
140 return expression(f);
143 boost::phoenix::function<multiplication_expr> multiplication;
147 struct division_expr {
148 template <
typename T1,
typename T2,
typename T3>
149 struct result {
typedef expression type; };
151 expression operator()(expression& expr1,
152 const expression& expr2,
153 std::ostream& error_msgs)
const {
154 if (expr1.expression_type().is_primitive_int()
155 && expr2.expression_type().is_primitive_int()) {
157 error_msgs <<
"Warning: integer division implicitly rounds to integer."
158 <<
" Found int division: ";
162 error_msgs << std::endl
163 <<
" Positive values rounded down, negative values rounded up or down"
164 <<
" in platform-dependent way."
168 if (expr1.expression_type().is_primitive()
169 && expr2.expression_type().is_primitive()) {
170 return expr1 /= expr2;
172 std::vector<expression> args;
173 args.push_back(expr1);
174 args.push_back(expr2);
176 if ((expr1.expression_type().type() ==
MATRIX_T
178 && expr2.expression_type().type() ==
MATRIX_T) {
179 fun f(
"mdivide_right",args);
181 return expression(f);
184 fun f(
"divide",args);
186 return expression(f);
189 boost::phoenix::function<division_expr> division;
191 struct left_division_expr {
192 template <
typename T1,
typename T2,
typename T3>
193 struct result {
typedef expression type; };
195 expression operator()(expression& expr1,
196 const expression& expr2,
197 std::ostream& error_msgs)
const {
198 if (expr1.expression_type().is_primitive()
199 && expr2.expression_type().is_primitive()) {
200 return expr1 /= expr2;
202 std::vector<expression> args;
203 args.push_back(expr1);
204 args.push_back(expr2);
206 if (expr1.expression_type().type() ==
MATRIX_T
207 && (expr2.expression_type().type() ==
VECTOR_T
208 || expr2.expression_type().type() ==
MATRIX_T)) {
209 fun f(
"mdivide_left",args);
211 return expression(f);
213 fun f(
"divide_left",args);
215 return expression(f);
218 boost::phoenix::function<left_division_expr> left_division;
220 struct elt_multiplication_expr {
221 template <
typename T1,
typename T2,
typename T3>
222 struct result {
typedef expression type; };
224 expression operator()(expression& expr1,
225 const expression& expr2,
226 std::ostream& error_msgs)
const {
228 if (expr1.expression_type().is_primitive()
229 && expr2.expression_type().is_primitive()) {
230 return expr1 *= expr2;
232 std::vector<expression> args;
233 args.push_back(expr1);
234 args.push_back(expr2);
236 fun f(
"elt_multiply",args);
238 return expression(f);
239 return expr1 += expr2;
242 boost::phoenix::function<elt_multiplication_expr> elt_multiplication;
244 struct elt_division_expr {
245 template <
typename T1,
typename T2,
typename T3>
246 struct result {
typedef expression type; };
248 expression operator()(expression& expr1,
249 const expression& expr2,
250 std::ostream& error_msgs)
const {
252 if (expr1.expression_type().is_primitive()
253 && expr2.expression_type().is_primitive()) {
254 return expr1 /= expr2;
256 std::vector<expression> args;
257 args.push_back(expr1);
258 args.push_back(expr2);
260 fun f(
"elt_divide",args);
262 return expression(f);
263 return expr1 += expr2;
266 boost::phoenix::function<elt_division_expr> elt_division;
274 template <
typename T1,
typename T2>
275 struct result {
typedef expression type; };
277 expression operator()(
const expression& expr,
278 std::ostream& error_msgs)
const {
279 if (expr.expression_type().is_primitive()) {
280 return expression(unary_op(
'-', expr));
282 std::vector<expression> args;
283 args.push_back(expr);
287 return expression(f);
290 boost::phoenix::function<negate_expr> negate_expr_f;
292 struct logical_negate_expr {
293 template <
typename T1,
typename T2>
294 struct result {
typedef expression type; };
296 expression operator()(
const expression& expr,
297 std::ostream& error_msgs)
const {
298 if (!expr.expression_type().is_primitive()) {
299 error_msgs <<
"logical negation operator ! only applies to int or real types; ";
302 std::vector<expression> args;
303 args.push_back(expr);
305 fun f(
"logical_negation",args);
307 return expression(f);
310 boost::phoenix::function<logical_negate_expr> logical_negate_expr_f;
312 struct transpose_expr {
313 template <
typename T1,
typename T2>
314 struct result {
typedef expression type; };
316 expression operator()(
const expression& expr,
317 std::ostream& error_msgs)
const {
318 if (expr.expression_type().is_primitive()) {
321 std::vector<expression> args;
322 args.push_back(expr);
324 fun f(
"transpose",args);
326 return expression(f);
329 boost::phoenix::function<transpose_expr> transpose_f;
331 struct add_expression_dimss {
332 template <
typename T1,
typename T2,
typename T3,
typename T4>
333 struct result {
typedef T1 type; };
334 expression operator()(expression& expression,
335 std::vector<std::vector<stan::gm::expression> >& dimss,
337 std::ostream& error_msgs)
const {
338 index_op iop(expression,dimss);
340 if (iop.type_.is_ill_formed()) {
341 error_msgs <<
"indexes inappropriate for expression." << std::endl;
349 boost::phoenix::function<add_expression_dimss> add_expression_dimss_f;
351 struct set_var_type {
352 template <
typename T1,
typename T2,
typename T3,
typename T4>
353 struct result {
typedef variable type; };
354 variable operator()(variable& var_expr,
356 std::ostream& error_msgs,
358 std::string name = var_expr.name_;
359 if (!vm.exists(name)) {
361 error_msgs <<
"variable \"" << name <<
'"' <<
" does not exist."
366 var_expr.set_type(vm.get_base_type(name),vm.get_num_dims(name));
370 boost::phoenix::function<set_var_type> set_var_type_f;
372 struct validate_int_expr3 {
373 template <
typename T1,
typename T2>
374 struct result {
typedef bool type; };
376 bool operator()(
const expression& expr,
377 std::stringstream& error_msgs)
const {
378 if (!expr.expression_type().is_primitive_int()) {
379 error_msgs <<
"expression denoting integer required; found type="
380 << expr.expression_type() << std::endl;
386 boost::phoenix::function<validate_int_expr3> validate_int_expr3_f;
389 struct validate_expr_type {
390 template <
typename T1,
typename T2>
391 struct result {
typedef bool type; };
393 bool operator()(
const expression& expr,
394 std::ostream& error_msgs)
const {
395 if (expr.expression_type().is_ill_formed()) {
396 error_msgs <<
"expression is ill formed" << std::endl;
402 boost::phoenix::function<validate_expr_type> validate_expr_type_f;
408 template <
typename Iterator>
410 std::stringstream& error_msgs,
412 : term_grammar::base_type(term_r),
414 error_msgs_(error_msgs),
417 using boost::spirit::qi::_1;
418 using boost::spirit::qi::char_;
419 using boost::spirit::qi::double_;
420 using boost::spirit::qi::eps;
421 using boost::spirit::qi::int_;
422 using boost::spirit::qi::lexeme;
423 using boost::spirit::qi::lit;
424 using boost::spirit::qi::_pass;
425 using boost::spirit::qi::_val;
426 using boost::spirit::qi::labels::_r1;
432 = ( negated_factor_r(_r1)
434 >> *( (lit(
'*') > negated_factor_r(_r1)
435 [_val = multiplication(_val,_1,
436 boost::phoenix::ref(error_msgs_))])
437 | (lit(
'/') > negated_factor_r(_r1)
438 [_val = division(_val,_1,boost::phoenix::ref(error_msgs_))])
439 | (lit(
'\\') > negated_factor_r(_r1)
440 [_val = left_division(_val,_1,
441 boost::phoenix::ref(error_msgs_))])
442 | (lit(
".*") > negated_factor_r(_r1)
443 [_val = elt_multiplication(_val,_1,
444 boost::phoenix::ref(error_msgs_))])
445 | (lit(
"./") > negated_factor_r(_r1)
446 [_val = elt_division(_val,_1,
447 boost::phoenix::ref(error_msgs_))])
454 = lit(
'-') >> negated_factor_r(_r1)
455 [_val = negate_expr_f(_1,boost::phoenix::ref(error_msgs_))]
456 | lit(
'!') >> negated_factor_r(_r1)
457 [_val = logical_negate_expr_f(_1,boost::phoenix::ref(error_msgs_))]
458 | lit(
'+') >> negated_factor_r(_r1) [_val = _1]
459 | indexed_factor_r(_r1) [_val = _1];
462 indexed_factor_r.name(
"(optionally) indexed factor [sub]");
464 = factor_r(_r1) [_val = _1]
467 [_val = add_expression_dimss_f(_val, _1, _pass,
468 boost::phoenix::ref(error_msgs_))]
471 [_val = transpose_f(_val, boost::phoenix::ref(error_msgs_))]
476 factor_r.name(
"factor");
478 = int_literal_r [_val = _1]
479 | double_literal_r [_val = _1]
480 | fun_r(_r1) [_val = set_fun_type_named_f(_1,_r1,_pass,boost::phoenix::ref(error_msgs_))]
481 | variable_r [_val = set_var_type_f(_1,boost::phoenix::ref(var_map_),
482 boost::phoenix::ref(error_msgs_),
485 > expression_g(_r1) [_val = _1]
489 int_literal_r.name(
"integer literal");
497 double_literal_r.name(
"real literal");
502 fun_r.name(
"function and argument expressions");
508 identifier_r.name(
"identifier (expression grammar)");
510 %= lexeme[char_(
"a-zA-Z")
511 >> *char_(
"a-zA-Z0-9_.")];
514 args_r.name(
"function argument expressions");
516 %= (lit(
'(') >> lit(
')'))
518 >> (expression_g(_r1) %
',')
523 dims_r.name(
"array dimensions");
527 [_pass = validate_int_expr3_f(_1,boost::phoenix::ref(error_msgs_))]
533 variable_r.name(
"variable expression");