Skip to content

Commit b4eaa4b

Browse files
committed
Support for double equality symbol (==)
1 parent d473b07 commit b4eaa4b

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

src/VBAexpressions.cls

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ Option Base 0
119119
'
120120
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
121121
' CONSTANTS:
122-
Private pi As Double
122+
Private PI As Double
123123
Private PID2 As Double
124124
Private e As Double
125125
Private Const op_plus As String = "+"
@@ -131,6 +131,7 @@ Private Const op_Factorial As String = "!"
131131
Private Const op_mod As String = "%"
132132
Private Const op_power As String = "^"
133133
Private Const op_equal As String = "="
134+
Private Const op_equal_ As String = "=="
134135
Private Const op_inequality As String = "<>"
135136
Private Const op_gt As String = ">"
136137
Private Const op_lt As String = "<"
@@ -217,12 +218,13 @@ Public Enum OperatorToken
217218
otPower = 6 '^
218219
otMod = 7 '%
219220
otEqual = 101 '=
220-
otNotEqual = 102 '<>
221-
otGreaterThan = 103 '>
222-
otLessThan = 104 '<
223-
otGreaterThanOrEqual = 105 '>=
224-
otLessThanOrEqual = 106 '<=
225-
otLike = 107 '$
221+
otEqual_ = 102 '==
222+
otNotEqual = 103 '<>
223+
otGreaterThan = 104 '>
224+
otLessThan = 105 '<
225+
otGreaterThanOrEqual = 106 '>=
226+
otLessThanOrEqual = 107 '<=
227+
otLike = 108 '$
226228
otLogicalAND = 201 '&
227229
otLogicalOR = 202 '|
228230
otLogicalXOR = 203 '||
@@ -1705,7 +1707,7 @@ Private Sub BottomLevelEval(ByRef aToken As token)
17051707
Else
17061708
If aToken.OperationToken < 200 Then 'Comparison operators
17071709
Select Case aToken.OperationToken
1708-
Case OperatorToken.otEqual
1710+
Case OperatorToken.otEqual, OperatorToken.otEqual_
17091711
aToken.EvalResult = (CastOPtype(aToken.Arg1.Operand, aToken.Arg1.NegationFlagOn) = _
17101712
CastOPtype(aToken.Arg2.Operand, aToken.Arg2.NegationFlagOn))
17111713
Case OperatorToken.otNotEqual
@@ -4053,24 +4055,29 @@ Private Function GetLCOpInfo(ByRef expression As String) As TokenInfo
40534055
Dim GreatterOrEqualSymbolPos As Long
40544056
Dim LessOrEqualSymbolPos As Long
40554057
Dim EqualSymbolPos As Long
4058+
Dim EqualSymbolPos_ As Long
40564059
Dim LessThanSymbolPos As Long
40574060
Dim GreatterThanSymbolPos As Long
40584061
Dim LogANDSymbolPos As Long
40594062
Dim LogORSymbolPos As Long
40604063
Dim LogXORSymbolPos As Long
40614064
Dim LikeSymbolPos As Long
40624065
Dim testChar As String
4066+
Dim testChar2 As String
40634067

40644068
'@--------------------------------------------------------------------
40654069
' Comparisons first
40664070
Do 'Discard false positives
40674071
EqualSymbolPos = GetOPeratorSymbolPos(expression, op_equal, EqualSymbolPos + 1)
40684072
If EqualSymbolPos > 2 Then
40694073
testChar = MidB$(expression, EqualSymbolPos - 2, 2)
4074+
testChar2 = MidB$(expression, EqualSymbolPos + 2, 2) 'Check ahead for "=="
40704075
Else
40714076
testChar = vbNullString
4077+
testChar2 = vbNullString
40724078
End If
4073-
Loop While EqualSymbolPos > 0 And testChar Like "[<>]"
4079+
Loop While EqualSymbolPos > 0 And (testChar Like "[<>=]" Or testChar2 = op_equal)
4080+
EqualSymbolPos_ = GetOPeratorSymbolPos(expression, op_equal_)
40744081
NotEqualSymbolPos = GetOPeratorSymbolPos(expression, op_inequality)
40754082
Do
40764083
GreatterThanSymbolPos = GetOPeratorSymbolPos(expression, op_gt, GreatterThanSymbolPos + 1)
@@ -4091,15 +4098,18 @@ Private Function GetLCOpInfo(ByRef expression As String) As TokenInfo
40914098
GreatterOrEqualSymbolPos = GetOPeratorSymbolPos(expression, op_gtequal)
40924099
LessOrEqualSymbolPos = GetOPeratorSymbolPos(expression, op_ltequal)
40934100
LikeSymbolPos = InStrB(LessThanSymbolPos + 1, expression, op_like)
4094-
If NonZero(EqualSymbolPos, NotEqualSymbolPos, GreatterThanSymbolPos, _
4101+
If NonZero(EqualSymbolPos, EqualSymbolPos_, NotEqualSymbolPos, GreatterThanSymbolPos, _
40954102
LessThanSymbolPos, GreatterOrEqualSymbolPos, LessOrEqualSymbolPos, LikeSymbolPos) Then
4096-
GetLCOpInfo.Position = MinNonZero(EqualSymbolPos, NotEqualSymbolPos, GreatterThanSymbolPos, _
4103+
GetLCOpInfo.Position = MinNonZero(EqualSymbolPos, EqualSymbolPos_, NotEqualSymbolPos, GreatterThanSymbolPos, _
40974104
LessThanSymbolPos, GreatterOrEqualSymbolPos, LessOrEqualSymbolPos, _
40984105
LikeSymbolPos) 'Priority to the first operator
40994106
Select Case GetLCOpInfo.Position
41004107
Case EqualSymbolPos
41014108
GetLCOpInfo.OperationToken = otEqual
41024109
GetLCOpInfo.OperatorLen = LenB(op_equal)
4110+
Case EqualSymbolPos_
4111+
GetLCOpInfo.OperationToken = otEqual_
4112+
GetLCOpInfo.OperatorLen = LenB(op_equal_)
41034113
Case NotEqualSymbolPos
41044114
GetLCOpInfo.OperationToken = otNotEqual
41054115
GetLCOpInfo.OperatorLen = LenB(op_inequality)
@@ -4287,6 +4297,7 @@ Private Function GetOpSymbol(ByRef OPtoken As OperatorToken) As String
42874297
Case OperatorToken.otMod: GetOpSymbol = op_mod
42884298
Case OperatorToken.otPower: GetOpSymbol = op_power
42894299
Case OperatorToken.otEqual: GetOpSymbol = op_equal
4300+
Case OperatorToken.otEqual_: GetOpSymbol = op_equal_
42904301
Case OperatorToken.otNotEqual: GetOpSymbol = op_inequality
42914302
Case OperatorToken.otGreaterThan: GetOpSymbol = op_gt
42924303
Case OperatorToken.otLessThan: GetOpSymbol = op_lt
@@ -9097,6 +9108,4 @@ err_Handler:
90979108
Zero = e_ValueError
90989109
BuildErrMessage errEvalError, d_lCurly & fName & d_rCurly & " | Error#: " & err.Number & d_Space & _
90999110
d_lParenthesis & err.Description & d_rParenthesis
9100-
End Function
9101-
9102-
9111+
End Function

0 commit comments

Comments
 (0)