Good progress on Argument

release/4.3a0
dellaert 2014-11-30 15:46:41 +01:00
parent 00c6bd2426
commit a6afe70c9c
1 changed files with 60 additions and 17 deletions

View File

@ -23,13 +23,14 @@
using namespace std; using namespace std;
using namespace wrap; using namespace wrap;
static const bool T = true;
/* ************************************************************************* */ /* ************************************************************************* */
// http://boost-spirit.com/distrib/spirit_1_8_2/libs/spirit/doc/grammar.html // http://boost-spirit.com/distrib/spirit_1_8_2/libs/spirit/doc/grammar.html
struct ArgumentGrammar: public classic::grammar<ArgumentGrammar> { struct ArgumentGrammar: public classic::grammar<ArgumentGrammar> {
wrap::Argument& result_; ///< successful parse will be placed in here wrap::Argument& result_; ///< successful parse will be placed in here
type_grammar argument_type_g; type_grammar argument_type_g;
Argument arg0;
/// Construct type grammar and specify where result is placed /// Construct type grammar and specify where result is placed
ArgumentGrammar(wrap::Argument& result) : ArgumentGrammar(wrap::Argument& result) :
@ -51,19 +52,11 @@ struct ArgumentGrammar: public classic::grammar<ArgumentGrammar> {
// NOTE: allows for pointers to all types // NOTE: allows for pointers to all types
// Slightly more permissive than before on basis/eigen type qualification // Slightly more permissive than before on basis/eigen type qualification
argument_p = // argument_p = !str_p("const")[assign_a(self.result_.is_const, T)] //
!str_p("const")
// [assign_a(self.arg.is_const, true)] //
>> self.argument_type_g // >> self.argument_type_g //
>> (!ch_p('&') >> (!ch_p('&')[assign_a(self.result_.is_ref, T)]
// [assign_a(self.arg.is_ref, true)] | !ch_p('*')[assign_a(self.result_.is_ptr, T)])
| !ch_p('*') >> basic_rules<ScannerT>::name_p[assign_a(self.result_.name)];
// [assign_a(self.arg.is_ptr, true)]
) >> basic_rules<ScannerT>::name_p
// [assign_a[self.arg.name)]
// [push_back_a(self.result_, self.arg)]
// [assign_a(self.arg, self.arg0)]
;
} }
Rule const& start() const { Rule const& start() const {
@ -80,23 +73,73 @@ TEST( Argument, grammar ) {
using classic::space_p; using classic::space_p;
// Create type grammar that will place result in actual // Create type grammar that will place result in actual
Argument actual; Argument actual, arg0;
ArgumentGrammar g(actual); ArgumentGrammar g(actual);
EXPECT(parse("const gtsam::Point2& p4", g, space_p).full); EXPECT(parse("const gtsam::Point2& p4", g, space_p).full);
EXPECT_LONGS_EQUAL(1, actual.type.namespaces.size());
EXPECT(actual.type.namespaces[0]=="gtsam");
EXPECT(actual.type.name=="Point2");
EXPECT(actual.name=="p4");
EXPECT(actual.is_const);
EXPECT(actual.is_ref);
EXPECT(!actual.is_ptr);
actual = arg0;
EXPECT(parse("Point2 p", g, space_p).full); EXPECT(parse("Point2 p", g, space_p).full);
EXPECT(actual.type.namespaces.empty());
EXPECT(actual.type.name=="Point2");
EXPECT(actual.name=="p");
EXPECT(!actual.is_const);
EXPECT(!actual.is_ref);
EXPECT(!actual.is_ptr);
actual = arg0;
EXPECT(parse("gtsam::Point2 p3", g, space_p).full); EXPECT(parse("gtsam::Point2 p3", g, space_p).full);
EXPECT_LONGS_EQUAL(1, actual.type.namespaces.size());
EXPECT(actual.type.namespaces[0]=="gtsam");
EXPECT(actual.type.name=="Point2");
EXPECT(actual.name=="p3");
EXPECT(!actual.is_const);
EXPECT(!actual.is_ref);
EXPECT(!actual.is_ptr);
actual = arg0;
EXPECT(parse("char a", g, space_p).full); EXPECT(parse("char a", g, space_p).full);
EXPECT(actual.type.namespaces.empty());
EXPECT(actual.type.name=="char");
EXPECT(actual.name=="a");
EXPECT(!actual.is_const);
EXPECT(!actual.is_ref);
EXPECT(!actual.is_ptr);
actual = arg0;
EXPECT(parse("unsigned char a", g, space_p).full); EXPECT(parse("unsigned char a", g, space_p).full);
EXPECT(actual.type.namespaces.empty());
EXPECT(actual.type.name=="unsigned char");
EXPECT(actual.name=="a");
EXPECT(!actual.is_const);
EXPECT(!actual.is_ref);
EXPECT(!actual.is_ptr);
actual = arg0;
EXPECT(parse("Vector v", g, space_p).full); EXPECT(parse("Vector v", g, space_p).full);
EXPECT(actual.type.namespaces.empty());
EXPECT(actual.type.name=="Vector");
EXPECT(actual.name=="v");
EXPECT(!actual.is_const);
EXPECT(!actual.is_ref);
EXPECT(!actual.is_ptr);
actual = arg0;
EXPECT(parse("Matrix m", g, space_p).full); EXPECT(parse("const Matrix& m", g, space_p).full);
EXPECT(actual.type.namespaces.empty());
EXPECT(actual.type.name=="Matrix");
EXPECT(actual.name=="m");
EXPECT(actual.is_const);
EXPECT(actual.is_ref);
EXPECT(!actual.is_ptr);
actual = arg0;
} }
/* ************************************************************************* */ /* ************************************************************************* */