diff --git a/java_console/models/src/com/autsia/bracer/test/BracerParserTest.java b/java_console/models/src/com/autsia/bracer/test/BracerParserTest.java
index 16bb51d86c..5adc1d86ad 100644
--- a/java_console/models/src/com/autsia/bracer/test/BracerParserTest.java
+++ b/java_console/models/src/com/autsia/bracer/test/BracerParserTest.java
@@ -56,6 +56,8 @@ public class BracerParserTest {
@Test
public void testBooleanConversion() throws ParseException {
+ assertParse("1 2 + 3 -", "1 + 2 - 3");
+ assertParse("1 2 | 3 |", "1 | 2 | 3");
assertParse("2 1 >", "2 > 1");
assertParse("rpm 0 >", "rpm > false");
assertParse("rpm 0 >", "(rpm > false)");
diff --git a/java_console/models/src/com/fathzer/soft/javaluator/AbstractEvaluator.java b/java_console/models/src/com/fathzer/soft/javaluator/AbstractEvaluator.java
index e3e9e7e45d..8e51dbdddc 100644
--- a/java_console/models/src/com/fathzer/soft/javaluator/AbstractEvaluator.java
+++ b/java_console/models/src/com/fathzer/soft/javaluator/AbstractEvaluator.java
@@ -12,6 +12,7 @@ import java.util.*;
* @see License information
*/
public abstract class AbstractEvaluator {
+ private static final boolean DETAILED_LOGGER = false;
private final Tokenizer tokenizer;
private final Map functions;
private final Map> operators;
@@ -23,7 +24,6 @@ public abstract class AbstractEvaluator {
public final Stack stackRPN = new Stack() {
@Override
public String push(String t) {
- System.out.println("RPN push " + t);
return super.push(t);
}
@@ -137,7 +137,7 @@ public abstract class AbstractEvaluator {
values.push(value!=null ? value : toValue(literal, evaluationContext));
} else if (token.isOperator()) {
Operator operator = token.getOperator();
- stackRPN.push(operator.getRpnSymbol());
+ rpnPush("deq", operator.getRpnSymbol());
values.push(evaluate(operator, getArguments(values, operator.getOperandCount()), evaluationContext));
} else {
throw new IllegalArgumentException();
@@ -236,14 +236,16 @@ public abstract class AbstractEvaluator {
final Deque values = new ArrayDeque() {
@Override
public void push(T t) {
- System.out.println("v push " + t);
+ if (DETAILED_LOGGER)
+ System.out.println("v push " + t);
super.push(t);
}
}; // values stack
final Deque stack = new ArrayDeque() {
@Override
public void push(Token t) {
- System.out.println("fun push " + t);
+ if (DETAILED_LOGGER)
+ System.out.println("fun push " + t);
super.push(t);
}
@@ -268,7 +270,8 @@ public abstract class AbstractEvaluator {
}
}
} else if (token.isCloseBracket()) {
- System.out.println("isCloseBracket");
+ if (DETAILED_LOGGER)
+ System.out.println("isCloseBracket");
if (previous==null) {
throw new IllegalArgumentException("expression can't start with a close bracket");
}
@@ -284,7 +287,8 @@ public abstract class AbstractEvaluator {
Token sc = stack.pop();
if (sc.isOpenBracket()) {
if (sc.getBrackets().equals(brackets)) {
- System.out.println("close>isOpenBracket");
+ if (DETAILED_LOGGER)
+ System.out.println("close>isOpenBracket");
openBracketFound = true;
break;
} else {
@@ -300,7 +304,7 @@ public abstract class AbstractEvaluator {
throw new IllegalArgumentException("Parentheses mismatched");
}
if (!stack.isEmpty() && stack.peek().isFunction()) {
- stackRPN.push(stack.peek().getLiteral());
+ rpnPush("function", stack.peek().getLiteral());
// If the token at the top of the stack is a function token, pop it
// onto the output queue.
int argCount = values.size()-previousValuesSize.pop();
@@ -351,7 +355,7 @@ public abstract class AbstractEvaluator {
if (sc.isOperator()
&& ((token.getAssociativity().equals(Operator.Associativity.LEFT) && (token.getPrecedence() <= sc.getPrecedence())) ||
(token.getPrecedence() < sc.getPrecedence()))) {
- stackRPN.push(sc.getOperator().getRpnSymbol());
+// rpnPush("op1", sc.getOperator().getRpnSymbol());
// Pop o2 off the stack, onto the output queue;
output(values, stack.pop(), evaluationContext);
} else {
@@ -365,7 +369,7 @@ public abstract class AbstractEvaluator {
if ((previous!=null) && previous.isLiteral()) {
throw new IllegalArgumentException("A literal can't follow another literal");
}
- stackRPN.push(token.getBooleanHackedLiteral());
+ rpnPush("boolean", token.getBooleanHackedLiteral());
output(values, token, evaluationContext);
}
previous = token;
@@ -390,6 +394,12 @@ public abstract class AbstractEvaluator {
return values.pop();
}
+ private void rpnPush(String msg, String s) {
+ if (DETAILED_LOGGER)
+ System.out.println("RPN push " + msg + ": " + s);
+ stackRPN.push(s);
+ }
+
public String getRusEfi() {
List list = new ArrayList<>(stackRPN);
ListIterator li = list.listIterator(list.size());
diff --git a/java_console/models/src/com/fathzer/soft/javaluator/Operator.java b/java_console/models/src/com/fathzer/soft/javaluator/Operator.java
index e3c654bbe5..da29957954 100644
--- a/java_console/models/src/com/fathzer/soft/javaluator/Operator.java
+++ b/java_console/models/src/com/fathzer/soft/javaluator/Operator.java
@@ -135,4 +135,15 @@ public class Operator {
}
return true;
}
+
+ @Override
+ public String toString() {
+ return "Operator{" +
+ "rpnSymbol='" + rpnSymbol + '\'' +
+ ", symbol='" + symbol + '\'' +
+ ", precedence=" + precedence +
+ ", operandCount=" + operandCount +
+ ", associativity=" + associativity +
+ '}';
+ }
}
\ No newline at end of file
diff --git a/java_console/models/src/com/rusefi/test/ParserTest.java b/java_console/models/src/com/rusefi/test/ParserTest.java
index a8fe996977..d0cb829d91 100644
--- a/java_console/models/src/com/rusefi/test/ParserTest.java
+++ b/java_console/models/src/com/rusefi/test/ParserTest.java
@@ -10,11 +10,15 @@ import static org.junit.Assert.assertEquals;
public class ParserTest {
@Test
public void testBooleanConversion() throws ParseException {
+ assertParse("1 2 + 3 -", "1 + 2 - 3");
+ assertParse("1 2 | 3 |", "1 | 2 | 3");
+
assertParse("2 1 >", "2 > 1");
assertParse("rpm 0 >", "rpm > false");
assertParse("rpm 0 >", "(rpm > false)");
assertParse("rpm user0 > clt user2 > |", "(rpm > user0) or (clt > user2)");
-//todo assertParse("rpm user0 > clt user2 > | vbatt user1 > |", "(rpm > user0) or (clt > user2) or (vbatt > user1)");
+ assertParse("1 2 | 3 |", "1 | 2 | 3");
+ assertParse("rpm user0 > clt user2 > | vbatt user1 > |", "(rpm > user0) or (clt > user2) or (vbatt > user1)");
}
private void assertParse(String rpn, String expression) {