Stan  1.0
probability, sampling & optimization
program_grammar_def.hpp
Go to the documentation of this file.
1 #ifndef __STAN__GM__PARSER__PROGRAM_GRAMMAR_DEF__HPP__
2 #define __STAN__GM__PARSER__PROGRAM_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 namespace {
51  // hack to pass pair into macro below to adapt; in namespace to hide
52  struct DUMMY_STRUCT {
53  typedef std::pair<std::vector<stan::gm::var_decl>,
54  std::vector<stan::gm::statement> > type;
55  };
56 }
57 
58 
60  (std::vector<stan::gm::var_decl>, data_decl_)
61  (DUMMY_STRUCT::type, derived_data_decl_)
62  (std::vector<stan::gm::var_decl>, parameter_decl_)
63  (DUMMY_STRUCT::type, derived_decl_)
64  (stan::gm::statement, statement_)
65  (DUMMY_STRUCT::type, generated_decl_) )
66 
67 
68 namespace stan {
69 
70  namespace gm {
71 
72  struct add_lp_var {
73  template <typename T>
74  struct result { typedef void type; };
75  void operator()(variable_map& vm) const {
76  vm.add("lp__",
77  base_var_decl("lp__",std::vector<expression>(),DOUBLE_T),
78  local_origin); // lp acts as a local where defined
79  }
80  };
81  boost::phoenix::function<add_lp_var> add_lp_var_f;
82 
83  struct remove_lp_var {
84  template <typename T>
85  struct result { typedef void type; };
86  void operator()(variable_map& vm) const {
87  vm.remove("lp__");
88  }
89  };
90  boost::phoenix::function<remove_lp_var> remove_lp_var_f;
91 
92 
93  template <typename Iterator>
95  : program_grammar::base_type(program_r),
96  var_map_(),
97  error_msgs_(),
98  expression_g(var_map_,error_msgs_),
99  var_decls_g(var_map_,error_msgs_),
100  statement_g(var_map_,error_msgs_) {
101 
102  using boost::spirit::qi::eps;
103  using boost::spirit::qi::lit;
104 
105  program_r.name("program");
106  program_r
107  %= -data_var_decls_r
108  > -derived_data_var_decls_r
109  > -param_var_decls_r
110  // scope lp__ to "transformed params" and "model" only
111  > eps[add_lp_var_f(boost::phoenix::ref(var_map_))]
112  > -derived_var_decls_r
113  > model_r
114  > eps[remove_lp_var_f(boost::phoenix::ref(var_map_))]
115  > -generated_var_decls_r
116  ;
117 
118  model_r.name("model declaration");
119  model_r
120  %= lit("model")
121  > statement_g(true,local_origin) // assign only to locals
122  ;
123 
124  data_var_decls_r.name("data variable declarations");
125  data_var_decls_r
126  %= lit("data")
127  > lit('{')
128  > var_decls_g(true,data_origin) // +constraints
129  > lit('}');
130 
131  derived_data_var_decls_r.name("transformed data block");
132  derived_data_var_decls_r
133  %= lit("transformed")
134  >> lit("data")
135  > lit('{')
136  > var_decls_g(true,transformed_data_origin) // -constraints
137  > *statement_g(false,transformed_data_origin) // -sampling
138  > lit('}');
139 
140  param_var_decls_r.name("parameter variable declarations");
141  param_var_decls_r
142  %= lit("parameters")
143  > lit('{')
144  > var_decls_g(true,parameter_origin) // +constraints
145  > lit('}');
146 
147  derived_var_decls_r.name("derived variable declarations");
148  derived_var_decls_r
149  %= lit("transformed")
150  >> lit("parameters")
151  > lit('{')
152  > var_decls_g(true,transformed_parameter_origin) // -constraints
153  > *statement_g(false,transformed_parameter_origin) // -sampling
154  > lit('}');
155 
156  generated_var_decls_r.name("generated variable declarations");
157  generated_var_decls_r
158  %= lit("generated")
159  > lit("quantities")
160  > lit('{')
161  > var_decls_g(true,derived_origin) // -constraints
162  > *statement_g(false,derived_origin) // -sampling
163  > lit('}');
164 
165  using boost::spirit::qi::on_error;
166  using boost::spirit::qi::rethrow;
167  on_error<rethrow>(program_r,
168  (std::ostream&)error_msgs_
169  << std::endl
170  << boost::phoenix::val("Parser expecting: ")
171  << boost::spirit::qi::labels::_4);
172  }
173 
174  }
175 }
176 
177 #endif
const int parameter_origin
Definition: ast.hpp:361
const int transformed_data_origin
Definition: ast.hpp:360
const int DOUBLE_T
Definition: ast.hpp:55
const int data_origin
Definition: ast.hpp:359
const int transformed_parameter_origin
Definition: ast.hpp:362
const int local_origin
Definition: ast.hpp:364
const int derived_origin
Definition: ast.hpp:363
Probability, optimization and sampling library.
Definition: agrad.cpp:6
BOOST_FUSION_ADAPT_STRUCT(stan::gm::program,(std::vector< stan::gm::var_decl >, data_decl_)(DUMMY_STRUCT::type, derived_data_decl_)(std::vector< stan::gm::var_decl >, parameter_decl_)(DUMMY_STRUCT::type, derived_decl_)(stan::gm::statement, statement_)(DUMMY_STRUCT::type, generated_decl_)) namespace stan

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