Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > b9ba69a436161613d8fb030c8c726a8e > files > 670

spirit-1.5.1-2mdk.noarch.rpm

#if defined (__BORLANDC__)
#define _RWSTD_COMPILE_INSTANTIATE // Borland Workaround
#endif

#include <iostream>
#include <cassert>
#include <string>

using namespace std;

//#define SPIRIT_DEBUG
#include "boost/spirit/core.hpp"
#include "boost/ref.hpp"
using namespace spirit;

///////////////////////////////////////////////////////////////////////////////
//
//  Actions tests
//
///////////////////////////////////////////////////////////////////////////////
std::string s1;
std::string s2;

void a1(char ch)
{
    s1 += ch;
}

void a2(char const* first, char const* last)
{
    s2 = std::string(first, last);
}

void
actions_tests()
{
    {
        char const* cp = "abcdefghihklmnop";
        char const* cp_first = cp;
        char const* cp_last = cp + strlen(cp);

        scanner<char const*> scan(cp_first, cp_last);
        match<> hit;

        hit = (+alpha_p[&a1])[&a2].parse(scan);
        assert(hit);
        assert(scan.first == scan.last);
        assert(s1 == cp);
        assert(s1 == s2);
        scan.first = cp;

        std::string s3;
        std::string s4;

        hit = (+alpha_p[append(s4)])[assign(s3)].parse(scan);
        assert(hit);
        assert(scan.first == scan.last);
        assert(s3 == s2);
        assert(s3 == s4);
    }

    using boost::ref;

    {
        char ch;
        char const* cp = "jj";
        char const* cp_first = cp;
        char const* cp_last = cp + strlen(cp);
        scanner<char const*> scan(cp_first, cp_last);

        match<> hit = (anychar_p[assign(ch)] >> ch_p(ref(ch))).parse(scan);
        assert(hit);
        assert(scan.first == scan.last);
    }

    {
        char const* cp = "abrakadabra";
        char const* cp_first = cp;
        char const* cp_last = cp + strlen(cp);
        scanner<char const*> scan(cp_first, cp_last);

        match<> hit = (str_p(ref(cp_first), ref(cp_last))).parse(scan);
        assert(hit);
        assert(scan.first == scan.last);
    }

    {
        char a_ = 'a';
        char j_ = 'j';
        char const* cp = "abcdefghijklmn";
        char const* cp_first = cp;
        char const* cp_last = cp + strlen(cp);
        scanner<char const*> scan(cp_first, cp_last);

        match<> hit = (+range_p(ref(a_), ref(j_))).parse(scan);
        assert(hit);
        assert(string(scan.first) == "klmn");
    }
}

///////////////////////////////////////////////////////////////////////////////
//
//  Main
//
///////////////////////////////////////////////////////////////////////////////
int
main()
{
    actions_tests();
    cout << "Tests concluded successfully\n";
    return 0;
}