On Tue, Dec 1, 2009 at 4:03 PM, Dominique Devienne wrote:
On Tue, Dec 1, 2009 at 4:42 PM, OvermindDL1 wrote:
On Tue, Dec 1, 2009 at 12:44 PM, Dominique Devienne wrote:
Would you mind sharing the grammar and parser in
http://boost-spirit.com/repository/grammars/show_contents.php perhaps,
with a Boost like license?
I did post the old version (that worked on a much older Spirit trunk,
not the current release) on the Spirit list a long while ago. I meant
to update it and give it a better interface and a karma output too
then give it to Spirit as an example, I just need to get motivated to
give the little amount of time that I have available, to it. ;-)
I'm still interested in just the Spirit 2.1 grammar for JSON if you
don't mind, to implement just an event-based SAX-like parser for JSON.
I'd happily use a full reading and writing impl, but I'd be happy with
just the grammar for now.
(*hint* poke me to get it done, random emails, that helps a ton).
Consider yourself poked ;) Thanks, --DD
Ew... I really did make this back when I was still learning Spirit, I
can make it better now for sure...
Just to show you the simple grammar for JSON parsing though, I was
trying to follow the Spec *to*the*letter*, and this is what I came up
with (which I definitely need to redesign for the modern Spirit2.1).
As stated, this is for the old trunk Spirit so it might not compile
with the current version...
struct JSON_grammar : qi::grammar
{
JSON_grammar() : JSON_grammar::base_type(ValueRule)
{
using qi::on_error;
using qi::fail;
using qi::debug;
using qi::lit;
using qi::raw;
using spirit::double_;
using namespace boost::spirit::ODL1_JSON_Char_Class;
ValueRule
=( lit("null") [spirit::_val = null_const()]
| lit("false") [spirit::_val = false_const()]
| lit("true") [spirit::_val = true_const()]
| double_ [spirit::_val = spirit::_1]
| StringRule [spirit::_val = spirit::_1]
| ArrayRule [spirit::_val = spirit::_1]
| ObjectRule [spirit::_val = spirit::_1]
);
StringRule
= char_('"') [spirit::_val = ""]
>> *(
(char_-(char_("\"\\")|cntrl)) [spirit::_val += spirit::_1]
|(lit('\\') >>
(lit('b') [spirit::_val += '\b']
|lit('f') [spirit::_val += '\f']
|lit('n') [spirit::_val += '\n']
|lit('r') [spirit::_val += '\r']
|lit('t') [spirit::_val += '\t']
| ( lit('u')
>> hex4 [spirit::_val += spirit::_1]
)
|char_ [spirit::_val += spirit::_1]
)
)
)
>> '"'
;
ArrayRule
%= '['
>> ValueRule % ','
>> ']'
;
ObjectRule
%= '{'
>> (StringRule >> ':' >> ValueRule) % ','
>> '}'
;
ValueRule.name("ValueRule");
StringRule.name("StringRule");
ArrayRule.name("ArrayRule");
ObjectRule.name("ObjectRule");
on_error<fail>
(
ValueRule
, onerror()
);
#ifdef ODL1_JSON_DEBUG
debug(ValueRule);
debug(StringRule);
debug(ArrayRule);
debug(ObjectRule);
#endif // ODL1_JSON_DEBUG
}
qi::rule ValueRule;
qi::rule StringRule;
qi::rule ArrayRule;
qi::rule ObjectRule;
qi::uint_parser hex4;
};
Yuck, that really is ugly... That should show you how it works, but
yeah, wait until I can actually redesign it. I do not have time right
this moment (keep poking me and I may have this odd hour here or
there), but should have some dedicated time late next week, just keep
on poking/emailing me.