|
From: <net...@us...> - 2003-05-13 06:44:36
|
Update of /cvsroot/cpptool/rfta/src/rftaparser
In directory sc8-pr-cvs1:/tmp/cvs-serv10048/src/rftaparser
Modified Files:
DeclarationDetailsParserTest.h
DeclarationDetailsParserTest.cpp DeclarationDetailsParser.cpp
Log Message:
-- added some tests (examples from stroustrup's book)
-- corrected declaration parser
Index: DeclarationDetailsParserTest.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParserTest.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** DeclarationDetailsParserTest.h 10 May 2003 13:10:10 -0000 1.1
--- DeclarationDetailsParserTest.h 13 May 2003 06:44:33 -0000 1.2
***************
*** 18,22 ****
{
CPPUNIT_TEST_SUITE( DeclarationDetailsParserTest );
! CPPUNIT_TEST( testTemplateFuntionFollowedByDecl );
CPPUNIT_TEST_SUITE_END();
--- 18,23 ----
{
CPPUNIT_TEST_SUITE( DeclarationDetailsParserTest );
! CPPUNIT_TEST( testParserFail );
! CPPUNIT_TEST( testParserPass );
CPPUNIT_TEST_SUITE_END();
***************
*** 32,36 ****
void tearDown();
! void testTemplateFuntionFollowedByDecl();
private:
--- 33,38 ----
void tearDown();
! void testParserFail();
! void testParserPass();
private:
Index: DeclarationDetailsParserTest.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParserTest.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** DeclarationDetailsParserTest.cpp 10 May 2003 13:10:10 -0000 1.1
--- DeclarationDetailsParserTest.cpp 13 May 2003 06:44:33 -0000 1.2
***************
*** 18,22 ****
template<typename ParserType>
! void checkParserFail( const std::string &source,
const CppUnit::SourceLine &sourceLine,
Refactoring::Testing::Identity<ParserType> )
--- 18,22 ----
template<typename ParserType>
! void checkDetailsParserFail( const std::string &source,
const CppUnit::SourceLine &sourceLine,
Refactoring::Testing::Identity<ParserType> )
***************
*** 51,56 ****
}
! #define ASSERT_PARSER_FAIL( ParserType, source )\
! Refactoring::checkParserFail<ParserType>( source, \
CPPUNIT_SOURCELINE(), \
Refactoring::Testing::Identity<ParserType>() )
--- 51,95 ----
}
! template<typename ParserType>
! void checkDetailsParserPass( const std::string &source,
! const CppUnit::SourceLine &sourceLine,
! Refactoring::Testing::Identity<ParserType> )
! {
! SourceASTNodePtr sourceNode = SourceASTNode::create( source, source );
! ParseContext context( sourceNode );
!
! ASTNodePtr compound =
! ASTNode::create( ASTNodeTypes::compoundStatement,
! sourceNode,
! 0,
! source.length(),
! sourceNode );
! ASTNodePtr decl =
! ASTNode::create( ASTNodeTypes::declarationOrExpression,
! compound,
! 0,
! source.length(),
! sourceNode );
! context.addNode( decl );
!
! ParserType parser( context,
! decl,
! sourceNode
! );
!
! CppUnit::Message message( "parsing did not pass",
! std::string( "using parser: " ) +
! typeid(ParserType).name(),
! "Source:\n" + source );
! CppUnit::Asserter::failIf( !parser.tryParse(), message, sourceLine );
! }
!
! #define ASSERT_DETAILS_PARSER_FAIL( ParserType, source )\
! Refactoring::checkDetailsParserFail<ParserType>( source, \
! CPPUNIT_SOURCELINE(), \
! Refactoring::Testing::Identity<ParserType>() )
!
! #define ASSERT_DETAILS_PARSER_PASS( ParserType, source )\
! Refactoring::checkDetailsParserPass<ParserType>( source, \
CPPUNIT_SOURCELINE(), \
Refactoring::Testing::Identity<ParserType>() )
***************
*** 79,89 ****
void
! DeclarationDetailsParserTest::testTemplateFuntionFollowedByDecl()
{
! ASSERT_PARSER_FAIL( DeclarationDetailsParser, "call_fct(10);" );
! ASSERT_PARSER_FAIL( DeclarationDetailsParser, "sizeof SomeType;" );
! ASSERT_PARSER_FAIL( DeclarationDetailsParser, "new SomeObject;" );
! ASSERT_PARSER_FAIL( DeclarationDetailsParser, "x = x + 3;" );
! ASSERT_PARSER_FAIL( DeclarationDetailsParser, "name.id = name.length() > 10 ? 1 : 2;" );
}
--- 118,149 ----
void
! DeclarationDetailsParserTest::testParserFail()
{
! ASSERT_DETAILS_PARSER_FAIL( DeclarationDetailsParser, "call_fct(10);" );
! ASSERT_DETAILS_PARSER_FAIL( DeclarationDetailsParser, "sizeof SomeType;" );
! ASSERT_DETAILS_PARSER_FAIL( DeclarationDetailsParser, "new SomeObject;" );
! ASSERT_DETAILS_PARSER_FAIL( DeclarationDetailsParser, "x = x + 3;" );
! ASSERT_DETAILS_PARSER_FAIL( DeclarationDetailsParser, "name.id = name.length() > 10 ? 1 : 2;" );
! /* from the c++ 'bible' */
! ASSERT_DETAILS_PARSER_FAIL( DeclarationDetailsParser, "T(a)->m;" );
! ASSERT_DETAILS_PARSER_FAIL( DeclarationDetailsParser, "T(a)++;" );
! }
!
! void
! DeclarationDetailsParserTest::testParserPass()
! {
! /* from the c++ 'bible' */
! ASSERT_DETAILS_PARSER_PASS( DeclarationDetailsParser, "T(*e)(int(3));" );
! ASSERT_DETAILS_PARSER_PASS( DeclarationDetailsParser, "T(f)[4];" );
! //ASSERT_DETAILS_PARSER_PASS( DeclarationDetailsParser, "T(a);" );
! ASSERT_DETAILS_PARSER_PASS( DeclarationDetailsParser, "myint (*f)(int) const;" );
! //ASSERT_DETAILS_PARSER_PASS( DeclarationDetailsParser, "T(a)=4;" );
! ASSERT_DETAILS_PARSER_PASS( DeclarationDetailsParser, "T(*b)();" );
! //ASSERT_DETAILS_PARSER_PASS( DeclarationDetailsParser, "T(x),y,z=7;" );
!
! /*
! all of these could be statements, but the standard says, if a
! 'declaration' fits, interprete it as declaration
! */
}
Index: DeclarationDetailsParser.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParser.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** DeclarationDetailsParser.cpp 10 May 2003 13:10:10 -0000 1.9
--- DeclarationDetailsParser.cpp 13 May 2003 06:44:33 -0000 1.10
***************
*** 416,424 ****
// check for a special case where the declarator starts with a '('
! // example: "int (*(*f))(int) const;"
if (tryNextIs('(')) // might be the declarator (e.g. "usertype (*f);" or a parameter (e.g. "int userfct()";
{
findNextBalanced('(',')');
}
// check the characters follow the braces:
--- 416,427 ----
// check for a special case where the declarator starts with a '('
! // example: "mytype (*(*f))(int) const;"
! // or : "mytype (*f)[4];
+ bool maybeBracedDeclarator = false;
if (tryNextIs('(')) // might be the declarator (e.g. "usertype (*f);" or a parameter (e.g. "int userfct()";
{
findNextBalanced('(',')');
+ maybeBracedDeclarator = true;
}
// check the characters follow the braces:
***************
*** 436,441 ****
std::string seperators=",;=[";
! bool ret = seperators.find(*current_) == std::string::npos;
current_ = rollback;
return ret;
--- 439,448 ----
std::string seperators=",;=[";
! // if braces did occure after the 'identifier' only the following symbols garantee
! // a userdefined type (example: "mytype (...)[4]" versus "myfct(...);")
! if (maybeBracedDeclarator)
! seperators=",;=";
+ bool ret = seperators.find(*current_) == std::string::npos;
current_ = rollback;
return ret;
***************
*** 609,618 ****
} else
{
! findNextBalanced('(',')');
! readUntilNextOf(";,=(");
if (tryNextIs('('))
{
functionDeclarator = true;
findNextBalanced('(',')');
}
}
--- 616,629 ----
} else
{
! findNextBalanced('(',')');
! skipSpaces();
if (tryNextIs('('))
{
functionDeclarator = true;
findNextBalanced('(',')');
+ }
+ if (tryNextIs('['))
+ {
+ findNextBalanced('[',']');
}
}
|