@@ -23,6 +23,7 @@ public class ExpressionCalculator
23
23
private static final String AND_OPERATOR = "и" ;
24
24
private static final String OR_OPERATOR = "или" ;
25
25
private static final String IN_OPERATOR = "в" ;
26
+ private static final String NOT_EQUAL_OPERATOR = "<>" ;
26
27
27
28
private static final char QUOTE_CHAR = '"' ;
28
29
private static final char SINGLE_QUOTE_CHAR = '\'' ;
@@ -166,8 +167,26 @@ else if (IN_OPERATOR.equalsIgnoreCase(tokenizer.sval))
166
167
break ;
167
168
168
169
case LESSER_OPERATOR :
169
- calculationStack .pushOperator (ExpressionOperator .COMPARE_LESSER );
170
- context = OPERATOR ;
170
+ // check it's not not equal <>
171
+ int nextToken = tokenizer .nextToken ();
172
+ if (nextToken == GREATER_OPERATOR ) // is't <> !
173
+ {
174
+ switch (context )
175
+ {
176
+ case OPERAND :
177
+ calculationStack .pushOperator (ExpressionOperator .COMPARE_NOT_EQUALITY );
178
+ context = OPERATOR ;
179
+ break ;
180
+ default :
181
+ throw new IFML2ExpressionException ("Ошибка в выражении: {0} может следовать только за операндом" ,
182
+ NOT_EQUAL_OPERATOR );
183
+ }
184
+ }
185
+ else {
186
+ tokenizer .pushBack (); // it's not <> so process next
187
+ calculationStack .pushOperator (ExpressionOperator .COMPARE_LESSER );
188
+ context = OPERATOR ;
189
+ }
171
190
break ;
172
191
173
192
case ADD_OPERATOR :
@@ -229,10 +248,12 @@ private enum ExpressionOperator
229
248
NOT (NOT_OPERATOR , OperatorType .UNARY_RIGHT , 40 ),
230
249
ADD (ADD_OPERATOR , 30 ),
231
250
COMPARE_EQUALITY (EQUALITY_OPERATOR , 20 ),
251
+ COMPARE_NOT_EQUALITY (NOT_EQUAL_OPERATOR , OperatorType .BINARY , 20 ),
232
252
COMPARE_GREATER (GREATER_OPERATOR , 20 ),
233
253
COMPARE_LESSER (LESSER_OPERATOR , 20 ),
234
254
AND (AND_OPERATOR , OperatorType .BINARY , 10 ),
235
255
OR (OR_OPERATOR , OperatorType .BINARY , 5 );
256
+
236
257
public final char operatorCharacter ;
237
258
public final int priority ;
238
259
public String operatorString ;
@@ -380,6 +401,34 @@ private Value doOperation(ExpressionOperator operator) throws IFML2Exception
380
401
break ;
381
402
}
382
403
404
+ case COMPARE_NOT_EQUALITY :
405
+ {
406
+ Value resolvedLeftValue = ensureValueResolved (leftValue );
407
+ Value resolvedRightValue = ensureValueResolved (rightValue );
408
+
409
+ assert resolvedLeftValue != null ;
410
+
411
+ Value .CompareResult compareResult = resolvedLeftValue .compareTo (resolvedRightValue );
412
+ switch (compareResult )
413
+ {
414
+ case EQUAL :
415
+ result = new BooleanValue (false );
416
+ break ;
417
+ case UNEQUAL :
418
+ case LEFT_BIGGER :
419
+ case RIGHT_BIGGER :
420
+ result = new BooleanValue (true );
421
+ break ;
422
+ case NOT_APPLICABLE :
423
+ throw new IFML2ExpressionException ("Сравниваемые величины разного типа ({0} и {1})" , leftValue , rightValue );
424
+
425
+ default :
426
+ throw new IFML2VMException ("Неизвестный результат сравнения величин ({0})" , compareResult );
427
+ }
428
+
429
+ break ;
430
+ }
431
+
383
432
case COMPARE_GREATER :
384
433
{
385
434
Value resolvedLeftValue = ensureValueResolved (leftValue );
0 commit comments