Expression AndExpression() { Expression ret = EqualityExpression(); while (Current.TokenKind == TokenKind.OpAnd) { Consume(); // Or Expression rhs = EqualityExpression(); ret = new BinaryExpression(ret.Line, ret.Col, ret, TokenKind.OpAnd, rhs); } return ret; }
protected object EvalBinaryExpression(BinaryExpression exp) { switch (exp.Operator) { case WeiXin.Core.Parser.TokenKind.OpOr: { object lhsValue = EvalExpression(exp.Lhs); if (Util.ToBool(lhsValue)) return true; object rhsValue = EvalExpression(exp.Rhs); return Util.ToBool(rhsValue); } case WeiXin.Core.Parser.TokenKind.OpAnd: { object lhsValue = EvalExpression(exp.Lhs); if (!Util.ToBool(lhsValue)) return false; object rhsValue = EvalExpression(exp.Rhs); return Util.ToBool(rhsValue); } case WeiXin.Core.Parser.TokenKind.OpIs: { object lhsValue = EvalExpression(exp.Lhs); object rhsValue = EvalExpression(exp.Rhs); return lhsValue.Equals(rhsValue); } case WeiXin.Core.Parser.TokenKind.OpIsNot: { object lhsValue = EvalExpression(exp.Lhs); object rhsValue = EvalExpression(exp.Rhs); return !lhsValue.Equals(rhsValue); } case WeiXin.Core.Parser.TokenKind.OpGt: { object lhsValue = EvalExpression(exp.Lhs); object rhsValue = EvalExpression(exp.Rhs); IComparable c1 = lhsValue as IComparable; IComparable c2 = rhsValue as IComparable; if (c1 == null || c2 == null) return false; else return c1.CompareTo(c2) == 1; } case WeiXin.Core.Parser.TokenKind.OpLt: { object lhsValue = EvalExpression(exp.Lhs); object rhsValue = EvalExpression(exp.Rhs); IComparable c1 = lhsValue as IComparable; IComparable c2 = rhsValue as IComparable; if (c1 == null || c2 == null) return false; else return c1.CompareTo(c2) == -1; } case WeiXin.Core.Parser.TokenKind.OpGte: { object lhsValue = EvalExpression(exp.Lhs); object rhsValue = EvalExpression(exp.Rhs); IComparable c1 = lhsValue as IComparable; IComparable c2 = rhsValue as IComparable; if (c1 == null || c2 == null) return false; else return c1.CompareTo(c2) >= 0; } case WeiXin.Core.Parser.TokenKind.OpLte: { object lhsValue = EvalExpression(exp.Lhs); object rhsValue = EvalExpression(exp.Rhs); IComparable c1 = lhsValue as IComparable; IComparable c2 = rhsValue as IComparable; if (c1 == null || c2 == null) return false; else return c1.CompareTo(c2) <= 0; } default: throw new TemplateRuntimeException("Operator " + exp.Operator.ToString() + " is not supported.", exp.Line, exp.Col); } }
private Expression EqualityExpression() { Expression ret = RelationalExpression(); while (Current.TokenKind == TokenKind.OpIs || Current.TokenKind == TokenKind.OpIsNot) { Token tok = Consume(); // consume operator Expression rhs = RelationalExpression(); ret = new BinaryExpression(ret.Line, ret.Col, ret, tok.TokenKind, rhs); } return ret; }
private Expression RelationalExpression() { Expression ret = PrimaryExpression(); while (Current.TokenKind == TokenKind.OpLt || Current.TokenKind == TokenKind.OpLte || Current.TokenKind == TokenKind.OpGt || Current.TokenKind == TokenKind.OpGte) { Token tok = Consume(); // consume operator Expression rhs = PrimaryExpression(); ret = new BinaryExpression(ret.Line, ret.Col, ret, tok.TokenKind, rhs); } return ret; }
Expression OrExpression() { Expression ret = AndExpression(); while (Current.TokenKind == TokenKind.OpOr) { Consume(); // Or Expression rhs = AndExpression(); ret = new BinaryExpression(ret.Line, ret.Col, ret, TokenKind.OpOr, rhs); } return ret; }