blob: 7a3e7043c7a9f718adf74b11c78ff267633b1772 [file] [log] [blame]
// 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();
}