Ejemplo n.º 1
0
        private void CGForNumStat(FuncInfo funcInfo, ForNumStatNode node)
        {
            funcInfo.EnterScope(true);
            LocalVarDecStatNode varDecStatNode = new LocalVarDecStatNode();

            varDecStatNode.ExpList = new List <ExpNode>()
            {
                node.InitExp, node.LimitExp, node.StepExp
            };
            if (node.StepExp == null)
            {
                varDecStatNode.ExpList[2] = new ConstExpNode(new Token(TokenType.Number, "1", -1));
            }
            varDecStatNode.NameList = new List <ConstExpNode>()
            {
                new ConstExpNode(new Token(TokenType.Identifier, "for_index", -1)),
                new ConstExpNode(new Token(TokenType.Identifier, "for_limit", -1)),
                new ConstExpNode(new Token(TokenType.Identifier, "for_step", -1))
            };
            CGLocalVarDefStat(funcInfo, varDecStatNode);
            funcInfo.AddLocalVar(node.VarName.name);
            int a         = funcInfo.UsedReg - 4;
            int forPrepPC = funcInfo.EmitForPrep(a, 0);

            CGBlock(funcInfo, node.DoBlock.Block);
            int forLoopPC = funcInfo.EmitForLoop(a, 0);

            funcInfo.FixSBX(forPrepPC, forLoopPC - forPrepPC - 1);
            funcInfo.FixSBX(forLoopPC, forPrepPC - forLoopPC - 1);
            funcInfo.ExitScope();
        }