public int EvalInt(Expression es) { switch (Kind) { case TokenKind.Number: return RealToInt(Num); //round to integer case TokenKind.Identifier: return RealToInt(es.GetVar(Ident)); case TokenKind.Add: return Tok1.EvalInt(es) + Tok2.EvalInt(es); case TokenKind.Mul: return Tok1.EvalInt(es) * Tok2.EvalInt(es); case TokenKind.Sub: return (Tok2 == null) ? -Tok1.EvalInt(es) : (Tok1.EvalInt(es) - Tok2.EvalInt(es)); case TokenKind.Div: return Tok1.EvalInt(es) / Tok2.EvalInt(es); case TokenKind.Eq: return (Tok1.EvalInt(es) == Tok2.EvalInt(es)) ? 1 : 0; case TokenKind.Neq: return (Tok1.EvalInt(es) != Tok2.EvalInt(es)) ? 1 : 0; case TokenKind.Leq: return (Tok1.EvalInt(es) <= Tok2.EvalInt(es)) ? 1 : 0; case TokenKind.Geq: return (Tok1.EvalInt(es) >= Tok2.EvalInt(es)) ? 1 : 0; case TokenKind.Le: return (Tok1.EvalInt(es) < Tok2.EvalInt(es)) ? 1 : 0; case TokenKind.Ge: return (Tok1.EvalInt(es) > Tok2.EvalInt(es)) ? 1 : 0; case TokenKind.Mod: return (Tok1.EvalInt(es) % Tok2.EvalInt(es)); case TokenKind.If: return (Tok1.EvalInt(es) != 0) ? Tok2.EvalInt(es) : Tok3.EvalInt(es); case TokenKind.Shl: return Tok1.EvalInt(es) << Tok2.EvalInt(es); case TokenKind.Shr: return Tok1.EvalInt(es) >> Tok2.EvalInt(es); case TokenKind.And: return ( (Tok1.EvalInt(es)!=0) && (Tok2.EvalInt(es)!=0)) ? 1 : 0; case TokenKind.Or: return ((Tok1.EvalInt(es) != 0) || (Tok2.EvalInt(es) != 0)) ? 1 : 0; case TokenKind.BitAnd: return Tok1.EvalInt(es) & Tok2.EvalInt(es); case TokenKind.BitOr: return Tok1.EvalInt(es) | Tok2.EvalInt(es); case TokenKind.BitXor: return Tok1.EvalInt(es) ^ Tok2.EvalInt(es); default: throw new ExpressionException("Unknown operator: " + Kind.ToString()); } }