From: <net...@us...> - 2003-05-16 10:00:48
|
Update of /cvsroot/cpptool/rfta/src/rftaparser In directory sc8-pr-cvs1:/tmp/cvs-serv30593a/src/rftaparser Modified Files: DeclarationDetailsParserTest.cpp DeclarationDetailsParser.h DeclarationDetailsParser.cpp Log Message: -- bugfix for a problem that was introduced by new declarator parser -- introduced new property and node type of pure-specifier Index: DeclarationDetailsParserTest.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParserTest.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** DeclarationDetailsParserTest.cpp 13 May 2003 08:02:16 -0000 1.3 --- DeclarationDetailsParserTest.cpp 16 May 2003 10:00:43 -0000 1.4 *************** *** 141,145 **** 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;" ); /* --- 141,145 ---- 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;" ); /* Index: DeclarationDetailsParser.h =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParser.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** DeclarationDetailsParser.h 13 May 2003 08:02:16 -0000 1.6 --- DeclarationDetailsParser.h 16 May 2003 10:00:43 -0000 1.7 *************** *** 94,103 **** bool skipOverAssignmentInitializer(); ! bool createAndAddInitializerNode( const ASTNodePtr &variableDeclNode ); void addValueNode( const ASTNodePtr& variableDeclNode, int start, int end ) const; ! void addInitializerNode( const ASTNodePtr& variableDeclNode, const ASTNodeType initializerType, int initializerStartIndex ) const; --- 94,106 ---- bool skipOverAssignmentInitializer(); ! bool createAndAddInitializerNode( const ASTNodePtr &variableDeclNode, bool functionDeclarator ); void addValueNode( const ASTNodePtr& variableDeclNode, int start, int end ) const; ! void addInitializerNode( const ASTNodePtr& declaratorNode, ! const ASTNodeType initializerType, ! int initializerStartIndex ) const; ! void addFunctionSpecifierNode( const ASTNodePtr& declaratorNode, const ASTNodeType initializerType, int initializerStartIndex ) const; Index: DeclarationDetailsParser.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParser.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** DeclarationDetailsParser.cpp 13 May 2003 08:02:16 -0000 1.11 --- DeclarationDetailsParser.cpp 16 May 2003 10:00:44 -0000 1.12 *************** *** 471,475 **** } ! skipSpaces(); do { --- 471,484 ---- } ! skipSpaces(); ! // check special case "empty braces" ! if (*current_ == ')') ! { ! // it's an empty parameter list, not a declarator ! current_ = rollback; ! return false; ! } ! ! // try to parse a declarator: do { *************** *** 707,711 **** char c = *current_; if ( c == ';' || c == ',' ) ! return current_ != (start+1); else if ( c == '(' ) { --- 716,720 ---- char c = *current_; if ( c == ';' || c == ',' ) ! return current_ != start; else if ( c == '(' ) { *************** *** 883,887 **** // now go through initializers: ! if (!createAndAddInitializerNode(declaratorNode)) // error in parsing initializer return false; --- 892,896 ---- // now go through initializers: ! if (!createAndAddInitializerNode(declaratorNode,functionDeclarator)) // error in parsing initializer return false; *************** *** 894,898 **** bool ! DeclarationDetailsParser::createAndAddInitializerNode( const ASTNodePtr &declaratorNode ) { if ( !hasNext() ) --- 903,907 ---- bool ! DeclarationDetailsParser::createAndAddInitializerNode( const ASTNodePtr &declaratorNode, bool functionDeclarator ) { if ( !hasNext() ) *************** *** 906,942 **** int declaratorEndIndex; ASTNodeType initializerType; switch( *current_++ ) { ! case '=': ! initializerType = ASTNodeTypes::assignVariableInitializerExpression; ! skipSpaces(); ! initializerValueStartIndex = getCurrentIndex(); ! skipOverAssignmentInitializer(); /// @todo should check return value declaratorEndIndex = getCurrentIndex(); initializerValueEndIndex = getCurrentIndex(); break; case '(': ! initializerType = ASTNodeTypes::constructorVariableInitializerExpression; ! initializerValueStartIndex = getCurrentIndex(); ! findNextBalanced( '(', ')' ); ! declaratorEndIndex = getCurrentIndex(); ! initializerValueEndIndex = getCurrentIndex() -1; ! break; case ';': case ',': case '{': ! return true; // end of initializer default: ! -- current_; ! // unexpected character: '*current_' ! return false; } declaratorNode->setLength( declaratorEndIndex - ! declaratorNode->getStartIndex() ); ! addInitializerNode( declaratorNode, ! initializerType, ! initializerStartIndex ); ! addValueNode( declaratorNode, ! initializerValueStartIndex, ! initializerValueEndIndex ); skipSpaces(); --- 915,979 ---- int declaratorEndIndex; ASTNodeType initializerType; + int save_position = getCurrentIndex(); switch( *current_++ ) { ! case '=': ! skipSpaces(); ! if (functionDeclarator) ! { ! initializerType = ASTNodeTypes::pureSpecifier; ! initializerValueStartIndex = save_position-1; ! } ! else ! { ! initializerType = ASTNodeTypes::assignVariableInitializerExpression; ! initializerValueStartIndex = getCurrentIndex(); ! } ! if (!skipOverAssignmentInitializer()) ! { ! // this is not a correctly parsed initialization ! return false; ! } declaratorEndIndex = getCurrentIndex(); initializerValueEndIndex = getCurrentIndex(); break; case '(': ! if (functionDeclarator) ! { ! // for a function declarator this is not possible ! return false; ! } ! initializerType = ASTNodeTypes::constructorVariableInitializerExpression; ! initializerValueStartIndex = getCurrentIndex(); ! findNextBalanced( '(', ')' ); ! declaratorEndIndex = getCurrentIndex(); ! initializerValueEndIndex = getCurrentIndex() -1; ! break; case ';': case ',': case '{': ! return true; // end of initializer default: ! -- current_; ! // unexpected character: '*current_' ! return false; } declaratorNode->setLength( declaratorEndIndex - ! declaratorNode->getStartIndex() ); ! ! if (functionDeclarator) ! { ! addFunctionSpecifierNode( declaratorNode, ! initializerType, ! initializerStartIndex ); ! } else ! { ! addInitializerNode( declaratorNode, ! initializerType, ! initializerStartIndex ); ! ! addValueNode( declaratorNode, ! initializerValueStartIndex, ! initializerValueEndIndex ); ! } skipSpaces(); *************** *** 981,984 **** --- 1018,1036 ---- declaratorNode->setPropertyNode( ASTNodeProperties::variableInitializerProperty, initializerNode ); + } + + void + DeclarationDetailsParser::addFunctionSpecifierNode( const ASTNodePtr& declaratorNode, + const ASTNodeType initializerType, + int initializerStartIndex) const + { + int initializerLength = getCurrentIndex() - initializerStartIndex; + + ASTNodePtr specifierNode = createASTNode( initializerType, + declaratorNode, + initializerStartIndex, + initializerLength ); + declaratorNode->setPropertyNode( ASTNodeProperties::functionDeclaratorSpecifier, + specifierNode ); } |