@@ -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
16191619End 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-
16371621Private 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
17081692End 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
17521754Private 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
17621764End Function
0 commit comments