|
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 );
}
|