• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2003 Sam Nabialek
3     Copyright (c) 2003-2004 Joel de Guzman
4     http://spirit.sourceforge.net/
5 
6     Use, modification and distribution is subject to the Boost Software
7     License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8     http://www.boost.org/LICENSE_1_0.txt)
9 =============================================================================*/
10 #include <iostream>
11 
12 #define BOOST_SPIRIT_DEBUG
13 
14 #include <boost/spirit/include/classic_core.hpp>
15 #include <boost/spirit/include/classic_error_handling.hpp>
16 #include <boost/spirit/include/classic_iterator.hpp>
17 #include <boost/spirit/include/classic_symbols.hpp>
18 #include <boost/spirit/include/classic_utility.hpp>
19 
20 using namespace BOOST_SPIRIT_CLASSIC_NS;
21 
22 template <typename Rule>
23 struct SetRest
24 {
SetRestSetRest25     SetRest(Rule& the_rule)
26     : m_the_rule(the_rule)
27     {
28     }
29 
operator ()SetRest30     void operator()(Rule* new_rule) const
31     {
32         m_the_rule = *new_rule;
33     }
34 
35 private:
36 
37     Rule& m_the_rule;
38 };
39 
40 
41 struct nabialek_trick : public grammar<nabialek_trick>
42 {
43     template <typename ScannerT>
44     struct definition
45     {
46         typedef rule<ScannerT> rule_t;
47 
48         rule_t name;
49         rule_t line;
50         rule_t rest;
51         rule_t main;
52         rule_t one;
53         rule_t two;
54 
55         symbols<rule_t*> continuations;
56 
definitionnabialek_trick::definition57         definition(nabialek_trick const& self)
58         {
59             name = lexeme_d[repeat_p(1,20)[alnum_p | '_']];
60 
61             one = name;
62             two = name >> ',' >> name;
63 
64             continuations.add
65                 ("one", &one)
66                 ("two", &two)
67                 ;
68 
69             line = continuations[SetRest<rule_t>(rest)] >> rest;
70             main = *line;
71 
72             BOOST_SPIRIT_DEBUG_RULE(name);
73             BOOST_SPIRIT_DEBUG_RULE(line);
74             BOOST_SPIRIT_DEBUG_RULE(rest);
75             BOOST_SPIRIT_DEBUG_RULE(main);
76             BOOST_SPIRIT_DEBUG_RULE(one);
77             BOOST_SPIRIT_DEBUG_RULE(two);
78         }
79 
80         rule_t const&
startnabialek_trick::definition81         start() const
82         {
83             return main;
84         }
85     };
86 };
87 
88 int
main()89 main()
90 {
91     nabialek_trick g;
92     parse("one only\none again\ntwo first,second", g, space_p);
93     return 0;
94 }
95