88 lines
2.5 KiB
C++
88 lines
2.5 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2004 Martin Wille
|
|
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)
|
|
=============================================================================*/
|
|
#include <boost/spirit/include/classic_core.hpp>
|
|
#include <boost/spirit/include/classic_dynamic.hpp>
|
|
#include <boost/spirit/include/classic_ast.hpp>
|
|
#include <iostream>
|
|
#include <boost/detail/lightweight_test.hpp>
|
|
|
|
using namespace BOOST_SPIRIT_CLASSIC_NS;
|
|
int the_var_to_be_tested = 0;
|
|
|
|
namespace local
|
|
{
|
|
template <typename T>
|
|
struct var_wrapper : public ::boost::reference_wrapper<T>
|
|
{
|
|
typedef ::boost::reference_wrapper<T> parent;
|
|
|
|
explicit inline var_wrapper(T& t) : parent(t) {}
|
|
|
|
inline T& operator()() const { return parent::get(); }
|
|
};
|
|
|
|
template <typename T>
|
|
inline var_wrapper<T>
|
|
var(T& t)
|
|
{
|
|
return var_wrapper<T>(t);
|
|
}
|
|
}
|
|
|
|
struct test_grammar : public grammar <test_grammar>
|
|
{
|
|
template <typename ScannerT>
|
|
|
|
struct definition
|
|
{
|
|
rule <ScannerT, parser_tag <0> > test;
|
|
|
|
definition(const test_grammar& /*self*/)
|
|
{
|
|
test
|
|
= if_p(local::var(the_var_to_be_tested))
|
|
[
|
|
real_p
|
|
];
|
|
|
|
}
|
|
const rule <ScannerT, parser_tag<0> >& start() const {return test;}
|
|
};
|
|
};
|
|
|
|
int main()
|
|
{
|
|
test_grammar gram;
|
|
tree_parse_info <const char*> result;
|
|
|
|
//predictably fails
|
|
the_var_to_be_tested = 0;
|
|
result = ast_parse("1.50", gram, space_p);
|
|
std::cout << "Testing if_p against: " << the_var_to_be_tested << std::endl;
|
|
std::cout << "success: " << result.full << std::endl;
|
|
BOOST_TEST(!result.full);
|
|
|
|
//predicatably succeeds
|
|
the_var_to_be_tested = 1;
|
|
result = ast_parse("1.50", gram, space_p);
|
|
std::cout << "Testing if_p against: " << the_var_to_be_tested << std::endl;
|
|
std::cout << "success: " << result.full << std::endl;
|
|
BOOST_TEST(result.full);
|
|
|
|
//should succeed
|
|
the_var_to_be_tested = 2;
|
|
result = ast_parse("1.50", gram, space_p);
|
|
std::cout << "Testing if_p against: " << the_var_to_be_tested << std::endl;
|
|
std::cout << "success: " << result.full << std::endl;
|
|
BOOST_TEST(result.full);
|
|
|
|
return boost::report_errors();
|
|
}
|
|
|