1 #ifndef STAN_LANG_GRAMMARS_INDEXES_GRAMMAR_DEF_HPP
2 #define STAN_LANG_GRAMMARS_INDEXES_GRAMMAR_DEF_HPP
3 
4 #include <stan/lang/ast.hpp>
5 #include <stan/lang/grammars/indexes_grammar.hpp>
6 #include <stan/lang/grammars/semantic_actions.hpp>
7 #include <stan/lang/grammars/whitespace_grammar.hpp>
8 #include <boost/spirit/include/qi.hpp>
9 #include <boost/spirit/include/phoenix_core.hpp>
10 
11 BOOST_FUSION_ADAPT_STRUCT(stan::lang::uni_idx,
12                           (stan::lang::expression, idx_) )
13 
14 BOOST_FUSION_ADAPT_STRUCT(stan::lang::multi_idx,
15                           (stan::lang::expression, idxs_) )
16 
17 BOOST_FUSION_ADAPT_STRUCT(stan::lang::lb_idx,
18                           (stan::lang::expression, lb_) )
19 
20 BOOST_FUSION_ADAPT_STRUCT(stan::lang::ub_idx,
21                           (stan::lang::expression, ub_) )
22 
23 BOOST_FUSION_ADAPT_STRUCT(stan::lang::lub_idx,
24                           (stan::lang::expression, lb_)
25                           (stan::lang::expression, ub_) )
26 
27 namespace stan {
28 
29   namespace lang {
30 
31     template <typename Iterator>
indexes_grammar(variable_map & var_map,std::stringstream & error_msgs,expression_grammar<Iterator> & eg)32     indexes_grammar<Iterator>::indexes_grammar(variable_map& var_map,
33                                                std::stringstream& error_msgs,
34                                                expression_grammar<Iterator>& eg)
35       : indexes_grammar::base_type(indexes_r),
36         var_map_(var_map),
37         error_msgs_(error_msgs),
38         expression_g(eg) {
39       using boost::spirit::qi::eps;
40       using boost::spirit::qi::lit;
41       using boost::spirit::qi::_val;
42       using boost::spirit::qi::_r1;
43       using boost::spirit::qi::_1;
44       using boost::spirit::qi::_pass;
45 
46       //   _r1 var scope
47       indexes_r.name("indexes (zero or more)");
48       indexes_r
49         %=  lit("[")
50         >> (index_r(_r1) % ',')
51         > close_indexes_r;
52 
53       close_indexes_r.name("one or more container indexes followed by ']'");
54       close_indexes_r %= lit(']');
55 
56       //   _r1 var scope
57       index_r.name("index expression, one of: "
58                    "(int, int[], int:, :int, int:int, :)");
59       index_r
60         %= lub_index_r(_r1)
61         | lb_index_r(_r1)
62         | uni_index_r(_r1)
63         | multi_index_r(_r1)
64         | ub_index_r(_r1)
65         | omni_index_r(_r1);
66 
67       //   _r1 var scope
68       lub_index_r.name("index expression int:int");
69       lub_index_r
70         %= int_expression_r(_r1)
71         >> lit(":")
72         >> int_expression_r(_r1);
73 
74 
75       //   _r1 var scope
76       lb_index_r.name("index expression int:");
77       lb_index_r
78         %= int_expression_r(_r1)
79         >> lit(":");
80 
81       //   _r1 var scope
82       uni_index_r.name("index expression int");
83       uni_index_r
84         %= int_expression_r(_r1);
85 
86       //   _r1 var scope
87       multi_index_r.name("index expression int[]");
88       multi_index_r
89         %= expression_g(_r1)
90            [validate_ints_expression_f(_1, _pass,
91                                        boost::phoenix::ref(error_msgs_))];
92 
93       //   _r1 var scope
94       ub_index_r.name("index expression :int");
95       ub_index_r
96         %= lit(":")
97         >> int_expression_r(_r1);
98 
99       //   _r1 var scope
100       omni_index_r.name("index expression :");
101       omni_index_r
102         = lit(":")[set_omni_idx_f(_val)]
103         |  eps[set_omni_idx_f(_val)];
104 
105       //   _r1 var scope
106       int_expression_r.name("integer expression");
107       int_expression_r
108         %= expression_g(_r1)[validate_int_expr_silent_f(_1, _pass)];
109     }
110 
111   }
112 }
113 #endif
114