Boost logo

Boost Users :

Subject: Re: [Boost-users] [spirit2] Trivial parser crashes
From: sm4 (sunnyim4_at_[hidden])
Date: 2008-09-24 11:19:19


Oops - seems formatting got in the way.

Hope this is better:

-----------------------------------------------------------------------------------------
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

#include <iostream>
#include <string>

using namespace boost::spirit;
using namespace boost::spirit::qi;
using namespace boost::spirit::ascii;
using namespace boost::spirit::arg_names;

namespace phoenix = boost::phoenix;

using phoenix::at_c;

struct key_val
{
    std::string key;
    std::string value;
};

BOOST_FUSION_ADAPT_STRUCT(
    key_val,
    (std::string, key)
    (std::string, value)
)

template <typename Iterator>
struct my_grammar : grammar<Iterator, key_val(), space_type>
{
    my_grammar() : my_grammar::base_type(start)
    {
        quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
        key %= quoted_string;
        value %= quoted_string;

        start =
                key [at_c<0>(_val) = _1]
>> ':'
>> value [at_c<1>(_val) = _1]
             ;
    }

    rule<Iterator, std::string(), space_type> key;
    rule<Iterator, std::string(), space_type> quoted_string;
    rule<Iterator, std::string(), space_type> value;

    rule<Iterator, key_val(), space_type> start;

};

int main()
{
    typedef std::string::const_iterator citerator;
    std::string str = "\"x\": \"25\" ";

    citerator iter = str.begin();
    citerator end = str.end();

    my_grammar<citerator> my_parser;
    key_val kv;
    phrase_parse(iter, end, my_parser, kv, space); // ASSERTs

    return 0;
}

-----------------------------------------------------------------------------------------

Joel de Guzman-2 wrote:
>
> sm4 wrote:
>> Hello, Playing with spirit-2 (boost 1.36 release) I got the following
>> code to ASSERT when compiled on Visual Studio 2008/SP1. Any ideas what's
>> wrong? ----------------------------------------------------------
>> #include #include #include #include #include #include #include #include
>> #include using namespace boost::spirit; using namespace
>> boost::spirit::qi; using namespace boost::spirit::ascii; using namespace
>> boost::spirit::arg_names; namespace phoenix = boost::phoenix; using
>> phoenix::at_c; struct key_val { std::string key; std::string value; };
>> BOOST_FUSION_ADAPT_STRUCT( key_val, (std::string, key) (std::string,
>> value) ) template struct my_grammar : grammar { my_grammar() :
>> my_grammar::base_type(start) { quoted_string %= lexeme['"' >> +(char_ -
>> '"') >> '"']; key %= quoted_string; value %= quoted_string; start = key
>> [at_c<0>(_val) = _1] >> ':' >> value [at_c<1>(_val) = _1] ; } rule key;
>> rule quoted_string; rule value; rule start; }; int main() { typedef
>> std::string::const_iterator citerator; std::string str = "\"x\": \"25\"
>> "; citerator iter = str.begin(); citerator end = str.end(); my_grammar
>> my_parser; key_val kv; phrase_parse(iter, end, my_parser, kv, space); //
>> ASSERTs return 0; }
>
> Wow, care to repost that code?
>
> Regards,
> --
> Joel de Guzman
> http://www.boostpro.com
> http://spirit.sf.net
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
>

-- 
View this message in context: http://www.nabble.com/-spirit2--Trivial-parser-crashes-tp19624910p19651253.html
Sent from the Boost - Users mailing list archive at Nabble.com.

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