Esempio n. 1
0
        public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
        {
            loc = Factor.GenerateCode(loc, vm, info);
            loc = RepFactor.GenerateCode(loc, vm, info);

            var type = GetExpressionType(info);

            if (type == Type.INT32)
            {
                switch (Operator)
                {
                case Operators.TIMES:
                    vm.IntMult(loc++);
                    break;

                case Operators.DIV:
                    vm.IntDiv(loc++);
                    break;

                case Operators.MOD:
                    vm.IntMod(loc++);
                    break;

                default:
                    throw new IVirtualMachine.InternalError(
                              "There's an invalid operator in ASTMultOpr. Operator: " + Operator.ToString());
                }
            }
            else if (type == Type.DECIMAL)
            {
                switch (Operator)
                {
                case Operators.TIMES:
                    vm.DecimalMult(loc++);
                    break;

                case Operators.DIV:
                    vm.DecimalDiv(loc++);
                    break;

                case Operators.MOD:
                    vm.DecimalMod(loc++);
                    break;

                default:
                    throw new IVirtualMachine.InternalError(
                              "There's an invalid operator in ASTMultOpr. Operator: " + Operator.ToString());
                }
            }
            else
            {
                throw new IVirtualMachine.InternalError(
                          "There's an invalid operand in ASTMultOpr. operand: " + type.ToString());
            }
            return(loc);
        }
Esempio n. 2
0
 public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
 {
     if (LValue.GetExpressionType(info) != RValue.GetExpressionType(info))
     {
         throw new CheckerException("An assignment has to have the same types for LValue and RValue");
     }
     loc = RValue.GenerateCode(loc, vm, info);
     loc = LValue.GenerateLValue(loc, vm, info);
     vm.Store(loc++);
     return(loc);
 }
Esempio n. 3
0
        public override Type GetExpressionType(CheckerInformation info)
        {
            var termType    = ((ASTExpression)Term).GetExpressionType(info);
            var repTermType = ((ASTExpression)RepTerm).GetExpressionType(info);

            if (termType == Type.BOOL && repTermType == Type.BOOL)
            {
                return(Type.BOOL);
            }

            throw new GrammarException(string.Format("Types {0}, {1} are not a valid combination for Bool Operation {2}", termType, repTermType, this.ToString()));
        }
Esempio n. 4
0
        public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
        {
            loc = Term.GenerateCode(loc, vm, info);
            loc = RepTerm.GenerateCode(loc, vm, info);

            var type = GetExpressionType(info);

            if (type == Type.INT32)
            {
                switch (Operator)
                {
                case Operators.PLUS:
                    vm.IntAdd(loc++);
                    break;

                case Operators.MINUS:
                    vm.IntSub(loc++);
                    break;

                default:
                    throw new IVirtualMachine.InternalError(
                              "There's an invalid operator in ASTAddOpr. Operator: " + Operator.ToString());
                }
            }
            else if (type == Type.DECIMAL)
            {
                switch (Operator)
                {
                case Operators.PLUS:
                    vm.DecimalAdd(loc++);
                    break;

                case Operators.MINUS:
                    vm.DecimalSub(loc++);
                    break;

                default:
                    throw new IVirtualMachine.InternalError(
                              "There's an invalid operator in ASTAddOpr. Operator: " + Operator.ToString());
                }
            }
            else
            {
                throw new IVirtualMachine.InternalError(
                          "There's an invalid operand type in ASTAddOpr. type: " + type.ToString());
            }
            return(loc);
        }
Esempio n. 5
0
        public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
        {
            loc = Expr.GenerateLValue(loc, vm, info);
            switch (Expr.GetExpressionType(info))
            {
            case Type.INT32:
                vm.IntInput(loc++, "DEBUGIN");
                break;

            case Type.BOOL:
                vm.BoolInput(loc++, "DEBUGIN");
                break;

            case Type.DECIMAL:
                vm.DecimalInput(loc++, "DEBUGIN");
                break;
            }
            return(loc);
        }
Esempio n. 6
0
        public override Type GetExpressionType(CheckerInformation info)
        {
            var termType    = ((ASTExpression)Factor).GetExpressionType(info);
            var repTermType = ((ASTExpression)RepFactor).GetExpressionType(info);

            if (termType == Type.INT32 && repTermType == Type.INT32)
            {
                return(Type.INT32);
            }

            if ((termType == Type.INT32 && repTermType == Type.DECIMAL) ||
                (termType == Type.DECIMAL && repTermType == Type.INT32) ||
                (termType == Type.DECIMAL && repTermType == Type.DECIMAL))
            {
                return(Type.DECIMAL);
            }

            throw new GrammarException(string.Format("Types {0}, {1} are not a valid combination for AddOperation {2}", termType, repTermType, this.ToString()));
        }
Esempio n. 7
0
 public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
 {
     throw new IVirtualMachine.InternalError("ASTStoDecl.GenerateCode was called. This should never happen!");
 }
Esempio n. 8
0
 public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
 {
     return(loc);
 }
