1 #ifndef STAN_LANG_PARSER_HPP
2 #define STAN_LANG_PARSER_HPP
4 #include <boost/lexical_cast.hpp>
5 #include <boost/config/warning_disable.hpp>
6 #include <boost/fusion/include/adapt_struct.hpp>
7 #include <boost/fusion/include/std_pair.hpp>
8 #include <boost/spirit/home/support/iterators/line_pos_iterator.hpp>
9 #include <boost/spirit/include/qi.hpp>
10 #include <boost/spirit/include/qi_numeric.hpp>
11 #include <boost/spirit/include/phoenix_core.hpp>
12 #include <boost/spirit/include/phoenix_function.hpp>
13 #include <boost/spirit/include/phoenix_fusion.hpp>
14 #include <boost/spirit/include/phoenix_object.hpp>
15 #include <boost/spirit/include/phoenix_operator.hpp>
16 #include <boost/spirit/include/phoenix_stl.hpp>
17 #include <boost/spirit/include/support_multi_pass.hpp>
18 #include <boost/spirit/include/version.hpp>
19 #include <boost/tuple/tuple.hpp>
20 #include <boost/variant/apply_visitor.hpp>
21 #include <boost/variant/recursive_variant.hpp>
49 return c ==
' ' || c ==
'\n' || c ==
'\r' || c ==
'\t';
53 for (
size_t i = 0; i < s.size(); ++i)
59 inline bool parse(std::ostream* output_stream,
61 const std::string& model_name,
63 using boost::spirit::multi_pass;
64 using boost::spirit::make_default_multi_pass;
65 using std::istreambuf_iterator;
67 using boost::spirit::qi::expectation_failure;
68 using boost::spirit::qi::phrase_parse;
70 using boost::phoenix::construct;
71 using boost::phoenix::val;
75 std::ostringstream buf;
77 std::string stan_string = buf.str();
79 typedef std::string::const_iterator input_iterator;
80 typedef boost::spirit::line_pos_iterator<input_iterator> lp_iterator;
82 lp_iterator fwd_begin = lp_iterator(stan_string.begin());
83 lp_iterator fwd_end = lp_iterator(stan_string.end());
88 bool parse_succeeded =
false;
90 parse_succeeded = phrase_parse(fwd_begin,
95 std::string diagnostics = prog_grammar.error_msgs_.str();
97 *output_stream <<
"DIAGNOSTIC(S) FROM PARSER:"
102 }
catch (
const expectation_failure<lp_iterator>& e) {
103 std::stringstream msg;
104 std::string diagnostics = prog_grammar.error_msgs_.str();
106 msg <<
"SYNTAX ERROR, MESSAGE(S) FROM PARSER:"
112 std::stringstream ss;
114 std::string e_what = ss.str();
115 std::string angle_eps(
"<eps>");
116 if (e_what != angle_eps)
117 msg <<
"PARSER EXPECTED: "
121 throw std::invalid_argument(msg.str());
122 }
catch (
const std::exception& e) {
123 std::stringstream msg;
124 msg <<
"PROGRAM ERROR, MESSAGE(S) FROM PARSER:"
126 << prog_grammar.error_msgs_.str()
129 throw std::invalid_argument(msg.str());
132 bool consumed_all_input = (fwd_begin == fwd_end);
133 bool success = parse_succeeded && consumed_all_input;
136 std::stringstream msg;
137 if (!parse_succeeded)
138 msg <<
"PARSE FAILED." << std::endl;
140 if (!consumed_all_input) {
141 std::basic_stringstream<char> unparsed_non_ws;
142 unparsed_non_ws << boost::make_iterator_range(fwd_begin, fwd_end);
143 msg <<
"PARSER EXPECTED: whitespace to end of file."
146 << get_line(fwd_begin)
149 << unparsed_non_ws.str()
152 msg << std::endl << prog_grammar.error_msgs_.str() << std::endl;
153 throw std::invalid_argument(msg.str());
Probability, optimization and sampling library.
bool parse(std::ostream *output_stream, std::istream &input, const std::string &model_name, program &result)
bool is_nonempty(std::string &s)