summaryrefslogtreecommitdiff
path: root/boost/metaparse/v1/debug_parsing_error.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/metaparse/v1/debug_parsing_error.hpp')
-rw-r--r--boost/metaparse/v1/debug_parsing_error.hpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/boost/metaparse/v1/debug_parsing_error.hpp b/boost/metaparse/v1/debug_parsing_error.hpp
new file mode 100644
index 0000000000..ea44188838
--- /dev/null
+++ b/boost/metaparse/v1/debug_parsing_error.hpp
@@ -0,0 +1,105 @@
+#ifndef BOOST_METAPARSE_V1_DEBUG_PARSING_ERROR_HPP
+#define BOOST_METAPARSE_V1_DEBUG_PARSING_ERROR_HPP
+
+// Copyright Abel Sinkovics (abel@sinkovics.hu) 2011.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/metaparse/v1/fwd/build_parser.hpp>
+#include <boost/metaparse/v1/start.hpp>
+#include <boost/metaparse/v1/is_error.hpp>
+#include <boost/metaparse/v1/get_remaining.hpp>
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/string.hpp>
+
+#include <iostream>
+#include <cstdlib>
+
+namespace boost
+{
+ namespace metaparse
+ {
+ namespace v1
+ {
+ template <class P, class S>
+ class debug_parsing_error
+ {
+ public:
+ debug_parsing_error()
+ {
+ using std::cout;
+ using std::endl;
+ using boost::mpl::c_str;
+
+ typedef display<typename P::template apply<S, start>::type> runner;
+
+ cout << "Compile-time parsing results" << endl;
+ cout << "----------------------------" << endl;
+ cout << "Input text:" << endl;
+ cout << c_str<S>::type::value << endl;
+ cout << endl;
+ runner::run();
+
+ std::exit(0);
+ }
+
+ typedef debug_parsing_error type;
+ private:
+ template <class Result>
+ struct display_error
+ {
+ static void run()
+ {
+ typedef typename Result::type R;
+
+ std::cout
+ << "Parsing failed:" << std::endl
+ << "line " << get_line<typename R::source_position>::type::value
+ << ", col " << get_col<typename R::source_position>::type::value
+ << ": "
+ << R::message::type::get_value() << std::endl;
+ }
+ };
+
+ template <class Result>
+ struct display_no_error
+ {
+ static void run()
+ {
+ using std::cout;
+ using std::endl;
+ using boost::mpl::c_str;
+
+ typedef typename get_remaining<Result>::type remaining_string;
+
+ cout
+ << "Parsing was successful. Remaining string is:" << endl
+ << c_str<remaining_string>::type::value << endl;
+ }
+ };
+
+ template <class Result>
+ struct display :
+ boost::mpl::if_<
+ typename is_error<Result>::type,
+ display_error<Result>,
+ display_no_error<Result>
+ >::type
+ {};
+ };
+
+ // Special case to handle when DebugParsingError is used with build_parser
+ // (it shouldn't be)
+ template <class P, class S>
+ class debug_parsing_error<build_parser<P>, S> :
+ debug_parsing_error<P, S>
+ {};
+ }
+ }
+}
+
+#endif
+
+