Boost logo

Boost Users :

From: Stephen Henry (Stephen.Henry_at_[hidden])
Date: 2005-08-23 07:27:55


Hi all,

I am having a problem with the following snippet of code. What I want to
do is parse a line of alpha numeric characters from a file_iterator and
then use the read characters to construct a new object which takes a
std::string and integer argument for it's constructor. To do this I am
using the statement below:

p >> (+alpha_p)[ create_dfa( self.m_dfa, construct_<DFA>(
construct_<std::string>( arg1 ), var(500) ) ) ];

This is the code I've got:

#include <vector>
#include <iostream>

#include <boost/spirit/core.hpp>
#include <boost/spirit/iterator/file_iterator.hpp>
#include <boost/spirit/attribute.hpp>
#include <boost/spirit/utility/confix.hpp>
#include <boost/spirit/actor.hpp>
#include <boost/spirit/phoenix.hpp>

using namespace boost::spirit;
using namespace phoenix;

struct DFA
{
        DFA( std::string s, int i )
                : m_name(s), m_i(i) {}

        std::string m_name;

        int m_i;
};

struct create_dfa_impl
{
        template<typename Container, typename Item>
        struct result
        {
                typedef void type;
        };
        template<typename Container, typename Item>
        void operator()( Container& c, Item const& item ) const
        {
                c.push_back( item );
        }
};
function<create_dfa_impl> const create_dfa = create_dfa_impl();

struct Script_parser : public grammar<Script_parser>
{
        Script_parser( std::vector<DFA> &dfa )
                : m_dfa( dfa ) {}

        template<typename ScannerT>
        struct definition
        {
                definition( Script_parser const& self )
                {
                        p = (*alpha_p)[ create_dfa( self.m_dfa,
construct_<DFA>( construct_<std::string>(arg1, arg2), 500 ) ) ];
                }
                typedef rule<ScannerT> rule_t;

                rule_t p;

                rule_t const& start() const { return p; }
        };
        std::vector<DFA> &m_dfa;
};

typedef char char_t;
typedef file_iterator<char_t> iterator_t;

int main( int argc, char *argv[] )
{
        using namespace std;

        if( argc != 2 )
        {
                cout << "Invalid arguments" << endl;
                return -1;
        }

        iterator_t first( argv[1] );
        iterator_t last = first.make_end();

        std::vector<DFA> vDFA;
        Script_parser p(vDFA);
        parser_info<iterator_t> info = parse( first, last, p );

        if( info.hit )
        {
                cout << "Parsing successfull" << endl;
        }
}

This doesn't even compile, and I have absolutely no idea why. All the
compiler shows is pages and pages of garbage that means absolutely
nothing. Please help!

Stephen


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net