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(); }