---- Original Message ----
From: "joshwaxman"
You might want to post Spirit related questions to:
Spirit-general mailing list
Spirit-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spirit-general
Anyway... try this:
#define BOOST_SPIRIT_DEBUG
#include <iostream>
#include
using namespace boost::spirit;
using namespace std;
int
main()
{
rule <> S; // a palindrome of 'a' and 'b' chars
S =
('a' >> S >> 'a')
| ('b' >> S >> 'b')
| 'a'
| 'b'
| eps_p
;
char * str = "aabaa";
cout << parse(str, S).full;
BOOST_SPIRIT_DEBUG_RULE(S);
return 0;
}
Some notes:
1) use the built in Spirit debugger to see what's happening and to
better diagnose the problem.
2) Your grammar is inherently ambiguous. Some alternatives start
with the same 'a' or 'b'. In such cases, use Spirit's short circuiting
feature to disambiguate the grammar (i.e. move more specialized
rules higher to give it more precedence).
3) You might be interested to see a more general palindrome parser.
( Actually this grammar is prevalent, think about XML/HTML
tag processing for instance: <tag1><tag2></tag2></tag1> ).
Check out: /spirit/libs/spirit/test/closure_tests.cpp
HTH,
--
Joel de Guzman
joel at boost-consulting.com
http://www.boost-consulting.com
http://spirit.sf.net
| | Hi.
| | I just started playing with spirit and tried the
| | following code to
| | match palindromes of strings consisting of a's and b's.
| | Why won't
| | this work? (It prints 0, not 1)
| |
| | #include "boost/spirit/core.hpp"
| | #include
| |
| | using namespace boost::spirit;
| |
| | int main(int argc, char* argv[])
| | {
| | rule <> S;
| | S = ch_p('a')
| | | ch_p('b')
| | | epsilon_p
| | | ('a' >> S >> 'a')
| | | ('b' >> S >> 'b');
| |
| |
| |
| | char * str = "aabaa";
| | cout << parse(str, S).full;
| |
| |
| | return 0;
| | }