public Object getLiteralValue(EvaluatorState state) { assert isLiteral(); if (type == Type.IDENT) { return state.getBinding(value); } else if (type == Type.STRING) { return value; } else if (type == Type.NUMERIC) { try { return Double.valueOf(value); } catch (NumberFormatException e) { throw new IllegalStateException(e); } } else if (type == Type.BOOLEAN) { return Boolean.valueOf(value); } else { throw new IllegalStateException(); } }
@Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append(getType().toString()); if (isLiteral() && (getValue() != null)) { sb.append('('); sb.append(getValue()); sb.append(')'); } return sb.toString(); }
public int length() { if (isLiteral()) { assert value != null; return value.length(); } else return getType().shorthand().length(); }
if (consume && (t != null)) { int p1 = p0; if (!t.isLiteral()) p1 += t.length(); else
private void parsePrimary() { Token t0 = state.next(); if (t0 == null) { state.error(); } else if (t0.isLiteral()) { state.consume(); Token t1 = state.next(); if (t1 == Token.OPEN) { state.pushOperator(Operator.APPLY); state.pushOperand(t0); parseArguments(); } else state.pushOperand(t0); } else if (t0 == Token.OPEN) { state.consume(); state.operators().push(Operator.SENTINEL); parseExpression(); state.expect(Token.CLOSE); state.operators.pop(); } else if (t0.isUnaryOp()) { state.consume(); state.pushOperator(Operator.fromToken(t0, OperatorContext.UNARY)); parsePrimary(); } else state.error(t0); }
void pushOperand(Token t) { assert t.isLiteral(); pushOperand(new Expression(Operator.LITERAL, t)); }
private Object evaluate(EvaluatorState state, Operator operator, Object o0) { assert o0 instanceof Token; Token t = (Token) o0; if (operator == Operator.LITERAL) { assert t.isLiteral(); return t.getLiteralValue(state); } else throw new IllegalStateException(); }