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 const bool allow_undefined =
false) {
64 using boost::spirit::multi_pass;
65 using boost::spirit::make_default_multi_pass;
66 using std::istreambuf_iterator;
68 using boost::spirit::qi::expectation_failure;
69 using boost::spirit::qi::phrase_parse;
71 using boost::phoenix::construct;
72 using boost::phoenix::val;
76 std::ostringstream buf;
78 std::string stan_string = buf.str();
80 typedef std::string::const_iterator input_iterator;
81 typedef boost::spirit::line_pos_iterator<input_iterator> lp_iterator;
83 lp_iterator fwd_begin = lp_iterator(stan_string.begin());
84 lp_iterator fwd_end = lp_iterator(stan_string.end());
89 bool parse_succeeded =
false;
91 parse_succeeded = phrase_parse(fwd_begin,
96 std::string diagnostics = prog_grammar.error_msgs_.str();
98 *output_stream <<
"DIAGNOSTIC(S) FROM PARSER:" 103 }
catch (
const expectation_failure<lp_iterator>& e) {
104 std::stringstream msg;
105 std::string diagnostics = prog_grammar.error_msgs_.str();
107 msg <<
"SYNTAX ERROR, MESSAGE(S) FROM PARSER:" 113 std::stringstream ss;
115 std::string e_what = ss.str();
116 std::string angle_eps(
"<eps>");
117 if (e_what != angle_eps)
118 msg <<
"PARSER EXPECTED: " 122 throw std::invalid_argument(msg.str());
123 }
catch (
const std::exception& e) {
124 std::stringstream msg;
125 msg <<
"PROGRAM ERROR, MESSAGE(S) FROM PARSER:" 127 << prog_grammar.error_msgs_.str()
130 throw std::invalid_argument(msg.str());
133 bool consumed_all_input = (fwd_begin == fwd_end);
134 bool success = parse_succeeded && consumed_all_input;
137 std::stringstream msg;
138 if (!parse_succeeded)
139 msg <<
"PARSE FAILED." << std::endl;
141 if (!consumed_all_input) {
142 std::basic_stringstream<char> unparsed_non_ws;
143 unparsed_non_ws << boost::make_iterator_range(fwd_begin, fwd_end);
144 msg <<
"PARSER EXPECTED: whitespace to end of file." 147 << get_line(fwd_begin)
150 << unparsed_non_ws.str()
153 msg << std::endl << prog_grammar.error_msgs_.str() << std::endl;
154 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, const bool allow_undefined=false)
static void reset_sigs()
Reset the signature singleton to contain no instances.
AST node for a complete Stan program.
bool is_nonempty(std::string &s)