I might be completely missing the problem here, but what wrong with the kleene star, plus parser and or list parser directives?
stock_prices_ = +stock_price_ | eps; // one or more stock_price_ or nothing
However, this looks to be exactly the semantics of just kleene star:
stock_price = symbol_ >> date_ >> price_;
grammar_ = "PRICES" >> *stock_price_ >> "END"; // zero or more stock_price_
Now, if you wanted them line-separated e.g., use1:
grammar_ = "PRICES" >> -(stock_price_ % eol) >> "END";
1 combine with e.g. the qi::blank
skipper, which doesn't eat the newlines