|
From: <net...@us...> - 2003-09-25 02:47:24
|
Update of /cvsroot/cpptool/rfta/src/rftaparser
In directory sc8-pr-cvs1:/tmp/cvs-serv19088/rftaparser
Modified Files:
DeclarationDetailsParser.h DeclarationDetailsParser.cpp
Log Message:
-- corrections for parsing composite types
Index: DeclarationDetailsParser.h
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParser.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** DeclarationDetailsParser.h 6 Sep 2003 21:43:43 -0000 1.8
--- DeclarationDetailsParser.h 24 Sep 2003 20:39:27 -0000 1.9
***************
*** 53,69 ****
const ASTNodePtr &specifierList );
! void addAnonymousClassNodeAndReadBody( int specifierStart,
const ASTNodePtr &specifierList,
const std::string &specifierIdent );
! void addNamedClassNodeAndReadBody( int specifierStart,
! int nameIdentStart,
! const ASTNodePtr &specifierList,
! const std::string &specifierIdent );
!
! void addNestedNameClassNodeAndReadBody( int specifierStart,
! const ASTNodePtr &specifierList,
! const std::string &specifierIdent,
! const std::string &baseName );
--- 53,69 ----
const ASTNodePtr &specifierList );
! void addAnonymousCompositeTypeAndReadBody( int specifierStart,
! const ASTNodePtr &specifierList,
! const std::string &specifierIdent );
!
! void addNamedCompositeTypeAndReadBody( int specifierStart,
! int nameIdentStart,
const ASTNodePtr &specifierList,
const std::string &specifierIdent );
! void addNestedNameClassNode( int specifierStart,
! const ASTNodePtr &specifierList,
! const std::string &specifierIdent,
! const std::string &baseName );
Index: DeclarationDetailsParser.cpp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rftaparser/DeclarationDetailsParser.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** DeclarationDetailsParser.cpp 6 Sep 2003 21:43:43 -0000 1.13
--- DeclarationDetailsParser.cpp 24 Sep 2003 20:39:27 -0000 1.14
***************
*** 228,232 ****
{
if (!tryNextIs(':'))
! throwFailure( "A class name can not start with a single ':'. Expected a double colon => '::'." );
readElaboratedTypeName( specifierStart, specifierList );
--- 228,232 ----
{
if (!tryNextIs(':'))
! throwFailure( "Expected an identifier. Can not start with a single colon. Expected a double colon => '::'." );
readElaboratedTypeName( specifierStart, specifierList );
***************
*** 249,256 ****
Xtl::CStringView thirdIdent; // in the case of export macro: class RFTA_API SourceRange {};
if ( tryReadNextIdentifier( thirdIdent ) )
{
skipSpaces();
! secondIdent = thirdIdent; // @todo ignore export macro for now, will need to store it.
}
--- 249,292 ----
Xtl::CStringView thirdIdent; // in the case of export macro: class RFTA_API SourceRange {};
+ const char* sav_cur = current_;
+
if ( tryReadNextIdentifier( thirdIdent ) )
{
skipSpaces();
! if (tryNextIs('{'))
! {
! current_--;
! secondIdent = thirdIdent; // @todo ignore export macro for now, will need to store it.
! } else if (tryNextIs(';'))
! {
! // is not a type-use with variable "e.g. class WINAPI X;"
! current_--;
! } else
! {
! // restore current pointer since third identifier is a variable e.g. "enum X y;"
! current_ = sav_cur;
! backtrackSkippingSpaces();
!
! // add the specifier node
! ASTNodePtr specifier =
! createASTNode(
! ASTNodeTypes::elaboratedTypeSpecifier,
! specifierList,
! specifierStart,
! getCurrentIndex()-specifierStart
! );
! specifierList->addChild(specifier);
!
! ASTNodePtr nameNode =
! createASTNode(
! ASTNodeTypes::localScopeIdentifier,
! specifier,
! nameIdentStart,secondIdent.getLength());
! specifier->setPropertyNode( ASTNodeProperties::compositeNameProperty , nameNode );
!
! // set real length after completed parsing
! specifier->setLength(getCurrentIndex()-specifierStart);
! return;
! }
}
***************
*** 258,269 ****
if ( secondIdent.isEmpty() )
{
! addAnonymousClassNodeAndReadBody( specifierStart, specifierList, specifierIdent );
return;
}
! // check only a single colon follows (which means inheritance information e.g. "class x: public y ")
if (!tryReadNext("::"))
{
! addNamedClassNodeAndReadBody( specifierStart, nameIdentStart, specifierList, specifierIdent );
return;
}
--- 294,305 ----
if ( secondIdent.isEmpty() )
{
! addAnonymousCompositeTypeAndReadBody( specifierStart, specifierList, specifierIdent );
return;
}
! // check if no composite type start
if (!tryReadNext("::"))
{
! addNamedCompositeTypeAndReadBody( specifierStart, nameIdentStart, specifierList, specifierIdent );
return;
}
***************
*** 271,284 ****
// HERE we come only in case of a double colon after the identifier which means:
// an elaborated type is specified: e.g. "class x::y"
! addNestedNameClassNodeAndReadBody( specifierStart, specifierList, specifierIdent, secondIdent.str() );
}
void
! DeclarationDetailsParser::addNestedNameClassNodeAndReadBody( int specifierStart,
const ASTNodePtr &specifierList,
const std::string &specifierIdent,
const std::string &baseName )
{
std::string secondIdent = baseName;
skipSpaces();
--- 307,321 ----
// HERE we come only in case of a double colon after the identifier which means:
// an elaborated type is specified: e.g. "class x::y"
! addNestedNameClassNode( specifierStart, specifierList, specifierIdent, secondIdent.str() );
}
void
! DeclarationDetailsParser::addNestedNameClassNode( int specifierStart,
const ASTNodePtr &specifierList,
const std::string &specifierIdent,
const std::string &baseName )
{
+ int identStart = getCurrentIndex()-baseName.length();
std::string secondIdent = baseName;
skipSpaces();
***************
*** 287,290 ****
--- 324,328 ----
secondIdent.append("::");
readNestedName(secondIdent);
+ int identLen = getCurrentIndex()-identStart;
// add the specifier node
***************
*** 299,302 ****
--- 337,347 ----
// set real length after completed parsing
specifier->setLength(getCurrentIndex()-specifierStart);
+
+ ASTNodePtr nameNode =
+ createASTNode(
+ ASTNodeTypes::localScopeIdentifier,
+ specifier,
+ identStart,identLen);
+ specifier->setPropertyNode( ASTNodeProperties::compositeNameProperty , nameNode );
}
***************
*** 321,325 ****
void
! DeclarationDetailsParser::addAnonymousClassNodeAndReadBody( int specifierStart,
const ASTNodePtr &specifierList,
const std::string &specifierIdent )
--- 366,370 ----
void
! DeclarationDetailsParser::addAnonymousCompositeTypeAndReadBody( int specifierStart,
const ASTNodePtr &specifierList,
const std::string &specifierIdent )
***************
*** 344,348 ****
void
! DeclarationDetailsParser::addNamedClassNodeAndReadBody( int specifierStart,
int secondIdentStart,
const ASTNodePtr &specifierList,
--- 389,393 ----
void
! DeclarationDetailsParser::addNamedCompositeTypeAndReadBody( int specifierStart,
int secondIdentStart,
const ASTNodePtr &specifierList,
***************
*** 366,378 ****
getCurrentIndex()-secondIdentStart
);
! specifier->setPropertyNode( ASTNodeProperties::classNameProperty , ident );
skipSpaces();
// check if this is a forward declaration "class x::y;"
! if ( !tryNextIs(';') )
{
// read the complete specifier:
readClassOrEnumSpecifier( specifier, specifierIdent );
}
--- 411,427 ----
getCurrentIndex()-secondIdentStart
);
! specifier->setPropertyNode( ASTNodeProperties::compositeNameProperty , ident );
skipSpaces();
// check if this is a forward declaration "class x::y;"
! if ( !tryNextIs(';') )
{
// read the complete specifier:
readClassOrEnumSpecifier( specifier, specifierIdent );
+ } else
+ {
+ current_--;
+ backtrackSkippingSpaces();
}
|