boost::spirit - why won't this palindrome code work?

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 <iostream.h> 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; }

---- Original Message ---- From: "joshwaxman" <JoshWaxman@yahoo.com> 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 <boost/spirit/core.hpp> 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 <iostream.h> | | | | 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; | | }
participants (2)
-
Joel de Guzman
-
joshwaxman