Skip to content

Commit 0fbe9c9

Browse files
committed
[Движок] Добавлена поддержка операции неравенства ("<>") в выражениях.
#ifml2-382639 Fix, Fix version 2016.3
1 parent 2e5c9d8 commit 0fbe9c9

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

docs/notes.txt

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
+ [Движок] Добавлены системные переменные "секунды" и "минуты", возвращающие кол-во время
2222
с начала игры. При перезапуске игры время обнуляется.
2323
+ [Движок] Добавлена поддержка операций сравнения (">" и "<") в выражениях.
24+
+ [Движок] Добавлена поддержка операции неравенства ("<>") в выражениях.
2425

2526
-----------------------------------------------------------------------------------------------
2627
Выпуск 2016/2.1

src/ifml2/vm/ExpressionCalculator.java

+51-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class ExpressionCalculator
2323
private static final String AND_OPERATOR = "и";
2424
private static final String OR_OPERATOR = "или";
2525
private static final String IN_OPERATOR = "в";
26+
private static final String NOT_EQUAL_OPERATOR = "<>";
2627

2728
private static final char QUOTE_CHAR = '"';
2829
private static final char SINGLE_QUOTE_CHAR = '\'';
@@ -166,8 +167,26 @@ else if (IN_OPERATOR.equalsIgnoreCase(tokenizer.sval))
166167
break;
167168

168169
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+
}
171190
break;
172191

173192
case ADD_OPERATOR:
@@ -229,10 +248,12 @@ private enum ExpressionOperator
229248
NOT(NOT_OPERATOR, OperatorType.UNARY_RIGHT, 40),
230249
ADD(ADD_OPERATOR, 30),
231250
COMPARE_EQUALITY(EQUALITY_OPERATOR, 20),
251+
COMPARE_NOT_EQUALITY(NOT_EQUAL_OPERATOR, OperatorType.BINARY, 20),
232252
COMPARE_GREATER(GREATER_OPERATOR, 20),
233253
COMPARE_LESSER(LESSER_OPERATOR, 20),
234254
AND(AND_OPERATOR, OperatorType.BINARY, 10),
235255
OR(OR_OPERATOR, OperatorType.BINARY, 5);
256+
236257
public final char operatorCharacter;
237258
public final int priority;
238259
public String operatorString;
@@ -380,6 +401,34 @@ private Value doOperation(ExpressionOperator operator) throws IFML2Exception
380401
break;
381402
}
382403

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+
383432
case COMPARE_GREATER:
384433
{
385434
Value resolvedLeftValue = ensureValueResolved(leftValue);

0 commit comments

Comments
 (0)