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('[',']'); } } |