Skip to content

Commit 7d1be28

Browse files
committed
Code improvement
* Bug fixed: some functions cannot be recognized. * Removed redundant code.
1 parent e0f7334 commit 7d1be28

File tree

1 file changed

+38
-30
lines changed

1 file changed

+38
-30
lines changed

src/VBAexpressions.cls

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ Private P_GALLOPING_MODE As Boolean
167167
Private P_RESULT As Variant
168168
Private P_SEPARATORCHAR As String
169169
Private SubTreeData() As String
170-
Private UnaryFlag As Boolean
171170
Private 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
223221
End Type
224222
Private 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
14151406
End 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
14171422
Private 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
26152623
End Sub

0 commit comments

Comments
 (0)