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