@@ -167,7 +167,6 @@ Private P_GALLOPING_MODE As Boolean
167167Private P_RESULT As Variant
168168Private P_SEPARATORCHAR As String
169169Private SubTreeData() As String
170- Private UnaryFlag As Boolean
171170Private UserDefFunctions As ClusterBuffer
172171
173172'#
@@ -219,7 +218,6 @@ Private Type Token
219218 EvalResult As String
220219 Logical As Boolean
221220 OperationToken As OperatorToken
222- UnaryFlag As Boolean
223221End Type
224222Private Type TokenInfo
225223 OperationToken As OperatorToken
@@ -712,19 +710,14 @@ Private Sub BottomLevelEval(ByRef aToken As Token)
712710 aToken.EvalResult = CastOPtype(aToken.Arg1.Operand, aToken.Arg1.NegationFlagOn) / _
713711 CastOPtype(aToken.Arg2.Operand, aToken.Arg2.NegationFlagOn)
714712 Case OperatorToken.otPower
715- If aToken.UnaryFlag Then
716- Dim kFctr As Double
717- If AscW(aToken.Arg1.DefString) = 45 Then
718- kFctr = -1
719- Else
720- kFctr = 1
721- End If
722- aToken.EvalResult = kFctr * CastOPtype(aToken.Arg1.Operand, aToken.Arg1.NegationFlagOn) ^ _
723- CastOPtype(aToken.Arg2.Operand, aToken.Arg2.NegationFlagOn)
713+ Dim kFctr As Double
714+ If AscW(aToken.Arg1.DefString) = 45 Then
715+ kFctr = -1
724716 Else
725- aToken.EvalResult = CastOPtype(aToken.Arg1.Operand, aToken.Arg1.NegationFlagOn) ^ _
726- CastOPtype(aToken.Arg2.Operand, aToken.Arg2.NegationFlagOn)
717+ kFctr = 1
727718 End If
719+ aToken.EvalResult = kFctr * CastOPtype(aToken.Arg1.Operand, aToken.Arg1.NegationFlagOn) ^ _
720+ CastOPtype(aToken.Arg2.Operand, aToken.Arg2.NegationFlagOn)
728721 Case OperatorToken.otMod
729722 aToken.EvalResult = CastOPtype(aToken.Arg1.Operand, aToken.Arg1.NegationFlagOn) Mod _
730723 CastOPtype(aToken.Arg2.Operand, aToken.Arg2.NegationFlagOn)
@@ -1376,7 +1369,6 @@ Private Function GetEvalToken(ByRef Expression As String) As Token
13761369 '@--------------------------------------------------------------------
13771370 ' Fill token data
13781371 GetEvalToken.DefString = MidB$(Expression, TokenStart, TokenEnd - TokenStart + 2 )
1379- GetEvalToken.UnaryFlag = GetEvalToken.DefString Like "[-+]*"
13801372 GetEvalToken.OperationToken = TokenDet.OperationToken
13811373 SplitToken GetEvalToken.DefString, tmpArgs, GetEvalToken.OperationToken
13821374 GetEvalToken.Arg1.DefString = tmpArgs(LBound(tmpArgs))
@@ -1403,7 +1395,6 @@ Private Function GetEvalToken(ByRef Expression As String) As Token
14031395 GetEvalToken.Logical = TokenDet.LogicalToken
14041396 GetEvalToken.Arg1.NegationFlagOn = (InStrB(1 , GetEvalToken.Arg1.DefString, op_neg) = 1 ) '~*
14051397 GetEvalToken.DefString = Expression
1406- GetEvalToken.UnaryFlag = GetEvalToken.DefString Like "[-+]*"
14071398 GetEvalToken.Arg1.FuncName = GetFunctionName(GetEvalToken.Arg1.DefString)
14081399 GetEvalToken.Arg1.UDFFunctionIn = IsUDFFunction
14091400 GetEvalToken.Arg1.FunctionIn = (GetEvalToken.Arg1.FuncName <> vbNullString) Or GetEvalToken.Arg1.UDFFunctionIn
@@ -1414,16 +1405,34 @@ Private Function GetEvalToken(ByRef Expression As String) As Token
14141405 End If
14151406End Function
14161407
1408+ Private Function ValidFuntionName (ByRef Expression As String , _
1409+ ByRef FuntionName As String , _
1410+ StartPos As Long ) As Boolean
1411+ Dim cLeft As Boolean
1412+ Dim cRight As Boolean
1413+
1414+ If StartPos > 1 Then
1415+ cLeft = Not IsLetter(MidB$(Expression, StartPos - 2 , 2 ))
1416+ Else
1417+ cLeft = True
1418+ End If
1419+ cRight = Not IsLetter(MidB$(Expression, StartPos + LenB(FuntionName), 2 ))
1420+ ValidFuntionName = cLeft And cRight
1421+ End Function
14171422Private Function GetFunctionName (ByRef Expression As String ) As String
14181423 Dim EFjCounter As Long
14191424 Dim GFNbool As Boolean
14201425 Dim ExpCopy As String
1426+ Dim tmpPos As Long
14211427
14221428 ExpCopy = LCase$(Expression)
14231429 For EFjCounter = LBound(FunctionsId) To UBound(FunctionsId)
1424- If InStrB(1 , ExpCopy, FunctionsId(EFjCounter)) Then
1425- GFNbool = True
1426- Exit For
1430+ tmpPos = InStrB(1 , ExpCopy, FunctionsId(EFjCounter))
1431+ If tmpPos Then
1432+ GFNbool = ValidFuntionName(ExpCopy, FunctionsId(EFjCounter), tmpPos)
1433+ If GFNbool Then
1434+ Exit For
1435+ End If
14271436 End If
14281437 Next EFjCounter
14291438 If GFNbool Then
@@ -1432,9 +1441,12 @@ Private Function GetFunctionName(ByRef Expression As String) As String
14321441 Else 'Check for UDFs
14331442 Dim i As Long
14341443 For i = 0 To UserDefFunctions.Index
1435- If InStrB(1 , ExpCopy, UserDefFunctions.Storage(i).name) Then
1436- GFNbool = True
1437- Exit For
1444+ tmpPos = InStrB(1 , ExpCopy, UserDefFunctions.Storage(i).name)
1445+ If tmpPos Then
1446+ GFNbool = GFNbool = ValidFuntionName(ExpCopy, UserDefFunctions.Storage(i).name, tmpPos)
1447+ If GFNbool Then
1448+ Exit For
1449+ End If
14381450 End If
14391451 Next i
14401452 If Not GFNbool Then
@@ -1634,10 +1646,8 @@ Private Sub GetOperand(ByRef CurToken As Token, ByRef CurArg As Argument, _
16341646 End If
16351647 End If
16361648 End If
1637- If CurToken.UnaryFlag Then
1638- If AscW(CurArg.DefString) = 45 Then
1639- CurArg.Operand = ApplyLawOfSigns(op_minus + CurArg.Operand)
1640- End If
1649+ If AscW(CurArg.DefString) = 45 Then
1650+ CurArg.Operand = ApplyLawOfSigns(op_minus + CurArg.Operand)
16411651 End If
16421652 Else 'Explicit function or data
16431653 If CurArg.LinkedVar > -1 Then 'Variable substitution
@@ -1646,10 +1656,8 @@ Private Sub GetOperand(ByRef CurToken As Token, ByRef CurArg As Argument, _
16461656 Else
16471657 CurArg.Operand = ExprVariables.Storage(CurArg.LinkedVar).value
16481658 End If
1649- If CurToken.UnaryFlag Then
1650- If AscW(CurArg.DefString) = 45 Then
1651- CurArg.Operand = ApplyLawOfSigns(op_minus + CurArg.Operand)
1652- End If
1659+ If AscW(CurArg.DefString) = 45 Then
1660+ CurArg.Operand = ApplyLawOfSigns(op_minus + CurArg.Operand)
16531661 End If
16541662 Else
16551663 If CurArg.FactorialIn Then
@@ -2609,7 +2617,7 @@ Private Sub TokenizeSubExpr(ByRef Expression As String, ByRef SubExpressionsData
26092617 outBuffer.CompCluster = True
26102618 outBuffer.CompArrCluster = True
26112619 Else
2612- 'Code here for trap error of missing () in a composite array and standard input
2620+ 'Todo: Code here for trap error of missing () in a composite array and standard input
26132621 End If
26142622 End If
26152623End Sub
0 commit comments