spirit/classic/example/techniques/dynamic_rule.cpp
2017-11-21 19:49:36 +03:00

59 lines
1.8 KiB
C++

/*=============================================================================
Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
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)
=============================================================================*/
///////////////////////////////////////////////////////////////////////////////
// This example shows how the assign operator can be used to modify
// rules with semantic actions
//
// First we show the basic spirit without (without any dynamic feature),
// then we show how to use assign_a to make it dynamic,
//
// the grammar has to parse abcabc... sequences
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
#define BOOST_SPIRIT_DEBUG
#include <boost/spirit.hpp>
#include <boost/spirit/include/classic_assign_actor.hpp>
int main()
{
using namespace BOOST_SPIRIT_CLASSIC_NS;
using namespace std;
rule<> a,b,c,next;
const char* str="abcabc";
parse_info<> hit;
BOOST_SPIRIT_DEBUG_NODE(next);
BOOST_SPIRIT_DEBUG_NODE(a);
BOOST_SPIRIT_DEBUG_NODE(b);
BOOST_SPIRIT_DEBUG_NODE(c);
// basic spirit gram
a = ch_p('a') >> !b;
b = ch_p('b') >> !c;
c = ch_p('c') >> !a;
hit = parse(str, a);
cout<<"hit :"<<( hit.hit ? "yes" : "no")<<", "
<<(hit.full ? "full": "not full")
<<endl;
// using assign_a
a = ch_p('a')[ assign_a( next, b)] >> !next;
b = ch_p('b')[ assign_a( next, c)] >> !next;
c = ch_p('c')[ assign_a( next, a)] >> !next;
hit = parse(str, a);
cout<<"hit :"<<( hit.hit ? "yes" : "no")<<", "
<<(hit.full ? "full": "not full")
<<endl;
return 0;
}