diff --git a/wrap/Qualified.h b/wrap/Qualified.h index b23e9020d..743b99b48 100644 --- a/wrap/Qualified.h +++ b/wrap/Qualified.h @@ -75,3 +75,67 @@ struct Qualified { } // \namespace wrap +#include +#include +#include +#include + +namespace classic = BOOST_SPIRIT_CLASSIC_NS; + +// http://boost-spirit.com/distrib/spirit_1_8_2/libs/spirit/doc/grammar.html +struct type_grammar: public classic::grammar { + + wrap::Qualified& result_; ///< successful parse will be placed in here + + /// Construct type grammar and specify where result is placed + type_grammar(wrap::Qualified& result) : + result_(result) { + } + +/// Definition of type grammar + template + struct definition { + + typedef classic::rule Rule; + + Rule void_p, basisType_p, eigenType_p, keywords_p, stlType_p, className_p, + namepsace_p, namespace_del_p, class_p, type_p; + + definition(type_grammar const& self) { + + using namespace classic; + + void_p = str_p("void")[assign_a(self.result_.name)]; + + basisType_p = (str_p("string") | "bool" | "size_t" | "int" | "double" + | "char" | "unsigned char")[assign_a(self.result_.name)]; + + eigenType_p = (str_p("Vector") | "Matrix")[assign_a(self.result_.name)]; + + keywords_p = (str_p("const") | "static" | "namespace" | "void" + | basisType_p); + + stlType_p = (str_p("vector") | "list"); + + className_p = (lexeme_d[upper_p >> *(alnum_p | '_')] - eigenType_p + - keywords_p) | stlType_p; + + namepsace_p = lexeme_d[lower_p >> *(alnum_p | '_')] - keywords_p; + + namespace_del_p = namepsace_p[push_back_a(self.result_.namespaces)] + >> str_p("::"); + + class_p = *namespace_del_p >> className_p[assign_a(self.result_.name)]; + + type_p = eps_p[clear_a(self.result_)] // + >> void_p | basisType_p | eigenType_p | class_p; + } + + Rule const& start() const { + return type_p; + } + + }; +}; + + diff --git a/wrap/tests/testType.cpp b/wrap/tests/testType.cpp index 7b3c8665d..9044f6aa2 100644 --- a/wrap/tests/testType.cpp +++ b/wrap/tests/testType.cpp @@ -17,84 +17,10 @@ **/ #include -#include - -#include -#include -#include -#include #include using namespace std; using namespace wrap; -namespace classic = BOOST_SPIRIT_CLASSIC_NS; - -typedef classic::rule Rule; - -//****************************************************************************** -// http://boost-spirit.com/distrib/spirit_1_8_2/libs/spirit/doc/grammar.html -struct type_grammar: public classic::grammar { - - Qualified& result_; ///< successful parse will be placed in here - - /// Construct type grammar and specify where result is placed - type_grammar(Qualified& result) : - result_(result) { - } - -/// Definition of type grammar - template - struct definition { - - typedef classic::rule Rule; - - Rule void_p, basisType_p, eigenType_p, keywords_p, stlType_p, className_p, - namepsace_p, namespace_del_p, class_p, type_p; - - definition(type_grammar const& self) { - - using classic::lexeme_d; - using classic::eps_p; - using classic::str_p; - using classic::upper_p; - using classic::lower_p; - using classic::alnum_p; - using classic::assign_a; - using classic::push_back_a; - using classic::clear_a; - - void_p = str_p("void")[assign_a(self.result_.name)]; - - basisType_p = (str_p("string") | "bool" | "size_t" | "int" | "double" - | "char" | "unsigned char")[assign_a(self.result_.name)]; - - eigenType_p = (str_p("Vector") | "Matrix")[assign_a(self.result_.name)]; - - keywords_p = (str_p("const") | "static" | "namespace" | "void" - | basisType_p); - - stlType_p = (str_p("vector") | "list"); - - className_p = (lexeme_d[upper_p >> *(alnum_p | '_')] - eigenType_p - - keywords_p) | stlType_p; - - namepsace_p = lexeme_d[lower_p >> *(alnum_p | '_')] - keywords_p; - - namespace_del_p = namepsace_p[push_back_a(self.result_.namespaces)] - >> str_p("::"); - - class_p = *namespace_del_p >> className_p[assign_a(self.result_.name)]; - - type_p = eps_p[clear_a(self.result_)] // - >> void_p | basisType_p | eigenType_p | class_p; - } - - Rule const& start() const { - return type_p; - } - - }; -}; //****************************************************************************** TEST( spirit, grammar ) {