Succuessfully parse * at cost of also parsing *&

release/4.3a0
dellaert 2014-11-30 15:51:14 +01:00
parent a6afe70c9c
commit 8a54e19811
1 changed files with 7 additions and 6 deletions

View File

@ -52,10 +52,11 @@ struct ArgumentGrammar: public classic::grammar<ArgumentGrammar> {
// NOTE: allows for pointers to all types
// Slightly more permissive than before on basis/eigen type qualification
// Also, currently parses Point2*&, can't make it work otherwise :-(
argument_p = !str_p("const")[assign_a(self.result_.is_const, T)] //
>> self.argument_type_g //
>> (!ch_p('&')[assign_a(self.result_.is_ref, T)]
| !ch_p('*')[assign_a(self.result_.is_ptr, T)])
>> !ch_p('*')[assign_a(self.result_.is_ptr, T)]
>> !ch_p('&')[assign_a(self.result_.is_ref, T)]
>> basic_rules<ScannerT>::name_p[assign_a(self.result_.name)];
}
@ -86,23 +87,23 @@ TEST( Argument, grammar ) {
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_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);
EXPECT(actual.is_ptr);
actual = arg0;
EXPECT(parse("char a", g, space_p).full);