Sophie

Sophie

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

spirit-1.5.1-2mdk.noarch.rpm

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

#include "lexer.hpp"
#include <iostream>
#include <fstream>
#include <string>

using namespace spirit;
using namespace std;

ostream& operator<<(ostream& out, wchar_t c)
{
    if (spirit::impl::isgraph_(char(c)) || spirit::impl::isspace_(char(c)))
        out << char(c);
    else
        out << '.';
    return out;
}

ostream& operator<<(ostream& out, wchar_t const* c)
{
    while (*c)
        out << char(*c++);
    return out;
}

ostream& operator<<(ostream& out, const std::basic_string<wchar_t>& c)
{
    for (std::basic_string<wchar_t>::const_iterator i = c.begin();
            i != c.end(); ++i)
    {
        if (spirit::impl::isgraph_(char(*i)) || spirit::impl::isspace_(char(*i)))
            out << char(*i);
        else
            out << '.';
    }
    return out;
}

template <typename IteratorT, typename StrT>
void test_match(lexer<IteratorT>& lexer, const StrT& str)
{
    typedef typename StrT::value_type CharT;

    int token;
    IteratorT end = &*str.end();
    IteratorT first = &*str.begin();
    IteratorT prev = first;

    cout << "testing string: " << str << endl;
    while ((token = lexer.next_token(first, end)) != -1 && first != end)
    {
        cout << "matched token #" << token << " :" <<
			  basic_string<CharT>(prev, first) << '\n';
        prev = first;
    }
    if (token == -1)
    {
        cout << "lexing failed at: " << basic_string<CharT>(first, end) << endl;
    }
    else
    {
        cout << "matched token #" << token << " :" <<
			  basic_string<CharT>(prev, first) << '\n';
    }
}

int main(int argc, char** argv)
{
    if (argc != 3)
    {
        cout << "Usage: <lex file> <lex string>" << endl;
        return 1;
    }

    lexer<> lex;
    lexer<wchar_t const *> wlex;
    string line;
    int id = 0;
    int wid = 0;
    ifstream in(argv[1]);
    if (!in)
    {
        cout << "Could not open file: " << argv[1] << endl;
        return 1;
    }

    for (getline(in, line); in.good(); getline(in, line))
    {
        if (line.size() > 0)
        {
            if (line[0] == '%') // it's a special directive
            {
                if (line == "%i") // case insensitive
                {
                    lex.set_case_insensitive(true);
                    wlex.set_case_insensitive(true);
                }
            }
            else
            {
                cout << "token #" << id << ": " << line << '\n';
                lex.register_regex(line, id++);
                wlex.register_regex(
                        std::basic_string<wchar_t>(line.begin(), line.end()),
                        wid++);
            }
        }
    }

    lex.create_dfa();
    wlex.create_dfa();

#ifdef SPIRIT_DEBUG
    lex.dump(cout);
    wlex.dump(cout);
#endif

    ifstream testfile(argv[2]);
    if (testfile)
    {
        string teststr, line;
        for (getline(testfile, line); testfile.good(); getline(testfile, line))
        {
            teststr += line;
            teststr += '\n';
        }
        test_match(lex, teststr);
        test_match(wlex,
                std::basic_string<wchar_t>(teststr.begin(), teststr.end()));
    }
    else
    {
        test_match(lex,
                std::basic_string<char>(argv[2], argv[2]+strlen(argv[2])));
        test_match(wlex,
                std::basic_string<wchar_t>(argv[2], argv[2]+strlen(argv[2])));
    }

    return 0;
}