Esempio n. 9
0
        public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
        {
            loc = Term.GenerateCode(loc, vm, info);
            //Only execute RepTerm if no conditional BoolOpr or if the left hand side is not enough to determine result
            if (Operator != Operators.COR && Operator != Operators.CAND)
            {
                loc = RepTerm.GenerateCode(loc, vm, info);
            }

            var type = GetExpressionType(info);

            if (type == Type.BOOL)
            {
                switch (Operator)
                {
                case Operators.AND:
                    //Can only work with int operations:
                    //If both terms are true (=1), they result in 2 (1+1=2)
                    vm.IntAdd(loc++);
                    //Test if result == 2
                    vm.IntLoad(loc++, 2);
                    vm.IntEQ(loc++);
                    break;

                case Operators.OR:
                    vm.IntAdd(loc++);
                    vm.IntLoad(loc++, 1);
                    vm.IntGE(loc++);     //>=1 => only one term has to be true
                    break;

                case Operators.CAND:
                    //If true is on the top of the stack, the second condition has to be evaluated
                    //1. Jump if left hand side was false
                    int conditionalJump = loc++;
                    //2. a. Evaluate right hand side if left hand side was true
                    loc = RepTerm.GenerateCode(loc, vm, info);
                    vm.CondJump(conditionalJump, loc + 1); //Step 1: Only now the jump destination is known!
                    vm.UncondJump(loc, loc + 2);
                    ++loc;                                 //Leap over the load(0) instruction
                    //2. b. Evaluate to false
                    vm.IntLoad(loc++, 0);
                    break;

                case Operators.COR:
                    //If false is on the top of the stack, the second condition has to be evaluated
                    //1. Invert top of stack:
                    vm.IntLoad(loc++, 1);
                    vm.IntNE(loc++);
                    //2. Jump if left hand side was true
                    int conditionalJump2 = loc++;
                    //3. a. Evaluate right hand side if left hand side was false
                    loc = RepTerm.GenerateCode(loc, vm, info);
                    vm.CondJump(conditionalJump2, loc + 1);
                    vm.UncondJump(loc, loc + 2);
                    ++loc;
                    //3. b. Evaluate to true (without evaluating right hand side)
                    vm.IntLoad(loc++, 1);
                    break;

                default:
                    throw new IVirtualMachine.InternalError(
                              "There's an invalid operator in ASTBoolOpr. Operator: " + Operator.ToString());
                }
            }
            else
            {
                throw new IVirtualMachine.InternalError(
                          "There's an invalid operand in ASTBoolOpr. Oprand: " + type.ToString());
            }
            return(loc);
        }
Esempio n. 10
0
 public override Type GetExpressionType(CheckerInformation info)
 {
     return(Type.INT32);
 }
Esempio n. 11
0
 public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
 {
     vm.IntLoad(loc++, Value);
     return(loc);
 }
Esempio n. 12
0
        public override int GenerateCode(int loc, IVirtualMachine vm, CheckerInformation info)
        {
            loc = Term.GenerateCode(loc, vm, info);
            loc = RepTerm.GenerateCode(loc, vm, info);

            var termType    = ((ASTExpression)Term).GetExpressionType(info);
            var repTermType = ((ASTExpression)RepTerm).GetExpressionType(info);

            if ((termType == Type.INT32 && repTermType == Type.INT32) || (termType == Type.BOOL && repTermType == Type.BOOL))
            {
                switch (Operator)
                {
                case Operators.EQ:
                    vm.IntEQ(loc++);
                    break;

                case Operators.NE:
                    vm.IntNE(loc++);
                    break;

                case Operators.LT:
                    vm.IntLT(loc++);
                    break;

                case Operators.LE:
                    vm.IntLE(loc++);
                    break;

                case Operators.GT:
                    vm.IntGT(loc++);
                    break;

                case Operators.GE:
                    vm.IntGE(loc++);
                    break;

                default:
                    throw new IVirtualMachine.InternalError("There's an invalid operator in ASTRelOpr. Operator: " + Operator.ToString());
                }
            }
            else if ((termType == Type.INT32 && repTermType == Type.DECIMAL) ||
                     (termType == Type.DECIMAL && repTermType == Type.INT32) ||
                     (termType == Type.DECIMAL && repTermType == Type.DECIMAL))
            {
                switch (Operator)
                {
                case Operators.EQ:
                    vm.DecimalEQ(loc++);
                    break;

                case Operators.NE:
                    vm.DecimalNE(loc++);
                    break;

                case Operators.LT:
                    vm.DecimalLT(loc++);
                    break;

                case Operators.LE:
                    vm.DecimalLE(loc++);
                    break;

                case Operators.GT:
                    vm.DecimalGT(loc++);
                    break;

                case Operators.GE:
                    vm.DecimalGE(loc++);
                    break;

                default:
                    throw new IVirtualMachine.InternalError("There's an invalid operator in ASTRelOpr. Operator: " + Operator.ToString());
                }
            }
            else
            {
                throw new IVirtualMachine.InternalError("There's an invalid operand in ASTRelOpr. Operand: " + termType.ToString() + ", " + repTermType.ToString());
            }


            return(loc);
        }