예제 #1
0
        public override Expression Simplify()
        {
            Base  = base.Simplify();
            Index = Index.Simplify();

            return(this);
        }
예제 #2
0
        public override Expression Simplify()
        {
            Rhs = Rhs.Simplify();
            UnaryOperator unop = GetOperator();

            if (Rhs is NumberExpr)
            {
                if (unop == UnaryOperator.Negate)
                {
                    return(new NumberExpr("-" + ((NumberExpr)Rhs).Value));
                }
                else if (unop == UnaryOperator.UnNegate)
                {
                    double res;
                    if (Lua.luaO_str2d(((NumberExpr)Rhs).Value, out res) == 1)
                    {
                        return(new NumberExpr(Math.Abs(res)));
                    }
                }
            }
            else if (Rhs is BoolExpr)
            {
                if (unop == UnaryOperator.Not)
                {
                    return(new BoolExpr(!((BoolExpr)Rhs).Value));
                }
            }

            return(this);
        }
예제 #3
0
 public override Expression Simplify()
 {
     Base = Base.Simplify();
     for (int i = 0; i < Arguments.Count; i++)
     {
         Arguments[i] = Arguments[i].Simplify();
     }
     return(this);
 }
예제 #4
0
 public override Expression Simplify()
 {
     Key   = Key.Simplify();
     Value = Value.Simplify();
     return(this);
 }
예제 #5
0
        public override Expression Simplify()
        {
            Lhs = Lhs.Simplify();
            Rhs = Rhs.Simplify();

            double a, b;
            int    isNumA = Lua.luaO_str2d(((NumberExpr)Lhs).Value, out a);
            int    isNumB = Lua.luaO_str2d(((NumberExpr)Rhs).Value, out b);
            bool   isNum  = false;

            isNum = isNumA == 1 && isNumB == 1;

            switch (GetOperator())
            {
            case BinaryOperator.Add:
                if (isNum)
                {
                    return(new NumberExpr(a + b));
                }
                break;

            case BinaryOperator.Subtract:
                if (isNum)
                {
                    return(new NumberExpr(a - b));
                }
                break;

            case BinaryOperator.Multiply:
                if (isNum)
                {
                    return(new NumberExpr(a * b));
                }
                break;

            case BinaryOperator.Divide:
                if (isNum)
                {
                    return(new NumberExpr(a / b));
                }
                break;

            case BinaryOperator.Power:
                if (isNum)
                {
                    return(new NumberExpr(Math.Pow(a, b)));
                }
                break;

            case BinaryOperator.Modulus:
                if (isNum)
                {
                    return(new NumberExpr(a % b));
                }
                break;

            case BinaryOperator.LessThan:
                if (isNum)
                {
                    return(new BoolExpr(a < b));
                }
                break;

            case BinaryOperator.LessThanOrEqualTo:
                if (isNum)
                {
                    return(new BoolExpr(a <= b));
                }
                break;

            case BinaryOperator.GreaterThan:
                if (isNum)
                {
                    return(new BoolExpr(a > b));
                }
                break;

            case BinaryOperator.GreaterThanOrEqualTo:
                if (isNum)
                {
                    return(new BoolExpr(a >= b));
                }
                break;

            case BinaryOperator.NotEqual:
                if (Lhs is BoolExpr && Rhs is BoolExpr)
                {
                    return(new BoolExpr(((BoolExpr)Lhs).Value != ((BoolExpr)Rhs).Value));
                }
                else if (isNum)
                {
                    return(new BoolExpr(a != b));
                }
                break;

            case BinaryOperator.Equals:
                if (Lhs is BoolExpr && Rhs is BoolExpr)
                {
                    return(new BoolExpr(((BoolExpr)Lhs).Value == ((BoolExpr)Rhs).Value));
                }
                else if (isNum)
                {
                    return(new BoolExpr(a == b));
                }
                break;

            case BinaryOperator.And:
                if (Lhs is BoolExpr && Rhs is BoolExpr)
                {
                    return(new BoolExpr(((BoolExpr)Lhs).Value && ((BoolExpr)Rhs).Value));
                }
                break;

            case BinaryOperator.Or:
                if (Lhs is BoolExpr && Rhs is BoolExpr)
                {
                    return(new BoolExpr(((BoolExpr)Lhs).Value || ((BoolExpr)Rhs).Value));
                }
                break;

            case BinaryOperator.ShiftRight:
            case BinaryOperator.ShiftLeft:
            case BinaryOperator.Xor:
            case BinaryOperator.BitAnd:
            case BinaryOperator.BitOr:
            case BinaryOperator.BitNot:
            case BinaryOperator.Concat:
            case BinaryOperator.NONE:
            default:
                break;
            }

            return(base.Simplify());
        }
예제 #6
0
 public override Expression Simplify()
 {
     Base = Base.Simplify();
     return(this);
 }