protected override object Evaluate(IExpression left, IExpression right, ExecutionState state)
     if (!(left is BooleanExpression))
         left = new BooleanExpression(left);
     if (!(right is BooleanExpression))
         right = new BooleanExpression(right);
     return left.Evaluate(state).Equals(true) && right.Evaluate(state).Equals(true);
        public static IExpression BuildExpression(List<Token> tokens, ref int index, Stack<int?> precedenceStack)
            if (index >= tokens.Count)
                throw new TokenParserException("The script seems to have ended prematurely while I was doing calculations. Shouldn't there be something here?", tokens[tokens.Count - 1]);

            Token token = tokens[index];
            IExpression expr = null;
            switch (token.TokenType)
                case TokenType.Number:
                case TokenType.StringLiteral:
                    expr = BuildSingularExpression(tokens, ref index);

                case TokenType.Word:
                    if (token.Value == "true" || token.Value == "false")
                        expr = new BooleanExpression();
                        expr.BuildExpression(tokens, ref index, precedenceStack);
                        expr = BuildWordExpression(tokens, ref index, precedenceStack);

                //case TokenType.GroupStart:
                //    expr = BuildGroupedExpression(tokens, ref index);
                //    break;

                    throw new TokenParserException("This part of the script should equate to a value but instead I got \"" + token.Value + "\", which doesn't really mean anything in this context.", token);

            int? precedence = precedenceStack.Peek();
            while (NextHasGreaterPrecedence(precedence, tokens, index))
                expr = BuildBinaryExpression(tokens, ref index, expr, precedenceStack);

            return expr;