54 pExpr = std::make_unique<SbiExprNode>(
n,
t );
63 pExpr = std::make_unique<SbiExprNode>( r,
SbxVARIANT, std::move(pPar) );
84 if( !
p->WhiteSpace() || eCurExpr !=
SbSYMBOL )
113 bool bHasType = ( eTok ==
EQ || eTok ==
DOT );
114 if( ( !bHasType && eCurExpr ==
SbSYMBOL ) || pPar )
136 for( sal_Int32
n = 1;
n <= pPar->
GetSize();
n++ )
138 OUString aPar =
"PAR" + OUString::number(
n );
146 pDef = rPool.
AddSym( rName );
161 std::unique_ptr<SbiExprNode> pNd;
171 pNd->SetWithParent( pWithVar );
177 pNd = std::make_unique<SbiExprNode>( 1.0,
SbxDOUBLE );
188 std::unique_ptr<SbiExprListVector> pvMoreParLcl;
197 return std::make_unique<SbiExprNode>( aSym );
220 if( pvMoreParLcl ==
nullptr )
226 pvMoreParLcl->push_back( std::move(pAddPar) );
233 bool bObj = ( ( eTok ==
DOT || eTok ==
EXCLAM )
287 pvMoreParLcl.reset();
290 return std::make_unique<SbiExprNode>( pConst->
GetString() );
294 return std::make_unique<SbiExprNode>( pConst->
GetValue(), pConst->
GetType() );
301 if( pPar && pPar->GetSize() && pPar->GetSize() != pDef->
GetDims() )
345 auto pNd = std::make_unique<SbiExprNode>( *pDef,
eType );
350 pNd->aVar.pPar = pPar.release();
351 pNd->aVar.pvMorePar = pvMoreParLcl.release();
370 pNd->aVar.pNext =
ObjTerm( *pDef ).release();
389 if( eTok !=
MOD && eTok !=
NOT && eTok !=
AND && eTok !=
OR &&
390 eTok !=
XOR && eTok !=
EQV && eTok !=
IMP && eTok !=
IS )
416 if( pvMoreParLcl ==
nullptr )
422 pvMoreParLcl->push_back( std::move(pAddPar) );
451 auto pNd = std::make_unique<SbiExprNode>( *pDef,
eType );
452 pNd->aVar.pPar = pPar.release();
453 pNd->aVar.pvMorePar = pvMoreParLcl;
467 pNd->aVar.pNext =
ObjTerm( *pDef ).release();
484 std::unique_ptr<SbiExprNode> pRes;
495 pRes = std::make_unique<SbiExprNode>( std::move(pRes), eTok,
Like() );
499 pRes =
Term();
break;
509 pRes = std::make_unique<SbiExprNode>(
pParser->
GetSym() );
break;
515 pRes = std::make_unique<SbiExprNode>();
539 if( eTokAfterRParen ==
EQ || eTokAfterRParen ==
LPAREN || eTokAfterRParen ==
DOT )
560 pRes = std::make_unique<SbiExprNode>( 1.0,
SbxDOUBLE );
570 std::unique_ptr<SbiExprNode> pNd;
577 pNd = std::make_unique<SbiExprNode>(
Unary(), eTok,
nullptr );
587 pNd = std::make_unique<SbiExprNode>(
Unary(), eTok,
nullptr );
597 std::unique_ptr<SbiExprNode> pObjNode =
Operand(
true );
601 pNd = std::make_unique<SbiExprNode>( std::move(pObjNode), pTypeDef->
GetTypeId() );
609 pNd = std::make_unique<SbiExprNode>( pTypeDef->
GetTypeId() );
620 std::unique_ptr<SbiExprNode> pNd =
Unary();
626 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
Unary() );
634 std::unique_ptr<SbiExprNode> pNd =
Exp();
640 if( eTok !=
MUL && eTok !=
DIV )
645 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
Exp() );
653 std::unique_ptr<SbiExprNode> pNd =
MulDiv();
659 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
MulDiv() );
667 std::unique_ptr<SbiExprNode> pNd =
IntDiv();
673 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
IntDiv() );
681 std::unique_ptr<SbiExprNode> pNd =
Mod();
692 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
Mod() );
700 std::unique_ptr<SbiExprNode> pNd =
AddSub();
711 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
AddSub() );
719 std::unique_ptr<SbiExprNode> pNd =
Cat();
729 if( eTok !=
EQ && eTok !=
NE && eTok !=
LT &&
730 eTok !=
GT && eTok !=
LE && eTok !=
GE )
735 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
Cat() );
744 std::unique_ptr<SbiExprNode> pNd;
750 pNd = std::make_unique<SbiExprNode>(
VBA_Not(), eTok,
nullptr );
768 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
Comp() );
783 std::unique_ptr<SbiExprNode> pNd =
Like();
789 if( (eTok !=
AND) && (eTok !=
OR) &&
790 (eTok !=
XOR) && (eTok !=
EQV) &&
791 (eTok !=
IMP) && (eTok !=
IS) )
796 pNd = std::make_unique<SbiExprNode>( std::move(pNd), eTok,
Like() );
804 if(
pExpr->IsConstant() )
807 if(
pExpr->IsNumber() )
820 bool bIsBool =
false;
825 bool bBoolVal =
false;
826 if( pVarDef->
GetName().equalsIgnoreAsciiCase(
"true" ) )
831 else if( pVarDef->
GetName().equalsIgnoreAsciiCase(
"false" ) )
860 refConv->PutString(
aVal );
861 return refConv->GetInteger();
885 return static_cast<short>(
n);
906 aData.push_back(std::move(pExpr));
919 auto pExprList = std::make_unique<SbiExprList>();
927 bool bAssumeExprLParenMode =
false;
928 bool bAssumeArrayMode =
false;
931 if( bStandaloneExpression )
933 bAssumeExprLParenMode =
true;
937 pExprList->bBracket =
true;
939 eTok = pParser->
Peek();
953 while( !pExprList->bError )
955 std::unique_ptr<SbiExpression> pExpr;
959 pExpr = std::make_unique<SbiExpression>( pParser, 0,
SbxEMPTY );
969 eTok = pParser->
Peek();
972 if( bAssumeExprLParenMode )
975 bAssumeExprLParenMode =
false;
980 pExprList->bBracket =
true;
987 pExprList->bBracket =
true;
988 bAssumeArrayMode =
true;
993 pExprList->bBracket =
true;
999 pExpr = std::make_unique<SbiExpression>( pParser );
1001 if( bByVal && pExpr->IsLvalue() )
1005 if( !bAssumeArrayMode )
1012 aName = pExpr->GetString();
1014 pExpr = std::make_unique<SbiExpression>( pParser );
1016 pExpr->GetName() =
aName;
1019 pExprList->bError = pExprList->bError || !pExpr->IsValid();
1020 pExprList->aData.push_back(std::move(pExpr));
1021 if( bAssumeArrayMode )
1026 eTok = pParser->
Peek();
1040 pExprList->bError =
true;
1046 pExprList->bError =
true;
1051 eTok = pParser->
Peek();
1063 if( !pExprList->bBracket )
1066 pExprList->bError =
true;
1069 pExprList->nDim = pExprList->GetSize();
1077 auto pExprList = std::make_unique<SbiExprList>();
1082 pExprList->bError =
true;
return pExprList;
1090 auto pExpr1 = std::make_unique<SbiExpression>( pParser );
1091 eTok = pParser->
Next();
1094 auto pExpr2 = std::make_unique<SbiExpression>( pParser );
1095 pExpr1->ConvertToIntConstIfPossible();
1096 pExpr2->ConvertToIntConstIfPossible();
1097 eTok = pParser->
Next();
1098 pExprList->bError = pExprList->bError || !pExpr1->IsValid() || !pExpr2->IsValid();
1099 pExprList->aData.push_back(std::move(pExpr1));
1100 pExprList->aData.push_back(std::move(pExpr2));
1105 pExpr1->ConvertToIntConstIfPossible();
1106 pExprList->bError = pExprList->bError || !pExpr1->IsValid();
1107 pExprList->aData.push_back(std::move(pExpr1));
1110 if( eTok ==
RPAREN )
break;
1119 else pParser->
Next();
SbMethod * FindMethod(const OUString &, SbxClassType)
const OUString & GetString() const
SbiConstExpression(SbiParser *)
void addExpression(std::unique_ptr< SbiExpression > &&pExpr)
static SbiExprListPtr ParseParameters(SbiParser *, bool bStandaloneExpression=false, bool bPar=true)
static SbiExprListPtr ParseDimList(SbiParser *)
SbiExpression * Get(size_t)
std::vector< std::unique_ptr< SbiExpression > > aData
std::unique_ptr< SbiExprNode > VBA_Not()
std::unique_ptr< SbiExprNode > Comp()
std::unique_ptr< SbiExprNode > Boolean()
std::unique_ptr< SbiExprNode > Like()
std::unique_ptr< SbiExprNode > Unary()
std::unique_ptr< SbiExprNode > Cat()
std::unique_ptr< SbiExprNode > Operand(bool bUsedForTypeOf=false)
std::unique_ptr< SbiExprNode > IntDiv()
std::unique_ptr< SbiExprNode > pExpr
std::unique_ptr< SbiExprNode > Exp()
std::unique_ptr< SbiExprNode > AddSub()
std::unique_ptr< SbiExprNode > MulDiv()
std::unique_ptr< SbiExprNode > Term(const KeywordSymbolInfo *pKeywordSymbolInfo=nullptr)
std::unique_ptr< SbiExprNode > ObjTerm(SbiSymDef &)
SbiExpression(SbiParser *, SbiExprType=SbSTDEXPR, SbiExprMode eMode=EXPRMODE_STANDARD, const KeywordSymbolInfo *pKeywordSymbolInfo=nullptr)
std::unique_ptr< SbiExprNode > Mod()
SbiExprNode * GetWithVar()
void TypeDecl(SbiSymDef &, bool bAsNewAlreadyParsed=false)
SbiSymDef * CheckRTLForSym(const OUString &rSym, SbxDataType eType)
bool IsVBASupportOn() const
SbxDataType GetType() const
const OUString & GetSym() const
bool IsCompatible() const
virtual SbiProcDef * GetProcDef()
virtual SbiConstDef * GetConstDef()
sal_uInt16 GetTypeId() const
SbxDataType GetType() const
const OUString & GetName()
void SetStatic(bool bAsStatic=true)
virtual void SetType(SbxDataType)
SbiSymScope GetScope() const
SbiSymDef * Find(const OUString &, bool bSearchInParents=true)
SbiProcDef * AddProc(const OUString &)
void SetScope(SbiSymScope s)
SbiSymDef * AddSym(const OUString &)
static bool IsExtra(SbiToken t)
static bool IsKwd(SbiToken t)
static bool IsEoln(SbiToken t)
std::unique_ptr< SbiExprList > SbiExprListPtr
std::vector< SbiExprListPtr > SbiExprListVector
@ EXPRMODE_LPAREN_PENDING
@ EXPRMODE_LPAREN_NOT_NEEDED
@ EXPRMODE_ARRAY_OR_OBJECT
static bool DoParametersFollow(const SbiParser *p, SbiExprType eCurExpr, SbiToken eTok)
static SbiSymDef * AddSym(SbiToken eTok, SbiSymPool &rPool, SbiExprType eCurExpr, const OUString &rName, SbxDataType eType, const SbiExprList *pPar)
bool IsContextFlagActive(const OUString &sName)
#define ERRCODE_BASIC_EXPECTED
#define ERRCODE_BASIC_BAD_DECLARATION
#define ERRCODE_BASIC_VAR_EXPECTED
#define ERRCODE_BASIC_UNEXPECTED
#define ERRCODE_BASIC_LVALUE_EXPECTED
#define ERRCODE_BASIC_OUT_OF_RANGE
#define ERRCODE_BASIC_SYNTAX
#define ERRCODE_BASIC_BAD_BRACKETS
#define ERRCODE_BASIC_WRONG_DIMS
OUString m_aKeywordSymbol
SbxDataType m_eSbxDataType