@@ -1184,10 +1184,10 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
1184
1184
GetArithOpInfo.OperationToken = otPower
1185
1185
GetArithOpInfo.OperatorLen = LenB(op_power)
1186
1186
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)
1191
1191
If NonZero(MultSymbolPos, DivSymbolPos, ModSymbolPos, IntDivSymbolPos) Then
1192
1192
GetArithOpInfo.Position = MinNonZero(MultSymbolPos, DivSymbolPos, ModSymbolPos, IntDivSymbolPos) 'Priority to the first operator
1193
1193
Select Case GetArithOpInfo.Position
@@ -1205,9 +1205,9 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
1205
1205
GetArithOpInfo.OperatorLen = LenB(op_mod)
1206
1206
End Select
1207
1207
Else 'Addition and subtraction
1208
- AddSymbolPos = InStrB( 1 , Expression, op_plus)
1208
+ AddSymbolPos = GetOPeratorSymbolPos( Expression, op_plus)
1209
1209
If AddSymbolPos = 1 Then 'Unary symbol
1210
- AddSymbolPos = InStrB( AddSymbolPos + 2 , Expression, op_plus )
1210
+ AddSymbolPos = GetOPeratorSymbolPos(Expression, op_plus, AddSymbolPos + 2 )
1211
1211
End If
1212
1212
If AddSymbolPos Then
1213
1213
tmpPos = AddSymbolPos - 2
@@ -1231,7 +1231,7 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
1231
1231
End If
1232
1232
tmpStr = MidB$(Expression, tmpPos, AddSymbolPos - tmpPos)
1233
1233
If GetFunctionName(tmpStr) <> vbNullString Or tmpStr = "E" Then
1234
- AddSymbolPos = InStrB( AddSymbolPos + 2 , Expression, op_plus )
1234
+ AddSymbolPos = GetOPeratorSymbolPos(Expression, op_plus, AddSymbolPos + 2 )
1235
1235
Else
1236
1236
Exit Do
1237
1237
End If
@@ -1240,9 +1240,9 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
1240
1240
End If
1241
1241
Loop
1242
1242
End If
1243
- SubtSymbolPos = InStrB( 1 , Expression, op_minus)
1243
+ SubtSymbolPos = GetOPeratorSymbolPos( Expression, op_minus)
1244
1244
If SubtSymbolPos = 1 Then
1245
- SubtSymbolPos = InStrB( SubtSymbolPos + 2 , Expression, op_minus )
1245
+ SubtSymbolPos = GetOPeratorSymbolPos(Expression, op_minus, SubtSymbolPos + 2 )
1246
1246
End If
1247
1247
If SubtSymbolPos Then
1248
1248
tmpPos = SubtSymbolPos - 2
@@ -1266,7 +1266,7 @@ Private Function GetArithOpInfo(ByRef Expression As String) As TokenInfo
1266
1266
End If
1267
1267
tmpStr = MidB$(Expression, tmpPos, SubtSymbolPos - tmpPos)
1268
1268
If GetFunctionName(tmpStr) <> vbNullString Or tmpStr = "E" Then
1269
- SubtSymbolPos = InStrB( SubtSymbolPos + 2 , Expression, op_minus )
1269
+ SubtSymbolPos = GetOPeratorSymbolPos(Expression, op_minus, SubtSymbolPos + 2 )
1270
1270
Else
1271
1271
Exit Do
1272
1272
End If
@@ -1494,32 +1494,32 @@ Private Function GetLCOpInfo(ByRef Expression As String) As TokenInfo
1494
1494
'@--------------------------------------------------------------------
1495
1495
' Comparisons first
1496
1496
Do 'Discard false positives
1497
- EqualSymbolPos = InStrB( EqualSymbolPos + 1 , Expression, op_equal )
1497
+ EqualSymbolPos = GetOPeratorSymbolPos(Expression, op_equal, EqualSymbolPos + 1 )
1498
1498
If EqualSymbolPos > 2 Then
1499
1499
testChar = MidB$(Expression, EqualSymbolPos - 2 , 2 )
1500
1500
Else
1501
1501
testChar = vbNullString
1502
1502
End If
1503
1503
Loop While EqualSymbolPos > 0 And testChar Like "[<>]"
1504
- NotEqualSymbolPos = InStrB( 1 , Expression, op_inequality)
1504
+ NotEqualSymbolPos = GetOPeratorSymbolPos( Expression, op_inequality)
1505
1505
Do
1506
- GreatterThanSymbolPos = InStrB( GreatterThanSymbolPos + 1 , Expression, op_gt )
1506
+ GreatterThanSymbolPos = GetOPeratorSymbolPos(Expression, op_gt, GreatterThanSymbolPos + 1 )
1507
1507
If GreatterThanSymbolPos Then
1508
1508
testChar = MidB$(Expression, GreatterThanSymbolPos + 2 , 2 )
1509
1509
Else
1510
1510
testChar = vbNullString
1511
1511
End If
1512
1512
Loop While GreatterThanSymbolPos > 0 And testChar = op_equal
1513
1513
Do
1514
- LessThanSymbolPos = InStrB( LessThanSymbolPos + 1 , Expression, op_lt )
1514
+ LessThanSymbolPos = GetOPeratorSymbolPos(Expression, op_lt, LessThanSymbolPos + 1 )
1515
1515
If LessThanSymbolPos Then
1516
1516
testChar = MidB$(Expression, LessThanSymbolPos + 2 , 2 )
1517
1517
Else
1518
1518
testChar = vbNullString
1519
1519
End If
1520
1520
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)
1523
1523
LikeSymbolPos = InStrB(LessThanSymbolPos + 1 , Expression, op_like)
1524
1524
If NonZero(EqualSymbolPos, NotEqualSymbolPos, GreatterThanSymbolPos, _
1525
1525
LessThanSymbolPos, GreatterOrEqualSymbolPos, LessOrEqualSymbolPos, LikeSymbolPos) Then
@@ -1554,20 +1554,20 @@ Private Function GetLCOpInfo(ByRef Expression As String) As TokenInfo
1554
1554
Else
1555
1555
'@--------------------------------------------------------------------
1556
1556
' 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 )
1558
1558
If NonZero(LogANDSymbolPos) Then
1559
1559
GetLCOpInfo.Position = LogANDSymbolPos
1560
1560
GetLCOpInfo.OperationToken = otLogicalAND
1561
1561
GetLCOpInfo.OperatorLen = LenB(op_and)
1562
1562
Else
1563
- LogXORSymbolPos = InStrB( LogXORSymbolPos + 1 , Expression, op_xor )
1563
+ LogXORSymbolPos = GetOPeratorSymbolPos(Expression, op_xor, LogXORSymbolPos + 1 )
1564
1564
If NonZero(LogXORSymbolPos) Then
1565
1565
GetLCOpInfo.Position = LogXORSymbolPos
1566
1566
GetLCOpInfo.OperationToken = otLogicalXOR
1567
1567
GetLCOpInfo.OperatorLen = LenB(op_xor)
1568
1568
Else
1569
1569
Do 'Discard false positives: "||"
1570
- LogORSymbolPos = InStrB( LogORSymbolPos + 1 , Expression, op_or )
1570
+ LogORSymbolPos = GetOPeratorSymbolPos(Expression, op_or, LogORSymbolPos + 1 )
1571
1571
If LogORSymbolPos Then
1572
1572
testChar = MidB$(Expression, LogORSymbolPos + 2 , 2 )
1573
1573
Else
@@ -1618,22 +1618,6 @@ Private Function GetLParentPos(ByRef Expression As String, ByRef RelativePositio
1618
1618
GetLParentPos = tmpResult
1619
1619
End Function
1620
1620
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
-
1637
1621
Private Sub GetOperand (ByRef CurToken As Token , ByRef CurArg As Argument , _
1638
1622
ByRef CurTree As ClusterTree , ByRef BaseIndex As Long )
1639
1623
@@ -1707,6 +1691,24 @@ Private Sub GetOperands(ByRef CurToken As Token, ByRef CurTree As ClusterTree, _
1707
1691
End If
1708
1692
End Sub
1709
1693
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
+
1710
1712
''' <summary>
1711
1713
''' Gets the operator given an operator token.
1712
1714
''' </summary>
@@ -1752,11 +1754,11 @@ End Function
1752
1754
Private Function GetPowerSymbolPos (ByRef Expression As String ) As Long
1753
1755
Dim tmpPos As Long
1754
1756
Dim tmpResult As Long
1755
-
1756
- tmpPos = InStrB( 1 , Expression, op_power)
1757
+
1758
+ tmpPos = GetOPeratorSymbolPos( Expression, op_power)
1757
1759
Do While tmpPos
1758
1760
tmpResult = tmpPos
1759
- tmpPos = InStrB(tmpResult + 2 , Expression, op_power)
1761
+ tmpPos = GetOPeratorSymbolPos( Expression, op_power)
1760
1762
Loop
1761
1763
GetPowerSymbolPos = tmpResult
1762
1764
End Function
0 commit comments