/*==============================================================================
    Copyright (c) 2006 Tobias Schwinger
    http://spirit.sourceforge.net/

    Use, modification and distribution is subject to 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)
==============================================================================*/
//------------------------------------------------------------------------------
//  This example demonstrates the opaque rule parser.
//  See boost/spirit/utility/rule_parser.hpp for details.
//------------------------------------------------------------------------------
#include <iostream>

#include <boost/typeof/typeof.hpp>

#include <boost/spirit/core.hpp>
#include <boost/spirit/core/typeof.hpp>

#include <boost/spirit/utility/rule_parser.hpp>

#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()

namespace my_project { namespace my_grammar {

  using namespace boost::spirit;

  #define BOOST_SPIRIT__NAMESPACE (2,(my_project,my_grammar))

  BOOST_SPIRIT_OPAQUE_RULE_PARSER(word,
    (1,( ((char const *),str) )), 
    -,

      lexeme_d[ str >> +space_p ]
  )

  BOOST_SPIRIT_OPAQUE_RULE_PARSER(main,
    -,-,

    *( word("dup") | word("swap") | word("drop") | word("rot") | word("tuck") )
  )

  #undef BOOST_SPIRIT__NAMESPACE

} } // namespace my_project::my_grammar



int main()
{
  std::string str;
  while (std::getline(std::cin, str))
  {
    if (str.empty())
      break;

    str += '\n';

    if (boost::spirit::parse(str.c_str(), my_project::my_grammar::main).full)
      std::cout << "\nOK." << std::endl;
    else
      std::cout << "\nERROR." << std::endl;
  }
  return 0;
}


