Boost logo

Boost Users :

From: Joel de Guzman (joel_at_[hidden])
Date: 2004-12-30 11:52:11


Matthew Peltzer wrote:
> > I am trying to use Spirit to parse lines like:
>
>>name:value
>>
>>but, name might contain colons also. I've not been able to come up
>>with anything that parses this correctly without swallowing up the
>>rest of the document. Anyone able to help?
>
>
> Seeing your code would be a good first step in helping you, but I
> imagine something like the following should work as desired:
>
> +(+(alnum_p | ':') >> ':' >> +(alnum_p) >> eol_p);

I do not think that will work because plus, like the kleene, is
greedy. The second ':' will not ever see the light of day.

Try right recursion:

name = alnum_p | ':';
name_colon = name >> (name_colon | ':');
start = name_colon >> value;

When you do not want greedy iteration (kleene, plus), right
recursion is your friend. The rule name_colon is guaranteed
to end with a colon and name may have colons. Try attached code.

BTW, please post to Spirit's mailing list. It's the proper forum
for Spirit related questions:

Spirit-general mailing list
Spirit-general_at_[hidden]
https://lists.sourceforge.net/lists/listinfo/spirit-general

HTH,

-- 
Joel de Guzman
http://www.boost-consulting.com
http://spirit.sf.net

/*=============================================================================
    Copyright (c) 2002-2003 Joel de Guzman
    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/core.hpp>
#include <iostream>
#include <string>

///////////////////////////////////////////////////////////////////////////////
using namespace std;
using namespace boost::spirit;

///////////////////////////////////////////////////////////////////////////////
//
// My grammar
//
///////////////////////////////////////////////////////////////////////////////
struct my_grammar : public grammar<my_grammar>
{
    template <typename ScannerT>
    struct definition
    {
        definition(my_grammar const& self)
        {
            value = int_p;
            name = alnum_p | ':';
            name_colon = name >> (name_colon | ':');
            start_ = name_colon >> value;
        }

        rule<ScannerT> start_, name, name_colon, value;
        rule<ScannerT> const&
        start() const { return start_ ; }
    };
};

///////////////////////////////////////////////////////////////////////////////
//
// Main program
//
///////////////////////////////////////////////////////////////////////////////
int
main()
{
    cout << "/////////////////////////////////////////////////////////\n\n";
    cout << "\t\t A right recursion example...\n\n";
    cout << "/////////////////////////////////////////////////////////\n\n";
    cout << "Type anything or [q or Q] to quit\n\n";

    my_grammar g;

    string str;
    while (getline(cin, str))
    {
        if (str[0] == 'q' || str[0] == 'Q')
            break;

        if (parse(str.c_str(), g, space_p).full)
        {
            cout << "parsing succeeded\n";
        }
        else
        {
            cout << "parsing failed\n";
        }
    }

    cout << "Bye... :-) \n\n";
    return 0;
}


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