mirror of https://github.com/rusefi/rusefi-1.git
auto-sync
This commit is contained in:
parent
047fdb72f3
commit
921d4ccdcc
|
@ -56,6 +56,8 @@ public class BracerParserTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBooleanConversion() throws ParseException {
|
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("2 1 >", "2 > 1");
|
||||||
assertParse("rpm 0 >", "rpm > false");
|
assertParse("rpm 0 >", "rpm > false");
|
||||||
assertParse("rpm 0 >", "(rpm > false)");
|
assertParse("rpm 0 >", "(rpm > false)");
|
||||||
|
|
|
@ -12,6 +12,7 @@ import java.util.*;
|
||||||
* @see <a href="../../../license.html">License information</a>
|
* @see <a href="../../../license.html">License information</a>
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractEvaluator<T> {
|
public abstract class AbstractEvaluator<T> {
|
||||||
|
private static final boolean DETAILED_LOGGER = false;
|
||||||
private final Tokenizer tokenizer;
|
private final Tokenizer tokenizer;
|
||||||
private final Map<String, Function> functions;
|
private final Map<String, Function> functions;
|
||||||
private final Map<String, List<Operator>> operators;
|
private final Map<String, List<Operator>> operators;
|
||||||
|
@ -23,7 +24,6 @@ public abstract class AbstractEvaluator<T> {
|
||||||
public final Stack<String> stackRPN = new Stack<String>() {
|
public final Stack<String> stackRPN = new Stack<String>() {
|
||||||
@Override
|
@Override
|
||||||
public String push(String t) {
|
public String push(String t) {
|
||||||
System.out.println("RPN push " + t);
|
|
||||||
return super.push(t);
|
return super.push(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ public abstract class AbstractEvaluator<T> {
|
||||||
values.push(value!=null ? value : toValue(literal, evaluationContext));
|
values.push(value!=null ? value : toValue(literal, evaluationContext));
|
||||||
} else if (token.isOperator()) {
|
} else if (token.isOperator()) {
|
||||||
Operator operator = token.getOperator();
|
Operator operator = token.getOperator();
|
||||||
stackRPN.push(operator.getRpnSymbol());
|
rpnPush("deq", operator.getRpnSymbol());
|
||||||
values.push(evaluate(operator, getArguments(values, operator.getOperandCount()), evaluationContext));
|
values.push(evaluate(operator, getArguments(values, operator.getOperandCount()), evaluationContext));
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
|
@ -236,14 +236,16 @@ public abstract class AbstractEvaluator<T> {
|
||||||
final Deque<T> values = new ArrayDeque<T>() {
|
final Deque<T> values = new ArrayDeque<T>() {
|
||||||
@Override
|
@Override
|
||||||
public void push(T t) {
|
public void push(T t) {
|
||||||
System.out.println("v push " + t);
|
if (DETAILED_LOGGER)
|
||||||
|
System.out.println("v push " + t);
|
||||||
super.push(t);
|
super.push(t);
|
||||||
}
|
}
|
||||||
}; // values stack
|
}; // values stack
|
||||||
final Deque<Token> stack = new ArrayDeque<Token>() {
|
final Deque<Token> stack = new ArrayDeque<Token>() {
|
||||||
@Override
|
@Override
|
||||||
public void push(Token t) {
|
public void push(Token t) {
|
||||||
System.out.println("fun push " + t);
|
if (DETAILED_LOGGER)
|
||||||
|
System.out.println("fun push " + t);
|
||||||
super.push(t);
|
super.push(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,7 +270,8 @@ public abstract class AbstractEvaluator<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (token.isCloseBracket()) {
|
} else if (token.isCloseBracket()) {
|
||||||
System.out.println("isCloseBracket");
|
if (DETAILED_LOGGER)
|
||||||
|
System.out.println("isCloseBracket");
|
||||||
if (previous==null) {
|
if (previous==null) {
|
||||||
throw new IllegalArgumentException("expression can't start with a close bracket");
|
throw new IllegalArgumentException("expression can't start with a close bracket");
|
||||||
}
|
}
|
||||||
|
@ -284,7 +287,8 @@ public abstract class AbstractEvaluator<T> {
|
||||||
Token sc = stack.pop();
|
Token sc = stack.pop();
|
||||||
if (sc.isOpenBracket()) {
|
if (sc.isOpenBracket()) {
|
||||||
if (sc.getBrackets().equals(brackets)) {
|
if (sc.getBrackets().equals(brackets)) {
|
||||||
System.out.println("close>isOpenBracket");
|
if (DETAILED_LOGGER)
|
||||||
|
System.out.println("close>isOpenBracket");
|
||||||
openBracketFound = true;
|
openBracketFound = true;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -300,7 +304,7 @@ public abstract class AbstractEvaluator<T> {
|
||||||
throw new IllegalArgumentException("Parentheses mismatched");
|
throw new IllegalArgumentException("Parentheses mismatched");
|
||||||
}
|
}
|
||||||
if (!stack.isEmpty() && stack.peek().isFunction()) {
|
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
|
// If the token at the top of the stack is a function token, pop it
|
||||||
// onto the output queue.
|
// onto the output queue.
|
||||||
int argCount = values.size()-previousValuesSize.pop();
|
int argCount = values.size()-previousValuesSize.pop();
|
||||||
|
@ -351,7 +355,7 @@ public abstract class AbstractEvaluator<T> {
|
||||||
if (sc.isOperator()
|
if (sc.isOperator()
|
||||||
&& ((token.getAssociativity().equals(Operator.Associativity.LEFT) && (token.getPrecedence() <= sc.getPrecedence())) ||
|
&& ((token.getAssociativity().equals(Operator.Associativity.LEFT) && (token.getPrecedence() <= sc.getPrecedence())) ||
|
||||||
(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;
|
// Pop o2 off the stack, onto the output queue;
|
||||||
output(values, stack.pop(), evaluationContext);
|
output(values, stack.pop(), evaluationContext);
|
||||||
} else {
|
} else {
|
||||||
|
@ -365,7 +369,7 @@ public abstract class AbstractEvaluator<T> {
|
||||||
if ((previous!=null) && previous.isLiteral()) {
|
if ((previous!=null) && previous.isLiteral()) {
|
||||||
throw new IllegalArgumentException("A literal can't follow another literal");
|
throw new IllegalArgumentException("A literal can't follow another literal");
|
||||||
}
|
}
|
||||||
stackRPN.push(token.getBooleanHackedLiteral());
|
rpnPush("boolean", token.getBooleanHackedLiteral());
|
||||||
output(values, token, evaluationContext);
|
output(values, token, evaluationContext);
|
||||||
}
|
}
|
||||||
previous = token;
|
previous = token;
|
||||||
|
@ -390,6 +394,12 @@ public abstract class AbstractEvaluator<T> {
|
||||||
return values.pop();
|
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() {
|
public String getRusEfi() {
|
||||||
List<String> list = new ArrayList<>(stackRPN);
|
List<String> list = new ArrayList<>(stackRPN);
|
||||||
ListIterator<String> li = list.listIterator(list.size());
|
ListIterator<String> li = list.listIterator(list.size());
|
||||||
|
|
|
@ -135,4 +135,15 @@ public class Operator {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Operator{" +
|
||||||
|
"rpnSymbol='" + rpnSymbol + '\'' +
|
||||||
|
", symbol='" + symbol + '\'' +
|
||||||
|
", precedence=" + precedence +
|
||||||
|
", operandCount=" + operandCount +
|
||||||
|
", associativity=" + associativity +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,11 +10,15 @@ import static org.junit.Assert.assertEquals;
|
||||||
public class ParserTest {
|
public class ParserTest {
|
||||||
@Test
|
@Test
|
||||||
public void testBooleanConversion() throws ParseException {
|
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("2 1 >", "2 > 1");
|
||||||
assertParse("rpm 0 >", "rpm > false");
|
assertParse("rpm 0 >", "rpm > false");
|
||||||
assertParse("rpm 0 >", "(rpm > false)");
|
assertParse("rpm 0 >", "(rpm > false)");
|
||||||
assertParse("rpm user0 > clt user2 > |", "(rpm > user0) or (clt > user2)");
|
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) {
|
private void assertParse(String rpn, String expression) {
|
||||||
|
|
Loading…
Reference in New Issue