@@ -1378,11 +1378,7 @@ Private Function GetEvalToken(ByRef Expression As String) As Token
1378
1378
GetTokenStart Expression, TokenDet.Position, TokenStart
1379
1379
'@--------------------------------------------------------------------
1380
1380
' Find token end
1381
- If TokenDet.OperationToken <> otLike Then
1382
- GetTokenEnd Expression, TokenDet.Position, TokenDet.OperatorLen, TokenEnd
1383
- Else
1384
- GetTokenEnd Expression, InStrB(TokenDet.Position + 4 , Expression, d_Apostrophe), TokenDet.OperatorLen, TokenEnd
1385
- End If
1381
+ GetTokenEnd Expression, TokenDet.Position, TokenDet.OperatorLen, TokenEnd
1386
1382
'@--------------------------------------------------------------------
1387
1383
' Fill token data
1388
1384
GetEvalToken.DefString = MidB$(Expression, TokenStart, TokenEnd - TokenStart + 2 )
@@ -1691,6 +1687,19 @@ Private Sub GetOperands(ByRef CurToken As Token, ByRef CurTree As ClusterTree, _
1691
1687
End If
1692
1688
End Sub
1693
1689
1690
+ Private Function IsSymbolInLiteralString (ByRef Expression As String , SymbolPos As Long ) As Boolean
1691
+ Dim flagCounter As Long
1692
+ Dim tmpPos As Long
1693
+
1694
+ tmpPos = InStrB(1 , Expression, d_Apostrophe)
1695
+ If tmpPos Then
1696
+ Do While tmpPos < SymbolPos
1697
+ flagCounter = flagCounter + 1
1698
+ tmpPos = InStrB(tmpPos + 2 , Expression, d_Apostrophe)
1699
+ Loop
1700
+ End If
1701
+ IsSymbolInLiteralString = flagCounter And 1
1702
+ End Function
1694
1703
Private Function GetOPeratorSymbolPos (ByRef Expression As String , _
1695
1704
ByRef OperatorSymbol As String , _
1696
1705
Optional StartPosition As Long = 1 ) As Long
@@ -1699,13 +1708,9 @@ Private Function GetOPeratorSymbolPos(ByRef Expression As String, _
1699
1708
Dim LStrClosePos As Long
1700
1709
1701
1710
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
1711
+ Do While IsSymbolInLiteralString(Expression, tmpResult)
1712
+ tmpResult = InStrB(tmpResult + LenB(OperatorSymbol), Expression, OperatorSymbol)
1713
+ Loop
1709
1714
GetOPeratorSymbolPos = tmpResult
1710
1715
End Function
1711
1716
@@ -1758,7 +1763,7 @@ Private Function GetPowerSymbolPos(ByRef Expression As String) As Long
1758
1763
tmpPos = GetOPeratorSymbolPos(Expression, op_power)
1759
1764
Do While tmpPos
1760
1765
tmpResult = tmpPos
1761
- tmpPos = GetOPeratorSymbolPos(Expression, op_power)
1766
+ tmpPos = GetOPeratorSymbolPos(Expression, op_power, tmpPos )
1762
1767
Loop
1763
1768
GetPowerSymbolPos = tmpResult
1764
1769
End Function
@@ -1881,6 +1886,15 @@ Private Sub GetTokenEnd(ByRef Expression As String, ByRef startIndex As Long, By
1881
1886
lenExpr = LenB(Expression)
1882
1887
outLng = startIndex + OPlen
1883
1888
curChar = MidB$(Expression, outLng, 2 )
1889
+ '@--------------------------------------------------------------------
1890
+ ' Skip literal strings
1891
+ If curChar = d_Apostrophe Then
1892
+ Do
1893
+ outLng = outLng + 2
1894
+ curChar = MidB$(Expression, outLng, 2 )
1895
+ Loop While curChar <> d_Apostrophe And outLng < lenExpr
1896
+ If outLng >= lenExpr Then Exit Sub
1897
+ End If
1884
1898
Do
1885
1899
tmpPos = outLng
1886
1900
If IsLetter(curChar) Then 'Check for functions [ arg/-funct(...) ] and Sci notation
@@ -1952,10 +1966,17 @@ End Function
1952
1966
Private Sub GetTokenStart (ByRef Expression As String , ByRef startIndex As Long , ByRef outLng As Long )
1953
1967
Dim curChar As String
1954
1968
1955
- '@--------------------------------------------------------------------
1956
- ' Find token start
1957
1969
outLng = startIndex - 2
1958
1970
curChar = MidB$(Expression, outLng, 2 )
1971
+ '@--------------------------------------------------------------------
1972
+ ' Skip literal strings
1973
+ If curChar = d_Apostrophe Then
1974
+ Do
1975
+ outLng = outLng - 2
1976
+ curChar = MidB$(Expression, outLng, 2 )
1977
+ Loop While curChar <> d_Apostrophe And outLng > 1
1978
+ If outLng = 1 Then Exit Sub
1979
+ End If
1959
1980
Do While (InStrB(1 , op_AllItems, curChar) = 0 ) And outLng > 1
1960
1981
outLng = outLng - 2
1961
1982
curChar = MidB$(Expression, outLng, 2 )
0 commit comments