예제 #1
0
 public override string GetValue(VarTable varTable, LabelStack labelStack, List<FourExp> fourExpList)
 {
     string returnValue = "";
     string label, t1, t2, var;
     switch (this.op.Type)
     {
         case OperatorType.not:          //非
             label = labelStack.NewLabel();
             var = expression.GetValue(varTable, labelStack, fourExpList);
             fourExpList.Add(FourExpFac.GenJe(var, 0 + "", label));
             t1 = varTable.NewTemp(VariableType.BOOL);
             fourExpList.Add(FourExpFac.GenMov(1 + "", t1));
             var = t1;
             fourExpList.Add(FourExpFac.GenLabel(label));
             t2 = varTable.NewTemp(VariableType.BOOL);
             fourExpList.Add(FourExpFac.GenNot(t1, t2));
             returnValue = t2;
             break;
         case OperatorType.selfaddhead:      //自增前置
             var = expression.GetValue(varTable, labelStack, fourExpList);
             fourExpList.Add(FourExpFac.GenAdd(var, 1 + "", var));
             returnValue = var;
             break;
         case OperatorType.selfsubhead:      //自减前置
             var = expression.GetValue(varTable, labelStack, fourExpList);
             fourExpList.Add(FourExpFac.GenSub(var, 1 + "", var));
             returnValue = var;
             break;
         case OperatorType.selfaddtail:      //自增后置
             var = expression.GetValue(varTable, labelStack, fourExpList);
             t1 = varTable.NewTemp(var);
             fourExpList.Add(FourExpFac.GenAdd(var, 1 + "", var));
             returnValue = t1;
             break;
         case OperatorType.selfsubtail:      //自减后置
             var = expression.GetValue(varTable, labelStack, fourExpList);
             t1 = varTable.NewTemp(var);
             fourExpList.Add(FourExpFac.GenSub(var, 1 + "", var));
             returnValue = t1;
             break;
         case OperatorType.bitnot:       //按位非
             var = expression.GetValue(varTable, labelStack, fourExpList);
             t1 = varTable.NewTemp(var);
             fourExpList.Add(FourExpFac.GenNot(var, t1));
             returnValue = t1;
             break;
         case OperatorType.neg:          //取反
             var = expression.GetValue(varTable, labelStack, fourExpList);
             t1 = varTable.NewTemp(var);
             fourExpList.Add(FourExpFac.GenNeg(var, t1));
             returnValue = t1;
             break;
     }
     return returnValue;
 }
