Ejemplo n.º 1
0
        private void CGUnaryExp(FuncInfo funcInfo, UnaryExpNode node, int a)
        {
            int b = funcInfo.AllocReg();

            CGExp(funcInfo, node.Exp, b, 1);
            funcInfo.EmitUnaryOp(a, b, node.OpType);
            funcInfo.FreeReg();
        }
Ejemplo n.º 2
0
        private void CGBinOpExp(FuncInfo funcInfo, DoubleOperationExpNode node, int a)
        {
            switch (node.OpType)
            {
            case TokenType.And:
            case TokenType.Or:
            {
                int b = funcInfo.AllocReg();
                CGExp(funcInfo, node.Exp1, b, 1);
                funcInfo.FreeReg();
                if (node.OpType == TokenType.And)
                {
                    funcInfo.EmitTestSet(a, b, 0);
                }
                else
                {
                    funcInfo.EmitTestSet(a, b, 1);
                }
                int jmpPC = funcInfo.EmitJMP(0, 0);
                int c     = funcInfo.AllocReg();
                CGExp(funcInfo, node.Exp2, c, 1);
                funcInfo.FreeReg();
                funcInfo.EmitMove(a, c);
                funcInfo.FixSBX(jmpPC, funcInfo.PC() - jmpPC);
                break;
            }

            default:
            {
                int b = funcInfo.AllocReg();
                CGExp(funcInfo, node.Exp1, b, 1);
                int c = funcInfo.AllocReg();
                CGExp(funcInfo, node.Exp2, c, 1);
                funcInfo.EmitDoubleOperator(a, b, c, node.OpType);
                funcInfo.FreeRegs(2);
                break;
            }
            }
        }
Ejemplo n.º 3
0
        private void CGRepeatStat(FuncInfo funcInfo, RepeatStatNode node)
        {
            funcInfo.EnterScope(true);
            int blockPC = funcInfo.PC();

            CGBlock(funcInfo, node.Block);

            int r = funcInfo.AllocReg();

            CGExp(funcInfo, node.Exp, r, 1);
            funcInfo.FreeReg();

            funcInfo.EmitTest(r, 0);
            funcInfo.EmitJMP(0, blockPC - funcInfo.PC() - 1);
            funcInfo.ExitScope();
        }
Ejemplo n.º 4
0
        private void CGWhileStat(FuncInfo funcInfo, WhileStatNode node)
        {
            int beforePc = funcInfo.PC();
            int r        = funcInfo.AllocReg();

            CGExp(funcInfo, node.Exp, r, 1);
            funcInfo.FreeReg();
            funcInfo.EmitTest(r, 0);
            int jumPC = funcInfo.EmitJMP(0, 0);

            funcInfo.EnterScope(true);
            CGBlock(funcInfo, node.DoStatNode.Block);
            funcInfo.EmitJMP(0, beforePc - funcInfo.PC());
            funcInfo.ExitScope();
            funcInfo.FixSBX(jumPC, funcInfo.PC() - jumPC);
        }
Ejemplo n.º 5
0
        private void CGIfStat(FuncInfo funcInfo, IfStatNode node)
        {
            var jmpToEndsPC    = new int[node.Exp.Count];
            int jmpToNextExpPc = -1;
            int i = 0;

            foreach (var exp in node.Exp)
            {
                if (jmpToNextExpPc > 0)
                {
                    funcInfo.FixSBX(jmpToNextExpPc, funcInfo.PC() - jmpToNextExpPc);
                }
                int r = funcInfo.AllocReg();
                CGExp(funcInfo, exp, r, 1);
                funcInfo.FreeReg();
                funcInfo.EmitTest(r, 0);
                jmpToNextExpPc = funcInfo.EmitJMP(0, 0);
                funcInfo.EnterScope(false);
                CGBlock(funcInfo, node.Block);
                funcInfo.ExitScope();
                if (i < node.Exp.Count - 1)
                {
                    jmpToEndsPC[i] = funcInfo.EmitJMP(0, 0);
                }
                else
                {
                    jmpToEndsPC[i] = jmpToNextExpPc;
                }
                i++;
            }

            foreach (int j in jmpToEndsPC)
            {
                funcInfo.FixSBX(j, funcInfo.PC() - j);
            }
        }