/*============================================================================= Copyright (c) 2001-2011 Joel de Guzman 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "test.hpp" int main() { using spirit_test::test_attr; using spirit_test::test; using namespace boost::spirit::ascii; using namespace boost::spirit::qi::labels; using boost::spirit::qi::locals; using boost::spirit::qi::rule; using boost::spirit::qi::int_; using boost::spirit::qi::uint_; using boost::spirit::qi::fail; using boost::spirit::qi::on_error; using boost::spirit::qi::debug; using boost::spirit::qi::lit; namespace phx = boost::phoenix; { // synth attribute value-init std::string s; rule r; r = alpha[_val += _1]; BOOST_TEST(test_attr("abcdef", +r, s)); BOOST_TEST(s == "abcdef"); } { // auto rules aliasing tests char ch = '\0'; rule a, b; a %= b; b %= alpha; BOOST_TEST(test("x", a[phx::ref(ch) = _1])); BOOST_TEST(ch == 'x'); ch = '\0'; BOOST_TEST(test_attr("z", a, ch)); // attribute is given. BOOST_TEST(ch == 'z'); a = b; // test deduced auto rule behavior b = alpha; ch = '\0'; BOOST_TEST(test("x", a[phx::ref(ch) = _1])); BOOST_TEST(ch == 'x'); ch = '\0'; BOOST_TEST(test_attr("z", a, ch)); // attribute is given. BOOST_TEST(ch == 'z'); } { // context (w/arg) tests char ch; rule a; // 1 arg a = alpha[_val = _1 + _r1]; BOOST_TEST(test("x", a(phx::val(1))[phx::ref(ch) = _1])); BOOST_TEST(ch == 'x' + 1); BOOST_TEST(test_attr("a", a(1), ch)); // allow scalars as rule args too. BOOST_TEST(ch == 'a' + 1); rule b; // 2 args b = alpha[_val = _1 + _r1 + _r2]; BOOST_TEST(test_attr("a", b(1, 2), ch)); BOOST_TEST(ch == 'a' + 1 + 2); } { // context (w/ reference arg) tests char ch; rule a; // 1 arg (reference) a = alpha[_r1 = _1]; BOOST_TEST(test("x", a(phx::ref(ch)))); BOOST_TEST(ch == 'x'); } { // context (w/locals) tests rule > a; // 1 local a = alpha[_a = _1] >> char_(_a); BOOST_TEST(test("aa", a)); BOOST_TEST(!test("ax", a)); } { // context (w/args and locals) tests rule > a; // 1 arg + 1 local a = alpha[_a = _1 + _r1] >> char_(_a); BOOST_TEST(test("ab", a(phx::val(1)))); BOOST_TEST(test("xy", a(phx::val(1)))); BOOST_TEST(!test("ax", a(phx::val(1)))); } { // void() has unused type (void == unused_type) std::pair attr; rule r; r = char_; BOOST_TEST(test_attr("123ax", int_ >> char_ >> r, attr)); BOOST_TEST(attr.first == 123); BOOST_TEST(attr.second == 'a'); } { // bug: test that injected attributes are ok rule r; // problem code: r = char_(_r1)[_val = _1]; } return boost::report_errors(); }