| // Copyright (c) 2001-2010 Hartmut Kaiser |
| // |
| // 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/config/warning_disable.hpp> |
| #include <boost/detail/lightweight_test.hpp> |
| #include <boost/lexical_cast.hpp> |
| |
| #define BOOST_SPIRIT_UNICODE |
| |
| #include <iostream> |
| #include <fstream> |
| #include <iterator> |
| |
| #include <utree/utree.hpp> |
| #include <qi/parse_qiexpr.hpp> |
| #include <output/generate_sexpr.hpp> |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| bool parse_rhs(std::string const& str, scheme::utree& result) |
| { |
| if (scheme::input::parse_qi_expr(str, result)) |
| { |
| if (scheme::output::generate_sexpr(std::cout, result)) |
| { |
| std::cout << std::endl; |
| return true; |
| } |
| else |
| { |
| std::cout << "generate error" << std::endl; |
| } |
| } |
| else |
| { |
| std::cout << "parse error" << std::endl; |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| bool parse_rule(std::string str) |
| { |
| // construct a rule |
| str = "name = " + str; |
| |
| // parse it |
| scheme::utree result; |
| if (scheme::input::parse_qi_rule(str, result)) |
| { |
| if (scheme::output::generate_sexpr(std::cout, result)) |
| { |
| std::cout << std::endl; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| bool parse_grammar(std::string str) |
| { |
| // parse it |
| scheme::utree result; |
| if (scheme::input::parse_qi_grammar(str, result)) |
| { |
| if (scheme::output::generate_sexpr_list(std::cout, result)) |
| { |
| std::cout << std::endl; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // Main program |
| /////////////////////////////////////////////////////////////////////////////// |
| int main(int argc, char **argv) |
| { |
| std::string rules; |
| int i = 0; |
| |
| std::string str; |
| while (std::getline(std::cin, str)) |
| { |
| if (str.empty() || str[0] == 'q' || str[0] == 'Q') |
| break; |
| str += '\n'; |
| |
| bool r = false; |
| scheme::utree result; |
| BOOST_TEST(r = parse_rhs(str, result)); |
| if (r && result.which() != scheme::utree_type::nil_type) |
| { |
| BOOST_TEST(r = parse_rule(str)); |
| if (r) |
| { |
| rules += "rule" + boost::lexical_cast<std::string>(++i) |
| + " = " + str + "\n"; |
| } |
| } |
| } |
| |
| // now test grammar rule |
| BOOST_TEST(parse_grammar(rules)); |
| |
| return boost::report_errors(); |
| } |