INTEGRATION: CWS ab47_DEV300 (1.19.58.1.4); FILE MERGED

2008/02/22 08:35:03 ab 1.19.58.1.4.1: #i86265# Removed patches i79918, i80532
This commit is contained in:
Oliver Bolte
2008-02-27 09:33:36 +00:00
parent a90c5fa073
commit a3dda5596a

View File

@@ -4,9 +4,9 @@
* *
* $RCSfile: exprtree.cxx,v $ * $RCSfile: exprtree.cxx,v $
* *
* $Revision: 1.20 $ * $Revision: 1.21 $
* *
* last change: $Author: vg $ $Date: 2008-01-28 14:00:19 $ * last change: $Author: obo $ $Date: 2008-02-27 10:33:36 $
* *
* The Contents of this file are made available subject to * The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1. * the terms of GNU Lesser General Public License Version 2.1.
@@ -46,10 +46,9 @@
|* |*
***************************************************************************/ ***************************************************************************/
SbiExpression::SbiExpression( SbiParser* p, SbiExprType t, BOOL bNested ) SbiExpression::SbiExpression( SbiParser* p, SbiExprType t )
{ {
pParser = p; pParser = p;
mbNested = bNested;
bError = bByVal = bBased = FALSE; bError = bByVal = bBased = FALSE;
eCurExpr = t; eCurExpr = t;
pNext = NULL; pNext = NULL;
@@ -62,10 +61,9 @@ SbiExpression::SbiExpression( SbiParser* p, SbiExprType t, BOOL bNested )
p->Error( SbERR_VAR_EXPECTED ); p->Error( SbERR_VAR_EXPECTED );
} }
SbiExpression::SbiExpression( SbiParser* p, double n, SbxDataType t, BOOL bNested ) SbiExpression::SbiExpression( SbiParser* p, double n, SbxDataType t )
{ {
pParser = p; pParser = p;
mbNested = bNested;
eCurExpr = SbOPERAND; eCurExpr = SbOPERAND;
pNext = NULL; pNext = NULL;
bError = bByVal = bBased = FALSE; bError = bByVal = bBased = FALSE;
@@ -73,30 +71,27 @@ SbiExpression::SbiExpression( SbiParser* p, double n, SbxDataType t, BOOL bNeste
pExpr->Optimize(); pExpr->Optimize();
} }
SbiExpression::SbiExpression( SbiParser* p, const String& r, BOOL bNested ) SbiExpression::SbiExpression( SbiParser* p, const String& r )
{ {
pParser = p; pParser = p;
mbNested = bNested;
pNext = NULL; pNext = NULL;
bError = bByVal = bBased = FALSE; bError = bByVal = bBased = FALSE;
eCurExpr = SbOPERAND; eCurExpr = SbOPERAND;
pExpr = new SbiExprNode( pParser, r ); pExpr = new SbiExprNode( pParser, r );
} }
SbiExpression::SbiExpression( SbiParser* p, const SbiSymDef& r, SbiExprList* pPar, BOOL bNested ) SbiExpression::SbiExpression( SbiParser* p, const SbiSymDef& r, SbiExprList* pPar )
{ {
pParser = p; pParser = p;
mbNested = bNested;
pNext = NULL; pNext = NULL;
bError = bByVal = bBased = FALSE; bError = bByVal = bBased = FALSE;
eCurExpr = SbOPERAND; eCurExpr = SbOPERAND;
pExpr = new SbiExprNode( pParser, r, SbxVARIANT, pPar ); pExpr = new SbiExprNode( pParser, r, SbxVARIANT, pPar );
} }
SbiExpression::SbiExpression( SbiParser* p, SbiToken t, BOOL bNested ) SbiExpression::SbiExpression( SbiParser* p, SbiToken t )
{ {
pParser = p; pParser = p;
mbNested = bNested;
pNext = NULL; pNext = NULL;
bError = bByVal = bBased = FALSE; bError = bByVal = bBased = FALSE;
eCurExpr = SbOPERAND; eCurExpr = SbOPERAND;
@@ -117,7 +112,7 @@ SbiExpression::~SbiExpression()
// Folgen Parameter ohne Klammer? Dies kann eine Zahl, ein String, // Folgen Parameter ohne Klammer? Dies kann eine Zahl, ein String,
// ein Symbol oder auch ein Komma sein (wenn der 1. Parameter fehlt) // ein Symbol oder auch ein Komma sein (wenn der 1. Parameter fehlt)
static BOOL DoParametersFollow( SbiParser* p, SbiExprType eCurExpr, SbiToken eTok, bool bNested ) static BOOL DoParametersFollow( SbiParser* p, SbiExprType eCurExpr, SbiToken eTok )
{ {
if( eTok == LPAREN ) if( eTok == LPAREN )
return TRUE; return TRUE;
@@ -130,15 +125,11 @@ static BOOL DoParametersFollow( SbiParser* p, SbiExprType eCurExpr, SbiToken eTo
return TRUE; return TRUE;
} }
else // check for default params with reserved names ( e.g. names of tokens ) else // check for default params with reserved names ( e.g. names of tokens )
// also cater for aFuncCall -10 ( where we need to handle the minus )
{ {
SbiTokenizer tokens( *(SbiTokenizer*)p ); SbiTokenizer tokens( *(SbiTokenizer*)p );
// Urk the Next() / Peek() symantics are... weird // Urk the Next() / Peek() symantics are... weird
tokens.Next(); tokens.Next();
SbiToken eNext = tokens.Peek(); if ( tokens.Peek() == ASSIGN )
if ( !bNested && eTok == MINUS && ( eNext == NUMBER || eNext == FIXSTRING || eNext == SYMBOL ) ) // note vba will strip a leadin +
return TRUE;
if ( eNext == ASSIGN )
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@@ -249,9 +240,9 @@ SbiExprNode* SbiExpression::Term()
} }
} }
if( DoParametersFollow( pParser, eCurExpr, eTok = eNextTok, mbNested ) ) if( DoParametersFollow( pParser, eCurExpr, eTok = eNextTok ) )
{ {
pPar = new SbiParameters( pParser, FALSE, TRUE, mbNested ); pPar = new SbiParameters( pParser );
bError |= !pPar->IsValid(); bError |= !pPar->IsValid();
eTok = pParser->Peek(); eTok = pParser->Peek();
} }
@@ -357,7 +348,7 @@ SbiExprNode* SbiExpression::Term()
} }
SbiExprNode* pNd = new SbiExprNode( pParser, *pDef, eType ); SbiExprNode* pNd = new SbiExprNode( pParser, *pDef, eType );
if( !pPar ) if( !pPar )
pPar = new SbiParameters( pParser,FALSE,FALSE, mbNested ); pPar = new SbiParameters( pParser,FALSE,FALSE );
pNd->aVar.pPar = pPar; pNd->aVar.pPar = pPar;
if( bObj ) if( bObj )
{ {
@@ -412,9 +403,9 @@ SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj )
SbiParameters* pPar = NULL; SbiParameters* pPar = NULL;
eTok = pParser->Peek(); eTok = pParser->Peek();
// Parameter? // Parameter?
if( DoParametersFollow( pParser, eCurExpr, eTok, mbNested ) ) if( DoParametersFollow( pParser, eCurExpr, eTok ) )
{ {
pPar = new SbiParameters( pParser, FALSE, TRUE, mbNested ); pPar = new SbiParameters( pParser );
bError |= !pPar->IsValid(); bError |= !pPar->IsValid();
eTok = pParser->Peek(); eTok = pParser->Peek();
} }
@@ -822,10 +813,9 @@ void SbiExprList::addExpression( SbiExpression* pExpr )
// Dann handelt es sich um eine Funktion ohne Parameter // Dann handelt es sich um eine Funktion ohne Parameter
// respektive um die Angabe eines Arrays als Prozedurparameter. // respektive um die Angabe eines Arrays als Prozedurparameter.
SbiParameters::SbiParameters( SbiParser* p, BOOL bConst, BOOL bPar, BOOL bNested ) : SbiParameters::SbiParameters( SbiParser* p, BOOL bConst, BOOL bPar) :
SbiExprList( p ) SbiExprList( p )
{ {
(void)bNested;
if (bPar) if (bPar)
{ {
SbiExpression *pExpr; SbiExpression *pExpr;
@@ -853,7 +843,7 @@ SbiParameters::SbiParameters( SbiParser* p, BOOL bConst, BOOL bPar, BOOL bNested
// Fehlendes Argument // Fehlendes Argument
if( eTok == COMMA ) if( eTok == COMMA )
{ {
pExpr = new SbiExpression( pParser, 0, SbxEMPTY, TRUE ); pExpr = new SbiExpression( pParser, 0, SbxEMPTY );
if( bConst ) if( bConst )
pParser->Error( SbERR_SYNTAX ), bError = TRUE; pParser->Error( SbERR_SYNTAX ), bError = TRUE;
} }
@@ -861,7 +851,7 @@ SbiParameters::SbiParameters( SbiParser* p, BOOL bConst, BOOL bPar, BOOL bNested
else else
{ {
pExpr = bConst ? new SbiConstExpression( pParser ) pExpr = bConst ? new SbiConstExpression( pParser )
: new SbiExpression( pParser, SbSTDEXPR, TRUE ); : new SbiExpression( pParser );
if( pParser->Peek() == ASSIGN ) if( pParser->Peek() == ASSIGN )
{ {
// VBA mode: name:= // VBA mode: name:=
@@ -869,7 +859,7 @@ SbiParameters::SbiParameters( SbiParser* p, BOOL bConst, BOOL bPar, BOOL bNested
aName = pExpr->GetString(); aName = pExpr->GetString();
delete pExpr; delete pExpr;
pParser->Next(); pParser->Next();
pExpr = new SbiExpression( pParser, SbSTDEXPR, TRUE ); pExpr = new SbiExpression( pParser );
if( bConst ) if( bConst )
pParser->Error( SbERR_SYNTAX ), bError = TRUE; pParser->Error( SbERR_SYNTAX ), bError = TRUE;
} }
@@ -886,37 +876,14 @@ SbiParameters::SbiParameters( SbiParser* p, BOOL bConst, BOOL bPar, BOOL bNested
eTok = pParser->Peek(); eTok = pParser->Peek();
if( eTok != COMMA ) if( eTok != COMMA )
{ {
if ( bBracket && eTok == RPAREN ) if( ( bBracket && eTok == RPAREN ) || pParser->IsEoln( eTok ) )
{
if ( !bNested )
{
SbiTokenizer tokens( *(SbiTokenizer*)pParser );
tokens.Next();
if ( tokens.Peek() == COMMA )
{
// advance the parser to the comma
pParser->Next();
pParser->Peek();
}
else
break;
}
else
break;
}
else if( pParser->IsEoln( eTok ) )
{
break; break;
} pParser->Error( bBracket
else ? SbERR_BAD_BRACKETS
{ : SbERR_EXPECTED, COMMA );
pParser->Error( bBracket bError = TRUE;
? SbERR_BAD_BRACKETS
: SbERR_EXPECTED, COMMA );
bError = TRUE;
}
} }
if ( !bError ) else
{ {
pParser->Next(); pParser->Next();
eTok = pParser->Peek(); eTok = pParser->Peek();