Stan  1.0
probability, sampling & optimization
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>
50 
51 
52 namespace stan {
53 
54  namespace gm {
55 
56 
57 
59  template <typename T1, typename T2, typename T3>
60  struct result { typedef bool type; };
62  const expression& e,
63  std::stringstream& error_msgs) const {
64  if (!e.expression_type().is_primitive()) {
65  error_msgs << "conditions in if-else statement must be primitive int or real;"
66  << " found type=" << e.expression_type() << std::endl;
67  return false;
68  }
69  cs.conditions_.push_back(e);
70  return true;
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 
106  // _r1 true if sample_r allowed (inherited)
107  // _r2 source of variables allowed for assignments
108  // set to true if sample_r are allowed
109  statement_2_r.name("statement");
111  %= conditional_statement_r(_r1,_r2)
112  ;
113 
114 
115  conditional_statement_r.name("if-else statement");
117  = lit("if")
118  > lit('(')
119  > expression_g
120  [_pass = add_conditional_condition_f(_val,_1,
121  boost::phoenix::ref(error_msgs_))]
122  > lit(')')
123  > statement_g(_r1,_r2)
124  [add_conditional_body_f(_val,_1)]
125  > * (lit("else")
126  >> lit("if")
127  > lit('(')
128  > expression_g
129  [_pass = add_conditional_condition_f(_val,_1,
130  boost::phoenix::ref(error_msgs_))]
131  > lit(')')
132  > statement_g(_r1,_r2)
133  [add_conditional_body_f(_val,_1)]
134  )
135  > - (lit("else")
136  > statement_g(_r1,_r2)
137  [add_conditional_body_f(_val,_1)]
138  )
139  ;
140 
141  }
142 
143  }
144 }
145 #endif
boost::phoenix::function< add_conditional_condition > add_conditional_condition_f
boost::phoenix::function< add_conditional_body > add_conditional_body_f
double e()
Return the base of the natural logarithm.
Probability, optimization and sampling library.
Definition: agrad.cpp:6
void operator()(conditional_statement &cs, const statement &s) const
bool operator()(conditional_statement &cs, const expression &e, std::stringstream &error_msgs) const
std::vector< expression > conditions_
Definition: ast.hpp:589
std::vector< statement > bodies_
Definition: ast.hpp:590
statement_2_grammar(variable_map &var_map, std::stringstream &error_msgs, statement_grammar< Iterator > &sg)
boost::spirit::qi::rule< Iterator, conditional_statement(bool, var_origin), whitespace_grammar< Iterator > > conditional_statement_r
statement_grammar< Iterator > & statement_g
expression_grammar< Iterator > expression_g
boost::spirit::qi::rule< Iterator, statement(bool, var_origin), whitespace_grammar< Iterator > > statement_2_r

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