Skip to content

Commit d41aa37

Browse files
committed
Bug fixed: unable to catch special cases of like operator.
1 parent c347c00 commit d41aa37

File tree

1 file changed

+40
-38
lines changed

1 file changed

+40
-38
lines changed

src/VBAexpressions.cls

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,10 +1184,10 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
11841184
GetArithOpInfo.OperationToken = otPower
11851185
GetArithOpInfo.OperatorLen = LenB(op_power)
11861186
Else
1187-
MultSymbolPos = GetMultSymbolPos(Expression)
1188-
DivSymbolPos = InStrB(1, Expression, op_div)
1189-
IntDivSymbolPos = InStrB(1, Expression, op_intDiv)
1190-
ModSymbolPos = InStrB(1, Expression, op_mod)
1187+
MultSymbolPos = GetOPeratorSymbolPos(Expression, op_mult)
1188+
DivSymbolPos = GetOPeratorSymbolPos(Expression, op_div)
1189+
IntDivSymbolPos = GetOPeratorSymbolPos(Expression, op_intDiv)
1190+
ModSymbolPos = GetOPeratorSymbolPos(Expression, op_mod)
11911191
If NonZero(MultSymbolPos, DivSymbolPos, ModSymbolPos, IntDivSymbolPos) Then
11921192
GetArithOpInfo.Position = MinNonZero(MultSymbolPos, DivSymbolPos, ModSymbolPos, IntDivSymbolPos) 'Priority to the first operator
11931193
Select Case GetArithOpInfo.Position
@@ -1205,9 +1205,9 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
12051205
GetArithOpInfo.OperatorLen = LenB(op_mod)
12061206
End Select
12071207
Else 'Addition and subtraction
1208-
AddSymbolPos = InStrB(1, Expression, op_plus)
1208+
AddSymbolPos = GetOPeratorSymbolPos(Expression, op_plus)
12091209
If AddSymbolPos = 1 Then 'Unary symbol
1210-
AddSymbolPos = InStrB(AddSymbolPos + 2, Expression, op_plus)
1210+
AddSymbolPos = GetOPeratorSymbolPos(Expression, op_plus, AddSymbolPos + 2)
12111211
End If
12121212
If AddSymbolPos Then
12131213
tmpPos = AddSymbolPos - 2
@@ -1231,7 +1231,7 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
12311231
End If
12321232
tmpStr = MidB$(Expression, tmpPos, AddSymbolPos - tmpPos)
12331233
If GetFunctionName(tmpStr) <> vbNullString Or tmpStr = "E" Then
1234-
AddSymbolPos = InStrB(AddSymbolPos + 2, Expression, op_plus)
1234+
AddSymbolPos = GetOPeratorSymbolPos(Expression, op_plus, AddSymbolPos + 2)
12351235
Else
12361236
Exit Do
12371237
End If
@@ -1240,9 +1240,9 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
12401240
End If
12411241
Loop
12421242
End If
1243-
SubtSymbolPos = InStrB(1, Expression, op_minus)
1243+
SubtSymbolPos = GetOPeratorSymbolPos(Expression, op_minus)
12441244
If SubtSymbolPos = 1 Then
1245-
SubtSymbolPos = InStrB(SubtSymbolPos + 2, Expression, op_minus)
1245+
SubtSymbolPos = GetOPeratorSymbolPos(Expression, op_minus, SubtSymbolPos + 2)
12461246
End If
12471247
If SubtSymbolPos Then
12481248
tmpPos = SubtSymbolPos - 2
@@ -1266,7 +1266,7 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
12661266
End If
12671267
tmpStr = MidB$(Expression, tmpPos, SubtSymbolPos - tmpPos)
12681268
If GetFunctionName(tmpStr) <> vbNullString Or tmpStr = "E" Then
1269-
SubtSymbolPos = InStrB(SubtSymbolPos + 2, Expression, op_minus)
1269+
SubtSymbolPos = GetOPeratorSymbolPos(Expression, op_minus, SubtSymbolPos + 2)
12701270
Else
12711271
Exit Do
12721272
End If
@@ -1494,32 +1494,32 @@ Private Function GetLCOpInfo(ByRef Expression As String) As TokenInfo
14941494
'@--------------------------------------------------------------------
14951495
' Comparisons first
14961496
Do 'Discard false positives
1497-
EqualSymbolPos = InStrB(EqualSymbolPos + 1, Expression, op_equal)
1497+
EqualSymbolPos = GetOPeratorSymbolPos(Expression, op_equal, EqualSymbolPos + 1)
14981498
If EqualSymbolPos > 2 Then
14991499
testChar = MidB$(Expression, EqualSymbolPos - 2, 2)
15001500
Else
15011501
testChar = vbNullString
15021502
End If
15031503
Loop While EqualSymbolPos > 0 And testChar Like "[<>]"
1504-
NotEqualSymbolPos = InStrB(1, Expression, op_inequality)
1504+
NotEqualSymbolPos = GetOPeratorSymbolPos(Expression, op_inequality)
15051505
Do
1506-
GreatterThanSymbolPos = InStrB(GreatterThanSymbolPos + 1, Expression, op_gt)
1506+
GreatterThanSymbolPos = GetOPeratorSymbolPos(Expression, op_gt, GreatterThanSymbolPos + 1)
15071507
If GreatterThanSymbolPos Then
15081508
testChar = MidB$(Expression, GreatterThanSymbolPos + 2, 2)
15091509
Else
15101510
testChar = vbNullString
15111511
End If
15121512
Loop While GreatterThanSymbolPos > 0 And testChar = op_equal
15131513
Do
1514-
LessThanSymbolPos = InStrB(LessThanSymbolPos + 1, Expression, op_lt)
1514+
LessThanSymbolPos = GetOPeratorSymbolPos(Expression, op_lt, LessThanSymbolPos + 1)
15151515
If LessThanSymbolPos Then
15161516
testChar = MidB$(Expression, LessThanSymbolPos + 2, 2)
15171517
Else
15181518
testChar = vbNullString
15191519
End If
15201520
Loop While LessThanSymbolPos > 0 And testChar = op_equal
1521-
GreatterOrEqualSymbolPos = InStrB(1, Expression, op_gtequal)
1522-
LessOrEqualSymbolPos = InStrB(1, Expression, op_ltequal)
1521+
GreatterOrEqualSymbolPos = GetOPeratorSymbolPos(Expression, op_gtequal)
1522+
LessOrEqualSymbolPos = GetOPeratorSymbolPos(Expression, op_ltequal)
15231523
LikeSymbolPos = InStrB(LessThanSymbolPos + 1, Expression, op_like)
15241524
If NonZero(EqualSymbolPos, NotEqualSymbolPos, GreatterThanSymbolPos, _
15251525
LessThanSymbolPos, GreatterOrEqualSymbolPos, LessOrEqualSymbolPos, LikeSymbolPos) Then
@@ -1554,20 +1554,20 @@ Private Function GetLCOpInfo(ByRef Expression As String) As TokenInfo
15541554
Else
15551555
'@--------------------------------------------------------------------
15561556
' Check the expression giving higher precedence to AND, XOR
1557-
LogANDSymbolPos = InStrB(LogANDSymbolPos + 1, Expression, op_and)
1557+
LogANDSymbolPos = GetOPeratorSymbolPos(Expression, op_and, LogANDSymbolPos + 1)
15581558
If NonZero(LogANDSymbolPos) Then
15591559
GetLCOpInfo.Position = LogANDSymbolPos
15601560
GetLCOpInfo.OperationToken = otLogicalAND
15611561
GetLCOpInfo.OperatorLen = LenB(op_and)
15621562
Else
1563-
LogXORSymbolPos = InStrB(LogXORSymbolPos + 1, Expression, op_xor)
1563+
LogXORSymbolPos = GetOPeratorSymbolPos(Expression, op_xor, LogXORSymbolPos + 1)
15641564
If NonZero(LogXORSymbolPos) Then
15651565
GetLCOpInfo.Position = LogXORSymbolPos
15661566
GetLCOpInfo.OperationToken = otLogicalXOR
15671567
GetLCOpInfo.OperatorLen = LenB(op_xor)
15681568
Else
15691569
Do 'Discard false positives: "||"
1570-
LogORSymbolPos = InStrB(LogORSymbolPos + 1, Expression, op_or)
1570+
LogORSymbolPos = GetOPeratorSymbolPos(Expression, op_or, LogORSymbolPos + 1)
15711571
If LogORSymbolPos Then
15721572
testChar = MidB$(Expression, LogORSymbolPos + 2, 2)
15731573
Else
@@ -1618,22 +1618,6 @@ Private Function GetLParentPos(ByRef Expression As String, ByRef RelativePositio
16181618
GetLParentPos = tmpResult
16191619
End Function
16201620

1621-
Private Function GetMultSymbolPos(ByRef Expression As String) As Long
1622-
Dim tmpResult As Long
1623-
Dim LStrOpenPos As Long
1624-
Dim LStrClosePos As Long
1625-
1626-
tmpResult = InStrB(1, Expression, op_mult)
1627-
LStrOpenPos = InStrB(1, Expression, d_Apostrophe)
1628-
If LStrOpenPos Then
1629-
LStrClosePos = InStrB(LStrOpenPos + 2, Expression, d_Apostrophe)
1630-
Do While (tmpResult > LStrOpenPos) And (tmpResult < LStrClosePos)
1631-
tmpResult = InStrB(tmpResult + 2, Expression, op_mult)
1632-
Loop
1633-
End If
1634-
GetMultSymbolPos = tmpResult
1635-
End Function
1636-
16371621
Private Sub GetOperand(ByRef CurToken As Token, ByRef CurArg As Argument, _
16381622
ByRef CurTree As ClusterTree, ByRef BaseIndex As Long)
16391623

@@ -1707,6 +1691,24 @@ Private Sub GetOperands(ByRef CurToken As Token, ByRef CurTree As ClusterTree, _
17071691
End If
17081692
End Sub
17091693

1694+
Private Function GetOPeratorSymbolPos(ByRef Expression As String, _
1695+
ByRef OperatorSymbol As String, _
1696+
Optional StartPosition As Long = 1) As Long
1697+
Dim tmpResult As Long
1698+
Dim LStrOpenPos As Long
1699+
Dim LStrClosePos As Long
1700+
1701+
tmpResult = InStrB(StartPosition, Expression, OperatorSymbol)
1702+
LStrOpenPos = InStrB(StartPosition, Expression, d_Apostrophe)
1703+
If LStrOpenPos Then
1704+
LStrClosePos = InStrB(LStrOpenPos + LenB(OperatorSymbol), Expression, d_Apostrophe)
1705+
Do While (tmpResult > LStrOpenPos) And (tmpResult < LStrClosePos)
1706+
tmpResult = InStrB(tmpResult + LenB(OperatorSymbol), Expression, OperatorSymbol)
1707+
Loop
1708+
End If
1709+
GetOPeratorSymbolPos = tmpResult
1710+
End Function
1711+
17101712
''' <summary>
17111713
''' Gets the operator given an operator token.
17121714
''' </summary>
@@ -1752,11 +1754,11 @@ End Function
17521754
Private Function GetPowerSymbolPos(ByRef Expression As String) As Long
17531755
Dim tmpPos As Long
17541756
Dim tmpResult As Long
1755-
1756-
tmpPos = InStrB(1, Expression, op_power)
1757+
1758+
tmpPos = GetOPeratorSymbolPos(Expression, op_power)
17571759
Do While tmpPos
17581760
tmpResult = tmpPos
1759-
tmpPos = InStrB(tmpResult + 2, Expression, op_power)
1761+
tmpPos = GetOPeratorSymbolPos(Expression, op_power)
17601762
Loop
17611763
GetPowerSymbolPos = tmpResult
17621764
End Function

0 commit comments

Comments
 (0)