Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
statement_2_grammar_def.hpp
Go to the documentation of this file.
1 #ifndef STAN__GM__PARSER__STATEMENT_2_GRAMMAR_DEF__HPP
2 #define STAN__GM__PARSER__STATEMENT_2_GRAMMAR_DEF__HPP
3 
4 #include <cstddef>
5 #include <iomanip>
6 #include <iostream>
7 #include <istream>
8 #include <map>
9 #include <set>
10 #include <sstream>
11 #include <string>
12 #include <utility>
13 #include <vector>
14 #include <stdexcept>
15 
16 #include <boost/spirit/include/qi.hpp>
17 // FIXME: get rid of unused include
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>
24 
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>
42 
43 #include <stan/gm/ast.hpp>
49 
50 
51 namespace stan {
52 
53  namespace gm {
54 
56  template <typename T1, typename T2, typename T3, typename T4>
57  struct result { typedef void type; };
59  const expression& e,
60  bool& pass,
61  std::stringstream& error_msgs) const {
62  if (!e.expression_type().is_primitive()) {
63  error_msgs << "conditions in if-else statement must be primitive int or real;"
64  << " found type=" << e.expression_type() << std::endl;
65  pass = false;
66  return;
67  }
68  cs.conditions_.push_back(e);
69  pass = true;
70  return;
71  }
72  };
73  boost::phoenix::function<add_conditional_condition> add_conditional_condition_f;
74 
76  template <typename T1, typename T2>
77  struct result { typedef void type; };
79  const statement& s) const {
80  cs.bodies_.push_back(s);
81  }
82  };
83  boost::phoenix::function<add_conditional_body> add_conditional_body_f;
84 
85 
86 
87  template <typename Iterator>
89  std::stringstream& error_msgs,
91  : statement_2_grammar::base_type(statement_2_r),
92  var_map_(var_map),
93  error_msgs_(error_msgs),
94  expression_g(var_map,error_msgs),
95  statement_g(sg)
96  {
97  using boost::spirit::qi::_1;
98  using boost::spirit::qi::char_;
99  using boost::spirit::qi::lit;
100  using boost::spirit::qi::_pass;
101  using boost::spirit::qi::_val;
102 
103  using boost::spirit::qi::labels::_r1;
104  using boost::spirit::qi::labels::_r2;
105  using boost::spirit::qi::labels::_r3;
106 
107  // _r1 true if sample_r allowed (inherited)
108  // _r2 source of variables allowed for assignments
109  // set to true if sample_r are allowed
110  statement_2_r.name("statement");
112  %= conditional_statement_r(_r1,_r2,_r3)
113  ;
114 
115 
116  conditional_statement_r.name("if-else statement");
118  = lit("if")
119  > lit('(')
120  > expression_g(_r2)
121  [add_conditional_condition_f(_val,_1,_pass,
122  boost::phoenix::ref(error_msgs_))]
123  > lit(')')
124  > statement_g(_r1,_r2,_r3)
125  [add_conditional_body_f(_val,_1)]
126  > * (( lit("else")
127  >> lit("if") )
128  > lit('(')
129  > expression_g(_r2)
130  [add_conditional_condition_f(_val,_1,_pass,
131  boost::phoenix::ref(error_msgs_))]
132  > lit(')')
133  > statement_g(_r1,_r2,_r3)
134  [add_conditional_body_f(_val,_1)]
135  )
136  > - (lit("else")
137  > statement_g(_r1,_r2,_r3)
138  [add_conditional_body_f(_val,_1)]
139  )
140  ;
141 
142  }
143 
144  }
145 }
146 #endif
void operator()(conditional_statement &cs, const expression &e, bool &pass, std::stringstream &error_msgs) const
statement_2_grammar(variable_map &var_map, std::stringstream &error_msgs, statement_grammar< Iterator > &sg)
boost::spirit::qi::rule< Iterator, statement(bool, var_origin, bool), whitespace_grammar< Iterator > > statement_2_r
std::vector< expression > conditions_
Definition: ast.hpp:730
boost::phoenix::function< add_conditional_condition > add_conditional_condition_f
boost::spirit::qi::rule< Iterator, conditional_statement(bool, var_origin, bool), whitespace_grammar< Iterator > > conditional_statement_r
boost::phoenix::function< add_conditional_body > add_conditional_body_f
std::vector< statement > bodies_
Definition: ast.hpp:731
expression_grammar< Iterator > expression_g
void operator()(conditional_statement &cs, const statement &s) const
statement_grammar< Iterator > & statement_g
double e()
Return the base of the natural logarithm.
Definition: constants.hpp:86
expr_type expression_type() const
Definition: ast_def.cpp:570
bool is_primitive() const
Definition: ast_def.cpp:93

     [ Stan Home Page ] © 2011–2014, Stan Development Team.