예제 #2
0
        public override string GetValue(VarTable varTable, LabelStack labelStack, List<FourExp> fourExpList)
        {
            string returnValue = "";
            //加、减、乘、除、按位与、按位或
            if (this.op.Type == OperatorType.add || this.op.Type == OperatorType.sub || this.op.Type == OperatorType.mul || this.op.Type == OperatorType.div || this.op.Type == OperatorType.bitand || this.op.Type == OperatorType.bitor)
            {
                string arg1 = expression1.GetValue(varTable, labelStack, fourExpList);
                string arg2 = expression2.GetValue(varTable, labelStack, fourExpList);
                string t = varTable.NewTemp(arg1, arg2);
                switch (this.op.Type)
                {
                    case OperatorType.add:          //+
                        fourExpList.Add(FourExpFac.GenAdd(arg1, arg2, t));
                        break;
                    case OperatorType.sub:          //-
                        fourExpList.Add(FourExpFac.GenSub(arg1, arg2, t));
                        break;
                    case OperatorType.mul:          //*
                        fourExpList.Add(FourExpFac.GenMul(arg1, arg2, t));
                        break;
                    case OperatorType.div:          ///
                        fourExpList.Add(FourExpFac.GenDiv(arg1, arg2, t));
                        break;
                    case OperatorType.bitand:       //按位与
                        fourExpList.Add(FourExpFac.GenAnd(arg1, arg2, t));
                        break;
                    case OperatorType.bitor:        //按位或
                        fourExpList.Add(FourExpFac.GenOr(arg1, arg2, t));
                        break;
                    default:
                        break;
                }
                returnValue = t;
            }
            //与、或
            else if (this.op.Type == OperatorType.and || this.op.Type == OperatorType.or)
            {
                string label1 = labelStack.NewLabel();
                string arg1 = expression1.GetValue(varTable, labelStack, fourExpList);
                fourExpList.Add(FourExpFac.GenJe(arg1, 0 + "", label1));
                string t1 = varTable.NewTemp(VariableType.BOOL);
                fourExpList.Add(FourExpFac.GenMov(1 + "", t1));
                arg1 = t1;
                fourExpList.Add(FourExpFac.GenLabel(label1));

                string label2 = labelStack.NewLabel();
                string arg2 = expression2.GetValue(varTable, labelStack, fourExpList);
                fourExpList.Add(FourExpFac.GenJe(arg2, 0 + "", label2));
                string t2 = varTable.NewTemp(VariableType.BOOL);
                fourExpList.Add(FourExpFac.GenMov(1 + "", t2));
                arg2 = t2;
                fourExpList.Add(FourExpFac.GenLabel(label2));

                string t3 = varTable.NewTemp(VariableType.BOOL);
                switch (this.op.Type)
                {
                    case OperatorType.and:      //与
                        fourExpList.Add(FourExpFac.GenAnd(arg1, arg2, t3));
                        break;
                    case OperatorType.or:       //或
                        fourExpList.Add(FourExpFac.GenOr(arg1, arg2, t3));
                        break;
                }
                returnValue = t3;
            }
            //左移、右移
            else if (this.op.Type == OperatorType.leftmove || this.op.Type == OperatorType.rightmove)
            {
                string arg1 = expression1.GetValue(varTable, labelStack, fourExpList);
                string arg2 = expression2.GetValue(varTable, labelStack, fourExpList);
                string t = varTable.NewTemp(arg1);
                switch (this.op.Type)
                {
                    case OperatorType.leftmove:             //左移
                        fourExpList.Add(FourExpFac.GenLeftshift(arg1, arg2, t));
                        break;
                    case OperatorType.rightmove:            //右移
                        fourExpList.Add(FourExpFac.GenRightshift(arg1, arg2, t));
                        break;
                    default:
                        break;
                }
                returnValue = t;
            }
            //小于、小于等于、大于、大于等于、等于、不等于
            else if (this.op.Type == OperatorType.less || this.op.Type == OperatorType.lessequal || this.op.Type == OperatorType.greater || this.op.Type == OperatorType.greatereuqal || this.op.Type == OperatorType.equal || this.op.Type == OperatorType.notequal)
            {
                string label1 = labelStack.NewLabel();
                string label2 = labelStack.NewLabel();
                string t = varTable.NewTemp(VariableType.BOOL);
                string arg1 = expression1.GetValue(varTable, labelStack, fourExpList);
                string arg2 = expression2.GetValue(varTable, labelStack, fourExpList);
                switch (this.op.Type)
                {
                    case OperatorType.less:         //<
                        fourExpList.Add(FourExpFac.GenJl(arg1, arg2, label1));
                        break;
                    case OperatorType.lessequal:    //<=
                        fourExpList.Add(FourExpFac.GenJle(arg1, arg2, label1));
                        break;
                    case OperatorType.greater:      //>
                        fourExpList.Add(FourExpFac.GenJg(arg1, arg2, label1));
                        break;
                    case OperatorType.greatereuqal: //>=
                        fourExpList.Add(FourExpFac.GenJge(arg1, arg2, label1));
                        break;
                    case OperatorType.equal:        //==
                        fourExpList.Add(FourExpFac.GenJe(arg1, arg2, label1));
                        break;
                    case OperatorType.notequal:     //!=
                        fourExpList.Add(FourExpFac.GenJne(arg1, arg2, label1));
                        break;
                    default:
                        //
                        break;
                }
                fourExpList.Add(FourExpFac.GenMov(0 + "", t));
                fourExpList.Add(FourExpFac.GenJmp(label2));
                fourExpList.Add(FourExpFac.GenLabel(label1));
                fourExpList.Add(FourExpFac.GenMov(1 + "", t));
                fourExpList.Add(FourExpFac.GenLabel(label2));
                returnValue = t;
            }
            else
            {
                //错误处理
            }
            return returnValue;
        }