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