auto-sync

This commit is contained in:
rusEfi 2017-01-18 14:02:31 -05:00
parent 047fdb72f3
commit 921d4ccdcc
4 changed files with 37 additions and 10 deletions

View File

@ -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)");

View File

@ -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());

View File

@ -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 +
'}';
}
} }

View File

@ -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) {