示例#1
0
 public Expression(AbstractNode lhs, ExpressionEnums op,
                   AbstractNode rhs)
 {
     ExpressionType = op;
     adoptChildren(lhs);
     adoptChildren(rhs);
 }
示例#2
0
        private string GetOpSymbol(ExpressionEnums op)
        {
            switch (op)
            {
            case ExpressionEnums.EQUALS:
                return(" = ");

            case ExpressionEnums.OP_LOR:
                return(" || ");

            case ExpressionEnums.OP_LAND:
                return(" && ");

            case ExpressionEnums.PIPE:
                return(" | ");

            case ExpressionEnums.HAT:
                return(" ^ ");

            case ExpressionEnums.AND:
                return(" & ");

            case ExpressionEnums.OP_EQ:
                return(" == ");

            case ExpressionEnums.OP_NE:
                return(" != ");

            case ExpressionEnums.OP_GT:
                return(" > ");

            case ExpressionEnums.OP_LT:
                return(" < ");

            case ExpressionEnums.OP_LE:
                return(" <= ");

            case ExpressionEnums.OP_GE:
                return(" >= ");

            case ExpressionEnums.PLUSOP:
                return(" + ");

            case ExpressionEnums.MINUSOP:
                return(" - ");

            case ExpressionEnums.ASTERISK:
                return(" * ");

            case ExpressionEnums.RSLASH:
                return(" / ");

            case ExpressionEnums.PERCENT:
                return(" % ");

            default:
                return("[" + op + "]");
            }
        }
示例#3
0
 public Expression(AbstractNode arithmeticUnaryOperator, AbstractNode expression,
                   string prec, ExpressionEnums op)
 {
     ExpressionType          = op;
     _precision              = Int32.Parse(prec);
     ArithmeticUnaryOperator = ((ArithmeticUnaryOperator)arithmeticUnaryOperator).GetOp;
     adoptChildren(expression);
 }
示例#4
0
        private string GetOpName(ExpressionEnums op)
        {
            switch (op)
            {
            case ExpressionEnums.EQUALS:
                return("assignment");

            case ExpressionEnums.OP_LOR:
                return("comparison");

            case ExpressionEnums.OP_LAND:
                return("comparison");

            case ExpressionEnums.HAT:
                return("exponentiation");

            case ExpressionEnums.OP_EQ:
                return("comparison");

            case ExpressionEnums.OP_NE:
                return("comparison");

            case ExpressionEnums.OP_GT:
                return("comparison");

            case ExpressionEnums.OP_LT:
                return("comparison");

            case ExpressionEnums.OP_LE:
                return("comparison");

            case ExpressionEnums.OP_GE:
                return("comparison");

            case ExpressionEnums.PLUSOP:
                return("addition");

            case ExpressionEnums.MINUSOP:
                return("subtraction");

            case ExpressionEnums.ASTERISK:
                return("multiplication");

            case ExpressionEnums.RSLASH:
                return("division");

            case ExpressionEnums.PERCENT:
                return("mod");

            default:
                return("[" + op + "]");
            }
        }
示例#5
0
        private TypeDescriptor BoolBinaryExp(AbstractNode lhs,
                                             AbstractNode rhs, ExpressionEnums op)
        {
            lhs.Accept(this);
            rhs.Accept(this);

            if (TypesCompatible(lhs.TypeDescriptor, rhs.TypeDescriptor))
            {
                return(new PrimitiveTypeBooleanDescriptor());
            }
            return(new ErrorDescriptor("Comparison of incompatible types: " +
                                       GetSimpleName(lhs.TypeDescriptor) + GetOpSymbol(op) +
                                       GetSimpleName(rhs.TypeDescriptor)));
        }
示例#6
0
        private TypeDescriptor EvalBinaryExp(AbstractNode lhs, AbstractNode rhs,
                                             ExpressionEnums op)
        {
            lhs.Accept(this);
            rhs.Accept(this);

            if (TypesCompatible(lhs.TypeDescriptor, rhs.TypeDescriptor))
            {
                // catch two errors
                if (lhs.TypeDescriptor is ErrorDescriptor &&
                    rhs.TypeDescriptor is ErrorDescriptor)
                {
                    // combine error messages
                    return(((ErrorDescriptor)lhs.TypeDescriptor).CombineErrors
                               ((ErrorDescriptor)rhs.TypeDescriptor));
                }
                // change from number to primitive type int where possible
                if (lhs.TypeDescriptor is PrimitiveTypeIntDescriptor)
                {
                    return(lhs.TypeDescriptor);
                }
                if (rhs.TypeDescriptor is PrimitiveTypeIntDescriptor)
                {
                    return(rhs.TypeDescriptor);
                }
                // otherwise propagate up matching type
                return(lhs.TypeDescriptor);
            }
            if (lhs.TypeDescriptor is ErrorDescriptor)
            {
                return(lhs.TypeDescriptor);
            }
            if (rhs.TypeDescriptor is ErrorDescriptor)
            {
                return(rhs.TypeDescriptor);
            }
            // Otherwise return incompatible types error
            string err = (GetOpName(op).Length > 0) ?
                         "attempted " + GetOpName(op) + ": " : "attempted: ";

            err = "Evaluation of incompatible types, " + err +
                  GetSimpleName(lhs.TypeDescriptor) + GetOpSymbol(op) +
                  GetSimpleName(rhs.TypeDescriptor);
            return(new ErrorDescriptor(err));
        }
示例#7
0
 public ArithmeticUnaryOperator(ExpressionEnums op)
 {
     this.op = op;
 }
示例#8
0
        // TODO: Add functionaility for strings & bools
        private string GetIlOp(ExpressionEnums expEnum, TypeDescriptor type)
        {
            switch (expEnum)
            {
            //case ExpressionEnums.EQUALS:
            //    break;
            case ExpressionEnums.OP_LOR:
                return("or");

            case ExpressionEnums.OP_LAND:
                return("and");

            //case ExpressionEnums.PIPE:
            //    break;
            //case ExpressionEnums.HAT:
            //    break;
            case ExpressionEnums.AND:
                return("and");

            case ExpressionEnums.OP_EQ:
                return("ceq");

            case ExpressionEnums.OP_NE:
                return("cne");

            case ExpressionEnums.OP_GT:
                return("cgt");

            case ExpressionEnums.OP_LT:
                return("clt");

            case ExpressionEnums.OP_LE:
                return("cle");

            case ExpressionEnums.OP_GE:
                return("cge");

            case ExpressionEnums.PLUSOP:
                return("add");

            case ExpressionEnums.MINUSOP:
                return("sub");

            case ExpressionEnums.ASTERISK:
                return("mul");

            case ExpressionEnums.RSLASH:
                return("div");

            case ExpressionEnums.PERCENT:
                return("rem");

            case ExpressionEnums.UNARY:
                return("neg");

            //case ExpressionEnums.PRIMARY:
            //    break;
            default:
                return("something bad happened");
            }
        }