Stan  2.10.0
probability, sampling & optimization
program_grammar_def.hpp
Go to the documentation of this file.
1 #ifndef STAN_LANG_GRAMMARS_PROGRAM_GRAMMAR_DEF_HPP
2 #define STAN_LANG_GRAMMARS_PROGRAM_GRAMMAR_DEF_HPP
3 
4 #include <stan/lang/ast.hpp>
7 #include <boost/format.hpp>
8 #include <boost/fusion/include/std_pair.hpp>
9 #include <boost/spirit/home/support/iterators/line_pos_iterator.hpp>
10 #include <boost/spirit/include/phoenix_core.hpp>
11 #include <boost/spirit/include/qi.hpp>
12 #include <iomanip>
13 #include <sstream>
14 #include <string>
15 #include <utility>
16 #include <vector>
17 
18 namespace {
19  // hack to pass pair into macro below to adapt; in namespace to hide
20  struct DUMMY_STRUCT {
21  typedef std::pair<std::vector<stan::lang::var_decl>,
22  std::vector<stan::lang::statement> > type;
23  };
24 }
25 
27  (std::vector<stan::lang::function_decl_def>,
28  function_decl_defs_)
29  (std::vector<stan::lang::var_decl>, data_decl_)
30  (DUMMY_STRUCT::type, derived_data_decl_)
31  (std::vector<stan::lang::var_decl>, parameter_decl_)
32  (DUMMY_STRUCT::type, derived_decl_)
33  (stan::lang::statement, statement_)
34  (DUMMY_STRUCT::type, generated_decl_) )
35 
36 
37 namespace stan {
38 
39  namespace lang {
40 
41  template <typename Iterator>
42  program_grammar<Iterator>::program_grammar(const std::string& model_name)
43  : program_grammar::base_type(program_r),
44  model_name_(model_name),
45  var_map_(),
46  error_msgs_(),
47  expression_g(var_map_, error_msgs_),
48  var_decls_g(var_map_, error_msgs_),
49  statement_g(var_map_, error_msgs_),
50  functions_g(var_map_, error_msgs_) {
51  using boost::spirit::qi::eps;
52  using boost::spirit::qi::lit;
53  using boost::spirit::qi::on_error;
54  using boost::spirit::qi::rethrow;
55  using boost::spirit::qi::_1;
56  using boost::spirit::qi::_2;
57  using boost::spirit::qi::_3;
58  using boost::spirit::qi::_4;
59 
60  // add model_name to var_map with special origin
61  var_map_.add(model_name, base_var_decl(), model_name_origin);
62 
63  program_r.name("program");
64  program_r
65  %= -functions_g
66  > -data_var_decls_r
67  > -derived_data_var_decls_r
68  > -param_var_decls_r
69  > eps[add_lp_var_f(boost::phoenix::ref(var_map_))]
70  > -derived_var_decls_r
71  > model_r
72  > eps[remove_lp_var_f(boost::phoenix::ref(var_map_))]
73  > -generated_var_decls_r;
74 
75  model_r.name("model declaration (or perhaps an earlier block)");
76  model_r
77  %= lit("model")
78  > statement_g(true, local_origin, false);
79 
80  end_var_decls_r.name(
81  "one of the following:\n"
82  " a variable declaration, beginning with type,\n"
83  " (int, real, vector, row_vector, matrix, unit_vector,\n"
84  " simplex, ordered, positive_ordered,\n"
85  " corr_matrix, cov_matrix,\n"
86  " cholesky_corr, cholesky_cov\n"
87  " or '}' to close variable declarations");
88  end_var_decls_r %= lit('}');
89 
90  end_var_decls_statements_r.name(
91  "one of the following:\n"
92  " a variable declaration, beginning with type\n"
93  " (int, real, vector, row_vector, matrix, unit_vector,\n"
94  " simplex, ordered, positive_ordered,\n"
95  " corr_matrix, cov_matrix,\n"
96  " cholesky_corr, cholesky_cov\n"
97  " or a <statement>\n"
98  " or '}' to close variable declarations and definitions");
99  end_var_decls_statements_r %= lit('}');
100 
101  end_var_definitions_r.name("expected another statement or '}'"
102  " to close declarations");
103  end_var_definitions_r %= lit('}');
104 
105  data_var_decls_r.name("data variable declarations");
106  data_var_decls_r
107  %= (lit("data")
108  > lit('{'))
109  > var_decls_g(true, data_origin) // +constraints
110  > end_var_decls_r;
111 
112  derived_data_var_decls_r.name("transformed data block");
113  derived_data_var_decls_r
114  %= ((lit("transformed")
115  >> lit("data"))
116  > lit('{'))
117  > var_decls_g(true, transformed_data_origin) // -constraints
118  > ((statement_g(false, transformed_data_origin, false)
119  > *statement_g(false, transformed_data_origin, false)
120  > end_var_definitions_r)
121  | (*statement_g(false, transformed_data_origin, false)
122  > end_var_decls_statements_r));
123 
124  param_var_decls_r.name("parameter variable declarations");
125  param_var_decls_r
126  %= (lit("parameters")
127  > lit('{'))
128  > var_decls_g(true, parameter_origin) // +constraints
129  > end_var_decls_r;
130 
131  derived_var_decls_r.name("derived variable declarations");
132  derived_var_decls_r
133  %= (lit("transformed")
134  > lit("parameters")
135  > lit('{'))
136  > var_decls_g(true, transformed_parameter_origin)
137  > *statement_g(false, transformed_parameter_origin, false)
138  > end_var_decls_statements_r;
139 
140  generated_var_decls_r.name("generated variable declarations");
141  generated_var_decls_r
142  %= (lit("generated")
143  > lit("quantities")
144  > lit('{'))
145  > var_decls_g(true, derived_origin)
146  > *statement_g(false, derived_origin, false)
147  > end_var_decls_statements_r;
148 
149  on_error<rethrow>(program_r,
150  program_error_f(_1, _2, _3,
151  boost::phoenix::ref(var_map_),
152  boost::phoenix::ref(error_msgs_)));
153  }
154 
155  }
156 }
157 #endif
const int derived_origin
Definition: ast.hpp:82
const int parameter_origin
Definition: ast.hpp:80
Probability, optimization and sampling library.
boost::phoenix::function< program_error > program_error_f
const int transformed_parameter_origin
Definition: ast.hpp:81
boost::phoenix::function< remove_lp_var > remove_lp_var_f
const int model_name_origin
Definition: ast.hpp:77
const int data_origin
Definition: ast.hpp:78
boost::phoenix::function< add_lp_var > add_lp_var_f
const int local_origin
Definition: ast.hpp:83
BOOST_FUSION_ADAPT_STRUCT(stan::lang::program,(std::vector< stan::lang::function_decl_def >, function_decl_defs_)(std::vector< stan::lang::var_decl >, data_decl_)(DUMMY_STRUCT::type, derived_data_decl_)(std::vector< stan::lang::var_decl >, parameter_decl_)(DUMMY_STRUCT::type, derived_decl_)(stan::lang::statement, statement_)(DUMMY_STRUCT::type, generated_decl_)) namespace stan
const int transformed_data_origin
Definition: ast.hpp:79

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