From: <bl...@us...> - 2003-04-26 21:12:38
|
Update of /cvsroot/cpptool/rfta/src/rftaparser In directory sc8-pr-cvs1:/tmp/cvs-serv9956/src/rftaparser Modified Files: CaseStatementParser.cpp CaseStatementParser.h Log Message: * refactored to use CStringView Index: CaseStatementParser.cpp =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/CaseStatementParser.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** CaseStatementParser.cpp 20 Dec 2002 08:30:50 -0000 1.3 --- CaseStatementParser.cpp 26 Apr 2003 21:12:36 -0000 1.4 *************** *** 9,12 **** --- 9,14 ---- #include <rfta/parser/ASTNodes.h> #include <rfta/parser/ParseContext.h> + #include <rfta/parser/ParserTools.h> + #include <xtl/CStringView.h> *************** *** 33,84 **** Tracker tracker( "CaseStatementParser::parse", *this ); ! current_ = keywordEnd; ! ! skipSpaces(); ! ! int constantStartIndex = getCurrentIndex(); ! skipUntilColonBalancingBraces(); ! ! const char *actualEnd = current_; ! ! --current_; // skip colon ! backtrackSkippingSpaces(); ! int constantLength = getCurrentIndex() - constantStartIndex; ! if ( constantLength <= 0 ) ! throwFailure( "expected constant not found!" ); ! current_ = actualEnd; ! ASTNodePtr caseStatementNode = ! createASTNode( ASTNodeTypes::caseStatement, ! getParentNode(), ! getStartIndex(), ! getCurrentLength() ); ! context_.addNode( caseStatementNode ); ! ASTNodePtr constantNode = ! createASTNode( ASTNodeTypes::constantExpression, ! caseStatementNode, ! constantStartIndex, ! constantLength ); ! caseStatementNode->setPropertyNode( ASTNodeProperties::constantValueProperty, ! constantNode ); ! } ! void ! CaseStatementParser::skipUntilColonBalancingBraces() ! { ! while ( current_ != end_ ) { ! char c = *current_++; ! if ( c == '(' ) ! findNextBalanced( '(', ')' ); ! else if ( c == ':' ) ! return; } - - throwFailure( "failed to find expected ':' after constant expression." ); } --- 35,73 ---- Tracker tracker( "CaseStatementParser::parse", *this ); ! try ! { ! Xtl::CStringEnumerator current( Xtl::CStringView(keywordEnd, end_).enumerate() ); ! ParserTools::skipSpaces( current ); ! Xtl::CStringView constant( current ); ! ParserTools::skipUntil( current, ':', ParserTools::SkipBalancingBracePolicy() ); ! Xtl::CStringView caseStatement( start_, current.getCurrentPos() ); ! Xtl::CStringBackEnumerator backTracker( --current ); ! ParserTools::skipSpaces( backTracker ); ! constant.setEnd( backTracker.getCurrentPos() ); ! if ( constant.isEmpty() ) ! throwFailure( "Missing case constant." ); ! ASTNodePtr caseStatementNode = ! createASTNode( ASTNodeTypes::caseStatement, ! getParentNode(), ! caseStatement ); ! context_.addNode( caseStatementNode ); + ASTNodePtr constantNode = + createASTNode( ASTNodeTypes::constantExpression, + caseStatementNode, + constant ); + caseStatementNode->setPropertyNode( ASTNodeProperties::constantValueProperty, + constantNode ); ! current_ = caseStatement.getEnd(); ! } ! catch ( ParserTools::ParseError &e ) { ! throwFailure( e ); } } Index: CaseStatementParser.h =================================================================== RCS file: /cvsroot/cpptool/rfta/src/rftaparser/CaseStatementParser.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** CaseStatementParser.h 24 Oct 2002 19:10:58 -0000 1.1 --- CaseStatementParser.h 26 Apr 2003 21:12:36 -0000 1.2 *************** *** 30,36 **** private: - void skipUntilColonBalancingBraces(); - - private: }; --- 30,33 ---- |