package net.ion.rosetta;
import junit.framework.TestCase;
import net.ion.rosetta.functors.Binary;
import net.ion.rosetta.functors.Map;
import net.ion.rosetta.node.BinaryExpression;
import net.ion.rosetta.node.Expression;
public class TestCondition extends TestCase {
public void testCal() throws Exception {
String source = "node.a > 3" ;
Condition.CONDITION.parse(source) ;
}
}
class Condition {
enum BinaryOperator implements Binary<Expression> {
GT {
public Expression map(Expression a, Expression b) {
return new BinaryExpression(a, b, ">");
}
},
GTE {
public Expression map(Expression a, Expression b) {
return new BinaryExpression(a, b, ">=");
}
}
}
static final Parser<Expression> STRING = Terminals.StringLiteral.PARSER.map(new Map<String, Expression>() {
public Expression map(String s) {
return Expression.create(s);
}
});
private static final Terminals OPERATORS = Terminals.operators(">", ">=", "(", ")");
static final Parser<Void> IGNORED = Parsers.or(Scanners.JAVA_LINE_COMMENT, Scanners.JAVA_BLOCK_COMMENT, Scanners.WHITESPACES).skipMany();
static final Parser<?> TOKENIZER = Parsers.or((Parser)Terminals.DecimalLiteral.TOKENIZER, OPERATORS.tokenizer());
static Parser<?> term(String... names) {
return OPERATORS.token(names);
}
static <T> Parser<T> op(String name, T value) {
return term(name).retn(value);
}
static Parser<Expression> condition(Parser<Expression> atom) {
Parser.Reference<Expression> ref = Parser.newReference();
Parser<Expression> unit = ref.lazy().between(term("("), term(")")).or(atom);
Parser<Expression> parser = new OperatorTable<Expression>().infixl(op(">", BinaryOperator.GT), 10).infixl(op(">=", BinaryOperator.GTE), 10).build(unit);
ref.set(parser);
return parser;
}
public static final Parser<Expression> CONDITION = condition(STRING).from(TOKENIZER, IGNORED);
}